Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 133 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 90622136 | 22 days ago | IN | 0 MNT | 0.00694932 | ||||
| Transfer | 90621887 | 22 days ago | IN | 0 MNT | 0.00418592 | ||||
| Transfer | 90234444 | 31 days ago | IN | 0 MNT | 0.00381508 | ||||
| Transfer | 89695278 | 44 days ago | IN | 0 MNT | 0.00316592 | ||||
| Transfer | 88829530 | 64 days ago | IN | 0 MNT | 0.00513969 | ||||
| Transfer | 88697379 | 67 days ago | IN | 0 MNT | 0.00560634 | ||||
| Transfer | 88697151 | 67 days ago | IN | 0 MNT | 0.00189878 | ||||
| Transfer | 88696919 | 67 days ago | IN | 0 MNT | 0.00280825 | ||||
| Send From | 88164520 | 79 days ago | IN | 3.21680745 MNT | 0.01329761 | ||||
| Transfer | 88050737 | 82 days ago | IN | 0 MNT | 0.00399241 | ||||
| Transfer | 88050508 | 82 days ago | IN | 0 MNT | 0.00365734 | ||||
| Transfer | 87055121 | 105 days ago | IN | 0 MNT | 0.00321392 | ||||
| Send From | 87032271 | 105 days ago | IN | 3.87226405 MNT | 0.01602017 | ||||
| Transfer | 86770756 | 111 days ago | IN | 0 MNT | 0.00215085 | ||||
| Transfer | 86490316 | 118 days ago | IN | 0 MNT | 0.00207918 | ||||
| Send From | 86456688 | 119 days ago | IN | 2.15830682 MNT | 0.01097381 | ||||
| Send From | 86418427 | 119 days ago | IN | 2.00655042 MNT | 0.01309829 | ||||
| Transfer | 86348232 | 121 days ago | IN | 0 MNT | 0.0019986 | ||||
| Send From | 86201173 | 124 days ago | IN | 2.30330971 MNT | 0.01480466 | ||||
| Send From | 86177806 | 125 days ago | IN | 1.92039353 MNT | 0.01002828 | ||||
| Send From | 86031918 | 128 days ago | IN | 2.58442274 MNT | 0.0109888 | ||||
| Send From | 85561291 | 139 days ago | IN | 3.10906373 MNT | 0.01154189 | ||||
| Send From | 85522508 | 140 days ago | IN | 3.23740688 MNT | 0.01074348 | ||||
| Send From | 85482101 | 141 days ago | IN | 3.25749384 MNT | 0.01109414 | ||||
| Send From | 85445149 | 142 days ago | IN | 2.15587834 MNT | 0.01126101 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 88164520 | 79 days ago | 3.21680745 MNT | ||||
| 87032271 | 105 days ago | 3.87226405 MNT | ||||
| 86456688 | 119 days ago | 2.15830682 MNT | ||||
| 86418427 | 119 days ago | 2.00655042 MNT | ||||
| 86201173 | 124 days ago | 2.30330971 MNT | ||||
| 86177806 | 125 days ago | 1.92039353 MNT | ||||
| 86031918 | 128 days ago | 2.58442274 MNT | ||||
| 85561291 | 139 days ago | 3.10906373 MNT | ||||
| 85522508 | 140 days ago | 3.23740688 MNT | ||||
| 85482101 | 141 days ago | 3.25749384 MNT | ||||
| 85445149 | 142 days ago | 2.15587834 MNT | ||||
| 83781910 | 180 days ago | 3.36251197 MNT | ||||
| 83600232 | 185 days ago | 3.53514708 MNT | ||||
| 83239349 | 193 days ago | 3.95257077 MNT | ||||
| 83098028 | 196 days ago | 6.15433282 MNT | ||||
| 80932195 | 246 days ago | 6.2078103 MNT | ||||
| 79144574 | 288 days ago | 5.0889667 MNT | ||||
| 76003128 | 360 days ago | 4.10517325 MNT | ||||
| 75520720 | 372 days ago | 4.15925997 MNT | ||||
| 75427958 | 374 days ago | 4.13558623 MNT | ||||
| 74885142 | 386 days ago | 8.69456487 MNT | ||||
| 74170999 | 403 days ago | 7.54701494 MNT | ||||
| 73686808 | 414 days ago | 8.06638368 MNT | ||||
| 73539369 | 418 days ago | 10.61280115 MNT | ||||
| 71590855 | 463 days ago | 26.28471553 MNT |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CPOOLOFT20
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import './OFTCore.sol';
import './CPOOLCore.sol';
contract CPOOLOFT20 is CPOOLCore, OFTCore {
constructor(address _layerZeroEndpoint) CPOOLCore() OFTCore(_layerZeroEndpoint) {}
function circulatingSupply() public view virtual override returns (uint256) {
return totalSupply;
}
function _debitFrom(
address _from,
uint16,
bytes memory,
uint256 _amount
) internal virtual override {
address spender = _msgSender();
if (_from != spender) _spendAllowance(_from, spender, _amount);
_burn(_from, _amount);
}
function _creditTo(uint16, address _toAddress, uint256 _amount) internal virtual override {
_mint(_toAddress, _amount);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
interface ICPOOL is IERC20 {
function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import '../interfaces/ICPOOL.sol';
contract CPOOLCore is ICPOOL {
/// @notice EIP-20 token name for this token
string public constant name = 'Clearpool';
/// @notice EIP-20 token symbol for this token
string public constant symbol = 'CPOOL';
/// @notice EIP-20 token decimals for this token
uint8 public constant decimals = 18;
/// @notice Total number of tokens in circulation
uint256 public totalSupply;
/// @notice Allowance amounts on behalf of others
mapping(address => mapping(address => uint96)) internal allowances;
/// @notice Official record of token balances for each account
mapping(address => uint96) internal balances;
/// @notice A record of each accounts delegate
mapping(address => address) public delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint96 votes;
}
/// @notice A record of votes checkpoints for each account, by index
mapping(address => mapping(uint32 => Checkpoint)) public checkpoints;
/// @notice The number of checkpoints for each account
mapping(address => uint32) public numCheckpoints;
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH =
keccak256('EIP712Domain(string name,uint256 chainId,address verifyingContract)');
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH =
keccak256('Delegation(address delegatee,uint256 nonce,uint256 expiry)');
/// @notice A record of states for signing / validating signatures
mapping(address => uint256) public nonces;
/// @notice An event thats emitted when an account changes its delegate
event DelegateChanged(
address indexed delegator,
address indexed fromDelegate,
address indexed toDelegate
);
/// @notice An event thats emitted when a delegate account's vote balance changes
event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
constructor() {}
/**
* @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
* @param account The address of the account holding the funds
* @param spender The address of the account spending the funds
* @return The number of tokens approved
*/
function allowance(address account, address spender) external view returns (uint256) {
return allowances[account][spender];
}
/**
* @notice Approve `spender` to transfer up to `amount` from `src`
* @dev This will overwrite the approval amount for `spender`
* and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
* @param spender The address of the account which may transfer tokens
* @param rawAmount The number of tokens that are approved (2^256-1 means infinite)
* @return Whether or not the approval succeeded
*/
function approve(address spender, uint256 rawAmount) external returns (bool) {
uint96 amount;
if (rawAmount == type(uint256).max) {
amount = type(uint96).max;
} else {
amount = safe96(rawAmount, 'Cpool::approve: amount exceeds 96 bits');
}
allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
/**
* @notice Get the number of tokens held by the `account`
* @param account The address of the account to get the balance of
* @return The number of tokens held
*/
function balanceOf(address account) external view returns (uint256) {
return balances[account];
}
/**
* @notice Transfer `amount` tokens from `msg.sender` to `dst`
* @param dst The address of the destination account
* @param rawAmount The number of tokens to transfer
* @return Whether or not the transfer succeeded
*/
function transfer(address dst, uint256 rawAmount) external returns (bool) {
uint96 amount = safe96(rawAmount, 'Cpool::transfer: amount exceeds 96 bits');
_transferTokens(msg.sender, dst, amount);
return true;
}
/**
* @notice Transfer `amount` tokens from `src` to `dst`
* @param src The address of the source account
* @param dst The address of the destination account
* @param rawAmount The number of tokens to transfer
* @return Whether or not the transfer succeeded
*/
function transferFrom(address src, address dst, uint256 rawAmount) external returns (bool) {
address spender = msg.sender;
uint96 spenderAllowance = allowances[src][spender];
uint96 amount = safe96(rawAmount, 'Cpool::approve: amount exceeds 96 bits');
if (spender != src && spenderAllowance != type(uint96).max) {
uint96 newAllowance = sub96(
spenderAllowance,
amount,
'Cpool::transferFrom: transfer amount exceeds spender allowance'
);
allowances[src][spender] = newAllowance;
emit Approval(src, spender, newAllowance);
}
_transferTokens(src, dst, amount);
return true;
}
/**
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegatee The address to delegate votes to
*/
function delegate(address delegatee) external {
return _delegate(msg.sender, delegatee);
}
/**
* @notice Delegates votes from signatory to `delegatee`
* @param delegatee The address to delegate votes to
* @param nonce The contract state required to match the signature
* @param expiry The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function delegateBySig(
address delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 domainSeparator = keccak256(
abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))
);
bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
bytes32 digest = keccak256(abi.encodePacked('\x19\x01', domainSeparator, structHash));
address signatory = ecrecover(digest, v, r, s);
require(signatory != address(0), 'Cpool::delegateBySig: invalid signature');
require(nonce == nonces[signatory]++, 'Cpool::delegateBySig: invalid nonce');
require(block.timestamp <= expiry, 'Cpool::delegateBySig: signature expired');
return _delegate(signatory, delegatee);
}
/**
* @notice Gets the current votes balance for `account`
* @param account The address to get votes balance
* @return The number of current votes for `account`
*/
function getCurrentVotes(address account) external view returns (uint96) {
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
/**
* @notice Determine the prior number of votes for an account as of a block number
* @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
* @param account The address of the account to check
* @param blockNumber The block number to get the vote balance at
* @return The number of votes the account had as of the given block
*/
function getPriorVotes(address account, uint256 blockNumber) external view returns (uint96) {
require(blockNumber < block.number, 'Cpool::getPriorVotes: not yet determined');
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
// First check most recent balance
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
// Next check implicit zero balance
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function _delegate(address delegator, address delegatee) internal {
address currentDelegate = delegates[delegator];
uint96 delegatorBalance = balances[delegator];
delegates[delegator] = delegatee;
emit DelegateChanged(delegator, currentDelegate, delegatee);
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
}
function _transferTokens(address src, address dst, uint96 amount) internal {
require(src != address(0), 'Cpool::_transferTokens: cannot transfer from the zero address');
require(dst != address(0), 'Cpool::_transferTokens: cannot transfer to the zero address');
balances[src] = sub96(
balances[src],
amount,
'Cpool::_transferTokens: transfer amount exceeds balance'
);
balances[dst] = add96(
balances[dst],
amount,
'Cpool::_transferTokens: transfer amount overflows'
);
emit Transfer(src, dst, amount);
_moveDelegates(delegates[src], delegates[dst], amount);
}
function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
uint32 srcRepNum = numCheckpoints[srcRep];
uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint96 srcRepNew = sub96(srcRepOld, amount, 'Cpool::_moveVotes: vote amount underflows');
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
uint32 dstRepNum = numCheckpoints[dstRep];
uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint96 dstRepNew = add96(dstRepOld, amount, 'Cpool::_moveVotes: vote amount overflows');
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint96 oldVotes,
uint96 newVotes
) internal {
uint32 blockNumber = safe32(
block.number,
'Cpool::_writeCheckpoint: block number exceeds 32 bits'
);
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2 ** 32, errorMessage);
return uint32(n);
}
function safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) {
require(n < 2 ** 96, errorMessage);
return uint96(n);
}
function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
uint96 c = a + b;
require(c >= a, errorMessage);
return c;
}
function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) {
require(b <= a, errorMessage);
return a - b;
}
function getChainId() internal view returns (uint256) {
uint256 chainId;
assembly {
chainId := chainid()
}
return chainId;
}
function _burn(address account, uint256 rawAmount) internal virtual {
require(account != address(0), 'Cpool::_burn: cannot burn from the zero address');
uint96 amount = safe96(rawAmount, 'Cpool::transfer: amount exceeds 96 bits');
require(balances[account] >= amount, 'Cpool: burn amount exceeds balance');
balances[account] = sub96(
balances[account],
amount,
'Cpool::_burn: transfer amount exceeds balance'
);
totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _mint(address account, uint256 rawAmount) internal virtual {
require(account != address(0), 'Cpool::_mint: cannot mint from the zero address');
uint96 amount = safe96(rawAmount, 'Cpool::transfer: amount exceeds 96 bits');
totalSupply += amount;
balances[account] = add96(balances[account], amount, 'Cpool::_mint: vote amount overflows');
emit Transfer(address(0), account, amount);
}
function _spendAllowance(address owner, address spender, uint256 rawAmount) internal virtual {
uint96 amount = safe96(rawAmount, 'Cpool::transfer: amount exceeds 96 bits');
if (spender != owner && allowances[owner][spender] != type(uint96).max) {
require(allowances[owner][spender] >= amount, 'Cpool::spendAllowance insufficient allowance');
allowances[owner][spender] = sub96(
allowances[owner][spender],
amount,
'Cpool::_spendAllowance: transfer amount exceeds balance'
);
_approve(owner, spender, allowances[owner][spender]);
}
}
function _approve(address owner, address spender, uint96 amount) internal virtual {
require(owner != address(0), 'Cpool::_approve from the zero address');
require(spender != address(0), 'Cpool::_approve to the zero address');
allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function decreaseAllowance(
address spender,
uint256 subtractedRawValue
) public virtual returns (bool) {
address owner = msg.sender;
uint96 subtractedValue = safe96(
subtractedRawValue,
'Cpool::decreaseAllowance: amount exceeds 96 bits'
);
require(
allowances[owner][spender] >= subtractedValue,
'Cpool::decreaseAllowance decreased allowance below zero'
);
allowances[owner][spender] = sub96(
allowances[owner][spender],
subtractedValue,
'Cpool::decreaseAllowance: transfer amount exceeds balance'
);
_approve(owner, spender, allowances[owner][spender]);
return true;
}
function increaseAllowance(address spender, uint256 addedRawValue) public virtual returns (bool) {
address owner = msg.sender;
uint96 addedValue = safe96(addedRawValue, 'Cpool::increaseAllowance: amount exceeds 96 bits');
allowances[owner][spender] = add96(
allowances[owner][spender],
addedValue,
'Cpool::increaseAllowance: transfer amount overflows'
);
_approve(owner, spender, allowances[owner][spender]);
return true;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@openzeppelin/contracts/access/Ownable.sol';
import './interfaces/ILayerZeroReceiver.sol';
import './interfaces/ILayerZeroEndpoint.sol';
import './interfaces/ILayerZeroUserApplicationConfig.sol';
/*
* a generic LzReceiver implementation
*/
abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig {
ILayerZeroEndpoint public immutable lzEndpoint;
mapping(uint16 => bytes) public trustedRemoteLookup;
mapping(uint16 => mapping(uint => uint)) public minDstGasLookup;
event SetTrustedRemote(uint16 _srcChainId, bytes _srcAddress);
constructor(address _endpoint) {
lzEndpoint = ILayerZeroEndpoint(_endpoint);
}
function lzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _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 &&
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
) internal virtual {
bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
require(trustedRemote.length != 0, 'LzApp: destination chain is not a trusted source');
lzEndpoint.send{value: msg.value}(
_dstChainId,
trustedRemote,
_payload,
_refundAddress,
_zroPaymentAddress,
_adapterParams
);
}
function _checkGasLimit(
uint16 _dstChainId,
uint _type,
bytes memory _adapterParams,
uint _extraGas
) internal view {
uint providedGasLimit = getGasLimit(_adapterParams);
uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;
require(minGasLimit > 0, 'LzApp: minGasLimit not set');
require(providedGasLimit >= minGasLimit, 'LzApp: gas limit is too low');
}
//---------------------------UserApplication config----------------------------------------
function getConfig(
uint16 _version,
uint16 _chainId,
address,
uint _configType
) external view returns (bytes memory) {
return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);
}
function getGasLimit(bytes memory _adapterParams) internal pure returns (uint gasLimit) {
assembly {
gasLimit := mload(add(_adapterParams, 34))
}
}
// 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);
}
// allow owner to set it multiple times.
function setTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner {
trustedRemoteLookup[_srcChainId] = _srcAddress;
emit SetTrustedRemote(_srcChainId, _srcAddress);
}
function setMinDstGasLookup(
uint16 _dstChainId,
uint _type,
uint _dstGasAmount
) external onlyOwner {
require(_dstGasAmount > 0, 'LzApp: invalid _dstGasAmount');
minDstGasLookup[_dstChainId][_type] = _dstGasAmount;
}
//--------------------------- VIEW FUNCTION ----------------------------------------
function isTrustedRemote(
uint16 _srcChainId,
bytes calldata _srcAddress
) external view returns (bool) {
bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
return keccak256(trustedSource) == keccak256(_srcAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import './LzApp.sol';
/*
* 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 {
constructor(address _endpoint) LzApp(_endpoint) {}
mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;
event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);
// overriding the virtual function in LzReceiver
function _blockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload
) internal virtual override {
// try-catch all errors/exceptions
try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
// do nothing
} catch {
// error / exception
failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
}
}
function nonblockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _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 memory _srcAddress,
uint64 _nonce,
bytes memory _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);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import './NonblockingLzApp.sol';
import './interfaces/IOFTCore.sol';
abstract contract OFTCore is NonblockingLzApp, IOFTCore {
uint public constant NO_EXTRA_GAS = 0;
uint public constant FUNCTION_TYPE_SEND = 1;
bool public useCustomAdapterParams;
constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {}
function estimateSendFee(
uint16 _dstChainId,
bytes memory _toAddress,
uint _amount,
bool _useZro,
bytes memory _adapterParams
) public view virtual override returns (uint nativeFee, uint zroFee) {
// mock the payload for send()
bytes memory payload = abi.encode(_toAddress, _amount);
return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);
}
function sendFrom(
address _from,
uint16 _dstChainId,
bytes memory _toAddress,
uint _amount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes memory _adapterParams
) public payable virtual override {
_send(
_from,
_dstChainId,
_toAddress,
_amount,
_refundAddress,
_zroPaymentAddress,
_adapterParams
);
}
function _nonblockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64,
bytes memory _payload
) internal virtual override {
// decode and load the toAddress
(bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (bytes, uint));
address toAddress;
assembly {
toAddress := mload(add(toAddressBytes, 20))
}
_creditTo(_srcChainId, toAddress, amount);
emit ReceiveFromChain(_srcChainId, _srcAddress, toAddress, amount);
}
function _send(
address _from,
uint16 _dstChainId,
bytes memory _toAddress,
uint _amount,
address payable _refundAddress,
address _zroPaymentAddress,
bytes memory _adapterParams
) internal virtual {
_debitFrom(_from, _dstChainId, _toAddress, _amount);
bytes memory payload = abi.encode(_toAddress, _amount);
if (useCustomAdapterParams) {
_checkGasLimit(_dstChainId, FUNCTION_TYPE_SEND, _adapterParams, NO_EXTRA_GAS);
} else {
require(_adapterParams.length == 0, 'LzApp: _adapterParams must be empty.');
}
_lzSend(_dstChainId, payload, _refundAddress, _zroPaymentAddress, _adapterParams);
emit SendToChain(_from, _dstChainId, _toAddress, _amount);
}
function setUseCustomAdapterParams(bool _useCustomAdapterParams) external onlyOwner {
useCustomAdapterParams = _useCustomAdapterParams;
}
function _debitFrom(
address _from,
uint16 _dstChainId,
bytes memory _toAddress,
uint _amount
) internal virtual;
function _creditTo(uint16 _srcChainId, address _toAddress, uint _amount) internal virtual;
}// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;
import './ILayerZeroUserApplicationConfig.sol';
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);
}// SPDX-License-Identifier: MIT
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;
}// SPDX-License-Identifier: MIT
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;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the IOFT core standard
*/
interface IOFTCore {
/**
* @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 Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`)
* `_nonce` is the outbound nonce
*/
event SendToChain(
address indexed _sender,
uint16 indexed _dstChainId,
bytes indexed _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,
bytes indexed _srcAddress,
address indexed _toAddress,
uint _amount
);
}{
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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"}],"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":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":true,"internalType":"address","name":"_toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"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":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FUNCTION_TYPE_SEND","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedRawValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedRawValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"","type":"uint256"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_dstGasAmount","type":"uint256"}],"name":"setMinDstGasLookup","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":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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
60a06040523480156200001157600080fd5b50604051620041d4380380620041d48339810160408190526200003491620000aa565b808080620000423362000058565b6001600160a01b031660805250620000dc915050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215620000bd57600080fd5b81516001600160a01b0381168114620000d557600080fd5b9392505050565b6080516140a462000130600039600081816107db01528181610a0401528181610bc901528181610d0b01528181610ec60152818161111c01528181611abe01528181611daf0152612a2a01526140a46000f3fe60806040526004361061027c5760003560e01c80637533d7881161014f578063b4b5ea57116100c1578063eab45d9c1161007a578063eab45d9c146108f3578063eb8d72b714610913578063ed629c5c14610933578063f1127ed81461094d578063f2fde38b146109c1578063f5ecbdbc146109e157600080fd5b8063b4b5ea57146107fd578063c3cda5201461081d578063cbed8b9c1461083d578063d1deba1f1461085d578063dd62ed3e14610870578063e7a324dc146108bf57600080fd5b806395d89b411161011357806395d89b41146107235780639b57db5f14610754578063a457c2d714610774578063a9059cbb14610794578063af3fb21c146107b4578063b353aaa7146107c957600080fd5b80637533d7881461066b578063782d6fe11461068b5780637ecebe00146106c35780638da5cb5b146106f05780639358928b1461070e57600080fd5b806339509351116101f35780635b8c41e6116101ac5780635b8c41e6146105405780635c19a95c1461058f57806366ad5c8a146105af5780636fcfff45146105cf57806370a0823114610617578063715018a61461065657600080fd5b8063395093511461046a5780633d8b38f61461048a57806342d65a8d146104aa57806344770515146104ca57806351905636146104df578063587cde1e146104f257600080fd5b806310ddb1371161024557806310ddb1371461038457806318160ddd146103a457806320606b70146103ba57806323b872dd146103ee5780632a205e3d1461040e578063313ce5671461044357600080fd5b80621d35671461028157806306fdde03146102a357806307810867146102ee57806307e0db1714610334578063095ea7b314610354575b600080fd5b34801561028d57600080fd5b506102a161029c3660046132cc565b610a01565b005b3480156102af57600080fd5b506102d86040518060400160405280600981526020016810db19585c9c1bdbdb60ba1b81525081565b6040516102e591906133a0565b60405180910390f35b3480156102fa57600080fd5b506103266103093660046133b3565b600960209081526000928352604080842090915290825290205481565b6040519081526020016102e5565b34801561034057600080fd5b506102a161034f3660046133dd565b610ba8565b34801561036057600080fd5b5061037461036f36600461340d565b610c2a565b60405190151581526020016102e5565b34801561039057600080fd5b506102a161039f3660046133dd565b610cea565b3480156103b057600080fd5b5061032660005481565b3480156103c657600080fd5b506103267f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156103fa57600080fd5b5061037461040936600461342b565b610d42565b34801561041a57600080fd5b5061042e61042936600461347c565b610e87565b604080519283526020830191909152016102e5565b34801561044f57600080fd5b50610458601281565b60405160ff90911681526020016102e5565b34801561047657600080fd5b5061037461048536600461340d565b610f52565b34801561049657600080fd5b506103746104a5366004613552565b611031565b3480156104b657600080fd5b506102a16104c5366004613552565b6110fd565b3480156104d657600080fd5b50610326600081565b6102a16104ed3660046135a4565b61118c565b3480156104fe57600080fd5b5061052861050d36600461365d565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102e5565b34801561054c57600080fd5b5061032661055b36600461367a565b600a602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561059b57600080fd5b506102a16105aa36600461365d565b61119b565b3480156105bb57600080fd5b506102a16105ca3660046132cc565b6111a8565b3480156105db57600080fd5b506106026105ea36600461365d565b60056020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016102e5565b34801561062357600080fd5b5061032661063236600461365d565b6001600160a01b03166000908152600260205260409020546001600160601b031690565b34801561066257600080fd5b506102a1611218565b34801561067757600080fd5b506102d86106863660046133dd565b61122c565b34801561069757600080fd5b506106ab6106a636600461340d565b6112c6565b6040516001600160601b0390911681526020016102e5565b3480156106cf57600080fd5b506103266106de36600461365d565b60066020526000908152604090205481565b3480156106fc57600080fd5b506007546001600160a01b0316610528565b34801561071a57600080fd5b50600054610326565b34801561072f57600080fd5b506102d86040518060400160405280600581526020016410d413d3d360da1b81525081565b34801561076057600080fd5b506102a161076f3660046136d7565b611551565b34801561078057600080fd5b5061037461078f36600461340d565b6115ca565b3480156107a057600080fd5b506103746107af36600461340d565b6116f5565b3480156107c057600080fd5b50610326600181565b3480156107d557600080fd5b506105287f000000000000000000000000000000000000000000000000000000000000000081565b34801561080957600080fd5b506106ab61081836600461365d565b611731565b34801561082957600080fd5b506102a161083836600461370a565b6117af565b34801561084957600080fd5b506102a161085836600461376c565b611a9f565b6102a161086b3660046132cc565b611b34565b34801561087c57600080fd5b5061032661088b3660046137da565b6001600160a01b0391821660009081526001602090815260408083209390941682529190915220546001600160601b031690565b3480156108cb57600080fd5b506103267fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b3480156108ff57600080fd5b506102a161090e366004613813565b611c86565b34801561091f57600080fd5b506102a161092e366004613552565b611ca1565b34801561093f57600080fd5b50600b546103749060ff1681565b34801561095957600080fd5b5061099d61096836600461382e565b600460209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6040805163ffffffff90931683526001600160601b039091166020830152016102e5565b3480156109cd57600080fd5b506102a16109dc36600461365d565b611d08565b3480156109ed57600080fd5b506102d86109fc366004613865565b611d7e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a7e5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff841660009081526008602052604081208054610a9c906138b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac8906138b2565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b5050505050905080518451148015610b3a575080805190602001208480519060200120145b610b955760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610a75565b610ba185858585611e2f565b5050505050565b610bb0611f20565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610c1657600080fd5b505af1158015610ba1573d6000803e3d6000fd5b6000806000198303610c4457506001600160601b03610c69565b610c6683604051806060016040528060268152602001613e9660269139611f7a565b90505b3360008181526001602090815260408083206001600160a01b0389168085529083529281902080546001600160601b0319166001600160601b03871690811790915590519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a360019150505b92915050565b610cf2611f20565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610bfc565b6001600160a01b03831660009081526001602090815260408083203380855290835281842054825160608101909352602680845291936001600160601b03909116928592610d9a9288929190613e9690830139611f7a565b9050866001600160a01b0316836001600160a01b031614158015610dc757506001600160601b0382811614155b15610e6f576000610df183836040518060600160405280603e8152602001613fb5603e9139611fa9565b6001600160a01b038981166000818152600160209081526040808320948a168084529482529182902080546001600160601b0319166001600160601b0387169081179091559151918252939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b610e7a878783611ff3565b5060019695505050505050565b60008060008686604051602001610e9f9291906138ec565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340a7bb1090610f03908b90309086908b908b9060040161390e565b6040805180830381865afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f439190613962565b92509250509550959350505050565b6000803390506000610f7c84604051806060016040528060308152602001613e3960309139611f7a565b6001600160a01b038084166000908152600160209081526040808320938a16835292815290829020548251606081019093526033808452939450610fd7936001600160601b03909116928592909190613f8290830139612244565b6001600160a01b038381166000908152600160209081526040808320938a1683529290522080546001600160601b0319166001600160601b039290921691821790556110269083908790612291565b506001949350505050565b61ffff831660009081526008602052604081208054829190611052906138b2565b80601f016020809104026020016040519081016040528092919081815260200182805461107e906138b2565b80156110cb5780601f106110a0576101008083540402835291602001916110cb565b820191906000526020600020905b8154815290600101906020018083116110ae57829003601f168201915b5050505050905083836040516110e2929190613986565b60405180910390208180519060200120149150509392505050565b611105611f20565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90611155908690869086906004016139bf565b600060405180830381600087803b15801561116f57600080fd5b505af1158015611183573d6000803e3d6000fd5b50505050505050565b611183878787878787876123d2565b6111a533826124f4565b50565b3330146112065760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610a75565b61121284848484612578565b50505050565b611220611f20565b61122a600061260b565b565b60086020526000908152604090208054611245906138b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611271906138b2565b80156112be5780601f10611293576101008083540402835291602001916112be565b820191906000526020600020905b8154815290600101906020018083116112a157829003601f168201915b505050505081565b60004382106113285760405162461bcd60e51b815260206004820152602860248201527f43706f6f6c3a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b6064820152608401610a75565b6001600160a01b03831660009081526005602052604081205463ffffffff1690819003611359576000915050610ce4565b6001600160a01b0384166000908152600460205260408120849161137e6001856139f3565b63ffffffff908116825260208201929092526040016000205416116113f1576001600160a01b0384166000908152600460205260408120906113c16001846139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03169150610ce49050565b6001600160a01b038416600090815260046020908152604080832083805290915290205463ffffffff1683101561142c576000915050610ce4565b60008061143a6001846139f3565b90505b8163ffffffff168163ffffffff16111561150c576000600261145f84846139f3565b6114699190613a17565b61147390836139f3565b6001600160a01b038816600090815260046020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b0316918101919091529192508790036114e057602001519450610ce49350505050565b805163ffffffff168711156114f757819350611505565b6115026001836139f3565b92505b505061143d565b506001600160a01b038516600090815260046020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b611559611f20565b600081116115a95760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c6964205f647374476173416d6f756e74000000006044820152606401610a75565b61ffff90921660009081526009602090815260408083209383529290522055565b60008033905060006115f484604051806060016040528060308152602001613ff360309139611f7a565b6001600160a01b038084166000908152600160209081526040808320938a16835292905220549091506001600160601b038083169116101561169e5760405162461bcd60e51b815260206004820152603760248201527f43706f6f6c3a3a6465637265617365416c6c6f77616e6365206465637265617360448201527f656420616c6c6f77616e63652062656c6f77207a65726f0000000000000000006064820152608401610a75565b6001600160a01b038083166000908152600160209081526040808320938916835292815290829020548251606081019093526039808452610fd7936001600160601b039092169285929190613f1890830139611fa9565b60008061171a83604051806060016040528060278152602001613ef160279139611f7a565b9050611727338583611ff3565b5060019392505050565b6001600160a01b03811660009081526005602052604081205463ffffffff168061175c5760006117a8565b6001600160a01b0383166000908152600460205260408120906117806001846139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03165b9392505050565b604080518082018252600981526810db19585c9c1bdbdb60ba1b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f1aaf9fe34ecc35e358819133cb31a70bb3dc486165a31aa4a1ee9fd469ea36bd81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08301526001600160a01b038a1660e083015261010082018990526101208083018990528451808403909101815261014083019094528351939092019290922061190160f01b6101608401526101628301829052610182830181905290916000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611933573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166119a65760405162461bcd60e51b815260206004820152602760248201527f43706f6f6c3a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b6064820152608401610a75565b6001600160a01b03811660009081526006602052604081208054916119ca83613a48565b919050558914611a285760405162461bcd60e51b815260206004820152602360248201527f43706f6f6c3a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b6064820152608401610a75565b87421115611a885760405162461bcd60e51b815260206004820152602760248201527f43706f6f6c3a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b6064820152608401610a75565b611a92818b6124f4565b505050505b505050505050565b611aa7611f20565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90611afb9088908890889088908890600401613a61565b600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050505050505050565b61ffff84166000908152600a60205260408082209051611b55908690613a9a565b90815260408051602092819003830190206001600160401b03861660009081529252902054905080611bd55760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610a75565b815160208301208114611c345760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610a75565b61ffff85166000908152600a60205260408082209051611c55908790613a9a565b90815260408051602092819003830190206001600160401b03871660009081529252902055610ba185858585612578565b611c8e611f20565b600b805460ff1916911515919091179055565b611ca9611f20565b61ffff83166000908152600860205260409020611cc7828483613afc565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611cfb939291906139bf565b60405180910390a1505050565b611d10611f20565b6001600160a01b038116611d755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a75565b6111a58161260b565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e269190810190613c00565b95945050505050565b604051633356ae4560e11b815230906366ad5c8a90611e58908790879087908790600401613c34565b600060405180830381600087803b158015611e7257600080fd5b505af1925050508015611e83575060015b611212578080519060200120600a60008661ffff1661ffff16815260200190815260200160002084604051611eb89190613a9a565b9081526040805191829003602090810183206001600160401b0387166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90611f13908690869086908690613c34565b60405180910390a1611212565b6007546001600160a01b0316331461122a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a75565b600081600160601b8410611fa15760405162461bcd60e51b8152600401610a7591906133a0565b509192915050565b6000836001600160601b0316836001600160601b031611158290611fe05760405162461bcd60e51b8152600401610a7591906133a0565b50611feb8385613c72565b949350505050565b6001600160a01b03831661206f5760405162461bcd60e51b815260206004820152603d60248201527f43706f6f6c3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460448201527f72616e736665722066726f6d20746865207a65726f20616464726573730000006064820152608401610a75565b6001600160a01b0382166120eb5760405162461bcd60e51b815260206004820152603b60248201527f43706f6f6c3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460448201527f72616e7366657220746f20746865207a65726f206164647265737300000000006064820152608401610a75565b6001600160a01b038316600090815260026020908152604091829020548251606081019093526037808452612136936001600160601b039092169285929190613dcb90830139611fa9565b6001600160a01b03848116600090815260026020908152604080832080546001600160601b0319166001600160601b0396871617905592861682529082902054825160608101909352603180845261219e9491909116928592909190613f5190830139612244565b6001600160a01b0383811660008181526002602090815260409182902080546001600160601b0319166001600160601b03968716179055905193851684529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36001600160a01b0380841660009081526003602052604080822054858416835291205461223f9291821691168361265d565b505050565b6000806122518486613c92565b9050846001600160601b0316816001600160601b0316101583906122885760405162461bcd60e51b8152600401610a7591906133a0565b50949350505050565b6001600160a01b0383166122f55760405162461bcd60e51b815260206004820152602560248201527f43706f6f6c3a3a5f617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a75565b6001600160a01b0382166123575760405162461bcd60e51b815260206004820152602360248201527f43706f6f6c3a3a5f617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a75565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080546001600160601b0319166001600160601b03871690811790915591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6123de87878787612809565b600085856040516020016123f39291906138ec565b60408051601f19818403018152919052600b5490915060ff16156124245761241f87600184600061282f565b61247f565b81511561247f5760405162461bcd60e51b8152602060048201526024808201527f4c7a4170703a205f61646170746572506172616d73206d75737420626520656d604482015263383a3c9760e11b6064820152608401610a75565b61248c878286868661290c565b8560405161249a9190613a9a565b60405180910390208761ffff16896001600160a01b03167f4a7c7bd7b3092a14241ec8138800e06869d4bf7ce2d955d6ada58e5ff3268a0a886040516124e291815260200190565b60405180910390a45050505050505050565b6001600160a01b03808316600081815260036020818152604080842080546002845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461121282848361265d565b6000808280602001905181019061258f9190613cb2565b601482015191935091506125a4878284612aa5565b806001600160a01b0316866040516125bc9190613a9a565b60405180910390208861ffff167f776434b505c7beb3db155c58df6c88985bf7c31730767e43ec773005059fed7a856040516125fa91815260200190565b60405180910390a450505050505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415801561268857506000816001600160601b0316115b1561223f576001600160a01b0383161561274d576001600160a01b03831660009081526005602052604081205463ffffffff1690816126c8576000612714565b6001600160a01b0385166000908152600460205260408120906126ec6001856139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03165b9050600061273b828560405180606001604052806029815260200161404660299139611fa9565b905061274986848484612aaf565b5050505b6001600160a01b0382161561223f576001600160a01b03821660009081526005602052604081205463ffffffff1690816127885760006127d4565b6001600160a01b0384166000908152600460205260408120906127ac6001856139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03165b905060006127fb8285604051806060016040528060288152602001613da360289139612244565b9050611a9785848484612aaf565b336001600160a01b038516811461282557612825858284612ca7565b610ba18583612e5f565b600061283c836022015190565b61ffff861660009081526009602090815260408083208884529091528120549192509061286a908490613cf8565b9050600081116128bc5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610a75565b80821015611a975760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610a75565b61ffff85166000908152600860205260408120805461292a906138b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612956906138b2565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b505050505090508051600003612a145760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610a75565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c5803100903490612a6b908a9086908b908b908b908b90600401613d0b565b6000604051808303818588803b158015612a8457600080fd5b505af1158015612a98573d6000803e3d6000fd5b5050505050505050505050565b61223f828261304f565b6000612ad343604051806060016040528060358152602001613ebc603591396131b4565b905060008463ffffffff16118015612b2d57506001600160a01b038516600090815260046020526040812063ffffffff831691612b116001886139f3565b63ffffffff908116825260208201929092526040016000205416145b15612ba1576001600160a01b03851660009081526004602052604081208391612b576001886139f3565b63ffffffff168152602081019190915260400160002080546001600160601b0392909216600160201b026fffffffffffffffffffffffff0000000019909216919091179055612c52565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000908152600482528681208b8616825290915294909420925183549451909116600160201b026fffffffffffffffffffffffffffffffff19909416911617919091179055612c21846001613d72565b6001600160a01b0386166000908152600560205260409020805463ffffffff191663ffffffff929092169190911790555b604080516001600160601b038086168252841660208201526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000612ccb82604051806060016040528060278152602001613ef160279139611f7a565b9050836001600160a01b0316836001600160a01b031614158015612d1e57506001600160a01b038085166000908152600160209081526040808320938716835292905220546001600160601b0390811614155b15611212576001600160a01b038085166000908152600160209081526040808320938716835292905220546001600160601b0380831691161015612db95760405162461bcd60e51b815260206004820152602c60248201527f43706f6f6c3a3a7370656e64416c6c6f77616e636520696e737566666963696560448201526b6e7420616c6c6f77616e636560a01b6064820152608401610a75565b6001600160a01b038085166000908152600160209081526040808320938716835292815290829020548251606081019093526037808452612e10936001600160601b039092169285929190613e0290830139611fa9565b6001600160a01b03858116600090815260016020908152604080832093881683529290522080546001600160601b0319166001600160601b039290921691821790556112129085908590612291565b6001600160a01b038216612ecd5760405162461bcd60e51b815260206004820152602f60248201527f43706f6f6c3a3a5f6275726e3a2063616e6e6f74206275726e2066726f6d207460448201526e6865207a65726f206164647265737360881b6064820152608401610a75565b6000612ef182604051806060016040528060278152602001613ef160279139611f7a565b6001600160a01b0384166000908152600260205260409020549091506001600160601b0380831691161015612f735760405162461bcd60e51b815260206004820152602260248201527f43706f6f6c3a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a75565b6001600160a01b03831660009081526002602090815260409182902054825160608101909352602d808452612fbe936001600160601b039092169285929190613e6990830139611fa9565b6001600160a01b038416600090815260026020526040812080546001600160601b0319166001600160601b039384161790558054918316918190613003908490613d8f565b90915550506040516001600160601b03821681526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016123c5565b6001600160a01b0382166130bd5760405162461bcd60e51b815260206004820152602f60248201527f43706f6f6c3a3a5f6d696e743a2063616e6e6f74206d696e742066726f6d207460448201526e6865207a65726f206164647265737360881b6064820152608401610a75565b60006130e182604051806060016040528060278152602001613ef160279139611f7a565b9050806001600160601b03166000808282546130fd9190613cf8565b90915550506001600160a01b03831660009081526002602090815260409182902054825160608101909352602380845261314d936001600160601b03909216928592919061402390830139612244565b6001600160a01b038416600081815260026020908152604080832080546001600160601b0319166001600160601b03968716179055519385168452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123c5565b600081600160201b8410611fa15760405162461bcd60e51b8152600401610a7591906133a0565b803561ffff811681146131ed57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613230576132306131f2565b604052919050565b60006001600160401b03821115613251576132516131f2565b50601f01601f191660200190565b600082601f83011261327057600080fd5b813561328361327e82613238565b613208565b81815284602083860101111561329857600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b03811681146131ed57600080fd5b600080600080608085870312156132e257600080fd5b6132eb856131db565b935060208501356001600160401b038082111561330757600080fd5b6133138883890161325f565b9450613321604088016132b5565b9350606087013591508082111561333757600080fd5b506133448782880161325f565b91505092959194509250565b60005b8381101561336b578181015183820152602001613353565b50506000910152565b6000815180845261338c816020860160208601613350565b601f01601f19169290920160200192915050565b6020815260006117a86020830184613374565b600080604083850312156133c657600080fd5b6133cf836131db565b946020939093013593505050565b6000602082840312156133ef57600080fd5b6117a8826131db565b6001600160a01b03811681146111a557600080fd5b6000806040838503121561342057600080fd5b82356133cf816133f8565b60008060006060848603121561344057600080fd5b833561344b816133f8565b9250602084013561345b816133f8565b929592945050506040919091013590565b803580151581146131ed57600080fd5b600080600080600060a0868803121561349457600080fd5b61349d866131db565b945060208601356001600160401b03808211156134b957600080fd5b6134c589838a0161325f565b9550604088013594506134da6060890161346c565b935060808801359150808211156134f057600080fd5b506134fd8882890161325f565b9150509295509295909350565b60008083601f84011261351c57600080fd5b5081356001600160401b0381111561353357600080fd5b60208301915083602082850101111561354b57600080fd5b9250929050565b60008060006040848603121561356757600080fd5b613570846131db565b925060208401356001600160401b0381111561358b57600080fd5b6135978682870161350a565b9497909650939450505050565b600080600080600080600060e0888a0312156135bf57600080fd5b87356135ca816133f8565b96506135d8602089016131db565b955060408801356001600160401b03808211156135f457600080fd5b6136008b838c0161325f565b965060608a0135955060808a01359150613619826133f8565b90935060a08901359061362b826133f8565b90925060c0890135908082111561364157600080fd5b5061364e8a828b0161325f565b91505092959891949750929550565b60006020828403121561366f57600080fd5b81356117a8816133f8565b60008060006060848603121561368f57600080fd5b613698846131db565b925060208401356001600160401b038111156136b357600080fd5b6136bf8682870161325f565b9250506136ce604085016132b5565b90509250925092565b6000806000606084860312156136ec57600080fd5b6136f5846131db565b95602085013595506040909401359392505050565b60008060008060008060c0878903121561372357600080fd5b863561372e816133f8565b95506020870135945060408701359350606087013560ff8116811461375257600080fd5b9598949750929560808101359460a0909101359350915050565b60008060008060006080868803121561378457600080fd5b61378d866131db565b945061379b602087016131db565b93506040860135925060608601356001600160401b038111156137bd57600080fd5b6137c98882890161350a565b969995985093965092949392505050565b600080604083850312156137ed57600080fd5b82356137f8816133f8565b91506020830135613808816133f8565b809150509250929050565b60006020828403121561382557600080fd5b6117a88261346c565b6000806040838503121561384157600080fd5b823561384c816133f8565b9150602083013563ffffffff8116811461380857600080fd5b6000806000806080858703121561387b57600080fd5b613884856131db565b9350613892602086016131db565b925060408501356138a2816133f8565b9396929550929360600135925050565b600181811c908216806138c657607f821691505b6020821081036138e657634e487b7160e01b600052602260045260246000fd5b50919050565b6040815260006138ff6040830185613374565b90508260208301529392505050565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061393c90830186613374565b841515606084015282810360808401526139568185613374565b98975050505050505050565b6000806040838503121561397557600080fd5b505080516020909101519092909150565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611e26604083018486613996565b634e487b7160e01b600052601160045260246000fd5b63ffffffff828116828216039080821115613a1057613a106139dd565b5092915050565b600063ffffffff80841680613a3c57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600060018201613a5a57613a5a6139dd565b5060010190565b600061ffff808816835280871660208401525084604083015260806060830152613a8f608083018486613996565b979650505050505050565b60008251613aac818460208701613350565b9190910192915050565b601f82111561223f57600081815260208120601f850160051c81016020861015613add5750805b601f850160051c820191505b81811015611a9757828155600101613ae9565b6001600160401b03831115613b1357613b136131f2565b613b2783613b2183546138b2565b83613ab6565b6000601f841160018114613b5b5760008515613b435750838201355b600019600387901b1c1916600186901b178355610ba1565b600083815260209020601f19861690835b82811015613b8c5786850135825560209485019460019092019101613b6c565b5086821015613ba95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600082601f830112613bcc57600080fd5b8151613bda61327e82613238565b818152846020838601011115613bef57600080fd5b611feb826020830160208701613350565b600060208284031215613c1257600080fd5b81516001600160401b03811115613c2857600080fd5b611feb84828501613bbb565b61ffff85168152608060208201526000613c516080830186613374565b6001600160401b03851660408401528281036060840152613a8f8185613374565b6001600160601b03828116828216039080821115613a1057613a106139dd565b6001600160601b03818116838216019080821115613a1057613a106139dd565b60008060408385031215613cc557600080fd5b82516001600160401b03811115613cdb57600080fd5b613ce785828601613bbb565b925050602083015190509250929050565b80820180821115610ce457610ce46139dd565b61ffff8716815260c060208201526000613d2860c0830188613374565b8281036040840152613d3a8188613374565b6001600160a01b0387811660608601528616608085015283810360a08501529050613d658185613374565b9998505050505050505050565b63ffffffff818116838216019080821115613a1057613a106139dd565b81810381811115610ce457610ce46139dd56fe43706f6f6c3a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f777343706f6f6c3a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a5f7370656e64416c6c6f77616e63653a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a696e637265617365416c6c6f77616e63653a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a5f6275726e3a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a617070726f76653a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747343706f6f6c3a3a7472616e736665723a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a6465637265617365416c6c6f77616e63653a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f777343706f6f6c3a3a696e637265617365416c6c6f77616e63653a207472616e7366657220616d6f756e74206f766572666c6f777343706f6f6c3a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e636543706f6f6c3a3a6465637265617365416c6c6f77616e63653a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a5f6d696e743a20766f746520616d6f756e74206f766572666c6f777343706f6f6c3a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773a2646970667358221220d325f84d0ffd2c1651342fcfb47f38adae0af1eaf13a8505476da948d47a3b1f64736f6c63430008110033000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Deployed Bytecode
0x60806040526004361061027c5760003560e01c80637533d7881161014f578063b4b5ea57116100c1578063eab45d9c1161007a578063eab45d9c146108f3578063eb8d72b714610913578063ed629c5c14610933578063f1127ed81461094d578063f2fde38b146109c1578063f5ecbdbc146109e157600080fd5b8063b4b5ea57146107fd578063c3cda5201461081d578063cbed8b9c1461083d578063d1deba1f1461085d578063dd62ed3e14610870578063e7a324dc146108bf57600080fd5b806395d89b411161011357806395d89b41146107235780639b57db5f14610754578063a457c2d714610774578063a9059cbb14610794578063af3fb21c146107b4578063b353aaa7146107c957600080fd5b80637533d7881461066b578063782d6fe11461068b5780637ecebe00146106c35780638da5cb5b146106f05780639358928b1461070e57600080fd5b806339509351116101f35780635b8c41e6116101ac5780635b8c41e6146105405780635c19a95c1461058f57806366ad5c8a146105af5780636fcfff45146105cf57806370a0823114610617578063715018a61461065657600080fd5b8063395093511461046a5780633d8b38f61461048a57806342d65a8d146104aa57806344770515146104ca57806351905636146104df578063587cde1e146104f257600080fd5b806310ddb1371161024557806310ddb1371461038457806318160ddd146103a457806320606b70146103ba57806323b872dd146103ee5780632a205e3d1461040e578063313ce5671461044357600080fd5b80621d35671461028157806306fdde03146102a357806307810867146102ee57806307e0db1714610334578063095ea7b314610354575b600080fd5b34801561028d57600080fd5b506102a161029c3660046132cc565b610a01565b005b3480156102af57600080fd5b506102d86040518060400160405280600981526020016810db19585c9c1bdbdb60ba1b81525081565b6040516102e591906133a0565b60405180910390f35b3480156102fa57600080fd5b506103266103093660046133b3565b600960209081526000928352604080842090915290825290205481565b6040519081526020016102e5565b34801561034057600080fd5b506102a161034f3660046133dd565b610ba8565b34801561036057600080fd5b5061037461036f36600461340d565b610c2a565b60405190151581526020016102e5565b34801561039057600080fd5b506102a161039f3660046133dd565b610cea565b3480156103b057600080fd5b5061032660005481565b3480156103c657600080fd5b506103267f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156103fa57600080fd5b5061037461040936600461342b565b610d42565b34801561041a57600080fd5b5061042e61042936600461347c565b610e87565b604080519283526020830191909152016102e5565b34801561044f57600080fd5b50610458601281565b60405160ff90911681526020016102e5565b34801561047657600080fd5b5061037461048536600461340d565b610f52565b34801561049657600080fd5b506103746104a5366004613552565b611031565b3480156104b657600080fd5b506102a16104c5366004613552565b6110fd565b3480156104d657600080fd5b50610326600081565b6102a16104ed3660046135a4565b61118c565b3480156104fe57600080fd5b5061052861050d36600461365d565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102e5565b34801561054c57600080fd5b5061032661055b36600461367a565b600a602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561059b57600080fd5b506102a16105aa36600461365d565b61119b565b3480156105bb57600080fd5b506102a16105ca3660046132cc565b6111a8565b3480156105db57600080fd5b506106026105ea36600461365d565b60056020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016102e5565b34801561062357600080fd5b5061032661063236600461365d565b6001600160a01b03166000908152600260205260409020546001600160601b031690565b34801561066257600080fd5b506102a1611218565b34801561067757600080fd5b506102d86106863660046133dd565b61122c565b34801561069757600080fd5b506106ab6106a636600461340d565b6112c6565b6040516001600160601b0390911681526020016102e5565b3480156106cf57600080fd5b506103266106de36600461365d565b60066020526000908152604090205481565b3480156106fc57600080fd5b506007546001600160a01b0316610528565b34801561071a57600080fd5b50600054610326565b34801561072f57600080fd5b506102d86040518060400160405280600581526020016410d413d3d360da1b81525081565b34801561076057600080fd5b506102a161076f3660046136d7565b611551565b34801561078057600080fd5b5061037461078f36600461340d565b6115ca565b3480156107a057600080fd5b506103746107af36600461340d565b6116f5565b3480156107c057600080fd5b50610326600181565b3480156107d557600080fd5b506105287f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd781565b34801561080957600080fd5b506106ab61081836600461365d565b611731565b34801561082957600080fd5b506102a161083836600461370a565b6117af565b34801561084957600080fd5b506102a161085836600461376c565b611a9f565b6102a161086b3660046132cc565b611b34565b34801561087c57600080fd5b5061032661088b3660046137da565b6001600160a01b0391821660009081526001602090815260408083209390941682529190915220546001600160601b031690565b3480156108cb57600080fd5b506103267fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b3480156108ff57600080fd5b506102a161090e366004613813565b611c86565b34801561091f57600080fd5b506102a161092e366004613552565b611ca1565b34801561093f57600080fd5b50600b546103749060ff1681565b34801561095957600080fd5b5061099d61096836600461382e565b600460209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6040805163ffffffff90931683526001600160601b039091166020830152016102e5565b3480156109cd57600080fd5b506102a16109dc36600461365d565b611d08565b3480156109ed57600080fd5b506102d86109fc366004613865565b611d7e565b337f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b031614610a7e5760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff841660009081526008602052604081208054610a9c906138b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac8906138b2565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b5050505050905080518451148015610b3a575080805190602001208480519060200120145b610b955760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610a75565b610ba185858585611e2f565b5050505050565b610bb0611f20565b6040516307e0db1760e01b815261ffff821660048201527f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b0316906307e0db17906024015b600060405180830381600087803b158015610c1657600080fd5b505af1158015610ba1573d6000803e3d6000fd5b6000806000198303610c4457506001600160601b03610c69565b610c6683604051806060016040528060268152602001613e9660269139611f7a565b90505b3360008181526001602090815260408083206001600160a01b0389168085529083529281902080546001600160601b0319166001600160601b03871690811790915590519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a360019150505b92915050565b610cf2611f20565b6040516310ddb13760e01b815261ffff821660048201527f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b0316906310ddb13790602401610bfc565b6001600160a01b03831660009081526001602090815260408083203380855290835281842054825160608101909352602680845291936001600160601b03909116928592610d9a9288929190613e9690830139611f7a565b9050866001600160a01b0316836001600160a01b031614158015610dc757506001600160601b0382811614155b15610e6f576000610df183836040518060600160405280603e8152602001613fb5603e9139611fa9565b6001600160a01b038981166000818152600160209081526040808320948a168084529482529182902080546001600160601b0319166001600160601b0387169081179091559151918252939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b610e7a878783611ff3565b5060019695505050505050565b60008060008686604051602001610e9f9291906138ec565b60408051601f198184030181529082905263040a7bb160e41b825291506001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd716906340a7bb1090610f03908b90309086908b908b9060040161390e565b6040805180830381865afa158015610f1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f439190613962565b92509250509550959350505050565b6000803390506000610f7c84604051806060016040528060308152602001613e3960309139611f7a565b6001600160a01b038084166000908152600160209081526040808320938a16835292815290829020548251606081019093526033808452939450610fd7936001600160601b03909116928592909190613f8290830139612244565b6001600160a01b038381166000908152600160209081526040808320938a1683529290522080546001600160601b0319166001600160601b039290921691821790556110269083908790612291565b506001949350505050565b61ffff831660009081526008602052604081208054829190611052906138b2565b80601f016020809104026020016040519081016040528092919081815260200182805461107e906138b2565b80156110cb5780601f106110a0576101008083540402835291602001916110cb565b820191906000526020600020905b8154815290600101906020018083116110ae57829003601f168201915b5050505050905083836040516110e2929190613986565b60405180910390208180519060200120149150509392505050565b611105611f20565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd716906342d65a8d90611155908690869086906004016139bf565b600060405180830381600087803b15801561116f57600080fd5b505af1158015611183573d6000803e3d6000fd5b50505050505050565b611183878787878787876123d2565b6111a533826124f4565b50565b3330146112065760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610a75565b61121284848484612578565b50505050565b611220611f20565b61122a600061260b565b565b60086020526000908152604090208054611245906138b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611271906138b2565b80156112be5780601f10611293576101008083540402835291602001916112be565b820191906000526020600020905b8154815290600101906020018083116112a157829003601f168201915b505050505081565b60004382106113285760405162461bcd60e51b815260206004820152602860248201527f43706f6f6c3a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b6064820152608401610a75565b6001600160a01b03831660009081526005602052604081205463ffffffff1690819003611359576000915050610ce4565b6001600160a01b0384166000908152600460205260408120849161137e6001856139f3565b63ffffffff908116825260208201929092526040016000205416116113f1576001600160a01b0384166000908152600460205260408120906113c16001846139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03169150610ce49050565b6001600160a01b038416600090815260046020908152604080832083805290915290205463ffffffff1683101561142c576000915050610ce4565b60008061143a6001846139f3565b90505b8163ffffffff168163ffffffff16111561150c576000600261145f84846139f3565b6114699190613a17565b61147390836139f3565b6001600160a01b038816600090815260046020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b0316918101919091529192508790036114e057602001519450610ce49350505050565b805163ffffffff168711156114f757819350611505565b6115026001836139f3565b92505b505061143d565b506001600160a01b038516600090815260046020908152604080832063ffffffff909416835292905220546001600160601b03600160201b9091041691505092915050565b611559611f20565b600081116115a95760405162461bcd60e51b815260206004820152601c60248201527f4c7a4170703a20696e76616c6964205f647374476173416d6f756e74000000006044820152606401610a75565b61ffff90921660009081526009602090815260408083209383529290522055565b60008033905060006115f484604051806060016040528060308152602001613ff360309139611f7a565b6001600160a01b038084166000908152600160209081526040808320938a16835292905220549091506001600160601b038083169116101561169e5760405162461bcd60e51b815260206004820152603760248201527f43706f6f6c3a3a6465637265617365416c6c6f77616e6365206465637265617360448201527f656420616c6c6f77616e63652062656c6f77207a65726f0000000000000000006064820152608401610a75565b6001600160a01b038083166000908152600160209081526040808320938916835292815290829020548251606081019093526039808452610fd7936001600160601b039092169285929190613f1890830139611fa9565b60008061171a83604051806060016040528060278152602001613ef160279139611f7a565b9050611727338583611ff3565b5060019392505050565b6001600160a01b03811660009081526005602052604081205463ffffffff168061175c5760006117a8565b6001600160a01b0383166000908152600460205260408120906117806001846139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03165b9392505050565b604080518082018252600981526810db19585c9c1bdbdb60ba1b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f1aaf9fe34ecc35e358819133cb31a70bb3dc486165a31aa4a1ee9fd469ea36bd81840152466060820152306080808301919091528351808303909101815260a0820184528051908301207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08301526001600160a01b038a1660e083015261010082018990526101208083018990528451808403909101815261014083019094528351939092019290922061190160f01b6101608401526101628301829052610182830181905290916000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611933573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166119a65760405162461bcd60e51b815260206004820152602760248201527f43706f6f6c3a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b6064820152608401610a75565b6001600160a01b03811660009081526006602052604081208054916119ca83613a48565b919050558914611a285760405162461bcd60e51b815260206004820152602360248201527f43706f6f6c3a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b6064820152608401610a75565b87421115611a885760405162461bcd60e51b815260206004820152602760248201527f43706f6f6c3a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b6064820152608401610a75565b611a92818b6124f4565b505050505b505050505050565b611aa7611f20565b6040516332fb62e760e21b81526001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7169063cbed8b9c90611afb9088908890889088908890600401613a61565b600060405180830381600087803b158015611b1557600080fd5b505af1158015611b29573d6000803e3d6000fd5b505050505050505050565b61ffff84166000908152600a60205260408082209051611b55908690613a9a565b90815260408051602092819003830190206001600160401b03861660009081529252902054905080611bd55760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610a75565b815160208301208114611c345760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610a75565b61ffff85166000908152600a60205260408082209051611c55908790613a9a565b90815260408051602092819003830190206001600160401b03871660009081529252902055610ba185858585612578565b611c8e611f20565b600b805460ff1916911515919091179055565b611ca9611f20565b61ffff83166000908152600860205260409020611cc7828483613afc565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611cfb939291906139bf565b60405180910390a1505050565b611d10611f20565b6001600160a01b038116611d755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a75565b6111a58161260b565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd76001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e269190810190613c00565b95945050505050565b604051633356ae4560e11b815230906366ad5c8a90611e58908790879087908790600401613c34565b600060405180830381600087803b158015611e7257600080fd5b505af1925050508015611e83575060015b611212578080519060200120600a60008661ffff1661ffff16815260200190815260200160002084604051611eb89190613a9a565b9081526040805191829003602090810183206001600160401b0387166000908152915220919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90611f13908690869086908690613c34565b60405180910390a1611212565b6007546001600160a01b0316331461122a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a75565b600081600160601b8410611fa15760405162461bcd60e51b8152600401610a7591906133a0565b509192915050565b6000836001600160601b0316836001600160601b031611158290611fe05760405162461bcd60e51b8152600401610a7591906133a0565b50611feb8385613c72565b949350505050565b6001600160a01b03831661206f5760405162461bcd60e51b815260206004820152603d60248201527f43706f6f6c3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460448201527f72616e736665722066726f6d20746865207a65726f20616464726573730000006064820152608401610a75565b6001600160a01b0382166120eb5760405162461bcd60e51b815260206004820152603b60248201527f43706f6f6c3a3a5f7472616e73666572546f6b656e733a2063616e6e6f74207460448201527f72616e7366657220746f20746865207a65726f206164647265737300000000006064820152608401610a75565b6001600160a01b038316600090815260026020908152604091829020548251606081019093526037808452612136936001600160601b039092169285929190613dcb90830139611fa9565b6001600160a01b03848116600090815260026020908152604080832080546001600160601b0319166001600160601b0396871617905592861682529082902054825160608101909352603180845261219e9491909116928592909190613f5190830139612244565b6001600160a01b0383811660008181526002602090815260409182902080546001600160601b0319166001600160601b03968716179055905193851684529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36001600160a01b0380841660009081526003602052604080822054858416835291205461223f9291821691168361265d565b505050565b6000806122518486613c92565b9050846001600160601b0316816001600160601b0316101583906122885760405162461bcd60e51b8152600401610a7591906133a0565b50949350505050565b6001600160a01b0383166122f55760405162461bcd60e51b815260206004820152602560248201527f43706f6f6c3a3a5f617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a75565b6001600160a01b0382166123575760405162461bcd60e51b815260206004820152602360248201527f43706f6f6c3a3a5f617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a75565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080546001600160601b0319166001600160601b03871690811790915591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6123de87878787612809565b600085856040516020016123f39291906138ec565b60408051601f19818403018152919052600b5490915060ff16156124245761241f87600184600061282f565b61247f565b81511561247f5760405162461bcd60e51b8152602060048201526024808201527f4c7a4170703a205f61646170746572506172616d73206d75737420626520656d604482015263383a3c9760e11b6064820152608401610a75565b61248c878286868661290c565b8560405161249a9190613a9a565b60405180910390208761ffff16896001600160a01b03167f4a7c7bd7b3092a14241ec8138800e06869d4bf7ce2d955d6ada58e5ff3268a0a886040516124e291815260200190565b60405180910390a45050505050505050565b6001600160a01b03808316600081815260036020818152604080842080546002845282862054949093528787166001600160a01b031984168117909155905191909516946001600160601b039092169391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461121282848361265d565b6000808280602001905181019061258f9190613cb2565b601482015191935091506125a4878284612aa5565b806001600160a01b0316866040516125bc9190613a9a565b60405180910390208861ffff167f776434b505c7beb3db155c58df6c88985bf7c31730767e43ec773005059fed7a856040516125fa91815260200190565b60405180910390a450505050505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415801561268857506000816001600160601b0316115b1561223f576001600160a01b0383161561274d576001600160a01b03831660009081526005602052604081205463ffffffff1690816126c8576000612714565b6001600160a01b0385166000908152600460205260408120906126ec6001856139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03165b9050600061273b828560405180606001604052806029815260200161404660299139611fa9565b905061274986848484612aaf565b5050505b6001600160a01b0382161561223f576001600160a01b03821660009081526005602052604081205463ffffffff1690816127885760006127d4565b6001600160a01b0384166000908152600460205260408120906127ac6001856139f3565b63ffffffff168152602081019190915260400160002054600160201b90046001600160601b03165b905060006127fb8285604051806060016040528060288152602001613da360289139612244565b9050611a9785848484612aaf565b336001600160a01b038516811461282557612825858284612ca7565b610ba18583612e5f565b600061283c836022015190565b61ffff861660009081526009602090815260408083208884529091528120549192509061286a908490613cf8565b9050600081116128bc5760405162461bcd60e51b815260206004820152601a60248201527f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000006044820152606401610a75565b80821015611a975760405162461bcd60e51b815260206004820152601b60248201527f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000006044820152606401610a75565b61ffff85166000908152600860205260408120805461292a906138b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612956906138b2565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b505050505090508051600003612a145760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610a75565b60405162c5803160e81b81526001600160a01b037f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7169063c5803100903490612a6b908a9086908b908b908b908b90600401613d0b565b6000604051808303818588803b158015612a8457600080fd5b505af1158015612a98573d6000803e3d6000fd5b5050505050505050505050565b61223f828261304f565b6000612ad343604051806060016040528060358152602001613ebc603591396131b4565b905060008463ffffffff16118015612b2d57506001600160a01b038516600090815260046020526040812063ffffffff831691612b116001886139f3565b63ffffffff908116825260208201929092526040016000205416145b15612ba1576001600160a01b03851660009081526004602052604081208391612b576001886139f3565b63ffffffff168152602081019190915260400160002080546001600160601b0392909216600160201b026fffffffffffffffffffffffff0000000019909216919091179055612c52565b60408051808201825263ffffffff80841682526001600160601b0380861660208085019182526001600160a01b038b166000908152600482528681208b8616825290915294909420925183549451909116600160201b026fffffffffffffffffffffffffffffffff19909416911617919091179055612c21846001613d72565b6001600160a01b0386166000908152600560205260409020805463ffffffff191663ffffffff929092169190911790555b604080516001600160601b038086168252841660208201526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000612ccb82604051806060016040528060278152602001613ef160279139611f7a565b9050836001600160a01b0316836001600160a01b031614158015612d1e57506001600160a01b038085166000908152600160209081526040808320938716835292905220546001600160601b0390811614155b15611212576001600160a01b038085166000908152600160209081526040808320938716835292905220546001600160601b0380831691161015612db95760405162461bcd60e51b815260206004820152602c60248201527f43706f6f6c3a3a7370656e64416c6c6f77616e636520696e737566666963696560448201526b6e7420616c6c6f77616e636560a01b6064820152608401610a75565b6001600160a01b038085166000908152600160209081526040808320938716835292815290829020548251606081019093526037808452612e10936001600160601b039092169285929190613e0290830139611fa9565b6001600160a01b03858116600090815260016020908152604080832093881683529290522080546001600160601b0319166001600160601b039290921691821790556112129085908590612291565b6001600160a01b038216612ecd5760405162461bcd60e51b815260206004820152602f60248201527f43706f6f6c3a3a5f6275726e3a2063616e6e6f74206275726e2066726f6d207460448201526e6865207a65726f206164647265737360881b6064820152608401610a75565b6000612ef182604051806060016040528060278152602001613ef160279139611f7a565b6001600160a01b0384166000908152600260205260409020549091506001600160601b0380831691161015612f735760405162461bcd60e51b815260206004820152602260248201527f43706f6f6c3a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a75565b6001600160a01b03831660009081526002602090815260409182902054825160608101909352602d808452612fbe936001600160601b039092169285929190613e6990830139611fa9565b6001600160a01b038416600090815260026020526040812080546001600160601b0319166001600160601b039384161790558054918316918190613003908490613d8f565b90915550506040516001600160601b03821681526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016123c5565b6001600160a01b0382166130bd5760405162461bcd60e51b815260206004820152602f60248201527f43706f6f6c3a3a5f6d696e743a2063616e6e6f74206d696e742066726f6d207460448201526e6865207a65726f206164647265737360881b6064820152608401610a75565b60006130e182604051806060016040528060278152602001613ef160279139611f7a565b9050806001600160601b03166000808282546130fd9190613cf8565b90915550506001600160a01b03831660009081526002602090815260409182902054825160608101909352602380845261314d936001600160601b03909216928592919061402390830139612244565b6001600160a01b038416600081815260026020908152604080832080546001600160601b0319166001600160601b03968716179055519385168452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016123c5565b600081600160201b8410611fa15760405162461bcd60e51b8152600401610a7591906133a0565b803561ffff811681146131ed57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613230576132306131f2565b604052919050565b60006001600160401b03821115613251576132516131f2565b50601f01601f191660200190565b600082601f83011261327057600080fd5b813561328361327e82613238565b613208565b81815284602083860101111561329857600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160401b03811681146131ed57600080fd5b600080600080608085870312156132e257600080fd5b6132eb856131db565b935060208501356001600160401b038082111561330757600080fd5b6133138883890161325f565b9450613321604088016132b5565b9350606087013591508082111561333757600080fd5b506133448782880161325f565b91505092959194509250565b60005b8381101561336b578181015183820152602001613353565b50506000910152565b6000815180845261338c816020860160208601613350565b601f01601f19169290920160200192915050565b6020815260006117a86020830184613374565b600080604083850312156133c657600080fd5b6133cf836131db565b946020939093013593505050565b6000602082840312156133ef57600080fd5b6117a8826131db565b6001600160a01b03811681146111a557600080fd5b6000806040838503121561342057600080fd5b82356133cf816133f8565b60008060006060848603121561344057600080fd5b833561344b816133f8565b9250602084013561345b816133f8565b929592945050506040919091013590565b803580151581146131ed57600080fd5b600080600080600060a0868803121561349457600080fd5b61349d866131db565b945060208601356001600160401b03808211156134b957600080fd5b6134c589838a0161325f565b9550604088013594506134da6060890161346c565b935060808801359150808211156134f057600080fd5b506134fd8882890161325f565b9150509295509295909350565b60008083601f84011261351c57600080fd5b5081356001600160401b0381111561353357600080fd5b60208301915083602082850101111561354b57600080fd5b9250929050565b60008060006040848603121561356757600080fd5b613570846131db565b925060208401356001600160401b0381111561358b57600080fd5b6135978682870161350a565b9497909650939450505050565b600080600080600080600060e0888a0312156135bf57600080fd5b87356135ca816133f8565b96506135d8602089016131db565b955060408801356001600160401b03808211156135f457600080fd5b6136008b838c0161325f565b965060608a0135955060808a01359150613619826133f8565b90935060a08901359061362b826133f8565b90925060c0890135908082111561364157600080fd5b5061364e8a828b0161325f565b91505092959891949750929550565b60006020828403121561366f57600080fd5b81356117a8816133f8565b60008060006060848603121561368f57600080fd5b613698846131db565b925060208401356001600160401b038111156136b357600080fd5b6136bf8682870161325f565b9250506136ce604085016132b5565b90509250925092565b6000806000606084860312156136ec57600080fd5b6136f5846131db565b95602085013595506040909401359392505050565b60008060008060008060c0878903121561372357600080fd5b863561372e816133f8565b95506020870135945060408701359350606087013560ff8116811461375257600080fd5b9598949750929560808101359460a0909101359350915050565b60008060008060006080868803121561378457600080fd5b61378d866131db565b945061379b602087016131db565b93506040860135925060608601356001600160401b038111156137bd57600080fd5b6137c98882890161350a565b969995985093965092949392505050565b600080604083850312156137ed57600080fd5b82356137f8816133f8565b91506020830135613808816133f8565b809150509250929050565b60006020828403121561382557600080fd5b6117a88261346c565b6000806040838503121561384157600080fd5b823561384c816133f8565b9150602083013563ffffffff8116811461380857600080fd5b6000806000806080858703121561387b57600080fd5b613884856131db565b9350613892602086016131db565b925060408501356138a2816133f8565b9396929550929360600135925050565b600181811c908216806138c657607f821691505b6020821081036138e657634e487b7160e01b600052602260045260246000fd5b50919050565b6040815260006138ff6040830185613374565b90508260208301529392505050565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061393c90830186613374565b841515606084015282810360808401526139568185613374565b98975050505050505050565b6000806040838503121561397557600080fd5b505080516020909101519092909150565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611e26604083018486613996565b634e487b7160e01b600052601160045260246000fd5b63ffffffff828116828216039080821115613a1057613a106139dd565b5092915050565b600063ffffffff80841680613a3c57634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b600060018201613a5a57613a5a6139dd565b5060010190565b600061ffff808816835280871660208401525084604083015260806060830152613a8f608083018486613996565b979650505050505050565b60008251613aac818460208701613350565b9190910192915050565b601f82111561223f57600081815260208120601f850160051c81016020861015613add5750805b601f850160051c820191505b81811015611a9757828155600101613ae9565b6001600160401b03831115613b1357613b136131f2565b613b2783613b2183546138b2565b83613ab6565b6000601f841160018114613b5b5760008515613b435750838201355b600019600387901b1c1916600186901b178355610ba1565b600083815260209020601f19861690835b82811015613b8c5786850135825560209485019460019092019101613b6c565b5086821015613ba95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600082601f830112613bcc57600080fd5b8151613bda61327e82613238565b818152846020838601011115613bef57600080fd5b611feb826020830160208701613350565b600060208284031215613c1257600080fd5b81516001600160401b03811115613c2857600080fd5b611feb84828501613bbb565b61ffff85168152608060208201526000613c516080830186613374565b6001600160401b03851660408401528281036060840152613a8f8185613374565b6001600160601b03828116828216039080821115613a1057613a106139dd565b6001600160601b03818116838216019080821115613a1057613a106139dd565b60008060408385031215613cc557600080fd5b82516001600160401b03811115613cdb57600080fd5b613ce785828601613bbb565b925050602083015190509250929050565b80820180821115610ce457610ce46139dd565b61ffff8716815260c060208201526000613d2860c0830188613374565b8281036040840152613d3a8188613374565b6001600160a01b0387811660608601528616608085015283810360a08501529050613d658185613374565b9998505050505050505050565b63ffffffff818116838216019080821115613a1057613a106139dd565b81810381811115610ce457610ce46139dd56fe43706f6f6c3a3a5f6d6f7665566f7465733a20766f746520616d6f756e74206f766572666c6f777343706f6f6c3a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a5f7370656e64416c6c6f77616e63653a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a696e637265617365416c6c6f77616e63653a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a5f6275726e3a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a617070726f76653a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747343706f6f6c3a3a7472616e736665723a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a6465637265617365416c6c6f77616e63653a207472616e7366657220616d6f756e7420657863656564732062616c616e636543706f6f6c3a3a5f7472616e73666572546f6b656e733a207472616e7366657220616d6f756e74206f766572666c6f777343706f6f6c3a3a696e637265617365416c6c6f77616e63653a207472616e7366657220616d6f756e74206f766572666c6f777343706f6f6c3a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e636543706f6f6c3a3a6465637265617365416c6c6f77616e63653a20616d6f756e742065786365656473203936206269747343706f6f6c3a3a5f6d696e743a20766f746520616d6f756e74206f766572666c6f777343706f6f6c3a3a5f6d6f7665566f7465733a20766f746520616d6f756e7420756e646572666c6f7773a2646970667358221220d325f84d0ffd2c1651342fcfb47f38adae0af1eaf13a8505476da948d47a3b1f64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0xb6319cC6c8c27A8F5dAF0dD3DF91EA35C4720dd7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MNT
Multichain Portfolio | 34 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.