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 tokenapproved
: (bool) - the approval status of the operator
transaction 2: createRequest
creator
: (string) - the wallet that is creating the order requestisListing
: (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 fortokenId
: (string) - the tokenId you're looking to create an order forquantity
: (number) - the number of tokens you're looking to sellexpiry
: (number) - a number formated to ISO timecurrency
: (string) - the ERC20 currency token you're transacting inpricePerToken
: (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 tokenamount
: (bool) - the approval amount for the spender
transaction 2: acceptRequest
requestId
: (string) - The ID of the requestquantity
: (bool) - The quantity of tokens to acceptadditionalFees
: (number[]) - The additional fees to payadditionalFeeRecipients
: (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]);