Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 122 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Emergency Withdr... | 20726286 | 496 days ago | IN | 0 ETH | 0.0001942 | ||||
| Send From | 20545403 | 522 days ago | IN | 0.00041385 ETH | 0.00023147 | ||||
| Send From | 20545398 | 522 days ago | IN | 0.00041385 ETH | 0.00025908 | ||||
| Send From | 20545392 | 522 days ago | IN | 0.00041385 ETH | 0.00025552 | ||||
| Send From | 20545382 | 522 days ago | IN | 0.00041385 ETH | 0.00034213 | ||||
| Send From | 20545379 | 522 days ago | IN | 0.00041385 ETH | 0.00028683 | ||||
| Send From | 20545346 | 522 days ago | IN | 0.00041385 ETH | 0.00024694 | ||||
| Retry Message | 20462329 | 533 days ago | IN | 0 ETH | 0.00315587 | ||||
| Send From | 20462323 | 533 days ago | IN | 0.01 ETH | 0.00931981 | ||||
| Send From | 20462048 | 533 days ago | IN | 0.01 ETH | 0.00839543 | ||||
| Send From | 20389740 | 543 days ago | IN | 0.00035324 ETH | 0.00097976 | ||||
| Send From | 20389738 | 543 days ago | IN | 0.00035324 ETH | 0.00108586 | ||||
| Send From | 20338582 | 550 days ago | IN | 0.00033458 ETH | 0.00179838 | ||||
| Send From | 20338565 | 550 days ago | IN | 0.00033458 ETH | 0.0019573 | ||||
| Send From | 20338557 | 550 days ago | IN | 0.00033458 ETH | 0.00203268 | ||||
| Send From | 20331771 | 551 days ago | IN | 0.00033458 ETH | 0.00238311 | ||||
| Send From | 20331765 | 551 days ago | IN | 0.00033458 ETH | 0.00247504 | ||||
| Send From | 20331757 | 551 days ago | IN | 0.00033458 ETH | 0.00243447 | ||||
| Send From | 20331737 | 551 days ago | IN | 0.00033458 ETH | 0.00261171 | ||||
| Send From | 20331728 | 551 days ago | IN | 0.00033458 ETH | 0.00308599 | ||||
| Send From | 20331718 | 551 days ago | IN | 0.00033458 ETH | 0.00264335 | ||||
| Send From | 20330503 | 552 days ago | IN | 0.00033458 ETH | 0.00191963 | ||||
| Send From | 20330490 | 552 days ago | IN | 0.00033458 ETH | 0.0017809 | ||||
| Send From | 20330482 | 552 days ago | IN | 0.00033458 ETH | 0.00176575 | ||||
| Send From | 20327692 | 552 days ago | IN | 0.00033458 ETH | 0.00449559 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Send | 20545403 | 522 days ago | 0.00041385 ETH | ||||
| Send | 20545398 | 522 days ago | 0.00041385 ETH | ||||
| Send | 20545392 | 522 days ago | 0.00041385 ETH | ||||
| Send | 20545382 | 522 days ago | 0.00041385 ETH | ||||
| Send | 20545379 | 522 days ago | 0.00041385 ETH | ||||
| Send | 20545346 | 522 days ago | 0.00041385 ETH | ||||
| Send | 20462323 | 533 days ago | 0.01 ETH | ||||
| Send | 20462048 | 533 days ago | 0.01 ETH | ||||
| Send | 20389740 | 543 days ago | 0.00035324 ETH | ||||
| Send | 20389738 | 543 days ago | 0.00035324 ETH | ||||
| Send | 20338582 | 550 days ago | 0.00033458 ETH | ||||
| Send | 20338565 | 550 days ago | 0.00033458 ETH | ||||
| Send | 20338557 | 550 days ago | 0.00033458 ETH | ||||
| Send | 20331771 | 551 days ago | 0.00033458 ETH | ||||
| Send | 20331765 | 551 days ago | 0.00033458 ETH | ||||
| Send | 20331757 | 551 days ago | 0.00033458 ETH | ||||
| Send | 20331737 | 551 days ago | 0.00033458 ETH | ||||
| Send | 20331728 | 551 days ago | 0.00033458 ETH | ||||
| Send | 20331718 | 551 days ago | 0.00033458 ETH | ||||
| Send | 20330503 | 552 days ago | 0.00033458 ETH | ||||
| Send | 20330490 | 552 days ago | 0.00033458 ETH | ||||
| Send | 20330482 | 552 days ago | 0.00033458 ETH | ||||
| Send | 20327692 | 552 days ago | 0.00033458 ETH | ||||
| Send | 20327680 | 552 days ago | 0.00033458 ETH | ||||
| Send | 20327675 | 552 days ago | 0.00033458 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SquidGrowBridge
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-10-11
*/
/**
*Submitted for verification at Etherscan.io on 2023-10-08
*/
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: contracts/token/oft/v1/interfaces/IOFTCore.sol
pragma solidity >=0.5.0;
/**
* @dev Interface of the IOFT core standard
*/
interface IOFTCore is IERC165 {
/**
* @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`)
* _dstChainId - L0 defined chain id to send tokens too
* _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain
* _amount - amount of the tokens to transfer
* _useZro - indicates to use zro to pay L0 fees
* _adapterParam - flexible bytes array to indicate messaging adapter services in L0
*/
function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee);
/**
* @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from`
* `_from` the owner of token
* `_dstChainId` the destination chain identifier
* `_toAddress` can be any size depending on the `dstChainId`.
* `_amount` the quantity of tokens in wei
* `_refundAddress` the address LayerZero refunds if too much message fee is sent
* `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token)
* `_adapterParams` is a flexible bytes array to indicate messaging adapter services
*/
function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
/**
* @dev returns the circulating amount of tokens on current chain
*/
function circulatingSupply() external view returns (uint);
/**
* @dev returns the address of the ERC20 token
*/
function token() external view returns (address);
/**
* @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
* `_nonce` is the outbound nonce
*/
event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount);
/**
* @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain.
* `_nonce` is the inbound nonce.
*/
event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount);
event SetUseCustomAdapterParams(bool _useCustomAdapterParams);
}
// File: contracts/libraries/ExcessivelySafeCall.sol
pragma solidity >=0.7.6;
library ExcessivelySafeCall {
uint 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,
uint _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal returns (bool, bytes memory) {
// set up for assembly call
uint _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,
uint _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal view returns (bool, bytes memory) {
// set up for assembly call
uint _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);
uint _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/libraries/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,
uint _start,
uint _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, uint _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, uint _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, uint _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, uint _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, uint _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, uint _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, uint _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, uint _start) internal pure returns (uint) {
require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
uint tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x20), _start))
}
return tempUint;
}
function toBytes32(bytes memory _bytes, uint _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/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/lzApp/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/lzApp/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: @openzeppelin/contracts/utils/Context.sol
// 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/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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: 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 public constant 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];
require(minGasLimit > 0, "LzApp: minGasLimit not set");
require(providedGasLimit >= minGasLimit + _extraGas, "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 {
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/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/token/oft/v1/OFTCore.sol
pragma solidity ^0.8.0;
abstract contract OFTCore is NonblockingLzApp, ERC165, IOFTCore {
using BytesLib for bytes;
uint public constant NO_EXTRA_GAS = 0;
// packet type
uint16 public constant PT_SEND = 0;
bool public useCustomAdapterParams;
constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IOFTCore).interfaceId || super.supportsInterface(interfaceId);
}
function estimateSendFee(
uint16 _dstChainId,
bytes calldata _toAddress,
uint _amount,
bool _useZro,
bytes calldata _adapterParams
) public view virtual override returns (uint nativeFee, uint zroFee) {
// mock the payload for sendFrom()
bytes memory payload = abi.encode(PT_SEND, _toAddress, _amount);
return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
}
function sendFrom(
address _from,
uint16 _dstChainId,
bytes calldata _toAddress,
uint _amount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams
) public payable virtual override {
_send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams);
}
function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner {
useCustomAdapterParams = _useCustomAdapterParams;
emit SetUseCustomAdapterParams(_useCustomAdapterParams);
}
function _nonblockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload
) internal virtual override {
uint16 packetType;
assembly {
packetType := mload(add(_payload, 32))
}
if (packetType == PT_SEND) {
_sendAck(_srcChainId, _srcAddress, _nonce, _payload);
} else {
revert("OFTCore: unknown packet type");
}
}
function _send(
address _from,
uint16 _dstChainId,
bytes memory _toAddress,
uint _amount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes memory _adapterParams
) internal virtual {
_checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS);
uint amount = _debitFrom(_from, _dstChainId, _toAddress, _amount);
bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, amount);
_lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);
emit SendToChain(_dstChainId, _from, _toAddress, amount);
}
function _sendAck(
uint16 _srcChainId,
bytes memory,
uint64,
bytes memory _payload
) internal virtual {
(, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, uint));
address to = toAddressBytes.toAddress(0);
amount = _creditTo(_srcChainId, to, amount);
emit ReceiveFromChain(_srcChainId, to, amount);
}
function _checkAdapterParams(
uint16 _dstChainId,
uint16 _pkType,
bytes memory _adapterParams,
uint _extraGas
) internal virtual {
if (useCustomAdapterParams) {
_checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas);
} else {
require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty.");
}
}
function _debitFrom(
address _from,
uint16 _dstChainId,
bytes memory _toAddress,
uint _amount
) internal virtual returns (uint);
function _creditTo(
uint16 _srcChainId,
address _toAddress,
uint _amount
) internal virtual returns (uint);
}
// File: contracts/token/oft/v1/ProxyOFT.sol
pragma solidity ^0.8.0;
contract SquidGrowBridge is Ownable, OFTCore {
using SafeERC20 for IERC20;
IERC20 internal immutable innerToken;
/**
* @dev Emitted when the owner emergency withdraws tokens
* @param _address The address of the tokens withdrawn
* @param _amount The amount of tokens withdrawn
*/
event EmergencyWithdraw(address _address, uint256 _amount);
constructor(address _lzEndpoint, address _token) OFTCore(_lzEndpoint) {
innerToken = IERC20(_token);
}
function circulatingSupply() public view virtual override returns (uint) {
unchecked {
return innerToken.totalSupply() - innerToken.balanceOf(address(this));
}
}
function token() public view virtual override returns (address) {
return address(innerToken);
}
function _debitFrom(address _from, uint16, bytes memory, uint _amount) internal virtual override returns (uint) {
require(_from == _msgSender(), "ProxyOFT: owner is not send caller");
uint before = innerToken.balanceOf(address(this));
innerToken.safeTransferFrom(_from, address(this), _amount);
return innerToken.balanceOf(address(this)) - before;
}
function _creditTo(uint16, address _toAddress, uint _amount) internal virtual override returns (uint) {
uint before = innerToken.balanceOf(_toAddress);
innerToken.safeTransfer(_toAddress, _amount);
return innerToken.balanceOf(_toAddress) - before;
}
/**
* @dev Allows the owner of the contract to emergency withdraw any ERC20 tokens held by the contract.
* @param token The address of the ERC20 token to withdraw.
* @dev Transfers the entire balance of the specified token held by the contract to the owner's address.
* @dev Reverts if the caller is not the owner of the contract.
* @dev Reverts if the token transfer from the contract fails.
*/
function emergencyWithdraw(address token) external onlyOwner {
IERC20(token).safeTransfer(msg.sender, IERC20(token).balanceOf(address(this)));
emit EmergencyWithdraw(token, IERC20(token).balanceOf(address(this)));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","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":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","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":false,"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"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":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","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":"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":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162003538380380620035388339810160408190526200003491620000ce565b818080620000423362000061565b6001600160a01b039081166080529290921660a0525062000106915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000c957600080fd5b919050565b60008060408385031215620000e257600080fd5b620000ed83620000b1565b9150620000fd60208401620000b1565b90509250929050565b60805160a05161339c6200019c600039600081816106d501528181610fe60152818161105b01528181611d7901528181611dfb01528181611e3a015281816123c901528181612443015261248b015260008181610581015281816106fc0152818161098201528181610a2a01528181610aa401528181610c1f015281816112f50152818161172d0152611fea015261339c6000f3fe6080604052600436106102035760003560e01c80638cfd8f5c11610118578063cbed8b9c116100a0578063eb8d72b71161006f578063eb8d72b71461064c578063ed629c5c1461066c578063f2fde38b14610686578063f5ecbdbc146106a6578063fc0c546a146106c657600080fd5b8063cbed8b9c146105d9578063d1deba1f146105f9578063df2a5b3b1461060c578063eab45d9c1461062c57600080fd5b80639f38369a116100e75780639f38369a1461052f578063a6c3d1651461054f578063b353aaa71461056f578063baf3292d146105a3578063c4461834146105c357600080fd5b80638cfd8f5c146104905780638da5cb5b146104c85780639358928b146104fa578063950c8a741461050f57600080fd5b806342d65a8d1161019b5780635b8c41e61161016a5780635b8c41e6146103bf57806366ad5c8a1461040e5780636ff1c9bc1461042e578063715018a61461044e5780637533d7881461046357600080fd5b806342d65a8d1461034f578063447705151461036f5780634c42899a1461038457806351905636146103ac57600080fd5b806310ddb137116101d757806310ddb1371461029f5780632a205e3d146102bf5780633d8b38f6146102f45780633f1f4fa41461031457600080fd5b80621d35671461020857806301ffc9a71461022a57806307e0db171461025f5780630df374831461027f575b600080fd5b34801561021457600080fd5b50610228610223366004612763565b6106f9565b005b34801561023657600080fd5b5061024a6102453660046127f8565b61092a565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061022861027a366004612822565b610961565b34801561028b57600080fd5b5061022861029a36600461283f565b6109ea565b3480156102ab57600080fd5b506102286102ba366004612822565b610a09565b3480156102cb57600080fd5b506102df6102da366004612879565b610a61565b60408051928352602083019190915201610256565b34801561030057600080fd5b5061024a61030f366004612919565b610b34565b34801561032057600080fd5b5061034161032f366004612822565b60036020526000908152604090205481565b604051908152602001610256565b34801561035b57600080fd5b5061022861036a366004612919565b610c00565b34801561037b57600080fd5b50610341600081565b34801561039057600080fd5b50610399600081565b60405161ffff9091168152602001610256565b6102286103ba366004612982565b610c86565b3480156103cb57600080fd5b506103416103da366004612ab8565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561041a57600080fd5b50610228610429366004612763565b610d0b565b34801561043a57600080fd5b50610228610449366004612b5a565b610de7565b34801561045a57600080fd5b50610228610f20565b34801561046f57600080fd5b5061048361047e366004612822565b610f34565b6040516102569190612bc7565b34801561049c57600080fd5b506103416104ab366004612bda565b600260209081526000928352604080842090915290825290205481565b3480156104d457600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610256565b34801561050657600080fd5b50610341610fce565b34801561051b57600080fd5b506004546104e2906001600160a01b031681565b34801561053b57600080fd5b5061048361054a366004612822565b6110e1565b34801561055b57600080fd5b5061022861056a366004612919565b6111f7565b34801561057b57600080fd5b506104e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156105af57600080fd5b506102286105be366004612b5a565b611280565b3480156105cf57600080fd5b5061034161271081565b3480156105e557600080fd5b506102286105f4366004612c13565b6112d6565b610228610607366004612763565b611360565b34801561061857600080fd5b50610228610627366004612c85565b611576565b34801561063857600080fd5b50610228610647366004612cc6565b6115e0565b34801561065857600080fd5b50610228610667366004612919565b611629565b34801561067857600080fd5b5060065461024a9060ff1681565b34801561069257600080fd5b506102286106a1366004612b5a565b611683565b3480156106b257600080fd5b506104836106c1366004612ce3565b6116fc565b3480156106d257600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006104e2565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146107765760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff86166000908152600160205260408120805461079490612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090612d34565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509050805186869050148015610828575060008151115b80156108505750805160208201206040516108469088908890612d6e565b6040518091039020145b6108ab5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b606482015260840161076d565b6109218787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506117af92505050565b50505050505050565b60006001600160e01b03198216630a72677560e11b148061095b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610969611828565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156109cf57600080fd5b505af11580156109e3573d6000803e3d6000fd5b5050505050565b6109f2611828565b61ffff909116600090815260036020526040902055565b610a11611828565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb137906024016109b5565b600080600080898989604051602001610a7d9493929190612da7565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090610ae3908d90309086908c908c908c90600401612dd6565b6040805180830381865afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612e2c565b925092505097509795505050505050565b61ffff831660009081526001602052604081208054829190610b5590612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8190612d34565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b505050505090508383604051610be5929190612d6e565b60405180910390208180519060200120149150509392505050565b610c08611828565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610c5890869086908690600401612e50565b600060405180830381600087803b158015610c7257600080fd5b505af1158015610921573d6000803e3d6000fd5b610d00898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528c93508b92508a918a908a908190840183828082843760009201919091525061188292505050565b505050505050505050565b333014610d695760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b606482015260840161076d565b610ddf8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061192992505050565b505050505050565b610def611828565b6040516370a0823160e01b8152306004820152610e6e9033906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d9190612e6e565b6001600160a01b0384169190611990565b6040516370a0823160e01b81523060048201527f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959082906001600160a01b038216906370a0823190602401602060405180830381865afa158015610ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa9190612e6e565b604080516001600160a01b0390931683526020830191909152015b60405180910390a150565b610f28611828565b610f3260006119f8565b565b60016020526000908152604090208054610f4d90612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7990612d34565b8015610fc65780601f10610f9b57610100808354040283529160200191610fc6565b820191906000526020600020905b815481529060010190602001808311610fa957829003601f168201915b505050505081565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110599190612e6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110db9190612e6e565b03905090565b61ffff811660009081526001602052604081208054606092919061110490612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461113090612d34565b801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b5050505050905080516000036111d55760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000604482015260640161076d565b6111f06000601483516111e89190612e9d565b839190611a48565b9392505050565b6111ff611828565b81813060405160200161121493929190612eb0565b60408051601f1981840301815291815261ffff851660009081526001602052209061123f9082612f1c565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161127393929190612e50565b60405180910390a1505050565b611288611828565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90602001610f15565b6112de611828565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906113329088908890889088908890600401612fdb565b600060405180830381600087803b15801561134c57600080fd5b505af1158015610d00573d6000803e3d6000fd5b61ffff861660009081526005602052604080822090516113839088908890612d6e565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806114035760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b606482015260840161076d565b808383604051611414929190612d6e565b6040518091039020146114735760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b606482015260840161076d565b61ffff871660009081526005602052604080822090516114969089908990612d6e565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f8801829004820283018201905286825261152e918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061192992505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611565959493929190613009565b60405180910390a150505050505050565b61157e611828565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611273565b6115e8611828565b6006805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a490602001610f15565b611631611828565b61ffff8316600090815260016020526040902061164f828483613044565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161127393929190612e50565b61168b611828565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076d565b6116f9816119f8565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa15801561177c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117a49190810190613148565b90505b949350505050565b6000806118125a60966366ad5c8a60e01b898989896040516024016117d7949392919061317c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190611b55565b9150915081610ddf57610ddf8686868685611bdf565b6000546001600160a01b03163314610f325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076d565b611890866000836000611c7c565b600061189e88888888611cfc565b905060008087836040516020016118b7939291906131ba565b60405160208183030381529060405290506118d6888287878734611ec1565b886001600160a01b03168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d089856040516119169291906131e7565b60405180910390a3505050505050505050565b602081015161ffff81166119485761194385858585612066565b6109e3565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b6574207479706500000000604482015260640161076d565b6040516001600160a01b0383166024820152604481018290526119f390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526120f0565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606081611a5681601f613209565b1015611a955760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161076d565b611a9f8284613209565b84511015611ae35760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161076d565b606082158015611b025760405191506000825260208201604052611b4c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b3b578051835260209283019201611b23565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff166001600160401b03811115611b7a57611b7a612a4b565b6040519080825280601f01601f191660200182016040528015611ba4576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115611bc6578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051611c10919061321c565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90611c6d9087908790879087908790613238565b60405180910390a15050505050565b60065460ff1615611c9857611c93848484846121c2565b611cf6565b815115611cf65760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b606482015260840161076d565b50505050565b60006001600160a01b0385163314611d615760405162461bcd60e51b815260206004820152602260248201527f50726f78794f46543a206f776e6572206973206e6f742073656e642063616c6c60448201526132b960f11b606482015260840161076d565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dec9190612e6e565b9050611e236001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016873086612297565b6040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ead9190612e6e565b611eb79190612e9d565b9695505050505050565b61ffff861660009081526001602052604081208054611edf90612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0b90612d34565b8015611f585780601f10611f2d57610100808354040283529160200191611f58565b820191906000526020600020905b815481529060010190602001808311611f3b57829003601f168201915b505050505090508051600003611fc95760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b606482015260840161076d565b611fd48787516122cf565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c580310090849061202b908b9086908c908c908c908c90600401613296565b6000604051808303818588803b15801561204457600080fd5b505af1158015612058573d6000803e3d6000fd5b505050505050505050505050565b6000808280602001905181019061207d91906132f0565b9093509150600090506120908382612340565b905061209d8782846123a5565b9150806001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf846040516120df91815260200190565b60405180910390a350505050505050565b6000612145826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661250b9092919063ffffffff16565b8051909150156119f357808060200190518101906121639190613349565b6119f35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161076d565b60006121cd8361251a565b61ffff8087166000908152600260209081526040808320938916835292905220549091508061223e5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f7420736574000000000000604482015260640161076d565b6122488382613209565b821015610ddf5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f770000000000604482015260640161076d565b6040516001600160a01b0380851660248301528316604482015260648101829052611cf69085906323b872dd60e01b906084016119bc565b61ffff8216600090815260036020526040812054908190036122f057506127105b808211156119f35760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765604482015260640161076d565b600061234d826014613209565b835110156123955760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b604482015260640161076d565b500160200151600160601b900490565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124349190612e6e565b905061246a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611990565b6040516370a0823160e01b81526001600160a01b03858116600483015282917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156124d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f89190612e6e565b6125029190612e9d565b95945050505050565b60606117a78484600085612576565b600060228251101561256e5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d7300000000604482015260640161076d565b506022015190565b6060824710156125d75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161076d565b600080866001600160a01b031685876040516125f3919061321c565b60006040518083038185875af1925050503d8060008114612630576040519150601f19603f3d011682016040523d82523d6000602084013e612635565b606091505b509150915061264687838387612651565b979650505050505050565b606083156126c05782516000036126b9576001600160a01b0385163b6126b95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076d565b50816117a7565b6117a783838151156126d55781518083602001fd5b8060405162461bcd60e51b815260040161076d9190612bc7565b61ffff811681146116f957600080fd5b60008083601f84011261271157600080fd5b5081356001600160401b0381111561272857600080fd5b60208301915083602082850101111561274057600080fd5b9250929050565b80356001600160401b038116811461275e57600080fd5b919050565b6000806000806000806080878903121561277c57600080fd5b8635612787816126ef565b955060208701356001600160401b03808211156127a357600080fd5b6127af8a838b016126ff565b90975095508591506127c360408a01612747565b945060608901359150808211156127d957600080fd5b506127e689828a016126ff565b979a9699509497509295939492505050565b60006020828403121561280a57600080fd5b81356001600160e01b0319811681146111f057600080fd5b60006020828403121561283457600080fd5b81356111f0816126ef565b6000806040838503121561285257600080fd5b823561285d816126ef565b946020939093013593505050565b80151581146116f957600080fd5b600080600080600080600060a0888a03121561289457600080fd5b873561289f816126ef565b965060208801356001600160401b03808211156128bb57600080fd5b6128c78b838c016126ff565b909850965060408a0135955060608a013591506128e38261286b565b909350608089013590808211156128f957600080fd5b506129068a828b016126ff565b989b979a50959850939692959293505050565b60008060006040848603121561292e57600080fd5b8335612939816126ef565b925060208401356001600160401b0381111561295457600080fd5b612960868287016126ff565b9497909650939450505050565b6001600160a01b03811681146116f957600080fd5b600080600080600080600080600060e08a8c0312156129a057600080fd5b89356129ab8161296d565b985060208a01356129bb816126ef565b975060408a01356001600160401b03808211156129d757600080fd5b6129e38d838e016126ff565b909950975060608c0135965060808c013591506129ff8261296d565b90945060a08b013590612a118261296d565b90935060c08b01359080821115612a2757600080fd5b50612a348c828d016126ff565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612a8957612a89612a4b565b604052919050565b60006001600160401b03821115612aaa57612aaa612a4b565b50601f01601f191660200190565b600080600060608486031215612acd57600080fd5b8335612ad8816126ef565b925060208401356001600160401b03811115612af357600080fd5b8401601f81018613612b0457600080fd5b8035612b17612b1282612a91565b612a61565b818152876020838501011115612b2c57600080fd5b81602084016020830137600060208383010152809450505050612b5160408501612747565b90509250925092565b600060208284031215612b6c57600080fd5b81356111f08161296d565b60005b83811015612b92578181015183820152602001612b7a565b50506000910152565b60008151808452612bb3816020860160208601612b77565b601f01601f19169290920160200192915050565b6020815260006111f06020830184612b9b565b60008060408385031215612bed57600080fd5b8235612bf8816126ef565b91506020830135612c08816126ef565b809150509250929050565b600080600080600060808688031215612c2b57600080fd5b8535612c36816126ef565b94506020860135612c46816126ef565b93506040860135925060608601356001600160401b03811115612c6857600080fd5b612c74888289016126ff565b969995985093965092949392505050565b600080600060608486031215612c9a57600080fd5b8335612ca5816126ef565b92506020840135612cb5816126ef565b929592945050506040919091013590565b600060208284031215612cd857600080fd5b81356111f08161286b565b60008060008060808587031215612cf957600080fd5b8435612d04816126ef565b93506020850135612d14816126ef565b92506040850135612d248161296d565b9396929550929360600135925050565b600181811c90821680612d4857607f821691505b602082108103612d6857634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff85168152606060208201526000612dc5606083018587612d7e565b905082604083015295945050505050565b61ffff871681526001600160a01b038616602082015260a060408201819052600090612e0490830187612b9b565b85151560608401528281036080840152612e1f818587612d7e565b9998505050505050505050565b60008060408385031215612e3f57600080fd5b505080516020909101519092909150565b61ffff841681526040602082015260006117a4604083018486612d7e565b600060208284031215612e8057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561095b5761095b612e87565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156119f357600081815260208120601f850160051c81016020861015612efd5750805b601f850160051c820191505b81811015610ddf57828155600101612f09565b81516001600160401b03811115612f3557612f35612a4b565b612f4981612f438454612d34565b84612ed6565b602080601f831160018114612f7e5760008415612f665750858301515b600019600386901b1c1916600185901b178555610ddf565b600085815260208120601f198616915b82811015612fad57888601518255948401946001909101908401612f8e565b5085821015612fcb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff808816835280871660208401525084604083015260806060830152612646608083018486612d7e565b61ffff86168152608060208201526000613027608083018688612d7e565b6001600160401b0394909416604083015250606001529392505050565b6001600160401b0383111561305b5761305b612a4b565b61306f836130698354612d34565b83612ed6565b6000601f8411600181146130a3576000851561308b5750838201355b600019600387901b1c1916600186901b1783556109e3565b600083815260209020601f19861690835b828110156130d457868501358255602094850194600190920191016130b4565b50868210156130f15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600082601f83011261311457600080fd5b8151613122612b1282612a91565b81815284602083860101111561313757600080fd5b6117a7826020830160208701612b77565b60006020828403121561315a57600080fd5b81516001600160401b0381111561317057600080fd5b6117a784828501613103565b61ffff851681526080602082015260006131996080830186612b9b565b6001600160401b038516604084015282810360608401526126468185612b9b565b61ffff841681526060602082015260006131d76060830185612b9b565b9050826040830152949350505050565b6040815260006131fa6040830185612b9b565b90508260208301529392505050565b8082018082111561095b5761095b612e87565b6000825161322e818460208701612b77565b9190910192915050565b61ffff8616815260a06020820152600061325560a0830187612b9b565b6001600160401b038616604084015282810360608401526132768186612b9b565b9050828103608084015261328a8185612b9b565b98975050505050505050565b61ffff8716815260c0602082015260006132b360c0830188612b9b565b82810360408401526132c58188612b9b565b6001600160a01b0387811660608601528616608085015283810360a08501529050612e1f8185612b9b565b60008060006060848603121561330557600080fd5b8351613310816126ef565b60208501519093506001600160401b0381111561332c57600080fd5b61333886828701613103565b925050604084015190509250925092565b60006020828403121561335b57600080fd5b81516111f08161286b56fea2646970667358221220efa00715ba4e51a0f9d8de475c160d93681e413dfb0d8e7200c7bdaf7c49b2ad64736f6c6343000814003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a
Deployed Bytecode
0x6080604052600436106102035760003560e01c80638cfd8f5c11610118578063cbed8b9c116100a0578063eb8d72b71161006f578063eb8d72b71461064c578063ed629c5c1461066c578063f2fde38b14610686578063f5ecbdbc146106a6578063fc0c546a146106c657600080fd5b8063cbed8b9c146105d9578063d1deba1f146105f9578063df2a5b3b1461060c578063eab45d9c1461062c57600080fd5b80639f38369a116100e75780639f38369a1461052f578063a6c3d1651461054f578063b353aaa71461056f578063baf3292d146105a3578063c4461834146105c357600080fd5b80638cfd8f5c146104905780638da5cb5b146104c85780639358928b146104fa578063950c8a741461050f57600080fd5b806342d65a8d1161019b5780635b8c41e61161016a5780635b8c41e6146103bf57806366ad5c8a1461040e5780636ff1c9bc1461042e578063715018a61461044e5780637533d7881461046357600080fd5b806342d65a8d1461034f578063447705151461036f5780634c42899a1461038457806351905636146103ac57600080fd5b806310ddb137116101d757806310ddb1371461029f5780632a205e3d146102bf5780633d8b38f6146102f45780633f1f4fa41461031457600080fd5b80621d35671461020857806301ffc9a71461022a57806307e0db171461025f5780630df374831461027f575b600080fd5b34801561021457600080fd5b50610228610223366004612763565b6106f9565b005b34801561023657600080fd5b5061024a6102453660046127f8565b61092a565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061022861027a366004612822565b610961565b34801561028b57600080fd5b5061022861029a36600461283f565b6109ea565b3480156102ab57600080fd5b506102286102ba366004612822565b610a09565b3480156102cb57600080fd5b506102df6102da366004612879565b610a61565b60408051928352602083019190915201610256565b34801561030057600080fd5b5061024a61030f366004612919565b610b34565b34801561032057600080fd5b5061034161032f366004612822565b60036020526000908152604090205481565b604051908152602001610256565b34801561035b57600080fd5b5061022861036a366004612919565b610c00565b34801561037b57600080fd5b50610341600081565b34801561039057600080fd5b50610399600081565b60405161ffff9091168152602001610256565b6102286103ba366004612982565b610c86565b3480156103cb57600080fd5b506103416103da366004612ab8565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561041a57600080fd5b50610228610429366004612763565b610d0b565b34801561043a57600080fd5b50610228610449366004612b5a565b610de7565b34801561045a57600080fd5b50610228610f20565b34801561046f57600080fd5b5061048361047e366004612822565b610f34565b6040516102569190612bc7565b34801561049c57600080fd5b506103416104ab366004612bda565b600260209081526000928352604080842090915290825290205481565b3480156104d457600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610256565b34801561050657600080fd5b50610341610fce565b34801561051b57600080fd5b506004546104e2906001600160a01b031681565b34801561053b57600080fd5b5061048361054a366004612822565b6110e1565b34801561055b57600080fd5b5061022861056a366004612919565b6111f7565b34801561057b57600080fd5b506104e27f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b3480156105af57600080fd5b506102286105be366004612b5a565b611280565b3480156105cf57600080fd5b5061034161271081565b3480156105e557600080fd5b506102286105f4366004612c13565b6112d6565b610228610607366004612763565b611360565b34801561061857600080fd5b50610228610627366004612c85565b611576565b34801561063857600080fd5b50610228610647366004612cc6565b6115e0565b34801561065857600080fd5b50610228610667366004612919565b611629565b34801561067857600080fd5b5060065461024a9060ff1681565b34801561069257600080fd5b506102286106a1366004612b5a565b611683565b3480156106b257600080fd5b506104836106c1366004612ce3565b6116fc565b3480156106d257600080fd5b507f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a6104e2565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316146107765760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff86166000908152600160205260408120805461079490612d34565b80601f01602080910402602001604051908101604052809291908181526020018280546107c090612d34565b801561080d5780601f106107e25761010080835404028352916020019161080d565b820191906000526020600020905b8154815290600101906020018083116107f057829003601f168201915b50505050509050805186869050148015610828575060008151115b80156108505750805160208201206040516108469088908890612d6e565b6040518091039020145b6108ab5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b606482015260840161076d565b6109218787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506117af92505050565b50505050505050565b60006001600160e01b03198216630a72677560e11b148061095b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b610969611828565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156109cf57600080fd5b505af11580156109e3573d6000803e3d6000fd5b5050505050565b6109f2611828565b61ffff909116600090815260036020526040902055565b610a11611828565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb137906024016109b5565b600080600080898989604051602001610a7d9493929190612da7565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906340a7bb1090610ae3908d90309086908c908c908c90600401612dd6565b6040805180830381865afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190612e2c565b925092505097509795505050505050565b61ffff831660009081526001602052604081208054829190610b5590612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8190612d34565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b505050505090508383604051610be5929190612d6e565b60405180910390208180519060200120149150509392505050565b610c08611828565b6040516342d65a8d60e01b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d90610c5890869086908690600401612e50565b600060405180830381600087803b158015610c7257600080fd5b505af1158015610921573d6000803e3d6000fd5b610d00898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528c93508b92508a918a908a908190840183828082843760009201919091525061188292505050565b505050505050505050565b333014610d695760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b606482015260840161076d565b610ddf8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061192992505050565b505050505050565b610def611828565b6040516370a0823160e01b8152306004820152610e6e9033906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d9190612e6e565b6001600160a01b0384169190611990565b6040516370a0823160e01b81523060048201527f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959082906001600160a01b038216906370a0823190602401602060405180830381865afa158015610ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa9190612e6e565b604080516001600160a01b0390931683526020830191909152015b60405180910390a150565b610f28611828565b610f3260006119f8565b565b60016020526000908152604090208054610f4d90612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7990612d34565b8015610fc65780601f10610f9b57610100808354040283529160200191610fc6565b820191906000526020600020905b815481529060010190602001808311610fa957829003601f168201915b505050505081565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a6001600160a01b0316906370a0823190602401602060405180830381865afa158015611035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110599190612e6e565b7f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110db9190612e6e565b03905090565b61ffff811660009081526001602052604081208054606092919061110490612d34565b80601f016020809104026020016040519081016040528092919081815260200182805461113090612d34565b801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b5050505050905080516000036111d55760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000604482015260640161076d565b6111f06000601483516111e89190612e9d565b839190611a48565b9392505050565b6111ff611828565b81813060405160200161121493929190612eb0565b60408051601f1981840301815291815261ffff851660009081526001602052209061123f9082612f1c565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161127393929190612e50565b60405180910390a1505050565b611288611828565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90602001610f15565b6112de611828565b6040516332fb62e760e21b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c906113329088908890889088908890600401612fdb565b600060405180830381600087803b15801561134c57600080fd5b505af1158015610d00573d6000803e3d6000fd5b61ffff861660009081526005602052604080822090516113839088908890612d6e565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806114035760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b606482015260840161076d565b808383604051611414929190612d6e565b6040518091039020146114735760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b606482015260840161076d565b61ffff871660009081526005602052604080822090516114969089908990612d6e565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f8801829004820283018201905286825261152e918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061192992505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611565959493929190613009565b60405180910390a150505050505050565b61157e611828565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611273565b6115e8611828565b6006805460ff19168215159081179091556040519081527f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a490602001610f15565b611631611828565b61ffff8316600090815260016020526040902061164f828483613044565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161127393929190612e50565b61168b611828565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076d565b6116f9816119f8565b50565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc90608401600060405180830381865afa15801561177c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117a49190810190613148565b90505b949350505050565b6000806118125a60966366ad5c8a60e01b898989896040516024016117d7949392919061317c565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190611b55565b9150915081610ddf57610ddf8686868685611bdf565b6000546001600160a01b03163314610f325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076d565b611890866000836000611c7c565b600061189e88888888611cfc565b905060008087836040516020016118b7939291906131ba565b60405160208183030381529060405290506118d6888287878734611ec1565b886001600160a01b03168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d089856040516119169291906131e7565b60405180910390a3505050505050505050565b602081015161ffff81166119485761194385858585612066565b6109e3565b60405162461bcd60e51b815260206004820152601c60248201527f4f4654436f72653a20756e6b6e6f776e207061636b6574207479706500000000604482015260640161076d565b6040516001600160a01b0383166024820152604481018290526119f390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526120f0565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606081611a5681601f613209565b1015611a955760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015260640161076d565b611a9f8284613209565b84511015611ae35760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015260640161076d565b606082158015611b025760405191506000825260208201604052611b4c565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611b3b578051835260209283019201611b23565b5050858452601f01601f1916604052505b50949350505050565b6000606060008060008661ffff166001600160401b03811115611b7a57611b7a612a4b565b6040519080825280601f01601f191660200182016040528015611ba4576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115611bc6578692505b828152826000602083013e909890975095505050505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051611c10919061321c565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c90611c6d9087908790879087908790613238565b60405180910390a15050505050565b60065460ff1615611c9857611c93848484846121c2565b611cf6565b815115611cf65760405162461bcd60e51b815260206004820152602660248201527f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060448201526532b6b83a3c9760d11b606482015260840161076d565b50505050565b60006001600160a01b0385163314611d615760405162461bcd60e51b815260206004820152602260248201527f50726f78794f46543a206f776e6572206973206e6f742073656e642063616c6c60448201526132b960f11b606482015260840161076d565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a6001600160a01b0316906370a0823190602401602060405180830381865afa158015611dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dec9190612e6e565b9050611e236001600160a01b037f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a16873086612297565b6040516370a0823160e01b815230600482015281907f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a6001600160a01b0316906370a0823190602401602060405180830381865afa158015611e89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ead9190612e6e565b611eb79190612e9d565b9695505050505050565b61ffff861660009081526001602052604081208054611edf90612d34565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0b90612d34565b8015611f585780601f10611f2d57610100808354040283529160200191611f58565b820191906000526020600020905b815481529060010190602001808311611f3b57829003601f168201915b505050505090508051600003611fc95760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b606482015260840161076d565b611fd48787516122cf565b60405162c5803160e81b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c580310090849061202b908b9086908c908c908c908c90600401613296565b6000604051808303818588803b15801561204457600080fd5b505af1158015612058573d6000803e3d6000fd5b505050505050505050505050565b6000808280602001905181019061207d91906132f0565b9093509150600090506120908382612340565b905061209d8782846123a5565b9150806001600160a01b03168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf846040516120df91815260200190565b60405180910390a350505050505050565b6000612145826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661250b9092919063ffffffff16565b8051909150156119f357808060200190518101906121639190613349565b6119f35760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161076d565b60006121cd8361251a565b61ffff8087166000908152600260209081526040808320938916835292905220549091508061223e5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f7420736574000000000000604482015260640161076d565b6122488382613209565b821015610ddf5760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f770000000000604482015260640161076d565b6040516001600160a01b0380851660248301528316604482015260648101829052611cf69085906323b872dd60e01b906084016119bc565b61ffff8216600090815260036020526040812054908190036122f057506127105b808211156119f35760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765604482015260640161076d565b600061234d826014613209565b835110156123955760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b604482015260640161076d565b500160200151600160601b900490565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182917f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a16906370a0823190602401602060405180830381865afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124349190612e6e565b905061246a6001600160a01b037f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a168585611990565b6040516370a0823160e01b81526001600160a01b03858116600483015282917f000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a909116906370a0823190602401602060405180830381865afa1580156124d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f89190612e6e565b6125029190612e9d565b95945050505050565b60606117a78484600085612576565b600060228251101561256e5760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c69642061646170746572506172616d7300000000604482015260640161076d565b506022015190565b6060824710156125d75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161076d565b600080866001600160a01b031685876040516125f3919061321c565b60006040518083038185875af1925050503d8060008114612630576040519150601f19603f3d011682016040523d82523d6000602084013e612635565b606091505b509150915061264687838387612651565b979650505050505050565b606083156126c05782516000036126b9576001600160a01b0385163b6126b95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161076d565b50816117a7565b6117a783838151156126d55781518083602001fd5b8060405162461bcd60e51b815260040161076d9190612bc7565b61ffff811681146116f957600080fd5b60008083601f84011261271157600080fd5b5081356001600160401b0381111561272857600080fd5b60208301915083602082850101111561274057600080fd5b9250929050565b80356001600160401b038116811461275e57600080fd5b919050565b6000806000806000806080878903121561277c57600080fd5b8635612787816126ef565b955060208701356001600160401b03808211156127a357600080fd5b6127af8a838b016126ff565b90975095508591506127c360408a01612747565b945060608901359150808211156127d957600080fd5b506127e689828a016126ff565b979a9699509497509295939492505050565b60006020828403121561280a57600080fd5b81356001600160e01b0319811681146111f057600080fd5b60006020828403121561283457600080fd5b81356111f0816126ef565b6000806040838503121561285257600080fd5b823561285d816126ef565b946020939093013593505050565b80151581146116f957600080fd5b600080600080600080600060a0888a03121561289457600080fd5b873561289f816126ef565b965060208801356001600160401b03808211156128bb57600080fd5b6128c78b838c016126ff565b909850965060408a0135955060608a013591506128e38261286b565b909350608089013590808211156128f957600080fd5b506129068a828b016126ff565b989b979a50959850939692959293505050565b60008060006040848603121561292e57600080fd5b8335612939816126ef565b925060208401356001600160401b0381111561295457600080fd5b612960868287016126ff565b9497909650939450505050565b6001600160a01b03811681146116f957600080fd5b600080600080600080600080600060e08a8c0312156129a057600080fd5b89356129ab8161296d565b985060208a01356129bb816126ef565b975060408a01356001600160401b03808211156129d757600080fd5b6129e38d838e016126ff565b909950975060608c0135965060808c013591506129ff8261296d565b90945060a08b013590612a118261296d565b90935060c08b01359080821115612a2757600080fd5b50612a348c828d016126ff565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612a8957612a89612a4b565b604052919050565b60006001600160401b03821115612aaa57612aaa612a4b565b50601f01601f191660200190565b600080600060608486031215612acd57600080fd5b8335612ad8816126ef565b925060208401356001600160401b03811115612af357600080fd5b8401601f81018613612b0457600080fd5b8035612b17612b1282612a91565b612a61565b818152876020838501011115612b2c57600080fd5b81602084016020830137600060208383010152809450505050612b5160408501612747565b90509250925092565b600060208284031215612b6c57600080fd5b81356111f08161296d565b60005b83811015612b92578181015183820152602001612b7a565b50506000910152565b60008151808452612bb3816020860160208601612b77565b601f01601f19169290920160200192915050565b6020815260006111f06020830184612b9b565b60008060408385031215612bed57600080fd5b8235612bf8816126ef565b91506020830135612c08816126ef565b809150509250929050565b600080600080600060808688031215612c2b57600080fd5b8535612c36816126ef565b94506020860135612c46816126ef565b93506040860135925060608601356001600160401b03811115612c6857600080fd5b612c74888289016126ff565b969995985093965092949392505050565b600080600060608486031215612c9a57600080fd5b8335612ca5816126ef565b92506020840135612cb5816126ef565b929592945050506040919091013590565b600060208284031215612cd857600080fd5b81356111f08161286b565b60008060008060808587031215612cf957600080fd5b8435612d04816126ef565b93506020850135612d14816126ef565b92506040850135612d248161296d565b9396929550929360600135925050565b600181811c90821680612d4857607f821691505b602082108103612d6857634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff85168152606060208201526000612dc5606083018587612d7e565b905082604083015295945050505050565b61ffff871681526001600160a01b038616602082015260a060408201819052600090612e0490830187612b9b565b85151560608401528281036080840152612e1f818587612d7e565b9998505050505050505050565b60008060408385031215612e3f57600080fd5b505080516020909101519092909150565b61ffff841681526040602082015260006117a4604083018486612d7e565b600060208284031215612e8057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561095b5761095b612e87565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156119f357600081815260208120601f850160051c81016020861015612efd5750805b601f850160051c820191505b81811015610ddf57828155600101612f09565b81516001600160401b03811115612f3557612f35612a4b565b612f4981612f438454612d34565b84612ed6565b602080601f831160018114612f7e5760008415612f665750858301515b600019600386901b1c1916600185901b178555610ddf565b600085815260208120601f198616915b82811015612fad57888601518255948401946001909101908401612f8e565b5085821015612fcb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff808816835280871660208401525084604083015260806060830152612646608083018486612d7e565b61ffff86168152608060208201526000613027608083018688612d7e565b6001600160401b0394909416604083015250606001529392505050565b6001600160401b0383111561305b5761305b612a4b565b61306f836130698354612d34565b83612ed6565b6000601f8411600181146130a3576000851561308b5750838201355b600019600387901b1c1916600186901b1783556109e3565b600083815260209020601f19861690835b828110156130d457868501358255602094850194600190920191016130b4565b50868210156130f15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600082601f83011261311457600080fd5b8151613122612b1282612a91565b81815284602083860101111561313757600080fd5b6117a7826020830160208701612b77565b60006020828403121561315a57600080fd5b81516001600160401b0381111561317057600080fd5b6117a784828501613103565b61ffff851681526080602082015260006131996080830186612b9b565b6001600160401b038516604084015282810360608401526126468185612b9b565b61ffff841681526060602082015260006131d76060830185612b9b565b9050826040830152949350505050565b6040815260006131fa6040830185612b9b565b90508260208301529392505050565b8082018082111561095b5761095b612e87565b6000825161322e818460208701612b77565b9190910192915050565b61ffff8616815260a06020820152600061325560a0830187612b9b565b6001600160401b038616604084015282810360608401526132768186612b9b565b9050828103608084015261328a8185612b9b565b98975050505050505050565b61ffff8716815260c0602082015260006132b360c0830188612b9b565b82810360408401526132c58188612b9b565b6001600160a01b0387811660608601528616608085015283810360a08501529050612e1f8185612b9b565b60008060006060848603121561330557600080fd5b8351613310816126ef565b60208501519093506001600160401b0381111561332c57600080fd5b61333886828701613103565b925050604084015190509250925092565b60006020828403121561335b57600080fd5b81516111f08161286b56fea2646970667358221220efa00715ba4e51a0f9d8de475c160d93681e413dfb0d8e7200c7bdaf7c49b2ad64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [1] : _token (address): 0xd8Fa690304D2B2824D918C0c7376e2823704557A
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [1] : 000000000000000000000000d8fa690304d2b2824d918c0c7376e2823704557a
Deployed Bytecode Sourcemap
75184:2205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61554:842;;;;;;;;;;-1:-1:-1;61554:842:0;;;;;:::i;:::-;;:::i;:::-;;71381:215;;;;;;;;;;-1:-1:-1;71381:215:0;;;;;:::i;:::-;;:::i;:::-;;;2048:14:1;;2041:22;2023:41;;2011:2;1996:18;71381:215:0;;;;;;;;65178:123;;;;;;;;;;-1:-1:-1;65178:123:0;;;;;:::i;:::-;;:::i;67081:142::-;;;;;;;;;;-1:-1:-1;67081:142:0;;;;;:::i;:::-;;:::i;65309:129::-;;;;;;;;;;-1:-1:-1;65309:129:0;;;;;:::i;:::-;;:::i;71604:479::-;;;;;;;;;;-1:-1:-1;71604:479:0;;;;;:::i;:::-;;:::i;:::-;;;;4000:25:1;;;4056:2;4041:18;;4034:34;;;;3973:18;71604:479:0;3826:248:1;67321:250:0;;;;;;;;;;-1:-1:-1;67321:250:0;;;;;:::i;:::-;;:::i;61096:53::-;;;;;;;;;;-1:-1:-1;61096:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4772:25:1;;;4760:2;4745:18;61096:53:0;4626:177:1;65446:178:0;;;;;;;;;;-1:-1:-1;65446:178:0;;;;;:::i;:::-;;:::i;71156:37::-;;;;;;;;;;;;71192:1;71156:37;;71222:34;;;;;;;;;;;;71255:1;71222:34;;;;;4982:6:1;4970:19;;;4952:38;;4940:2;4925:18;71222:34:0;4808:188:1;72091:404:0;;;;;;:::i;:::-;;:::i;68166:85::-;;;;;;;;;;-1:-1:-1;68166:85:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69533:389;;;;;;;;;;-1:-1:-1;69533:389:0;;;;;:::i;:::-;;:::i;77148:238::-;;;;;;;;;;-1:-1:-1;77148:238:0;;;;;:::i;:::-;;:::i;59677:103::-;;;;;;;;;;;;;:::i;60966:51::-;;;;;;;;;;-1:-1:-1;60966:51:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61024:65::-;;;;;;;;;;-1:-1:-1;61024:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;59029:87;;;;;;;;;;-1:-1:-1;59075:7:0;59102:6;-1:-1:-1;;;;;59102:6:0;59029:87;;;-1:-1:-1;;;;;9718:32:1;;;9700:51;;9688:2;9673:18;59029:87:0;9554:203:1;75702:197:0;;;;;;;;;;;;;:::i;61156:23::-;;;;;;;;;;-1:-1:-1;61156:23:0;;;;-1:-1:-1;;;;;61156:23:0;;;66275:330;;;;;;;;;;-1:-1:-1;66275:330:0;;;;;:::i;:::-;;:::i;65986:281::-;;;;;;;;;;-1:-1:-1;65986:281:0;;;;;:::i;:::-;;:::i;60913:46::-;;;;;;;;;;;;;;;66613:136;;;;;;;;;;-1:-1:-1;66613:136:0;;;;;:::i;:::-;;:::i;60849:55::-;;;;;;;;;;;;60899:5;60849:55;;64923:247;;;;;;;;;;-1:-1:-1;64923:247:0;;;;;:::i;:::-;;:::i;70151:810::-;;;;;;:::i;:::-;;:::i;66757:262::-;;;;;;;;;;-1:-1:-1;66757:262:0;;;;;:::i;:::-;;:::i;72503:223::-;;;;;;;;;;-1:-1:-1;72503:223:0;;;;;:::i;:::-;;:::i;65771:207::-;;;;;;;;;;-1:-1:-1;65771:207:0;;;;;:::i;:::-;;:::i;71265:34::-;;;;;;;;;;-1:-1:-1;71265:34:0;;;;;;;;59935:201;;;;;;;;;;-1:-1:-1;59935:201:0;;;;;:::i;:::-;;:::i;64607:254::-;;;;;;;;;;-1:-1:-1;64607:254:0;;;;;:::i;:::-;;:::i;75907:109::-;;;;;;;;;;-1:-1:-1;75997:10:0;75907:109;;61554:842;57660:10;61837;-1:-1:-1;;;;;61813:35:0;;61805:78;;;;-1:-1:-1;;;61805:78:0;;12256:2:1;61805:78:0;;;12238:21:1;12295:2;12275:18;;;12268:30;12334:32;12314:18;;;12307:60;12384:18;;61805:78:0;;;;;;;;;61925:32;;;61896:26;61925:32;;;:19;:32;;;;;61896:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62145:13;:20;62123:11;;:18;;:42;:70;;;;;62192:1;62169:13;:20;:24;62123:70;:124;;;;-1:-1:-1;62223:24:0;;;;;;62197:22;;;;62207:11;;;;62197:22;:::i;:::-;;;;;;;;:50;62123:124;62101:212;;;;-1:-1:-1;;;62101:212:0;;13276:2:1;62101:212:0;;;13258:21:1;13315:2;13295:18;;;13288:30;13354:34;13334:18;;;13327:62;-1:-1:-1;;;13405:18:1;;;13398:36;13451:19;;62101:212:0;13074:402:1;62101:212:0;62326:62;62345:11;62358;;62326:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62326:62:0;;;;;;;;;;;;;;;;;;;;;;62371:6;;-1:-1:-1;62326:62:0;-1:-1:-1;62379:8:0;;;;;;62326:62;;62379:8;;;;62326:62;;;;;;;;;-1:-1:-1;62326:18:0;;-1:-1:-1;;;62326:62:0:i;:::-;61728:668;61554:842;;;;;;:::o;71381:215::-;71483:4;-1:-1:-1;;;;;;71507:41:0;;-1:-1:-1;;;71507:41:0;;:81;;-1:-1:-1;;;;;;;;;;21061:40:0;;;71552:36;71500:88;71381:215;-1:-1:-1;;71381:215:0:o;65178:123::-;58915:13;:11;:13::i;:::-;65258:35:::1;::::0;-1:-1:-1;;;65258:35:0;;4982:6:1;4970:19;;65258:35:0::1;::::0;::::1;4952:38:1::0;65258:10:0::1;-1:-1:-1::0;;;;;65258:25:0::1;::::0;::::1;::::0;4925:18:1;;65258:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65178:123:::0;:::o;67081:142::-;58915:13;:11;:13::i;:::-;67172:35:::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;67081:142::o;65309:129::-;58915:13;:11;:13::i;:::-;65392:38:::1;::::0;-1:-1:-1;;;65392:38:0;;4982:6:1;4970:19;;65392:38:0::1;::::0;::::1;4952::1::0;65392:10:0::1;-1:-1:-1::0;;;;;65392:28:0::1;::::0;::::1;::::0;4925:18:1;;65392:38:0::1;4808:188:1::0;71604:479:0;71825:14;71841:11;71909:20;71255:1;71952:10;;71964:7;71932:40;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;71932:40:0;;;;;;;;;;-1:-1:-1;;;71990:85:0;;71932:40;-1:-1:-1;;;;;;71990:10:0;:23;;;;:85;;72014:11;;72035:4;;71932:40;;72051:7;;72060:14;;;;71990:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71983:92;;;;;71604:479;;;;;;;;;;:::o;67321:250::-;67463:32;;;67417:4;67463:32;;;:19;:32;;;;;67434:61;;67417:4;;67463:32;67434:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67551:11;;67541:22;;;;;;;:::i;:::-;;;;;;;;67523:13;67513:24;;;;;;:50;67506:57;;;67321:250;;;;;:::o;65446:178::-;58915:13;:11;:13::i;:::-;65561:55:::1;::::0;-1:-1:-1;;;65561:55:0;;-1:-1:-1;;;;;65561:10:0::1;:29;::::0;::::1;::::0;:55:::1;::::0;65591:11;;65604;;;;65561:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;72091:404:::0;72389:98;72395:5;72402:11;72415:10;;72389:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72389:98:0;;;;;;;;;;;;;;;;;;;;;;72427:7;;-1:-1:-1;72436:14:0;;-1:-1:-1;72452:18:0;;72472:14;;;;;;72389:98;;72472:14;;;;72389:98;;;;;;;;;-1:-1:-1;72389:5:0;;-1:-1:-1;;;72389:98:0:i;:::-;72091:404;;;;;;;;;:::o;69533:389::-;57660:10;69790:4;69766:29;69758:80;;;;-1:-1:-1;;;69758:80:0;;15609:2:1;69758:80:0;;;15591:21:1;15648:2;15628:18;;;15621:30;15687:34;15667:18;;;15660:62;-1:-1:-1;;;15738:18:1;;;15731:36;15784:19;;69758:80:0;15407:402:1;69758:80:0;69849:65;69871:11;69884;;69849:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69849:65:0;;;;;;;;;;;;;;;;;;;;;;69897:6;;-1:-1:-1;69849:65:0;-1:-1:-1;69905:8:0;;;;;;69849:65;;69905:8;;;;69849:65;;;;;;;;;-1:-1:-1;69849:21:0;;-1:-1:-1;;;69849:65:0:i;:::-;69533:389;;;;;;:::o;77148:238::-;58915:13;:11;:13::i;:::-;77259:38:::1;::::0;-1:-1:-1;;;77259:38:0;;77291:4:::1;77259:38;::::0;::::1;9700:51:1::0;77220:78:0::1;::::0;77247:10:::1;::::0;-1:-1:-1;;;;;77259:23:0;::::1;::::0;::::1;::::0;9673:18:1;;77259:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;77220:26:0;::::1;::::0;:78;:26:::1;:78::i;:::-;77339:38;::::0;-1:-1:-1;;;77339:38:0;;77371:4:::1;77339:38;::::0;::::1;9700:51:1::0;77314:64:0::1;::::0;77332:5;;-1:-1:-1;;;;;77339:23:0;::::1;::::0;::::1;::::0;9673:18:1;;77339:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77314:64;::::0;;-1:-1:-1;;;;;16195:32:1;;;16177:51;;16259:2;16244:18;;16237:34;;;;16150:18;77314:64:0::1;;;;;;;;77148:238:::0;:::o;59677:103::-;58915:13;:11;:13::i;:::-;59742:30:::1;59769:1;59742:18;:30::i;:::-;59677:103::o:0;60966:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75702:197::-;75845:35;;-1:-1:-1;;;75845:35:0;;75874:4;75845:35;;;9700:51:1;75769:4:0;;75845:10;-1:-1:-1;;;;;75845:20:0;;;;9673:18:1;;75845:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75818:10;-1:-1:-1;;;;;75818:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;75811:69;;75702:197;:::o;66275:330::-;66399:35;;;66379:17;66399:35;;;:19;:35;;;;;66379:55;;66354:12;;66379:17;66399:35;66379:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66453:4;:11;66468:1;66453:16;66445:58;;;;-1:-1:-1;;;66445:58:0;;16484:2:1;66445:58:0;;;16466:21:1;16523:2;16503:18;;;16496:30;16562:31;16542:18;;;16535:59;16611:18;;66445:58:0;16282:353:1;66445:58:0;66521:31;66532:1;66549:2;66535:4;:11;:16;;;;:::i;:::-;66521:4;;:31;:10;:31::i;:::-;66514:38;66275:330;-1:-1:-1;;;66275:330:0:o;65986:281::-;58915:13;:11;:13::i;:::-;66158:14:::1;;66182:4;66141:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;66141:47:0;;::::1;::::0;;;;;;66103:35:::1;::::0;::::1;;::::0;;;:19:::1;66141:47;66103:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;66204:55;66228:14;66244;;66204:55;;;;;;;;:::i;:::-;;;;;;;;65986:281:::0;;;:::o;66613:136::-;58915:13;:11;:13::i;:::-;66683:8:::1;:20:::0;;-1:-1:-1;;;;;;66683:20:0::1;-1:-1:-1::0;;;;;66683:20:0;::::1;::::0;;::::1;::::0;;;66719:22:::1;::::0;9700:51:1;;;66719:22:0::1;::::0;9688:2:1;9673:18;66719:22:0::1;9554:203:1::0;64923:247:0;58915:13;:11;:13::i;:::-;65100:62:::1;::::0;-1:-1:-1;;;65100:62:0;;-1:-1:-1;;;;;65100:10:0::1;:20;::::0;::::1;::::0;:62:::1;::::0;65121:8;;65131;;65141:11;;65154:7;;;;65100:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;70151:810:::0;70405:27;;;70383:19;70405:27;;;:14;:27;;;;;;:40;;;;70433:11;;;;70405:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70405:48:0;;;;;;;;;;;;-1:-1:-1;70405:48:0;70464:73;;;;-1:-1:-1;;;70464:73:0;;20173:2:1;70464:73:0;;;20155:21:1;20212:2;20192:18;;;20185:30;20251:34;20231:18;;;20224:62;-1:-1:-1;;;20302:18:1;;;20295:33;20345:19;;70464:73:0;19971:399:1;70464:73:0;70579:11;70566:8;;70556:19;;;;;;;:::i;:::-;;;;;;;;:34;70548:80;;;;-1:-1:-1;;;70548:80:0;;20577:2:1;70548:80:0;;;20559:21:1;20616:2;20596:18;;;20589:30;20655:34;20635:18;;;20628:62;-1:-1:-1;;;20706:18:1;;;20699:31;20747:19;;70548:80:0;20375:397:1;70548:80:0;70676:27;;;70735:1;70676:27;;;:14;:27;;;;;;:40;;;;70704:11;;;;70676:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;70676:48:0;;;;;;;;;;;;:61;;;;70806:65;;;;;;;;;;;;;;;;;;;70828:11;;70841;;70806:65;;;;;;70841:11;70806:65;;70841:11;70806:65;;;;;;;;;-1:-1:-1;;70806:65:0;;;;;;;;;;;;;;;;;;;;;;70854:6;;-1:-1:-1;70806:65:0;-1:-1:-1;70862:8:0;;;;;;70806:65;;70862:8;;;;70806:65;;;;;;;;;-1:-1:-1;70806:21:0;;-1:-1:-1;;;70806:65:0:i;:::-;70887:66;70907:11;70920;;70933:6;70941:11;70887:66;;;;;;;;;;:::i;:::-;;;;;;;;70327:634;70151:810;;;;;;:::o;66757:262::-;58915:13;:11;:13::i;:::-;66897:28:::1;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;66964:47;;21498:34:1;;;21548:18;;21541:43;;;;21600:18;;;21593:34;;;66964:47:0::1;::::0;21461:2:1;21446:18;66964:47:0::1;21275:358:1::0;72503:223:0;58915:13;:11;:13::i;:::-;72604:22:::1;:48:::0;;-1:-1:-1;;72604:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;72668:50:::1;::::0;2023:41:1;;;72668:50:0::1;::::0;2011:2:1;1996:18;72668:50:0::1;1883:187:1::0;65771:207:0;58915:13;:11;:13::i;:::-;65872:35:::1;::::0;::::1;;::::0;;;:19:::1;:35;::::0;;;;:43:::1;65910:5:::0;;65872:35;:43:::1;:::i;:::-;;65931:39;65948:14;65964:5;;65931:39;;;;;;;;:::i;59935:201::-:0;58915:13;:11;:13::i;:::-;-1:-1:-1;;;;;60024:22:0;::::1;60016:73;;;::::0;-1:-1:-1;;;60016:73:0;;23047:2:1;60016:73:0::1;::::0;::::1;23029:21:1::0;23086:2;23066:18;;;23059:30;23125:34;23105:18;;;23098:62;-1:-1:-1;;;23176:18:1;;;23169:36;23222:19;;60016:73:0::1;22845:402:1::0;60016:73:0::1;60100:28;60119:8;60100:18;:28::i;:::-;59935:201:::0;:::o;64607:254::-;64785:68;;-1:-1:-1;;;64785:68:0;;23489:6:1;23522:15;;;64785:68:0;;;23504:34:1;23574:15;;23554:18;;;23547:43;64834:4:0;23606:18:1;;;23599:60;23675:18;;;23668:34;;;64753:12:0;;64785:10;-1:-1:-1;;;;;64785:20:0;;;;23451:19:1;;64785:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64785:68:0;;;;;;;;;;;;:::i;:::-;64778:75;;64607:254;;;;;;;:::o;68535:607::-;68728:12;68742:19;68765:203;68813:9;68837:3;68878:34;;;68914:11;68927;68940:6;68948:8;68855:102;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68855:102:0;;;;;;;;;;;;;;-1:-1:-1;;;;;68855:102:0;-1:-1:-1;;;;;;68855:102:0;;;;;;;;;;68773:4;;68765:203;;:33;:203::i;:::-;68727:241;;;;69028:7;69023:112;;69052:71;69072:11;69085;69098:6;69106:8;69116:6;69052:19;:71::i;59194:132::-;59075:7;59102:6;-1:-1:-1;;;;;59102:6:0;57660:10;59258:23;59250:68;;;;-1:-1:-1;;;59250:68:0;;25261:2:1;59250:68:0;;;25243:21:1;;;25280:18;;;25273:30;25339:34;25319:18;;;25312:62;25391:18;;59250:68:0;25059:356:1;73234:684:0;73510:71;73530:11;71255:1;73552:14;71192:1;73510:19;:71::i;:::-;73594:11;73608:51;73619:5;73626:11;73639:10;73651:7;73608:10;:51::i;:::-;73594:65;;73672:22;71255:1;73717:10;73729:6;73697:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73672:64;;73747:94;73755:11;73768:9;73779:14;73795:18;73815:14;73831:9;73747:7;:94::i;:::-;73884:5;-1:-1:-1;;;;;73859:51:0;73871:11;73859:51;;;73891:10;73903:6;73859:51;;;;;;;:::i;:::-;;;;;;;;73499:419;;73234:684;;;;;;;:::o;72734:492::-;73015:2;73001:17;;72995:24;73046:21;;;73042:177;;73084:52;73093:11;73106;73119:6;73127:8;73084;:52::i;:::-;73042:177;;;73169:38;;-1:-1:-1;;;73169:38:0;;26290:2:1;73169:38:0;;;26272:21:1;26329:2;26309:18;;;26302:30;26368;26348:18;;;26341:58;26416:18;;73169:38:0;26088:352:1;15457:211:0;15601:58;;-1:-1:-1;;;;;16195:32:1;;15601:58:0;;;16177:51:1;16244:18;;;16237:34;;;15574:86:0;;15594:5;;-1:-1:-1;;;15624:23:0;16150:18:1;;15601:58:0;;;;-1:-1:-1;;15601:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15601:58:0;-1:-1:-1;;;;;;15601:58:0;;;;;;;;;;15574:19;:86::i;:::-;15457:211;;;:::o;60296:191::-;60370:16;60389:6;;-1:-1:-1;;;;;60406:17:0;;;-1:-1:-1;;;;;;60406:17:0;;;;;;60439:40;;60389:6;;;;;;;60439:40;;60370:16;60439:40;60359:128;60296:191;:::o;38724:2833::-;38844:12;38893:7;38877:12;38893:7;38887:2;38877:12;:::i;:::-;:23;;38869:50;;;;-1:-1:-1;;;38869:50:0;;26777:2:1;38869:50:0;;;26759:21:1;26816:2;26796:18;;;26789:30;-1:-1:-1;;;26835:18:1;;;26828:44;26889:18;;38869:50:0;26575:338:1;38869:50:0;38955:16;38964:7;38955:6;:16;:::i;:::-;38938:6;:13;:33;;38930:63;;;;-1:-1:-1;;;38930:63:0;;27120:2:1;38930:63:0;;;27102:21:1;27159:2;27139:18;;;27132:30;-1:-1:-1;;;27178:18:1;;;27171:47;27235:18;;38930:63:0;26918:341:1;38930:63:0;39006:22;39072:15;;39101:2005;;;;41250:4;41244:11;41231:24;;41439:1;41428:9;41421:20;41489:4;41478:9;41474:20;41468:4;41461:34;39065:2445;;39101:2005;39286:4;39280:11;39267:24;;39955:2;39946:7;39942:16;40343:9;40336:17;40330:4;40326:28;40314:9;40303;40299:25;40295:60;40392:7;40388:2;40384:16;40649:6;40635:9;40628:17;40622:4;40618:28;40606:9;40598:6;40594:22;40590:57;40586:70;40420:434;40683:3;40679:2;40676:11;40420:434;;;40825:9;;40814:21;;40725:4;40717:13;;;;40758;40420:434;;;-1:-1:-1;;40874:26:0;;;41086:2;41069:11;-1:-1:-1;;41065:25:0;41059:4;41052:39;-1:-1:-1;39065:2445:0;-1:-1:-1;41540:9:0;38724:2833;-1:-1:-1;;;;38724:2833:0:o;24783:1309::-;24942:4;24948:12;25010;25033:13;25057:24;25094:8;25084:19;;-1:-1:-1;;;;;25084:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25084:19:0;;25057:46;;25613:1;25583;25545:9;25539:16;25506:4;25495:9;25491:20;25456:1;25417:7;25387:4;25364:275;25352:287;;25708:16;25697:27;;25753:8;25744:7;25741:21;25738:78;;;25793:8;25782:19;;25738:78;25903:7;25890:11;25883:28;26025:7;26022:1;26015:4;26002:11;25998:22;25983:50;26062:8;;;;-1:-1:-1;24783:1309:0;-1:-1:-1;;;;;;24783:1309:0:o;69150:375::-;69426:8;69416:19;;;;;;69365:14;:27;69380:11;69365:27;;;;;;;;;;;;;;;69393:11;69365:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69365:48:0;;;;;;;;;:70;;;;69451:66;;;;69465:11;;69478;;69406:6;;69499:8;;69509:7;;69451:66;:::i;:::-;;;;;;;;69150:375;;;;;:::o;74352:416::-;74537:22;;;;74533:228;;;74576:63;74591:11;74604:7;74613:14;74629:9;74576:14;:63::i;:::-;74533:228;;;74680:21;;:26;74672:77;;;;-1:-1:-1;;;74672:77:0;;28479:2:1;74672:77:0;;;28461:21:1;28518:2;28498:18;;;28491:30;28557:34;28537:18;;;28530:62;-1:-1:-1;;;28608:18:1;;;28601:36;28654:19;;74672:77:0;28277:402:1;74672:77:0;74352:416;;;;:::o;76024:390::-;76130:4;-1:-1:-1;;;;;76155:21:0;;57660:10;76155:21;76147:68;;;;-1:-1:-1;;;76147:68:0;;28886:2:1;76147:68:0;;;28868:21:1;28925:2;28905:18;;;28898:30;28964:34;28944:18;;;28937:62;-1:-1:-1;;;29015:18:1;;;29008:32;29057:19;;76147:68:0;28684:398:1;76147:68:0;76240:35;;-1:-1:-1;;;76240:35:0;;76269:4;76240:35;;;9700:51:1;76226:11:0;;76240:10;-1:-1:-1;;;;;76240:20:0;;;;9673:18:1;;76240:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76226:49;-1:-1:-1;76286:58:0;-1:-1:-1;;;;;76286:10:0;:27;76314:5;76329:4;76336:7;76286:27;:58::i;:::-;76362:35;;-1:-1:-1;;;76362:35:0;;76391:4;76362:35;;;9700:51:1;76400:6:0;;76362:10;-1:-1:-1;;;;;76362:20:0;;;;9673:18:1;;76362:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;;:::i;:::-;76355:51;76024:390;-1:-1:-1;;;;;;76024:390:0:o;62728:614::-;63012:32;;;62983:26;63012:32;;;:19;:32;;;;;62983:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63063:13;:20;63087:1;63063:25;63055:86;;;;-1:-1:-1;;;63055:86:0;;29289:2:1;63055:86:0;;;29271:21:1;29328:2;29308:18;;;29301:30;29367:34;29347:18;;;29340:62;-1:-1:-1;;;29418:18:1;;;29411:46;29474:19;;63055:86:0;29087:412:1;63055:86:0;63152:47;63170:11;63183:8;:15;63152:17;:47::i;:::-;63210:124;;-1:-1:-1;;;63210:124:0;;-1:-1:-1;;;;;63210:10:0;:15;;;;63233:10;;63210:124;;63245:11;;63258:13;;63273:8;;63283:14;;63299:18;;63319:14;;63210:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62972:370;62728:614;;;;;;:::o;73926:418::-;74083:27;74112:11;74138:8;74127:43;;;;;;;;;;;;:::i;:::-;74080:90;;-1:-1:-1;74080:90:0;-1:-1:-1;74183:10:0;;-1:-1:-1;74196:27:0;74080:90;74183:10;74196:24;:27::i;:::-;74183:40;;74245:34;74255:11;74268:2;74272:6;74245:9;:34::i;:::-;74236:43;;74325:2;-1:-1:-1;;;;;74295:41:0;74312:11;74295:41;;;74329:6;74295:41;;;;4772:25:1;;4760:2;4745:18;;4626:177;74295:41:0;;;;;;;;74069:275;;;73926:418;;;;:::o;18524:716::-;18948:23;18974:69;19002:4;18974:69;;;;;;;;;;;;;;;;;18982:5;-1:-1:-1;;;;;18974:27:0;;;:69;;;;;:::i;:::-;19058:17;;18948:95;;-1:-1:-1;19058:21:0;19054:179;;19155:10;19144:30;;;;;;;;;;;;:::i;:::-;19136:85;;;;-1:-1:-1;;;19136:85:0;;31325:2:1;19136:85:0;;;31307:21:1;31364:2;31344:18;;;31337:30;31403:34;31383:18;;;31376:62;-1:-1:-1;;;31454:18:1;;;31447:40;31504:19;;19136:85:0;31123:406:1;63350:463:0;63529:21;63553:28;63566:14;63553:12;:28::i;:::-;63611;;;;63592:16;63611:28;;;:15;:28;;;;;;;;:35;;;;;;;;;;63529:52;;-1:-1:-1;63665:15:0;63657:54;;;;-1:-1:-1;;;63657:54:0;;31736:2:1;63657:54:0;;;31718:21:1;31775:2;31755:18;;;31748:30;31814:28;31794:18;;;31787:56;31860:18;;63657:54:0;31534:350:1;63657:54:0;63750:23;63764:9;63750:11;:23;:::i;:::-;63730:16;:43;;63722:83;;;;-1:-1:-1;;;63722:83:0;;32091:2:1;63722:83:0;;;32073:21:1;32130:2;32110:18;;;32103:30;32169:29;32149:18;;;32142:57;32216:18;;63722:83:0;31889:351:1;15676:248:0;15847:68;;-1:-1:-1;;;;;32503:15:1;;;15847:68:0;;;32485:34:1;32555:15;;32535:18;;;32528:43;32587:18;;;32580:34;;;15820:96:0;;15840:5;;-1:-1:-1;;;15870:27:0;32420:18:1;;15847:68:0;32245:375:1;64100:402:0;64223:35;;;64199:21;64223:35;;;:22;:35;;;;;;;64273:21;;;64269:138;;-1:-1:-1;60899:5:0;64269:138;64441:16;64425:12;:32;;64417:77;;;;-1:-1:-1;;;64417:77:0;;32827:2:1;64417:77:0;;;32809:21:1;;;32846:18;;;32839:30;32905:34;32885:18;;;32878:62;32957:18;;64417:77:0;32625:356:1;41565:360:0;41641:7;41686:11;:6;41695:2;41686:11;:::i;:::-;41669:6;:13;:28;;41661:62;;;;-1:-1:-1;;;41661:62:0;;33188:2:1;41661:62:0;;;33170:21:1;33227:2;33207:18;;;33200:30;-1:-1:-1;;;33246:18:1;;;33239:51;33307:18;;41661:62:0;32986:345:1;41661:62:0;-1:-1:-1;41815:30:0;41831:4;41815:30;41809:37;-1:-1:-1;;;41805:71:0;;;41565:360::o;76422:281::-;76549:32;;-1:-1:-1;;;76549:32:0;;-1:-1:-1;;;;;9718:32:1;;;76549::0;;;9700:51:1;76518:4:0;;;;76549:10;:20;;;;9673:18:1;;76549:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76535:46;-1:-1:-1;76592:44:0;-1:-1:-1;;;;;76592:10:0;:23;76616:10;76628:7;76592:23;:44::i;:::-;76654:32;;-1:-1:-1;;;76654:32:0;;-1:-1:-1;;;;;9718:32:1;;;76654::0;;;9700:51:1;76689:6:0;;76654:10;:20;;;;;;9673:18:1;;76654:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;76647:48;76422:281;-1:-1:-1;;;;;76422:281:0:o;4061:229::-;4198:12;4230:52;4252:6;4260:4;4266:1;4269:12;4230:21;:52::i;63821:271::-;63903:13;63962:2;63937:14;:21;:27;;63929:68;;;;-1:-1:-1;;;63929:68:0;;33538:2:1;63929:68:0;;;33520:21:1;33577:2;33557:18;;;33550:30;33616;33596:18;;;33589:58;33664:18;;63929:68:0;33336:352:1;63929:68:0;-1:-1:-1;64070:2:0;64050:23;64044:30;;63821:271::o;5181:455::-;5351:12;5409:5;5384:21;:30;;5376:81;;;;-1:-1:-1;;;5376:81:0;;33895:2:1;5376:81:0;;;33877:21:1;33934:2;33914:18;;;33907:30;33973:34;33953:18;;;33946:62;-1:-1:-1;;;34024:18:1;;;34017:36;34070:19;;5376:81:0;33693:402:1;5376:81:0;5469:12;5483:23;5510:6;-1:-1:-1;;;;;5510:11:0;5529:5;5536:4;5510:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5468:73;;;;5559:69;5586:6;5594:7;5603:10;5615:12;5559:26;:69::i;:::-;5552:76;5181:455;-1:-1:-1;;;;;;;5181:455:0:o;7754:644::-;7939:12;7968:7;7964:427;;;7996:10;:17;8017:1;7996:22;7992:290;;-1:-1:-1;;;;;1599:19:0;;;8206:60;;;;-1:-1:-1;;;8206:60:0;;34302:2:1;8206:60:0;;;34284:21:1;34341:2;34321:18;;;34314:30;34380:31;34360:18;;;34353:59;34429:18;;8206:60:0;34100:353:1;8206:60:0;-1:-1:-1;8303:10:0;8296:17;;7964:427;8346:33;8354:10;8366:12;9101:17;;:21;9097:388;;9333:10;9327:17;9390:15;9377:10;9373:2;9369:19;9362:44;9097:388;9460:12;9453:20;;-1:-1:-1;;;9453:20:0;;;;;;;;:::i;14:117:1:-;99:6;92:5;88:18;81:5;78:29;68:57;;121:1;118;111:12;136:347;187:8;197:6;251:3;244:4;236:6;232:17;228:27;218:55;;269:1;266;259:12;218:55;-1:-1:-1;292:20:1;;-1:-1:-1;;;;;324:30:1;;321:50;;;367:1;364;357:12;321:50;404:4;396:6;392:17;380:29;;456:3;449:4;440:6;432;428:19;424:30;421:39;418:59;;;473:1;470;463:12;418:59;136:347;;;;;:::o;488:171::-;555:20;;-1:-1:-1;;;;;604:30:1;;594:41;;584:69;;649:1;646;639:12;584:69;488:171;;;:::o;664:923::-;770:6;778;786;794;802;810;863:3;851:9;842:7;838:23;834:33;831:53;;;880:1;877;870:12;831:53;919:9;906:23;938:30;962:5;938:30;:::i;:::-;987:5;-1:-1:-1;1043:2:1;1028:18;;1015:32;-1:-1:-1;;;;;1096:14:1;;;1093:34;;;1123:1;1120;1113:12;1093:34;1162:58;1212:7;1203:6;1192:9;1188:22;1162:58;:::i;:::-;1239:8;;-1:-1:-1;1136:84:1;-1:-1:-1;1136:84:1;;-1:-1:-1;1293:37:1;1326:2;1311:18;;1293:37;:::i;:::-;1283:47;;1383:2;1372:9;1368:18;1355:32;1339:48;;1412:2;1402:8;1399:16;1396:36;;;1428:1;1425;1418:12;1396:36;;1467:60;1519:7;1508:8;1497:9;1493:24;1467:60;:::i;:::-;664:923;;;;-1:-1:-1;664:923:1;;-1:-1:-1;664:923:1;;1546:8;;664:923;-1:-1:-1;;;664:923:1:o;1592:286::-;1650:6;1703:2;1691:9;1682:7;1678:23;1674:32;1671:52;;;1719:1;1716;1709:12;1671:52;1745:23;;-1:-1:-1;;;;;;1797:32:1;;1787:43;;1777:71;;1844:1;1841;1834:12;2075:245;2133:6;2186:2;2174:9;2165:7;2161:23;2157:32;2154:52;;;2202:1;2199;2192:12;2154:52;2241:9;2228:23;2260:30;2284:5;2260:30;:::i;2325:313::-;2392:6;2400;2453:2;2441:9;2432:7;2428:23;2424:32;2421:52;;;2469:1;2466;2459:12;2421:52;2508:9;2495:23;2527:30;2551:5;2527:30;:::i;:::-;2576:5;2628:2;2613:18;;;;2600:32;;-1:-1:-1;;;2325:313:1:o;2643:118::-;2729:5;2722:13;2715:21;2708:5;2705:32;2695:60;;2751:1;2748;2741:12;2766:1055;2879:6;2887;2895;2903;2911;2919;2927;2980:3;2968:9;2959:7;2955:23;2951:33;2948:53;;;2997:1;2994;2987:12;2948:53;3036:9;3023:23;3055:30;3079:5;3055:30;:::i;:::-;3104:5;-1:-1:-1;3160:2:1;3145:18;;3132:32;-1:-1:-1;;;;;3213:14:1;;;3210:34;;;3240:1;3237;3230:12;3210:34;3279:58;3329:7;3320:6;3309:9;3305:22;3279:58;:::i;:::-;3356:8;;-1:-1:-1;3253:84:1;-1:-1:-1;3438:2:1;3423:18;;3410:32;;-1:-1:-1;3494:2:1;3479:18;;3466:32;;-1:-1:-1;3507:30:1;3466:32;3507:30;:::i;:::-;3556:7;;-1:-1:-1;3616:3:1;3601:19;;3588:33;;3633:16;;;3630:36;;;3662:1;3659;3652:12;3630:36;;3701:60;3753:7;3742:8;3731:9;3727:24;3701:60;:::i;:::-;2766:1055;;;;-1:-1:-1;2766:1055:1;;-1:-1:-1;2766:1055:1;;;;3675:86;;-1:-1:-1;;;2766:1055:1:o;4079:542::-;4157:6;4165;4173;4226:2;4214:9;4205:7;4201:23;4197:32;4194:52;;;4242:1;4239;4232:12;4194:52;4281:9;4268:23;4300:30;4324:5;4300:30;:::i;:::-;4349:5;-1:-1:-1;4405:2:1;4390:18;;4377:32;-1:-1:-1;;;;;4421:30:1;;4418:50;;;4464:1;4461;4454:12;4418:50;4503:58;4553:7;4544:6;4533:9;4529:22;4503:58;:::i;:::-;4079:542;;4580:8;;-1:-1:-1;4477:84:1;;-1:-1:-1;;;;4079:542:1:o;5001:131::-;-1:-1:-1;;;;;5076:31:1;;5066:42;;5056:70;;5122:1;5119;5112:12;5137:1353;5279:6;5287;5295;5303;5311;5319;5327;5335;5343;5396:3;5384:9;5375:7;5371:23;5367:33;5364:53;;;5413:1;5410;5403:12;5364:53;5452:9;5439:23;5471:31;5496:5;5471:31;:::i;:::-;5521:5;-1:-1:-1;5578:2:1;5563:18;;5550:32;5591;5550;5591;:::i;:::-;5642:7;-1:-1:-1;5700:2:1;5685:18;;5672:32;-1:-1:-1;;;;;5753:14:1;;;5750:34;;;5780:1;5777;5770:12;5750:34;5819:58;5869:7;5860:6;5849:9;5845:22;5819:58;:::i;:::-;5896:8;;-1:-1:-1;5793:84:1;-1:-1:-1;5978:2:1;5963:18;;5950:32;;-1:-1:-1;6034:3:1;6019:19;;6006:33;;-1:-1:-1;6048:33:1;6006;6048;:::i;:::-;6100:7;;-1:-1:-1;6159:3:1;6144:19;;6131:33;;6173;6131;6173;:::i;:::-;6225:7;;-1:-1:-1;6285:3:1;6270:19;;6257:33;;6302:16;;;6299:36;;;6331:1;6328;6321:12;6299:36;;6370:60;6422:7;6411:8;6400:9;6396:24;6370:60;:::i;:::-;6344:86;;6449:8;6439:18;;;6476:8;6466:18;;;5137:1353;;;;;;;;;;;:::o;6495:127::-;6556:10;6551:3;6547:20;6544:1;6537:31;6587:4;6584:1;6577:15;6611:4;6608:1;6601:15;6627:275;6698:2;6692:9;6763:2;6744:13;;-1:-1:-1;;6740:27:1;6728:40;;-1:-1:-1;;;;;6783:34:1;;6819:22;;;6780:62;6777:88;;;6845:18;;:::i;:::-;6881:2;6874:22;6627:275;;-1:-1:-1;6627:275:1:o;6907:186::-;6955:4;-1:-1:-1;;;;;6980:6:1;6977:30;6974:56;;;7010:18;;:::i;:::-;-1:-1:-1;7076:2:1;7055:15;-1:-1:-1;;7051:29:1;7082:4;7047:40;;6907:186::o;7098:876::-;7182:6;7190;7198;7251:2;7239:9;7230:7;7226:23;7222:32;7219:52;;;7267:1;7264;7257:12;7219:52;7306:9;7293:23;7325:30;7349:5;7325:30;:::i;:::-;7374:5;-1:-1:-1;7430:2:1;7415:18;;7402:32;-1:-1:-1;;;;;7446:30:1;;7443:50;;;7489:1;7486;7479:12;7443:50;7512:22;;7565:4;7557:13;;7553:27;-1:-1:-1;7543:55:1;;7594:1;7591;7584:12;7543:55;7630:2;7617:16;7655:48;7671:31;7699:2;7671:31;:::i;:::-;7655:48;:::i;:::-;7726:2;7719:5;7712:17;7766:7;7761:2;7756;7752;7748:11;7744:20;7741:33;7738:53;;;7787:1;7784;7777:12;7738:53;7842:2;7837;7833;7829:11;7824:2;7817:5;7813:14;7800:45;7886:1;7881:2;7876;7869:5;7865:14;7861:23;7854:34;7907:5;7897:15;;;;;7931:37;7964:2;7953:9;7949:18;7931:37;:::i;:::-;7921:47;;7098:876;;;;;:::o;8161:247::-;8220:6;8273:2;8261:9;8252:7;8248:23;8244:32;8241:52;;;8289:1;8286;8279:12;8241:52;8328:9;8315:23;8347:31;8372:5;8347:31;:::i;8413:250::-;8498:1;8508:113;8522:6;8519:1;8516:13;8508:113;;;8598:11;;;8592:18;8579:11;;;8572:39;8544:2;8537:10;8508:113;;;-1:-1:-1;;8655:1:1;8637:16;;8630:27;8413:250::o;8668:270::-;8709:3;8747:5;8741:12;8774:6;8769:3;8762:19;8790:76;8859:6;8852:4;8847:3;8843:14;8836:4;8829:5;8825:16;8790:76;:::i;:::-;8920:2;8899:15;-1:-1:-1;;8895:29:1;8886:39;;;;8927:4;8882:50;;8668:270;-1:-1:-1;;8668:270:1:o;8943:217::-;9090:2;9079:9;9072:21;9053:4;9110:44;9150:2;9139:9;9135:18;9127:6;9110:44;:::i;9165:384::-;9231:6;9239;9292:2;9280:9;9271:7;9267:23;9263:32;9260:52;;;9308:1;9305;9298:12;9260:52;9347:9;9334:23;9366:30;9390:5;9366:30;:::i;:::-;9415:5;-1:-1:-1;9472:2:1;9457:18;;9444:32;9485;9444;9485;:::i;:::-;9536:7;9526:17;;;9165:384;;;;;:::o;9997:750::-;10092:6;10100;10108;10116;10124;10177:3;10165:9;10156:7;10152:23;10148:33;10145:53;;;10194:1;10191;10184:12;10145:53;10233:9;10220:23;10252:30;10276:5;10252:30;:::i;:::-;10301:5;-1:-1:-1;10358:2:1;10343:18;;10330:32;10371;10330;10371;:::i;:::-;10422:7;-1:-1:-1;10476:2:1;10461:18;;10448:32;;-1:-1:-1;10531:2:1;10516:18;;10503:32;-1:-1:-1;;;;;10547:30:1;;10544:50;;;10590:1;10587;10580:12;10544:50;10629:58;10679:7;10670:6;10659:9;10655:22;10629:58;:::i;:::-;9997:750;;;;-1:-1:-1;9997:750:1;;-1:-1:-1;10706:8:1;;10603:84;9997:750;-1:-1:-1;;;9997:750:1:o;10752:452::-;10827:6;10835;10843;10896:2;10884:9;10875:7;10871:23;10867:32;10864:52;;;10912:1;10909;10902:12;10864:52;10951:9;10938:23;10970:30;10994:5;10970:30;:::i;:::-;11019:5;-1:-1:-1;11076:2:1;11061:18;;11048:32;11089;11048;11089;:::i;:::-;10752:452;;11140:7;;-1:-1:-1;;;11194:2:1;11179:18;;;;11166:32;;10752:452::o;11209:241::-;11265:6;11318:2;11306:9;11297:7;11293:23;11289:32;11286:52;;;11334:1;11331;11324:12;11286:52;11373:9;11360:23;11392:28;11414:5;11392:28;:::i;11455:594::-;11539:6;11547;11555;11563;11616:3;11604:9;11595:7;11591:23;11587:33;11584:53;;;11633:1;11630;11623:12;11584:53;11672:9;11659:23;11691:30;11715:5;11691:30;:::i;:::-;11740:5;-1:-1:-1;11797:2:1;11782:18;;11769:32;11810;11769;11810;:::i;:::-;11861:7;-1:-1:-1;11920:2:1;11905:18;;11892:32;11933:33;11892:32;11933:33;:::i;:::-;11455:594;;;;-1:-1:-1;11985:7:1;;12039:2;12024:18;12011:32;;-1:-1:-1;;11455:594:1:o;12413:380::-;12492:1;12488:12;;;;12535;;;12556:61;;12610:4;12602:6;12598:17;12588:27;;12556:61;12663:2;12655:6;12652:14;12632:18;12629:38;12626:161;;12709:10;12704:3;12700:20;12697:1;12690:31;12744:4;12741:1;12734:15;12772:4;12769:1;12762:15;12626:161;;12413:380;;;:::o;12798:271::-;12981:6;12973;12968:3;12955:33;12937:3;13007:16;;13032:13;;;13007:16;12798:271;-1:-1:-1;12798:271:1:o;13481:266::-;13569:6;13564:3;13557:19;13621:6;13614:5;13607:4;13602:3;13598:14;13585:43;-1:-1:-1;13673:1:1;13648:16;;;13666:4;13644:27;;;13637:38;;;;13729:2;13708:15;;;-1:-1:-1;;13704:29:1;13695:39;;;13691:50;;13481:266::o;13752:397::-;13975:6;13967;13963:19;13952:9;13945:38;14019:2;14014;14003:9;13999:18;13992:30;13926:4;14039:61;14096:2;14085:9;14081:18;14073:6;14065;14039:61;:::i;:::-;14031:69;;14136:6;14131:2;14120:9;14116:18;14109:34;13752:397;;;;;;;:::o;14154:667::-;14445:6;14433:19;;14415:38;;-1:-1:-1;;;;;14489:32:1;;14484:2;14469:18;;14462:60;14509:3;14553:2;14538:18;;14531:31;;;-1:-1:-1;;14585:45:1;;14610:19;;14602:6;14585:45;:::i;:::-;14680:6;14673:14;14666:22;14661:2;14650:9;14646:18;14639:50;14738:9;14730:6;14726:22;14720:3;14709:9;14705:19;14698:51;14766:49;14808:6;14800;14792;14766:49;:::i;:::-;14758:57;14154:667;-1:-1:-1;;;;;;;;;14154:667:1:o;14826:245::-;14905:6;14913;14966:2;14954:9;14945:7;14941:23;14937:32;14934:52;;;14982:1;14979;14972:12;14934:52;-1:-1:-1;;15005:16:1;;15061:2;15046:18;;;15040:25;15005:16;;15040:25;;-1:-1:-1;14826:245:1:o;15076:326::-;15271:6;15263;15259:19;15248:9;15241:38;15315:2;15310;15299:9;15295:18;15288:30;15222:4;15335:61;15392:2;15381:9;15377:18;15369:6;15361;15335:61;:::i;15814:184::-;15884:6;15937:2;15925:9;15916:7;15912:23;15908:32;15905:52;;;15953:1;15950;15943:12;15905:52;-1:-1:-1;15976:16:1;;15814:184;-1:-1:-1;15814:184:1:o;16640:127::-;16701:10;16696:3;16692:20;16689:1;16682:31;16732:4;16729:1;16722:15;16756:4;16753:1;16746:15;16772:128;16839:9;;;16860:11;;;16857:37;;;16874:18;;:::i;16905:360::-;17116:6;17108;17103:3;17090:33;17186:2;17182:15;;;;-1:-1:-1;;17178:53:1;17142:16;;17167:65;;;17256:2;17248:11;;16905:360;-1:-1:-1;16905:360:1:o;17395:544::-;17496:2;17491:3;17488:11;17485:448;;;17532:1;17557:5;17553:2;17546:17;17602:4;17598:2;17588:19;17672:2;17660:10;17656:19;17653:1;17649:27;17643:4;17639:38;17708:4;17696:10;17693:20;17690:47;;;-1:-1:-1;17731:4:1;17690:47;17786:2;17781:3;17777:12;17774:1;17770:20;17764:4;17760:31;17750:41;;17841:82;17859:2;17852:5;17849:13;17841:82;;;17904:17;;;17885:1;17874:13;17841:82;;18115:1348;18239:3;18233:10;-1:-1:-1;;;;;18258:6:1;18255:30;18252:56;;;18288:18;;:::i;:::-;18317:96;18406:6;18366:38;18398:4;18392:11;18366:38;:::i;:::-;18360:4;18317:96;:::i;:::-;18468:4;;18532:2;18521:14;;18549:1;18544:662;;;;19250:1;19267:6;19264:89;;;-1:-1:-1;19319:19:1;;;19313:26;19264:89;-1:-1:-1;;18072:1:1;18068:11;;;18064:24;18060:29;18050:40;18096:1;18092:11;;;18047:57;19366:81;;18514:943;;18544:662;17342:1;17335:14;;;17379:4;17366:18;;-1:-1:-1;;18580:20:1;;;18697:236;18711:7;18708:1;18705:14;18697:236;;;18800:19;;;18794:26;18779:42;;18892:27;;;;18860:1;18848:14;;;;18727:19;;18697:236;;;18701:3;18961:6;18952:7;18949:19;18946:201;;;19022:19;;;19016:26;-1:-1:-1;;19105:1:1;19101:14;;;19117:3;19097:24;19093:37;19089:42;19074:58;19059:74;;18946:201;-1:-1:-1;;;;;19193:1:1;19177:14;;;19173:22;19160:36;;-1:-1:-1;18115:1348:1:o;19468:498::-;19668:4;19697:6;19742:2;19734:6;19730:15;19719:9;19712:34;19794:2;19786:6;19782:15;19777:2;19766:9;19762:18;19755:43;;19834:6;19829:2;19818:9;19814:18;19807:34;19877:3;19872:2;19861:9;19857:18;19850:31;19898:62;19955:3;19944:9;19940:19;19932:6;19924;19898:62;:::i;20777:493::-;21026:6;21018;21014:19;21003:9;20996:38;21070:3;21065:2;21054:9;21050:18;21043:31;20977:4;21091:62;21148:3;21137:9;21133:19;21125:6;21117;21091:62;:::i;:::-;-1:-1:-1;;;;;21189:31:1;;;;21184:2;21169:18;;21162:59;-1:-1:-1;21252:2:1;21237:18;21230:34;21083:70;20777:493;-1:-1:-1;;;20777:493:1:o;21638:1202::-;-1:-1:-1;;;;;21755:3:1;21752:27;21749:53;;;21782:18;;:::i;:::-;21811:93;21900:3;21860:38;21892:4;21886:11;21860:38;:::i;:::-;21854:4;21811:93;:::i;:::-;21930:1;21955:2;21950:3;21947:11;21972:1;21967:615;;;;22626:1;22643:3;22640:93;;;-1:-1:-1;22699:19:1;;;22686:33;22640:93;-1:-1:-1;;18072:1:1;18068:11;;;18064:24;18060:29;18050:40;18096:1;18092:11;;;18047:57;22746:78;;21940:894;;21967:615;17342:1;17335:14;;;17379:4;17366:18;;-1:-1:-1;;22003:17:1;;;22103:9;22125:229;22139:7;22136:1;22133:14;22125:229;;;22228:19;;;22215:33;22200:49;;22335:4;22320:20;;;;22288:1;22276:14;;;;22155:12;22125:229;;;22129:3;22382;22373:7;22370:16;22367:159;;;22506:1;22502:6;22496:3;22490;22487:1;22483:11;22479:21;22475:34;22471:39;22458:9;22453:3;22449:19;22436:33;22432:79;22424:6;22417:95;22367:159;;;22569:1;22563:3;22560:1;22556:11;22552:19;22546:4;22539:33;21940:894;;21638:1202;;;:::o;23713:441::-;23766:5;23819:3;23812:4;23804:6;23800:17;23796:27;23786:55;;23837:1;23834;23827:12;23786:55;23866:6;23860:13;23897:48;23913:31;23941:2;23913:31;:::i;23897:48::-;23970:2;23961:7;23954:19;24016:3;24009:4;24004:2;23996:6;23992:15;23988:26;23985:35;23982:55;;;24033:1;24030;24023:12;23982:55;24046:77;24120:2;24113:4;24104:7;24100:18;24093:4;24085:6;24081:17;24046:77;:::i;24159:335::-;24238:6;24291:2;24279:9;24270:7;24266:23;24262:32;24259:52;;;24307:1;24304;24297:12;24259:52;24340:9;24334:16;-1:-1:-1;;;;;24365:6:1;24362:30;24359:50;;;24405:1;24402;24395:12;24359:50;24428:60;24480:7;24471:6;24460:9;24456:22;24428:60;:::i;24499:555::-;24756:6;24748;24744:19;24733:9;24726:38;24800:3;24795:2;24784:9;24780:18;24773:31;24707:4;24827:45;24867:3;24856:9;24852:19;24844:6;24827:45;:::i;:::-;-1:-1:-1;;;;;24912:6:1;24908:31;24903:2;24892:9;24888:18;24881:59;24988:9;24980:6;24976:22;24971:2;24960:9;24956:18;24949:50;25016:32;25041:6;25033;25016:32;:::i;25420:370::-;25633:6;25625;25621:19;25610:9;25603:38;25677:2;25672;25661:9;25657:18;25650:30;25584:4;25697:44;25737:2;25726:9;25722:18;25714:6;25697:44;:::i;:::-;25689:52;;25777:6;25772:2;25761:9;25757:18;25750:34;25420:370;;;;;;:::o;25795:288::-;25970:2;25959:9;25952:21;25933:4;25990:44;26030:2;26019:9;26015:18;26007:6;25990:44;:::i;:::-;25982:52;;26070:6;26065:2;26054:9;26050:18;26043:34;25795:288;;;;;:::o;26445:125::-;26510:9;;;26531:10;;;26528:36;;;26544:18;;:::i;27264:287::-;27393:3;27431:6;27425:13;27447:66;27506:6;27501:3;27494:4;27486:6;27482:17;27447:66;:::i;:::-;27529:16;;;;;27264:287;-1:-1:-1;;27264:287:1:o;27556:716::-;27859:6;27851;27847:19;27836:9;27829:38;27903:3;27898:2;27887:9;27883:18;27876:31;27810:4;27930:45;27970:3;27959:9;27955:19;27947:6;27930:45;:::i;:::-;-1:-1:-1;;;;;28015:6:1;28011:31;28006:2;27995:9;27991:18;27984:59;28091:9;28083:6;28079:22;28074:2;28063:9;28059:18;28052:50;28125:32;28150:6;28142;28125:32;:::i;:::-;28111:46;;28206:9;28198:6;28194:22;28188:3;28177:9;28173:19;28166:51;28234:32;28259:6;28251;28234:32;:::i;:::-;28226:40;27556:716;-1:-1:-1;;;;;;;;27556:716:1:o;29504:837::-;29853:6;29845;29841:19;29830:9;29823:38;29897:3;29892:2;29881:9;29877:18;29870:31;29804:4;29924:45;29964:3;29953:9;29949:19;29941:6;29924:45;:::i;:::-;30017:9;30009:6;30005:22;30000:2;29989:9;29985:18;29978:50;30051:32;30076:6;30068;30051:32;:::i;:::-;-1:-1:-1;;;;;30157:15:1;;;30152:2;30137:18;;30130:43;30210:15;;30204:3;30189:19;;30182:44;30263:22;;;30110:3;30242:19;;30235:51;30037:46;-1:-1:-1;30303:32:1;30037:46;30320:6;30303:32;:::i;30346:522::-;30442:6;30450;30458;30511:2;30499:9;30490:7;30486:23;30482:32;30479:52;;;30527:1;30524;30517:12;30479:52;30559:9;30553:16;30578:30;30602:5;30578:30;:::i;:::-;30676:2;30661:18;;30655:25;30627:5;;-1:-1:-1;;;;;;30692:30:1;;30689:50;;;30735:1;30732;30725:12;30689:50;30758:60;30810:7;30801:6;30790:9;30786:22;30758:60;:::i;:::-;30748:70;;;30858:2;30847:9;30843:18;30837:25;30827:35;;30346:522;;;;;:::o;30873:245::-;30940:6;30993:2;30981:9;30972:7;30968:23;30964:32;30961:52;;;31009:1;31006;30999:12;30961:52;31041:9;31035:16;31060:28;31082:5;31060:28;:::i
Swarm Source
ipfs://efa00715ba4e51a0f9d8de475c160d93681e413dfb0d8e7200c7bdaf7c49b2ad
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
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.