Overview
ETH Balance
0.0049 ETH
ETH Value
$8.80 (@ $1,795.68/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 674 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim L2t | 17299271 | 624 days ago | IN | 0 ETH | 0.00000058 | ||||
Claim L2t | 17293690 | 624 days ago | IN | 0 ETH | 0.00000039 | ||||
Claim L2t | 17293487 | 624 days ago | IN | 0 ETH | 0.00000039 | ||||
Claim L2t | 17293456 | 624 days ago | IN | 0 ETH | 0.00000039 | ||||
Claim L2t | 17249708 | 624 days ago | IN | 0 ETH | 0.00000059 | ||||
Claim L2t | 17246998 | 624 days ago | IN | 0 ETH | 0.00000057 | ||||
Claim L2t | 17245314 | 624 days ago | IN | 0 ETH | 0.00000057 | ||||
Claim L2t | 17242488 | 624 days ago | IN | 0 ETH | 0.00000059 | ||||
Claim L2t | 17212364 | 624 days ago | IN | 0 ETH | 0.00000054 | ||||
Claim L2t | 17206514 | 624 days ago | IN | 0 ETH | 0.00000063 | ||||
Claim L2t | 17203872 | 624 days ago | IN | 0 ETH | 0.00000046 | ||||
Claim L2t | 17203806 | 624 days ago | IN | 0 ETH | 0.00000046 | ||||
Claim L2t | 17203754 | 624 days ago | IN | 0 ETH | 0.00000061 | ||||
Claim L2t | 17195726 | 624 days ago | IN | 0 ETH | 0.00000057 | ||||
Claim L2t | 17167583 | 625 days ago | IN | 0 ETH | 0.00000038 | ||||
Claim L2t | 17167228 | 625 days ago | IN | 0 ETH | 0.00000055 | ||||
Claim L2t | 17159246 | 625 days ago | IN | 0 ETH | 0.00000038 | ||||
Claim L2t | 17132354 | 625 days ago | IN | 0 ETH | 0.00000039 | ||||
Claim L2t | 17132329 | 625 days ago | IN | 0 ETH | 0.00000039 | ||||
Claim L2t | 17132303 | 625 days ago | IN | 0 ETH | 0.00000056 | ||||
Claim L2t | 17114690 | 625 days ago | IN | 0 ETH | 0.00000041 | ||||
L2telegraph Brid... | 17079344 | 625 days ago | IN | 0.005 ETH | 0.00000232 | ||||
Claim L2t | 17075160 | 625 days ago | IN | 0 ETH | 0.00000055 | ||||
Claim L2t | 17070867 | 626 days ago | IN | 0 ETH | 0.00000038 | ||||
Claim L2t | 17070834 | 626 days ago | IN | 0 ETH | 0.00000055 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17079344 | 625 days ago | 0.00486 ETH | ||||
17059319 | 626 days ago | 0.01176 ETH | ||||
17034627 | 626 days ago | 0.00486 ETH | ||||
16627408 | 629 days ago | 0.00486 ETH | ||||
15758176 | 636 days ago | 0.00466 ETH | ||||
15635915 | 637 days ago | 0.00466 ETH | ||||
15596616 | 638 days ago | 0.00486 ETH | ||||
15523442 | 638 days ago | 0.00486 ETH | ||||
15481987 | 639 days ago | 0.00466 ETH | ||||
15473277 | 639 days ago | 0.01676 ETH | ||||
15397507 | 639 days ago | 0.00466 ETH | ||||
15350768 | 640 days ago | 0.00466 ETH | ||||
15348317 | 640 days ago | 0.00486 ETH | ||||
15314329 | 640 days ago | 0.00466 ETH | ||||
15092492 | 642 days ago | 0.00466 ETH | ||||
14905254 | 643 days ago | 0.00466 ETH | ||||
14889127 | 643 days ago | 0.00986 ETH | ||||
14880118 | 643 days ago | 0.00586 ETH | ||||
14866465 | 643 days ago | 0.00486 ETH | ||||
14661398 | 645 days ago | 0.00466 ETH | ||||
14661323 | 645 days ago | 0.00486 ETH | ||||
14501544 | 647 days ago | 0.00466 ETH | ||||
14483668 | 647 days ago | 0.00466 ETH | ||||
14315555 | 649 days ago | 0.00486 ETH | ||||
14315552 | 649 days ago | 0.00486 ETH |
Loading...
Loading
Contract Name:
l2telegraphTokenBridge
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Nova.Arbiscan.io on 2023-07-08 */ // Sources flattened with hardhat v2.13.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // 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; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File contracts/interfaces/ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File contracts/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File contracts/interfaces/ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; } // File contracts/util/BytesLib.sol /* * @title Solidity Bytes Arrays Utils * @author Gon├зalo S├б <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat( bytes memory _preBytes, bytes memory _postBytes ) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint256 _start, uint256 _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1 , "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage( bytes storage _preBytes, bytes memory _postBytes ) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } // File contracts/lzApp/LzApp.sol pragma solidity ^0.8.0; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; // ua can not send payload larger than this by default, but it can be changed by the ua owner uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; mapping(uint16 => uint) public payloadSizeLimitLookup; address public precrime; event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); _checkPayloadSize(_dstChainId, _payload.length); lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual { uint providedGasLimit = _getGasLimit(_adapterParams); uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual { uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId]; if (payloadSizeLimit == 0) { // use default if not set payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT; } require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large"); } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // _path = abi.encodePacked(remoteAddress, localAddress) // this function set the trusted path for the cross-chain communication function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_remoteChainId] = _path; emit SetTrustedRemote(_remoteChainId, _path); } function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { bytes memory path = trustedRemoteLookup[_remoteChainId]; require(path.length != 0, "LzApp: no trusted path record"); return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) } function setPrecrime(address _precrime) external onlyOwner { precrime = _precrime; emit SetPrecrime(_precrime); } function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner { require(_minGas > 0, "LzApp: invalid minGas"); minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } // if the size is 0, it means default size limit function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner { payloadSizeLimitLookup[_dstChainId] = _size; } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File contracts/util/ExcessivelySafeCall.sol pragma solidity >=0.7.6; library ExcessivelySafeCall { uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient 0, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint256 _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } } // File contracts/lzApp/NonblockingLzApp.sol pragma solidity ^0.8.0; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { using ExcessivelySafeCall for address; constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload)); // try-catch all errors/exceptions if (!success) { _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual { failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason); } function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); } } // File contracts/bb.sol pragma solidity >=0.8.12; contract l2telegraphTokenBridge is NonblockingLzApp, ERC20 { uint16 destChainId; uint256 public cost = 0.00014 ether; // When just deploying, mint a certain number of tokens for the owner constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) ERC20("l2telegraph.xyz", "l2t") { if (_lzEndpoint == 0x9b896c0e23220469C7AE69cb4BbAE391eAa4C8da) destChainId = 175; if (_lzEndpoint == 0x4EE2F9B7cf3A68966c370F3eb2C16613d3235245) destChainId = 165; _mint(msg.sender, 1000000 * 10 ** decimals()); } // Contract receives transfer account and transfer amount on another testing chain // Add "toAddress" balance by amount token function _nonblockingLzReceive(uint16, bytes memory, uint64, bytes memory _payload) internal override { (address toAddress, uint amount) = abi.decode(_payload, (address,uint)); _mint(toAddress, amount); } // Reduce balance by _amount token // Send transfer account and transfer amount to the contract on another testing chain function l2telegraphBridgeToken(uint _amount) public payable { _burn(msg.sender, _amount); bytes memory payload = abi.encode(msg.sender, _amount); _lzSend(destChainId, payload, payable(msg.sender), address(0x0), bytes(""), msg.value-cost); } function ClaimL2t() public{ _mint(msg.sender, 1000 * 10 ** decimals()); } // Set trusted address function trustAddress(address _remoteContract) public onlyOwner { trustedRemoteLookup[destChainId] = abi.encodePacked(_remoteContract, address(this)); } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ClaimL2t","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"l2telegraphBridgeToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_remoteContract","type":"address"}],"name":"trustAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a0604052657f544a44c000600c553480156200001b57600080fd5b506040516200329b3803806200329b8339810160408190526200003e9162000334565b6040518060400160405280600f81526020016e36193a32b632b3b930b834173c3cbd60891b815250604051806040016040528060038152602001621b0c9d60ea1b81525082806200009e620000986200017260201b60201c565b62000176565b6001600160a01b0316608052508151620000c09060099060208501906200028e565b508051620000d690600a9060208401906200028e565b505050739b896c0e23220469c7ae69cb4bbae391eaa4c8da6001600160a01b03821614156200010e57600b805461ffff191660af1790555b734ee2f9b7cf3a68966c370f3eb2c16613d32352456001600160a01b03821614156200014357600b805461ffff191660a51790555b6200016b33620001566012600a6200047b565b6200016590620f42406200048c565b620001c6565b5062000506565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620002215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060086000828254620002359190620004ae565b90915550506001600160a01b0382166000818152600660209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b8280546200029c90620004c9565b90600052602060002090601f016020900481019282620002c057600085556200030b565b82601f10620002db57805160ff19168380011785556200030b565b828001600101855582156200030b579182015b828111156200030b578251825591602001919060010190620002ee565b50620003199291506200031d565b5090565b5b808211156200031957600081556001016200031e565b6000602082840312156200034757600080fd5b81516001600160a01b03811681146200035f57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620003bd578160001904821115620003a157620003a162000366565b80851615620003af57918102915b93841c939080029062000381565b509250929050565b600082620003d65750600162000475565b81620003e55750600062000475565b8160018114620003fe5760028114620004095762000429565b600191505062000475565b60ff8411156200041d576200041d62000366565b50506001821b62000475565b5060208310610133831016604e8410600b84101617156200044e575081810a62000475565b6200045a83836200037c565b806000190482111562000471576200047162000366565b0290505b92915050565b60006200035f60ff841683620003c5565b6000816000190483118215151615620004a957620004a962000366565b500290565b60008219821115620004c457620004c462000366565b500190565b600181811c90821680620004de57607f821691505b602082108114156200050057634e487b7160e01b600052602260045260246000fd5b50919050565b608051612d4862000553600039600081816106af015281816107dd01528181610abe01528181610b8001528181610dcc015281816112ed015281816117570152611f100152612d486000f3fe6080604052600436106102505760003560e01c806370a0823111610139578063a9059cbb116100b6578063d1deba1f1161007a578063d1deba1f14610727578063dd62ed3e1461073a578063df2a5b3b1461075a578063eb8d72b71461077a578063f2fde38b1461079a578063f5ecbdbc146107ba57600080fd5b8063a9059cbb1461067d578063b353aaa71461069d578063baf3292d146106d1578063c4461834146106f1578063cbed8b9c1461070757600080fd5b8063950c8a74116100fd578063950c8a74146105e857806395d89b41146106085780639f38369a1461061d578063a457c2d71461063d578063a6c3d1651461065d57600080fd5b806370a0823114610513578063715018a6146105495780637533d7881461055e5780638cfd8f5c1461057e5780638da5cb5b146105b657600080fd5b806333967ed6116101d25780633f1f4fa4116101965780633f1f4fa41461041757806342d65a8d1461044457806344a0d68a146104645780635b8c41e6146104845780635cdf1649146104d357806366ad5c8a146104f357600080fd5b806333967ed6146103a757806339509351146103bc5780633ae0664c146103dc5780633ccfd60b146103ef5780633d8b38f6146103f757600080fd5b806310ddb1371161021957806310ddb1371461031257806313faede61461033257806318160ddd1461035657806323b872dd1461036b578063313ce5671461038b57600080fd5b80621d35671461025557806306fdde031461027757806307e0db17146102a2578063095ea7b3146102c25780630df37483146102f2575b600080fd5b34801561026157600080fd5b50610275610270366004612426565b6107da565b005b34801561028357600080fd5b5061028c610a0b565b6040516102999190612511565b60405180910390f35b3480156102ae57600080fd5b506102756102bd366004612524565b610a9d565b3480156102ce57600080fd5b506102e26102dd366004612554565b610b26565b6040519015158152602001610299565b3480156102fe57600080fd5b5061027561030d366004612580565b610b40565b34801561031e57600080fd5b5061027561032d366004612524565b610b5f565b34801561033e57600080fd5b50610348600c5481565b604051908152602001610299565b34801561036257600080fd5b50600854610348565b34801561037757600080fd5b506102e261038636600461259c565b610bb7565b34801561039757600080fd5b5060405160128152602001610299565b3480156103b357600080fd5b50610275610bdb565b3480156103c857600080fd5b506102e26103d7366004612554565b610bfe565b6102756103ea3660046125dd565b610c20565b610275610c81565b34801561040357600080fd5b506102e26104123660046125f6565b610ce1565b34801561042357600080fd5b50610348610432366004612524565b60036020526000908152604090205481565b34801561045057600080fd5b5061027561045f3660046125f6565b610dad565b34801561047057600080fd5b5061027561047f3660046125dd565b610e33565b34801561049057600080fd5b5061034861049f3660046126b5565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156104df57600080fd5b506102756104ee366004612755565b610e40565b3480156104ff57600080fd5b5061027561050e366004612426565b610ea8565b34801561051f57600080fd5b5061034861052e366004612755565b6001600160a01b031660009081526006602052604090205490565b34801561055557600080fd5b50610275610f84565b34801561056a57600080fd5b5061028c610579366004612524565b610f96565b34801561058a57600080fd5b50610348610599366004612772565b600260209081526000928352604080842090915290825290205481565b3480156105c257600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610299565b3480156105f457600080fd5b506004546105d0906001600160a01b031681565b34801561061457600080fd5b5061028c611030565b34801561062957600080fd5b5061028c610638366004612524565b61103f565b34801561064957600080fd5b506102e2610658366004612554565b611156565b34801561066957600080fd5b506102756106783660046125f6565b6111d1565b34801561068957600080fd5b506102e2610698366004612554565b611264565b3480156106a957600080fd5b506105d07f000000000000000000000000000000000000000000000000000000000000000081565b3480156106dd57600080fd5b506102756106ec366004612755565b611272565b3480156106fd57600080fd5b5061034861271081565b34801561071357600080fd5b506102756107223660046127a5565b6112ce565b610275610735366004612426565b611363565b34801561074657600080fd5b50610348610755366004612813565b611579565b34801561076657600080fd5b5061027561077536600461284c565b6115a4565b34801561078657600080fd5b506102756107953660046125f6565b611656565b3480156107a657600080fd5b506102756107b5366004612755565b6116b0565b3480156107c657600080fd5b5061028c6107d5366004612888565b611726565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146108575760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526001602052604081208054610875906128d5565b80601f01602080910402602001604051908101604052809291908181526020018280546108a1906128d5565b80156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b50505050509050805186869050148015610909575060008151115b80156109315750805160208201206040516109279088908890612910565b6040518091039020145b61098c5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b606482015260840161084e565b610a028787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506117d792505050565b50505050505050565b606060098054610a1a906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a46906128d5565b8015610a935780601f10610a6857610100808354040283529160200191610a93565b820191906000526020600020905b815481529060010190602001808311610a7657829003601f168201915b5050505050905090565b610aa5611850565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b5050505050565b600033610b348185856118aa565b60019150505b92915050565b610b48611850565b61ffff909116600090815260036020526040902055565b610b67611850565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610af1565b600033610bc58582856119cf565b610bd0858585611a49565b506001949350505050565b610bfc33610beb6012600a612a1a565b610bf7906103e8612a29565b611bf4565b565b600033610b34818585610c118383611579565b610c1b9190612a48565b6118aa565b610c2a3382611cb5565b604080513360208201819052818301849052825180830384018152600b546080840190945260006060909301838152600c549194610c7d9461ffff909116938693909290610c789034612a60565b611de6565b5050565b610c89611850565b604051600090339047908381818185875af1925050503d8060008114610ccb576040519150601f19603f3d011682016040523d82523d6000602084013e610cd0565b606091505b5050905080610cde57600080fd5b50565b61ffff831660009081526001602052604081208054829190610d02906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2e906128d5565b8015610d7b5780601f10610d5057610100808354040283529160200191610d7b565b820191906000526020600020905b815481529060010190602001808311610d5e57829003601f168201915b505050505090508383604051610d92929190612910565b60405180910390208180519060200120149150509392505050565b610db5611850565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610e0590869086908690600401612aa0565b600060405180830381600087803b158015610e1f57600080fd5b505af1158015610a02573d6000803e3d6000fd5b610e3b611850565b600c55565b610e48611850565b6040516bffffffffffffffffffffffff19606083811b8216602084015230901b16603482015260480160408051601f19818403018152918152600b5461ffff166000908152600160209081529190208251610c7d939192909101906122a3565b333014610f065760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b606482015260840161084e565b610f7c8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611f8c92505050565b505050505050565b610f8c611850565b610bfc6000611fb1565b60016020526000908152604090208054610faf906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb906128d5565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b505050505081565b6060600a8054610a1a906128d5565b61ffff8116600090815260016020526040812080546060929190611062906128d5565b80601f016020809104026020016040519081016040528092919081815260200182805461108e906128d5565b80156110db5780601f106110b0576101008083540402835291602001916110db565b820191906000526020600020905b8154815290600101906020018083116110be57829003601f168201915b505050505090508051600014156111345760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000604482015260640161084e565b61114f6000601483516111479190612a60565b839190612001565b9392505050565b600033816111648286611579565b9050838110156111c45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161084e565b610bd082868684036118aa565b6111d9611850565b8181306040516020016111ee93929190612abe565b60408051601f1981840301815291815261ffff85166000908152600160209081529190208251611223939192909101906122a3565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161125793929190612aa0565b60405180910390a1505050565b600033610b34818585611a49565b61127a611850565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6112d6611850565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c9061132a9088908890889088908890600401612ae4565b600060405180830381600087803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b505050505050505050565b61ffff861660009081526005602052604080822090516113869088908890612910565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806114065760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b606482015260840161084e565b808383604051611417929190612910565b6040518091039020146114765760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b606482015260840161084e565b61ffff871660009081526005602052604080822090516114999089908990612910565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611531918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611f8c92505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611568959493929190612b1d565b60405180910390a150505050505050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6115ac611850565b600081116115f45760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b604482015260640161084e565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611257565b61165e611850565b61ffff8316600090815260016020526040902061167c908383612327565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161125793929190612aa0565b6116b8611850565b6001600160a01b03811661171d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084e565b610cde81611fb1565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156117a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117ce9190810190612b58565b95945050505050565b60008061183a5a60966366ad5c8a60e01b898989896040516024016117ff9493929190612bc5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091523092919061210e565b9150915081610f7c57610f7c8686868685612198565b6000546001600160a01b03163314610bfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084e565b6001600160a01b03831661190c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161084e565b6001600160a01b03821661196d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161084e565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006119db8484611579565b90506000198114611a435781811015611a365760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161084e565b611a4384848484036118aa565b50505050565b6001600160a01b038316611aad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161084e565b6001600160a01b038216611b0f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161084e565b6001600160a01b03831660009081526006602052604090205481811015611b875760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161084e565b6001600160a01b0380851660008181526006602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611be79086815260200190565b60405180910390a3611a43565b6001600160a01b038216611c4a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161084e565b8060086000828254611c5c9190612a48565b90915550506001600160a01b0382166000818152600660209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216611d155760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161084e565b6001600160a01b03821660009081526006602052604090205481811015611d895760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161084e565b6001600160a01b03831660008181526006602090815260408083208686039055600880548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016119c2565b505050565b61ffff861660009081526001602052604081208054611e04906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e30906128d5565b8015611e7d5780601f10611e5257610100808354040283529160200191611e7d565b820191906000526020600020905b815481529060010190602001808311611e6057829003601f168201915b50505050509050805160001415611eef5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b606482015260840161084e565b611efa878751612235565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100908490611f51908b9086908c908c908c908c90600401612c03565b6000604051808303818588803b158015611f6a57600080fd5b505af1158015611f7e573d6000803e3d6000fd5b505050505050505050505050565b60008082806020019051810190611fa39190612c6a565b91509150610f7c8282611bf4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608161200f81601f612a48565b101561204e5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161084e565b6120588284612a48565b8451101561209c5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161084e565b6060821580156120bb5760405191506000825260208201604052612105565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156120f45780518352602092830192016120dc565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff166001600160401b0381111561213357612133612648565b6040519080825280601f01601f19166020018201604052801561215d576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561217f578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff168152602001908152602001600020856040516121c99190612c98565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906122269087908790879087908790612cb4565b60405180910390a15050505050565b61ffff82166000908152600360205260409020548061225357506127105b80821115611de15760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765604482015260640161084e565b8280546122af906128d5565b90600052602060002090601f0160209004810192826122d15760008555612317565b82601f106122ea57805160ff1916838001178555612317565b82800160010185558215612317579182015b828111156123175782518255916020019190600101906122fc565b5061232392915061239b565b5090565b828054612333906128d5565b90600052602060002090601f0160209004810192826123555760008555612317565b82601f1061236e5782800160ff19823516178555612317565b82800160010185558215612317579182015b82811115612317578235825591602001919060010190612380565b5b80821115612323576000815560010161239c565b803561ffff811681146123c257600080fd5b919050565b60008083601f8401126123d957600080fd5b5081356001600160401b038111156123f057600080fd5b60208301915083602082850101111561240857600080fd5b9250929050565b80356001600160401b03811681146123c257600080fd5b6000806000806000806080878903121561243f57600080fd5b612448876123b0565b955060208701356001600160401b038082111561246457600080fd5b6124708a838b016123c7565b909750955085915061248460408a0161240f565b9450606089013591508082111561249a57600080fd5b506124a789828a016123c7565b979a9699509497509295939492505050565b60005b838110156124d45781810151838201526020016124bc565b83811115611a435750506000910152565b600081518084526124fd8160208601602086016124b9565b601f01601f19169290920160200192915050565b60208152600061114f60208301846124e5565b60006020828403121561253657600080fd5b61114f826123b0565b6001600160a01b0381168114610cde57600080fd5b6000806040838503121561256757600080fd5b82356125728161253f565b946020939093013593505050565b6000806040838503121561259357600080fd5b612572836123b0565b6000806000606084860312156125b157600080fd5b83356125bc8161253f565b925060208401356125cc8161253f565b929592945050506040919091013590565b6000602082840312156125ef57600080fd5b5035919050565b60008060006040848603121561260b57600080fd5b612614846123b0565b925060208401356001600160401b0381111561262f57600080fd5b61263b868287016123c7565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561268657612686612648565b604052919050565b60006001600160401b038211156126a7576126a7612648565b50601f01601f191660200190565b6000806000606084860312156126ca57600080fd5b6126d3846123b0565b925060208401356001600160401b038111156126ee57600080fd5b8401601f810186136126ff57600080fd5b803561271261270d8261268e565b61265e565b81815287602083850101111561272757600080fd5b8160208401602083013760006020838301015280945050505061274c6040850161240f565b90509250925092565b60006020828403121561276757600080fd5b813561114f8161253f565b6000806040838503121561278557600080fd5b61278e836123b0565b915061279c602084016123b0565b90509250929050565b6000806000806000608086880312156127bd57600080fd5b6127c6866123b0565b94506127d4602087016123b0565b93506040860135925060608601356001600160401b038111156127f657600080fd5b612802888289016123c7565b969995985093965092949392505050565b6000806040838503121561282657600080fd5b82356128318161253f565b915060208301356128418161253f565b809150509250929050565b60008060006060848603121561286157600080fd5b61286a846123b0565b9250612878602085016123b0565b9150604084013590509250925092565b6000806000806080858703121561289e57600080fd5b6128a7856123b0565b93506128b5602086016123b0565b925060408501356128c58161253f565b9396929550929360600135925050565b600181811c908216806128e957607f821691505b6020821081141561290a57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561297157816000190482111561295757612957612920565b8085161561296457918102915b93841c939080029061293b565b509250929050565b60008261298857506001610b3a565b8161299557506000610b3a565b81600181146129ab57600281146129b5576129d1565b6001915050610b3a565b60ff8411156129c6576129c6612920565b50506001821b610b3a565b5060208310610133831016604e8410600b84101617156129f4575081810a610b3a565b6129fe8383612936565b8060001904821115612a1257612a12612920565b029392505050565b600061114f60ff841683612979565b6000816000190483118215151615612a4357612a43612920565b500290565b60008219821115612a5b57612a5b612920565b500190565b600082821015612a7257612a72612920565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff841681526040602082015260006117ce604083018486612a77565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600061ffff808816835280871660208401525084604083015260806060830152612b12608083018486612a77565b979650505050505050565b61ffff86168152608060208201526000612b3b608083018688612a77565b6001600160401b0394909416604083015250606001529392505050565b600060208284031215612b6a57600080fd5b81516001600160401b03811115612b8057600080fd5b8201601f81018413612b9157600080fd5b8051612b9f61270d8261268e565b818152856020838501011115612bb457600080fd5b6117ce8260208301602086016124b9565b61ffff85168152608060208201526000612be260808301866124e5565b6001600160401b03851660408401528281036060840152612b1281856124e5565b61ffff8716815260c060208201526000612c2060c08301886124e5565b8281036040840152612c3281886124e5565b6001600160a01b0387811660608601528616608085015283810360a08501529050612c5d81856124e5565b9998505050505050505050565b60008060408385031215612c7d57600080fd5b8251612c888161253f565b6020939093015192949293505050565b60008251612caa8184602087016124b9565b9190910192915050565b61ffff8616815260a060208201526000612cd160a08301876124e5565b6001600160401b03861660408401528281036060840152612cf281866124e5565b90508281036080840152612d0681856124e5565b9897505050505050505056fea2646970667358221220692c5474d33e050624eaddb76eebad3872186aa6993ef01faa5dc871af2c670064736f6c634300080c00330000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d3235245
Deployed Bytecode
0x6080604052600436106102505760003560e01c806370a0823111610139578063a9059cbb116100b6578063d1deba1f1161007a578063d1deba1f14610727578063dd62ed3e1461073a578063df2a5b3b1461075a578063eb8d72b71461077a578063f2fde38b1461079a578063f5ecbdbc146107ba57600080fd5b8063a9059cbb1461067d578063b353aaa71461069d578063baf3292d146106d1578063c4461834146106f1578063cbed8b9c1461070757600080fd5b8063950c8a74116100fd578063950c8a74146105e857806395d89b41146106085780639f38369a1461061d578063a457c2d71461063d578063a6c3d1651461065d57600080fd5b806370a0823114610513578063715018a6146105495780637533d7881461055e5780638cfd8f5c1461057e5780638da5cb5b146105b657600080fd5b806333967ed6116101d25780633f1f4fa4116101965780633f1f4fa41461041757806342d65a8d1461044457806344a0d68a146104645780635b8c41e6146104845780635cdf1649146104d357806366ad5c8a146104f357600080fd5b806333967ed6146103a757806339509351146103bc5780633ae0664c146103dc5780633ccfd60b146103ef5780633d8b38f6146103f757600080fd5b806310ddb1371161021957806310ddb1371461031257806313faede61461033257806318160ddd1461035657806323b872dd1461036b578063313ce5671461038b57600080fd5b80621d35671461025557806306fdde031461027757806307e0db17146102a2578063095ea7b3146102c25780630df37483146102f2575b600080fd5b34801561026157600080fd5b50610275610270366004612426565b6107da565b005b34801561028357600080fd5b5061028c610a0b565b6040516102999190612511565b60405180910390f35b3480156102ae57600080fd5b506102756102bd366004612524565b610a9d565b3480156102ce57600080fd5b506102e26102dd366004612554565b610b26565b6040519015158152602001610299565b3480156102fe57600080fd5b5061027561030d366004612580565b610b40565b34801561031e57600080fd5b5061027561032d366004612524565b610b5f565b34801561033e57600080fd5b50610348600c5481565b604051908152602001610299565b34801561036257600080fd5b50600854610348565b34801561037757600080fd5b506102e261038636600461259c565b610bb7565b34801561039757600080fd5b5060405160128152602001610299565b3480156103b357600080fd5b50610275610bdb565b3480156103c857600080fd5b506102e26103d7366004612554565b610bfe565b6102756103ea3660046125dd565b610c20565b610275610c81565b34801561040357600080fd5b506102e26104123660046125f6565b610ce1565b34801561042357600080fd5b50610348610432366004612524565b60036020526000908152604090205481565b34801561045057600080fd5b5061027561045f3660046125f6565b610dad565b34801561047057600080fd5b5061027561047f3660046125dd565b610e33565b34801561049057600080fd5b5061034861049f3660046126b5565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b3480156104df57600080fd5b506102756104ee366004612755565b610e40565b3480156104ff57600080fd5b5061027561050e366004612426565b610ea8565b34801561051f57600080fd5b5061034861052e366004612755565b6001600160a01b031660009081526006602052604090205490565b34801561055557600080fd5b50610275610f84565b34801561056a57600080fd5b5061028c610579366004612524565b610f96565b34801561058a57600080fd5b50610348610599366004612772565b600260209081526000928352604080842090915290825290205481565b3480156105c257600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610299565b3480156105f457600080fd5b506004546105d0906001600160a01b031681565b34801561061457600080fd5b5061028c611030565b34801561062957600080fd5b5061028c610638366004612524565b61103f565b34801561064957600080fd5b506102e2610658366004612554565b611156565b34801561066957600080fd5b506102756106783660046125f6565b6111d1565b34801561068957600080fd5b506102e2610698366004612554565b611264565b3480156106a957600080fd5b506105d07f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d323524581565b3480156106dd57600080fd5b506102756106ec366004612755565b611272565b3480156106fd57600080fd5b5061034861271081565b34801561071357600080fd5b506102756107223660046127a5565b6112ce565b610275610735366004612426565b611363565b34801561074657600080fd5b50610348610755366004612813565b611579565b34801561076657600080fd5b5061027561077536600461284c565b6115a4565b34801561078657600080fd5b506102756107953660046125f6565b611656565b3480156107a657600080fd5b506102756107b5366004612755565b6116b0565b3480156107c657600080fd5b5061028c6107d5366004612888565b611726565b337f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d32352456001600160a01b0316146108575760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526001602052604081208054610875906128d5565b80601f01602080910402602001604051908101604052809291908181526020018280546108a1906128d5565b80156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b50505050509050805186869050148015610909575060008151115b80156109315750805160208201206040516109279088908890612910565b6040518091039020145b61098c5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b606482015260840161084e565b610a028787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506117d792505050565b50505050505050565b606060098054610a1a906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a46906128d5565b8015610a935780601f10610a6857610100808354040283529160200191610a93565b820191906000526020600020905b815481529060010190602001808311610a7657829003601f168201915b5050505050905090565b610aa5611850565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d32352456001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610b0b57600080fd5b505af1158015610b1f573d6000803e3d6000fd5b5050505050565b600033610b348185856118aa565b60019150505b92915050565b610b48611850565b61ffff909116600090815260036020526040902055565b610b67611850565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d32352456001600160a01b0316906310ddb13790602401610af1565b600033610bc58582856119cf565b610bd0858585611a49565b506001949350505050565b610bfc33610beb6012600a612a1a565b610bf7906103e8612a29565b611bf4565b565b600033610b34818585610c118383611579565b610c1b9190612a48565b6118aa565b610c2a3382611cb5565b604080513360208201819052818301849052825180830384018152600b546080840190945260006060909301838152600c549194610c7d9461ffff909116938693909290610c789034612a60565b611de6565b5050565b610c89611850565b604051600090339047908381818185875af1925050503d8060008114610ccb576040519150601f19603f3d011682016040523d82523d6000602084013e610cd0565b606091505b5050905080610cde57600080fd5b50565b61ffff831660009081526001602052604081208054829190610d02906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2e906128d5565b8015610d7b5780601f10610d5057610100808354040283529160200191610d7b565b820191906000526020600020905b815481529060010190602001808311610d5e57829003601f168201915b505050505090508383604051610d92929190612910565b60405180910390208180519060200120149150509392505050565b610db5611850565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d323524516906342d65a8d90610e0590869086908690600401612aa0565b600060405180830381600087803b158015610e1f57600080fd5b505af1158015610a02573d6000803e3d6000fd5b610e3b611850565b600c55565b610e48611850565b6040516bffffffffffffffffffffffff19606083811b8216602084015230901b16603482015260480160408051601f19818403018152918152600b5461ffff166000908152600160209081529190208251610c7d939192909101906122a3565b333014610f065760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b606482015260840161084e565b610f7c8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611f8c92505050565b505050505050565b610f8c611850565b610bfc6000611fb1565b60016020526000908152604090208054610faf906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdb906128d5565b80156110285780601f10610ffd57610100808354040283529160200191611028565b820191906000526020600020905b81548152906001019060200180831161100b57829003601f168201915b505050505081565b6060600a8054610a1a906128d5565b61ffff8116600090815260016020526040812080546060929190611062906128d5565b80601f016020809104026020016040519081016040528092919081815260200182805461108e906128d5565b80156110db5780601f106110b0576101008083540402835291602001916110db565b820191906000526020600020905b8154815290600101906020018083116110be57829003601f168201915b505050505090508051600014156111345760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000604482015260640161084e565b61114f6000601483516111479190612a60565b839190612001565b9392505050565b600033816111648286611579565b9050838110156111c45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161084e565b610bd082868684036118aa565b6111d9611850565b8181306040516020016111ee93929190612abe565b60408051601f1981840301815291815261ffff85166000908152600160209081529190208251611223939192909101906122a3565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161125793929190612aa0565b60405180910390a1505050565b600033610b34818585611a49565b61127a611850565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6112d6611850565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d3235245169063cbed8b9c9061132a9088908890889088908890600401612ae4565b600060405180830381600087803b15801561134457600080fd5b505af1158015611358573d6000803e3d6000fd5b505050505050505050565b61ffff861660009081526005602052604080822090516113869088908890612910565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806114065760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b606482015260840161084e565b808383604051611417929190612910565b6040518091039020146114765760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b606482015260840161084e565b61ffff871660009081526005602052604080822090516114999089908990612910565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252611531918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611f8c92505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611568959493929190612b1d565b60405180910390a150505050505050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b6115ac611850565b600081116115f45760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b604482015260640161084e565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611257565b61165e611850565b61ffff8316600090815260016020526040902061167c908383612327565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161125793929190612aa0565b6116b8611850565b6001600160a01b03811661171d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084e565b610cde81611fb1565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d32352456001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156117a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117ce9190810190612b58565b95945050505050565b60008061183a5a60966366ad5c8a60e01b898989896040516024016117ff9493929190612bc5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091523092919061210e565b9150915081610f7c57610f7c8686868685612198565b6000546001600160a01b03163314610bfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161084e565b6001600160a01b03831661190c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161084e565b6001600160a01b03821661196d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161084e565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006119db8484611579565b90506000198114611a435781811015611a365760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161084e565b611a4384848484036118aa565b50505050565b6001600160a01b038316611aad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161084e565b6001600160a01b038216611b0f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161084e565b6001600160a01b03831660009081526006602052604090205481811015611b875760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161084e565b6001600160a01b0380851660008181526006602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611be79086815260200190565b60405180910390a3611a43565b6001600160a01b038216611c4a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161084e565b8060086000828254611c5c9190612a48565b90915550506001600160a01b0382166000818152600660209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216611d155760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161084e565b6001600160a01b03821660009081526006602052604090205481811015611d895760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161084e565b6001600160a01b03831660008181526006602090815260408083208686039055600880548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016119c2565b505050565b61ffff861660009081526001602052604081208054611e04906128d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e30906128d5565b8015611e7d5780601f10611e5257610100808354040283529160200191611e7d565b820191906000526020600020905b815481529060010190602001808311611e6057829003601f168201915b50505050509050805160001415611eef5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b606482015260840161084e565b611efa878751612235565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d3235245169063c5803100908490611f51908b9086908c908c908c908c90600401612c03565b6000604051808303818588803b158015611f6a57600080fd5b505af1158015611f7e573d6000803e3d6000fd5b505050505050505050505050565b60008082806020019051810190611fa39190612c6a565b91509150610f7c8282611bf4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608161200f81601f612a48565b101561204e5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161084e565b6120588284612a48565b8451101561209c5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161084e565b6060821580156120bb5760405191506000825260208201604052612105565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156120f45780518352602092830192016120dc565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff166001600160401b0381111561213357612133612648565b6040519080825280601f01601f19166020018201604052801561215d576020820181803683370190505b50905060008087516020890160008d8df191503d92508683111561217f578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff168152602001908152602001600020856040516121c99190612c98565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c906122269087908790879087908790612cb4565b60405180910390a15050505050565b61ffff82166000908152600360205260409020548061225357506127105b80821115611de15760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765604482015260640161084e565b8280546122af906128d5565b90600052602060002090601f0160209004810192826122d15760008555612317565b82601f106122ea57805160ff1916838001178555612317565b82800160010185558215612317579182015b828111156123175782518255916020019190600101906122fc565b5061232392915061239b565b5090565b828054612333906128d5565b90600052602060002090601f0160209004810192826123555760008555612317565b82601f1061236e5782800160ff19823516178555612317565b82800160010185558215612317579182015b82811115612317578235825591602001919060010190612380565b5b80821115612323576000815560010161239c565b803561ffff811681146123c257600080fd5b919050565b60008083601f8401126123d957600080fd5b5081356001600160401b038111156123f057600080fd5b60208301915083602082850101111561240857600080fd5b9250929050565b80356001600160401b03811681146123c257600080fd5b6000806000806000806080878903121561243f57600080fd5b612448876123b0565b955060208701356001600160401b038082111561246457600080fd5b6124708a838b016123c7565b909750955085915061248460408a0161240f565b9450606089013591508082111561249a57600080fd5b506124a789828a016123c7565b979a9699509497509295939492505050565b60005b838110156124d45781810151838201526020016124bc565b83811115611a435750506000910152565b600081518084526124fd8160208601602086016124b9565b601f01601f19169290920160200192915050565b60208152600061114f60208301846124e5565b60006020828403121561253657600080fd5b61114f826123b0565b6001600160a01b0381168114610cde57600080fd5b6000806040838503121561256757600080fd5b82356125728161253f565b946020939093013593505050565b6000806040838503121561259357600080fd5b612572836123b0565b6000806000606084860312156125b157600080fd5b83356125bc8161253f565b925060208401356125cc8161253f565b929592945050506040919091013590565b6000602082840312156125ef57600080fd5b5035919050565b60008060006040848603121561260b57600080fd5b612614846123b0565b925060208401356001600160401b0381111561262f57600080fd5b61263b868287016123c7565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561268657612686612648565b604052919050565b60006001600160401b038211156126a7576126a7612648565b50601f01601f191660200190565b6000806000606084860312156126ca57600080fd5b6126d3846123b0565b925060208401356001600160401b038111156126ee57600080fd5b8401601f810186136126ff57600080fd5b803561271261270d8261268e565b61265e565b81815287602083850101111561272757600080fd5b8160208401602083013760006020838301015280945050505061274c6040850161240f565b90509250925092565b60006020828403121561276757600080fd5b813561114f8161253f565b6000806040838503121561278557600080fd5b61278e836123b0565b915061279c602084016123b0565b90509250929050565b6000806000806000608086880312156127bd57600080fd5b6127c6866123b0565b94506127d4602087016123b0565b93506040860135925060608601356001600160401b038111156127f657600080fd5b612802888289016123c7565b969995985093965092949392505050565b6000806040838503121561282657600080fd5b82356128318161253f565b915060208301356128418161253f565b809150509250929050565b60008060006060848603121561286157600080fd5b61286a846123b0565b9250612878602085016123b0565b9150604084013590509250925092565b6000806000806080858703121561289e57600080fd5b6128a7856123b0565b93506128b5602086016123b0565b925060408501356128c58161253f565b9396929550929360600135925050565b600181811c908216806128e957607f821691505b6020821081141561290a57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561297157816000190482111561295757612957612920565b8085161561296457918102915b93841c939080029061293b565b509250929050565b60008261298857506001610b3a565b8161299557506000610b3a565b81600181146129ab57600281146129b5576129d1565b6001915050610b3a565b60ff8411156129c6576129c6612920565b50506001821b610b3a565b5060208310610133831016604e8410600b84101617156129f4575081810a610b3a565b6129fe8383612936565b8060001904821115612a1257612a12612920565b029392505050565b600061114f60ff841683612979565b6000816000190483118215151615612a4357612a43612920565b500290565b60008219821115612a5b57612a5b612920565b500190565b600082821015612a7257612a72612920565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff841681526040602082015260006117ce604083018486612a77565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600061ffff808816835280871660208401525084604083015260806060830152612b12608083018486612a77565b979650505050505050565b61ffff86168152608060208201526000612b3b608083018688612a77565b6001600160401b0394909416604083015250606001529392505050565b600060208284031215612b6a57600080fd5b81516001600160401b03811115612b8057600080fd5b8201601f81018413612b9157600080fd5b8051612b9f61270d8261268e565b818152856020838501011115612bb457600080fd5b6117ce8260208301602086016124b9565b61ffff85168152608060208201526000612be260808301866124e5565b6001600160401b03851660408401528281036060840152612b1281856124e5565b61ffff8716815260c060208201526000612c2060c08301886124e5565b8281036040840152612c3281886124e5565b6001600160a01b0387811660608601528616608085015283810360a08501529050612c5d81856124e5565b9998505050505050505050565b60008060408385031215612c7d57600080fd5b8251612c888161253f565b6020939093015192949293505050565b60008251612caa8184602087016124b9565b9190910192915050565b61ffff8616815260a060208201526000612cd160a08301876124e5565b6001600160401b03861660408401528281036060840152612cf281866124e5565b90508281036080840152612d0681856124e5565b9897505050505050505056fea2646970667358221220692c5474d33e050624eaddb76eebad3872186aa6993ef01faa5dc871af2c670064736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d3235245
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x4EE2F9B7cf3A68966c370F3eb2C16613d3235245
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004ee2f9b7cf3a68966c370f3eb2c16613d3235245
Deployed Bytecode Sourcemap
62753:1921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48308:762;;;;;;;;;;-1:-1:-1;48308:762:0;;;;;:::i;:::-;;:::i;:::-;;9442:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51606:123;;;;;;;;;;-1:-1:-1;51606:123:0;;;;;:::i;:::-;;:::i;11802:201::-;;;;;;;;;;-1:-1:-1;11802:201:0;;;;;:::i;:::-;;:::i;:::-;;;3134:14:1;;3127:22;3109:41;;3097:2;3082:18;11802:201:0;2969:187:1;53531:142:0;;;;;;;;;;-1:-1:-1;53531:142:0;;;;;:::i;:::-;;:::i;51737:129::-;;;;;;;;;;-1:-1:-1;51737:129:0;;;;;:::i;:::-;;:::i;62844:35::-;;;;;;;;;;;;;;;;;;;3564:25:1;;;3552:2;3537:18;62844:35:0;3418:177:1;10571:108:0;;;;;;;;;;-1:-1:-1;10659:12:0;;10571:108;;12583:261;;;;;;;;;;-1:-1:-1;12583:261:0;;;;;:::i;:::-;;:::i;10413:93::-;;;;;;;;;;-1:-1:-1;10413:93:0;;10496:2;4203:36:1;;4191:2;4176:18;10413:93:0;4061:184:1;64085:87:0;;;;;;;;;;;;;:::i;13253:238::-;;;;;;;;;;-1:-1:-1;13253:238:0;;;;;:::i;:::-;;:::i;63810:273::-;;;;;;:::i;:::-;;:::i;64479:192::-;;;:::i;53771:250::-;;;;;;;;;;-1:-1:-1;53771:250:0;;;;;:::i;:::-;;:::i;47850:53::-;;;;;;;;;;-1:-1:-1;47850:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;51874:178;;;;;;;;;;-1:-1:-1;51874:178:0;;;;;:::i;:::-;;:::i;64385:86::-;;;;;;;;;;-1:-1:-1;64385:86:0;;;;;:::i;:::-;;:::i;60166:85::-;;;;;;;;;;-1:-1:-1;60166:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64206:169;;;;;;;;;;-1:-1:-1;64206:169:0;;;;;:::i;:::-;;:::i;61388:346::-;;;;;;;;;;-1:-1:-1;61388:346:0;;;;;:::i;:::-;;:::i;10742:127::-;;;;;;;;;;-1:-1:-1;10742:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10843:18:0;10816:7;10843:18;;;:9;:18;;;;;;;10742:127;2877:103;;;;;;;;;;;;;:::i;47720:51::-;;;;;;;;;;-1:-1:-1;47720:51:0;;;;;:::i;:::-;;:::i;47778:65::-;;;;;;;;;;-1:-1:-1;47778:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2236:87;;;;;;;;;;-1:-1:-1;2282:7:0;2309:6;-1:-1:-1;;;;;2309:6:0;2236:87;;;-1:-1:-1;;;;;7426:32:1;;;7408:51;;7396:2;7381:18;2236:87:0;7262:203:1;47910:23:0;;;;;;;;;;-1:-1:-1;47910:23:0;;;;-1:-1:-1;;;;;47910:23:0;;;9661:104;;;;;;;;;;;;;:::i;52703:330::-;;;;;;;;;;-1:-1:-1;52703:330:0;;;;;:::i;:::-;;:::i;13994:436::-;;;;;;;;;;-1:-1:-1;13994:436:0;;;;;:::i;:::-;;:::i;52414:281::-;;;;;;;;;;-1:-1:-1;52414:281:0;;;;;:::i;:::-;;:::i;11075:193::-;;;;;;;;;;-1:-1:-1;11075:193:0;;;;;:::i;:::-;;:::i;47667:46::-;;;;;;;;;;;;;;;53041:136;;;;;;;;;;-1:-1:-1;53041:136:0;;;;;:::i;:::-;;:::i;47603:55::-;;;;;;;;;;;;47653:5;47603:55;;51394:204;;;;;;;;;;-1:-1:-1;51394:204:0;;;;;:::i;:::-;;:::i;61920:767::-;;;;;;:::i;:::-;;:::i;11331:151::-;;;;;;;;;;-1:-1:-1;11331:151:0;;;;;:::i;:::-;;:::i;53185:284::-;;;;;;;;;;-1:-1:-1;53185:284:0;;;;;:::i;:::-;;:::i;52199:207::-;;;;;;;;;;-1:-1:-1;52199:207:0;;;;;:::i;:::-;;:::i;3135:201::-;;;;;;;;;;-1:-1:-1;3135:201:0;;;;;:::i;:::-;;:::i;51121:211::-;;;;;;;;;;-1:-1:-1;51121:211:0;;;;;:::i;:::-;;:::i;48308:762::-;861:10;48548;-1:-1:-1;;;;;48524:35:0;;48516:78;;;;-1:-1:-1;;;48516:78:0;;9720:2:1;48516:78:0;;;9702:21:1;9759:2;9739:18;;;9732:30;9798:32;9778:18;;;9771:60;9848:18;;48516:78:0;;;;;;;;;48636:32;;;48607:26;48636:32;;;:19;:32;;;;;48607:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48842:13;:20;48820:11;;:18;;:42;:70;;;;;48889:1;48866:13;:20;:24;48820:70;:124;;;;-1:-1:-1;48920:24:0;;;;;;48894:22;;;;48904:11;;;;48894:22;:::i;:::-;;;;;;;;:50;48820:124;48812:175;;;;-1:-1:-1;;;48812:175:0;;10740:2:1;48812:175:0;;;10722:21:1;10779:2;10759:18;;;10752:30;10818:34;10798:18;;;10791:62;-1:-1:-1;;;10869:18:1;;;10862:36;10915:19;;48812:175:0;10538:402:1;48812:175:0;49000:62;49019:11;49032;;49000:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49000:62:0;;;;;;;;;;;;;;;;;;;;;;49045:6;;-1:-1:-1;49000:62:0;-1:-1:-1;49053:8:0;;;;;;49000:62;;49053:8;;;;49000:62;;;;;;;;;-1:-1:-1;49000:18:0;;-1:-1:-1;;;49000:62:0:i;:::-;48439:631;48308:762;;;;;;:::o;9442:100::-;9496:13;9529:5;9522:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9442:100;:::o;51606:123::-;2122:13;:11;:13::i;:::-;51686:35:::1;::::0;-1:-1:-1;;;51686:35:0;;11119:6:1;11107:19;;51686:35:0::1;::::0;::::1;11089:38:1::0;51686:10:0::1;-1:-1:-1::0;;;;;51686:25:0::1;::::0;::::1;::::0;11062:18:1;;51686:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51606:123:::0;:::o;11802:201::-;11885:4;861:10;11941:32;861:10;11957:7;11966:6;11941:8;:32::i;:::-;11991:4;11984:11;;;11802:201;;;;;:::o;53531:142::-;2122:13;:11;:13::i;:::-;53622:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;53531:142::o;51737:129::-;2122:13;:11;:13::i;:::-;51820:38:::1;::::0;-1:-1:-1;;;51820:38:0;;11119:6:1;11107:19;;51820:38:0::1;::::0;::::1;11089::1::0;51820:10:0::1;-1:-1:-1::0;;;;;51820:28:0::1;::::0;::::1;::::0;11062:18:1;;51820:38:0::1;10945:188:1::0;12583:261:0;12680:4;861:10;12738:38;12754:4;861:10;12769:6;12738:15;:38::i;:::-;12787:27;12797:4;12803:2;12807:6;12787:9;:27::i;:::-;-1:-1:-1;12832:4:0;;12583:261;-1:-1:-1;;;;12583:261:0:o;64085:87::-;64122:42;64128:10;64147:16;10496:2;64147;:16;:::i;:::-;64140:23;;:4;:23;:::i;:::-;64122:5;:42::i;:::-;64085:87::o;13253:238::-;13341:4;861:10;13397:64;861:10;13413:7;13450:10;13422:25;861:10;13413:7;13422:9;:25::i;:::-;:38;;;;:::i;:::-;13397:8;:64::i;63810:273::-;63882:26;63888:10;63900:7;63882:5;:26::i;:::-;63942:31;;;63953:10;63942:31;;;13133:51:1;;;13200:18;;;13193:34;;;63942:31:0;;;;;;;;;63992:11;;64049:9;;;;;;-1:-1:-1;13106:18:1;;;;64049:9:0;;;64070:4;;63942:31;;63984:91;;63992:11;;;;;63942:31;;63953:10;;13106:18:1;64060:14:0;;:9;:14;:::i;:::-;63984:7;:91::i;:::-;63871:212;63810:273;:::o;64479:192::-;2122:13;:11;:13::i;:::-;64554:82:::1;::::0;64536:12:::1;::::0;64562:10:::1;::::0;64600:21:::1;::::0;64536:12;64554:82;64536:12;64554:82;64600:21;64562:10;64554:82:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64535:101;;;64655:7;64647:16;;;::::0;::::1;;64524:147;64479:192::o:0;53771:250::-;53913:32;;;53867:4;53913:32;;;:19;:32;;;;;53884:61;;53867:4;;53913:32;53884:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54001:11;;53991:22;;;;;;;:::i;:::-;;;;;;;;53973:13;53963:24;;;;;;:50;53956:57;;;53771:250;;;;;:::o;51874:178::-;2122:13;:11;:13::i;:::-;51989:55:::1;::::0;-1:-1:-1;;;51989:55:0;;-1:-1:-1;;;;;51989:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;52019:11;;52032;;;;51989:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;64385:86:::0;2122:13;:11;:13::i;:::-;64448:4:::1;:15:::0;64385:86::o;64206:169::-;2122:13;:11;:13::i;:::-;64316:48:::1;::::0;-1:-1:-1;;14407:2:1;14403:15;;;14399:24;;64316:48:0::1;::::0;::::1;14387:37:1::0;64358:4:0::1;14458:15:1::0;;14454:24;14440:12;;;14433:46;14495:12;;64316:48:0::1;::::0;;-1:-1:-1;;64316:48:0;;::::1;::::0;;;;;;64301:11:::1;::::0;::::1;;64281:32;::::0;;;:19:::1;64316:48;64281:32:::0;;;;;;:83;;::::1;::::0;:32;;:83;;::::1;::::0;::::1;:::i;61388:346::-:0;861:10;61602:4;61578:29;61570:80;;;;-1:-1:-1;;;61570:80:0;;14720:2:1;61570:80:0;;;14702:21:1;14759:2;14739:18;;;14732:30;14798:34;14778:18;;;14771:62;-1:-1:-1;;;14849:18:1;;;14842:36;14895:19;;61570:80:0;14518:402:1;61570:80:0;61661:65;61683:11;61696;;61661:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61661:65:0;;;;;;;;;;;;;;;;;;;;;;61709:6;;-1:-1:-1;61661:65:0;-1:-1:-1;61717:8:0;;;;;;61661:65;;61717:8;;;;61661:65;;;;;;;;;-1:-1:-1;61661:21:0;;-1:-1:-1;;;61661:65:0:i;:::-;61388:346;;;;;;:::o;2877:103::-;2122:13;:11;:13::i;:::-;2942:30:::1;2969:1;2942:18;:30::i;47720:51::-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9661:104::-;9717:13;9750:7;9743:14;;;;;:::i;52703:330::-;52827:35;;;52807:17;52827:35;;;:19;:35;;;;;52807:55;;52782:12;;52807:17;52827:35;52807:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52881:4;:11;52896:1;52881:16;;52873:58;;;;-1:-1:-1;;;52873:58:0;;15127:2:1;52873:58:0;;;15109:21:1;15166:2;15146:18;;;15139:30;15205:31;15185:18;;;15178:59;15254:18;;52873:58:0;14925:353:1;52873:58:0;52949:31;52960:1;52977:2;52963:4;:11;:16;;;;:::i;:::-;52949:4;;:31;:10;:31::i;:::-;52942:38;52703:330;-1:-1:-1;;;52703:330:0:o;13994:436::-;14087:4;861:10;14087:4;14170:25;861:10;14187:7;14170:9;:25::i;:::-;14143:52;;14234:15;14214:16;:35;;14206:85;;;;-1:-1:-1;;;14206:85:0;;15485:2:1;14206:85:0;;;15467:21:1;15524:2;15504:18;;;15497:30;15563:34;15543:18;;;15536:62;-1:-1:-1;;;15614:18:1;;;15607:35;15659:19;;14206:85:0;15283:401:1;14206:85:0;14327:60;14336:5;14343:7;14371:15;14352:16;:34;14327:8;:60::i;52414:281::-;2122:13;:11;:13::i;:::-;52586:14:::1;;52610:4;52569:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;52569:47:0;;::::1;::::0;;;;;;52531:35:::1;::::0;::::1;;::::0;;;:19:::1;52569:47;52531:35:::0;;;;;;:85;;::::1;::::0;:35;;:85;;::::1;::::0;::::1;:::i;:::-;;52632:55;52656:14;52672;;52632:55;;;;;;;;:::i;:::-;;;;;;;;52414:281:::0;;;:::o;11075:193::-;11154:4;861:10;11210:28;861:10;11227:2;11231:6;11210:9;:28::i;53041:136::-;2122:13;:11;:13::i;:::-;53111:8:::1;:20:::0;;-1:-1:-1;;;;;;53111:20:0::1;-1:-1:-1::0;;;;;53111:20:0;::::1;::::0;;::::1;::::0;;;53147:22:::1;::::0;7408:51:1;;;53147:22:0::1;::::0;7396:2:1;7381:18;53147:22:0::1;;;;;;;53041:136:::0;:::o;51394:204::-;2122:13;:11;:13::i;:::-;51528:62:::1;::::0;-1:-1:-1;;;51528:62:0;;-1:-1:-1;;;;;51528:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;51549:8;;51559;;51569:11;;51582:7;;;;51528:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51394:204:::0;;;;;:::o;61920:767::-;62131:27;;;62109:19;62131:27;;;:14;:27;;;;;;:40;;;;62159:11;;;;62131:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62131:48:0;;;;;;;;;;;;-1:-1:-1;62131:48:0;62190:73;;;;-1:-1:-1;;;62190:73:0;;16781:2:1;62190:73:0;;;16763:21:1;16820:2;16800:18;;;16793:30;16859:34;16839:18;;;16832:62;-1:-1:-1;;;16910:18:1;;;16903:33;16953:19;;62190:73:0;16579:399:1;62190:73:0;62305:11;62292:8;;62282:19;;;;;;;:::i;:::-;;;;;;;;:34;62274:80;;;;-1:-1:-1;;;62274:80:0;;17185:2:1;62274:80:0;;;17167:21:1;17224:2;17204:18;;;17197:30;17263:34;17243:18;;;17236:62;-1:-1:-1;;;17314:18:1;;;17307:31;17355:19;;62274:80:0;16983:397:1;62274:80:0;62402:27;;;62461:1;62402:27;;;:14;:27;;;;;;:40;;;;62430:11;;;;62402:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62402:48:0;;;;;;;;;;;;:61;;;;62532:65;;;;;;;;;;;;;;;;;;;62554:11;;62567;;62532:65;;;;;;62567:11;62532:65;;62567:11;62532:65;;;;;;;;;-1:-1:-1;;62532:65:0;;;;;;;;;;;;;;;;;;;;;;62580:6;;-1:-1:-1;62532:65:0;-1:-1:-1;62588:8:0;;;;;;62532:65;;62588:8;;;;62532:65;;;;;;;;;-1:-1:-1;62532:21:0;;-1:-1:-1;;;62532:65:0:i;:::-;62613:66;62633:11;62646;;62659:6;62667:11;62613:66;;;;;;;;;;:::i;:::-;;;;;;;;62053:634;61920:767;;;;;;:::o;11331:151::-;-1:-1:-1;;;;;11447:18:0;;;11420:7;11447:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11331:151::o;53185:284::-;2122:13;:11;:13::i;:::-;53309:1:::1;53299:7;:11;53291:45;;;::::0;-1:-1:-1;;;53291:45:0;;18085:2:1;53291:45:0::1;::::0;::::1;18067:21:1::0;18124:2;18104:18;;;18097:30;-1:-1:-1;;;18143:18:1;;;18136:51;18204:18;;53291:45:0::1;17883:345:1::0;53291:45:0::1;53347:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;53414:47;;18456:34:1;;;18506:18;;18499:43;;;;18558:18;;;18551:34;;;53414:47:0::1;::::0;18419:2:1;18404:18;53414:47:0::1;18233:358:1::0;52199:207:0;2122:13;:11;:13::i;:::-;52300:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;::::0;52338:5;;52300:43:::1;:::i;:::-;;52359:39;52376:14;52392:5;;52359:39;;;;;;;;:::i;3135:201::-:0;2122:13;:11;:13::i;:::-;-1:-1:-1;;;;;3224:22:0;::::1;3216:73;;;::::0;-1:-1:-1;;;3216:73:0;;18798:2:1;3216:73:0::1;::::0;::::1;18780:21:1::0;18837:2;18817:18;;;18810:30;18876:34;18856:18;;;18849:62;-1:-1:-1;;;18927:18:1;;;18920:36;18973:19;;3216:73:0::1;18596:402:1::0;3216:73:0::1;3300:28;3319:8;3300:18;:28::i;51121:211::-:0;51256:68;;-1:-1:-1;;;51256:68:0;;19240:6:1;19273:15;;;51256:68:0;;;19255:34:1;19325:15;;19305:18;;;19298:43;51305:4:0;19357:18:1;;;19350:60;19426:18;;;19419:34;;;51224:12:0;;51256:10;-1:-1:-1;;;;;51256:20:0;;;;19202:19:1;;51256:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51256:68:0;;;;;;;;;;;;:::i;:::-;51249:75;51121:211;-1:-1:-1;;;;;51121:211:0:o;60535:514::-;60685:12;60699:19;60722:153;60756:9;60767:3;60795:34;;;60831:11;60844;60857:6;60865:8;60772:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60772:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;60772:102:0;-1:-1:-1;;;;;;60772:102:0;;;;;;;;;;60730:4;;60722:153;;:33;:153::i;:::-;60684:191;;;;60935:7;60930:112;;60959:71;60979:11;60992;61005:6;61013:8;61023:6;60959:19;:71::i;2401:132::-;2282:7;2309:6;-1:-1:-1;;;;;2309:6:0;861:10;2465:23;2457:68;;;;-1:-1:-1;;;2457:68:0;;20867:2:1;2457:68:0;;;20849:21:1;;;20886:18;;;20879:30;20945:34;20925:18;;;20918:62;20997:18;;2457:68:0;20665:356:1;17987:346:0;-1:-1:-1;;;;;18089:19:0;;18081:68;;;;-1:-1:-1;;;18081:68:0;;21228:2:1;18081:68:0;;;21210:21:1;21267:2;21247:18;;;21240:30;21306:34;21286:18;;;21279:62;-1:-1:-1;;;21357:18:1;;;21350:34;21401:19;;18081:68:0;21026:400:1;18081:68:0;-1:-1:-1;;;;;18168:21:0;;18160:68;;;;-1:-1:-1;;;18160:68:0;;21633:2:1;18160:68:0;;;21615:21:1;21672:2;21652:18;;;21645:30;21711:34;21691:18;;;21684:62;-1:-1:-1;;;21762:18:1;;;21755:32;21804:19;;18160:68:0;21431:398:1;18160:68:0;-1:-1:-1;;;;;18241:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18293:32;;3564:25:1;;;18293:32:0;;3537:18:1;18293:32:0;;;;;;;;17987:346;;;:::o;18624:419::-;18725:24;18752:25;18762:5;18769:7;18752:9;:25::i;:::-;18725:52;;-1:-1:-1;;18792:16:0;:37;18788:248;;18874:6;18854:16;:26;;18846:68;;;;-1:-1:-1;;;18846:68:0;;22036:2:1;18846:68:0;;;22018:21:1;22075:2;22055:18;;;22048:30;22114:31;22094:18;;;22087:59;22163:18;;18846:68:0;21834:353:1;18846:68:0;18958:51;18967:5;18974:7;19002:6;18983:16;:25;18958:8;:51::i;:::-;18714:329;18624:419;;;:::o;14900:806::-;-1:-1:-1;;;;;14997:18:0;;14989:68;;;;-1:-1:-1;;;14989:68:0;;22394:2:1;14989:68:0;;;22376:21:1;22433:2;22413:18;;;22406:30;22472:34;22452:18;;;22445:62;-1:-1:-1;;;22523:18:1;;;22516:35;22568:19;;14989:68:0;22192:401:1;14989:68:0;-1:-1:-1;;;;;15076:16:0;;15068:64;;;;-1:-1:-1;;;15068:64:0;;22800:2:1;15068:64:0;;;22782:21:1;22839:2;22819:18;;;22812:30;22878:34;22858:18;;;22851:62;-1:-1:-1;;;22929:18:1;;;22922:33;22972:19;;15068:64:0;22598:399:1;15068:64:0;-1:-1:-1;;;;;15218:15:0;;15196:19;15218:15;;;:9;:15;;;;;;15252:21;;;;15244:72;;;;-1:-1:-1;;;15244:72:0;;23204:2:1;15244:72:0;;;23186:21:1;23243:2;23223:18;;;23216:30;23282:34;23262:18;;;23255:62;-1:-1:-1;;;23333:18:1;;;23326:36;23379:19;;15244:72:0;23002:402:1;15244:72:0;-1:-1:-1;;;;;15352:15:0;;;;;;;:9;:15;;;;;;15370:20;;;15352:38;;15570:13;;;;;;;;;;:23;;;;;;15622:26;;;;;;15384:6;3564:25:1;;3552:2;3537:18;;3418:177;15622:26:0;;;;;;;;15661:37;16874:675;15993:548;-1:-1:-1;;;;;16077:21:0;;16069:65;;;;-1:-1:-1;;;16069:65:0;;23611:2:1;16069:65:0;;;23593:21:1;23650:2;23630:18;;;23623:30;23689:33;23669:18;;;23662:61;23740:18;;16069:65:0;23409:355:1;16069:65:0;16225:6;16209:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;16380:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;16435:37;3564:25:1;;;16435:37:0;;3537:18:1;16435:37:0;;;;;;;63871:212;63810:273;:::o;16874:675::-;-1:-1:-1;;;;;16958:21:0;;16950:67;;;;-1:-1:-1;;;16950:67:0;;23971:2:1;16950:67:0;;;23953:21:1;24010:2;23990:18;;;23983:30;24049:34;24029:18;;;24022:62;-1:-1:-1;;;24100:18:1;;;24093:31;24141:19;;16950:67:0;23769:397:1;16950:67:0;-1:-1:-1;;;;;17117:18:0;;17092:22;17117:18;;;:9;:18;;;;;;17154:24;;;;17146:71;;;;-1:-1:-1;;;17146:71:0;;24373:2:1;17146:71:0;;;24355:21:1;24412:2;24392:18;;;24385:30;24451:34;24431:18;;;24424:62;-1:-1:-1;;;24502:18:1;;;24495:32;24544:19;;17146:71:0;24171:398:1;17146:71:0;-1:-1:-1;;;;;17253:18:0;;;;;;:9;:18;;;;;;;;17274:23;;;17253:44;;17392:12;:22;;;;;;;17443:37;3564:25:1;;;17253:18:0;;;17443:37;;3537:18:1;17443:37:0;3418:177:1;17493:48:0;16939:610;16874:675;;:::o;49359:553::-;49582:32;;;49553:26;49582:32;;;:19;:32;;;;;49553:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49633:13;:20;49657:1;49633:25;;49625:86;;;;-1:-1:-1;;;49625:86:0;;24776:2:1;49625:86:0;;;24758:21:1;24815:2;24795:18;;;24788:30;24854:34;24834:18;;;24827:62;-1:-1:-1;;;24905:18:1;;;24898:46;24961:19;;49625:86:0;24574:412:1;49625:86:0;49722:47;49740:11;49753:8;:15;49722:17;:47::i;:::-;49780:124;;-1:-1:-1;;;49780:124:0;;-1:-1:-1;;;;;49780:10:0;:15;;;;49803:10;;49780:124;;49815:11;;49828:13;;49843:8;;49853:14;;49869:18;;49889:14;;49780:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49542:370;49359:553;;;;;;:::o;63446:225::-;63559:17;63578:11;63604:8;63593:36;;;;;;;;;;;;:::i;:::-;63558:71;;;;63639:24;63645:9;63656:6;63639:5;:24::i;3496:191::-;3570:16;3589:6;;-1:-1:-1;;;;;3606:17:0;;;-1:-1:-1;;;;;;3606:17:0;;;;;;3639:40;;3589:6;;;;;;;3639:40;;3570:16;3639:40;3559:128;3496:191;:::o;37350:2779::-;37491:12;37545:7;37529:12;37545:7;37539:2;37529:12;:::i;:::-;:23;;37521:50;;;;-1:-1:-1;;;37521:50:0;;26363:2:1;37521:50:0;;;26345:21:1;26402:2;26382:18;;;26375:30;-1:-1:-1;;;26421:18:1;;;26414:44;26475:18;;37521:50:0;26161:338:1;37521:50:0;37607:16;37616:7;37607:6;:16;:::i;:::-;37590:6;:13;:33;;37582:63;;;;-1:-1:-1;;;37582:63:0;;26706:2:1;37582:63:0;;;26688:21:1;26745:2;26725:18;;;26718:30;-1:-1:-1;;;26764:18:1;;;26757:47;26821:18;;37582:63:0;26504:341:1;37582:63:0;37658:22;37724:15;;37753:1933;;;;39830:4;39824:11;39811:24;;40011:1;40000:9;39993:20;40061:4;40050:9;40046:20;40040:4;40033:34;37717:2365;;37753:1933;37930:4;37924:11;37911:24;;38567:2;38558:7;38554:16;38939:9;38932:17;38926:4;38922:28;38910:9;38899;38895:25;38891:60;38988:7;38984:2;38980:16;39237:6;39223:9;39216:17;39210:4;39206:28;39194:9;39186:6;39182:22;39178:57;39174:70;39016:426;39271:3;39267:2;39264:11;39016:426;;;39413:9;;39402:21;;39313:4;39305:13;;;;39346;39016:426;;;-1:-1:-1;;39462:26:0;;;39666:2;39649:11;-1:-1:-1;;39645:25:0;39639:4;39632:39;-1:-1:-1;37717:2365:0;-1:-1:-1;40112:9:0;37350:2779;-1:-1:-1;;;;37350:2779:0:o;55175:1275::-;55337:4;55343:12;55405:15;55431:13;55455:24;55492:8;55482:19;;-1:-1:-1;;;;;55482:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55482:19:0;;55455:46;;55983:1;55957;55923:9;55917:16;55888:4;55877:9;55873:20;55842:1;55807:7;55781:4;55762:247;55750:259;;56074:16;56063:27;;56119:8;56110:7;56107:21;56104:78;;;56159:8;56148:19;;56104:78;56265:7;56252:11;56245:28;56383:7;56380:1;56373:4;56360:11;56356:22;56341:50;56420:8;;;;-1:-1:-1;55175:1275:0;-1:-1:-1;;;;;;55175:1275:0:o;61057:323::-;61281:8;61271:19;;;;;;61220:14;:27;61235:11;61220:27;;;;;;;;;;;;;;;61248:11;61220:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61220:48:0;;;;;;;;;:70;;;;61306:66;;;;61320:11;;61333;;61261:6;;61354:8;;61364:7;;61306:66;:::i;:::-;;;;;;;;61057:323;;;;;:::o;50627:389::-;50750:35;;;50726:21;50750:35;;;:22;:35;;;;;;50800:21;50796:125;;-1:-1:-1;47653:5:0;50796:125;50955:16;50939:12;:32;;50931:77;;;;-1:-1:-1;;;50931:77:0;;28055:2:1;50931:77:0;;;28037:21:1;;;28074:18;;;28067:30;28133:34;28113:18;;;28106:62;28185:18;;50931:77:0;27853:356:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:1;;-1:-1:-1;;;;;366:30:1;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:171::-;597:20;;-1:-1:-1;;;;;646:30:1;;636:41;;626:69;;691:1;688;681:12;706:862;812:6;820;828;836;844;852;905:3;893:9;884:7;880:23;876:33;873:53;;;922:1;919;912:12;873:53;945:28;963:9;945:28;:::i;:::-;935:38;;1024:2;1013:9;1009:18;996:32;-1:-1:-1;;;;;1088:2:1;1080:6;1077:14;1074:34;;;1104:1;1101;1094:12;1074:34;1143:58;1193:7;1184:6;1173:9;1169:22;1143:58;:::i;:::-;1220:8;;-1:-1:-1;1117:84:1;-1:-1:-1;1117:84:1;;-1:-1:-1;1274:37:1;1307:2;1292:18;;1274:37;:::i;:::-;1264:47;;1364:2;1353:9;1349:18;1336:32;1320:48;;1393:2;1383:8;1380:16;1377:36;;;1409:1;1406;1399:12;1377:36;;1448:60;1500:7;1489:8;1478:9;1474:24;1448:60;:::i;:::-;706:862;;;;-1:-1:-1;706:862:1;;-1:-1:-1;706:862:1;;1527:8;;706:862;-1:-1:-1;;;706:862:1:o;1573:258::-;1645:1;1655:113;1669:6;1666:1;1663:13;1655:113;;;1745:11;;;1739:18;1726:11;;;1719:39;1691:2;1684:10;1655:113;;;1786:6;1783:1;1780:13;1777:48;;;-1:-1:-1;;1821:1:1;1803:16;;1796:27;1573:258::o;1836:::-;1878:3;1916:5;1910:12;1943:6;1938:3;1931:19;1959:63;2015:6;2008:4;2003:3;1999:14;1992:4;1985:5;1981:16;1959:63;:::i;:::-;2076:2;2055:15;-1:-1:-1;;2051:29:1;2042:39;;;;2083:4;2038:50;;1836:258;-1:-1:-1;;1836:258:1:o;2099:220::-;2248:2;2237:9;2230:21;2211:4;2268:45;2309:2;2298:9;2294:18;2286:6;2268:45;:::i;2324:184::-;2382:6;2435:2;2423:9;2414:7;2410:23;2406:32;2403:52;;;2451:1;2448;2441:12;2403:52;2474:28;2492:9;2474:28;:::i;2513:131::-;-1:-1:-1;;;;;2588:31:1;;2578:42;;2568:70;;2634:1;2631;2624:12;2649:315;2717:6;2725;2778:2;2766:9;2757:7;2753:23;2749:32;2746:52;;;2794:1;2791;2784:12;2746:52;2833:9;2820:23;2852:31;2877:5;2852:31;:::i;:::-;2902:5;2954:2;2939:18;;;;2926:32;;-1:-1:-1;;;2649:315:1:o;3161:252::-;3228:6;3236;3289:2;3277:9;3268:7;3264:23;3260:32;3257:52;;;3305:1;3302;3295:12;3257:52;3328:28;3346:9;3328:28;:::i;3600:456::-;3677:6;3685;3693;3746:2;3734:9;3725:7;3721:23;3717:32;3714:52;;;3762:1;3759;3752:12;3714:52;3801:9;3788:23;3820:31;3845:5;3820:31;:::i;:::-;3870:5;-1:-1:-1;3927:2:1;3912:18;;3899:32;3940:33;3899:32;3940:33;:::i;:::-;3600:456;;3992:7;;-1:-1:-1;;;4046:2:1;4031:18;;;;4018:32;;3600:456::o;4250:180::-;4309:6;4362:2;4350:9;4341:7;4337:23;4333:32;4330:52;;;4378:1;4375;4368:12;4330:52;-1:-1:-1;4401:23:1;;4250:180;-1:-1:-1;4250:180:1:o;4435:481::-;4513:6;4521;4529;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4621:28;4639:9;4621:28;:::i;:::-;4611:38;;4700:2;4689:9;4685:18;4672:32;-1:-1:-1;;;;;4719:6:1;4716:30;4713:50;;;4759:1;4756;4749:12;4713:50;4798:58;4848:7;4839:6;4828:9;4824:22;4798:58;:::i;:::-;4435:481;;4875:8;;-1:-1:-1;4772:84:1;;-1:-1:-1;;;;4435:481:1:o;4921:127::-;4982:10;4977:3;4973:20;4970:1;4963:31;5013:4;5010:1;5003:15;5037:4;5034:1;5027:15;5053:275;5124:2;5118:9;5189:2;5170:13;;-1:-1:-1;;5166:27:1;5154:40;;-1:-1:-1;;;;;5209:34:1;;5245:22;;;5206:62;5203:88;;;5271:18;;:::i;:::-;5307:2;5300:22;5053:275;;-1:-1:-1;5053:275:1:o;5333:186::-;5381:4;-1:-1:-1;;;;;5406:6:1;5403:30;5400:56;;;5436:18;;:::i;:::-;-1:-1:-1;5502:2:1;5481:15;-1:-1:-1;;5477:29:1;5508:4;5473:40;;5333:186::o;5524:815::-;5608:6;5616;5624;5677:2;5665:9;5656:7;5652:23;5648:32;5645:52;;;5693:1;5690;5683:12;5645:52;5716:28;5734:9;5716:28;:::i;:::-;5706:38;;5795:2;5784:9;5780:18;5767:32;-1:-1:-1;;;;;5814:6:1;5811:30;5808:50;;;5854:1;5851;5844:12;5808:50;5877:22;;5930:4;5922:13;;5918:27;-1:-1:-1;5908:55:1;;5959:1;5956;5949:12;5908:55;5995:2;5982:16;6020:48;6036:31;6064:2;6036:31;:::i;:::-;6020:48;:::i;:::-;6091:2;6084:5;6077:17;6131:7;6126:2;6121;6117;6113:11;6109:20;6106:33;6103:53;;;6152:1;6149;6142:12;6103:53;6207:2;6202;6198;6194:11;6189:2;6182:5;6178:14;6165:45;6251:1;6246:2;6241;6234:5;6230:14;6226:23;6219:34;6272:5;6262:15;;;;;6296:37;6329:2;6318:9;6314:18;6296:37;:::i;:::-;6286:47;;5524:815;;;;;:::o;6526:247::-;6585:6;6638:2;6626:9;6617:7;6613:23;6609:32;6606:52;;;6654:1;6651;6644:12;6606:52;6693:9;6680:23;6712:31;6737:5;6712:31;:::i;7001:256::-;7067:6;7075;7128:2;7116:9;7107:7;7103:23;7099:32;7096:52;;;7144:1;7141;7134:12;7096:52;7167:28;7185:9;7167:28;:::i;:::-;7157:38;;7214:37;7247:2;7236:9;7232:18;7214:37;:::i;:::-;7204:47;;7001:256;;;;;:::o;7704:622::-;7799:6;7807;7815;7823;7831;7884:3;7872:9;7863:7;7859:23;7855:33;7852:53;;;7901:1;7898;7891:12;7852:53;7924:28;7942:9;7924:28;:::i;:::-;7914:38;;7971:37;8004:2;7993:9;7989:18;7971:37;:::i;:::-;7961:47;;8055:2;8044:9;8040:18;8027:32;8017:42;;8110:2;8099:9;8095:18;8082:32;-1:-1:-1;;;;;8129:6:1;8126:30;8123:50;;;8169:1;8166;8159:12;8123:50;8208:58;8258:7;8249:6;8238:9;8234:22;8208:58;:::i;:::-;7704:622;;;;-1:-1:-1;7704:622:1;;-1:-1:-1;8285:8:1;;8182:84;7704:622;-1:-1:-1;;;7704:622:1:o;8331:388::-;8399:6;8407;8460:2;8448:9;8439:7;8435:23;8431:32;8428:52;;;8476:1;8473;8466:12;8428:52;8515:9;8502:23;8534:31;8559:5;8534:31;:::i;:::-;8584:5;-1:-1:-1;8641:2:1;8626:18;;8613:32;8654:33;8613:32;8654:33;:::i;:::-;8706:7;8696:17;;;8331:388;;;;;:::o;8724:324::-;8799:6;8807;8815;8868:2;8856:9;8847:7;8843:23;8839:32;8836:52;;;8884:1;8881;8874:12;8836:52;8907:28;8925:9;8907:28;:::i;:::-;8897:38;;8954:37;8987:2;8976:9;8972:18;8954:37;:::i;:::-;8944:47;;9038:2;9027:9;9023:18;9010:32;9000:42;;8724:324;;;;;:::o;9053:460::-;9137:6;9145;9153;9161;9214:3;9202:9;9193:7;9189:23;9185:33;9182:53;;;9231:1;9228;9221:12;9182:53;9254:28;9272:9;9254:28;:::i;:::-;9244:38;;9301:37;9334:2;9323:9;9319:18;9301:37;:::i;:::-;9291:47;;9388:2;9377:9;9373:18;9360:32;9401:31;9426:5;9401:31;:::i;:::-;9053:460;;;;-1:-1:-1;9451:5:1;;9503:2;9488:18;9475:32;;-1:-1:-1;;9053:460:1:o;9877:380::-;9956:1;9952:12;;;;9999;;;10020:61;;10074:4;10066:6;10062:17;10052:27;;10020:61;10127:2;10119:6;10116:14;10096:18;10093:38;10090:161;;;10173:10;10168:3;10164:20;10161:1;10154:31;10208:4;10205:1;10198:15;10236:4;10233:1;10226:15;10090:161;;9877:380;;;:::o;10262:271::-;10445:6;10437;10432:3;10419:33;10401:3;10471:16;;10496:13;;;10471:16;10262:271;-1:-1:-1;10262:271:1:o;11138:127::-;11199:10;11194:3;11190:20;11187:1;11180:31;11230:4;11227:1;11220:15;11254:4;11251:1;11244:15;11270:422;11359:1;11402:5;11359:1;11416:270;11437:7;11427:8;11424:21;11416:270;;;11496:4;11492:1;11488:6;11484:17;11478:4;11475:27;11472:53;;;11505:18;;:::i;:::-;11555:7;11545:8;11541:22;11538:55;;;11575:16;;;;11538:55;11654:22;;;;11614:15;;;;11416:270;;;11420:3;11270:422;;;;;:::o;11697:806::-;11746:5;11776:8;11766:80;;-1:-1:-1;11817:1:1;11831:5;;11766:80;11865:4;11855:76;;-1:-1:-1;11902:1:1;11916:5;;11855:76;11947:4;11965:1;11960:59;;;;12033:1;12028:130;;;;11940:218;;11960:59;11990:1;11981:10;;12004:5;;;12028:130;12065:3;12055:8;12052:17;12049:43;;;12072:18;;:::i;:::-;-1:-1:-1;;12128:1:1;12114:16;;12143:5;;11940:218;;12242:2;12232:8;12229:16;12223:3;12217:4;12214:13;12210:36;12204:2;12194:8;12191:16;12186:2;12180:4;12177:12;12173:35;12170:77;12167:159;;;-1:-1:-1;12279:19:1;;;12311:5;;12167:159;12358:34;12383:8;12377:4;12358:34;:::i;:::-;12428:6;12424:1;12420:6;12416:19;12407:7;12404:32;12401:58;;;12439:18;;:::i;:::-;12477:20;;11697:806;-1:-1:-1;;;11697:806:1:o;12508:140::-;12566:5;12595:47;12636:4;12626:8;12622:19;12616:4;12595:47;:::i;12653:168::-;12693:7;12759:1;12755;12751:6;12747:14;12744:1;12741:21;12736:1;12729:9;12722:17;12718:45;12715:71;;;12766:18;;:::i;:::-;-1:-1:-1;12806:9:1;;12653:168::o;12826:128::-;12866:3;12897:1;12893:6;12890:1;12887:13;12884:39;;;12903:18;;:::i;:::-;-1:-1:-1;12939:9:1;;12826:128::o;13238:125::-;13278:4;13306:1;13303;13300:8;13297:34;;;13311:18;;:::i;:::-;-1:-1:-1;13348:9:1;;13238:125::o;13578:266::-;13666:6;13661:3;13654:19;13718:6;13711:5;13704:4;13699:3;13695:14;13682:43;-1:-1:-1;13770:1:1;13745:16;;;13763:4;13741:27;;;13734:38;;;;13826:2;13805:15;;;-1:-1:-1;;13801:29:1;13792:39;;;13788:50;;13578:266::o;13849:326::-;14044:6;14036;14032:19;14021:9;14014:38;14088:2;14083;14072:9;14068:18;14061:30;13995:4;14108:61;14165:2;14154:9;14150:18;14142:6;14134;14108:61;:::i;15689:382::-;15900:6;15892;15887:3;15874:33;15992:2;15988:15;;;;-1:-1:-1;;15984:53:1;15926:16;;15973:65;;;16062:2;16054:11;;15689:382;-1:-1:-1;15689:382:1:o;16076:498::-;16276:4;16305:6;16350:2;16342:6;16338:15;16327:9;16320:34;16402:2;16394:6;16390:15;16385:2;16374:9;16370:18;16363:43;;16442:6;16437:2;16426:9;16422:18;16415:34;16485:3;16480:2;16469:9;16465:18;16458:31;16506:62;16563:3;16552:9;16548:19;16540:6;16532;16506:62;:::i;:::-;16498:70;16076:498;-1:-1:-1;;;;;;;16076:498:1:o;17385:493::-;17634:6;17626;17622:19;17611:9;17604:38;17678:3;17673:2;17662:9;17658:18;17651:31;17585:4;17699:62;17756:3;17745:9;17741:19;17733:6;17725;17699:62;:::i;:::-;-1:-1:-1;;;;;17797:31:1;;;;17792:2;17777:18;;17770:59;-1:-1:-1;17860:2:1;17845:18;17838:34;17691:70;17385:493;-1:-1:-1;;;17385:493:1:o;19464:634::-;19543:6;19596:2;19584:9;19575:7;19571:23;19567:32;19564:52;;;19612:1;19609;19602:12;19564:52;19645:9;19639:16;-1:-1:-1;;;;;19670:6:1;19667:30;19664:50;;;19710:1;19707;19700:12;19664:50;19733:22;;19786:4;19778:13;;19774:27;-1:-1:-1;19764:55:1;;19815:1;19812;19805:12;19764:55;19844:2;19838:9;19869:48;19885:31;19913:2;19885:31;:::i;19869:48::-;19940:2;19933:5;19926:17;19980:7;19975:2;19970;19966;19962:11;19958:20;19955:33;19952:53;;;20001:1;19998;19991:12;19952:53;20014:54;20065:2;20060;20053:5;20049:14;20044:2;20040;20036:11;20014:54;:::i;20103:557::-;20360:6;20352;20348:19;20337:9;20330:38;20404:3;20399:2;20388:9;20384:18;20377:31;20311:4;20431:46;20472:3;20461:9;20457:19;20449:6;20431:46;:::i;:::-;-1:-1:-1;;;;;20517:6:1;20513:31;20508:2;20497:9;20493:18;20486:59;20593:9;20585:6;20581:22;20576:2;20565:9;20561:18;20554:50;20621:33;20647:6;20639;20621:33;:::i;24991:840::-;25340:6;25332;25328:19;25317:9;25310:38;25384:3;25379:2;25368:9;25364:18;25357:31;25291:4;25411:46;25452:3;25441:9;25437:19;25429:6;25411:46;:::i;:::-;25505:9;25497:6;25493:22;25488:2;25477:9;25473:18;25466:50;25539:33;25565:6;25557;25539:33;:::i;:::-;-1:-1:-1;;;;;25646:15:1;;;25641:2;25626:18;;25619:43;25699:15;;25693:3;25678:19;;25671:44;25752:22;;;25599:3;25731:19;;25724:51;25525:47;-1:-1:-1;25792:33:1;25525:47;25810:6;25792:33;:::i;:::-;25784:41;24991:840;-1:-1:-1;;;;;;;;;24991:840:1:o;25836:320::-;25923:6;25931;25984:2;25972:9;25963:7;25959:23;25955:32;25952:52;;;26000:1;25997;25990:12;25952:52;26032:9;26026:16;26051:31;26076:5;26051:31;:::i;:::-;26146:2;26131:18;;;;26125:25;26101:5;;26125:25;;-1:-1:-1;;;25836:320:1:o;26850:274::-;26979:3;27017:6;27011:13;27033:53;27079:6;27074:3;27067:4;27059:6;27055:17;27033:53;:::i;:::-;27102:16;;;;;26850:274;-1:-1:-1;;26850:274:1:o;27129:719::-;27432:6;27424;27420:19;27409:9;27402:38;27476:3;27471:2;27460:9;27456:18;27449:31;27383:4;27503:46;27544:3;27533:9;27529:19;27521:6;27503:46;:::i;:::-;-1:-1:-1;;;;;27589:6:1;27585:31;27580:2;27569:9;27565:18;27558:59;27665:9;27657:6;27653:22;27648:2;27637:9;27633:18;27626:50;27699:33;27725:6;27717;27699:33;:::i;:::-;27685:47;;27781:9;27773:6;27769:22;27763:3;27752:9;27748:19;27741:51;27809:33;27835:6;27827;27809:33;:::i;:::-;27801:41;27129:719;-1:-1:-1;;;;;;;;27129:719:1:o
Swarm Source
ipfs://692c5474d33e050624eaddb76eebad3872186aa6993ef01faa5dc871af2c6700
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ARBNOVA | 100.00% | $1,796.5 | 0.0049 | $8.8 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.