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);
})();