Overview
ETH Balance
0.00217265 ETH
ETH Value
$5.25 (@ $2,417.25/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 21,326 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact ETH F... | 126520288 | 2 hrs ago | IN | 0.000051 ETH | 0.000000270199 | ||||
Swap Exact ETH F... | 126520277 | 2 hrs ago | IN | 0.000051 ETH | 0.000000272032 | ||||
Swap Exact ETH F... | 126520267 | 2 hrs ago | IN | 0.000051 ETH | 0.00000028077 | ||||
Swap Exact ETH F... | 126520256 | 2 hrs ago | IN | 0.000051 ETH | 0.000000264645 | ||||
Swap Exact ETH F... | 126520245 | 2 hrs ago | IN | 0.000051 ETH | 0.000000249146 | ||||
Swap Exact ETH F... | 126520234 | 2 hrs ago | IN | 0.000051 ETH | 0.000000252207 | ||||
Swap Exact ETH F... | 126520221 | 2 hrs ago | IN | 0.000051 ETH | 0.000000252783 | ||||
Swap Exact ETH F... | 126520210 | 2 hrs ago | IN | 0.000051 ETH | 0.000000257383 | ||||
Swap Exact ETH F... | 126520195 | 2 hrs ago | IN | 0.000051 ETH | 0.000000255838 | ||||
Swap Exact ETH F... | 126520184 | 2 hrs ago | IN | 0.000051 ETH | 0.000000258593 | ||||
Swap Exact ETH F... | 126520174 | 2 hrs ago | IN | 0.000051 ETH | 0.000000266061 | ||||
Swap Exact ETH F... | 126520165 | 2 hrs ago | IN | 0.000051 ETH | 0.000000277716 | ||||
Swap Exact ETH F... | 126520146 | 2 hrs ago | IN | 0.000051 ETH | 0.000000251131 | ||||
Swap Exact ETH F... | 126520135 | 2 hrs ago | IN | 0.000051 ETH | 0.000000254537 | ||||
Swap Exact ETH F... | 126520124 | 2 hrs ago | IN | 0.000051 ETH | 0.00000025749 | ||||
Swap Exact ETH F... | 126520115 | 3 hrs ago | IN | 0.000051 ETH | 0.000000251307 | ||||
Swap Exact ETH F... | 126520095 | 3 hrs ago | IN | 0.000051 ETH | 0.000000260458 | ||||
Swap Exact ETH F... | 126520084 | 3 hrs ago | IN | 0.000051 ETH | 0.000000264043 | ||||
Swap Exact ETH F... | 126520074 | 3 hrs ago | IN | 0.000051 ETH | 0.000000267593 | ||||
Swap Exact ETH F... | 126520061 | 3 hrs ago | IN | 0.000051 ETH | 0.000000272589 | ||||
Swap Exact ETH F... | 126520047 | 3 hrs ago | IN | 0.000051 ETH | 0.00000027575 | ||||
Swap Exact ETH F... | 126520037 | 3 hrs ago | IN | 0.000051 ETH | 0.000000264872 | ||||
Swap Exact ETH F... | 126520027 | 3 hrs ago | IN | 0.000051 ETH | 0.000000248423 | ||||
Swap Exact ETH F... | 126520011 | 3 hrs ago | IN | 0.000051 ETH | 0.000000253421 | ||||
Swap Exact ETH F... | 126520001 | 3 hrs ago | IN | 0.000051 ETH | 0.000000248862 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
126520288 | 2 hrs ago | 0.000051 ETH | ||||
126520277 | 2 hrs ago | 0.000051 ETH | ||||
126520267 | 2 hrs ago | 0.000051 ETH | ||||
126520256 | 2 hrs ago | 0.000051 ETH | ||||
126520245 | 2 hrs ago | 0.000051 ETH | ||||
126520234 | 2 hrs ago | 0.000051 ETH | ||||
126520221 | 2 hrs ago | 0.000051 ETH | ||||
126520210 | 2 hrs ago | 0.000051 ETH | ||||
126520195 | 2 hrs ago | 0.000051 ETH | ||||
126520184 | 2 hrs ago | 0.000051 ETH | ||||
126520174 | 2 hrs ago | 0.000051 ETH | ||||
126520165 | 2 hrs ago | 0.000051 ETH | ||||
126520146 | 2 hrs ago | 0.000051 ETH | ||||
126520135 | 2 hrs ago | 0.000051 ETH | ||||
126520124 | 2 hrs ago | 0.000051 ETH | ||||
126520115 | 3 hrs ago | 0.000051 ETH | ||||
126520095 | 3 hrs ago | 0.000051 ETH | ||||
126520084 | 3 hrs ago | 0.000051 ETH | ||||
126520074 | 3 hrs ago | 0.000051 ETH | ||||
126520061 | 3 hrs ago | 0.000051 ETH | ||||
126520047 | 3 hrs ago | 0.000051 ETH | ||||
126520037 | 3 hrs ago | 0.000051 ETH | ||||
126520027 | 3 hrs ago | 0.000051 ETH | ||||
126520011 | 3 hrs ago | 0.000051 ETH | ||||
126520001 | 3 hrs ago | 0.000051 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TokenSlave
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 100 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {SlaveTokenBase} from "./lib/SlaveTokenBase.sol"; contract TokenSlave is SlaveTokenBase { constructor( address _vizingPad, uint64 _masterChainId ) SlaveTokenBase("Orbit Guy", "ORBGUY", _vizingPad, address(0), _masterChainId) {} }
// 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) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// 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 (last updated v4.9.4) (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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageStruct} from "./IMessageStruct.sol"; interface IMessageChannel is IMessageStruct { /* /// @notice LaunchPad is the function that user or DApps send omni-chain message to other chain /// Once the message is sent, the Relay will validate the message and send it to the target chain /// @dev 1. we will call the LaunchPad.Launch function to emit the message /// @dev 2. the message will be sent to the destination chain /// @param earliestArrivalTimestamp The earliest arrival time for the message /// set to 0, vizing will forward the information ASAP. /// @param latestArrivalTimestamp The latest arrival time for the message /// set to 0, vizing will forward the information ASAP. /// @param relayer the specify relayer for your message /// set to 0, all the relayers will be able to forward the message /// @param sender The sender address for the message /// most likely the address of the EOA, the user of some DApps /// @param value native token amount, will be sent to the target contract /// @param destChainid The destination chain id for the message /// @param additionParams The addition params for the message /// if not in expert mode, set to 0 (`new bytes(0)`) /// @param message Arbitrary information /// /// bytes /// message = abi.encodePacked( /// byte1 uint256 uint24 uint64 bytes /// messageType, activateContract, executeGasLimit, maxFeePerGas, signature /// ) /// */ function Launch( uint64 earliestArrivalTimestamp, uint64 latestArrivalTimestamp, address relayer, address sender, uint256 value, uint64 destChainid, bytes calldata additionParams, bytes calldata message ) external payable; /// /// bytes byte1 uint256 uint24 uint64 bytes /// message = abi.encodePacked(messageType, activateContract, executeGasLimit, maxFeePerGas, signature) /// function launchMultiChain( launchEnhanceParams calldata params ) external payable; /// @notice batch landing message to the chain, execute the landing message /// @dev trusted relayer will call this function to send omni-chain message to the Station /// @param params the landing message params /// @param proofs the proof of the validated message function Landing( landingParams[] calldata params, bytes[][] calldata proofs ) external payable; /// @notice similar to the Landing function, but with gasLimit function LandingSpecifiedGas( landingParams[] calldata params, uint24 gasLimit, bytes[][] calldata proofs ) external payable; /// @dev feel free to call this function before pass message to the Station, /// this method will return the protocol fee that the message need to pay, longer message will pay more function estimateGas( uint256[] calldata value, uint64[] calldata destChainid, bytes[] calldata additionParams, bytes[] calldata message ) external view returns (uint256); function estimateGas( uint256 value, uint64 destChainid, bytes calldata additionParams, bytes calldata message ) external view returns (uint256); function estimatePrice( address sender, uint64 destChainid ) external view returns (uint64); function gasSystemAddr() external view returns (address); /// @dev get the message launch nonce of the sender on the specific chain /// @param chainId the chain id of the sender /// @param sender the address of the sender function GetNonceLaunch( uint64 chainId, address sender ) external view returns (uint32); /// @dev get the message landing nonce of the sender on the specific chain /// @param chainId the chain id of the sender /// @param sender the address of the sender function GetNonceLanding( uint64 chainId, address sender ) external view returns (uint32); /// @dev get the version of the Station /// @return the version of the Station, like "v1.0.0" function Version() external view returns (string memory); /// @dev get the chainId of current Station /// @return chainId, defined in the L2SupportLib.sol function Chainid() external view returns (uint64); function minArrivalTime() external view returns (uint64); function maxArrivalTime() external view returns (uint64); function expertLandingHook(bytes1 hook) external view returns (address); function expertLaunchHook(bytes1 hook) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageStruct} from "./IMessageStruct.sol"; interface IMessageDashboard is IMessageStruct { /// @dev Only owner can call this function to stop or restart the engine /// @param stop true is stop, false is start function PauseEngine(bool stop) external; /// @notice return the states of the engine /// @return 0x01 is stop, 0x02 is start function engineState() external view returns (uint8); /// @notice return the states of the engine & Landing Pad function padState() external view returns (uint8, uint8); // function mptRoot() external view returns (bytes32); /// @dev withdraw the protocol fee from the contract, only owner can call this function /// @param amount the amount of the withdraw protocol fee function Withdraw(uint256 amount, address to) external; /// @dev set the payment system address, only owner can call this function /// @param gasSystemAddress the address of the payment system function setGasSystem(address gasSystemAddress) external; function setExpertLaunchHooks( bytes1[] calldata ids, address[] calldata hooks ) external; function setExpertLandingHooks( bytes1[] calldata ids, address[] calldata hooks ) external; /// notice reset the permission of the contract, only owner can call this function function roleConfiguration( bytes32 role, address[] calldata accounts, bool[] calldata states ) external; function stationAdminSetRole( bytes32 role, address[] calldata accounts, bool[] calldata states ) external; /// @notice transfer the ownership of the contract, only owner can call this function function transferOwnership(address newOwner) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import "./IMessageSpaceStation.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IMessageEmitter { function minArrivalTime() external view returns (uint64); function maxArrivalTime() external view returns (uint64); function minGasLimit() external view returns (uint24); function maxGasLimit() external view returns (uint24); function defaultBridgeMode() external view returns (bytes1); function selectedRelayer() external view returns (address); function deployChainId() external view returns (uint64); function emit2LaunchPad( uint64 earliestArrivalTimestamp, uint64 latestArrivalTimestamp, address relayer, address sender, uint256 value, uint64 destChainid, bytes memory additionParams, bytes memory message ) external payable; /// @notice **Highly recommend** to call this function in your frontend program /// @notice call this function to packet the message before sending it to the LandingPad contract /// @param mode the emitter mode, check MessageTypeLib.sol for more details /// eg: 0x02 for ARBITRARY_ACTIVATE, your message will be activated on the target chain /// @param gasLimit the gas limit for executing the specific function on the target contract /// @param targetContract the target contract address on the destination chain /// @param message the message to be sent to the target contract /// @return the packed message function PacketMessages( bytes1[] memory mode, address[] memory targetContract, uint24[] memory gasLimit, uint64[] memory price, bytes[] memory message ) external view returns (bytes[] memory); /* /// @notice similar to PacketMessages, but only pack one message */ function PacketMessage(bytes1 mode, address targetContract, uint24 gasLimit, uint64 price, bytes memory message) external view returns (bytes memory); /* /// @notice **Highly recommend** to call this function in your frontend program /// @notice Estimate how many native token we should spend to exchange the amountOut in the destChainid /// @param destChainid The chain id of the destination chain /// @param amountOut The value we want to exchange in the destination chain */ function exactOutput(uint64 destChainid, uint256 amountOut) external view returns (uint256 amountIn); /* /// @notice **Highly recommend** to call this function in your frontend program /// @notice Estimate how many native token we could get in the destChainid if we input the amountIn /// @param destChainid The chain id of the destination chain /// @param amountIn The value we spent in the source chain */ function exactInput(uint64 destChainid, uint256 amountIn) external view returns (uint256 amountOut); /* /// @notice **Highly recommend** to call this function in your frontend program /// @notice Estimate the gas price we need to encode in message /// @param value The native token that value target address will receive in the destination chain /// @param destChainid The chain id of the destination chain /// @param additionParams The addition params for the message /// if not in expert mode, set to 0 (`new bytes(0)`) /// @param message The message we want to send to the destination chain */ function estimateVizingGasFee( uint256 value, uint64 destChainid, bytes calldata additionParams, bytes calldata message ) external view returns (uint256 vizingGasFee); /* /// @notice Calculate the amount of native tokens obtained on the target chain /// @param value The value we send to vizing on the source chain */ function computeTradeFee(uint64 destChainid, uint256 value) external view returns (uint256 amountIn); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageStruct} from "./IMessageStruct.sol"; interface IMessageEvent is IMessageStruct { /// @notice Throws event after a message which attempts to omni-chain is submitted to LaunchPad contract event SuccessfulLaunchMessage( uint32 indexed nonce, uint64 earliestArrivalTimestamp, uint64 latestArrivalTimestamp, address relayer, address sender, address srcContract, uint256 value, uint64 destChainid, bytes additionParams, bytes message ); /// @notice Throws event after a message which attempts to omni-chain is submitted to LaunchPad contract event SuccessfulLaunchMultiMessages( uint32[] indexed nonce, uint64 earliestArrivalTimestamp, uint64 latestArrivalTimestamp, address relayer, address sender, address srcContract, uint256[] value, uint64[] destChainid, bytes[] additionParams, bytes[] message ); /// @notice Throws event after a omni-chain message is submitted from source chain to target chain event SuccessfulLanding(bytes32 indexed messageId, landingParams params); /// @notice Throws event after protocol state is changed, such as pause or resume event EngineStateRefreshing(bool indexed isPause); /// @notice Throws event after protocol fee calculation is changed event PaymentSystemChanging(address indexed gasSystemAddress); /// @notice Throws event after successful withdrawa event WithdrawRequest(address indexed to, uint256 amount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IMessageReceiver { function receiveStandardMessage( uint64 srcChainId, uint256 srcContract, bytes calldata message ) external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageStruct} from "./IMessageStruct.sol"; interface IMessageSimulation is IMessageStruct { /// @dev for sequencer to simulate the landing message, call this function before call Landing /// @param params the landing message params /// check the revert message "SimulateResult" to get the result of the simulation /// for example, if the result is [true, false, true], it means the first and third message is valid, the second message is invalid function SimulateLanding(landingParams[] calldata params) external payable; /// @dev call this function off-chain to estimate the gas of excute the landing message /// @param params the landing message params /// @return the result of the estimation, true is valid, false is invalid function EstimateExecuteGas( landingParams[] calldata params ) external returns (bool[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageStruct} from "./IMessageStruct.sol"; import {IMessageDashboard} from "./IMessageDashboard.sol"; import {IMessageEvent} from "../interface/IMessageEvent.sol"; import {IMessageChannel} from "../interface/IMessageChannel.sol"; import {IMessageSimulation} from "../interface/IMessageSimulation.sol"; interface IMessageSpaceStation is IMessageStruct, IMessageDashboard, IMessageEvent, IMessageChannel, IMessageSimulation {}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IMessageStruct { struct launchParams { uint64 earliestArrivalTimestamp; uint64 latestArrivalTimestamp; address relayer; address sender; uint256 value; uint64 destChainid; bytes additionParams; bytes message; } struct landingParams { bytes32 messageId; uint64 earliestArrivalTimestamp; uint64 latestArrivalTimestamp; uint64 srcChainid; bytes32 srcTxHash; uint256 srcContract; uint32 srcChainNonce; uint256 sender; uint256 value; bytes additionParams; bytes message; } struct launchEnhanceParams { uint64 earliestArrivalTimestamp; uint64 latestArrivalTimestamp; address relayer; address sender; uint256[] value; uint64[] destChainid; bytes[] additionParams; bytes[] message; } struct RollupMessageStruct { SignedMessageBase base; IMessageStruct.launchParams params; } struct SignedMessageBase { uint64 srcChainId; uint24 nonceLaunch; bytes32 srcTxHash; bytes32 destTxHash; uint64 srcTxTimestamp; uint64 destTxTimestamp; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IVizingGasSystemChannel { /* /// @notice Estimate how many native token we should spend to exchange the amountOut in the destChainid /// @param destChainid The chain id of the destination chain /// @param amountOut The value we want to receive in the destination chain /// @return amountIn the native token amount on the source chain we should spend */ function exactOutput( uint64 destChainid, uint256 amountOut ) external view returns (uint256 amountIn); /* /// @notice Estimate how many native token we could get in the destChainid if we input the amountIn /// @param destChainid The chain id of the destination chain /// @param amountIn The value we spent in the source chain /// @return amountOut the native token amount the destination chain will receive */ function exactInput( uint64 destChainid, uint256 amountIn ) external view returns (uint256 amountOut); /* /// @notice Estimate the gas fee we should pay to vizing /// @param destChainid The chain id of the destination chain /// @param message The message we want to send to the destination chain */ function estimateGas( uint256 amountOut, uint64 destChainid, bytes calldata message ) external view returns (uint256); /* /// @notice Estimate the gas fee & native token we should pay to vizing /// @param amountOut amountOut in the destination chain /// @param destChainid The chain id of the destination chain /// @param message The message we want to send to the destination chain */ function batchEstimateTotalFee( uint256[] calldata amountOut, uint64[] calldata destChainid, bytes[] calldata message ) external view returns (uint256 totalFee); /* /// @notice Estimate the total fee we should pay to vizing /// @param value The value we spent in the source chain /// @param destChainid The chain id of the destination chain /// @param message The message we want to send to the destination chain */ function estimateTotalFee( uint256 value, uint64 destChainid, bytes calldata message ) external view returns (uint256 totalFee); /* /// @notice Estimate the gas price we need to encode in message /// @param sender most likely the address of the DApp, which forward the message from user /// @param destChainid The chain id of the destination chain */ function estimatePrice( address targetContract, uint64 destChainid ) external view returns (uint64); /* /// @notice Estimate the gas price we need to encode in message /// @param destChainid The chain id of the destination chain */ function estimatePrice(uint64 destChainid) external view returns (uint64); /* /// @notice Calculate the fee for the native token transfer /// @param amount The value we spent in the source chain */ function computeTradeFee( uint64 destChainid, uint256 amountOut ) external view returns (uint256 fee); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; library MessageTypeLib { bytes1 constant DEFAULT = 0x00; /* ********************* message type **********************/ bytes1 constant STANDARD_ACTIVATE = 0x01; bytes1 constant ARBITRARY_ACTIVATE = 0x02; bytes1 constant MESSAGE_POST = 0x03; bytes1 constant NATIVE_TOKEN_SEND = 0x04; /** * additionParams type ********************* */ // Single-Send mode bytes1 constant SINGLE_SEND = 0x01; bytes1 constant ERC20_HANDLER = 0x03; bytes1 constant MULTI_MANY_2_ONE = 0x04; bytes1 constant MULTI_UNIVERSAL = 0x05; bytes1 constant MAX_MODE = 0xFF; function fetchMsgMode( bytes calldata message ) internal pure returns (bytes1) { if (message.length < 1) { return DEFAULT; } bytes1 messageSlice = bytes1(message[0:1]); return messageSlice; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageStruct} from "./interface/IMessageStruct.sol"; import {IMessageChannel} from "./interface/IMessageChannel.sol"; import {IMessageEmitter} from "./interface/IMessageEmitter.sol"; import {IMessageReceiver} from "./interface/IMessageReceiver.sol"; import {IVizingGasSystemChannel} from "./interface/IVizingGasSystemChannel.sol"; abstract contract MessageEmitter is IMessageEmitter { /// @dev bellow are the default parameters for the OmniToken, /// we **Highly recommended** to use immutable variables to store these parameters /// @notice minArrivalTime the minimal arrival timestamp for the omni-chain message /// @notice maxArrivalTime the maximal arrival timestamp for the omni-chain message /// @notice minGasLimit the minimal gas limit for target chain execute omni-chain message /// @notice maxGasLimit the maximal gas limit for target chain execute omni-chain message /// @notice defaultBridgeMode the default mode for the omni-chain message, /// in OmniToken, we use MessageTypeLib.ARBITRARY_ACTIVATE (0x02), target chain will **ACTIVATE** the message /// @notice selectedRelayer the specify relayer for your message /// set to 0, all the relayers will be able to forward the message /// see https://docs.vizing.com/docs/BuildOnVizing/Contract function minArrivalTime() external view virtual override returns (uint64) {} function maxArrivalTime() external view virtual override returns (uint64) {} function minGasLimit() external view virtual override returns (uint24) {} function maxGasLimit() external view virtual override returns (uint24) {} uint64 public immutable override deployChainId; function defaultBridgeMode() external view virtual override returns (bytes1) {} function selectedRelayer() external view virtual override returns (address) {} IMessageChannel public LaunchPad; constructor(address _LaunchPad) { __LaunchPadInit(_LaunchPad); } /* /// rewrite set LaunchPad address function /// @notice call this function to reset the LaunchPad contract address /// @param _LaunchPad The new LaunchPad contract address */ function __LaunchPadInit(address _LaunchPad) internal virtual { LaunchPad = IMessageChannel(_LaunchPad); } /* /// @notice call this function to send the message to the destination chain /// Use this method to quickly send operations that interact with the contract in destination chain /// @param destChainid The chain id of the destination chain /// @param targetContract The target contract address on the destination chain /// @param amountOut The native token amount that the target address will receive in the destination chain /// @param gasLimitInDestChain The gas limit for executing the specific function on the target contract /// @param messageEncoded encoded message /// eg: abi.encodePacked( /// byte1 uint256 uint24 uint64 bytes /// receiveType tokenReceiver tokenMintAmount tokenID tokenURI /// ) /// 1. the message will be sent to the target contract /// 2. You can decode the message in the target chain contract to your original data, /// then you will get the same data as you sent in the source chain /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function _simpleLaunch( uint64 destChainid, address targetContract, uint256 amountOut, uint24 gasLimitInDestChain, bytes memory messageEncoded ) internal virtual { bytes memory packedMessage = PacketMessage( bytes1(0x01), // STANDARD_ACTIVATE targetContract, gasLimitInDestChain, _fetchPrice(targetContract, destChainid), messageEncoded ); emit2LaunchPad( 0, 0, address(0), msg.sender, amountOut, destChainid, new bytes(0), packedMessage ); } /* @notice similar to _simpleLaunch, but using expert mode you can set the additionParams to specify the mode /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function _simpleLaunchExpert( uint64 destChainid, address targetContract, uint256 amountOut, uint24 gasLimitInDestChain, bytes memory additionParams, bytes memory messageEncoded ) internal virtual { bytes memory packedMessage = PacketMessage( bytes1(0x01), // ARBITRARY_ACTIVATE targetContract, gasLimitInDestChain, _fetchPrice(targetContract, destChainid), messageEncoded ); emit2LaunchPad( 0, 0, address(0), msg.sender, amountOut, destChainid, additionParams, packedMessage ); } /* /// @notice call this function to packet the message before sending it to the LandingPad contract /// @param mode the emitter mode, check MessageTypeLib.sol for more details /// eg: 0x02 for ARBITRARY_ACTIVATE, your message will be activated on the target chain /// @param gasLimit the gas limit for executing the specific function on the target contract /// @param targetContract the target contract address on the destination chain /// @param message the message to be sent to the target contract /// @return the packed message /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function PacketMessages( bytes1[] memory mode, address[] memory targetContract, uint24[] memory gasLimit, uint64[] memory price, bytes[] memory message ) public pure virtual override returns (bytes[] memory) { bytes[] memory signatures = new bytes[](message.length); for (uint256 i = 0; i < message.length; i++) { signatures[i] = PacketMessage( mode[i], targetContract[i], gasLimit[i], price[i], message[i] ); } return signatures; } /* /// @notice similar to PacketMessages, but only pack one message /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function PacketMessage( bytes1 mode, address targetContract, uint24 gasLimit, uint64 price, bytes memory message ) public pure virtual override returns (bytes memory) { return abi.encodePacked( mode, uint256(uint160(targetContract)), gasLimit, price, message ); } /* /// @notice use this function to send the message and ERC20 token to the destination chain /// @param destChainid The chain id of the destination chain /// @param targetContract The target contract address on the destination chain /// @param gasLimit The gas limit for executing the specific function on the target contract /// @param amountOut The native token amount that the target address will receive in the destination chain /// @param tokenSymbol The token symbol /// @param sender The sender address for the message /// @param receiver The receiver address for the message /// @param amount The amount of tokens to be sent /// @param message The message to be sent to the target contract /// see https://docs.vizing.com/docs/DApp/Omni-ERC20-Transfer */ function PacketMessageSimultaneousToken( bytes1 mode, address targetContract, uint24 gasLimit, uint64 price, bytes1 tokenSymbol, address sender, address receiver, uint256 amount, bytes memory message ) public pure returns (bytes memory) { return abi.encodePacked( mode, uint256(uint160(targetContract)), gasLimit, price, tokenSymbol, sender, receiver, amount, message ); } /* /// @notice Emit the message to the destination chain /// @dev 1. we will call the LaunchPad.Launch function to emit the message /// @dev 2. the message will be sent to the destination chain /// @param earliestArrivalTimestamp The earliest arrival time for the message /// set to 0, vizing will forward the information ASAP. /// @param latestArrivalTimestamp The latest arrival time for the message /// set to 0, vizing will forward the information ASAP. /// @param relayer the specific relayer for the message /// set to 0, all the relayers will be able to forward the message /// @param sender The sender address for the message /// most likely the address of the EOA, the user of some DApps /// @param value native token amount, will be sent to the target contract /// @param destChainid The destination chain id for the message /// @param additionParams The addition params for the message /// if not in expert mode, set to 0 (`new bytes(0)`) /// @param message Arbitrary information /// /// bytes /// message = abi.encodePacked( /// byte1 uint256 uint24 uint64 bytes /// messageType, activateContract, executeGasLimit, maxFeePerGas, signature /// ) /// /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function emit2LaunchPad( uint64 earliestArrivalTimestamp, uint64 latestArrivalTimestamp, address relayer, address sender, uint256 value, uint64 destChainid, bytes memory additionParams, bytes memory message ) public payable virtual { LaunchPad.Launch{value: msg.value}( earliestArrivalTimestamp, latestArrivalTimestamp, relayer, sender, value, destChainid, additionParams, message ); } /* /// @notice Calculate the amount of native tokens obtained on the target chain /// @param value The value we send to vizing on the source chain */ function computeTradeFee( uint64 destChainid, uint256 value ) public view returns (uint256 amountIn) { return IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).computeTradeFee( destChainid, value ); } /* /// @notice Fetch the nonce of the user with specific destination chain /// @param destChainid The chain id of the destination chain /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function _fetchNonce( uint64 destChainid ) internal view virtual returns (uint32 nonce) { nonce = LaunchPad.GetNonceLaunch(destChainid, msg.sender); } /* /// @notice Estimate the gas price we need to encode in message /// @param destChainid The chain id of the destination chain /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function _fetchPrice( uint64 destChainid ) internal view virtual returns (uint64) { return IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).estimatePrice( destChainid ); } /* /// @notice Estimate the gas price we need to encode in message /// @param targetContract The target contract address on the destination chain /// @param destChainid The chain id of the destination chain /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function _fetchPrice( address targetContract, uint64 destChainid ) internal view virtual returns (uint64) { return IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).estimatePrice( targetContract, destChainid ); } /* /// @notice similar to uniswap Swap Router /// @notice Estimate how many native token we should spend to exchange the amountOut in the destChainid /// @param destChainid The chain id of the destination chain /// @param amountOut The value we want to exchange in the destination chain /// @return amountIn the native token amount on the source chain we should spend /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function exactOutput( uint64 destChainid, uint256 amountOut ) public view override returns (uint256 amountIn) { return IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactOutput( destChainid, amountOut ); } /* /// @notice similar to uniswap Swap Router /// @notice Estimate how many native token we could get in the destChainid if we input the amountIn /// @param destChainid The chain id of the destination chain /// @param amountIn The value we spent in the source chain /// @return amountOut the native token amount the destination chain will receive /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function exactInput( uint64 destChainid, uint256 amountIn ) public view override returns (uint256 amountOut) { return IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactInput( destChainid, amountIn ); } /* /// @notice Estimate the gas price we need to encode in message /// @param value The native token that value target address will receive in the destination chain /// @param destChainid The chain id of the destination chain /// @param additionParams The addition params for the message /// if not in expert mode, set to 0 (`new bytes(0)`) /// @param message The message we want to send to the destination chain /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function _estimateVizingGasFee( uint256 value, uint64 destChainid, bytes memory additionParams, bytes memory message ) internal view returns (uint256 vizingGasFee) { return LaunchPad.estimateGas(value, destChainid, additionParams, message); } /* /// @notice **Highly recommend** to call this function in your frontend program /// @notice Estimate the gas price we need to encode in message /// @param value The native token that value target address will receive in the destination chain /// @param destChainid The chain id of the destination chain /// @param additionParams The addition params for the message /// if not in expert mode, set to 0 (`new bytes(0)`) /// @param message The message we want to send to the destination chain /// see https://docs.vizing.com/docs/BuildOnVizing/Contract */ function estimateVizingGasFee( uint256 value, uint64 destChainid, bytes calldata additionParams, bytes calldata message ) external view returns (uint256 vizingGasFee) { return _estimateVizingGasFee(value, destChainid, additionParams, message); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {IMessageChannel} from "./interface/IMessageChannel.sol"; import {IMessageReceiver} from "./interface/IMessageReceiver.sol"; abstract contract MessageReceiver is IMessageReceiver { error LandingPadAccessDenied(); error NotImplement(); IMessageChannel public LandingPad; modifier onlyVizingPad() { if (msg.sender != address(LandingPad)) revert LandingPadAccessDenied(); _; } constructor(address _LandingPad) { __LandingPadInit(_LandingPad); } /* /// rewrite set LandingPad address function /// @notice call this function to reset the LaunchPad contract address /// @param _LaunchPad The new LaunchPad contract address */ function __LandingPadInit(address _LandingPad) internal virtual { LandingPad = IMessageChannel(_LandingPad); } /// @notice the standard function to receive the omni-chain message function receiveStandardMessage( uint64 srcChainId, uint256 srcContract, bytes calldata message ) external payable virtual override onlyVizingPad { _receiveMessage(srcChainId, srcContract, message); } /// @dev override this function to handle the omni-chain message /// @param srcChainId the source chain id /// @param srcContract the source contract address /// @param message the message from the source chain function _receiveMessage( uint64 srcChainId, uint256 srcContract, bytes calldata message ) internal virtual { (srcChainId, srcContract, message); revert NotImplement(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {MessageEmitter} from "./MessageEmitter.sol"; import {MessageReceiver} from "./MessageReceiver.sol"; abstract contract VizingOmni is MessageEmitter, MessageReceiver { constructor( address _vizingPad ) MessageEmitter(_vizingPad) MessageReceiver(_vizingPad) {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {VizingOmni} from "@vizing/contracts/VizingOmni.sol"; import {MessageTypeLib} from "@vizing/contracts/library/MessageTypeLib.sol"; import "./ExcessivelySafeCall.sol"; import "./NonblockingApp.sol"; abstract contract ERC314PlusCore is ERC20, Ownable, ReentrancyGuard, VizingOmni, NonblockingApp { using ExcessivelySafeCall for address; enum ActionType { deposit, launch, claimPing, claimPong, buyPing, buyPong, sellPing, sellPong } struct DebitAmount { uint native; uint token; } event MessageReceived(uint64 _srcChainId, address _srcAddress, uint value, bytes _payload); event PongfeeFailed(uint64 _srcChainId, address _srcAddress, uint8 _action, uint _pongFee, uint _expectPongFee); event Launch( address indexed _sender, uint _native, uint _token, uint _presaleToken, uint _refundNative, address _feeAddr ); event Swap(address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out); uint64 public immutable override minArrivalTime; uint64 public immutable override maxArrivalTime; uint24 public immutable override minGasLimit; uint24 public immutable override maxGasLimit; bytes1 public immutable override defaultBridgeMode; address public immutable override selectedRelayer; uint64 public masterChainId; bool public launched; uint public messageReceived; address public feeAddress; mapping(address => uint) public deposited; //local chain deposited address=>amount mapping(address => bool) public claimed; uint MAX_INT = 2 ** 256 - 1; constructor( string memory _name, string memory _symbol, address _vizingPad, uint64 _masterChainId ) VizingOmni(_vizingPad) ERC20(_name, _symbol) { masterChainId = _masterChainId; launched = false; defaultBridgeMode = MessageTypeLib.STANDARD_ACTIVATE; } //----vizing bridge common---- function paramsEstimateGas( uint64 dstChainId, address dstContract, uint value, bytes memory params ) public view virtual returns (uint) { bytes memory message = PacketMessage( defaultBridgeMode, dstContract, maxGasLimit, _fetchPrice(dstContract, dstChainId), abi.encode(_msgSender(), params) ); return LaunchPad.estimateGas(value, dstChainId, new bytes(0), message); } function paramsEmit2LaunchPad( uint bridgeFee, uint64 dstChainId, address dstContract, uint value, bytes memory params, address sender ) internal virtual { bytes memory message = PacketMessage( defaultBridgeMode, dstContract, maxGasLimit, _fetchPrice(dstContract, dstChainId), abi.encode(_msgSender(), params) ); /* emit2LaunchPad( 0, //uint64(block.timestamp + minArrivalTime), 0, //uint64(block.timestamp + maxArrivalTime), selectedRelayer, sender, value, dstChainId, new bytes(0), message ); */ uint bridgeValue = value + bridgeFee; require(msg.value >= bridgeValue, "bridgeFee err."); LaunchPad.Launch{value: bridgeValue}(0, 0, selectedRelayer, sender, value, dstChainId, new bytes(0), message); } //---- message call function---- function master_deposit( uint pongFee, uint64 srcChainId, address sender, address target, uint amount ) internal virtual { revert NotImplement(); } function master_claim(uint pongFee, uint64 srcChainId, address sender, address target) internal virtual { revert NotImplement(); } function master_buy(uint pongFee, uint64 srcChainId, address sender, address target, uint native) internal virtual { revert NotImplement(); } function master_sell(uint pongFee, uint64 srcChainId, address sender, address target, uint token) internal virtual { revert NotImplement(); } function slave_launch(uint64 srcChainId, address sender) internal virtual { revert NotImplement(); } function slave_deposit(uint64 srcChainId, address sender, address target, uint amount) internal virtual { revert NotImplement(); } function slave_claim(uint64 srcChainId, address sender, address target, uint native, uint token) internal virtual { revert NotImplement(); } function slave_buy(uint64 srcChainId, address sender, address target, uint native, uint token) internal virtual { revert NotImplement(); } function slave_sell(uint64 srcChainId, address sender, address target, uint native, uint token) internal virtual { revert NotImplement(); } function action_master( uint64 srcChainId, address sender, uint8 action, uint pongFee, bytes memory params ) internal virtual { if (action == uint8(ActionType.deposit)) { (address target, uint amount) = abi.decode(params, (address, uint)); master_deposit(pongFee, srcChainId, sender, target, amount); } else if (action == uint8(ActionType.claimPing)) { address target = abi.decode(params, (address)); master_claim(pongFee, srcChainId, sender, target); } else if (action == uint8(ActionType.buyPing)) { (address target, uint native) = abi.decode(params, (address, uint)); master_buy(pongFee, srcChainId, sender, target, native); } else if (action == uint8(ActionType.sellPing)) { (address target, uint token) = abi.decode(params, (address, uint)); master_sell(pongFee, srcChainId, sender, target, token); } else revert NotImplement(); } function action_slave( uint64 srcChainId, address sender, uint8 action, uint pongFee, bytes memory params ) internal virtual { if (action == uint8(ActionType.deposit)) { (address target, uint amount) = abi.decode(params, (address, uint)); slave_deposit(srcChainId, sender, target, amount); } else if (action == uint8(ActionType.claimPong)) { (address target, uint native, uint token) = abi.decode(params, (address, uint, uint)); slave_claim(srcChainId, sender, target, native, token); } else if (action == uint8(ActionType.buyPong)) { (address target, uint native, uint token) = abi.decode(params, (address, uint, uint)); slave_buy(srcChainId, sender, target, native, token); } else if (action == uint8(ActionType.sellPong)) { (address target, uint token, uint native) = abi.decode(params, (address, uint, uint)); slave_sell(srcChainId, sender, target, native, token); } else if (action == uint8(ActionType.launch)) { slave_launch(srcChainId, sender); } else revert NotImplement(); } //---- message---- function _computePongValueWithOutPongFee( uint8 action, uint64 srcChainId, uint pongFee, bytes memory params ) internal view virtual returns (uint value, uint sendToFee) { value = msg.value - pongFee; sendToFee = 0; } function _nonblockingReceive( uint64 srcChainId, address sender, uint8 action, uint pongFee, bytes calldata params ) public payable virtual override { require(_msgSender() == address(this), "ERC314PlusCore: caller must be self"); if (srcChainId == masterChainId) action_slave(srcChainId, sender, action, pongFee, params); else action_master(srcChainId, sender, action, pongFee, params); } function _callSelf( uint64 srcChainId, address sender, uint8 action, uint pongFee, uint callValue, bytes memory params ) internal returns (bool success, bytes memory reason) { (success, reason) = address(this).excessivelySafeCall( gasleft(), callValue, 150, abi.encodeWithSelector(this._nonblockingReceive.selector, srcChainId, sender, action, pongFee, params) ); } function verifySource(uint64 srcChainId, address srcContract) internal view virtual returns (bool authorized); function _receiveMessage( uint64 srcChainId, uint256 srcContract, bytes calldata _payload ) internal virtual override { require(verifySource(srcChainId, address(uint160(srcContract))), "unauthorized."); (address sender, bytes memory message) = abi.decode(_payload, (address, bytes)); messageReceived += 1; emit MessageReceived(srcChainId, sender, msg.value, message); (uint8 action, uint pongFee, bytes memory params) = abi.decode(message, (uint8, uint, bytes)); (uint value, uint sendToFee) = _computePongValueWithOutPongFee(action, srcChainId, pongFee, params); uint callValue = pongFee + value - sendToFee; if (sendToFee > 0) payable(feeAddress).transfer(sendToFee); (bool success, bytes memory reason) = _callSelf(srcChainId, sender, action, pongFee, callValue, params); if (!success) { _storeFailedMessage(srcChainId, sender, message, reason, callValue); } } //---- interface ---- function deposit(uint pongFee, uint amount) public payable virtual; function claim(uint pongFee) public payable virtual; function swapExactETHForTokens(uint pongFee, address to, uint deadline) external payable virtual; function swapExactTokensForETH(uint pongFee, uint amountIn, address to, uint deadline) external payable virtual; function _transfer(address from, address to, uint256 amount) internal virtual override { if (_msgSender() != address(this) && to == address(this)) { revert("Unsupported"); } else { super._transfer(from, to, amount); } } //----Signature--- /* function _fetchSignature(bytes memory message) internal view virtual returns (bytes memory signature) { //signature = abi.encodeCall(this.receiveMessage, (deployChainId, address(this), msg.sender, message)); signature = message; } */ function _depositPingPongSignature( address target, uint pongFee, uint amount ) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.deposit), pongFee, abi.encode(target, amount)); } function _claimPingSignature(address target, uint pongFee) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.claimPing), pongFee, abi.encode(target)); } function _claimPongSignature( address target, uint refund, uint amount ) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.claimPong), 0, abi.encode(target, refund, amount)); } function _buyPingSignature( address target, uint pongFee, uint amountIn ) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.buyPing), pongFee, abi.encode(target, amountIn)); } function _buyPongSignature(address target, uint native, uint token) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.buyPong), 0, abi.encode(target, native, token)); } function _sellPingSignature( address target, uint pongFee, uint amountIn ) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.sellPing), pongFee, abi.encode(target, amountIn)); } function _sellPongSignature(address target, uint native, uint token) internal view virtual returns (bytes memory) { return abi.encode(uint8(ActionType.sellPong), 0, abi.encode(target, native, token)); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.7.6; library ExcessivelySafeCall { uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _value The value in wei to send to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint256 _gas, uint256 _value, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient _value, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint256 _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint256 _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint256 _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ExcessivelySafeCall.sol"; abstract contract NonblockingApp { //mapping(uint64 => mapping(address => bytes32)) public failedMessages; uint public messageFailed; event MessageFailed( uint64 _srcChainId, address _srcAddress, bytes _payload, bytes _reason, uint _value, uint _callValue ); event RetryMessageSuccess(uint64 _srcChainId, address _srcAddress, bytes32 _payloadHash); function _nonblockingReceive( uint64 srcChainId, address sender, uint8 action, uint pongFee, bytes calldata message ) public payable virtual; function _storeFailedMessage( uint64 _srcChainId, address _srcAddress, bytes memory _payload, bytes memory _reason, uint _callValue ) internal virtual { messageFailed += 1; //failedMessages[_srcChainId][_srcAddress] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _payload, _reason, msg.value, _callValue); } /* function retryMessage(uint64 _srcChainId, address _srcAddress, bytes calldata _payload) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress]; require(payloadHash != bytes32(0), "NonblockingApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress] = bytes32(0); // execute the message. revert if it fails again _nonblockingReceive(_srcChainId, _srcAddress, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, payloadHash); } */ }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {ERC314PlusCore} from "./ERC314PlusCore.sol"; import {IMessageStruct} from "@vizing/contracts/interface/IMessageStruct.sol"; contract SlaveTokenBase is ERC314PlusCore { address public masterContract; constructor( string memory _name, string memory _symbol, address _vizingPad, address _defaultRelayer, uint64 _masterChainId ) ERC314PlusCore(_name, _symbol, _vizingPad, _masterChainId) { minArrivalTime = 1 minutes; maxArrivalTime = 1 days; minGasLimit = 100000; maxGasLimit = 1000000; selectedRelayer = _defaultRelayer; } function setMasterContract(address addr) public virtual onlyOwner { masterContract = addr; } function verifySource( uint64 srcChainId, address srcContract ) internal view virtual override returns (bool authorized) { return masterContract == srcContract && masterChainId == srcChainId; } //----slave call function slave_launch(uint64 srcChainId, address sender) internal virtual override { launched = true; } function slave_deposit(uint64 srcChainId, address sender, address target, uint amount) internal virtual override { deposited[target] += amount; } function slave_claim( uint64 srcChainId, address sender, address target, uint native, uint token ) internal virtual override { if (token > 0) _mint(target, token); if (native > 0) payable(target).transfer(native); claimed[target] = true; } function slave_buy( uint64 srcChainId, address sender, address target, uint native, uint token ) internal virtual override { if (token > 0) _mint(target, token); if (native > 0) payable(target).transfer(native); } function slave_sell( uint64 srcChainId, address sender, address target, uint native, uint token ) internal virtual override { if (token > 0) _mint(target, token); if (native > 0) payable(target).transfer(native); } //----deposit function depositPingEstimateGas( uint pongFee, address target, uint amount ) public view virtual returns (uint pingFee) { pingFee = paramsEstimateGas( masterChainId, masterContract, amount + pongFee, _depositPingPongSignature(target, pongFee, amount) ); } function deposit(uint pongFee, uint amount) public payable virtual override nonReentrant { require(!launched, "launched"); uint pingFee = depositPingEstimateGas(pongFee, _msgSender(), amount); require(msg.value >= amount + pingFee + pongFee, "bridge fee not enough"); paramsEmit2LaunchPad( pingFee, masterChainId, masterContract, amount + pongFee, _depositPingPongSignature(_msgSender(), pongFee, amount), _msgSender() ); } //----claim function claimPingEstimateGas(uint pongFee, address target) public view virtual returns (uint pingFee) { pingFee = paramsEstimateGas(masterChainId, masterContract, pongFee, _claimPingSignature(target, pongFee)); } function claim(uint pongFee) public payable virtual override nonReentrant { require(launched, "unlaunched"); require(!claimed[_msgSender()], "claimed"); uint pingFee = claimPingEstimateGas(pongFee, _msgSender()); require(msg.value >= pingFee + pongFee, "bridge fee not enough"); paramsEmit2LaunchPad( pingFee, masterChainId, masterContract, pongFee, _claimPingSignature(_msgSender(), pongFee), _msgSender() ); } //----_buy function buyPingEstimateGas( uint pongFee, address target, uint amountIn ) public view virtual returns (uint pingFee) { pingFee = paramsEstimateGas( masterChainId, masterContract, pongFee, _buyPingSignature(target, pongFee, amountIn) ); } function _buy(uint pongFee, address to, uint deadline) internal { require(launched, "unlaunched"); require(deadline == 0 || deadline > block.timestamp, "deadline err."); uint pingFee = buyPingEstimateGas(pongFee, to, msg.value); uint amountIn = msg.value - pingFee - pongFee; require(amountIn > 0, "amount in err."); paramsEmit2LaunchPad( pingFee, masterChainId, masterContract, amountIn + pongFee, _buyPingSignature(to, pongFee, amountIn), _msgSender() ); } //----_sell function sellPingEstimateGas( uint pongFee, address target, uint amountIn ) public view virtual returns (uint pingFee) { pingFee = paramsEstimateGas( masterChainId, masterContract, pongFee, _sellPingSignature(target, pongFee, amountIn) ); } function _sell(uint pongFee, address from, address to, uint amountIn, uint deadline) internal { require(launched, "unlaunched"); require(amountIn > 0, "amount in err."); require(deadline == 0 || deadline > block.timestamp, "deadline err."); require(balanceOf(from) >= amountIn, "sell amount exceeds balance"); uint pingFee = sellPingEstimateGas(pongFee, to, amountIn); require(msg.value >= pingFee + pongFee, "bridge fee not enough"); _burn(from, amountIn); paramsEmit2LaunchPad( pingFee, masterChainId, masterContract, pongFee, _sellPingSignature(to, pongFee, amountIn), _msgSender() ); } //----314token function getReserves() public view returns (uint, uint) { revert NotImplement(); } function getAmountOut(uint value, bool isBuy) public view returns (uint) { revert NotImplement(); } function swapExactETHForTokens( uint pongFee, address to, uint deadline ) external payable virtual override nonReentrant { _buy(pongFee, to, deadline); } function swapExactTokensForETH( uint pongFee, uint amountIn, address to, uint deadline ) external payable virtual override nonReentrant { _sell(pongFee, _msgSender(), to, amountIn, deadline); } receive() external payable { //_buy(_msgSender(), block.timestamp); } function withdrawFee(address to, uint amount) public onlyOwner { payable(to).transfer(amount); } }
{ "optimizer": { "enabled": true, "runs": 100 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vizingPad","type":"address"},{"internalType":"uint64","name":"_masterChainId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LandingPadAccessDenied","type":"error"},{"inputs":[],"name":"NotImplement","type":"error"},{"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":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_presaleToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_refundNative","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feeAddr","type":"address"}],"name":"Launch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_callValue","type":"uint256"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"_action","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_pongFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expectPongFee","type":"uint256"}],"name":"PongfeeFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"}],"name":"Swap","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":"LandingPad","outputs":[{"internalType":"contract IMessageChannel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LaunchPad","outputs":[{"internalType":"contract IMessageChannel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes1","name":"mode","type":"bytes1"},{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"uint24","name":"gasLimit","type":"uint24"},{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"PacketMessage","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes1","name":"mode","type":"bytes1"},{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"uint24","name":"gasLimit","type":"uint24"},{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"bytes1","name":"tokenSymbol","type":"bytes1"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"PacketMessageSimultaneousToken","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes1[]","name":"mode","type":"bytes1[]"},{"internalType":"address[]","name":"targetContract","type":"address[]"},{"internalType":"uint24[]","name":"gasLimit","type":"uint24[]"},{"internalType":"uint64[]","name":"price","type":"uint64[]"},{"internalType":"bytes[]","name":"message","type":"bytes[]"}],"name":"PacketMessages","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"_nonblockingReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"buyPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"claimPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"computeTradeFee","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultBridgeMode","outputs":[{"internalType":"bytes1","name":"","type":"bytes1"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"earliestArrivalTimestamp","type":"uint64"},{"internalType":"uint64","name":"latestArrivalTimestamp","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"bytes","name":"additionParams","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"emit2LaunchPad","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"bytes","name":"additionParams","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"estimateVizingGasFee","outputs":[{"internalType":"uint256","name":"vizingGasFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isBuy","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageFailed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"dstContract","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"paramsEstimateGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"uint256","name":"srcContract","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"receiveStandardMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selectedRelayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"sellPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610160604052600019600f553480156200001857600080fd5b5060405162003dd738038062003dd78339810160408190526200003b91620001ba565b604051806040016040528060098152602001684f726269742047757960b81b815250604051806040016040528060068152602001654f524247555960d01b8152508360008484848483818081868681600390816200009a9190620002b6565b506004620000a98282620002b6565b505050620000c6620000c06200016460201b60201c565b62000168565b6001600655600780546001600160a01b0319166001600160a01b03831617905550600880546001600160a01b0319166001600160a01b0383161790555050600a80546001600160481b0319166001600160401b039092169190911790555050600160f81b610120525050603c60a0526201518060c052620186a060e052620f4240610100526001600160a01b03166101405250620003829350505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060408385031215620001ce57600080fd5b82516001600160a01b0381168114620001e657600080fd5b60208401519092506001600160401b03811681146200020457600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200023a57607f821691505b6020821081036200025b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002b1576000816000526020600020601f850160051c810160208610156200028c5750805b601f850160051c820191505b81811015620002ad5782815560010162000298565b5050505b505050565b81516001600160401b03811115620002d257620002d26200020f565b620002ea81620002e3845462000225565b8462000261565b602080601f831160018114620003225760008415620003095750858301515b600019600386901b1c1916600185901b178555620002ad565b600085815260208120601f198616915b82811015620003535788860151825594840194600190910190840162000332565b5085821015620003725787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516101005161012051610140516139d762000400600039600081816108410152611d6c01526000818161051201528181610b9b0152611cb901526000818161066401528181610bbd0152611cdb01526000610609015260006109b2015260006105d5015260006107cd01526139d76000f3fe6080604052600436106102d85760003560e01c806376c813121161017b578063c884ef83116100d7578063de8aeda011610085578063de8aeda0146109a0578063e0b838e9146109d4578063e2bbb158146109f4578063f2fde38b14610a07578063fd39aa4414610a27578063fd9be52214610a3a578063ffee770f14610a5a57600080fd5b8063c884ef83146108b0578063cb13cddb146108e0578063cb2bfa931461090d578063cd446e221461092d578063dd39fbe11461094d578063dd62ed3e1461096d578063de2a60f71461098d57600080fd5b806397945d2d1161013457806397945d2d1461079b5780639b1762d9146107bb578063a457c2d7146107ef578063a9059cbb1461080f578063b0cfd4d21461082f578063b368574114610863578063c23d11381461089057600080fd5b806376c81312146106f1578063786627ce146107115780638091f3bf146107275780638aa71869146107485780638da5cb5b1461076857806395d89b411461078657600080fd5b806339509351116102355780635ad3ad06116101e35780635ad3ad06146105c35780635aeb4d77146105f75780635c7e072b1461063f5780635e45da23146106525780636715f7091461068657806370a08231146106a6578063715018a6146106dc57600080fd5b806339509351146104c057806341275358146104e0578063456362791461050057806346093c1b1461054d5780634c2c83701461056d578063575580d71461058d578063589301d3146105a357600080fd5b806311106ee21161029257806311106ee2146103ee57806318160ddd1461041c5780631b6fa94a1461043157806323b872dd146104515780632a3a236f14610471578063313ce56714610491578063379607f5146104ad57600080fd5b806273b555146102e457806306fdde03146102f95780630902f1ac14610324578063095ea7b31461034e5780630e82845d1461037e57806310c3cf06146103b657600080fd5b366102df57005b600080fd5b6102f76102f2366004612971565b610a6d565b005b34801561030557600080fd5b5061030e610aaa565b60405161031b9190612a1c565b60405180910390f35b34801561033057600080fd5b50610339610b3c565b6040805192835260208301919091520161031b565b34801561035a57600080fd5b5061036e610369366004612a44565b610b5b565b604051901515815260200161031b565b34801561038a57600080fd5b5060085461039e906001600160a01b031681565b6040516001600160a01b03909116815260200161031b565b3480156103c257600080fd5b50600a546103d6906001600160401b031681565b6040516001600160401b03909116815260200161031b565b3480156103fa57600080fd5b5061040e610409366004612a70565b610b75565b60405190815260200161031b565b34801561042857600080fd5b5060025461040e565b34801561043d57600080fd5b5061040e61044c366004612b68565b610b93565b34801561045d57600080fd5b5061036e61046c366004612bd3565b610c9b565b34801561047d57600080fd5b506102f761048c366004612c14565b610cbf565b34801561049d57600080fd5b506040516012815260200161031b565b6102f76104bb366004612c31565b610ce9565b3480156104cc57600080fd5b5061036e6104db366004612a44565b610de4565b3480156104ec57600080fd5b50600c5461039e906001600160a01b031681565b34801561050c57600080fd5b506105347f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160f81b0319909116815260200161031b565b34801561055957600080fd5b5061040e610568366004612c4a565b610e06565b34801561057957600080fd5b5061040e610588366004612c6f565b610e3a565b34801561059957600080fd5b5061040e60095481565b3480156105af57600080fd5b5061040e6105be366004612c96565b610e70565b3480156105cf57600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000000000081565b34801561060357600080fd5b5061062b7f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff909116815260200161031b565b6102f761064d366004612cb4565b610f59565b34801561065e57600080fd5b5061062b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561069257600080fd5b5061040e6106a1366004612c6f565b610f78565b3480156106b257600080fd5b5061040e6106c1366004612c14565b6001600160a01b031660009081526020819052604090205490565b3480156106e857600080fd5b506102f7610fa6565b3480156106fd57600080fd5b5061040e61070c366004612cf3565b610fba565b34801561071d57600080fd5b5061040e600b5481565b34801561073357600080fd5b50600a5461036e90600160401b900460ff1681565b34801561075457600080fd5b5061030e610763366004612dae565b61103c565b34801561077457600080fd5b506005546001600160a01b031661039e565b34801561079257600080fd5b5061030e61107a565b3480156107a757600080fd5b5061040e6107b6366004612c6f565b611089565b3480156107c757600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000000000081565b3480156107fb57600080fd5b5061036e61080a366004612a44565b6110c0565b34801561081b57600080fd5b5061036e61082a366004612a44565b61113b565b34801561083b57600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561086f57600080fd5b5061088361087e36600461306f565b611149565b60405161031b9190613133565b34801561089c57600080fd5b5061040e6108ab366004612c96565b611262565b3480156108bc57600080fd5b5061036e6108cb366004612c14565b600e6020526000908152604090205460ff1681565b3480156108ec57600080fd5b5061040e6108fb366004612c14565b600d6020526000908152604090205481565b34801561091957600080fd5b5061040e610928366004612c96565b61130e565b34801561093957600080fd5b5060105461039e906001600160a01b031681565b34801561095957600080fd5b5061030e610968366004613197565b6113ba565b34801561097957600080fd5b5061040e61098836600461325a565b611404565b6102f761099b366004613297565b61142f565b3480156109ac57600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000000000081565b3480156109e057600080fd5b5060075461039e906001600160a01b031681565b6102f7610a02366004613309565b611533565b348015610a1357600080fd5b506102f7610a22366004612c14565b611608565b6102f7610a3536600461332b565b61167e565b348015610a4657600080fd5b506102f7610a55366004612a44565b6116fa565b6102f7610a68366004612c6f565b61173d565b6008546001600160a01b03163314610a9857604051637d92a0f560e11b815260040160405180910390fd5b610aa48484848461175a565b50505050565b606060038054610ab9906133f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae5906133f5565b8015610b325780601f10610b0757610100808354040283529160200191610b32565b820191906000526020600020905b815481529060010190602001808311610b1557829003601f168201915b5050505050905090565b60008060405160016235f76760e11b0319815260040160405180910390fd5b600033610b698185856118ce565b60019150505b92915050565b600060405160016235f76760e11b0319815260040160405180910390fd5b600080610c0d7f0000000000000000000000000000000000000000000000000000000000000000867f0000000000000000000000000000000000000000000000000000000000000000610be6898b6119f2565b3388604051602001610bf992919061342f565b60405160208183030381529060405261103c565b600754604080516000815260208101918290526342feeaa160e11b9091529192506001600160a01b0316906385fdd54290610c509087908a908660248201613453565b602060405180830381865afa158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c91919061348d565b9695505050505050565b600033610ca9858285611adb565b610cb4858585611b4f565b506001949350505050565b610cc7611bad565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b610cf1611c07565b600a54600160401b900460ff16610d235760405162461bcd60e51b8152600401610d1a906134a6565b60405180910390fd5b336000908152600e602052604090205460ff1615610d6d5760405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606401610d1a565b6000610d798233610e06565b9050610d8582826134e0565b341015610da45760405162461bcd60e51b8152600401610d1a906134f3565b600a54601054610dd69183916001600160401b03909116906001600160a01b031685610dd03388611c60565b33611cb2565b50610de16001600655565b50565b600033610b69818585610df78383611404565b610e0191906134e0565b6118ce565b600a54601054600091610e33916001600160401b03909116906001600160a01b03168561044c8682611c60565b9392505050565b600a54601054600091610e68916001600160401b03909116906001600160a01b03168661044c878288611dde565b949350505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190613522565b60405163589301d360e01b81526001600160401b0385166004820152602481018490526001600160a01b03919091169063589301d3906044015b602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e33919061348d565b610f61611c07565b610f6e8433848685611e33565b610aa46001600655565b600a54601054600091610e68916001600160401b03909116906001600160a01b03168661044c878288611f7d565b610fae611bad565b610fb86000611f86565b565b6000611031878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250611fd892505050565b979650505050505050565b606085856001600160a01b031685858560405160200161106095949392919061353f565b604051602081830303815290604052905095945050505050565b606060048054610ab9906133f5565b600a54601054600091610e68916001600160401b03909116906001600160a01b03166110b587866134e0565b61044c878988612059565b600033816110ce8286611404565b90508381101561112e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d1a565b610cb482868684036118ce565b600033610b69818585611b4f565b6060600082516001600160401b0381111561116657611166612aa5565b60405190808252806020026020018201604052801561119957816020015b60608152602001906001900390816111845790505b50905060005b8351811015611257576112328882815181106111bd576111bd6135a2565b60200260200101518883815181106111d7576111d76135a2565b60200260200101518884815181106111f1576111f16135a2565b602002602001015188858151811061120b5761120b6135a2565b6020026020010151888681518110611225576112256135a2565b602002602001015161103c565b828281518110611244576112446135a2565b602090810291909101015260010161119f565b509695505050505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa1580156112ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d09190613522565b604051631847a22760e31b81526001600160401b0385166004820152602481018490526001600160a01b03919091169063c23d113890604401610f18565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190613522565b60405163cb2bfa9360e01b81526001600160401b0385166004820152602481018490526001600160a01b03919091169063cb2bfa9390604401610f18565b606089896001600160a01b0316898989898989896040516020016113e6999897969594939291906135b8565b60405160208183030381529060405290509998505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b33301461148a5760405162461bcd60e51b815260206004820152602360248201527f455243333134506c7573436f72653a2063616c6c6572206d757374206265207360448201526232b63360e91b6064820152608401610d1a565b600a546001600160401b03908116908716036114e8576114e38686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061206292505050565b61152b565b61152b8686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219492505050565b505050505050565b61153b611c07565b600a54600160401b900460ff16156115805760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b6044820152606401610d1a565b600061158d833384611089565b90508261159a82846134e0565b6115a491906134e0565b3410156115c35760405162461bcd60e51b8152600401610d1a906134f3565b600a546010546115f99183916001600160401b03909116906001600160a01b03166115ee87876134e0565b610dd0338989612059565b506116046001600655565b5050565b611610611bad565b6001600160a01b0381166116755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d1a565b610de181611f86565b60075460405163104d7f2b60e11b81526001600160a01b039091169063209afe569034906116be908c908c908c908c908c908c908c908c90600401613651565b6000604051808303818588803b1580156116d757600080fd5b505af11580156116eb573d6000803e3d6000fd5b50505050505050505050505050565b611702611bad565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611738573d6000803e3d6000fd5b505050565b611745611c07565b611750838383612240565b6117386001600655565b611764848461230f565b6117a05760405162461bcd60e51b815260206004820152600d60248201526c3ab730baba3437b934bd32b21760991b6044820152606401610d1a565b6000806117af838501856136c7565b915091506001600b60008282546117c691906134e0565b90915550506040517ff496afe4c96f98ccadfe979e32fee625d67b649ab3b164a018eedbaecdcb7b2a90611801908890859034908690613716565b60405180910390a1600080600083806020019051810190611822919061374c565b925092509250600080611837858c8686612344565b909250905060008161184984876134e0565b61185391906137e1565b9050811561189757600c546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611895573d6000803e3d6000fd5b505b6000806118a88e8b8a8a878b61235e565b91509150816118be576118be8e8b8b84876123d5565b5050505050505050505050505050565b6001600160a01b0383166119305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d1a565b6001600160a01b0382166119915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d1a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a609190613522565b604051632aee183f60e21b81526001600160a01b0385811660048301526001600160401b0385166024830152919091169063abb860fc90604401602060405180830381865afa158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3391906137f4565b6000611ae78484611404565b90506000198114610aa45781811015611b425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d1a565b610aa484848484036118ce565b333014801590611b6757506001600160a01b03821630145b15611ba25760405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606401610d1a565b611738838383612436565b6005546001600160a01b03163314610fb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d1a565b600260065403611c595760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d1a565b6002600655565b604080516001600160a01b038416602082015260609160029184910160408051601f1981840301815290829052611c9b939291602001613811565b604051602081830303815290604052905092915050565b6000611d047f0000000000000000000000000000000000000000000000000000000000000000867f0000000000000000000000000000000000000000000000000000000000000000610be6898b6119f2565b90506000611d1288866134e0565b905080341015611d555760405162461bcd60e51b815260206004820152600e60248201526d313934b233b2a332b29032b9391760911b6044820152606401610d1a565b6007546001600160a01b031663209afe56826000807f0000000000000000000000000000000000000000000000000000000000000000888b8e846040519080825280601f01601f191660200182016040528015611db9576020820181803683370190505b508b6040518a63ffffffff1660e01b81526004016116be989796959493929190613651565b606060045b604080516001600160a01b038716602082015280820185905281518082038301815260608201909252611e1b92918691608001613811565b60405160208183030381529060405290509392505050565b600a54600160401b900460ff16611e5c5760405162461bcd60e51b8152600401610d1a906134a6565b60008211611e7c5760405162461bcd60e51b8152600401610d1a90613833565b801580611e8857504281115b611ea45760405162461bcd60e51b8152600401610d1a9061385b565b81611ec4856001600160a01b031660009081526020819052604090205490565b1015611f125760405162461bcd60e51b815260206004820152601b60248201527f73656c6c20616d6f756e7420657863656564732062616c616e636500000000006044820152606401610d1a565b6000611f1f868585610f78565b9050611f2b86826134e0565b341015611f4a5760405162461bcd60e51b8152600401610d1a906134f3565b611f5485846125c8565b600a5460105461152b9183916001600160401b03909116906001600160a01b031689610dd089828a5b60606006611de3565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546040516342feeaa160e11b81526000916001600160a01b0316906385fdd5429061200f908890889088908890600401613453565b602060405180830381865afa15801561202c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612050919061348d565b95945050505050565b60606000611de3565b60ff831661209857600080828060200190518101906120819190613882565b91509150612091878784846126e8565b505061218d565b60021960ff8416016120d8576000806000838060200190518101906120bd91906138b0565b9250925092506120d0888885858561271b565b50505061218d565b60041960ff841601612110576000806000838060200190518101906120fd91906138b0565b9250925092506120d08888858585612791565b60061960ff8416016121485760008060008380602001905181019061213591906138b0565b9250925092506120d08888858486612791565b60001960ff8416016121715761216c600a805460ff60401b1916600160401b179055565b61218d565b60405160016235f76760e11b0319815260040160405180910390fd5b5050505050565b60ff83166121c457600080828060200190518101906121b39190613882565b915091506120918488888585612171565b60011960ff8416016121fa576000818060200190518101906121e69190613522565b90506121f483878784612171565b5061218d565b60031960ff84160161221d57600080828060200190518101906121b39190613882565b60051960ff84160161217157600080828060200190518101906121b39190613882565b600a54600160401b900460ff166122695760405162461bcd60e51b8152600401610d1a906134a6565b80158061227557504281115b6122915760405162461bcd60e51b8152600401610d1a9061385b565b600061229e848434610e3a565b90506000846122ad83346137e1565b6122b791906137e1565b9050600081116122d95760405162461bcd60e51b8152600401610d1a90613833565b600a5460105461218d9184916001600160401b03909116906001600160a01b031661230489866134e0565b610dd0898b88611dde565b6010546000906001600160a01b038381169116148015610e335750600a546001600160401b0390811690841614905092915050565b60008061235184346137e1565b9660009650945050505050565b600060606123c65a85609663de2a60f760e01b8c8c8c8c8b60405160240161238a9594939291906138e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230939291906127dd565b90999098509650505050505050565b6001600960008282546123e891906134e0565b90915550506040517ff0b808371c16e9cdc7de5c17ebb6bc3166c06a15d8112e2b44164fde17efadfe9061242790879087908790879034908890613926565b60405180910390a15050505050565b6001600160a01b03831661249a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d1a565b6001600160a01b0382166124fc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d1a565b6001600160a01b038316600090815260208190526040902054818110156125745760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d1a565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020613982833981519152910160405180910390a3610aa4565b6001600160a01b0382166126285760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d1a565b6001600160a01b0382166000908152602081905260409020548181101561269c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d1a565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020613982833981519152910160405180910390a3505050565b6001600160a01b0382166000908152600d6020526040812080548392906127109084906134e0565b909155505050505050565b801561272b5761272b8382612867565b8115612769576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612767573d6000803e3d6000fd5b505b50506001600160a01b03166000908152600e60205260409020805460ff191660011790555050565b80156127a1576127a18382612867565b811561218d576040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015801561152b573d6000803e3d6000fd5b6000606060008060008661ffff166001600160401b0381111561280257612802612aa5565b6040519080825280601f01601f19166020018201604052801561282c576020820181803683370190505b5090506000808751602089018b8e8ef191503d92508683111561284d578692505b828152826000602083013e90999098509650505050505050565b6001600160a01b0382166128bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d1a565b80600260008282546128cf91906134e0565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020613982833981519152910160405180910390a35050565b6001600160401b0381168114610de157600080fd5b60008083601f84011261293b57600080fd5b5081356001600160401b0381111561295257600080fd5b60208301915083602082850101111561296a57600080fd5b9250929050565b6000806000806060858703121561298757600080fd5b843561299281612914565b93506020850135925060408501356001600160401b038111156129b457600080fd5b6129c087828801612929565b95989497509550505050565b60005b838110156129e75781810151838201526020016129cf565b50506000910152565b60008151808452612a088160208601602086016129cc565b601f01601f19169290920160200192915050565b602081526000610e3360208301846129f0565b6001600160a01b0381168114610de157600080fd5b60008060408385031215612a5757600080fd5b8235612a6281612a2f565b946020939093013593505050565b60008060408385031215612a8357600080fd5b8235915060208301358015158114612a9a57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612ae357612ae3612aa5565b604052919050565b60006001600160401b03821115612b0457612b04612aa5565b50601f01601f191660200190565b600082601f830112612b2357600080fd5b8135612b36612b3182612aeb565b612abb565b818152846020838601011115612b4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612b7e57600080fd5b8435612b8981612914565b93506020850135612b9981612a2f565b92506040850135915060608501356001600160401b03811115612bbb57600080fd5b612bc787828801612b12565b91505092959194509250565b600080600060608486031215612be857600080fd5b8335612bf381612a2f565b92506020840135612c0381612a2f565b929592945050506040919091013590565b600060208284031215612c2657600080fd5b8135610e3381612a2f565b600060208284031215612c4357600080fd5b5035919050565b60008060408385031215612c5d57600080fd5b823591506020830135612a9a81612a2f565b600080600060608486031215612c8457600080fd5b833592506020840135612c0381612a2f565b60008060408385031215612ca957600080fd5b8235612a6281612914565b60008060008060808587031215612cca57600080fd5b84359350602085013592506040850135612ce381612a2f565b9396929550929360600135925050565b60008060008060008060808789031215612d0c57600080fd5b863595506020870135612d1e81612914565b945060408701356001600160401b0380821115612d3a57600080fd5b612d468a838b01612929565b90965094506060890135915080821115612d5f57600080fd5b50612d6c89828a01612929565b979a9699509497509295939492505050565b80356001600160f81b031981168114612d9657600080fd5b919050565b803562ffffff81168114612d9657600080fd5b600080600080600060a08688031215612dc657600080fd5b612dcf86612d7e565b94506020860135612ddf81612a2f565b9350612ded60408701612d9b565b92506060860135612dfd81612914565b915060808601356001600160401b03811115612e1857600080fd5b612e2488828901612b12565b9150509295509295909350565b60006001600160401b03821115612e4a57612e4a612aa5565b5060051b60200190565b600082601f830112612e6557600080fd5b81356020612e75612b3183612e31565b8083825260208201915060208460051b870101935086841115612e9757600080fd5b602086015b8481101561125757612ead81612d7e565b8352918301918301612e9c565b600082601f830112612ecb57600080fd5b81356020612edb612b3183612e31565b8083825260208201915060208460051b870101935086841115612efd57600080fd5b602086015b84811015611257578035612f1581612a2f565b8352918301918301612f02565b600082601f830112612f3357600080fd5b81356020612f43612b3183612e31565b8083825260208201915060208460051b870101935086841115612f6557600080fd5b602086015b8481101561125757612f7b81612d9b565b8352918301918301612f6a565b600082601f830112612f9957600080fd5b81356020612fa9612b3183612e31565b8083825260208201915060208460051b870101935086841115612fcb57600080fd5b602086015b84811015611257578035612fe381612914565b8352918301918301612fd0565b600082601f83011261300157600080fd5b81356020613011612b3183612e31565b82815260059290921b8401810191818101908684111561303057600080fd5b8286015b848110156112575780356001600160401b038111156130535760008081fd5b6130618986838b0101612b12565b845250918301918301613034565b600080600080600060a0868803121561308757600080fd5b85356001600160401b038082111561309e57600080fd5b6130aa89838a01612e54565b965060208801359150808211156130c057600080fd5b6130cc89838a01612eba565b955060408801359150808211156130e257600080fd5b6130ee89838a01612f22565b9450606088013591508082111561310457600080fd5b61311089838a01612f88565b9350608088013591508082111561312657600080fd5b50612e2488828901612ff0565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561318a57603f198886030184526131788583516129f0565b9450928501929085019060010161315c565b5092979650505050505050565b60008060008060008060008060006101208a8c0312156131b657600080fd5b6131bf8a612d7e565b985060208a01356131cf81612a2f565b97506131dd60408b01612d9b565b965060608a01356131ed81612914565b95506131fb60808b01612d7e565b945060a08a013561320b81612a2f565b935060c08a013561321b81612a2f565b925060e08a013591506101008a01356001600160401b0381111561323e57600080fd5b61324a8c828d01612b12565b9150509295985092959850929598565b6000806040838503121561326d57600080fd5b823561327881612a2f565b91506020830135612a9a81612a2f565b60ff81168114610de157600080fd5b60008060008060008060a087890312156132b057600080fd5b86356132bb81612914565b955060208701356132cb81612a2f565b945060408701356132db81613288565b93506060870135925060808701356001600160401b038111156132fd57600080fd5b612d6c89828a01612929565b6000806040838503121561331c57600080fd5b50508035926020909101359150565b600080600080600080600080610100898b03121561334857600080fd5b883561335381612914565b9750602089013561336381612914565b9650604089013561337381612a2f565b9550606089013561338381612a2f565b94506080890135935060a089013561339a81612914565b925060c08901356001600160401b03808211156133b657600080fd5b6133c28c838d01612b12565b935060e08b01359150808211156133d857600080fd5b506133e58b828c01612b12565b9150509295985092959890939650565b600181811c9082168061340957607f821691505b60208210810361342957634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b0383168152604060208201819052600090610e68908301846129f0565b8481526001600160401b038416602082015260806040820152600061347b60808301856129f0565b828103606084015261103181856129f0565b60006020828403121561349f57600080fd5b5051919050565b6020808252600a90820152691d5b9b185d5b98da195960b21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b6f57610b6f6134ca565b6020808252601590820152740c4e4d2c8ceca40cccaca40dcdee840cadcdeeaced605b1b604082015260600190565b60006020828403121561353457600080fd5b8151610e3381612a2f565b6001600160f81b0319861681526001810185905260e884901b6001600160e81b031916602182015260c083901b6001600160c01b0319166024820152815160009061359181602c8501602087016129cc565b91909101602c019695505050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160f81b03198a81168252600182018a90526001600160e81b031960e88a901b1660218301526001600160c01b031960c089901b1660248301528616602c8201526bffffffffffffffffffffffff19606086811b8216602d84015285901b16604182015260558101839052815160009061363c8160758501602087016129cc565b919091016075019a9950505050505050505050565b6001600160401b03898116825288811660208301526001600160a01b0388811660408401528716606083015260808201869052841660a082015261010060c082018190526000906136a4838201866129f0565b905082810360e08401526136b881856129f0565b9b9a5050505050505050505050565b600080604083850312156136da57600080fd5b82356136e581612a2f565b915060208301356001600160401b0381111561370057600080fd5b61370c85828601612b12565b9150509250929050565b6001600160401b038516815260018060a01b0384166020820152826040820152608060608201526000610c9160808301846129f0565b60008060006060848603121561376157600080fd5b835161376c81613288565b6020850151604086015191945092506001600160401b0381111561378f57600080fd5b8401601f810186136137a057600080fd5b80516137ae612b3182612aeb565b8181528760208385010111156137c357600080fd5b6137d48260208301602086016129cc565b8093505050509250925092565b81810381811115610b6f57610b6f6134ca565b60006020828403121561380657600080fd5b8151610e3381612914565b60ff8416815282602082015260606040820152600061205060608301846129f0565b6020808252600e908201526d30b6b7bab73a1034b71032b9391760911b604082015260600190565b6020808252600d908201526c3232b0b23634b7329032b9391760991b604082015260600190565b6000806040838503121561389557600080fd5b82516138a081612a2f565b6020939093015192949293505050565b6000806000606084860312156138c557600080fd5b83516138d081612a2f565b602085015160409095015190969495509392505050565b6001600160401b038616815260018060a01b038516602082015260ff8416604082015282606082015260a06080820152600061103160a08301846129f0565b6001600160401b03871681526001600160a01b038616602082015260c060408201819052600090613959908301876129f0565b828103606084015261396b81876129f0565b6080840195909552505060a0015294935050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202f2344a7484a5fd7e9ec9f6dc35849c991fa5f61f98e1a17a6f6823f4b61ad1c64736f6c63430008170033000000000000000000000000523d8b6893d2d0ce2b48e7964432ce19a2c641f20000000000000000000000000000000000000000000000000000000000006f66
Deployed Bytecode
0x6080604052600436106102d85760003560e01c806376c813121161017b578063c884ef83116100d7578063de8aeda011610085578063de8aeda0146109a0578063e0b838e9146109d4578063e2bbb158146109f4578063f2fde38b14610a07578063fd39aa4414610a27578063fd9be52214610a3a578063ffee770f14610a5a57600080fd5b8063c884ef83146108b0578063cb13cddb146108e0578063cb2bfa931461090d578063cd446e221461092d578063dd39fbe11461094d578063dd62ed3e1461096d578063de2a60f71461098d57600080fd5b806397945d2d1161013457806397945d2d1461079b5780639b1762d9146107bb578063a457c2d7146107ef578063a9059cbb1461080f578063b0cfd4d21461082f578063b368574114610863578063c23d11381461089057600080fd5b806376c81312146106f1578063786627ce146107115780638091f3bf146107275780638aa71869146107485780638da5cb5b1461076857806395d89b411461078657600080fd5b806339509351116102355780635ad3ad06116101e35780635ad3ad06146105c35780635aeb4d77146105f75780635c7e072b1461063f5780635e45da23146106525780636715f7091461068657806370a08231146106a6578063715018a6146106dc57600080fd5b806339509351146104c057806341275358146104e0578063456362791461050057806346093c1b1461054d5780634c2c83701461056d578063575580d71461058d578063589301d3146105a357600080fd5b806311106ee21161029257806311106ee2146103ee57806318160ddd1461041c5780631b6fa94a1461043157806323b872dd146104515780632a3a236f14610471578063313ce56714610491578063379607f5146104ad57600080fd5b806273b555146102e457806306fdde03146102f95780630902f1ac14610324578063095ea7b31461034e5780630e82845d1461037e57806310c3cf06146103b657600080fd5b366102df57005b600080fd5b6102f76102f2366004612971565b610a6d565b005b34801561030557600080fd5b5061030e610aaa565b60405161031b9190612a1c565b60405180910390f35b34801561033057600080fd5b50610339610b3c565b6040805192835260208301919091520161031b565b34801561035a57600080fd5b5061036e610369366004612a44565b610b5b565b604051901515815260200161031b565b34801561038a57600080fd5b5060085461039e906001600160a01b031681565b6040516001600160a01b03909116815260200161031b565b3480156103c257600080fd5b50600a546103d6906001600160401b031681565b6040516001600160401b03909116815260200161031b565b3480156103fa57600080fd5b5061040e610409366004612a70565b610b75565b60405190815260200161031b565b34801561042857600080fd5b5060025461040e565b34801561043d57600080fd5b5061040e61044c366004612b68565b610b93565b34801561045d57600080fd5b5061036e61046c366004612bd3565b610c9b565b34801561047d57600080fd5b506102f761048c366004612c14565b610cbf565b34801561049d57600080fd5b506040516012815260200161031b565b6102f76104bb366004612c31565b610ce9565b3480156104cc57600080fd5b5061036e6104db366004612a44565b610de4565b3480156104ec57600080fd5b50600c5461039e906001600160a01b031681565b34801561050c57600080fd5b506105347f010000000000000000000000000000000000000000000000000000000000000081565b6040516001600160f81b0319909116815260200161031b565b34801561055957600080fd5b5061040e610568366004612c4a565b610e06565b34801561057957600080fd5b5061040e610588366004612c6f565b610e3a565b34801561059957600080fd5b5061040e60095481565b3480156105af57600080fd5b5061040e6105be366004612c96565b610e70565b3480156105cf57600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000000003c81565b34801561060357600080fd5b5061062b7f00000000000000000000000000000000000000000000000000000000000186a081565b60405162ffffff909116815260200161031b565b6102f761064d366004612cb4565b610f59565b34801561065e57600080fd5b5061062b7f00000000000000000000000000000000000000000000000000000000000f424081565b34801561069257600080fd5b5061040e6106a1366004612c6f565b610f78565b3480156106b257600080fd5b5061040e6106c1366004612c14565b6001600160a01b031660009081526020819052604090205490565b3480156106e857600080fd5b506102f7610fa6565b3480156106fd57600080fd5b5061040e61070c366004612cf3565b610fba565b34801561071d57600080fd5b5061040e600b5481565b34801561073357600080fd5b50600a5461036e90600160401b900460ff1681565b34801561075457600080fd5b5061030e610763366004612dae565b61103c565b34801561077457600080fd5b506005546001600160a01b031661039e565b34801561079257600080fd5b5061030e61107a565b3480156107a757600080fd5b5061040e6107b6366004612c6f565b611089565b3480156107c757600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000000000081565b3480156107fb57600080fd5b5061036e61080a366004612a44565b6110c0565b34801561081b57600080fd5b5061036e61082a366004612a44565b61113b565b34801561083b57600080fd5b5061039e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561086f57600080fd5b5061088361087e36600461306f565b611149565b60405161031b9190613133565b34801561089c57600080fd5b5061040e6108ab366004612c96565b611262565b3480156108bc57600080fd5b5061036e6108cb366004612c14565b600e6020526000908152604090205460ff1681565b3480156108ec57600080fd5b5061040e6108fb366004612c14565b600d6020526000908152604090205481565b34801561091957600080fd5b5061040e610928366004612c96565b61130e565b34801561093957600080fd5b5060105461039e906001600160a01b031681565b34801561095957600080fd5b5061030e610968366004613197565b6113ba565b34801561097957600080fd5b5061040e61098836600461325a565b611404565b6102f761099b366004613297565b61142f565b3480156109ac57600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000001518081565b3480156109e057600080fd5b5060075461039e906001600160a01b031681565b6102f7610a02366004613309565b611533565b348015610a1357600080fd5b506102f7610a22366004612c14565b611608565b6102f7610a3536600461332b565b61167e565b348015610a4657600080fd5b506102f7610a55366004612a44565b6116fa565b6102f7610a68366004612c6f565b61173d565b6008546001600160a01b03163314610a9857604051637d92a0f560e11b815260040160405180910390fd5b610aa48484848461175a565b50505050565b606060038054610ab9906133f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae5906133f5565b8015610b325780601f10610b0757610100808354040283529160200191610b32565b820191906000526020600020905b815481529060010190602001808311610b1557829003601f168201915b5050505050905090565b60008060405160016235f76760e11b0319815260040160405180910390fd5b600033610b698185856118ce565b60019150505b92915050565b600060405160016235f76760e11b0319815260040160405180910390fd5b600080610c0d7f0100000000000000000000000000000000000000000000000000000000000000867f00000000000000000000000000000000000000000000000000000000000f4240610be6898b6119f2565b3388604051602001610bf992919061342f565b60405160208183030381529060405261103c565b600754604080516000815260208101918290526342feeaa160e11b9091529192506001600160a01b0316906385fdd54290610c509087908a908660248201613453565b602060405180830381865afa158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c91919061348d565b9695505050505050565b600033610ca9858285611adb565b610cb4858585611b4f565b506001949350505050565b610cc7611bad565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b610cf1611c07565b600a54600160401b900460ff16610d235760405162461bcd60e51b8152600401610d1a906134a6565b60405180910390fd5b336000908152600e602052604090205460ff1615610d6d5760405162461bcd60e51b815260206004820152600760248201526618db185a5b595960ca1b6044820152606401610d1a565b6000610d798233610e06565b9050610d8582826134e0565b341015610da45760405162461bcd60e51b8152600401610d1a906134f3565b600a54601054610dd69183916001600160401b03909116906001600160a01b031685610dd03388611c60565b33611cb2565b50610de16001600655565b50565b600033610b69818585610df78383611404565b610e0191906134e0565b6118ce565b600a54601054600091610e33916001600160401b03909116906001600160a01b03168561044c8682611c60565b9392505050565b600a54601054600091610e68916001600160401b03909116906001600160a01b03168661044c878288611dde565b949350505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190613522565b60405163589301d360e01b81526001600160401b0385166004820152602481018490526001600160a01b03919091169063589301d3906044015b602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e33919061348d565b610f61611c07565b610f6e8433848685611e33565b610aa46001600655565b600a54601054600091610e68916001600160401b03909116906001600160a01b03168661044c878288611f7d565b610fae611bad565b610fb86000611f86565b565b6000611031878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250611fd892505050565b979650505050505050565b606085856001600160a01b031685858560405160200161106095949392919061353f565b604051602081830303815290604052905095945050505050565b606060048054610ab9906133f5565b600a54601054600091610e68916001600160401b03909116906001600160a01b03166110b587866134e0565b61044c878988612059565b600033816110ce8286611404565b90508381101561112e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d1a565b610cb482868684036118ce565b600033610b69818585611b4f565b6060600082516001600160401b0381111561116657611166612aa5565b60405190808252806020026020018201604052801561119957816020015b60608152602001906001900390816111845790505b50905060005b8351811015611257576112328882815181106111bd576111bd6135a2565b60200260200101518883815181106111d7576111d76135a2565b60200260200101518884815181106111f1576111f16135a2565b602002602001015188858151811061120b5761120b6135a2565b6020026020010151888681518110611225576112256135a2565b602002602001015161103c565b828281518110611244576112446135a2565b602090810291909101015260010161119f565b509695505050505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa1580156112ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d09190613522565b604051631847a22760e31b81526001600160401b0385166004820152602481018490526001600160a01b03919091169063c23d113890604401610f18565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015611358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137c9190613522565b60405163cb2bfa9360e01b81526001600160401b0385166004820152602481018490526001600160a01b03919091169063cb2bfa9390604401610f18565b606089896001600160a01b0316898989898989896040516020016113e6999897969594939291906135b8565b60405160208183030381529060405290509998505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b33301461148a5760405162461bcd60e51b815260206004820152602360248201527f455243333134506c7573436f72653a2063616c6c6572206d757374206265207360448201526232b63360e91b6064820152608401610d1a565b600a546001600160401b03908116908716036114e8576114e38686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061206292505050565b61152b565b61152b8686868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061219492505050565b505050505050565b61153b611c07565b600a54600160401b900460ff16156115805760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b6044820152606401610d1a565b600061158d833384611089565b90508261159a82846134e0565b6115a491906134e0565b3410156115c35760405162461bcd60e51b8152600401610d1a906134f3565b600a546010546115f99183916001600160401b03909116906001600160a01b03166115ee87876134e0565b610dd0338989612059565b506116046001600655565b5050565b611610611bad565b6001600160a01b0381166116755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d1a565b610de181611f86565b60075460405163104d7f2b60e11b81526001600160a01b039091169063209afe569034906116be908c908c908c908c908c908c908c908c90600401613651565b6000604051808303818588803b1580156116d757600080fd5b505af11580156116eb573d6000803e3d6000fd5b50505050505050505050505050565b611702611bad565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611738573d6000803e3d6000fd5b505050565b611745611c07565b611750838383612240565b6117386001600655565b611764848461230f565b6117a05760405162461bcd60e51b815260206004820152600d60248201526c3ab730baba3437b934bd32b21760991b6044820152606401610d1a565b6000806117af838501856136c7565b915091506001600b60008282546117c691906134e0565b90915550506040517ff496afe4c96f98ccadfe979e32fee625d67b649ab3b164a018eedbaecdcb7b2a90611801908890859034908690613716565b60405180910390a1600080600083806020019051810190611822919061374c565b925092509250600080611837858c8686612344565b909250905060008161184984876134e0565b61185391906137e1565b9050811561189757600c546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611895573d6000803e3d6000fd5b505b6000806118a88e8b8a8a878b61235e565b91509150816118be576118be8e8b8b84876123d5565b5050505050505050505050505050565b6001600160a01b0383166119305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d1a565b6001600160a01b0382166119915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d1a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6007546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a609190613522565b604051632aee183f60e21b81526001600160a01b0385811660048301526001600160401b0385166024830152919091169063abb860fc90604401602060405180830381865afa158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3391906137f4565b6000611ae78484611404565b90506000198114610aa45781811015611b425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d1a565b610aa484848484036118ce565b333014801590611b6757506001600160a01b03821630145b15611ba25760405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606401610d1a565b611738838383612436565b6005546001600160a01b03163314610fb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d1a565b600260065403611c595760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d1a565b6002600655565b604080516001600160a01b038416602082015260609160029184910160408051601f1981840301815290829052611c9b939291602001613811565b604051602081830303815290604052905092915050565b6000611d047f0100000000000000000000000000000000000000000000000000000000000000867f00000000000000000000000000000000000000000000000000000000000f4240610be6898b6119f2565b90506000611d1288866134e0565b905080341015611d555760405162461bcd60e51b815260206004820152600e60248201526d313934b233b2a332b29032b9391760911b6044820152606401610d1a565b6007546001600160a01b031663209afe56826000807f0000000000000000000000000000000000000000000000000000000000000000888b8e846040519080825280601f01601f191660200182016040528015611db9576020820181803683370190505b508b6040518a63ffffffff1660e01b81526004016116be989796959493929190613651565b606060045b604080516001600160a01b038716602082015280820185905281518082038301815260608201909252611e1b92918691608001613811565b60405160208183030381529060405290509392505050565b600a54600160401b900460ff16611e5c5760405162461bcd60e51b8152600401610d1a906134a6565b60008211611e7c5760405162461bcd60e51b8152600401610d1a90613833565b801580611e8857504281115b611ea45760405162461bcd60e51b8152600401610d1a9061385b565b81611ec4856001600160a01b031660009081526020819052604090205490565b1015611f125760405162461bcd60e51b815260206004820152601b60248201527f73656c6c20616d6f756e7420657863656564732062616c616e636500000000006044820152606401610d1a565b6000611f1f868585610f78565b9050611f2b86826134e0565b341015611f4a5760405162461bcd60e51b8152600401610d1a906134f3565b611f5485846125c8565b600a5460105461152b9183916001600160401b03909116906001600160a01b031689610dd089828a5b60606006611de3565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546040516342feeaa160e11b81526000916001600160a01b0316906385fdd5429061200f908890889088908890600401613453565b602060405180830381865afa15801561202c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612050919061348d565b95945050505050565b60606000611de3565b60ff831661209857600080828060200190518101906120819190613882565b91509150612091878784846126e8565b505061218d565b60021960ff8416016120d8576000806000838060200190518101906120bd91906138b0565b9250925092506120d0888885858561271b565b50505061218d565b60041960ff841601612110576000806000838060200190518101906120fd91906138b0565b9250925092506120d08888858585612791565b60061960ff8416016121485760008060008380602001905181019061213591906138b0565b9250925092506120d08888858486612791565b60001960ff8416016121715761216c600a805460ff60401b1916600160401b179055565b61218d565b60405160016235f76760e11b0319815260040160405180910390fd5b5050505050565b60ff83166121c457600080828060200190518101906121b39190613882565b915091506120918488888585612171565b60011960ff8416016121fa576000818060200190518101906121e69190613522565b90506121f483878784612171565b5061218d565b60031960ff84160161221d57600080828060200190518101906121b39190613882565b60051960ff84160161217157600080828060200190518101906121b39190613882565b600a54600160401b900460ff166122695760405162461bcd60e51b8152600401610d1a906134a6565b80158061227557504281115b6122915760405162461bcd60e51b8152600401610d1a9061385b565b600061229e848434610e3a565b90506000846122ad83346137e1565b6122b791906137e1565b9050600081116122d95760405162461bcd60e51b8152600401610d1a90613833565b600a5460105461218d9184916001600160401b03909116906001600160a01b031661230489866134e0565b610dd0898b88611dde565b6010546000906001600160a01b038381169116148015610e335750600a546001600160401b0390811690841614905092915050565b60008061235184346137e1565b9660009650945050505050565b600060606123c65a85609663de2a60f760e01b8c8c8c8c8b60405160240161238a9594939291906138e7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230939291906127dd565b90999098509650505050505050565b6001600960008282546123e891906134e0565b90915550506040517ff0b808371c16e9cdc7de5c17ebb6bc3166c06a15d8112e2b44164fde17efadfe9061242790879087908790879034908890613926565b60405180910390a15050505050565b6001600160a01b03831661249a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d1a565b6001600160a01b0382166124fc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d1a565b6001600160a01b038316600090815260208190526040902054818110156125745760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d1a565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020613982833981519152910160405180910390a3610aa4565b6001600160a01b0382166126285760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d1a565b6001600160a01b0382166000908152602081905260409020548181101561269c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d1a565b6001600160a01b038316600081815260208181526040808320868603905560028054879003905551858152919291600080516020613982833981519152910160405180910390a3505050565b6001600160a01b0382166000908152600d6020526040812080548392906127109084906134e0565b909155505050505050565b801561272b5761272b8382612867565b8115612769576040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015612767573d6000803e3d6000fd5b505b50506001600160a01b03166000908152600e60205260409020805460ff191660011790555050565b80156127a1576127a18382612867565b811561218d576040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015801561152b573d6000803e3d6000fd5b6000606060008060008661ffff166001600160401b0381111561280257612802612aa5565b6040519080825280601f01601f19166020018201604052801561282c576020820181803683370190505b5090506000808751602089018b8e8ef191503d92508683111561284d578692505b828152826000602083013e90999098509650505050505050565b6001600160a01b0382166128bd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d1a565b80600260008282546128cf91906134e0565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020613982833981519152910160405180910390a35050565b6001600160401b0381168114610de157600080fd5b60008083601f84011261293b57600080fd5b5081356001600160401b0381111561295257600080fd5b60208301915083602082850101111561296a57600080fd5b9250929050565b6000806000806060858703121561298757600080fd5b843561299281612914565b93506020850135925060408501356001600160401b038111156129b457600080fd5b6129c087828801612929565b95989497509550505050565b60005b838110156129e75781810151838201526020016129cf565b50506000910152565b60008151808452612a088160208601602086016129cc565b601f01601f19169290920160200192915050565b602081526000610e3360208301846129f0565b6001600160a01b0381168114610de157600080fd5b60008060408385031215612a5757600080fd5b8235612a6281612a2f565b946020939093013593505050565b60008060408385031215612a8357600080fd5b8235915060208301358015158114612a9a57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612ae357612ae3612aa5565b604052919050565b60006001600160401b03821115612b0457612b04612aa5565b50601f01601f191660200190565b600082601f830112612b2357600080fd5b8135612b36612b3182612aeb565b612abb565b818152846020838601011115612b4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215612b7e57600080fd5b8435612b8981612914565b93506020850135612b9981612a2f565b92506040850135915060608501356001600160401b03811115612bbb57600080fd5b612bc787828801612b12565b91505092959194509250565b600080600060608486031215612be857600080fd5b8335612bf381612a2f565b92506020840135612c0381612a2f565b929592945050506040919091013590565b600060208284031215612c2657600080fd5b8135610e3381612a2f565b600060208284031215612c4357600080fd5b5035919050565b60008060408385031215612c5d57600080fd5b823591506020830135612a9a81612a2f565b600080600060608486031215612c8457600080fd5b833592506020840135612c0381612a2f565b60008060408385031215612ca957600080fd5b8235612a6281612914565b60008060008060808587031215612cca57600080fd5b84359350602085013592506040850135612ce381612a2f565b9396929550929360600135925050565b60008060008060008060808789031215612d0c57600080fd5b863595506020870135612d1e81612914565b945060408701356001600160401b0380821115612d3a57600080fd5b612d468a838b01612929565b90965094506060890135915080821115612d5f57600080fd5b50612d6c89828a01612929565b979a9699509497509295939492505050565b80356001600160f81b031981168114612d9657600080fd5b919050565b803562ffffff81168114612d9657600080fd5b600080600080600060a08688031215612dc657600080fd5b612dcf86612d7e565b94506020860135612ddf81612a2f565b9350612ded60408701612d9b565b92506060860135612dfd81612914565b915060808601356001600160401b03811115612e1857600080fd5b612e2488828901612b12565b9150509295509295909350565b60006001600160401b03821115612e4a57612e4a612aa5565b5060051b60200190565b600082601f830112612e6557600080fd5b81356020612e75612b3183612e31565b8083825260208201915060208460051b870101935086841115612e9757600080fd5b602086015b8481101561125757612ead81612d7e565b8352918301918301612e9c565b600082601f830112612ecb57600080fd5b81356020612edb612b3183612e31565b8083825260208201915060208460051b870101935086841115612efd57600080fd5b602086015b84811015611257578035612f1581612a2f565b8352918301918301612f02565b600082601f830112612f3357600080fd5b81356020612f43612b3183612e31565b8083825260208201915060208460051b870101935086841115612f6557600080fd5b602086015b8481101561125757612f7b81612d9b565b8352918301918301612f6a565b600082601f830112612f9957600080fd5b81356020612fa9612b3183612e31565b8083825260208201915060208460051b870101935086841115612fcb57600080fd5b602086015b84811015611257578035612fe381612914565b8352918301918301612fd0565b600082601f83011261300157600080fd5b81356020613011612b3183612e31565b82815260059290921b8401810191818101908684111561303057600080fd5b8286015b848110156112575780356001600160401b038111156130535760008081fd5b6130618986838b0101612b12565b845250918301918301613034565b600080600080600060a0868803121561308757600080fd5b85356001600160401b038082111561309e57600080fd5b6130aa89838a01612e54565b965060208801359150808211156130c057600080fd5b6130cc89838a01612eba565b955060408801359150808211156130e257600080fd5b6130ee89838a01612f22565b9450606088013591508082111561310457600080fd5b61311089838a01612f88565b9350608088013591508082111561312657600080fd5b50612e2488828901612ff0565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561318a57603f198886030184526131788583516129f0565b9450928501929085019060010161315c565b5092979650505050505050565b60008060008060008060008060006101208a8c0312156131b657600080fd5b6131bf8a612d7e565b985060208a01356131cf81612a2f565b97506131dd60408b01612d9b565b965060608a01356131ed81612914565b95506131fb60808b01612d7e565b945060a08a013561320b81612a2f565b935060c08a013561321b81612a2f565b925060e08a013591506101008a01356001600160401b0381111561323e57600080fd5b61324a8c828d01612b12565b9150509295985092959850929598565b6000806040838503121561326d57600080fd5b823561327881612a2f565b91506020830135612a9a81612a2f565b60ff81168114610de157600080fd5b60008060008060008060a087890312156132b057600080fd5b86356132bb81612914565b955060208701356132cb81612a2f565b945060408701356132db81613288565b93506060870135925060808701356001600160401b038111156132fd57600080fd5b612d6c89828a01612929565b6000806040838503121561331c57600080fd5b50508035926020909101359150565b600080600080600080600080610100898b03121561334857600080fd5b883561335381612914565b9750602089013561336381612914565b9650604089013561337381612a2f565b9550606089013561338381612a2f565b94506080890135935060a089013561339a81612914565b925060c08901356001600160401b03808211156133b657600080fd5b6133c28c838d01612b12565b935060e08b01359150808211156133d857600080fd5b506133e58b828c01612b12565b9150509295985092959890939650565b600181811c9082168061340957607f821691505b60208210810361342957634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b0383168152604060208201819052600090610e68908301846129f0565b8481526001600160401b038416602082015260806040820152600061347b60808301856129f0565b828103606084015261103181856129f0565b60006020828403121561349f57600080fd5b5051919050565b6020808252600a90820152691d5b9b185d5b98da195960b21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b6f57610b6f6134ca565b6020808252601590820152740c4e4d2c8ceca40cccaca40dcdee840cadcdeeaced605b1b604082015260600190565b60006020828403121561353457600080fd5b8151610e3381612a2f565b6001600160f81b0319861681526001810185905260e884901b6001600160e81b031916602182015260c083901b6001600160c01b0319166024820152815160009061359181602c8501602087016129cc565b91909101602c019695505050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160f81b03198a81168252600182018a90526001600160e81b031960e88a901b1660218301526001600160c01b031960c089901b1660248301528616602c8201526bffffffffffffffffffffffff19606086811b8216602d84015285901b16604182015260558101839052815160009061363c8160758501602087016129cc565b919091016075019a9950505050505050505050565b6001600160401b03898116825288811660208301526001600160a01b0388811660408401528716606083015260808201869052841660a082015261010060c082018190526000906136a4838201866129f0565b905082810360e08401526136b881856129f0565b9b9a5050505050505050505050565b600080604083850312156136da57600080fd5b82356136e581612a2f565b915060208301356001600160401b0381111561370057600080fd5b61370c85828601612b12565b9150509250929050565b6001600160401b038516815260018060a01b0384166020820152826040820152608060608201526000610c9160808301846129f0565b60008060006060848603121561376157600080fd5b835161376c81613288565b6020850151604086015191945092506001600160401b0381111561378f57600080fd5b8401601f810186136137a057600080fd5b80516137ae612b3182612aeb565b8181528760208385010111156137c357600080fd5b6137d48260208301602086016129cc565b8093505050509250925092565b81810381811115610b6f57610b6f6134ca565b60006020828403121561380657600080fd5b8151610e3381612914565b60ff8416815282602082015260606040820152600061205060608301846129f0565b6020808252600e908201526d30b6b7bab73a1034b71032b9391760911b604082015260600190565b6020808252600d908201526c3232b0b23634b7329032b9391760991b604082015260600190565b6000806040838503121561389557600080fd5b82516138a081612a2f565b6020939093015192949293505050565b6000806000606084860312156138c557600080fd5b83516138d081612a2f565b602085015160409095015190969495509392505050565b6001600160401b038616815260018060a01b038516602082015260ff8416604082015282606082015260a06080820152600061103160a08301846129f0565b6001600160401b03871681526001600160a01b038616602082015260c060408201819052600090613959908301876129f0565b828103606084015261396b81876129f0565b6080840195909552505060a0015294935050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202f2344a7484a5fd7e9ec9f6dc35849c991fa5f61f98e1a17a6f6823f4b61ad1c64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000523d8b6893d2d0ce2b48e7964432ce19a2c641f20000000000000000000000000000000000000000000000000000000000006f66
-----Decoded View---------------
Arg [0] : _vizingPad (address): 0x523D8B6893D2D0Ce2B48E7964432ce19A2C641F2
Arg [1] : _masterChainId (uint64): 28518
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000523d8b6893d2d0ce2b48e7964432ce19a2c641f2
Arg [1] : 0000000000000000000000000000000000000000000000000000000000006f66
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
[ 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.