Normal Offer Order
Last updated
Last updated
A normal offer order is a buy order. It can create an offer to a given nft asset. It is up to the nft owner to decide whether to accept or not.
Please refer to .
Please refer to .
Please refer to .
Please refer to .
const Web3 = require('web3');
const crypto = require('crypto');
const keccak256 = require('keccak256');
const { expectRevert, time, expectEvent } = require('@openzeppelin/test-helpers');
const nftOwner = accounts[1];
const buyer = accounts[2];
const nftOwnerRelayerFeeRecipient = accounts[3];
const buyerRelayerFeeRecipient = accounts[4];
const niftyConnectExchangeInst = await NiftyConnectExchange.deployed();
const testERC721Inst = await TestERC721.deployed();
const testERC20Inst = await TestERC20.deployed();
// Step 1: mint ERC721 token and setApprovalForAll
const tokenId = await testERC721Inst.tokenIdIdx();
await testERC721Inst.mint(nftOwner, {from: nftOwner});
await testERC721Inst.setApprovalForAll(NiftyConnectExchange.address, true, {from: nftOwner});
// Step 2: calculate list time, expire time and generate random salt
const listtime = Math.floor(Date.now() / 1000);
const expireTime = web3.utils.toBN(listtime).add(web3.utils.toBN(3600)); // expire at one hour later
const salt = "0x" + crypto.randomBytes(32).toString("hex");
// Step 3: set sell price and amount
const exchangePrice = web3.utils.toBN(1e18);
const ERC721_AMOUNT = web3.utils.toBN(1); // ERC721 amount must be 1
// Step 4: Select Selector
const ERC721TransferSelector = web3.utils.toBN(0);
// Step 5: Calculate replacement pattern
let buyReplacementPattern = generateBuyReplacementPatternForNormalOrder(false)
const makeOrdertx = await niftyConnectExchangeInst.makeOrder_(
[
NiftyConnectExchange.address, // exchange
buyer, // maker
"0x0000000000000000000000000000000000000000", // taker
buyerRelayerFeeRecipient, // makerRelayerFeeRecipient
"0x0000000000000000000000000000000000000000", // takerRelayerFeeRecipient
TestERC721.address, // nftAddress
"0x0000000000000000000000000000000000000000", // staticTarget
TestERC20.address, // paymentToken
"0x0000000000000000000000000000000000000000", // from
buyer // to
],
[
exchangePrice, // uint basePrice
web3.utils.toBN(0), // uint extra
timestamp, // uint listingTime
expireTime, // uint expirationTime
web3.utils.toBN(salt), // uint salt
ERC721TransferSelector, // uint merkleValidatorSelector
tokenId, // uint tokenId
ERC721_AMOUNT, // uint amount
0, // uint totalLeaf
],
0, // side
0, // saleKind
buyReplacementPattern, // replacementPattern
[], // staticExtradata
[
"0x0000000000000000000000000000000000000000000000000000000000000000", // merkle root hash, for trait-based order
"0x0000000000000000000000000000000000000000000000000000000000000000" // ipfs hash which contain the metadata of merkle proof, for trait-based order
], // merkleData
{from: buyer}
);
// Step 1: parse order calldata from event OrderApprovedPartTwo
const orderApprovedPartTwoEvent = expectEvent.inLogs(makeOrdertx.logs, 'OrderApprovedPartTwo');
const buyCalldata = orderApprovedPartTwoEvent.args.calldata;
// Step 2: generate sell order calldata
const sellCalldata = await niftyConnectExchangeInst.buildCallData(
ERC721TransferSelector, // uint selector,
nftOwner, // address from,
buyer, // address to,
TestERC721.address,// address nftAddress,
tokenId, // uint256 tokenId,
ERC721_AMOUNT,// uint256 amount,
"0x00", // bytes32 merkleRoot
[],// bytes32[] memory merkleProof
);
// Step 3: Calculate replacement pattern
const sellReplacementPattern = generateSellReplacementPatternForNormalOrder(false)
// Step 4: Take order
await niftyConnectExchangeInst.takeOrder_(
[ // address[16] addrs,
//buy
NiftyConnectExchange.address, // exchange
buyer, // maker
"0x0000000000000000000000000000000000000000", // taker
buyerRelayerFeeRecipient, // makerRelayerFeeRecipient
"0x0000000000000000000000000000000000000000", // takerRelayerFeeRecipient
TestERC721.address, // nftAddress
"0x0000000000000000000000000000000000000000", // staticTarget
TestERC20.address, // paymentToken
//sell
NiftyConnectExchange.address, // exchange
nftOwner, // maker
buyer, // taker
"0x0000000000000000000000000000000000000000", // makerRelayerFeeRecipient
nftOwnerRelayerFeeRecipient, // takerRelayerFeeRecipient
TestERC721.address, // nftAddress
"0x0000000000000000000000000000000000000000", // staticTarget
TestERC20.address, // paymentToken
],
[ // uint[12] uints,
//buy
exchangePrice, // uint basePrice
web3.utils.toBN(0), // uint extra
timestamp, // uint listingTime
expireTime, // uint expirationTime
web3.utils.toBN(salt), // uint salt
tokenId, // uint tokenId
//sell
exchangePrice, // uint basePrice
web3.utils.toBN(0), // uint extra
timestamp, // uint listingTime
expireTime, // uint expirationTime
web3.utils.toBN(salt), // uint salt
tokenId, // uint tokenId
],
[ // uint8[4] sidesKindsHowToCalls,
0, 0,
1, 0
],
buyCalldata, // bytes calldataBuy,
sellCalldata, // bytes calldataSell,
buyReplacementPattern, // bytes replacementPatternBuy,
sellReplacementPattern, // bytes replacementPatternSell,
[],// bytes staticExtradataBuy,
[],// bytes staticExtradataSell,
"0x00",// bytes32 rssMetadata
{from: nftOwner}
);
Please refer to .
Please refer to .
The referenced contracts are located in , and