Solana CookbookTokens
To add metadata (name, symbol, image) to a standard SPL Token, you need to use the Metaplex Token Metadata Program. This creates a metadata account that is linked to your token mint via a Program Derived Address (PDA).
This guide covers metadata for standard SPL Tokens (Token Program) and is also applicable for Token-2022. If you want to use the Metadata Extension for Token-2022, see the Metadata Extension guide.
Kit
import {airdropFactory,appendTransactionMessageInstructions,createSolanaRpc,createSolanaRpcSubscriptions,createTransactionMessage,lamports,pipe,sendAndConfirmTransactionFactory,setTransactionMessageFeePayerSigner,setTransactionMessageLifetimeUsingBlockhash,signTransactionMessageWithSigners} from "@solana/kit";import { generateKeyPairSigner } from "@solana/signers";import {getCreateV1InstructionAsync,fetchMetadataFromSeeds,TokenStandard} from "@metaplex-foundation/mpl-token-metadata-kit";// Create connection to local validatorconst rpc = createSolanaRpc("http://127.0.0.1:8899");const rpcSubscriptions = createSolanaRpcSubscriptions("ws://127.0.0.1:8900");// Generate keypairsconst payer = await generateKeyPairSigner();const mint = await generateKeyPairSigner();// Airdrop SOL to payerconst airdrop = airdropFactory({ rpc, rpcSubscriptions });await airdrop({recipientAddress: payer.address,lamports: lamports(1_000_000_000n),commitment: "confirmed"});// Create token with metadataconst createInstruction = await getCreateV1InstructionAsync({mint,authority: payer,payer,name: "My Token",symbol: "MTK",uri: "https://example.com/token-metadata.json",sellerFeeBasisPoints: 0, // 0% royalty (use 500 for 5%)tokenStandard: TokenStandard.Fungible});// Build and send transactionconst { value: latestBlockhash } = await rpc.getLatestBlockhash().send();const transactionMessage = pipe(createTransactionMessage({ version: 0 }),(tx) => setTransactionMessageFeePayerSigner(payer, tx),(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),(tx) => appendTransactionMessageInstructions([createInstruction], tx));const signedTransaction =await signTransactionMessageWithSigners(transactionMessage);await sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(signedTransaction,{ commitment: "confirmed" });// Verify metadata was createdconst metadata = await fetchMetadataFromSeeds(rpc, { mint: mint.address });console.log("Mint Address:", mint.address);console.log("Token Name:", metadata.data.name);console.log("Token Symbol:", metadata.data.symbol);console.log("Metadata URI:", metadata.data.uri);
Is this page helpful?