与不同类型合约的交互#
订单种类主要由欧易聚合器合约和欧易自营市场合约构成。
欧易聚合器合约#
欧易聚合器的 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_ETH 2 : _SEAPORT_BUY_ERC20 3 : _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
是交易量计数