Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Factory | 20806895 | 518 days ago | IN | 0 ETH | 0.00078528 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Action Call | 21252109 | 456 days ago | 4.66666666 ETH | ||||
| Receive Extra Me... | 21252109 | 456 days ago | 4.66666666 ETH | ||||
| 0x209afe56 | 21252108 | 456 days ago | 0.006 ETH | ||||
| Sell Ping | 21252108 | 456 days ago | 0.006 ETH | ||||
| Action Call | 21081693 | 480 days ago | 0.27314147 ETH | ||||
| Receive Extra Me... | 21081693 | 480 days ago | 0.27314147 ETH | ||||
| 0x209afe56 | 21081692 | 480 days ago | 0.006 ETH | ||||
| Sell Ping | 21081692 | 480 days ago | 0.006 ETH | ||||
| 0x209afe56 | 21053065 | 484 days ago | 0.146 ETH | ||||
| Buy Ping | 21053065 | 484 days ago | 0.146 ETH | ||||
| Action Call | 21001686 | 491 days ago | 0.07140116 ETH | ||||
| Receive Extra Me... | 21001686 | 491 days ago | 0.07140116 ETH | ||||
| 0x209afe56 | 21001685 | 491 days ago | 0.006 ETH | ||||
| Sell Ping | 21001685 | 491 days ago | 0.006 ETH | ||||
| Action Call | 20987028 | 493 days ago | 0.07927212 ETH | ||||
| Receive Extra Me... | 20987028 | 493 days ago | 0.07927212 ETH | ||||
| 0x209afe56 | 20987027 | 493 days ago | 0.006 ETH | ||||
| Sell Ping | 20987027 | 493 days ago | 0.006 ETH | ||||
| Action Call | 20963847 | 496 days ago | 0.34170979 ETH | ||||
| Receive Extra Me... | 20963847 | 496 days ago | 0.34170979 ETH | ||||
| 0x209afe56 | 20963846 | 496 days ago | 0.006 ETH | ||||
| Sell Ping | 20963846 | 496 days ago | 0.006 ETH | ||||
| Action Call | 20963353 | 496 days ago | 0.02683968 ETH | ||||
| Receive Extra Me... | 20963353 | 496 days ago | 0.02683968 ETH | ||||
| 0x209afe56 | 20963352 | 496 days ago | 0.006 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ChannelSlave
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 {LikwidSlaveChannel} from "./lib/LikwidSlaveChannel.sol";
contract ChannelSlave is LikwidSlaveChannel {
constructor(
uint64 _masterChainId,
address _masterAddress,
address _vizingPad,
address _managerAddress
) LikwidSlaveChannel(_masterChainId, _masterAddress, _vizingPad) {
minArrivalTime = 1 minutes;
maxArrivalTime = 1 days;
minGasLimit = 100000;
maxGasLimit = 1000000;
selectedRelayer = address(0);
transferOwnership(_managerAddress);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (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);
}// 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;
function receiveExtraMessage(
bytes32 messageId,
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;
}// 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);
/*
/// @notice Calculate the fee for the native token transfer
/// @param amount The value we spent in the source chain
*/
function computeTradeFee(
address targetContract,
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 MULTI_UNIVERSAL = 0x03;
bytes1 constant ERC20_HANDLER = 0x04;
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 MessageEmitterUpgradeable 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) {}
function defaultBridgeMode()
external
view
virtual
override
returns (bytes1)
{}
function selectedRelayer()
external
view
virtual
override
returns (address)
{}
IMessageChannel public 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 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 _packetMessage(
bytes1 mode,
address targetContract,
uint24 gasLimit,
uint64 price,
bytes memory message
) internal pure returns (bytes memory) {
return
abi.encodePacked(
mode,
uint256(uint160(targetContract)),
gasLimit,
price,
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
) internal 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
) internal view 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
) internal view 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 {MessageEmitterUpgradeable} from "./MessageEmitter-upgradeable.sol";
abstract contract MessageEmitter is MessageEmitterUpgradeable {
constructor(address _LaunchPad) {
__LaunchPadInit(_LaunchPad);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
import {IMessageChannel} from "./interface/IMessageChannel.sol";
import {IMessageReceiver} from "./interface/IMessageReceiver.sol";
abstract contract MessageReceiverUpgradeable is IMessageReceiver {
error LandingPadAccessDenied();
error NotImplement();
IMessageChannel public LandingPad;
modifier onlyVizingPad() {
if (msg.sender != address(LandingPad)) revert LandingPadAccessDenied();
_;
}
/*
/// 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);
}
function receiveExtraMessage(
bytes32 messageId,
uint64 srcChainId,
uint256 srcContract,
bytes calldata message
) external payable virtual override onlyVizingPad {
_receiveMessage(messageId, 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();
}
/// @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(
bytes32 messageId,
uint64 srcChainId,
uint256 srcContract,
bytes calldata message
) internal virtual {
(messageId, srcChainId, srcContract, message);
revert NotImplement();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
import {MessageReceiverUpgradeable} from "./MessageReceiver-upgradeable.sol";
abstract contract MessageReceiver is MessageReceiverUpgradeable {
constructor(address _LandingPad) {
__LandingPadInit(_LandingPad);
}
}// 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;
enum ActionType {
buyPing,
buyPong,
sellPing,
sellPong,
crossPing,
stakePing,
unStakePing,
unStakePong
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IChannelSlaveBase} from "./IChannelSlaveBase.sol";
interface IChannelSlave is IChannelSlaveBase {
function paramsEstimateGas(uint value, bytes memory params) external view returns (uint);
function paramsEmit2LaunchPad(uint bridgeFee, uint value, bytes memory params, address sender) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IChannelSlaveBase {
function getHash(
string memory biz,
string memory symbol,
uint amount,
address sender
) external pure returns (bytes32);
function buyPingEstimateGas(
uint pongFee,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) external view returns (uint pingFee);
function buyPing(
uint pingFee,
uint pongFee,
address sender,
string memory _symbol,
address target,
uint amountInETH,
uint amountOutMinimum,
uint nonce
) external payable;
function sellPingEstimateGas(
uint pongFee,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) external view returns (uint pingFee);
function sellPing(
uint pingFee,
uint pongFee,
address sender,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IProductBase} from "./IProductBase.sol";
interface IFactoryBase {
function getChannelAddress() external view returns (address);
function getProduct(string memory symbol_) external view returns (IProductBase);
function getSymbol(address _addr) external view returns (string memory);
function existProduct(address _addr) external view returns (bool);
function getShortByLong(address longAddr) external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IProductBase {
function actionCall(
bytes32 messageId,
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes memory params
) external payable;
function getFactoryAddress() external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IProductBase} from "./IProductBase.sol";
interface IProductInfo is IProductBase {
function symbol() external view returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IProductInfo} from "../interface/IProductInfo.sol";
import {IFactoryBase} from "../interface/IFactoryBase.sol";
contract ChannelBase is Ownable {
mapping(address => bool) public factories;
mapping(string => address) public products;
function setFactory(address addr) public onlyOwner {
factories[addr] = true;
}
function removeFactory(address addr) public onlyOwner {
delete factories[addr];
}
function addProduct(string memory _symbol, address addr) public onlyFactory {
products[_symbol] = addr;
}
modifier onlyFactory() {
require(factories[_msgSender()] || owner() == _msgSender(), "LikwidChannel: onlyFactory");
_;
}
modifier onlyProduct() {
IProductInfo product = IProductInfo(_msgSender());
require(factories[product.getFactoryAddress()], "LikwidChannel: factory error");
IFactoryBase _factory = IFactoryBase(product.getFactoryAddress());
require(_factory.existProduct(_msgSender()), "LikwidChannel: caller must be product");
require(products[product.symbol()] == _msgSender(), "LikwidChannel: error caller");
_;
}
function getProduct(string memory symbol_) public view returns (IProductInfo product) {
require(products[symbol_] != address(0), "product err");
product = IProductInfo(products[symbol_]);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {VizingOmni} from "@vizing/contracts/VizingOmni.sol";
import {MessageTypeLib} from "@vizing/contracts/library/MessageTypeLib.sol";
import {ActionType} from "../constants/ActionType.sol";
import {ChannelBase} from "./ChannelBase.sol";
import {IFactoryBase} from "../interface/IFactoryBase.sol";
import {IProductInfo} from "../interface/IProductInfo.sol";
import {IChannelSlave} from "../interface/IChannelSlave.sol";
abstract contract LikwidSlaveChannel is ChannelBase, VizingOmni, IChannelSlave {
event MessageReceived(uint64 _srcChainId, address _srcAddress, uint value, bytes _payload, bytes32 messageId);
event MessageFailed(uint64 _srcChainId, address _srcAddress, bytes _payload, bytes _reason, uint _value);
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;
uint public messageFailed;
uint public messageReceived;
uint64 masterChainId;
address masterContract;
constructor(uint64 _masterChainId, address _masterAddress, address _vizingPad) VizingOmni(_vizingPad) {
require(_masterChainId != 0, "In contract deployment ...");
require(_masterAddress != address(0), "In contract deployment ...");
masterChainId = _masterChainId;
masterContract = _masterAddress;
defaultBridgeMode = MessageTypeLib.STANDARD_ACTIVATE;
}
//----vizing bridge common----
function paramsEstimateGas(uint value, bytes memory params) public view virtual returns (uint) {
bytes memory message = _packetMessage(
defaultBridgeMode,
masterContract,
maxGasLimit,
_fetchPrice(masterContract, masterChainId),
abi.encode(address(0), params)
);
return LaunchPad.estimateGas(value, masterChainId, new bytes(0), message);
}
function _paramsEmit2LaunchPad(uint bridgeFee, uint value, bytes memory params, address sender) internal {
bytes memory message = _packetMessage(
defaultBridgeMode,
masterContract,
maxGasLimit,
_fetchPrice(masterContract, masterChainId),
abi.encode(sender, params)
);
uint bridgeValue = value + bridgeFee;
require(msg.value >= bridgeValue, "bridgeFee err.");
LaunchPad.Launch{value: bridgeValue}(
0,
0,
selectedRelayer,
sender,
value,
masterChainId,
new bytes(0),
message
);
}
function paramsEmit2LaunchPad(
uint bridgeFee,
uint value,
bytes memory params,
address sender
) external payable onlyProduct {
_paramsEmit2LaunchPad(bridgeFee, value, params, sender);
}
// Signature
function getHash(
string memory biz,
string memory symbol,
uint amount,
address sender
) public pure returns (bytes32) {
return keccak256(abi.encodePacked(biz, symbol, amount, sender));
}
function _buyPingSignature(
uint pongFee,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) internal view virtual returns (bytes memory) {
return
abi.encode(
uint8(ActionType.buyPing),
_symbol,
pongFee,
abi.encode(nonce, target, amountIn, amountOutMinimum)
);
}
function buyPingEstimateGas(
uint pongFee,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) public view virtual returns (uint pingFee) {
pingFee = paramsEstimateGas(
pongFee,
_buyPingSignature(pongFee, _symbol, target, amountIn, amountOutMinimum, nonce)
);
}
function buyPing(
uint pingFee,
uint pongFee,
address sender,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) external payable virtual onlyProduct {
bytes memory parmas = _buyPingSignature(pongFee, _symbol, target, amountIn, amountOutMinimum, nonce);
_paramsEmit2LaunchPad(pingFee, amountIn + pongFee, parmas, sender);
}
function _sellPingSignature(
uint pongFee,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) internal view virtual returns (bytes memory) {
return
abi.encode(
uint8(ActionType.sellPing),
_symbol,
pongFee,
abi.encode(nonce, target, amountIn, amountOutMinimum)
);
}
function sellPingEstimateGas(
uint pongFee,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) public view virtual returns (uint pingFee) {
pingFee = paramsEstimateGas(
pongFee,
_sellPingSignature(pongFee, _symbol, target, amountIn, amountOutMinimum, nonce)
);
}
function sellPing(
uint pingFee,
uint pongFee,
address sender,
string memory _symbol,
address target,
uint amountIn,
uint amountOutMinimum,
uint nonce
) external payable virtual onlyProduct {
bytes memory params = _sellPingSignature(pongFee, _symbol, target, amountIn, amountOutMinimum, nonce);
_paramsEmit2LaunchPad(pingFee, pongFee, params, sender);
}
function verifySource(uint64 srcChainId, address srcContract) internal view virtual returns (bool authorized) {
return srcChainId == masterChainId && srcContract == masterContract;
}
function _receiveMessage(
bytes32 messageId,
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, messageId);
_consumeMessage(srcChainId, sender, messageId, message);
}
function _consumeMessage(uint64 srcChainId, address sender, bytes32 messageId, bytes memory message) internal {
(uint8 action, string memory symbol_, uint pongFee, bytes memory params) = abi.decode(
message,
(uint8, string, uint, bytes)
);
IProductInfo product = getProduct(symbol_);
product.actionCall{value: msg.value}(messageId, srcChainId, sender, action, pongFee, params);
}
function withdrawFee(address to, uint amount) public onlyOwner {
transferNative(to, amount);
}
function transferNative(address to, uint amount) internal {
(bool success, ) = to.call{value: amount}("");
require(success, "Transfer failed.");
}
}{
"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
Contract ABI
API[{"inputs":[{"internalType":"uint64","name":"_masterChainId","type":"uint64"},{"internalType":"address","name":"_masterAddress","type":"address"},{"internalType":"address","name":"_vizingPad","type":"address"},{"internalType":"address","name":"_managerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LandingPadAccessDenied","type":"error"},{"inputs":[],"name":"NotImplement","type":"error"},{"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"}],"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"},{"indexed":false,"internalType":"bytes32","name":"messageId","type":"bytes32"}],"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"},{"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":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"addr","type":"address"}],"name":"addProduct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"},{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"buyPing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"buyPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBridgeMode","outputs":[{"internalType":"bytes1","name":"","type":"bytes1"}],"stateMutability":"view","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":"address","name":"","type":"address"}],"name":"factories","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"biz","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"symbol_","type":"string"}],"name":"getProduct","outputs":[{"internalType":"contract IProductInfo","name":"product","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bridgeFee","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"address","name":"sender","type":"address"}],"name":"paramsEmit2LaunchPad","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"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":"string","name":"","type":"string"}],"name":"products","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"uint256","name":"srcContract","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"receiveExtraMessage","outputs":[],"stateMutability":"payable","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":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","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":"pingFee","type":"uint256"},{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"sellPing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"sellPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFactory","outputs":[],"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"}]Contract Creation Code
6101406040523480156200001257600080fd5b50604051620027d9380380620027d98339810160408190526200003591620002f7565b8383838080806200004633620001ad565b600380546001600160a01b0319166001600160a01b03831617905550600480546001600160a01b0319166001600160a01b0383161790555050826001600160401b0316600003620000de5760405162461bcd60e51b815260206004820152601a60248201527f496e20636f6e7472616374206465706c6f796d656e74202e2e2e00000000000060448201526064015b60405180910390fd5b6001600160a01b038216620001365760405162461bcd60e51b815260206004820152601a60248201527f496e20636f6e7472616374206465706c6f796d656e74202e2e2e0000000000006044820152606401620000d5565b50600780546001600160a01b0390921668010000000000000000026001600160e01b03199092166001600160401b0390931692909217179055600160f81b61010052603c6080526201518060a052620186a060c052620f424060e052600061012052620001a381620001fd565b5050505062000361565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002076200027c565b6001600160a01b0381166200026e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620000d5565b6200027981620001ad565b50565b6000546001600160a01b03163314620002d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000d5565b565b80516001600160a01b0381168114620002f257600080fd5b919050565b600080600080608085870312156200030e57600080fd5b84516001600160401b03811681146200032657600080fd5b93506200033660208601620002da565b92506200034660408601620002da565b91506200035660608601620002da565b905092959194509250565b60805160a05160c05160e0516101005161012051612405620003d4600039600081816104b7015261144401526000818161025d0152818161104b01526113390152600081816103e70152818161107e015261136c0152600061037f0152600061053e0152600061033301526124056000f3fe60806040526004361061018c5760003560e01c80636de2a39f116100d7578063b8b971b811610085578063b8b971b8146104ec578063cb1b3dd11461050c578063de8aeda01461052c578063e0b838e914610560578063f2fde38b14610580578063f3148925146105a0578063fab52689146105b3578063fd9be522146105f357600080fd5b80636de2a39f14610429578063715018a61461043c57806376c8131214610451578063786627ce146104715780638da5cb5b14610487578063b0cfd4d2146104a5578063b51c39d9146104d957600080fd5b8063549aa4a41161013f578063549aa4a4146102d857806356229465146102eb578063575580d71461030b5780635ad3ad06146103215780635aeb4d771461036d5780635bb47808146103b55780635e45da23146103d557806368111cce1461040957600080fd5b806273b555146101915780630186a423146101a65780630e82845d146101fd5780631cc1d0bc1461021d578063456362791461024b578063463fe968146102985780634b37c73f146102b8575b600080fd5b6101a461019f366004611942565b610613565b005b3480156101b257600080fd5b506101e76101c1366004611a60565b80516020818301810180516002825292820191909301209152546001600160a01b031681565b6040516101f49190611a94565b60405180910390f35b34801561020957600080fd5b506004546101e7906001600160a01b031681565b34801561022957600080fd5b5061023d610238366004611abd565b610650565b6040519081526020016101f4565b34801561025757600080fd5b5061027f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160f81b031990911681526020016101f4565b3480156102a457600080fd5b5061023d6102b3366004611abd565b61066f565b3480156102c457600080fd5b506101a46102d3366004611b31565b610683565b6101a46102e6366004611b4e565b6106ac565b3480156102f757600080fd5b506101a4610306366004611bb0565b610911565b34801561031757600080fd5b5061023d60055481565b34801561032d57600080fd5b506103557f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b0390911681526020016101f4565b34801561037957600080fd5b506103a17f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff90911681526020016101f4565b3480156103c157600080fd5b506101a46103d0366004611b31565b6109c9565b3480156103e157600080fd5b506103a17f000000000000000000000000000000000000000000000000000000000000000081565b34801561041557600080fd5b506101e7610424366004611a60565b6109f8565b6101a4610437366004611c01565b610a97565b34801561044857600080fd5b506101a4610d13565b34801561045d57600080fd5b5061023d61046c366004611c91565b610d27565b34801561047d57600080fd5b5061023d60065481565b34801561049357600080fd5b506000546001600160a01b03166101e7565b3480156104b157600080fd5b506101e77f000000000000000000000000000000000000000000000000000000000000000081565b6101a46104e7366004611c01565b610d9e565b3480156104f857600080fd5b5061023d610507366004611d1c565b611004565b34801561051857600080fd5b5061023d610527366004611d90565b61103d565b34801561053857600080fd5b506103557f000000000000000000000000000000000000000000000000000000000000000081565b34801561056c57600080fd5b506003546101e7906001600160a01b031681565b34801561058c57600080fd5b506101a461059b366004611b31565b611175565b6101a46105ae366004611dd6565b6111ee565b3480156105bf57600080fd5b506105e36105ce366004611b31565b60016020526000908152604090205460ff1681565b60405190151581526020016101f4565b3480156105ff57600080fd5b506101a461060e366004611e3f565b61122d565b6004546001600160a01b0316331461063e57604051637d92a0f560e11b815260040160405180910390fd5b61064a84848484611243565b50505050565b60006106648761052789898989898961125f565b979650505050505050565b6000610664876105278989898989896112ca565b61068b6112d3565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600033905060016000826001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190611e6b565b6001600160a01b0316815260208101919091526040016000205460ff166107595760405162461bcd60e51b815260040161075090611e88565b60405180910390fd5b6000816001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bd9190611e6b565b60405162d1567160e81b81529091506001600160a01b0382169063d1567100906107eb903390600401611a94565b602060405180830381865afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c9190611ebf565b6108485760405162461bcd60e51b815260040161075090611ee1565b336001600160a01b03166002836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ba9190810190611f9a565b6040516108c79190611fce565b908152604051908190036020019020546001600160a01b0316146108fd5760405162461bcd60e51b815260040161075090611fea565b6109098686868661132d565b505050505050565b3360009081526001602052604090205460ff168061093957506000546001600160a01b031633145b6109855760405162461bcd60e51b815260206004820152601a60248201527f4c696b7769644368616e6e656c3a206f6e6c79466163746f72790000000000006044820152606401610750565b806002836040516109969190611fce565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b6109d16112d3565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6000806001600160a01b0316600283604051610a149190611fce565b908152604051908190036020019020546001600160a01b031603610a685760405162461bcd60e51b815260206004820152600b60248201526a383937b23ab1ba1032b93960a91b6044820152606401610750565b600282604051610a789190611fce565b908152604051908190036020019020546001600160a01b031692915050565b600033905060016000826001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b029190611e6b565b6001600160a01b0316815260208101919091526040016000205460ff16610b3b5760405162461bcd60e51b815260040161075090611e88565b6000816001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190611e6b565b60405162d1567160e81b81529091506001600160a01b0382169063d156710090610bcd903390600401611a94565b602060405180830381865afa158015610bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0e9190611ebf565b610c2a5760405162461bcd60e51b815260040161075090611ee1565b336001600160a01b03166002836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c9c9190810190611f9a565b604051610ca99190611fce565b908152604051908190036020019020546001600160a01b031614610cdf5760405162461bcd60e51b815260040161075090611fea565b6000610cef8a898989898961125f565b9050610d068b610cff8c89612021565b838c61132d565b5050505050505050505050565b610d1b6112d3565b610d2560006114a9565b565b6000610664878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506114f992505050565b600033905060016000826001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e099190611e6b565b6001600160a01b0316815260208101919091526040016000205460ff16610e425760405162461bcd60e51b815260040161075090611e88565b6000816001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea69190611e6b565b60405162d1567160e81b81529091506001600160a01b0382169063d156710090610ed4903390600401611a94565b602060405180830381865afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f159190611ebf565b610f315760405162461bcd60e51b815260040161075090611ee1565b336001600160a01b03166002836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610f7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fa39190810190611f9a565b604051610fb09190611fce565b908152604051908190036020019020546001600160a01b031614610fe65760405162461bcd60e51b815260040161075090611fea565b6000610ff68a89898989896112ca565b9050610d068b8b838c61132d565b60008484848460405160200161101d9493929190612042565b604051602081830303815290604052805190602001209050949350505050565b60075460009081906110da907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03600160401b820416907f0000000000000000000000000000000000000000000000000000000000000000906110b29083906001600160401b031661157a565b6000886040516020016110c69291906120ba565b60405160208183030381529060405261166a565b600354600754604080516000815260208101918290526342feeaa160e11b9091529293506001600160a01b03909116916385fdd5429161112a9188916001600160401b03169086602482016120e6565b602060405180830381865afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190612120565b9150505b92915050565b61117d6112d3565b6001600160a01b0381166111e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610750565b6111eb816114a9565b50565b6004546001600160a01b0316331461121957604051637d92a0f560e11b815260040160405180910390fd5b61122685858585856116a8565b5050505050565b6112356112d3565b61123f828261176e565b5050565b60405160016235f76760e11b0319815260040160405180910390fd5b606060005b60408051602081018590526001600160a01b038816818301526060810187905260808082018790528251808303909101815260a082019092526112af929189918b919060c001612139565b60405160208183030381529060405290509695505050505050565b60606002611264565b6000546001600160a01b03163314610d255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610750565b6007546000906113b3907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b03600160401b820416907f0000000000000000000000000000000000000000000000000000000000000000906113a09083906001600160401b031661157a565b86886040516020016110c69291906120ba565b905060006113c18686612021565b9050803410156114045760405162461bcd60e51b815260206004820152600e60248201526d313934b233b2a332b29032b9391760911b6044820152606401610750565b600354600754604080516000808252602082019283905263104d7f2b60e11b9092526001600160a01b039093169263209afe5692859261147c92909182917f0000000000000000000000000000000000000000000000000000000000000000918b918e916001600160401b0316908c6024820161216d565b6000604051808303818588803b15801561149557600080fd5b505af1158015610d06573d6000803e3d6000fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6003546040516342feeaa160e11b81526000916001600160a01b0316906385fdd542906115309088908890889088906004016120e6565b602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190612120565b95945050505050565b6003546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa1580156115c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e89190611e6b565b604051632aee183f60e21b81526001600160a01b0385811660048301526001600160401b0385166024830152919091169063abb860fc90604401602060405180830381865afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906121e3565b9392505050565b606085856001600160a01b031685858560405160200161168e959493929190612200565b604051602081830303815290604052905095945050505050565b6116b28484611809565b6116ee5760405162461bcd60e51b815260206004820152600d60248201526c3ab730baba3437b934bd32b21760991b6044820152606401610750565b6000806116fd83850185612263565b915091506001600660008282546117149190612021565b90915550506040517fe4380fd4c095a9eb700fe8fb27c47c6d4a3a05ef8abe96b81b0f5867af7e74ec906117519088908590349086908d9061229c565b60405180910390a161176586838984611842565b50505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117bb576040519150601f19603f3d011682016040523d82523d6000602084013e6117c0565b606091505b50509050806118045760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610750565b505050565b6007546000906001600160401b038481169116148015611663575050600754600160401b90046001600160a01b03908116911614919050565b6000806000808480602001905181019061185c91906122e4565b9350935093509350600061186f846109f8565b9050806001600160a01b031663a1c8c1d334898c8c8a89896040518863ffffffff1660e01b81526004016118a89695949392919061237e565b6000604051808303818588803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b5050505050505050505050505050565b6001600160401b03811681146111eb57600080fd5b60008083601f84011261190c57600080fd5b5081356001600160401b0381111561192357600080fd5b60208301915083602082850101111561193b57600080fd5b9250929050565b6000806000806060858703121561195857600080fd5b8435611963816118e5565b93506020850135925060408501356001600160401b0381111561198557600080fd5b611991878288016118fa565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156119db576119db61199d565b604052919050565b60006001600160401b038211156119fc576119fc61199d565b50601f01601f191660200190565b600082601f830112611a1b57600080fd5b8135611a2e611a29826119e3565b6119b3565b818152846020838601011115611a4357600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611a7257600080fd5b81356001600160401b03811115611a8857600080fd5b61116b84828501611a0a565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146111eb57600080fd5b60008060008060008060c08789031215611ad657600080fd5b8635955060208701356001600160401b03811115611af357600080fd5b611aff89828a01611a0a565b9550506040870135611b1081611aa8565b959894975094956060810135955060808101359460a0909101359350915050565b600060208284031215611b4357600080fd5b813561166381611aa8565b60008060008060808587031215611b6457600080fd5b843593506020850135925060408501356001600160401b03811115611b8857600080fd5b611b9487828801611a0a565b9250506060850135611ba581611aa8565b939692955090935050565b60008060408385031215611bc357600080fd5b82356001600160401b03811115611bd957600080fd5b611be585828601611a0a565b9250506020830135611bf681611aa8565b809150509250929050565b600080600080600080600080610100898b031215611c1e57600080fd5b88359750602089013596506040890135611c3781611aa8565b955060608901356001600160401b03811115611c5257600080fd5b611c5e8b828c01611a0a565b9550506080890135611c6f81611aa8565b979a969950949793969560a0850135955060c08501359460e001359350915050565b60008060008060008060808789031215611caa57600080fd5b863595506020870135611cbc816118e5565b945060408701356001600160401b0380821115611cd857600080fd5b611ce48a838b016118fa565b90965094506060890135915080821115611cfd57600080fd5b50611d0a89828a016118fa565b979a9699509497509295939492505050565b60008060008060808587031215611d3257600080fd5b84356001600160401b0380821115611d4957600080fd5b611d5588838901611a0a565b95506020870135915080821115611d6b57600080fd5b50611d7887828801611a0a565b935050604085013591506060850135611ba581611aa8565b60008060408385031215611da357600080fd5b8235915060208301356001600160401b03811115611dc057600080fd5b611dcc85828601611a0a565b9150509250929050565b600080600080600060808688031215611dee57600080fd5b853594506020860135611e00816118e5565b93506040860135925060608601356001600160401b03811115611e2257600080fd5b611e2e888289016118fa565b969995985093965092949392505050565b60008060408385031215611e5257600080fd5b8235611e5d81611aa8565b946020939093013593505050565b600060208284031215611e7d57600080fd5b815161166381611aa8565b6020808252601c908201527f4c696b7769644368616e6e656c3a20666163746f7279206572726f7200000000604082015260600190565b600060208284031215611ed157600080fd5b8151801515811461166357600080fd5b60208082526025908201527f4c696b7769644368616e6e656c3a2063616c6c6572206d7573742062652070726040820152641bd91d58dd60da1b606082015260800190565b60005b83811015611f41578181015183820152602001611f29565b50506000910152565b6000611f58611a29846119e3565b9050828152838383011115611f6c57600080fd5b611663836020830184611f26565b600082601f830112611f8b57600080fd5b61166383835160208501611f4a565b600060208284031215611fac57600080fd5b81516001600160401b03811115611fc257600080fd5b61116b84828501611f7a565b60008251611fe0818460208701611f26565b9190910192915050565b6020808252601b908201527f4c696b7769644368616e6e656c3a206572726f722063616c6c65720000000000604082015260600190565b8082018082111561116f57634e487b7160e01b600052601160045260246000fd5b60008551612054818460208a01611f26565b855190830190612068818360208a01611f26565b01938452505060601b6bffffffffffffffffffffffff1916602082015260340192915050565b600081518084526120a6816020860160208601611f26565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906120de9083018461208e565b949350505050565b8481526001600160401b038416602082015260806040820152600061210e608083018561208e565b8281036060840152610664818561208e565b60006020828403121561213257600080fd5b5051919050565b60ff85168152608060208201526000612155608083018661208e565b8460408401528281036060840152610664818561208e565b6001600160401b03898116825288811660208301526001600160a01b0388811660408401528716606083015260808201869052841660a082015261010060c082018190526000906121c08382018661208e565b905082810360e08401526121d4818561208e565b9b9a5050505050505050505050565b6000602082840312156121f557600080fd5b8151611663816118e5565b6001600160f81b0319861681526001810185905260e884901b6001600160e81b031916602182015260c083901b6001600160c01b0319166024820152815160009061225281602c850160208701611f26565b91909101602c019695505050505050565b6000806040838503121561227657600080fd5b823561228181611aa8565b915060208301356001600160401b03811115611dc057600080fd5b6001600160401b038616815260018060a01b038516602082015283604082015260a0606082015260006122d260a083018561208e565b90508260808301529695505050505050565b600080600080608085870312156122fa57600080fd5b845160ff8116811461230b57600080fd5b60208601519094506001600160401b038082111561232857600080fd5b61233488838901611f7a565b945060408701519350606087015191508082111561235157600080fd5b508501601f8101871361236357600080fd5b61237287825160208401611f4a565b91505092959194509250565b8681526001600160401b038616602082015260018060a01b038516604082015260ff8416606082015282608082015260c060a082015260006123c360c083018461208e565b9897505050505050505056fea2646970667358221220ab5a69148181b22c1ef1fd4aee3469ca59e6ff809d6c8ebc0d0486c2ac5328eb64736f6c634300081700330000000000000000000000000000000000000000000000000000000000006f66000000000000000000000000fe91217dbb4e6bf98e3070fa2fd64f839ca3b31d0000000000000000000000005d77b0c9855f44a8fbef34e670e243e988682a82000000000000000000000000ea7744c4fa1101f9e6df5688fc19e3ee94106439
Deployed Bytecode
0x60806040526004361061018c5760003560e01c80636de2a39f116100d7578063b8b971b811610085578063b8b971b8146104ec578063cb1b3dd11461050c578063de8aeda01461052c578063e0b838e914610560578063f2fde38b14610580578063f3148925146105a0578063fab52689146105b3578063fd9be522146105f357600080fd5b80636de2a39f14610429578063715018a61461043c57806376c8131214610451578063786627ce146104715780638da5cb5b14610487578063b0cfd4d2146104a5578063b51c39d9146104d957600080fd5b8063549aa4a41161013f578063549aa4a4146102d857806356229465146102eb578063575580d71461030b5780635ad3ad06146103215780635aeb4d771461036d5780635bb47808146103b55780635e45da23146103d557806368111cce1461040957600080fd5b806273b555146101915780630186a423146101a65780630e82845d146101fd5780631cc1d0bc1461021d578063456362791461024b578063463fe968146102985780634b37c73f146102b8575b600080fd5b6101a461019f366004611942565b610613565b005b3480156101b257600080fd5b506101e76101c1366004611a60565b80516020818301810180516002825292820191909301209152546001600160a01b031681565b6040516101f49190611a94565b60405180910390f35b34801561020957600080fd5b506004546101e7906001600160a01b031681565b34801561022957600080fd5b5061023d610238366004611abd565b610650565b6040519081526020016101f4565b34801561025757600080fd5b5061027f7f010000000000000000000000000000000000000000000000000000000000000081565b6040516001600160f81b031990911681526020016101f4565b3480156102a457600080fd5b5061023d6102b3366004611abd565b61066f565b3480156102c457600080fd5b506101a46102d3366004611b31565b610683565b6101a46102e6366004611b4e565b6106ac565b3480156102f757600080fd5b506101a4610306366004611bb0565b610911565b34801561031757600080fd5b5061023d60055481565b34801561032d57600080fd5b506103557f000000000000000000000000000000000000000000000000000000000000003c81565b6040516001600160401b0390911681526020016101f4565b34801561037957600080fd5b506103a17f00000000000000000000000000000000000000000000000000000000000186a081565b60405162ffffff90911681526020016101f4565b3480156103c157600080fd5b506101a46103d0366004611b31565b6109c9565b3480156103e157600080fd5b506103a17f00000000000000000000000000000000000000000000000000000000000f424081565b34801561041557600080fd5b506101e7610424366004611a60565b6109f8565b6101a4610437366004611c01565b610a97565b34801561044857600080fd5b506101a4610d13565b34801561045d57600080fd5b5061023d61046c366004611c91565b610d27565b34801561047d57600080fd5b5061023d60065481565b34801561049357600080fd5b506000546001600160a01b03166101e7565b3480156104b157600080fd5b506101e77f000000000000000000000000000000000000000000000000000000000000000081565b6101a46104e7366004611c01565b610d9e565b3480156104f857600080fd5b5061023d610507366004611d1c565b611004565b34801561051857600080fd5b5061023d610527366004611d90565b61103d565b34801561053857600080fd5b506103557f000000000000000000000000000000000000000000000000000000000001518081565b34801561056c57600080fd5b506003546101e7906001600160a01b031681565b34801561058c57600080fd5b506101a461059b366004611b31565b611175565b6101a46105ae366004611dd6565b6111ee565b3480156105bf57600080fd5b506105e36105ce366004611b31565b60016020526000908152604090205460ff1681565b60405190151581526020016101f4565b3480156105ff57600080fd5b506101a461060e366004611e3f565b61122d565b6004546001600160a01b0316331461063e57604051637d92a0f560e11b815260040160405180910390fd5b61064a84848484611243565b50505050565b60006106648761052789898989898961125f565b979650505050505050565b6000610664876105278989898989896112ca565b61068b6112d3565b6001600160a01b03166000908152600160205260409020805460ff19169055565b600033905060016000826001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107179190611e6b565b6001600160a01b0316815260208101919091526040016000205460ff166107595760405162461bcd60e51b815260040161075090611e88565b60405180910390fd5b6000816001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bd9190611e6b565b60405162d1567160e81b81529091506001600160a01b0382169063d1567100906107eb903390600401611a94565b602060405180830381865afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c9190611ebf565b6108485760405162461bcd60e51b815260040161075090611ee1565b336001600160a01b03166002836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610892573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108ba9190810190611f9a565b6040516108c79190611fce565b908152604051908190036020019020546001600160a01b0316146108fd5760405162461bcd60e51b815260040161075090611fea565b6109098686868661132d565b505050505050565b3360009081526001602052604090205460ff168061093957506000546001600160a01b031633145b6109855760405162461bcd60e51b815260206004820152601a60248201527f4c696b7769644368616e6e656c3a206f6e6c79466163746f72790000000000006044820152606401610750565b806002836040516109969190611fce565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050565b6109d16112d3565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6000806001600160a01b0316600283604051610a149190611fce565b908152604051908190036020019020546001600160a01b031603610a685760405162461bcd60e51b815260206004820152600b60248201526a383937b23ab1ba1032b93960a91b6044820152606401610750565b600282604051610a789190611fce565b908152604051908190036020019020546001600160a01b031692915050565b600033905060016000826001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b029190611e6b565b6001600160a01b0316815260208101919091526040016000205460ff16610b3b5760405162461bcd60e51b815260040161075090611e88565b6000816001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190611e6b565b60405162d1567160e81b81529091506001600160a01b0382169063d156710090610bcd903390600401611a94565b602060405180830381865afa158015610bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0e9190611ebf565b610c2a5760405162461bcd60e51b815260040161075090611ee1565b336001600160a01b03166002836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c9c9190810190611f9a565b604051610ca99190611fce565b908152604051908190036020019020546001600160a01b031614610cdf5760405162461bcd60e51b815260040161075090611fea565b6000610cef8a898989898961125f565b9050610d068b610cff8c89612021565b838c61132d565b5050505050505050505050565b610d1b6112d3565b610d2560006114a9565b565b6000610664878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506114f992505050565b600033905060016000826001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e099190611e6b565b6001600160a01b0316815260208101919091526040016000205460ff16610e425760405162461bcd60e51b815260040161075090611e88565b6000816001600160a01b031663a9c2e36c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea69190611e6b565b60405162d1567160e81b81529091506001600160a01b0382169063d156710090610ed4903390600401611a94565b602060405180830381865afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f159190611ebf565b610f315760405162461bcd60e51b815260040161075090611ee1565b336001600160a01b03166002836001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015610f7b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fa39190810190611f9a565b604051610fb09190611fce565b908152604051908190036020019020546001600160a01b031614610fe65760405162461bcd60e51b815260040161075090611fea565b6000610ff68a89898989896112ca565b9050610d068b8b838c61132d565b60008484848460405160200161101d9493929190612042565b604051602081830303815290604052805190602001209050949350505050565b60075460009081906110da907f0100000000000000000000000000000000000000000000000000000000000000906001600160a01b03600160401b820416907f00000000000000000000000000000000000000000000000000000000000f4240906110b29083906001600160401b031661157a565b6000886040516020016110c69291906120ba565b60405160208183030381529060405261166a565b600354600754604080516000815260208101918290526342feeaa160e11b9091529293506001600160a01b03909116916385fdd5429161112a9188916001600160401b03169086602482016120e6565b602060405180830381865afa158015611147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116b9190612120565b9150505b92915050565b61117d6112d3565b6001600160a01b0381166111e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610750565b6111eb816114a9565b50565b6004546001600160a01b0316331461121957604051637d92a0f560e11b815260040160405180910390fd5b61122685858585856116a8565b5050505050565b6112356112d3565b61123f828261176e565b5050565b60405160016235f76760e11b0319815260040160405180910390fd5b606060005b60408051602081018590526001600160a01b038816818301526060810187905260808082018790528251808303909101815260a082019092526112af929189918b919060c001612139565b60405160208183030381529060405290509695505050505050565b60606002611264565b6000546001600160a01b03163314610d255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610750565b6007546000906113b3907f0100000000000000000000000000000000000000000000000000000000000000906001600160a01b03600160401b820416907f00000000000000000000000000000000000000000000000000000000000f4240906113a09083906001600160401b031661157a565b86886040516020016110c69291906120ba565b905060006113c18686612021565b9050803410156114045760405162461bcd60e51b815260206004820152600e60248201526d313934b233b2a332b29032b9391760911b6044820152606401610750565b600354600754604080516000808252602082019283905263104d7f2b60e11b9092526001600160a01b039093169263209afe5692859261147c92909182917f0000000000000000000000000000000000000000000000000000000000000000918b918e916001600160401b0316908c6024820161216d565b6000604051808303818588803b15801561149557600080fd5b505af1158015610d06573d6000803e3d6000fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6003546040516342feeaa160e11b81526000916001600160a01b0316906385fdd542906115309088908890889088906004016120e6565b602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115719190612120565b95945050505050565b6003546040805163425e3ad360e11b815290516000926001600160a01b0316916384bc75a69160048083019260209291908290030181865afa1580156115c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e89190611e6b565b604051632aee183f60e21b81526001600160a01b0385811660048301526001600160401b0385166024830152919091169063abb860fc90604401602060405180830381865afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906121e3565b9392505050565b606085856001600160a01b031685858560405160200161168e959493929190612200565b604051602081830303815290604052905095945050505050565b6116b28484611809565b6116ee5760405162461bcd60e51b815260206004820152600d60248201526c3ab730baba3437b934bd32b21760991b6044820152606401610750565b6000806116fd83850185612263565b915091506001600660008282546117149190612021565b90915550506040517fe4380fd4c095a9eb700fe8fb27c47c6d4a3a05ef8abe96b81b0f5867af7e74ec906117519088908590349086908d9061229c565b60405180910390a161176586838984611842565b50505050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117bb576040519150601f19603f3d011682016040523d82523d6000602084013e6117c0565b606091505b50509050806118045760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610750565b505050565b6007546000906001600160401b038481169116148015611663575050600754600160401b90046001600160a01b03908116911614919050565b6000806000808480602001905181019061185c91906122e4565b9350935093509350600061186f846109f8565b9050806001600160a01b031663a1c8c1d334898c8c8a89896040518863ffffffff1660e01b81526004016118a89695949392919061237e565b6000604051808303818588803b1580156118c157600080fd5b505af11580156118d5573d6000803e3d6000fd5b5050505050505050505050505050565b6001600160401b03811681146111eb57600080fd5b60008083601f84011261190c57600080fd5b5081356001600160401b0381111561192357600080fd5b60208301915083602082850101111561193b57600080fd5b9250929050565b6000806000806060858703121561195857600080fd5b8435611963816118e5565b93506020850135925060408501356001600160401b0381111561198557600080fd5b611991878288016118fa565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156119db576119db61199d565b604052919050565b60006001600160401b038211156119fc576119fc61199d565b50601f01601f191660200190565b600082601f830112611a1b57600080fd5b8135611a2e611a29826119e3565b6119b3565b818152846020838601011115611a4357600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611a7257600080fd5b81356001600160401b03811115611a8857600080fd5b61116b84828501611a0a565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146111eb57600080fd5b60008060008060008060c08789031215611ad657600080fd5b8635955060208701356001600160401b03811115611af357600080fd5b611aff89828a01611a0a565b9550506040870135611b1081611aa8565b959894975094956060810135955060808101359460a0909101359350915050565b600060208284031215611b4357600080fd5b813561166381611aa8565b60008060008060808587031215611b6457600080fd5b843593506020850135925060408501356001600160401b03811115611b8857600080fd5b611b9487828801611a0a565b9250506060850135611ba581611aa8565b939692955090935050565b60008060408385031215611bc357600080fd5b82356001600160401b03811115611bd957600080fd5b611be585828601611a0a565b9250506020830135611bf681611aa8565b809150509250929050565b600080600080600080600080610100898b031215611c1e57600080fd5b88359750602089013596506040890135611c3781611aa8565b955060608901356001600160401b03811115611c5257600080fd5b611c5e8b828c01611a0a565b9550506080890135611c6f81611aa8565b979a969950949793969560a0850135955060c08501359460e001359350915050565b60008060008060008060808789031215611caa57600080fd5b863595506020870135611cbc816118e5565b945060408701356001600160401b0380821115611cd857600080fd5b611ce48a838b016118fa565b90965094506060890135915080821115611cfd57600080fd5b50611d0a89828a016118fa565b979a9699509497509295939492505050565b60008060008060808587031215611d3257600080fd5b84356001600160401b0380821115611d4957600080fd5b611d5588838901611a0a565b95506020870135915080821115611d6b57600080fd5b50611d7887828801611a0a565b935050604085013591506060850135611ba581611aa8565b60008060408385031215611da357600080fd5b8235915060208301356001600160401b03811115611dc057600080fd5b611dcc85828601611a0a565b9150509250929050565b600080600080600060808688031215611dee57600080fd5b853594506020860135611e00816118e5565b93506040860135925060608601356001600160401b03811115611e2257600080fd5b611e2e888289016118fa565b969995985093965092949392505050565b60008060408385031215611e5257600080fd5b8235611e5d81611aa8565b946020939093013593505050565b600060208284031215611e7d57600080fd5b815161166381611aa8565b6020808252601c908201527f4c696b7769644368616e6e656c3a20666163746f7279206572726f7200000000604082015260600190565b600060208284031215611ed157600080fd5b8151801515811461166357600080fd5b60208082526025908201527f4c696b7769644368616e6e656c3a2063616c6c6572206d7573742062652070726040820152641bd91d58dd60da1b606082015260800190565b60005b83811015611f41578181015183820152602001611f29565b50506000910152565b6000611f58611a29846119e3565b9050828152838383011115611f6c57600080fd5b611663836020830184611f26565b600082601f830112611f8b57600080fd5b61166383835160208501611f4a565b600060208284031215611fac57600080fd5b81516001600160401b03811115611fc257600080fd5b61116b84828501611f7a565b60008251611fe0818460208701611f26565b9190910192915050565b6020808252601b908201527f4c696b7769644368616e6e656c3a206572726f722063616c6c65720000000000604082015260600190565b8082018082111561116f57634e487b7160e01b600052601160045260246000fd5b60008551612054818460208a01611f26565b855190830190612068818360208a01611f26565b01938452505060601b6bffffffffffffffffffffffff1916602082015260340192915050565b600081518084526120a6816020860160208601611f26565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906120de9083018461208e565b949350505050565b8481526001600160401b038416602082015260806040820152600061210e608083018561208e565b8281036060840152610664818561208e565b60006020828403121561213257600080fd5b5051919050565b60ff85168152608060208201526000612155608083018661208e565b8460408401528281036060840152610664818561208e565b6001600160401b03898116825288811660208301526001600160a01b0388811660408401528716606083015260808201869052841660a082015261010060c082018190526000906121c08382018661208e565b905082810360e08401526121d4818561208e565b9b9a5050505050505050505050565b6000602082840312156121f557600080fd5b8151611663816118e5565b6001600160f81b0319861681526001810185905260e884901b6001600160e81b031916602182015260c083901b6001600160c01b0319166024820152815160009061225281602c850160208701611f26565b91909101602c019695505050505050565b6000806040838503121561227657600080fd5b823561228181611aa8565b915060208301356001600160401b03811115611dc057600080fd5b6001600160401b038616815260018060a01b038516602082015283604082015260a0606082015260006122d260a083018561208e565b90508260808301529695505050505050565b600080600080608085870312156122fa57600080fd5b845160ff8116811461230b57600080fd5b60208601519094506001600160401b038082111561232857600080fd5b61233488838901611f7a565b945060408701519350606087015191508082111561235157600080fd5b508501601f8101871361236357600080fd5b61237287825160208401611f4a565b91505092959194509250565b8681526001600160401b038616602082015260018060a01b038516604082015260ff8416606082015282608082015260c060a082015260006123c360c083018461208e565b9897505050505050505056fea2646970667358221220ab5a69148181b22c1ef1fd4aee3469ca59e6ff809d6c8ebc0d0486c2ac5328eb64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000006f66000000000000000000000000fe91217dbb4e6bf98e3070fa2fd64f839ca3b31d0000000000000000000000005d77b0c9855f44a8fbef34e670e243e988682a82000000000000000000000000ea7744c4fa1101f9e6df5688fc19e3ee94106439
-----Decoded View---------------
Arg [0] : _masterChainId (uint64): 28518
Arg [1] : _masterAddress (address): 0xfE91217Dbb4e6bf98E3070Fa2fD64F839CA3b31D
Arg [2] : _vizingPad (address): 0x5D77b0c9855F44a8fbEf34E670e243E988682a82
Arg [3] : _managerAddress (address): 0xEA7744c4FA1101f9E6dF5688fc19e3EE94106439
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000006f66
Arg [1] : 000000000000000000000000fe91217dbb4e6bf98e3070fa2fd64f839ca3b31d
Arg [2] : 0000000000000000000000005d77b0c9855f44a8fbef34e670e243e988682a82
Arg [3] : 000000000000000000000000ea7744c4fa1101f9e6df5688fc19e3ee94106439
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.