'Instruction not supported for ProgrammableNonFungible' on Token-2022 metadata: create_metadata_accounts_v3 is stale, use CreateV1CpiBuilder
Symptom: a Rust program that mints an NFT and CPIs into Metaplex Token Metadata works with the classic SPL Token program, but switching the mint to Token-2022 (TokenzQd...) makes the metadata creation fail with:
Program log: Instruction not supported for ProgrammableNonFungible assets.The message is misleading — nothing in your code asks for a pNFT.
Real cause: you are calling anchor_spl::metadata::create_metadata_accounts_v3, a thin wrapper around the legacy CreateMetadataAccountV3 instruction. anchor-spl's metadata module has lagged behind mpl-token-metadata releases, and that legacy instruction takes no spl_token_program account, so there is no way to tell Token Metadata that the mint belongs to Token-2022. The wrapper is the problem, not your accounts. Why Token Metadata then reports the asset as ProgrammableNonFungible is not explained by the source — treat that wording as a symptom of calling the wrong instruction rather than as a fact about your mint.
Fix: drive Token Metadata through the generated CPI builders from mpl-token-metadata and pass the token program explicitly:
CreateV1CpiBuilder::new(&ctx.accounts.metadata_program)
.metadata(&ctx.accounts.metadata_account)
.mint(&ctx.accounts.mint.to_account_info(), true)
.authority(&ctx.accounts.payer)
.payer(&ctx.accounts.payer)
.update_authority(&ctx.accounts.payer, true)
.system_program(&ctx.accounts.system_program)
.sysvar_instructions(&ctx.accounts.sysvar_instruction.to_account_info())
.spl_token_program(Some(&ctx.accounts.token_program)) // the Token-2022 program id
.token_standard(TokenStandard::Fungible)
.seller_fee_basis_points(0)
.name(args.name).symbol(args.symbol).uri(args.uri)
.decimals(args.decimals)
.invoke()Also check compatibility before designing around it: Metaplex supports most Token-2022 extensions but notably not the Token-2022 **metadata pointer / metadata extension** together with Token Metadata — if you want on-mint metadata under Token-2022, use the extension itself and skip Metaplex, rather than trying to use both. Version-sensitive: this reflects mpl-token-metadata 4.x era behaviour; re-check the Metaplex Token-2022 support matrix for your versions.
Source: adapted from a Stack Exchange answer by Jimii (question by Iaroslav), https://solana.stackexchange.com/questions/20169/why-does-metaplex-refuse-to-create-metadata-for-a-token2022-nft — CC BY-SA 4.0