如何在 SOLANA 上使用 web3 js 从令牌地址获取元数据

mat*_*att 8 token jsx reactjs solana solana-web3js

通过该方法,我获得了 publicKey 拥有的令牌列表:

connection
.getParsedTokenAccountsByOwner(
  new PublicKey(publicKey.toBase58()),
  {
    programId: TOKEN_PROGRAM_ID
  }
)
.then((b) => {
  const owner = b?.value?.[0].account.owner;
  const pb = b?.value?.[0].pubkey;

  const nonZeroAccounts = b?.value?.filter(
    (obj) => obj.account.data.parsed.info.tokenAmount.uiAmount > 0
  );
  setTokens(JSON.stringify(nonZeroAccounts, null, 2));
Run Code Online (Sandbox Code Playgroud)

例如,拥有 1 个代币的帐户的返回值:

{
"account": {
  "data": {
    "parsed": {
      "info": {
        "isNative": false,
        "mint": "example",
        "owner": "example",
        "state": "initialized",
        "tokenAmount": {
          "amount": "1",
          "decimals": 0,
          "uiAmount": 1,
          "uiAmountString": "1"
        }
      },
      "type": "account"
    },
    "program": "spl-token",
    "space": 165
  },
  "executable": false,
  "lamports": 2039280,
  "owner": {
    "_bn": "example"
  },
  "rentEpoch": 245
},
"pubkey": {
  "_bn": "example"
}
Run Code Online (Sandbox Code Playgroud)

现在我有了这些信息,我想知道如何获取该令牌的元数据

mat*_*att 6

在 Soubriquet 请求之后,我将在此处添加实际的工作代码。

Metaplex 文档并不总是最新的,所以不要相信它。

    const Metadata = require("@metaplex-foundation/mpl-token-metadata");
    
    async function getMetadataPDA(mint) 
        {
          const [publicKey] = await web3.PublicKey.findProgramAddress(
            [Buffer.from("metadata"), 
            Metadata.PROGRAM_ID.toBuffer(), 
            mint.toBuffer()],
            Metadata.PROGRAM_ID
          );
          return publicKey;
        }
    
    let pda = await getMetadataPDA(mint);
    let res = await Metadata.Metadata.fromAccountAddress(connection, account);
Run Code Online (Sandbox Code Playgroud)

考虑一下 mint 是一个 PublicKey,而不是一个字符串。

这是返回值的 JSON 结构 https://docs.metaplex.com/token-metadata/Versions/v1.0.0/nft-standard