编译器
0.8.23+commit.f704f362
文件 1 的 25:Context.sol
pragma solidity ^0.8.0;
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;
}
}
文件 2 的 25:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
文件 3 的 25:ERC314PlusCore.sol
pragma solidity ^0.8.0;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {VizingOmni} from "@vizing/contracts/VizingOmni.sol";
import {MessageTypeLib} from "@vizing/contracts/library/MessageTypeLib.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "./ExcessivelySafeCall.sol";
import "./NonblockingApp.sol";
abstract contract ERC314PlusCore is ERC20, Ownable, ReentrancyGuard, VizingOmni, NonblockingApp, Pausable {
using ExcessivelySafeCall for address;
enum ActionType {
depositPing,
depositPong,
launch,
claimPing,
claimPong,
buyPing,
buyPong,
sellPing,
sellPong,
crossPing
}
struct DebitAmount {
uint native;
uint token;
}
function pause() external onlyOwner {
bool isPaused = paused() ;
if(isPaused) {
_unpause();
} else {
_pause();
}
}
event MessageReceived(uint64 _srcChainId, address _srcAddress, uint value, bytes _payload);
event PongfeeFailed(uint64 _srcChainId, address _srcAddress, uint8 _action, uint _pongFee, uint _expectPongFee);
event Launch(
uint earmarkedSupply,
uint earmarkedNative,
uint presaleRefundRatio,
uint presaleSupply,
uint presaleNative,
uint omniSupply,
uint presaleAccumulate
);
event Swap(address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out,uint nonce);
event AssetLocked(ActionType _action, uint64 _srcChainId, address _owner, uint _lockedNative, uint _lockedToken,uint nonce);
event Deposited(uint64 _srcChainId, address _sender, uint _native,uint nonce);
event Claimed(uint64 _srcChainId, address _sender, address _to, uint _native, uint _token,uint nonce);
event Crossed(uint64 _srcChainId, address _sender, address _to, uint _token,uint nonce);
event Unlocked(address _owner,address _to, uint _native, uint _token);
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;
mapping(uint => mapping(address => mapping(uint => bool))) public crossNoncePing;
mapping(uint => mapping(address => uint)) public crossNonce;
uint64 public masterChainId;
bool public launched;
uint public messageReceived;
address public feeAddress;
uint public totalSupplyInit = 20000000 ether;
uint public launchFunds = 10 ether;
uint public launchHardCap = 8000 ether;
uint public tokenomics = 2;
address public airdropAddr;
function setFeeAddress(address addr) public virtual onlyOwner {
feeAddress = addr;
}
function setAirdropAddr(address addr) public virtual onlyOwner {
airdropAddr = addr;
}
function setLaunchHardCap(uint amount) public virtual onlyOwner {
launchHardCap = amount;
}
uint MAX_INT = 2 ** 256 - 1;
uint public nativeMax = 50 ether;
function setNativeMax(uint amount) public virtual onlyOwner {
nativeMax = amount;
}
uint public nativeMin = 0.0001 ether;
function setNativeMin(uint amount) public virtual onlyOwner {
nativeMin = amount;
}
uint public tokenMin = 1 ether;
function setTokenMin(uint amount) public virtual onlyOwner {
tokenMin = amount;
}
uint public launchTime = 1718956800;
function setLaunchTime(uint launchTime_) public virtual onlyOwner {
launchTime = launchTime_;
}
function launchIsEnd() public view returns (bool) {
return block.timestamp >= launchTime;
}
function nowTime() public view returns (uint) {
return block.timestamp;
}
constructor(
string memory _name,
string memory _symbol,
address _vizingPad,
uint64 _masterChainId
) VizingOmni(_vizingPad) ERC20(_name, _symbol) {
masterChainId = _masterChainId;
launched = false;
defaultBridgeMode = MessageTypeLib.STANDARD_ACTIVATE;
feeAddress = owner();
airdropAddr = owner();
}
function paramsEstimateGas(
uint64 dstChainId,
address dstContract,
uint value,
bytes memory params
) public view virtual returns (uint) {
bytes memory message = _packetMessage(
defaultBridgeMode,
dstContract,
maxGasLimit,
_fetchPrice(dstContract, dstChainId),
abi.encode(_msgSender(), params)
);
return LaunchPad.estimateGas(value, dstChainId, new bytes(0), message);
}
function paramsEmit2LaunchPad(
uint bridgeFee,
uint64 dstChainId,
address dstContract,
uint value,
bytes memory params,
address sender
) internal virtual {
bytes memory message = _packetMessage(
defaultBridgeMode,
dstContract,
maxGasLimit,
_fetchPrice(dstContract, dstChainId),
abi.encode(_msgSender(), params)
);
uint bridgeValue = value + bridgeFee;
require(msg.value >= bridgeValue, "bridgeFee err.");
LaunchPad.Launch{value: bridgeValue}(0, 0, selectedRelayer, sender, value, dstChainId, new bytes(0), message);
}
function master_deposit(
uint pongFee,
uint64 srcChainId,
address sender,
address target,
uint amount,
uint nonce
) internal virtual {
revert NotImplement();
}
function master_claim(uint pongFee, uint64 srcChainId, address sender, address target,uint nonce) internal virtual {
revert NotImplement();
}
function master_buy(uint pongFee, uint64 srcChainId, address sender, address target, uint native,uint nonce ) internal virtual {
revert NotImplement();
}
function master_sell(uint pongFee, uint64 srcChainId, address sender, address target, uint token,uint nonce) internal virtual {
revert NotImplement();
}
function slave_launch(uint64 srcChainId, address sender) internal virtual {
revert NotImplement();
}
function slave_deposit(uint64 srcChainId, address sender, address target, uint amount, uint accumulate,uint nonce) internal virtual {
revert NotImplement();
}
function slave_claim(uint64 srcChainId, address sender, address target, uint native, uint token,uint nonce) internal virtual {
revert NotImplement();
}
function slave_buy(uint64 srcChainId, address sender, address target, uint native, uint token,uint nonce) internal virtual {
revert NotImplement();
}
function slave_sell(uint64 srcChainId, address sender, address target, uint native, uint token,uint nonce) internal virtual {
revert NotImplement();
}
function master_cross(
uint64 srcChainId,
address sender,
uint64 dstChainId,
address to,
uint token,
uint nonce
) internal virtual {
revert NotImplement();
}
function slave_cross(
uint64 srcChainId,
address sender,
uint64 dstChainId,
address to,
uint token,
uint nonce
) internal virtual {
revert NotImplement();
}
function action_master(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes memory params
) internal virtual {
if (action == uint8(ActionType.depositPing)) {
(uint nonce ,address target, uint amount) = abi.decode(params, (uint, address, uint));
master_deposit(pongFee, srcChainId, sender, target, amount,nonce);
} else if (action == uint8(ActionType.claimPing)) {
(uint nonce ,address target) = abi.decode(params, (uint,address));
master_claim(pongFee, srcChainId, sender, target,nonce);
} else if (action == uint8(ActionType.buyPing)) {
(uint nonce ,address target, uint native) = abi.decode(params, (uint,address, uint));
master_buy(pongFee, srcChainId, sender, target, native,nonce);
} else if (action == uint8(ActionType.sellPing)) {
(uint nonce,address target, uint token) = abi.decode(params, (uint,address, uint));
master_sell(pongFee, srcChainId, sender, target, token,nonce);
} else if (action == uint8(ActionType.crossPing)) {
(uint nonce,uint64 chainid, address to, uint token) = abi.decode(params, (uint,uint64, address, uint));
master_cross(srcChainId, sender, chainid, to, token,nonce);
} else revert NotImplement();
}
function action_slave(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes memory params
) internal virtual {
if (action == uint8(ActionType.depositPong)) {
(uint nonce,address target, uint amount,uint accumulate) = abi.decode(params, (uint,address, uint, uint));
slave_deposit(srcChainId, sender, target, amount, accumulate,nonce);
} else if (action == uint8(ActionType.claimPong)) {
(uint nonce,address target, uint native, uint token) = abi.decode(params, (uint, address, uint, uint));
slave_claim(srcChainId, sender, target, native, token,nonce);
} else if (action == uint8(ActionType.buyPong)) {
(uint nonce,address target, uint native, uint token) = abi.decode(params, (uint,address, uint, uint));
slave_buy(srcChainId, sender, target, native, token,nonce);
} else if (action == uint8(ActionType.sellPong)) {
(uint nonce,address target, uint token, uint native) = abi.decode(params, (uint,address, uint, uint));
slave_sell(srcChainId, sender, target, native, token,nonce);
} else if (action == uint8(ActionType.launch)) {
slave_launch(srcChainId, sender);
} else if (action == uint8(ActionType.crossPing)) {
(uint nonce,uint64 chainid, address to, uint token) = abi.decode(params, (uint,uint64, address, uint));
slave_cross(srcChainId, sender, chainid, to, token,nonce);
} else revert NotImplement();
}
function _computePongValueWithOutPongFee(
uint8 action,
uint64 srcChainId,
uint pongFee,
bytes memory params
) internal view virtual returns (uint value, uint sendToFee) {
value = msg.value - pongFee;
sendToFee = 0;
}
function _nonblockingReceive(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes calldata params
) public payable virtual override {
require(_msgSender() == address(this), "ERC314PlusCore: caller must be self");
if (srcChainId == masterChainId) action_slave(srcChainId, sender, action, pongFee, params);
else action_master(srcChainId, sender, action, pongFee, params);
}
function _callSelf(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
uint callValue,
bytes memory params
) internal returns (bool success, bytes memory reason) {
(success, reason) = address(this).excessivelySafeCall(
gasleft(),
callValue,
150,
abi.encodeWithSelector(this._nonblockingReceive.selector, srcChainId, sender, action, pongFee, params)
);
}
function verifySource(uint64 srcChainId, address srcContract) internal view virtual returns (bool authorized);
function _receiveMessage(
uint64 srcChainId,
uint256 srcContract,
bytes calldata _payload
) internal virtual override {
require(verifySource(srcChainId, address(uint160(srcContract))), "unauthorized.");
(address sender, bytes memory message) = abi.decode(_payload, (address, bytes));
messageReceived += 1;
emit MessageReceived(srcChainId, sender, msg.value, message);
(uint8 action, uint pongFee, bytes memory params) = abi.decode(message, (uint8, uint, bytes));
(uint value, uint sendToFee) = _computePongValueWithOutPongFee(action, srcChainId, pongFee, params);
uint callValue = pongFee + value - sendToFee;
if (sendToFee > 0)
transferNative(feeAddress, sendToFee);
(bool success, bytes memory reason) = _callSelf(srcChainId, sender, action, pongFee, callValue, params);
if (!success) {
_storeFailedMessage(srcChainId, sender, message, reason, callValue);
}
require(success, "cross-chain failed");
}
function transferNative(address to, uint amount) internal {
(bool success, ) = to.call{value: amount}("");
require(success, "Transfer failed.");
}
function _transfer(address from, address to, uint256 amount) internal virtual override {
if (_msgSender() != address(this) && to == address(this)) {
revert("Unsupported");
} else {
super._transfer(from, to, amount);
}
}
function _depositPingSignature(
uint nonce,
address target,
uint pongFee,
uint amount
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.depositPing), pongFee, abi.encode(nonce,target, amount));
}
function _depositPongSignature(
uint nonce,
address target,
uint pongFee,
uint amount,
uint accumulate
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.depositPong), pongFee, abi.encode(nonce,target, amount,accumulate));
}
function _claimPingSignature(uint nonce,address target, uint pongFee) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.claimPing), pongFee, abi.encode(nonce,target));
}
function _claimPongSignature(
uint nonce,
address target,
uint refund,
uint amount
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.claimPong), 0, abi.encode(nonce,target, refund, amount));
}
function _buyPingSignature(
uint nonce,
address target,
uint pongFee,
uint amountIn
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.buyPing), pongFee, abi.encode(nonce,target, amountIn));
}
function _buyPongSignature(uint nonce,address target, uint native, uint token) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.buyPong), 0, abi.encode(nonce,target, native, token));
}
function _sellPingSignature(
uint nonce,
address target,
uint pongFee,
uint amountIn
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.sellPing), pongFee, abi.encode(nonce,target, amountIn));
}
function _sellPongSignature(uint nonce,address target, uint native, uint token) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.sellPong), 0, abi.encode(nonce,target, native, token));
}
function _crossPingSignature(
uint nonce,
uint64 dstChainId,
address target,
uint token
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.crossPing), 0, abi.encode(nonce,dstChainId, target, token));
}
}
文件 4 的 25:ExcessivelySafeCall.sol
pragma solidity >=0.7.6;
library ExcessivelySafeCall {
uint256 constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
function excessivelySafeCall(
address _target,
uint256 _gas,
uint256 _value,
uint16 _maxCopy,
bytes memory _calldata
) internal returns (bool, bytes memory) {
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
assembly {
_success := call(
_gas,
_target,
_value,
add(_calldata, 0x20),
mload(_calldata),
0,
0
)
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
mstore(_returnData, _toCopy)
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
function excessivelySafeStaticCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal view returns (bool, bytes memory) {
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
assembly {
_success := staticcall(
_gas,
_target,
add(_calldata, 0x20),
mload(_calldata),
0,
0
)
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
mstore(_returnData, _toCopy)
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure {
require(_buf.length >= 4);
uint256 _mask = LOW_28_MASK;
assembly {
let _word := mload(add(_buf, 0x20))
_word := and(_word, _mask)
_word := or(_newSelector, _word)
mstore(add(_buf, 0x20), _word)
}
}
}
文件 5 的 25:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 6 的 25:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 7 的 25:IMessageChannel.sol
pragma solidity ^0.8.23;
import {IMessageStruct} from "./IMessageStruct.sol";
interface IMessageChannel is IMessageStruct {
function Launch(
uint64 earliestArrivalTimestamp,
uint64 latestArrivalTimestamp,
address relayer,
address sender,
uint256 value,
uint64 destChainid,
bytes calldata additionParams,
bytes calldata message
) external payable;
function launchMultiChain(
launchEnhanceParams calldata params
) external payable;
function Landing(
landingParams[] calldata params,
bytes[][] calldata proofs
) external payable;
function LandingSpecifiedGas(
landingParams[] calldata params,
uint24 gasLimit,
bytes[][] calldata proofs
) external payable;
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);
function GetNonceLaunch(
uint64 chainId,
address sender
) external view returns (uint32);
function GetNonceLanding(
uint64 chainId,
address sender
) external view returns (uint32);
function Version() external view returns (string memory);
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);
}
文件 8 的 25:IMessageDashboard.sol
pragma solidity ^0.8.23;
import {IMessageStruct} from "./IMessageStruct.sol";
interface IMessageDashboard is IMessageStruct {
function PauseEngine(bool stop) external;
function engineState() external view returns (uint8);
function padState() external view returns (uint8, uint8);
function Withdraw(uint256 amount, address to) external;
function setGasSystem(address gasSystemAddress) external;
function setExpertLaunchHooks(
bytes1[] calldata ids,
address[] calldata hooks
) external;
function setExpertLandingHooks(
bytes1[] calldata ids,
address[] calldata hooks
) external;
function roleConfiguration(
bytes32 role,
address[] calldata accounts,
bool[] calldata states
) external;
function stationAdminSetRole(
bytes32 role,
address[] calldata accounts,
bool[] calldata states
) external;
function transferOwnership(address newOwner) external;
}
文件 9 的 25:IMessageEmitter.sol
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);
}
文件 10 的 25:IMessageEvent.sol
pragma solidity ^0.8.23;
import {IMessageStruct} from "./IMessageStruct.sol";
interface IMessageEvent is IMessageStruct {
event SuccessfulLaunchMessage(
uint32 indexed nonce,
uint64 earliestArrivalTimestamp,
uint64 latestArrivalTimestamp,
address relayer,
address sender,
address srcContract,
uint256 value,
uint64 destChainid,
bytes additionParams,
bytes message
);
event SuccessfulLaunchMultiMessages(
uint32[] indexed nonce,
uint64 earliestArrivalTimestamp,
uint64 latestArrivalTimestamp,
address relayer,
address sender,
address srcContract,
uint256[] value,
uint64[] destChainid,
bytes[] additionParams,
bytes[] message
);
event SuccessfulLanding(bytes32 indexed messageId, landingParams params);
event EngineStateRefreshing(bool indexed isPause);
event PaymentSystemChanging(address indexed gasSystemAddress);
event WithdrawRequest(address indexed to, uint256 amount);
}
文件 11 的 25:IMessageReceiver.sol
pragma solidity ^0.8.23;
interface IMessageReceiver {
function receiveStandardMessage(
uint64 srcChainId,
uint256 srcContract,
bytes calldata message
) external payable;
}
文件 12 的 25:IMessageSimulation.sol
pragma solidity ^0.8.23;
import {IMessageStruct} from "./IMessageStruct.sol";
interface IMessageSimulation is IMessageStruct {
function SimulateLanding(landingParams[] calldata params) external payable;
function EstimateExecuteGas(
landingParams[] calldata params
) external returns (bool[] memory);
}
文件 13 的 25:IMessageSpaceStation.sol
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
{}
文件 14 的 25:IMessageStruct.sol
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;
}
}
文件 15 的 25:IVizingGasSystemChannel.sol
pragma solidity ^0.8.23;
interface IVizingGasSystemChannel {
function exactOutput(
uint64 destChainid,
uint256 amountOut
) external view returns (uint256 amountIn);
function exactInput(
uint64 destChainid,
uint256 amountIn
) external view returns (uint256 amountOut);
function estimateGas(
uint256 amountOut,
uint64 destChainid,
bytes calldata message
) external view returns (uint256);
function batchEstimateTotalFee(
uint256[] calldata amountOut,
uint64[] calldata destChainid,
bytes[] calldata message
) external view returns (uint256 totalFee);
function estimateTotalFee(
uint256 value,
uint64 destChainid,
bytes calldata message
) external view returns (uint256 totalFee);
function estimatePrice(
address targetContract,
uint64 destChainid
) external view returns (uint64);
function estimatePrice(uint64 destChainid) external view returns (uint64);
function computeTradeFee(
uint64 destChainid,
uint256 amountOut
) external view returns (uint256 fee);
function computeTradeFee(
address targetContract,
uint64 destChainid,
uint256 amountOut
) external view returns (uint256 fee);
}
文件 16 的 25:MessageEmitter.sol
pragma solidity ^0.8.23;
import {IMessageStruct} from "./interface/IMessageStruct.sol";
import {IMessageChannel} from "./interface/IMessageChannel.sol";
import {IMessageEmitter} from "./interface/IMessageEmitter.sol";
import {IMessageReceiver} from "./interface/IMessageReceiver.sol";
import {IVizingGasSystemChannel} from "./interface/IVizingGasSystemChannel.sol";
abstract contract MessageEmitter is IMessageEmitter {
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;
constructor(address _LaunchPad) {
__LaunchPadInit(_LaunchPad);
}
function __LaunchPadInit(address _LaunchPad) internal virtual {
LaunchPad = IMessageChannel(_LaunchPad);
}
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
);
}
function _packetAdditionParams(
bytes1 mode,
bytes1 tokenSymbol,
address sender,
address receiver,
uint256 amount
) internal pure returns (bytes memory) {
return abi.encodePacked(mode, tokenSymbol, sender, receiver, amount);
}
function _computeTradeFee(
uint64 destChainid,
uint256 value
) internal view returns (uint256 amountIn) {
return
IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).computeTradeFee(
destChainid,
value
);
}
function _fetchNonce(
uint64 destChainid
) internal view virtual returns (uint32 nonce) {
nonce = LaunchPad.GetNonceLaunch(destChainid, msg.sender);
}
function _fetchPrice(
uint64 destChainid
) internal view virtual returns (uint64) {
return
IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).estimatePrice(
destChainid
);
}
function _fetchPrice(
address targetContract,
uint64 destChainid
) internal view virtual returns (uint64) {
return
IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).estimatePrice(
targetContract,
destChainid
);
}
function _exactOutput(
uint64 destChainid,
uint256 amountOut
) internal view returns (uint256 amountIn) {
return
IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactOutput(
destChainid,
amountOut
);
}
function _exactInput(
uint64 destChainid,
uint256 amountIn
) internal view returns (uint256 amountOut) {
return
IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactInput(
destChainid,
amountIn
);
}
function _estimateVizingGasFee(
uint256 value,
uint64 destChainid,
bytes memory additionParams,
bytes memory message
) internal view returns (uint256 vizingGasFee) {
return
LaunchPad.estimateGas(value, destChainid, additionParams, message);
}
function estimateVizingGasFee(
uint256 value,
uint64 destChainid,
bytes calldata additionParams,
bytes calldata message
) external view returns (uint256 vizingGasFee) {
return
_estimateVizingGasFee(value, destChainid, additionParams, message);
}
}
文件 17 的 25:MessageReceiver.sol
pragma solidity ^0.8.23;
import {IMessageChannel} from "./interface/IMessageChannel.sol";
import {IMessageReceiver} from "./interface/IMessageReceiver.sol";
abstract contract MessageReceiver is IMessageReceiver {
error LandingPadAccessDenied();
error NotImplement();
IMessageChannel public LandingPad;
modifier onlyVizingPad() {
if (msg.sender != address(LandingPad)) revert LandingPadAccessDenied();
_;
}
constructor(address _LandingPad) {
__LandingPadInit(_LandingPad);
}
function __LandingPadInit(address _LandingPad) internal virtual {
LandingPad = IMessageChannel(_LandingPad);
}
function receiveStandardMessage(
uint64 srcChainId,
uint256 srcContract,
bytes calldata message
) external payable virtual override onlyVizingPad {
_receiveMessage(srcChainId, srcContract, message);
}
function _receiveMessage(
uint64 srcChainId,
uint256 srcContract,
bytes calldata message
) internal virtual {
(srcChainId, srcContract, message);
revert NotImplement();
}
}
文件 18 的 25:MessageTypeLib.sol
pragma solidity ^0.8.23;
library MessageTypeLib {
bytes1 constant DEFAULT = 0x00;
bytes1 constant STANDARD_ACTIVATE = 0x01;
bytes1 constant ARBITRARY_ACTIVATE = 0x02;
bytes1 constant MESSAGE_POST = 0x03;
bytes1 constant NATIVE_TOKEN_SEND = 0x04;
bytes1 constant SINGLE_SEND = 0x01;
bytes1 constant ERC20_HANDLER = 0x03;
bytes1 constant MULTI_MANY_2_ONE = 0x04;
bytes1 constant MULTI_UNIVERSAL = 0x05;
bytes1 constant MAX_MODE = 0xFF;
function fetchMsgMode(
bytes calldata message
) internal pure returns (bytes1) {
if (message.length < 1) {
return DEFAULT;
}
bytes1 messageSlice = bytes1(message[0:1]);
return messageSlice;
}
}
文件 19 的 25:NonblockingApp.sol
pragma solidity ^0.8.0;
import "./ExcessivelySafeCall.sol";
abstract contract NonblockingApp {
uint public messageFailed;
event MessageFailed(
uint64 _srcChainId,
address _srcAddress,
bytes _payload,
bytes _reason,
uint _value,
uint _callValue
);
event RetryMessageSuccess(uint64 _srcChainId, address _srcAddress, bytes32 _payloadHash);
function _nonblockingReceive(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes calldata message
) public payable virtual;
function _storeFailedMessage(
uint64 _srcChainId,
address _srcAddress,
bytes memory _payload,
bytes memory _reason,
uint _callValue
) internal virtual {
messageFailed += 1;
emit MessageFailed(_srcChainId, _srcAddress, _payload, _reason, msg.value, _callValue);
}
}
文件 20 的 25:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 21 的 25:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 22 的 25:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
文件 23 的 25:SlaveTokenBase.sol
pragma solidity ^0.8.0;
import {ERC314PlusCore} from "./ERC314PlusCore.sol";
import {IMessageStruct} from "@vizing/contracts/interface/IMessageStruct.sol";
contract SlaveTokenBase is ERC314PlusCore {
address public masterContract;
constructor(
string memory _name,
string memory _symbol,
address _vizingPad,
address _defaultRelayer,
uint64 _masterChainId
) ERC314PlusCore(_name, _symbol, _vizingPad, _masterChainId) {
minArrivalTime = 1 minutes;
maxArrivalTime = 1 days;
minGasLimit = 100000;
maxGasLimit = 1000000;
selectedRelayer = _defaultRelayer;
}
mapping(address => uint) public deposited;
mapping(address => uint) public depositPing;
mapping(address => bool) public claimed;
mapping(address => uint) public depositNonce;
mapping(address => mapping(uint => bool)) public depositNoncePong;
mapping(address => uint) public claimNonce;
mapping(address => mapping(uint => bool)) public claimNoncePong;
mapping(address => uint) public buyNonce;
mapping(address => mapping(uint => bool)) public buyNoncePong;
mapping(address => uint) public sellNonce;
mapping(address => mapping(uint => bool)) public sellNoncePong;
uint public calcAccumulate;
function setMasterContract(address addr) public virtual onlyOwner {
masterContract = addr;
}
function verifySource(
uint64 srcChainId,
address srcContract
) internal view virtual override returns (bool authorized) {
return masterContract == srcContract && masterChainId == srcChainId;
}
function slave_launch(uint64 srcChainId, address sender) internal virtual override {
launched = true;
}
function slave_deposit(uint64 srcChainId, address sender, address target, uint amount,uint accumulate,uint nonce) internal virtual override {
require(!depositNoncePong[target][nonce], "nonce repetition");
depositNoncePong[target][nonce] = true;
deposited[target] += amount;
if(accumulate > calcAccumulate){
calcAccumulate = accumulate;
}
}
function slave_claim(
uint64 srcChainId,
address sender,
address target,
uint native,
uint token,
uint nonce
) internal virtual override {
require(!claimNoncePong[target][nonce], "nonce repetition");
claimNoncePong[target][nonce] = true;
require(!claimed[target], "claim repetition");
if (token > 0) _mint(target, token);
if (native > 0) payable(target).transfer(native);
claimed[target] = true;
}
function slave_buy(
uint64 srcChainId,
address sender,
address target,
uint native,
uint token,
uint nonce
) internal virtual override {
require(!buyNoncePong[target][nonce], "nonce repetition");
buyNoncePong[target][nonce] = true;
if (token > 0) _mint(target, token);
if (native > 0) payable(target).transfer(native);
}
function slave_sell(
uint64 srcChainId,
address sender,
address target,
uint native,
uint token,
uint nonce
) internal virtual override {
require(!sellNoncePong[target][nonce], "nonce repetition");
sellNoncePong[target][nonce] = true;
if (token > 0) _mint(target, token);
if (native > 0) payable(target).transfer(native);
}
function depositPingEstimateGas(
uint pongFee,
address target,
uint amount
) public view virtual returns (uint pingFee) {
uint nonce = depositNonce[target];
pingFee = paramsEstimateGas(
masterChainId,
masterContract,
amount + pongFee,
_depositPingSignature(nonce+1, target, pongFee, amount)
);
}
function deposit(uint pongFee, uint amount) public payable virtual nonReentrant whenNotPaused {
require(!launchIsEnd(),"deposit end");
require(!launched, "launched");
uint pingFee = depositPingEstimateGas(pongFee, _msgSender(), amount);
require(msg.value >= amount + pingFee + pongFee, "bridge fee not enough");
require(depositPing[_msgSender()] + amount <= nativeMax,"exceeding the maximum value");
require(calcAccumulate <= launchHardCap,"hard cap");
depositPing[_msgSender()] += amount;
uint nonce = depositNonce[_msgSender()];
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
amount + pongFee,
_depositPingSignature(nonce+1, _msgSender(), pongFee, amount),
_msgSender()
);
depositNonce[_msgSender()]++;
}
function claimPingEstimateGas(uint pongFee, address target) public view virtual returns (uint pingFee) {
uint nonce = claimNonce[_msgSender()];
pingFee = paramsEstimateGas(masterChainId, masterContract, pongFee, _claimPingSignature(nonce+1,target, pongFee));
}
function claim(uint pongFee) public payable virtual nonReentrant whenNotPaused{
require(launched, "unlaunched");
require(!claimed[_msgSender()], "claimed");
uint pingFee = claimPingEstimateGas(pongFee, _msgSender());
require(msg.value >= pingFee + pongFee, "bridge fee not enough");
uint nonce = claimNonce[_msgSender()];
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
pongFee,
_claimPingSignature(nonce+1,_msgSender(), pongFee),
_msgSender()
);
claimNonce[_msgSender()]++;
}
function buyPingEstimateGas(
uint pongFee,
address target,
uint amountIn
) public view virtual returns (uint pingFee) {
uint nonce = buyNonce[_msgSender()];
pingFee = paramsEstimateGas(
masterChainId,
masterContract,
pongFee,
_buyPingSignature(nonce+1,target, pongFee, amountIn)
);
}
function _buy(uint pongFee, address to, uint deadline) internal {
require(launched, "unlaunched");
require(deadline == 0 || deadline > block.timestamp, "deadline err.");
uint pingFee = buyPingEstimateGas(pongFee, to, msg.value);
uint amountIn = msg.value - pingFee - pongFee;
require(amountIn >= nativeMin, "the amount cannot be too small");
require(amountIn <= nativeMax,"the amount cannot be too large");
uint nonce = buyNonce[_msgSender()];
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
amountIn + pongFee,
_buyPingSignature(nonce+1,to, pongFee, amountIn),
_msgSender()
);
buyNonce[_msgSender()]++;
}
function sellPingEstimateGas(
uint pongFee,
address target,
uint amountIn
) public view virtual returns (uint pingFee) {
uint nonce = sellNonce[_msgSender()];
pingFee = paramsEstimateGas(
masterChainId,
masterContract,
pongFee,
_sellPingSignature(nonce+1,target, pongFee, amountIn)
);
}
function _sell(uint pongFee, address from, address to, uint amountIn, uint deadline) internal {
require(launched, "unlaunched");
require(amountIn > 0, "amount in err.");
require(deadline == 0 || deadline > block.timestamp, "deadline err.");
require(balanceOf(from) >= amountIn, "sell amount exceeds balance");
uint pingFee = sellPingEstimateGas(pongFee, to, amountIn);
require(msg.value >= pingFee + pongFee, "bridge fee not enough");
require(amountIn >= tokenMin, "the amount cannot be too small");
uint nonce = sellNonce[_msgSender()];
_burn(from, amountIn);
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
pongFee,
_sellPingSignature(nonce+1,to, pongFee, amountIn),
_msgSender()
);
sellNonce[_msgSender()]++;
}
function getReserves() public view returns (uint, uint) {
revert NotImplement();
}
function getAmountOut(uint value, bool isBuy) public view returns (uint) {
revert NotImplement();
}
function swapExactETHForTokens(
uint pongFee,
address to,
uint deadline
) external payable virtual nonReentrant whenNotPaused{
_buy(pongFee, to, deadline);
}
function swapExactTokensForETH(
uint pongFee,
uint amountIn,
address to,
uint deadline
) external payable virtual nonReentrant whenNotPaused{
_sell(pongFee, _msgSender(), to, amountIn, deadline);
}
receive() external payable {
}
function withdrawFee(address to, uint amount) public onlyOwner nonReentrant {
transferNative(to, amount);
}
function slave_cross(uint64 srcChainId, address sender, uint64 dstChainId, address to, uint token,uint nonce) internal virtual override {
require(!crossNoncePing[srcChainId][sender][nonce], "nonce repetition");
crossNoncePing[srcChainId][sender][nonce] = true;
require(dstChainId == block.chainid, "chain id err");
if (token > 0) _mint(to, token);
emit Crossed(srcChainId, sender, to, token, nonce);
}
function crossToEstimateGas(uint64 dstChainId, address to, uint amount) public view virtual returns (uint pingFee) {
require(dstChainId == masterChainId, "not master chain");
uint nonce = crossNonce[dstChainId][to];
pingFee = paramsEstimateGas(masterChainId, masterContract, 0, _crossPingSignature(nonce+1,dstChainId, to, amount));
}
function crossTo(uint64 dstChainId, address to, uint amount) external payable virtual whenNotPaused{
require(dstChainId == masterChainId, "not master chain");
address owner = _msgSender();
require(balanceOf(owner) >= amount, "insufficient balance");
_burn(owner, amount);
uint nonce = crossNonce[block.chainid][_msgSender()];
uint pingFee = crossToEstimateGas(dstChainId, to, amount);
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
0,
_crossPingSignature(nonce+1,dstChainId, to, amount),
_msgSender()
);
crossNonce[block.chainid][_msgSender()]++;
}
}
文件 24 的 25:TokenSlave.sol
pragma solidity ^0.8.0;
import {SlaveTokenBase} from "./lib/SlaveTokenBase.sol";
contract TokenSlave is SlaveTokenBase {
constructor(
address _vizingPad,
uint64 _masterChainId
) SlaveTokenBase("EL GATO", "GATO", _vizingPad, address(0), _masterChainId) {}
}
文件 25 的 25:VizingOmni.sol
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) {}
}
{
"compilationTarget": {
"contracts/TokenSlave.sol": "TokenSlave"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 100
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_vizingPad","type":"address"},{"internalType":"uint64","name":"_masterChainId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LandingPadAccessDenied","type":"error"},{"inputs":[],"name":"NotImplement","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum ERC314PlusCore.ActionType","name":"_action","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_lockedNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_lockedToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"AssetLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Crossed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"earmarkedSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"earmarkedNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleRefundRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"omniSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"presaleAccumulate","type":"uint256"}],"name":"Launch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_callValue","type":"uint256"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"_action","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_pongFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expectPongFee","type":"uint256"}],"name":"PongfeeFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"_nonblockingReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"airdropAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"buyPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcAccumulate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"claimPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"crossNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"crossNoncePing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"crossTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"crossToEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultBridgeMode","outputs":[{"internalType":"bytes1","name":"","type":"bytes1"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositPing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isBuy","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchHardCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchIsEnd","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageFailed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nowTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"dstContract","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"paramsEstimateGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"uint256","name":"srcContract","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"receiveStandardMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selectedRelayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sellNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellNoncePong","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"sellPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setAirdropAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setLaunchHardCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"launchTime_","type":"uint256"}],"name":"setLaunchTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNativeMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setNativeMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTokenMin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenomics","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyInit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]