Marketplace API
与不同类型合约的交互

与不同类型合约的交互#

订单种类主要由欧易聚合器合约和欧易自营市场合约构成。

欧易聚合器合约#

欧易聚合器的 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操作类型,目前仅支持 Seaport1: _SEAPORT_BUY_ETH2: _SEAPORT_BUY_ERC203: _SEAPORT_ACCEPT
payAmount用于订单支付的 ERC20 Token数量
payToken用于订单支付的 ERC20 Token address
tokenAddressERC721/ERC1155 的 Token address
tokenIdtokenId
amounttoken 数量
tradeType0: 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 等待买家购买,挂单时生成订单并进行签名,参考使用 Marketplace API 内容章节。

2. 执行订单#

支持 fulfillBasicOrderfulfillAdvancedOrder 两种接口。

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)

其中,参数 fulfillerConduitKeyCriteriaResolverAdvancedOrder 的具体解析如下:

  • 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;
    }
    

    ConsiderationItemOfferItem 里面所包含的各个项目基本相同,ConsiderationItem 增加了 recipient 字段,用于指出能从订单执行中获得 token 的地址

3. 下架#

支持批量撤单,仅有 offererzone 可进行撤单操作

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;
}

OrderComponentsOrderParameters 的参数基本相同,counter 是交易量计数