The process of composing an NFT order and the payload to POST to API endpoint is pretty much the .
The only differences are:
slightly different endpoint route (/nft/orders/... instead of /ft/orders/... )
makerAssetType and takerAssetType fields are required
makerAsset
chainId:network id (Ethereum Mainnet = 1)
nonceAndMeta: needs to be encoded as described in:
makerAsset and takerAsset needs to be encode as packed field containing address of an ERC20/721/1155 token that maker want to sell to the taker (between 0-19 bits). Token type encoded as show above on 20-21 bits.
Example encoding in JavaScript:
Understand the response by checking our dedicated page:
takerAssettakerAssetId and makerAssetId will contain NFT tokenId . If it's "NFT to fungible" order, takerAssetId = 0 and makerAssetId = tokenID. If it's "fungible to NFT", then the opposite.
curl -X POST \
'https://api.paraswap.io/nft/orders/137' \
--header 'Content-Type: application/json' \
--data-raw '{
"nonceAndMeta": "6696393496368457207383969069655254624825140823245405670718046208",
"expiry": 1664716033,
"makerAsset": "4094980474276800865989028098863468306593436022900",
"makerAssetId": "1027",
"takerAsset": "990092240248101882666250324982272499898038834061",
"takerAssetId": "0",
"maker": "0x05182E579FDfCf69E4390c3411D8FeA1fb6467cf",
"taker": "0x0000000000000000000000000000000000000000",
"makerAmount": "1",
"takerAmount": "50",
"signature": "0x762dd1eb9447d10a24adff2c16dd2a6a4f6abdeff2e51fc1df0428129e4b7c1a00100a35f936e591956a5c86d3d502ecb591134bc8c0f32f12fd7533c199975e1c"
}'/* eslint-disable @typescript-eslint/no-unused-vars */
import * as dotenv from 'dotenv';
import axios from 'axios';
import { ethers } from 'ethers';
import {
constructPartialSDK,
constructEthersContractCaller,
constructAxiosFetcher,
constructBuildNFTOrder,
constructSignNFTOrder,
constructPostNFTOrder,
BuildNFTOrderInput,
SignableNFTOrderData,
NFTOrderToSend,
AssetType,
} from '..';
dotenv.config();
const randomPK = ethers.Wallet.createRandom().privateKey;
const wallet = new ethers.Wallet(process.env.PK || randomPK);
const fetcher = constructAxiosFetcher(axios);
const provider = wallet.connect(ethers.getDefaultProvider(137));
const contractCaller = constructEthersContractCaller(
{
ethersProviderOrSigner: provider,
EthersContract: ethers.Contract,
},
wallet.address
);
const paraSwapLimitOrderSDK = constructPartialSDK(
{
chainId: 137,
fetcher,
contractCaller,
},
constructBuildNFTOrder,
constructSignNFTOrder,
constructPostNFTOrder
);
const DAI = '0x6B175474E89094C44Da98b954EedeAC495271d0F';
const NFT = '0x2953399124f0cbb46d2cbacd8a89cf0599974963';
const NFT_ID =
'7772759950848685723459796247330971791008072228632493699501910275462086524929';
const orderInput: BuildNFTOrderInput = {
nonce: 1,
expiry: Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 7, // week from now, in sec
makerAsset: NFT,
makerAssetType: AssetType.ERC1155,
makerAssetId: NFT_ID,
takerAssetType: AssetType.ERC20,
takerAsset: DAI,
makerAmount: (1).toString(10),
takerAmount: (8e18).toString(10),
maker: wallet.address,
};
async function run() {
const signableOrderData: SignableNFTOrderData =
await paraSwapLimitOrderSDK.buildNFTOrder(orderInput);
const signature: string = await paraSwapLimitOrderSDK.signNFTOrder(
signableOrderData
);
const orderToPostToApi: NFTOrderToSend = {
...signableOrderData.data,
signature,
};
const newOrder = await paraSwapLimitOrderSDK.postNFTLimitOrder(
orderToPostToApi
);
console.log(newOrder);
}
run();{
"nonceAndMeta": "6696393496368457207383969069655254624825140823245405670718046208",
"expiry": 1664716033,
"makerAsset": "4094980474276800865989028098863468306593436022900",
"makerAssetId": "1027",
"takerAsset": "990092240248101882666250324982272499898038834061",
"takerAssetId": "0",
"maker": "0x05182E579FDfCf69E4390c3411D8FeA1fb6467cf",
"taker": "0x0000000000000000000000000000000000000000",
"makerAmount": "1",
"takerAmount": "50",
"signature": "0x762dd1eb9447d10a24adff2c16dd2a6a4f6abdeff2e51fc1df0428129e4b7c1a00100a35f936e591956a5c86d3d502ecb591134bc8c0f32f12fd7533c199975e1c"
}const ERC20 = 0;
const ERC721 = 2;
const ERC1155 = 1;
const encodeAddress = (address, assetType) => BigInt(address) | (BigInt(assetType) << BigInt(160));
encodedAddress = encodeAddress('0xcd494673999194365033d7a287af9f0a3b163874', ERC721);{
"order": {
"expiry": 1664716033,
"createdAt": 1663852073,
"transactionHash": null,
"chainId": 137,
"nonceAndMeta": "6696393496368457207383969069655254624825140823245405670718046208",
"maker": "0x05182e579fdfcf69e4390c3411d8fea1fb6467cf",
"taker": "0x0000000000000000000000000000000000000000",
"takerFromMeta": "0x0000000000000000000000000000000000000000",
"makerAsset": "0xcd494673999194365033d7a287af9f0a3b163874",
"makerAssetId": "1027",
"makerAssetType": 2,
"takerAsset": "0xad6d458402f60fd3bd25163575031acdce07538d",
"takerAssetId": "0",
"takerAssetType": 0,
"makerAmount": "1",
"fillableBalance": "1",
"takerAmount": "50",
"signature": "0x762dd1eb9447d10a24adff2c16dd2a6a4f6abdeff2e51fc1df0428129e4b7c1a00100a35f936e591956a5c86d3d502ecb591134bc8c0f32f12fd7533c199975e1c",
"orderHash": "0xe40182a75563c4c84e2ff4f2b4b44045fc94f66c929780ee82560d30cbadeb83",
"permitMakerAsset": null,
"type": "LIMIT",
"state": "PENDING"
}
}