与不同类型合约的交互#
订单种类主要由欧易聚合器合约和欧易自营市场合约构成。
欧易聚合器合约#
欧易聚合器的 API 是 trade,该接口封装了调用其他市场合约所需要的 calldata 数据。
function tradeV3(
    MarketRegistry.TradeDetails[] calldata tradeDetails,
    AggregatorParamV3[] calldata aggregatorParam,
    bool isAtomic
) external payable nonReentrant
MarketRegistry
MarketRegistry 是注册合约,聚合器支持的所有其他市场合约都需在此合约中注册。
struct TradeDetails {
  uint256 marketId;
  uint256 value;
  bytes32 orderHash;
  bytes tradeData;
}
| 参数名称 | 描述 | 
|---|---|
| marketId | 市场自定义id | 
| value | 支付原生币的数量,例如ETH | 
| orderHash | 订单的哈希值 | 
| tradeData | 在其他市场实际执行交易的calldata数据,参考使用 Marketplace API 章节。 | 
AggregatorParamV3
struct AggregatorParamV3 {
    uint256 actionType;
    uint256 payAmount;
    address payToken;
    address tokenAddress;
    uint256 tokenId;
    uint256 amount;
    uint256 tradeType;
    bytes extraData;
}
| 参数名称 | 描述 | 
|---|---|
| actionType | 操作类型,目前仅支持 Seaport 1:_SEAPORT_BUY_ETH2:_SEAPORT_BUY_ERC203: _SEAPORT_ACCEPT | 
| payAmount | 用于订单支付的 ERC20 Token数量 | 
| payToken | 用于订单支付的 ERC20 Token address | 
| tokenAddress | ERC721/ERC1155 的 Token address | 
| tokenId | tokenId | 
| amount | token 数量 | 
| tradeType | 0:NATIVE,  // ETH on mainnet, MATIC on polygon1:ERC721,2:ERC1155,3:ERC721_WITH_CRITERIA,4:ERC1155_WITH_CRITERIA,5:ERC20 | 
| extraData | 扩展数据: address、address、address(订单的maker、订单的taker、统一授权地址) | 
isAtomic
isAtomic 设置为 true 是指在批量执行订单时有任何订单执行失败将会触发 revert,设置为 false 则不触发 revert
欧易自营市场合约#
1. 一口价挂单#
一口价挂单是指挂出 NFT 等待买家购买,挂单时生成订单并进行签名,参考创建挂单部分 章节。
2. 执行订单#
支持 fulfillBasicOrder 和 fulfillAdvancedOrder 两种接口。
2.1 fulfillBasicOrder
function fulfillBasicOrder(BasicOrderParameters calldata parameters)
    external
    payable
    override
    returns (bool fulfilled);
fulfillBasicOrder 接口的参数如下:
struct BasicOrderParameters {
    address considerationToken; 
    uint256 considerationIdentifier; 
    uint256 considerationAmount; 
    address payable offerer; 
    address zone; 
    address offerToken; 
    uint256 offerIdentifier; 
    uint256 offerAmount; 
    BasicOrderType basicOrderType; 
    uint256 startTime; 
    uint256 endTime; 
    bytes32 zoneHash; 
    uint256 salt; 
    bytes32 offererConduitKey; 
    bytes32 fulfillerConduitKey; 
    uint256 totalOriginalAdditionalRecipients; 
    AdditionalRecipient[] additionalRecipients; 
    bytes signature; 
}
considerationToken:竞价盘 token 所对应的标的物地址
considerationIdentifier:竞价盘 token 所对应的 id
considerationAmount:竞价盘 token 所对应的数量
offerer:该报价者的账户地址
zone:订单所对应的 zone
offerToken:该报价 token 所对应的地址
offerIdentifier:该报价 token 所对应的 id
offerAmount:该报价 token 所对应的数量
basicOrderType:订单类型
startTime:订单生效时间
endTime:订单失效时间
zoneHash:传递给 zone 的哈希值
salt:订单随机熵源
offererConduitKey:订单报价者的 ConduitKey
fulfillerConduitKey:订单执行者的 ConduitKey
totalOriginalAdditionalRecipients:竞价盘 token 接收者所对应的接收地址数量
additionalRecipients:额外 token 的接收方
signature:交易执行者的签名
enum BasicOrderType {
    // 0: no partial fills, anyone can execute
    ETH_TO_ERC721_FULL_OPEN,
    // 1: partial fills supported, anyone can execute
    ETH_TO_ERC721_PARTIAL_OPEN,
    // 2: no partial fills, only offerer or zone can execute
    ETH_TO_ERC721_FULL_RESTRICTED,
    // 3: partial fills supported, only offerer or zone can execute
    ETH_TO_ERC721_PARTIAL_RESTRICTED,
    // 4: no partial fills, anyone can execute
    ETH_TO_ERC1155_FULL_OPEN,
    // 5: partial fills supported, anyone can execute
    ETH_TO_ERC1155_PARTIAL_OPEN,
    // 6: no partial fills, only offerer or zone can execute
    ETH_TO_ERC1155_FULL_RESTRICTED,
    // 7: partial fills supported, only offerer or zone can execute
    ETH_TO_ERC1155_PARTIAL_RESTRICTED,
    // 8: no partial fills, anyone can execute
    ERC20_TO_ERC721_FULL_OPEN,
    // 9: partial fills supported, anyone can execute
    ERC20_TO_ERC721_PARTIAL_OPEN,
    // 10: no partial fills, only offerer or zone can execute
    ERC20_TO_ERC721_FULL_RESTRICTED,
    // 11: partial fills supported, only offerer or zone can execute
    ERC20_TO_ERC721_PARTIAL_RESTRICTED,
    // 12: no partial fills, anyone can execute
    ERC20_TO_ERC1155_FULL_OPEN,
    // 13: partial fills supported, anyone can execute
    ERC20_TO_ERC1155_PARTIAL_OPEN,
    // 14: no partial fills, only offerer or zone can execute
    ERC20_TO_ERC1155_FULL_RESTRICTED,
    // 15: partial fills supported, only offerer or zone can execute
    ERC20_TO_ERC1155_PARTIAL_RESTRICTED,
    // 16: no partial fills, anyone can execute
    ERC721_TO_ERC20_FULL_OPEN,
    // 17: partial fills supported, anyone can execute
    ERC721_TO_ERC20_PARTIAL_OPEN,
    // 18: no partial fills, only offerer or zone can execute
    ERC721_TO_ERC20_FULL_RESTRICTED,
    // 19: partial fills supported, only offerer or zone can execute
    ERC721_TO_ERC20_PARTIAL_RESTRICTED,
    // 20: no partial fills, anyone can execute
    ERC1155_TO_ERC20_FULL_OPEN,
    // 21: partial fills supported, anyone can execute
    ERC1155_TO_ERC20_PARTIAL_OPEN,
    // 22: no partial fills, only offerer or zone can execute
    ERC1155_TO_ERC20_FULL_RESTRICTED,
    // 23: partial fills supported, only offerer or zone can execute
    ERC1155_TO_ERC20_PARTIAL_RESTRICTED
}
2.2 fulfillAdvancedOrder
function fulfillAdvancedOrder(
        AdvancedOrder calldata advancedOrder,
        CriteriaResolver[] calldata criteriaResolvers,
        bytes32 fulfillerConduitKey
        address recipient
) external payable override returns (bool fulfilled)
其中,参数 fulfillerConduitKey、CriteriaResolver 和 AdvancedOrder 的具体解析如下:
- 
fulfillerConduitKey:吃单者的 ConduitKey 
- 
recipient:指定 token 的接收者地址,如未设置默认为 msg.sender 
- 
CriteriaResolver:用于验证 merkle 路径等参数是否满足限制条件的条件解析器 struct CriteriaResolver { uint256 orderIndex; Side side; uint256 index; uint256 identifier; bytes32[] criteriaProof; }orderIndex:明确多个订单中的具体某一订单
 side:指报价者或其对手盘
 index:订单 OfferItem 或 ConsiderationItem 中的索引值
 identifier:订单交易所对应的 Token id
 criteriaProof:默克尔证明
- 
Advanced Order:订单参数 struct AdvancedOrder { OrderParameters parameters; uint120 numerator; uint120 denominator; bytes signature; bytes extraData; }numerator:订单部分成交中的分子
 denominator:订单部分成交中的分母
 signature:订单签名
 parameters:订单参数,具体如下struct OrderParameters { address offerer; address zone; OfferItem[] offer; ConsiderationItem[] consideration; OrderType orderType; uint256 startTime; uint256 endTime; bytes32 zoneHash; uint256 salt; bytes32 conduitKey; uint256 totalOriginalConsiderationItems; }offerer:挂单者
 offer:该报价订单标的资产组合
 Consideration:该报价单对手盘标的资产组合
 zone:能够撤单以及可限制任意一方吃受限订单的账户地址
 orderType:订单类型,支持开放、受限、全部成交、部分成交的两两组合,开放订单任何操作者均可执行,受限订单是只有 offerer 或订单的 zone 方可执行
 startTime:订单生效时间
 endTime:订单过期时间
 zoneHash:用于验证受限订单的哈希值,zone 可以决定是否使用该哈希值
 salt:订单随机熵源
 conduitKey:是一个 byte32 类型的值,conduitKey 所对应的 conduit 是一个合约,该合约可代表订单报价者执行代币转移
 totalOriginalConsiderationItems:报价单对手盘标的资产的数量,这个参数是必须定义的,因为调用者可能会增加额外标的资产
- 
OfferItem struct OfferItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; }token:该被报价的 token 所对应的地址
 identifierOrCriteria:该数值可能是 0,单个 token id 的值或多个 token ids 的 merkle root
 startAmount:初始数量
 endAmount:结束数量,价格固定的订单 startAmount 和 endAmount 是相等的,但在拍卖时 endAmount 则随着时间的推移大于或小于 startAmount订单类型用 ItemType 表示 enum ItemType { // 0: ETH on mainnet, MATIC on polygon, etc. NATIVE, // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work) ERC20, // 2: ERC721 items ERC721, // 3: ERC1155 items ERC1155, // 4: ERC721 items where a number of tokenIds are supported ERC721_WITH_CRITERIA, // 5: ERC1155 items where a number of ids are supported ERC1155_WITH_CRITERIA }NATIVE:主链上的 token
 ERC721_WITH_CRITERIA:符合 ERC-721 标准铸造的多个 NFT,可与 identifierOrCriteria 配合使用
 ERC1155_WITH_CRITERIA:符合 ERC-1155 标准铸造的多个 NFT,可与 identifierOrCriteria 配合使用struct ConsiderationItem { ItemType itemType; address token; uint256 identifierOrCriteria; uint256 startAmount; uint256 endAmount; address payable recipient; }ConsiderationItem和OfferItem里面所包含的各个项目基本相同,ConsiderationItem 增加了 recipient 字段,用于指出能从订单执行中获得 token 的地址
3. 下架#
支持批量撤单,仅有 offerer 和 zone 可进行撤单操作
function cancel(OrderComponents[] calldata orders)
    external
    override
    returns (bool cancelled);
OrderComponents 的数据结构:
struct OrderComponents {
    address offerer;
    address zone;
    OfferItem[] offer;
    ConsiderationItem[] consideration;
    OrderType orderType;
    uint256 startTime;
    uint256 endTime;
    bytes32 zoneHash;
    uint256 salt;
    bytes32 conduitKey;
    uint256 counter;
}
OrderComponents 与 OrderParameters 的参数基本相同,counter 是交易量计数
