如何使用 node.js 检查 opensea 上的令牌是 ERC721 还是 ERC1155

Posted

技术标签:

【中文标题】如何使用 node.js 检查 opensea 上的令牌是 ERC721 还是 ERC1155【英文标题】:How to check if the token on opensea is ERC721 or ERC1155 using node.js 【发布时间】:2021-12-10 20:47:46 【问题描述】:
const  OpenSeaPort, Network  = require("opensea-js");

const offer = await seaport.createBuyOrder(
      asset: 
        tokenId,
        tokenAddress,
        schemaName
      ,
      accountAddress: WALLET_ADDRESS,
      startAmount: newOffer / (10 ** 18),
      expirationTime: Math.round(Date.now() / 1000 + 60 * 60 * 24)
    );

我将从 opensea 空令牌中获取 schemaName(如果是 ERC721 或 ERC1155):

ERC721: https://opensea.io/assets/0x5e8bbe6b1a1e9aa353218c5b6693f5f7c5648327/1080

ERC1155: https://opensea.io/assets/0x495f947276749ce646f68ac8c248420045cb7b5e/77145546951944958763741319904361551411909238433895885342936554025825874214913

在 opensea 的 Details 面板中,我可以看到合约模式名称如下:Token Standard: ERC-1155

如何使用 node.js 或 python 从 opensea 令牌 url 获取架构名称?

【问题讨论】:

【参考方案1】:

我一直在关注这个问题以获得一个好的答案。然而,似乎没有人回答。因此,我给出了自己的解决方案。

根据 EIP721 和 EIP1155,它们都必须实现 EIP165。综上所述,EIP165 所做的就是让我们检查合约是否实现了接口。关于https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified的详细信息

根据 EIP,ERC721 和 ERC1155 将实现 EIP165。因此,我们可以使用EIP165的supportsInterface来检查合约是ERC721还是ERC1155。

ERC1155的接口id是0xd9b67a26,而ERC721的接口是0x80ac58cd。您可以查看 EIP165 关于如何计算接口 id 的提案。

以下是代码示例。

import Web3 from "web3";
import dotenv from "dotenv";
dotenv.config();
var web3 = new Web3(
  new Web3.providers.HttpProvider(process.env.RINKEBY_URL || "")
);

const ERC165Abi: any = [
  
    inputs: [
      
        internalType: "bytes4",
        name: "interfaceId",
        type: "bytes4",
      ,
    ],
    name: "supportsInterface",
    outputs: [
      
        internalType: "bool",
        name: "",
        type: "bool",
      ,
    ],
    stateMutability: "view",
    type: "function",
  ,
];

const ERC1155InterfaceId: string = "0xd9b67a26";
const ERC721InterfaceId: string = "0x80ac58cd";
const openSeaErc1155Contract: string =
  "0x88b48f654c30e99bc2e4a1559b4dcf1ad93fa656";
const myErc721Contract: string = "0xb43d4526b7133464abb970029f94f0c3f313b505";

const openSeaContract = new web3.eth.Contract(
  ERC165Abi,
  openSeaErc1155Contract
);
openSeaContract.methods
  .supportsInterface(ERC1155InterfaceId)
  .call()
  .then((res: any) => 
    console.log("Is Opensea", openSeaErc1155Contract, " ERC1155 - ", res);
  );

openSeaContract.methods
  .supportsInterface(ERC721InterfaceId)
  .call()
  .then((res: any) => 
    console.log("Is Opensea", openSeaErc1155Contract, " ERC721 - ", res);
  );

const myContract = new web3.eth.Contract(ERC165Abi, myErc721Contract);
myContract.methods
  .supportsInterface(ERC1155InterfaceId)
  .call()
  .then((res: any) => 
    console.log("Is MyContract", myErc721Contract, " ERC1155 - ", res);
  );

myContract.methods
  .supportsInterface(ERC721InterfaceId)
  .call()
  .then((res: any) => 
    console.log("Is MyContract", myErc721Contract, " ERC721 - ", res);
  );

上述解决方案需要连接到Ethereum node(如infura)才能工作。

如果有更好的解决方案,请赐教。

谢谢。

编辑:我发现 OpenSea 提供 API 供您检查。这是链接https://docs.opensea.io/reference/retrieving-a-single-contract

【讨论】:

以上是关于如何使用 node.js 检查 opensea 上的令牌是 ERC721 还是 ERC1155的主要内容,如果未能解决你的问题,请参考以下文章

OpenSea PHP开发包

如何创建像 OpenSea 这样的签名交易

检查 Node.js REST API 上的资源所有权

如何使用 Node.js 检查 ram 的当前使用情况? (Discord.js 机器人)

如何使用 Promise 和 node.js 正确检查和记录 http 状态代码?

弄清楚如何通过延迟发布、元数据未在 opensea 上验证来铸造 NFT