编译器
0.8.28+commit.7893614a
文件 1 的 27:Address.sol
pragma solidity ^0.8.20;
import {Errors} from "./Errors.sol";
library Address {
error AddressEmptyCode(address target);
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert Errors.InsufficientBalance(address(this).balance, amount);
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert Errors.FailedCall();
}
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert Errors.InsufficientBalance(address(this).balance, value);
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
function _revert(bytes memory returndata) private pure {
if (returndata.length > 0) {
assembly ("memory-safe") {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert Errors.FailedCall();
}
}
}
文件 2 的 27:Context.sol
pragma solidity ^0.8.20;
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;
}
}
文件 3 的 27:Errors.sol
pragma solidity ^0.8.20;
library Errors {
error InsufficientBalance(uint256 balance, uint256 needed);
error FailedCall();
error FailedDeployment();
error MissingPrecompile(address);
}
文件 4 的 27:IERC1363.sol
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
interface IERC1363 is IERC20, IERC165 {
function transferAndCall(address to, uint256 value) external returns (bool);
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
function approveAndCall(address spender, uint256 value) external returns (bool);
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}
文件 5 的 27:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 6 的 27:IERC20.sol
pragma solidity ^0.8.20;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 7 的 27:IERC20Metadata.sol
pragma solidity ^0.8.20;
import {IERC20} from "../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);
}
文件 8 的 27:ILayerZeroEndpointV2.sol
pragma solidity >=0.8.0;
import { IMessageLibManager } from "./IMessageLibManager.sol";
import { IMessagingComposer } from "./IMessagingComposer.sol";
import { IMessagingChannel } from "./IMessagingChannel.sol";
import { IMessagingContext } from "./IMessagingContext.sol";
struct MessagingParams {
uint32 dstEid;
bytes32 receiver;
bytes message;
bytes options;
bool payInLzToken;
}
struct MessagingReceipt {
bytes32 guid;
uint64 nonce;
MessagingFee fee;
}
struct MessagingFee {
uint256 nativeFee;
uint256 lzTokenFee;
}
struct Origin {
uint32 srcEid;
bytes32 sender;
uint64 nonce;
}
interface ILayerZeroEndpointV2 is IMessageLibManager, IMessagingComposer, IMessagingChannel, IMessagingContext {
event PacketSent(bytes encodedPayload, bytes options, address sendLibrary);
event PacketVerified(Origin origin, address receiver, bytes32 payloadHash);
event PacketDelivered(Origin origin, address receiver);
event LzReceiveAlert(
address indexed receiver,
address indexed executor,
Origin origin,
bytes32 guid,
uint256 gas,
uint256 value,
bytes message,
bytes extraData,
bytes reason
);
event LzTokenSet(address token);
event DelegateSet(address sender, address delegate);
function quote(MessagingParams calldata _params, address _sender) external view returns (MessagingFee memory);
function send(
MessagingParams calldata _params,
address _refundAddress
) external payable returns (MessagingReceipt memory);
function verify(Origin calldata _origin, address _receiver, bytes32 _payloadHash) external;
function verifiable(Origin calldata _origin, address _receiver) external view returns (bool);
function initializable(Origin calldata _origin, address _receiver) external view returns (bool);
function lzReceive(
Origin calldata _origin,
address _receiver,
bytes32 _guid,
bytes calldata _message,
bytes calldata _extraData
) external payable;
function clear(address _oapp, Origin calldata _origin, bytes32 _guid, bytes calldata _message) external;
function setLzToken(address _lzToken) external;
function lzToken() external view returns (address);
function nativeToken() external view returns (address);
function setDelegate(address _delegate) external;
}
文件 9 的 27:ILayerZeroReceiver.sol
pragma solidity >=0.8.0;
import { Origin } from "./ILayerZeroEndpointV2.sol";
interface ILayerZeroReceiver {
function allowInitializePath(Origin calldata _origin) external view returns (bool);
function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);
function lzReceive(
Origin calldata _origin,
bytes32 _guid,
bytes calldata _message,
address _executor,
bytes calldata _extraData
) external payable;
}
文件 10 的 27:IMessageLibManager.sol
pragma solidity >=0.8.0;
struct SetConfigParam {
uint32 eid;
uint32 configType;
bytes config;
}
interface IMessageLibManager {
struct Timeout {
address lib;
uint256 expiry;
}
event LibraryRegistered(address newLib);
event DefaultSendLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
event SendLibrarySet(address sender, uint32 eid, address newLib);
event ReceiveLibrarySet(address receiver, uint32 eid, address newLib);
event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);
function registerLibrary(address _lib) external;
function isRegisteredLibrary(address _lib) external view returns (bool);
function getRegisteredLibraries() external view returns (address[] memory);
function setDefaultSendLibrary(uint32 _eid, address _newLib) external;
function defaultSendLibrary(uint32 _eid) external view returns (address);
function setDefaultReceiveLibrary(uint32 _eid, address _newLib, uint256 _gracePeriod) external;
function defaultReceiveLibrary(uint32 _eid) external view returns (address);
function setDefaultReceiveLibraryTimeout(uint32 _eid, address _lib, uint256 _expiry) external;
function defaultReceiveLibraryTimeout(uint32 _eid) external view returns (address lib, uint256 expiry);
function isSupportedEid(uint32 _eid) external view returns (bool);
function isValidReceiveLibrary(address _receiver, uint32 _eid, address _lib) external view returns (bool);
function setSendLibrary(address _oapp, uint32 _eid, address _newLib) external;
function getSendLibrary(address _sender, uint32 _eid) external view returns (address lib);
function isDefaultSendLibrary(address _sender, uint32 _eid) external view returns (bool);
function setReceiveLibrary(address _oapp, uint32 _eid, address _newLib, uint256 _gracePeriod) external;
function getReceiveLibrary(address _receiver, uint32 _eid) external view returns (address lib, bool isDefault);
function setReceiveLibraryTimeout(address _oapp, uint32 _eid, address _lib, uint256 _expiry) external;
function receiveLibraryTimeout(address _receiver, uint32 _eid) external view returns (address lib, uint256 expiry);
function setConfig(address _oapp, address _lib, SetConfigParam[] calldata _params) external;
function getConfig(
address _oapp,
address _lib,
uint32 _eid,
uint32 _configType
) external view returns (bytes memory config);
}
文件 11 的 27:IMessagingChannel.sol
pragma solidity >=0.8.0;
interface IMessagingChannel {
event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
function eid() external view returns (uint32);
function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;
function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);
function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);
function inboundPayloadHash(
address _receiver,
uint32 _srcEid,
bytes32 _sender,
uint64 _nonce
) external view returns (bytes32);
function lazyInboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
}
文件 12 的 27:IMessagingComposer.sol
pragma solidity >=0.8.0;
interface IMessagingComposer {
event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
event LzComposeAlert(
address indexed from,
address indexed to,
address indexed executor,
bytes32 guid,
uint16 index,
uint256 gas,
uint256 value,
bytes message,
bytes extraData,
bytes reason
);
function composeQueue(
address _from,
address _to,
bytes32 _guid,
uint16 _index
) external view returns (bytes32 messageHash);
function sendCompose(address _to, bytes32 _guid, uint16 _index, bytes calldata _message) external;
function lzCompose(
address _from,
address _to,
bytes32 _guid,
uint16 _index,
bytes calldata _message,
bytes calldata _extraData
) external payable;
}
文件 13 的 27:IMessagingContext.sol
pragma solidity >=0.8.0;
interface IMessagingContext {
function isSendingMessage() external view returns (bool);
function getSendContext() external view returns (uint32 dstEid, address sender);
}
文件 14 的 27:IOAppCore.sol
pragma solidity ^0.8.20;
import { ILayerZeroEndpointV2 } from "../../../../lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
interface IOAppCore {
error OnlyPeer(uint32 eid, bytes32 sender);
error NoPeer(uint32 eid);
error InvalidEndpointCall();
error InvalidDelegate();
event PeerSet(uint32 eid, bytes32 peer);
function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);
function endpoint() external view returns (ILayerZeroEndpointV2 iEndpoint);
function peers(uint32 _eid) external view returns (bytes32 peer);
function setPeer(uint32 _eid, bytes32 _peer) external;
function setDelegate(address _delegate) external;
}
文件 15 的 27:IOAppOptionsType3.sol
pragma solidity ^0.8.20;
struct EnforcedOptionParam {
uint32 eid;
uint16 msgType;
bytes options;
}
interface IOAppOptionsType3 {
error InvalidOptions(bytes options);
event EnforcedOptionSet(EnforcedOptionParam[] _enforcedOptions);
function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) external;
function combineOptions(
uint32 _eid,
uint16 _msgType,
bytes calldata _extraOptions
) external view returns (bytes memory options);
}
文件 16 的 27:IOAppReceiver.sol
pragma solidity ^0.8.20;
import { ILayerZeroReceiver, Origin } from "../../../../lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol";
interface IOAppReceiver is ILayerZeroReceiver {
function isComposeMsgSender(
Origin calldata _origin,
bytes calldata _message,
address _sender
) external view returns (bool isSender);
}
文件 17 的 27:IOptimistic.sol
pragma solidity ^0.8.0;
interface TradeInterface {
function placeOrder(
OrderDirection memory direction,
OrderFunding memory funding,
OrderExpiration memory expiration,
bytes32 target,
address filler
) external;
function fillSwap(
OrderDirection memory direction,
uint32 orderIndex
) external;
function createMatch(
OrderDirection memory direction,
uint32 srcIndex,
bytes32 counterparty,
uint96 srcQuantity
) external;
function executeMatch(
OrderDirection memory direction,
uint32 takerIndex,
address taker,
uint96 payoutQuantity,
bool isUnwrap
) external;
function confirmMatch(
OrderDirection memory direction,
uint32 srcIndex
) external;
function cancelOrder(
OrderDirection memory direction,
uint32 orderIndex
) external;
function unwindMatch(
OrderDirection memory direction,
uint32 srcIndex,
bool isUnwrap
) external;
function challengeMatch(
OrderDirection memory direction,
uint32 srcIndex,
bytes calldata _extraSendOptions,
bytes calldata _extraReturnOptions
) external payable;
struct Order {
address sender;
OrderFunding funding;
OrderExpiration expiration;
uint96 settled;
bytes32 target;
address filler;
}
struct OrderDirection {
address srcAsset;
bytes32 dstAsset;
uint32 dstLzc;
}
struct OrderFunding {
uint96 srcQuantity;
uint96 dstQuantity;
uint16 bondFee;
address bondAsset;
uint96 bondAmount;
}
struct OrderExpiration {
uint32 timestamp;
uint16 challengeOffset;
uint16 challengeWindow;
}
struct Match {
uint32 index;
uint96 srcQuantity;
uint96 dstQuantity;
bytes32 maker;
bytes32 target;
address bonder;
uint96 blockNumber;
bool finalized;
bool challenged;
}
struct Pair {
address src;
address dst;
uint16 lzc;
Order[] orders;
mapping(uint => Match) matches;
mapping(uint => mapping (bytes32 => uint)) receipts;
}
struct Payload {
address challenger;
address srcToken;
bytes32 dstToken;
uint32 srcIndex;
bytes32 counterparty;
bytes32 target;
uint minAmount;
uint status;
}
}
文件 18 的 27:IWrapped.sol
pragma solidity ^0.8.0;
interface IWrapped {
function balanceOf(address account) external view returns (uint256);
function withdraw(uint256 amount) external;
}
文件 19 的 27:Main.sol
pragma solidity ^0.8.20;
import "./interfaces/IOptimistic.sol";
import "./interfaces/IWrapped.sol";
import { OApp, MessagingFee, Origin } from "./lzApp//lz-evm-oapp-v2/contracts/oapp/OApp.sol";
import { OAppOptionsType3 } from "./lzApp/lz-evm-oapp-v2/contracts/oapp/libs/OAppOptionsType3.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
contract Orderbook is OApp, OAppOptionsType3, TradeInterface, ReentrancyGuard {
mapping(uint => mapping(bytes32 => mapping(address => Pair))) public book;
uint32 public srcLzc;
uint private constant BASIS_POINTS=10000;
uint16 private constant SEND = 1;
uint16 public maxFee = 1001;
constructor(address _endpoint, address _owner, uint32 _lzEid) OApp(_endpoint, _owner) Ownable(msg.sender) {
srcLzc = _lzEid;
}
function setMaxFee(uint16 _newMaxFee) public onlyOwner {
maxFee = _newMaxFee;
}
event OrderPlaced(address indexed sender, OrderDirection direction, uint32 orderIndex, OrderFunding funding, OrderExpiration expiration, bytes32 target, address filler);
event SwapFilled(address indexed maker, OrderDirection direction, uint32 orderIndex, uint96 srcQuantity, uint96 dstQuantity, address taker, address target, uint96 blockNumber);
event MatchCreated(address indexed bonder, OrderDirection direction, uint32 orderIndex, uint96 srcQuantity, uint96 dstQuantity, address taker, bytes32 maker, uint96 blockNumber);
event MatchExecuted(address indexed maker, OrderDirection direction, uint32 takerIndex, uint96 takerQuantity, address target);
event MatchConfirmed(address indexed bonder, OrderDirection direction, uint32 orderIndex, uint16 bondFee);
event MatchUnwound(address indexed bonder, OrderDirection direction, uint32 orderIndex);
event ChallengeRaised(address indexed challenger, OrderDirection direction, uint32 srcIndex, address bonder, uint32 dstIndex);
event OrderCancelled(address indexed sender, OrderDirection direction, uint32 orderIndex);
event ChallengeResult(bool challenge_status);
function placeOrder(
OrderDirection memory direction,
OrderFunding memory funding,
OrderExpiration memory expiration,
bytes32 target,
address filler
) public {
require((expiration.challengeOffset + expiration.challengeWindow) < 1e5 , "!maxWindow");
require(funding.bondFee < maxFee , "!maxFee");
require(bytes32ToAddress(target) != address(0), "!destWallet");
Order[] storage orders=book[direction.dstLzc][direction.dstAsset][direction.srcAsset].orders;
Order memory newOrder = Order({
sender: msg.sender,
funding: funding,
expiration: expiration,
settled: uint96(0),
target: target,
filler: filler
});
uint32 orderIndex=uint32(orders.length);
orders.push(newOrder);
emit OrderPlaced(
msg.sender,
direction,
orderIndex,
funding,
expiration,
target,
filler
);
}
function getOrders(address srcAsset, bytes32 dstAsset, uint dstLzc) public view returns (Order[] memory orders) {
orders=book[dstLzc][dstAsset][srcAsset].orders;
}
function getOrder(address srcAsset, bytes32 dstAsset, uint dstLzc, uint index) public view returns (Order memory _order) {
_order=book[dstLzc][dstAsset][srcAsset].orders[index];
}
function getReceipt(address srcAsset, bytes32 dstAsset, uint dstLzc, uint srcIndex, bytes32 target) public view returns (uint _receipt) {
_receipt=book[dstLzc][dstAsset][srcAsset].receipts[srcIndex][target];
}
function getMatch(address srcAsset, bytes32 dstAsset, uint dstLzc, uint index) public view returns (Match memory _match) {
_match=book[dstLzc][dstAsset][srcAsset].matches[index];
}
function getCurrentBlockNumber() public view returns (uint256) {
return block.number;
}
function fillSwap(OrderDirection memory direction, uint32 orderIndex) public nonReentrant {
require(direction.dstLzc == srcLzc, "!OnlySingleChain");
Pair storage selected_pair=book[direction.dstLzc][direction.dstAsset][direction.srcAsset];
require(orderIndex < selected_pair.orders.length, "!InvalidOrderIndex");
Order storage order = selected_pair.orders[orderIndex];
OrderFunding memory funding = order.funding;
OrderExpiration memory expiration = order.expiration;
address taker = order.sender;
address target = bytes32ToAddress(order.target);
uint96 srcQuantity = funding.srcQuantity;
uint96 dstQuantity = funding.dstQuantity;
uint96 blockNumber=uint96(block.number);
require(order.filler == msg.sender, "!ProhibitedFiller");
require(order.settled == 0, "!Settled");
require(expiration.timestamp >= block.timestamp, "!Expired");
require(srcQuantity > 0, "!ZeroMatch");
Match memory TakerMatch = Match({
index: orderIndex,
srcQuantity: srcQuantity,
dstQuantity: dstQuantity,
maker: addressToBytes32(msg.sender),
target: addressToBytes32(target),
bonder: address(0),
blockNumber: blockNumber,
finalized: true,
challenged: false
});
selected_pair.matches[orderIndex]=TakerMatch;
order.settled+=srcQuantity;
transferFrom(direction.srcAsset, taker, srcQuantity);
transferFrom(bytes32ToAddress(direction.dstAsset), msg.sender, dstQuantity);
transferTo(bytes32ToAddress(direction.dstAsset), target, dstQuantity);
transferTo(direction.srcAsset, msg.sender, srcQuantity);
emit SwapFilled(msg.sender, direction, orderIndex, srcQuantity, dstQuantity, taker, target, blockNumber);
}
function createMatch(
OrderDirection memory direction,
uint32 srcIndex,
bytes32 counterparty,
uint96 srcQuantity
) public nonReentrant {
require(direction.dstLzc != srcLzc, "!OnlyCrossChain");
Pair storage selected_pair=book[direction.dstLzc][direction.dstAsset][direction.srcAsset];
require(srcIndex < selected_pair.orders.length, "!InvalidOrderIndex");
Order storage order = selected_pair.orders[srcIndex];
OrderFunding memory funding = order.funding;
OrderExpiration memory expiration = order.expiration;
uint96 blockNumber=uint96(block.number);
if (order.filler != address(0)) {
require(order.filler == msg.sender, "!ProhibitedFiller");
}
require(order.settled == 0, "!Settled");
require(bytes32ToAddress(counterparty) != address(0), "!NullAddress");
require(funding.srcQuantity == srcQuantity, "!PartialFill");
require(expiration.timestamp >= block.timestamp, "!Expired");
Match memory TakerMatch = Match({
index: srcIndex,
srcQuantity: srcQuantity,
dstQuantity: funding.dstQuantity,
maker: counterparty,
target: order.target,
bonder: msg.sender,
blockNumber: blockNumber,
finalized: false,
challenged: false
});
selected_pair.matches[srcIndex]=TakerMatch;
order.settled=srcQuantity;
transferFrom(funding.bondAsset, msg.sender, funding.bondAmount);
transferFrom(direction.srcAsset, order.sender, srcQuantity);
emit MatchCreated(msg.sender, direction, srcIndex, srcQuantity, funding.dstQuantity, order.sender, counterparty, blockNumber);
}
function executeMatch(
OrderDirection memory direction,
uint32 takerIndex,
address target,
uint96 payoutQuantity,
bool isUnwrap
) public nonReentrant {
require(direction.dstLzc != srcLzc, "!OnlyCrossChain");
Pair storage selected_pair=book[direction.dstLzc][direction.dstAsset][direction.srcAsset];
require(payoutQuantity > 0, "Zero valued match");
require(target != address(0), "!zeroAddress");
transferFrom(direction.srcAsset, msg.sender, payoutQuantity);
if (isUnwrap) {
IWrapped wrappedToken = IWrapped(direction.srcAsset);
wrappedToken.withdraw(payoutQuantity);
(bool sent,) = target.call{value: payoutQuantity}("");
require(sent, "!WrappedTokenTransfer");
}
else {
transferTo(direction.srcAsset, target, payoutQuantity);
}
selected_pair.receipts[takerIndex][addressToBytes32(target)] += payoutQuantity;
emit MatchExecuted(msg.sender, direction, takerIndex, payoutQuantity, target);
}
function confirmMatch(
OrderDirection memory direction,
uint32 srcIndex
) public {
Pair storage selected_pair=book[direction.dstLzc][direction.dstAsset][direction.srcAsset];
Order storage _order= selected_pair.orders[srcIndex];
Match storage _match=selected_pair.matches[srcIndex];
OrderFunding memory funding = _order.funding;
OrderExpiration memory expiration = _order.expiration;
address bonder = _match.bonder;
address maker = bytes32ToAddress(_match.maker);
uint validBlock = _match.blockNumber + expiration.challengeOffset + expiration.challengeWindow;
require(!_match.finalized && !_match.challenged, "!Match is closed");
require(msg.sender==bonder || msg.sender==maker, "!OnlyMakerOrBonder");
require(block.number > validBlock, "Must wait before confirming match");
uint order_amount = funding.srcQuantity;
uint16 fee =funding.bondFee;
uint maker_payout=applyFee(order_amount, fee);
uint bonder_fee_payout=bondFee(order_amount, fee);
_match.finalized=true;
transferTo(direction.srcAsset, maker, maker_payout);
transferTo(direction.srcAsset, bonder, bonder_fee_payout);
transferTo(funding.bondAsset, bonder, funding.bondAmount);
emit MatchConfirmed(bonder, direction, srcIndex, fee);
}
function cancelOrder(
OrderDirection memory direction,
uint32 orderIndex
) public nonReentrant{
Order storage order= book[direction.dstLzc][direction.dstAsset][direction.srcAsset].orders[orderIndex];
address sender=order.sender;
require(msg.sender==sender, "!onlySender");
require(order.settled < order.funding.srcQuantity, "!alreadyMatched");
order.funding.srcQuantity = 0;
order.funding.dstQuantity = 0;
emit OrderCancelled(sender, direction, orderIndex);
}
function unwindMatch(
OrderDirection memory direction,
uint32 srcIndex,
bool isUnwrap
) public nonReentrant{
Pair storage selected_pair=book[direction.dstLzc][direction.dstAsset][direction.srcAsset];
Order storage _order= selected_pair.orders[srcIndex];
Match storage _match=selected_pair.matches[srcIndex];
require(msg.sender == bytes32ToAddress(_match.maker), "!onlyMaker");
require(!_match.finalized && !_match.challenged, "!Match is closed");
_match.finalized = true;
if (isUnwrap) {
IWrapped wrappedToken = IWrapped(direction.srcAsset);
wrappedToken.withdraw(_order.funding.srcQuantity);
(bool sent,) = _order.sender.call{value: _order.funding.srcQuantity}("");
require(sent, "!WrappedTokenTransfer");
}
else {
transferTo(direction.srcAsset, _order.sender, _order.funding.srcQuantity);
}
transferTo(_order.funding.bondAsset, _match.bonder, _order.funding.bondAmount);
_order.funding.srcQuantity = 0;
emit MatchUnwound(_match.bonder, direction, srcIndex);
}
event MessageSent(bytes message, uint32 dstEid);
event ReturnMessageSent(string message, uint32 dstEid);
event MessageReceived(string message, uint32 senderEid, bytes32 sender);
function decodeMessage(bytes calldata encodedMessage) public pure returns (Payload memory message, uint16 msgType, uint256 extraOptionsStart, uint256 extraOptionsLength) {
extraOptionsStart = 256;
Payload memory _message;
uint16 _msgType;
(_message, _msgType, extraOptionsLength) = abi.decode(encodedMessage, (Payload, uint16, uint256));
return (_message, _msgType, extraOptionsStart, extraOptionsLength);
}
function challengeMatch(
OrderDirection memory direction,
uint32 srcIndex,
bytes calldata _extraSendOptions,
bytes calldata _extraReturnOptions
) external payable {
Pair storage selected_pair=book[direction.dstLzc][direction.dstAsset][direction.srcAsset];
Order storage _order= selected_pair.orders[srcIndex];
Match storage _match=selected_pair.matches[srcIndex];
require(!_match.finalized && !_match.challenged, "!MatchClosed");
if (msg.sender != _match.bonder) {
require(block.number > (_match.blockNumber+_order.expiration.challengeOffset), "!challengeOffse");
}
uint16 _msgType = 2;
uint32 _dstEid = direction.dstLzc;
uint256 extraOptionsLength = _extraReturnOptions.length;
bytes memory options = combineOptions(_dstEid, _msgType, _extraSendOptions);
Payload memory newPayload = Payload({
challenger: msg.sender,
srcToken: direction.srcAsset,
dstToken: direction.dstAsset,
srcIndex: srcIndex,
target: _match.target,
counterparty: _match.maker,
minAmount: _order.funding.dstQuantity,
status: 0
});
bytes memory lzPacket=abi.encode(newPayload, _msgType, extraOptionsLength, _extraReturnOptions, extraOptionsLength);
_lzSend(
_dstEid,
lzPacket,
options,
MessagingFee(msg.value, 0),
payable(msg.sender)
);
_match.challenged=true;
emit MessageSent(lzPacket, _dstEid);
}
function _lzReceive(
Origin calldata _origin,
bytes32 _guid,
bytes calldata _packet,
address,
bytes calldata
) internal override {
(Payload memory _payload, uint16 _msgType, uint256 extraOptionsStart, uint256 extraOptionsLength) = decodeMessage(_packet);
uint32 makerEid=_origin.srcEid;
if (_msgType == 2) {
Pair storage selected_pair=book[makerEid][addressToBytes32(_payload.srcToken)][bytes32ToAddress(_payload.dstToken)];
uint _receipt=selected_pair.receipts[_payload.srcIndex][_payload.target];
if ((_receipt >= _payload.minAmount)) {
_payload.status=2;
}
else {
_payload.status=1;
}
bytes memory _options = combineOptions(makerEid, 1, _packet[extraOptionsStart:extraOptionsStart + extraOptionsLength]);
_lzSend(
makerEid,
abi.encode(_payload, 1),
_options,
MessagingFee(msg.value, 0),
payable(address(this))
);
}
else {
Pair storage selected_pair=book[srcLzc][_payload.dstToken][_payload.srcToken];
Order storage _order= selected_pair.orders[_payload.srcIndex];
Match storage _match=selected_pair.matches[_payload.srcIndex];
address bonder =_match.bonder;
if (_payload.status==1) {
transferTo(_payload.srcToken, _order.sender, _order.funding.srcQuantity);
transferTo(_order.funding.bondAsset, _payload.challenger, (_order.funding.bondAmount*9)/10);
transferTo(_order.funding.bondAsset, owner(), (_order.funding.bondAmount)/10);
emit ChallengeResult(true);
}
else {
transferTo(_payload.srcToken, bytes32ToAddress(_match.maker), applyFee(_order.funding.srcQuantity, _order.funding.bondFee));
transferTo(_payload.srcToken, bonder, bondFee(_order.funding.srcQuantity, _order.funding.bondFee));
transferTo(_order.funding.bondAsset, bonder, _order.funding.bondAmount);
emit ChallengeResult(false);
}
_match.finalized=true;
}
}
function transferFrom(address tkn, address from, uint amount) internal {
SafeERC20.safeTransferFrom(IERC20(tkn), from, address(this), amount);
}
function transferTo(address tkn, address to, uint amount) internal {
SafeERC20.safeTransfer(IERC20(tkn), to, amount);
}
function bondFee(uint number, uint _fee) public pure returns (uint) {
return (_fee*number)/BASIS_POINTS;
}
function applyFee(uint number, uint _fee) public pure returns (uint) {
return number-((_fee*number)/BASIS_POINTS);
}
function bytes32ToAddress(bytes32 _bytes) internal pure returns (address addr) {
require(_bytes != bytes32(0), "Invalid address");
addr = address(uint160(uint256(_bytes)));
}
function addressToBytes32(address _addr) internal pure returns (bytes32) {
return bytes32(uint256(uint160(_addr)));
}
receive() external payable {}
}
文件 20 的 27:OApp.sol
pragma solidity ^0.8.20;
import { OAppSender, MessagingFee, MessagingReceipt } from "./OAppSender.sol";
import { OAppReceiver, Origin } from "./OAppReceiver.sol";
import { OAppCore } from "./OAppCore.sol";
abstract contract OApp is OAppSender, OAppReceiver {
constructor(address _endpoint, address _delegate) OAppCore(_endpoint, _delegate) {}
function oAppVersion()
public
pure
virtual
override(OAppSender, OAppReceiver)
returns (uint64 senderVersion, uint64 receiverVersion)
{
return (SENDER_VERSION, RECEIVER_VERSION);
}
}
文件 21 的 27:OAppCore.sol
pragma solidity ^0.8.20;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { IOAppCore, ILayerZeroEndpointV2 } from "./interfaces/IOAppCore.sol";
abstract contract OAppCore is IOAppCore, Ownable {
ILayerZeroEndpointV2 public immutable endpoint;
mapping(uint32 eid => bytes32 peer) public peers;
constructor(address _endpoint, address _delegate) {
endpoint = ILayerZeroEndpointV2(_endpoint);
if (_delegate == address(0)) revert InvalidDelegate();
endpoint.setDelegate(_delegate);
}
function setPeer(uint32 _eid, bytes32 _peer) public virtual onlyOwner {
_setPeer(_eid, _peer);
}
function _setPeer(uint32 _eid, bytes32 _peer) internal virtual {
peers[_eid] = _peer;
emit PeerSet(_eid, _peer);
}
function _getPeerOrRevert(uint32 _eid) internal view virtual returns (bytes32) {
bytes32 peer = peers[_eid];
if (peer == bytes32(0)) revert NoPeer(_eid);
return peer;
}
function setDelegate(address _delegate) public onlyOwner {
endpoint.setDelegate(_delegate);
}
}
文件 22 的 27:OAppOptionsType3.sol
pragma solidity ^0.8.20;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { IOAppOptionsType3, EnforcedOptionParam } from "../interfaces/IOAppOptionsType3.sol";
abstract contract OAppOptionsType3 is IOAppOptionsType3, Ownable {
uint16 internal constant OPTION_TYPE_3 = 3;
mapping(uint32 eid => mapping(uint16 msgType => bytes enforcedOption)) public enforcedOptions;
function setEnforcedOptions(EnforcedOptionParam[] calldata _enforcedOptions) public virtual onlyOwner {
_setEnforcedOptions(_enforcedOptions);
}
function _setEnforcedOptions(EnforcedOptionParam[] memory _enforcedOptions) internal virtual {
for (uint256 i = 0; i < _enforcedOptions.length; i++) {
_assertOptionsType3(_enforcedOptions[i].options);
enforcedOptions[_enforcedOptions[i].eid][_enforcedOptions[i].msgType] = _enforcedOptions[i].options;
}
emit EnforcedOptionSet(_enforcedOptions);
}
function combineOptions(
uint32 _eid,
uint16 _msgType,
bytes calldata _extraOptions
) public view virtual returns (bytes memory) {
bytes memory enforced = enforcedOptions[_eid][_msgType];
if (enforced.length == 0) return _extraOptions;
if (_extraOptions.length == 0) return enforced;
if (_extraOptions.length >= 2) {
_assertOptionsType3(_extraOptions);
return bytes.concat(enforced, _extraOptions[2:]);
}
revert InvalidOptions(_extraOptions);
}
function _assertOptionsType3(bytes memory _options) internal pure virtual {
uint16 optionsType;
assembly {
optionsType := mload(add(_options, 2))
}
if (optionsType != OPTION_TYPE_3) revert InvalidOptions(_options);
}
}
文件 23 的 27:OAppReceiver.sol
pragma solidity ^0.8.20;
import { IOAppReceiver, Origin } from "./interfaces/IOAppReceiver.sol";
import { OAppCore } from "./OAppCore.sol";
abstract contract OAppReceiver is IOAppReceiver, OAppCore {
error OnlyEndpoint(address addr);
uint64 internal constant RECEIVER_VERSION = 2;
function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {
return (0, RECEIVER_VERSION);
}
function isComposeMsgSender(
Origin calldata ,
bytes calldata ,
address _sender
) public view virtual returns (bool) {
return _sender == address(this);
}
function allowInitializePath(Origin calldata origin) public view virtual returns (bool) {
return peers[origin.srcEid] == origin.sender;
}
function nextNonce(uint32 , bytes32 ) public view virtual returns (uint64 nonce) {
return 0;
}
function lzReceive(
Origin calldata _origin,
bytes32 _guid,
bytes calldata _message,
address _executor,
bytes calldata _extraData
) public payable virtual {
if (address(endpoint) != msg.sender) revert OnlyEndpoint(msg.sender);
if (_getPeerOrRevert(_origin.srcEid) != _origin.sender) revert OnlyPeer(_origin.srcEid, _origin.sender);
_lzReceive(_origin, _guid, _message, _executor, _extraData);
}
function _lzReceive(
Origin calldata _origin,
bytes32 _guid,
bytes calldata _message,
address _executor,
bytes calldata _extraData
) internal virtual;
}
文件 24 的 27:OAppSender.sol
pragma solidity ^0.8.20;
import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { MessagingParams, MessagingFee, MessagingReceipt } from "../../../lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
import { OAppCore } from "./OAppCore.sol";
abstract contract OAppSender is OAppCore {
using SafeERC20 for IERC20;
error NotEnoughNative(uint256 msgValue);
error LzTokenUnavailable();
uint64 internal constant SENDER_VERSION = 1;
function oAppVersion() public view virtual returns (uint64 senderVersion, uint64 receiverVersion) {
return (SENDER_VERSION, 0);
}
function _quote(
uint32 _dstEid,
bytes memory _message,
bytes memory _options,
bool _payInLzToken
) internal view virtual returns (MessagingFee memory fee) {
return
endpoint.quote(
MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _payInLzToken),
address(this)
);
}
function _lzSend(
uint32 _dstEid,
bytes memory _message,
bytes memory _options,
MessagingFee memory _fee,
address _refundAddress
) internal virtual returns (MessagingReceipt memory receipt) {
uint256 messageValue = _payNative(_fee.nativeFee);
if (_fee.lzTokenFee > 0) _payLzToken(_fee.lzTokenFee);
return
endpoint.send{ value: messageValue }(
MessagingParams(_dstEid, _getPeerOrRevert(_dstEid), _message, _options, _fee.lzTokenFee > 0),
_refundAddress
);
}
function _payNative(uint256 _nativeFee) internal virtual returns (uint256 nativeFee) {
if (msg.value != _nativeFee) revert NotEnoughNative(msg.value);
return _nativeFee;
}
function _payLzToken(uint256 _lzTokenFee) internal virtual {
address lzToken = endpoint.lzToken();
if (lzToken == address(0)) revert LzTokenUnavailable();
IERC20(lzToken).safeTransferFrom(msg.sender, address(endpoint), _lzTokenFee);
}
}
文件 25 的 27:Ownable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 26 的 27:ReentrancyGuard.sol
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
文件 27 的 27:SafeERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
import {Address} from "../../../utils/Address.sol";
library SafeERC20 {
error SafeERC20FailedOperation(address token);
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}
{
"compilationTarget": {
"contracts/Main.sol": "Orderbook"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/=node_modules/@openzeppelin/",
":hardhat-deploy/=node_modules/hardhat-deploy/",
":hardhat/=node_modules/hardhat/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/"
]
}
[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint32","name":"_lzEid","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[{"internalType":"bytes","name":"options","type":"bytes"}],"name":"InvalidOptions","type":"error"},{"inputs":[],"name":"LzTokenUnavailable","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"NoPeer","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"NotEnoughNative","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"OnlyEndpoint","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"OnlyPeer","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"challenger","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"srcIndex","type":"uint32"},{"indexed":false,"internalType":"address","name":"bonder","type":"address"},{"indexed":false,"internalType":"uint32","name":"dstIndex","type":"uint32"}],"name":"ChallengeRaised","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"challenge_status","type":"bool"}],"name":"ChallengeResult","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"indexed":false,"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"EnforcedOptionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bonder","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"orderIndex","type":"uint32"},{"indexed":false,"internalType":"uint16","name":"bondFee","type":"uint16"}],"name":"MatchConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bonder","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"orderIndex","type":"uint32"},{"indexed":false,"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"indexed":false,"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"indexed":false,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"bytes32","name":"maker","type":"bytes32"},{"indexed":false,"internalType":"uint96","name":"blockNumber","type":"uint96"}],"name":"MatchCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"takerIndex","type":"uint32"},{"indexed":false,"internalType":"uint96","name":"takerQuantity","type":"uint96"},{"indexed":false,"internalType":"address","name":"target","type":"address"}],"name":"MatchExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bonder","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"orderIndex","type":"uint32"}],"name":"MatchUnwound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint32","name":"senderEid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"orderIndex","type":"uint32"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"orderIndex","type":"uint32"},{"components":[{"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"internalType":"uint16","name":"bondFee","type":"uint16"},{"internalType":"address","name":"bondAsset","type":"address"},{"internalType":"uint96","name":"bondAmount","type":"uint96"}],"indexed":false,"internalType":"struct TradeInterface.OrderFunding","name":"funding","type":"tuple"},{"components":[{"internalType":"uint32","name":"timestamp","type":"uint32"},{"internalType":"uint16","name":"challengeOffset","type":"uint16"},{"internalType":"uint16","name":"challengeWindow","type":"uint16"}],"indexed":false,"internalType":"struct TradeInterface.OrderExpiration","name":"expiration","type":"tuple"},{"indexed":false,"internalType":"bytes32","name":"target","type":"bytes32"},{"indexed":false,"internalType":"address","name":"filler","type":"address"}],"name":"OrderPlaced","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":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"peer","type":"bytes32"}],"name":"PeerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"}],"name":"ReturnMessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"indexed":false,"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"indexed":false,"internalType":"uint32","name":"orderIndex","type":"uint32"},{"indexed":false,"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"indexed":false,"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"indexed":false,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint96","name":"blockNumber","type":"uint96"}],"name":"SwapFilled","type":"event"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"applyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"bondFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"book","outputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint16","name":"lzc","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"orderIndex","type":"uint32"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"srcIndex","type":"uint32"},{"internalType":"bytes","name":"_extraSendOptions","type":"bytes"},{"internalType":"bytes","name":"_extraReturnOptions","type":"bytes"}],"name":"challengeMatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint16","name":"_msgType","type":"uint16"},{"internalType":"bytes","name":"_extraOptions","type":"bytes"}],"name":"combineOptions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"srcIndex","type":"uint32"}],"name":"confirmMatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"srcIndex","type":"uint32"},{"internalType":"bytes32","name":"counterparty","type":"bytes32"},{"internalType":"uint96","name":"srcQuantity","type":"uint96"}],"name":"createMatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedMessage","type":"bytes"}],"name":"decodeMessage","outputs":[{"components":[{"internalType":"address","name":"challenger","type":"address"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"bytes32","name":"dstToken","type":"bytes32"},{"internalType":"uint32","name":"srcIndex","type":"uint32"},{"internalType":"bytes32","name":"counterparty","type":"bytes32"},{"internalType":"bytes32","name":"target","type":"bytes32"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"}],"internalType":"struct TradeInterface.Payload","name":"message","type":"tuple"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"uint256","name":"extraOptionsStart","type":"uint256"},{"internalType":"uint256","name":"extraOptionsLength","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"}],"name":"enforcedOptions","outputs":[{"internalType":"bytes","name":"enforcedOption","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"takerIndex","type":"uint32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint96","name":"payoutQuantity","type":"uint96"},{"internalType":"bool","name":"isUnwrap","type":"bool"}],"name":"executeMatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"orderIndex","type":"uint32"}],"name":"fillSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint256","name":"dstLzc","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMatch","outputs":[{"components":[{"internalType":"uint32","name":"index","type":"uint32"},{"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"internalType":"bytes32","name":"maker","type":"bytes32"},{"internalType":"bytes32","name":"target","type":"bytes32"},{"internalType":"address","name":"bonder","type":"address"},{"internalType":"uint96","name":"blockNumber","type":"uint96"},{"internalType":"bool","name":"finalized","type":"bool"},{"internalType":"bool","name":"challenged","type":"bool"}],"internalType":"struct TradeInterface.Match","name":"_match","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint256","name":"dstLzc","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getOrder","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"internalType":"uint16","name":"bondFee","type":"uint16"},{"internalType":"address","name":"bondAsset","type":"address"},{"internalType":"uint96","name":"bondAmount","type":"uint96"}],"internalType":"struct TradeInterface.OrderFunding","name":"funding","type":"tuple"},{"components":[{"internalType":"uint32","name":"timestamp","type":"uint32"},{"internalType":"uint16","name":"challengeOffset","type":"uint16"},{"internalType":"uint16","name":"challengeWindow","type":"uint16"}],"internalType":"struct TradeInterface.OrderExpiration","name":"expiration","type":"tuple"},{"internalType":"uint96","name":"settled","type":"uint96"},{"internalType":"bytes32","name":"target","type":"bytes32"},{"internalType":"address","name":"filler","type":"address"}],"internalType":"struct TradeInterface.Order","name":"_order","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint256","name":"dstLzc","type":"uint256"}],"name":"getOrders","outputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"components":[{"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"internalType":"uint16","name":"bondFee","type":"uint16"},{"internalType":"address","name":"bondAsset","type":"address"},{"internalType":"uint96","name":"bondAmount","type":"uint96"}],"internalType":"struct TradeInterface.OrderFunding","name":"funding","type":"tuple"},{"components":[{"internalType":"uint32","name":"timestamp","type":"uint32"},{"internalType":"uint16","name":"challengeOffset","type":"uint16"},{"internalType":"uint16","name":"challengeWindow","type":"uint16"}],"internalType":"struct TradeInterface.OrderExpiration","name":"expiration","type":"tuple"},{"internalType":"uint96","name":"settled","type":"uint96"},{"internalType":"bytes32","name":"target","type":"bytes32"},{"internalType":"address","name":"filler","type":"address"}],"internalType":"struct TradeInterface.Order[]","name":"orders","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint256","name":"dstLzc","type":"uint256"},{"internalType":"uint256","name":"srcIndex","type":"uint256"},{"internalType":"bytes32","name":"target","type":"bytes32"}],"name":"getReceipt","outputs":[{"internalType":"uint256","name":"_receipt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"}],"name":"isComposeMsgSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAppVersion","outputs":[{"internalType":"uint64","name":"senderVersion","type":"uint64"},{"internalType":"uint64","name":"receiverVersion","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"peers","outputs":[{"internalType":"bytes32","name":"peer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"components":[{"internalType":"uint96","name":"srcQuantity","type":"uint96"},{"internalType":"uint96","name":"dstQuantity","type":"uint96"},{"internalType":"uint16","name":"bondFee","type":"uint16"},{"internalType":"address","name":"bondAsset","type":"address"},{"internalType":"uint96","name":"bondAmount","type":"uint96"}],"internalType":"struct TradeInterface.OrderFunding","name":"funding","type":"tuple"},{"components":[{"internalType":"uint32","name":"timestamp","type":"uint32"},{"internalType":"uint16","name":"challengeOffset","type":"uint16"},{"internalType":"uint16","name":"challengeWindow","type":"uint16"}],"internalType":"struct TradeInterface.OrderExpiration","name":"expiration","type":"tuple"},{"internalType":"bytes32","name":"target","type":"bytes32"},{"internalType":"address","name":"filler","type":"address"}],"name":"placeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"setEnforcedOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newMaxFee","type":"uint16"}],"name":"setMaxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"setPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"srcLzc","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAsset","type":"address"},{"internalType":"bytes32","name":"dstAsset","type":"bytes32"},{"internalType":"uint32","name":"dstLzc","type":"uint32"}],"internalType":"struct TradeInterface.OrderDirection","name":"direction","type":"tuple"},{"internalType":"uint32","name":"srcIndex","type":"uint32"},{"internalType":"bool","name":"isUnwrap","type":"bool"}],"name":"unwindMatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]