How to add a logo to your Solana token (so wallets show it)
Wallets, Solscan and Birdeye all read the same metadata URI for your token logo. Here's the exact format, size, and pinning flow that just works.
Your token's logo is loaded from one place: the image field inside the JSON pinned at your Metaplex metadata uri. Get that one URL right and Phantom, Solflare, Solscan, Birdeye, Jupiter and Dexscreener all render the same image automatically.
The exact spec
- Format: PNG or JPG. WebP works in most wallets but not all bots — stick with PNG.
- Size: 512×512 minimum, 1024×1024 ideal. Square. Larger waste bandwidth, smaller look blurry on retina displays.
- File size: Under 200 KB. Aggregators throttle slow images and your token shows as a blank circle for hours.
- Hosting: IPFS via a gateway that won't disappear (Pinata, NFT.Storage, web3.storage).
The metadata JSON your URI must serve
{
"name": "MyCoin",
"symbol": "MYC",
"description": "Optional one-liner shown on Birdeye and Solscan.",
"image": "https://gateway.pinata.cloud/ipfs/Qm.../logo.png",
"external_url": "https://yoursite.com",
"extensions": {
"twitter": "https://x.com/yourhandle",
"telegram": "https://t.me/yourgroup"
}
}The image field is what every wallet reads. The extensions block is what Birdeye and Dexscreener use for social verification.
Two ways to actually do this
Easy: Mint via SolanaForge. You drop the PNG in the form, the platform pins both the image and the JSON to IPFS via Pinata, and bakes the resulting URI into your Metaplex metadata in the same transaction. Zero manual steps. If the mint fails, the unpin ticket revokes the pins so you don't pay for orphaned files.
Manual: Pin the image to Pinata yourself → write the JSON above with the resulting CID → pin the JSON → use the JSON's CID as the uri argument in your CreateMetadataAccountV3 instruction. Three signatures, three places things can break, and you have to manage your own Pinata account.
Updating the logo later
If you didn't revoke the update authority, you can re-pin a new image, swap the image field in the JSON, re-pin the JSON, and call UpdateMetadataAccountV2 with the new URI. Most wallets re-fetch within 1–24 hours.
If you did revoke update authority (recommended for trust), the logo is permanent. Choose wisely.
Common reasons logos don't show
- Image is hotlinked from a server that 404s or rate-limits — always use IPFS.
- JSON is valid but
imagefield is missing or misspelled (Image≠image). - The CID is private (Pinata "private" pins aren't reachable via public gateway).
- Wallet cache hasn't refreshed — give it an hour.
Bottom line
PNG, square, under 200 KB, pinned to IPFS, URI baked into Metaplex metadata. Do it at mint time or commit to managing it yourself. Mint a token with logo handled →.
Ready to launch your token?
One signature, 0.1 SOL service fee, IPFS metadata pinned via Pinata, mainnet only.
