Get Metadata

Fetch the metadata of a token

Version 2

import {
    addCodecSizePrefix,
    Address,
    address,
    assertAccountExists,
    decodeAccount,
    fetchEncodedAccounts,
    getAddressDecoder,
    getAddressEncoder,
    getBooleanDecoder,
    GetMultipleAccountsApi,
    getOptionDecoder,
    getProgramDerivedAddress,
    getStructDecoder,
    getU32Codec,
    getU32Decoder,
    getU64Decoder,
    getU8Decoder,
    getUtf8Codec,
    Rpc,
    createSolanaRpc
} from "@solana/web3.js";

export const METADATA_PROGRAM_ID = address(
    "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"
);

const MintDecoder = getStructDecoder([
    [
        "mintAuthority",
        getOptionDecoder(getAddressDecoder(), {
            prefix: getU32Decoder(),
            noneValue: "zeroes",
        }),
    ],
    ["supply", getU64Decoder()],
    ["decimals", getU8Decoder()],
    ["isInitialized", getBooleanDecoder()],
    [
        "freezeAuthority",
        getOptionDecoder(getAddressDecoder(), {
            prefix: getU32Decoder(),
            noneValue: "zeroes",
        }),
    ],
]);

export const MetadataDecoder = getStructDecoder([
    ["key", getU8Decoder()],
    ["updateAuthority", getAddressDecoder()],
    ["mint", getAddressDecoder()],
    ["name", addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
    ["symbol", addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
    ["uri", addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
]);

export async function getMetadataPdaAddress(mint: Address) {
    const addressEncoder = getAddressEncoder();
    const [metadataAccountAddress] = await getProgramDerivedAddress({
        programAddress: METADATA_PROGRAM_ID,
        seeds: [
            "metadata",
            addressEncoder.encode(METADATA_PROGRAM_ID),
            addressEncoder.encode(mint),
        ],
    });

    return metadataAccountAddress;
}

export async function fetchTokenMintAndMetadata(
    rpc: Rpc<GetMultipleAccountsApi>,
    mintAddr: Address
) {
    const metadataAccountAddress = await getMetadataPdaAddress(mintAddr);

    const [mintAccount, metadataAccount] = await fetchEncodedAccounts(rpc, [
        mintAddr,
        metadataAccountAddress,
    ]);

    assertAccountExists(mintAccount);
    assertAccountExists(metadataAccount);

    const mint = decodeAccount(mintAccount, MintDecoder);
    const metadata = decodeAccount(metadataAccount, MetadataDecoder);

    return [mint, metadata];
}

const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");

const main = async () => {
    const tokenAddr = address("6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN");

    const [mint, metadata] = await fetchTokenMintAndMetadata(rpc, tokenAddr);

    console.log(mint.data);
    console.log(metadata.data);
};

main();

V2 Example provided by https://github.com/g00dv1n/fetchTokenMintAndMetadata-example

Old Way

import { Connection, PublicKey } from "@solana/web3.js";
import { Metadata } from "@metaplex-foundation/mpl-token-metadata";

const connection = new Connection("https://api.mainnet-beta.solana.com");

(async () => {
  let mintPubkey = new PublicKey("9MwGzSyuQRqmBHqmYwE6wbP3vzRBj4WWiYxWns3rkR7A");
  let tokenmetaPubkey = await Metadata.getPDA(mintPubkey);

  const tokenmeta = await Metadata.load(connection, tokenmetaPubkey);
  console.log(tokenmeta);
})();