# 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 <a href="#maker-order" id="maker-order"></a>

#### ERC721 SellOrder <a href="#erc721-sellorder" id="erc721-sellorder"></a>

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 href="#erc721-buyorder" id="erc721-buyorder"></a>

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 <a href="#erc1155-sellorder" id="erc1155-sellorder"></a>

```
  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** <a href="#erc1155-buyorder" id="erc1155-buyorder"></a>

```
   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 <a href="#taker-param" id="taker-param"></a>

Take param used to call smart contract functions to match against a maker order.

#### buyERC721 <a href="#buyerc721" id="buyerc721"></a>

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 <a href="#buyerc721ex" id="buyerc721ex"></a>

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 <a href="#sellerc721" id="sellerc721"></a>

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` on `msg.sender` after the ERC20 tokens have been transferred to `msg.sender` but before transferring the ERC721 asset to the buyer.

#### buyERC1155 <a href="#buyerc1155" id="buyerc1155"></a>

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 <a href="#buyerc1155ex" id="buyerc1155ex"></a>

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 <a href="#sellerc1155" id="sellerc1155"></a>

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.element.market/welcome-to-element/~/changes/Qu9wGw2T4ap9NsrGn2zk/developer/order-types.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
