Build
Skip to content

Sequence Market Orderbook Transactions

All transactions run through a contract at address 0xB537a160472183f2150d42EB1c3DD6684A55f74c on all currently offered networks.

Create a Request

In order to create a request with the sequence marketplace protocol, a prior transaction must take place where the token (ERC1155 or ERC721) you are submitting to the marketplace is approved to be transferred by the marketplace contract.

A batched transaction can be performed to fullfill this requirement of approval (transaction 1), while also sending the transaction for the creation of the request (transaction 2).

Using a universal wallet, this would look something like this:

transaction 1: setApprovalForAll

  • operator: (string) - address of the marketplace acting on the token
  • approved: (bool) - the approval status of the operator

transaction 2: createRequest

  • creator: (string) - the wallet that is creating the order request
  • isListing: (bool) - whether the order is to list (true) or offer orders (false)
  • isERC1155: (bool) - whether the order is for an ERC1155 contract (false for ERC721s)
  • tokenContract: (string) - the token you're looking to create an order for
  • tokenId: (string) - the tokenId you're looking to create an order for
  • quantity: (number) - the number of tokens you're looking to sell
  • expiry: (number) - a number formated to ISO time
  • currency: (string) - the ERC20 currency token you're transacting in
  • pricePerToken: (big number) - the ERC20 price of the token in big number

example

const wallet = sequence.getWallet();
const signer = wallet.getSigner(421614); // on arbitrum-sepolia
 
const sequenceMarketInterface = new ethers.Interface(
  "function createRequest(tuple(bool isListing, bool isERC1155, address tokenContract, uint256 tokenId, uint256 quantity, uint96 expiry, address currency, uint256 pricePerToken)) external nonReentrant returns (uint256 requestId)"
);
 
const erc1155Interface = new ethers.Interface([
  "function setApprovalForAll(address operator, bool approved) external",
]);
 
const amountBigNumber = ethers.parseUnits(String(price), 18); // currency price based on correct decimals for token contract
 
const request = {
  creator: await wallet.getAddress(),
  isListing: true,
  isERC1155: true,
  tokenContract: "0x1693ffc74edbb50d6138517fe5cd64fd1c917709", // collectible you're looking to list or create an offer for
  tokenId: selectedId,
  quantity: quantity,
  expiry: expiry,
  currency: "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7",
  pricePerToken: amountBigNumber,
};
 
const dataCreateRequest = sequenceMarketInterface.encodeFunctionData(
  "createRequest",
  [request]
);
 
const dataApprove = erc1155Interface.encodeFunctionData("setApprovalForAll", [
  "0xB537a160472183f2150d42EB1c3DD6684A55f74c", // sequence market contract (same address on all offered networks)
  true,
]);
 
const tx = {
  to: "0xB537a160472183f2150d42EB1c3DD6684A55f74c", // sequence market contract (same address on all offered networks)
  data: dataCreateRequest,
};
 
const txApprove = {
  to: "0x1693ffc74edbb50d6138517fe5cd64fd1c917709", // an ERC1155 token contract
  data: dataApprove,
};
 
await signer.sendTransaction([txApprove, tx]);

Accept a Request

In order to accept an existing request, one would need to use one of the get requests endpoints (like getTopOrders) to acquire a orderId inputted into the requestId parameter to submit a transaction, with a prior transaction of approving the currency for the request.

A batched transaction can be performed to fullfill this requirement of currency approval (transaction 1), while also sending the transaction for the fullfillment of the request (transaction 2).

Using a universal wallet, this would look something like this:

transaction 1: approve

  • spender: (string) - address of the marketplace acting on the token
  • amount: (bool) - the approval amount for the spender

transaction 2: acceptRequest

  • requestId: (string) - The ID of the request
  • quantity: (bool) - The quantity of tokens to accept
  • additionalFees: (number[]) - The additional fees to pay
  • additionalFeeRecipients: (address[]) - the addresses to send the additional fees to

example

const wallet = sequence.getWallet();
const signer = wallet.getSigner(421614); // on arbitrum-sepolia
 
const erc20Interface = new ethers.Interface([
  "function approve(address spender, uint256 amount) public returns (bool)",
]);
 
const sequenceMarketInterface = new ethers.Interface([
  "function acceptRequest(uint256 requestId, uint256 quantity, address recipient, uint256[] calldata additionalFees, address[] calldata additionalFeeRecipients)",
]);
 
const amountBigNumber = ethers.parseUnits(String(price), 18); // currency price based on correct decimals for token contract
 
const dataApprove = erc20Interface.encodeFunctionData("approve", [
  "0xB537a160472183f2150d42EB1c3DD6684A55f74c", // sequence market contract (same address on all offered networks)
  amountBigNumber,
]);
 
const dataAcceptRequest = sequenceMarketInterface.encodeFunctionData(
  "acceptRequest",
  [requestId, quantity, recipientAddress, [], []]
);
 
const txApprove = {
  to: "0xa9c88358862211870db6f18bc9b3f6e4f8b3eae7", // an ERC20 token contract
  data: dataApprove,
};
 
const tx = {
  to: "0xB537a160472183f2150d42EB1c3DD6684A55f74c", // sequence market contract (same address on all offered networks)
  data: dataAcceptRequest,
};
 
await signer.sendTransaction([txApprove, tx]);