Order types
Element NFT market is built on off-chain order book and on-chain matching system. off-chain order with EIP-712 signatures are called Maker Orders. The paramters against a maker order are called Taker Param.
A maker order is stored at off-chain order book (a special order service for query and storage orders), maker order is passive, it can only be executed by a taker(EOA or smart contract) to execute transaction on chain, so the gas fees are paid by taker.
Maker Order
ERC721 SellOrder
A sell order means that the maker wants to sell the NFT. "Listing" action will make a sell order.
struct NFTSellOrder {
address maker;
address taker;
uint256 expiry;
uint256 nonce;
IERC20 erc20Token;
uint256 erc20TokenAmount;
Fee[] fees;
address nft;
uint256 nftId;
}
struct Fee {
address recipient;
uint256 amount;
bytes feeData;
}
struct Signature {
SignatureType signatureType;
uint8 v;
bytes32 r;
bytes32 s;
}
Params descriptions:
maker - the address of the signer of this maker order
taker - the address of the taker who can take this order if specified, or keep null
expiry - the time when this order expired (second)
nonce - the unique id of this order, use a auto increment id will save gas
erc20Token - the payment token address, 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE represent native token
erc20TokenAmount - the amount of the payment token
fees - the fees of this order
nft - the collection address of the NFT
nftId - the tokenId of this collection address
signatureType - 0 EIP721, 1 PRESIGNED
v、r、s - Ethereum uses ECDSA signatures.
ERC721 BuyOrder
A buy order means that the maker wants to buy an NFT. "Make Offer" action will make a buy order.
struct NFTBuyOrder {
address maker;
address taker;
uint256 expiry;
uint256 nonce;
IERC20 erc20Token;
uint256 erc20TokenAmount;
Fee[] fees;
address nft;
uint256 nftId;
Property[] nftProperties;
}
struct Property {
IPropertyValidator propertyValidator;
bytes propertyData;
}
struct Fee {
address recipient;
uint256 amount;
bytes feeData;
}
Params descriptions:
maker、taker、expiry、nonce、erc20Token、erc20TokenAmount、fees、nft、nftId、signatureType、v、r、s - same as SellOrder
nftProperties - used for collection order if push a Property.propertyValidator = address(0) to the array
ERC1155 SellOrder
struct ERC1155SellOrder {
address maker;
address taker;
uint256 expiry;
uint256 nonce;
IERC20 erc20Token;
uint256 erc20TokenAmount;
Fee[] fees;
address erc1155Token;
uint256 erc1155TokenId;
// End of fields shared with NFTOrder
uint128 erc1155TokenAmount;
}
maker、taker、expiry、nonce、erc20Token、erc20TokenAmount、fees 、signatureType、v、r、s- same as ERC721 SellOrder
erc1155Token - the collection address of ERC1155, same as ER721 nft
erc1155TokenId - the tokenId of this collection, same as ERC721 nftId
erc1155TokenAmount - the amount of this tokenId
ERC1155 BuyOrder
struct ERC1155BuyOrder {
address maker;
address taker;
uint256 expiry;
uint256 nonce;
IERC20 erc20Token;
uint256 erc20TokenAmount;
Fee[] fees;
address erc1155Token;
uint256 erc1155TokenId;
Property[] erc1155TokenProperties;
// End of fields shared with NFTOrder
uint128 erc1155TokenAmount;
}
maker、taker、expiry、nonce、erc20Token、erc20TokenAmount、fees、signatureType、v、r、s、erc1155Token、erc1155TokenId、erc1155TokenAmount - same as ERC1155 SellOrder
erc1155TokenProperties - same as ERC721 nftProperties
Taker Param
Take param used to call smart contract functions to match against a maker order.
buyERC721
Buys an ERC721 asset by filling the given sell order.
function buyERC721(
LibNFTOrder.NFTSellOrder memory sellOrder,
LibSignature.Signature memory signature
) public override payable
sellOrder - the sell order struct params
signature - the signature of the sell order
buyERC721Ex
Advance version of buyERC721 with more feature: mix payment with ETH+WETH、specify taker and callback.
function buyERC721Ex(
LibNFTOrder.NFTSellOrder memory sellOrder,
LibSignature.Signature memory signature,
address taker,
bytes memory callbackData
) public override payable
sellOrder、signature - same as buyERC721
taker - the taker of order, msg.sender or the real buyer behind a aggregator like gem.xyz/genie.xyz
callbackData - call back function to the taker address if needed
sellERC721
Sells an ERC721 asset to fill the given order.
function sellERC721(
LibNFTOrder.NFTBuyOrder memory buyOrder,
LibSignature.Signature memory signature,
uint256 erc721TokenId,
bool unwrapNativeToken,
bytes memory callbackData
)
buyOrder - the erc721 buy order
signature - the signature of the buy order
erc721TokenId - The ID of the ERC721 asset being sold. If the given order specifies properties,the asset must satisfy those properties. Otherwise, it must equal the tokenId in the order.
unwrapNativeToken - If this parameter is true and the ERC20 token of the order is e.g. WETH, unwraps the token before transferring it to the taker.
callbackData - callbackData If this parameter is non-zero, invokes
zeroExERC721OrderCallback
onmsg.sender
after the ERC20 tokens have been transferred tomsg.sender
but before transferring the ERC721 asset to the buyer.
buyERC1155
Same as buyERC721.
function buyERC1155(
LibNFTOrder.ERC1155SellOrder memory sellOrder,
LibSignature.Signature memory signature,
uint128 erc1155BuyAmount
) public override payable
erc1155BuyAmount - the number want to buy
buyERC1155Ex
Advance version of buyERC1155 with more feature: mix payment with ETH+WETH、specify taker and callback.
function buyERC1155Ex(
LibNFTOrder.ERC1155SellOrder memory sellOrder,
LibSignature.Signature memory signature,
address taker,
uint128 erc1155BuyAmount,
bytes memory callbackData
)
sellERC1155
same as sellERC721
function sellERC1155(
LibNFTOrder.ERC1155BuyOrder memory buyOrder,
LibSignature.Signature memory signature,
uint256 erc1155TokenId,
uint128 erc1155SellAmount,
bool unwrapNativeToken,
bytes memory callbackData
)
erc1155SellAmount - the number want to sell