opensea API v2 giving "invalid signature" when try to list NFT on polygon network

679 Views Asked by At

Following is my code that i am using to create listing using opensea API v2. I have opensea API-KEY and its working fine with other calls. I want to list the NFT on Polygon network.

const axios = require("axios");
const { Seaport } = require("@opensea/seaport-js");
const ethers = require("ethers");

const signTran = async (customParam) => {
  const provider = new ethers.providers.JsonRpcProvider(
    "https://rpc-mumbai.maticvigil.com/"
  );
  const signer = new ethers.Wallet(
    "metamask_account_private_key",
    provider
  );
  const seaport = new Seaport(signer);
  let counter = 0;
  let signature = await seaport.signOrder(customParam, counter);
  customParam["counter"] = counter;
  customParam.startTime = customParam.startTime.toString();
  customParam.endTime = customParam.endTime.toString();
  customParam.totalOriginalConsiderationItems =
  customParam.totalOriginalConsiderationItems.toNumber();
  const order = {
    parameters: customParam,
    signature: signature,
  };
  const options = {
    method: "POST",
    url: "https://api.opensea.io/v2/orders/matic/seaport/listings",
    headers: {
      accept: "application/json",
      "X-API-KEY": "98e3c67d43d74d66a79df13456d4618a",
      "content-type": "application/json",
    },
    data: order,
  };

  await axios
    .request(options)
    .then(function (response) {
      console.log("getting response");
      console.log(response.data);
    })
    .catch(function (error) {
      console.log("------------------------------");
      console.log("getting error");
      console.error(error.response.data);
    });
};

const customParam = {
  offerer: "0xA29536981074C1B89e00D30f8238a7289b4213d6",
  zone: "0x0000000000000000000000000000000000000000",
  zoneHash:
    "0x0000000000000000000000000000000000000000000000000000000000000000",
  startTime: ethers.BigNumber.from(
    Math.floor(new Date().getTime() / 1000).toString()
  ),
  endTime: ethers.BigNumber.from(
    Math.floor(new Date().getTime() / 1000 + 60 * 60).toString()
  ),
  orderType: 1,
  offer: [
    {
      itemType: 3,
      token: "0x2953399124F0cBB46d2CbACD8A89cF0599974963",
      identifierOrCriteria:
        "48424776733525332910006189684535612585845530803681690324897386617738348199937",
      startAmount: "1",
      endAmount: "1",
    },
  ],
  consideration: [
    {
      itemType: 0,
      token: "0x0000000000000000000000000000000000000000",
      identifierOrCriteria: "0",
      startAmount: "48750000000000000",
      endAmount: "48750000000000000",
      recipient: "0xA29536981074C1B89e00D30f8238a7289b4213d6",
    },
    {
      itemType: 0,
      token: "0x0000000000000000000000000000000000000000",
      identifierOrCriteria: "0",
      startAmount: "1250000000000000",
      endAmount: "1250000000000000",
      recipient: "0x0000a26b00c1F0DF003000390027140000fAa719",
    },
  ],
  totalOriginalConsiderationItems: ethers.BigNumber.from("2"),
  salt: "123852146548",
  conduitKey:
    "0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000",
};

signTran(customParam);

I have tried to get the signature using web3.js and ether.js, but that were also giving the same issue. Now i am making the signature using seaport but still its not working.

I want to list NFT on polygon network using opensea API v2

2

There are 2 best solutions below

1
On
const d = new Date();
d.setDate(d.getDate() + 15);
const price = Web3.utils.toWei(
  (+nftPrice).toLocaleString("fullwide", { useGrouping: false }),
  "ether"
);
let new_parameters = {
  offerer: user.wallet,
  offer: [
    {
      itemType: 2,
      token: Listingdata.contract_address,
      identifierOrCriteria: Listingdata.token_id,
      startAmount: "1",
      endAmount: "1",
    },
  ],
  consideration: [
    {
      itemType: 1,
      token: paymentTokenMumbai.eth,
      identifierOrCriteria: "0",
      startAmount: "975000000000000000",
      endAmount: "975000000000000000",
      recipient: user.wallet,
    },
    {
      itemType: 1,
      token: paymentTokenMumbai.eth,
      identifierOrCriteria: "0",
      startAmount: "25000000000000000",
      endAmount: "25000000000000000",
      recipient: "0x0000a26b00c1F0DF003000390027140000fAa719",
    },
  ],
  startTime: ethers.BigNumber.from(Math.floor(new Date().getTime() / 1000)),
  endTime: ethers.BigNumber.from(Math.floor(d.getTime() / 1000)),
  orderType: 0,
  zone: "0x0000000000000000000000000000000000000000",
  zoneHash:
    "0x0000000000000000000000000000000000000000000000000000000000000000",
  salt: "0x360c6ebe000000000000000000000000000000000000000048d3d4dc9cefb81c",
  conduitKey:
    "0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000",
  totalOriginalConsiderationItems: ethers.BigNumber.from("2"),
};

const getSign = async (parameters: any) => {
  let counter = 0;

  let signature = await seaport.signOrder(parameters, counter);
  parameters["counter"] = counter;
  return {
    parameters: parameters,
    signature: signature,
  };
};

const sendToApi = async (order: any) => {
  let api_params = order["parameters"];
  api_params.startTime = api_params.startTime.toString();
  api_params.endTime = api_params.endTime.toString();
  api_params.totalOriginalConsiderationItems =
    api_params.totalOriginalConsiderationItems.toNumber();
  order["parameters"] = api_params;
  const options = {
    method: "POST",
    headers: {
      accept: "application/json",
      "content-type": "application/json",
    },
    body: JSON.stringify(order),
  };

  const resp = await fetch(listingOpenseaApi, options)
    .then((response) => response.json())
    .then((response) => response)
    .catch((err) => console.error(err));

  return resp;
};

let order = await getSign(new_parameters);
const orderDetail = await sendToApi(order);
0
On

Use Seaport Version 1.4 instead of default 1.1

const seaport = new Seaport(signer, { seaportVersion: '1.4' });