编译器
0.8.23+commit.f704f362
文件 1 的 24: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 的 24: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 的 24: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 "./ExcessivelySafeCall.sol";
import "./NonblockingApp.sol";
abstract contract ERC314PlusCore is ERC20, Ownable, ReentrancyGuard, VizingOmni, NonblockingApp {
using ExcessivelySafeCall for address;
enum ActionType {
deposit,
launch,
claimPing,
claimPong,
buyPing,
buyPong,
sellPing,
sellPong
}
struct DebitAmount {
uint native;
uint token;
}
event MessageReceived(uint64 _srcChainId, address _srcAddress, uint value, bytes _payload);
event PongfeeFailed(uint64 _srcChainId, address _srcAddress, uint8 _action, uint _pongFee, uint _expectPongFee);
event Launch(
address indexed _sender,
uint _native,
uint _token,
uint _presaleToken,
uint _refundNative,
address _feeAddr
);
event Swap(address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out);
uint64 public immutable override minArrivalTime;
uint64 public immutable override maxArrivalTime;
uint24 public immutable override minGasLimit;
uint24 public immutable override maxGasLimit;
bytes1 public immutable override defaultBridgeMode;
address public immutable override selectedRelayer;
uint64 public masterChainId;
bool public launched;
uint public messageReceived;
address public feeAddress;
mapping(address => uint) public deposited;
mapping(address => bool) public claimed;
uint MAX_INT = 2 ** 256 - 1;
constructor(
string memory _name,
string memory _symbol,
address _vizingPad,
uint64 _masterChainId
) VizingOmni(_vizingPad) ERC20(_name, _symbol) {
masterChainId = _masterChainId;
launched = false;
defaultBridgeMode = MessageTypeLib.STANDARD_ACTIVATE;
}
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
) internal virtual {
revert NotImplement();
}
function master_claim(uint pongFee, uint64 srcChainId, address sender, address target) internal virtual {
revert NotImplement();
}
function master_buy(uint pongFee, uint64 srcChainId, address sender, address target, uint native) internal virtual {
revert NotImplement();
}
function master_sell(uint pongFee, uint64 srcChainId, address sender, address target, uint token) internal virtual {
revert NotImplement();
}
function slave_launch(uint64 srcChainId, address sender) internal virtual {
revert NotImplement();
}
function slave_deposit(uint64 srcChainId, address sender, address target, uint amount) internal virtual {
revert NotImplement();
}
function slave_claim(uint64 srcChainId, address sender, address target, uint native, uint token) internal virtual {
revert NotImplement();
}
function slave_buy(uint64 srcChainId, address sender, address target, uint native, uint token) internal virtual {
revert NotImplement();
}
function slave_sell(uint64 srcChainId, address sender, address target, uint native, uint token) internal virtual {
revert NotImplement();
}
function action_master(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes memory params
) internal virtual {
if (action == uint8(ActionType.deposit)) {
(address target, uint amount) = abi.decode(params, (address, uint));
master_deposit(pongFee, srcChainId, sender, target, amount);
} else if (action == uint8(ActionType.claimPing)) {
address target = abi.decode(params, (address));
master_claim(pongFee, srcChainId, sender, target);
} else if (action == uint8(ActionType.buyPing)) {
(address target, uint native) = abi.decode(params, (address, uint));
master_buy(pongFee, srcChainId, sender, target, native);
} else if (action == uint8(ActionType.sellPing)) {
(address target, uint token) = abi.decode(params, (address, uint));
master_sell(pongFee, srcChainId, sender, target, token);
} else revert NotImplement();
}
function action_slave(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes memory params
) internal virtual {
if (action == uint8(ActionType.deposit)) {
(address target, uint amount) = abi.decode(params, (address, uint));
slave_deposit(srcChainId, sender, target, amount);
} else if (action == uint8(ActionType.claimPong)) {
(address target, uint native, uint token) = abi.decode(params, (address, uint, uint));
slave_claim(srcChainId, sender, target, native, token);
} else if (action == uint8(ActionType.buyPong)) {
(address target, uint native, uint token) = abi.decode(params, (address, uint, uint));
slave_buy(srcChainId, sender, target, native, token);
} else if (action == uint8(ActionType.sellPong)) {
(address target, uint token, uint native) = abi.decode(params, (address, uint, uint));
slave_sell(srcChainId, sender, target, native, token);
} else if (action == uint8(ActionType.launch)) {
slave_launch(srcChainId, sender);
} else revert NotImplement();
}
function _computePongValueWithOutPongFee(
uint8 action,
uint64 srcChainId,
uint pongFee,
bytes memory params
) internal view virtual returns (uint value, uint sendToFee) {
value = msg.value - pongFee;
sendToFee = 0;
}
function _nonblockingReceive(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
bytes calldata params
) public payable virtual override {
require(_msgSender() == address(this), "ERC314PlusCore: caller must be self");
if (srcChainId == masterChainId) action_slave(srcChainId, sender, action, pongFee, params);
else action_master(srcChainId, sender, action, pongFee, params);
}
function _callSelf(
uint64 srcChainId,
address sender,
uint8 action,
uint pongFee,
uint callValue,
bytes memory params
) internal returns (bool success, bytes memory reason) {
(success, reason) = address(this).excessivelySafeCall(
gasleft(),
callValue,
150,
abi.encodeWithSelector(this._nonblockingReceive.selector, srcChainId, sender, action, pongFee, params)
);
}
function verifySource(uint64 srcChainId, address srcContract) internal view virtual returns (bool authorized);
function _receiveMessage(
uint64 srcChainId,
uint256 srcContract,
bytes calldata _payload
) internal virtual override {
require(verifySource(srcChainId, address(uint160(srcContract))), "unauthorized.");
(address sender, bytes memory message) = abi.decode(_payload, (address, bytes));
messageReceived += 1;
emit MessageReceived(srcChainId, sender, msg.value, message);
(uint8 action, uint pongFee, bytes memory params) = abi.decode(message, (uint8, uint, bytes));
(uint value, uint sendToFee) = _computePongValueWithOutPongFee(action, srcChainId, pongFee, params);
uint callValue = pongFee + value - sendToFee;
if (sendToFee > 0) payable(feeAddress).transfer(sendToFee);
(bool success, bytes memory reason) = _callSelf(srcChainId, sender, action, pongFee, callValue, params);
if (!success) {
_storeFailedMessage(srcChainId, sender, message, reason, callValue);
}
}
function deposit(uint pongFee, uint amount) public payable virtual;
function claim(uint pongFee) public payable virtual;
function swapExactETHForTokens(uint pongFee, address to, uint deadline) external payable virtual;
function swapExactTokensForETH(uint pongFee, uint amountIn, address to, uint deadline) external payable virtual;
function _transfer(address from, address to, uint256 amount) internal virtual override {
if (_msgSender() != address(this) && to == address(this)) {
revert("Unsupported");
} else {
super._transfer(from, to, amount);
}
}
function _depositPingPongSignature(
address target,
uint pongFee,
uint amount
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.deposit), pongFee, abi.encode(target, amount));
}
function _claimPingSignature(address target, uint pongFee) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.claimPing), pongFee, abi.encode(target));
}
function _claimPongSignature(
address target,
uint refund,
uint amount
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.claimPong), 0, abi.encode(target, refund, amount));
}
function _buyPingSignature(
address target,
uint pongFee,
uint amountIn
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.buyPing), pongFee, abi.encode(target, amountIn));
}
function _buyPongSignature(address target, uint native, uint token) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.buyPong), 0, abi.encode(target, native, token));
}
function _sellPingSignature(
address target,
uint pongFee,
uint amountIn
) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.sellPing), pongFee, abi.encode(target, amountIn));
}
function _sellPongSignature(address target, uint native, uint token) internal view virtual returns (bytes memory) {
return abi.encode(uint8(ActionType.sellPong), 0, abi.encode(target, native, token));
}
}
文件 4 的 24: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 的 24: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 的 24: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 的 24: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 的 24: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 的 24: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);
function deployChainId() external view returns (uint64);
function emit2LaunchPad(
uint64 earliestArrivalTimestamp,
uint64 latestArrivalTimestamp,
address relayer,
address sender,
uint256 value,
uint64 destChainid,
bytes memory additionParams,
bytes memory message
) external payable;
function PacketMessages(
bytes1[] memory mode,
address[] memory targetContract,
uint24[] memory gasLimit,
uint64[] memory price,
bytes[] memory message
) external view returns (bytes[] memory);
function PacketMessage(bytes1 mode, address targetContract, uint24 gasLimit, uint64 price, bytes memory message)
external
view
returns (bytes memory);
function exactOutput(uint64 destChainid, uint256 amountOut) external view returns (uint256 amountIn);
function exactInput(uint64 destChainid, uint256 amountIn) external view returns (uint256 amountOut);
function estimateVizingGasFee(
uint256 value,
uint64 destChainid,
bytes calldata additionParams,
bytes calldata message
) external view returns (uint256 vizingGasFee);
function computeTradeFee(uint64 destChainid, uint256 value) external view returns (uint256 amountIn);
}
文件 10 的 24: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 的 24:IMessageReceiver.sol
pragma solidity ^0.8.23;
interface IMessageReceiver {
function receiveStandardMessage(
uint64 srcChainId,
uint256 srcContract,
bytes calldata message
) external payable;
}
文件 12 的 24: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 的 24: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 的 24: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 的 24: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);
}
文件 16 的 24: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) {}
uint64 public immutable override deployChainId;
function defaultBridgeMode()
external
view
virtual
override
returns (bytes1)
{}
function selectedRelayer()
external
view
virtual
override
returns (address)
{}
IMessageChannel public LaunchPad;
constructor(address _LaunchPad) {
__LaunchPadInit(_LaunchPad);
}
function __LaunchPadInit(address _LaunchPad) internal virtual {
LaunchPad = IMessageChannel(_LaunchPad);
}
function _simpleLaunch(
uint64 destChainid,
address targetContract,
uint256 amountOut,
uint24 gasLimitInDestChain,
bytes memory messageEncoded
) internal virtual {
bytes memory packedMessage = PacketMessage(
bytes1(0x01),
targetContract,
gasLimitInDestChain,
_fetchPrice(targetContract, destChainid),
messageEncoded
);
emit2LaunchPad(
0,
0,
address(0),
msg.sender,
amountOut,
destChainid,
new bytes(0),
packedMessage
);
}
function _simpleLaunchExpert(
uint64 destChainid,
address targetContract,
uint256 amountOut,
uint24 gasLimitInDestChain,
bytes memory additionParams,
bytes memory messageEncoded
) internal virtual {
bytes memory packedMessage = PacketMessage(
bytes1(0x01),
targetContract,
gasLimitInDestChain,
_fetchPrice(targetContract, destChainid),
messageEncoded
);
emit2LaunchPad(
0,
0,
address(0),
msg.sender,
amountOut,
destChainid,
additionParams,
packedMessage
);
}
function PacketMessages(
bytes1[] memory mode,
address[] memory targetContract,
uint24[] memory gasLimit,
uint64[] memory price,
bytes[] memory message
) public pure virtual override returns (bytes[] memory) {
bytes[] memory signatures = new bytes[](message.length);
for (uint256 i = 0; i < message.length; i++) {
signatures[i] = PacketMessage(
mode[i],
targetContract[i],
gasLimit[i],
price[i],
message[i]
);
}
return signatures;
}
function PacketMessage(
bytes1 mode,
address targetContract,
uint24 gasLimit,
uint64 price,
bytes memory message
) public pure virtual override returns (bytes memory) {
return
abi.encodePacked(
mode,
uint256(uint160(targetContract)),
gasLimit,
price,
message
);
}
function PacketMessageSimultaneousToken(
bytes1 mode,
address targetContract,
uint24 gasLimit,
uint64 price,
bytes1 tokenSymbol,
address sender,
address receiver,
uint256 amount,
bytes memory message
) public pure returns (bytes memory) {
return
abi.encodePacked(
mode,
uint256(uint160(targetContract)),
gasLimit,
price,
tokenSymbol,
sender,
receiver,
amount,
message
);
}
function emit2LaunchPad(
uint64 earliestArrivalTimestamp,
uint64 latestArrivalTimestamp,
address relayer,
address sender,
uint256 value,
uint64 destChainid,
bytes memory additionParams,
bytes memory message
) public payable virtual {
LaunchPad.Launch{value: msg.value}(
earliestArrivalTimestamp,
latestArrivalTimestamp,
relayer,
sender,
value,
destChainid,
additionParams,
message
);
}
function computeTradeFee(
uint64 destChainid,
uint256 value
) public 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
) public view override returns (uint256 amountIn) {
return
IVizingGasSystemChannel(LaunchPad.gasSystemAddr()).exactOutput(
destChainid,
amountOut
);
}
function exactInput(
uint64 destChainid,
uint256 amountIn
) public view override 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 的 24: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 的 24: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 的 24: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 的 24: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 的 24: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;
}
}
文件 22 的 24: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;
}
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) internal virtual override {
deposited[target] += amount;
}
function slave_claim(
uint64 srcChainId,
address sender,
address target,
uint native,
uint token
) internal virtual override {
if (token > 0) _mint(target, token);
if (native > 0) payable(target).transfer(native);
claimed[target] = true;
}
function slave_buy(
uint64 srcChainId,
address sender,
address target,
uint native,
uint token
) internal virtual override {
if (token > 0) _mint(target, token);
if (native > 0) payable(target).transfer(native);
}
function slave_sell(
uint64 srcChainId,
address sender,
address target,
uint native,
uint token
) internal virtual override {
if (token > 0) _mint(target, token);
if (native > 0) payable(target).transfer(native);
}
function depositPingEstimateGas(
uint pongFee,
address target,
uint amount
) public view virtual returns (uint pingFee) {
pingFee = paramsEstimateGas(
masterChainId,
masterContract,
amount + pongFee,
_depositPingPongSignature(target, pongFee, amount)
);
}
function deposit(uint pongFee, uint amount) public payable virtual override nonReentrant {
require(!launched, "launched");
uint pingFee = depositPingEstimateGas(pongFee, _msgSender(), amount);
require(msg.value >= amount + pingFee + pongFee, "bridge fee not enough");
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
amount + pongFee,
_depositPingPongSignature(_msgSender(), pongFee, amount),
_msgSender()
);
}
function claimPingEstimateGas(uint pongFee, address target) public view virtual returns (uint pingFee) {
pingFee = paramsEstimateGas(masterChainId, masterContract, pongFee, _claimPingSignature(target, pongFee));
}
function claim(uint pongFee) public payable virtual override nonReentrant {
require(launched, "unlaunched");
require(!claimed[_msgSender()], "claimed");
uint pingFee = claimPingEstimateGas(pongFee, _msgSender());
require(msg.value >= pingFee + pongFee, "bridge fee not enough");
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
pongFee,
_claimPingSignature(_msgSender(), pongFee),
_msgSender()
);
}
function buyPingEstimateGas(
uint pongFee,
address target,
uint amountIn
) public view virtual returns (uint pingFee) {
pingFee = paramsEstimateGas(
masterChainId,
masterContract,
pongFee,
_buyPingSignature(target, pongFee, amountIn)
);
}
function _buy(uint pongFee, address to, uint deadline) internal {
require(launched, "unlaunched");
require(deadline == 0 || deadline > block.timestamp, "deadline err.");
uint pingFee = buyPingEstimateGas(pongFee, to, msg.value);
uint amountIn = msg.value - pingFee - pongFee;
require(amountIn > 0, "amount in err.");
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
amountIn + pongFee,
_buyPingSignature(to, pongFee, amountIn),
_msgSender()
);
}
function sellPingEstimateGas(
uint pongFee,
address target,
uint amountIn
) public view virtual returns (uint pingFee) {
pingFee = paramsEstimateGas(
masterChainId,
masterContract,
pongFee,
_sellPingSignature(target, pongFee, amountIn)
);
}
function _sell(uint pongFee, address from, address to, uint amountIn, uint deadline) internal {
require(launched, "unlaunched");
require(amountIn > 0, "amount in err.");
require(deadline == 0 || deadline > block.timestamp, "deadline err.");
require(balanceOf(from) >= amountIn, "sell amount exceeds balance");
uint pingFee = sellPingEstimateGas(pongFee, to, amountIn);
require(msg.value >= pingFee + pongFee, "bridge fee not enough");
_burn(from, amountIn);
paramsEmit2LaunchPad(
pingFee,
masterChainId,
masterContract,
pongFee,
_sellPingSignature(to, pongFee, amountIn),
_msgSender()
);
}
function getReserves() public view returns (uint, uint) {
revert NotImplement();
}
function getAmountOut(uint value, bool isBuy) public view returns (uint) {
revert NotImplement();
}
function swapExactETHForTokens(
uint pongFee,
address to,
uint deadline
) external payable virtual override nonReentrant {
_buy(pongFee, to, deadline);
}
function swapExactTokensForETH(
uint pongFee,
uint amountIn,
address to,
uint deadline
) external payable virtual override nonReentrant {
_sell(pongFee, _msgSender(), to, amountIn, deadline);
}
receive() external payable {
}
function withdrawFee(address to, uint amount) public onlyOwner {
payable(to).transfer(amount);
}
}
文件 23 的 24:TokenSlave.sol
pragma solidity ^0.8.0;
import {SlaveTokenBase} from "./lib/SlaveTokenBase.sol";
contract TokenSlave is SlaveTokenBase {
constructor(
address _vizingPad,
uint64 _masterChainId
) SlaveTokenBase("Orbit Guy", "ORBGUY", _vizingPad, address(0), _masterChainId) {}
}
文件 24 的 24: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":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_native","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_token","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_presaleToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_refundNative","type":"uint256"},{"indexed":false,"internalType":"address","name":"_feeAddr","type":"address"}],"name":"Launch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_callValue","type":"uint256"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"_action","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_pongFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expectPongFee","type":"uint256"}],"name":"PongfeeFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"_srcChainId","type":"uint64"},{"indexed":false,"internalType":"address","name":"_srcAddress","type":"address"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LandingPad","outputs":[{"internalType":"contract IMessageChannel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LaunchPad","outputs":[{"internalType":"contract IMessageChannel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes1","name":"mode","type":"bytes1"},{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"uint24","name":"gasLimit","type":"uint24"},{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"PacketMessage","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes1","name":"mode","type":"bytes1"},{"internalType":"address","name":"targetContract","type":"address"},{"internalType":"uint24","name":"gasLimit","type":"uint24"},{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"bytes1","name":"tokenSymbol","type":"bytes1"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"PacketMessageSimultaneousToken","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes1[]","name":"mode","type":"bytes1[]"},{"internalType":"address[]","name":"targetContract","type":"address[]"},{"internalType":"uint24[]","name":"gasLimit","type":"uint24[]"},{"internalType":"uint64[]","name":"price","type":"uint64[]"},{"internalType":"bytes[]","name":"message","type":"bytes[]"}],"name":"PacketMessages","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint8","name":"action","type":"uint8"},{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"_nonblockingReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"buyPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"claimPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"computeTradeFee","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultBridgeMode","outputs":[{"internalType":"bytes1","name":"","type":"bytes1"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deployChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"earliestArrivalTimestamp","type":"uint64"},{"internalType":"uint64","name":"latestArrivalTimestamp","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"bytes","name":"additionParams","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"emit2LaunchPad","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"bytes","name":"additionParams","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"estimateVizingGasFee","outputs":[{"internalType":"uint256","name":"vizingGasFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destChainid","type":"uint64"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isBuy","type":"bool"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChainId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageFailed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messageReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minArrivalTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGasLimit","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"dstChainId","type":"uint64"},{"internalType":"address","name":"dstContract","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"paramsEstimateGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"uint256","name":"srcContract","type":"uint256"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"receiveStandardMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"selectedRelayer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"sellPingEstimateGas","outputs":[{"internalType":"uint256","name":"pingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMasterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pongFee","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]