1

I've recently tried to transfer nfts to another account by using @solana/spl-token https://solscan.io/account/9xaaESgAuDeQ9bHm6TArg11zuQem7WjSVf5ioK2jZPNR

I have createAssociatedTokenAccountInstruction and createTransferCheckedInstruction and add them to tx then sign and send

But each time when I've tried transfering them I got 0x11 custom program error. From what I've researched it seems to be frozen token account.

Why does this error occur? What should I do to successfully send nft?

2 Answers 2

2

tokenStandard = 4 in metadata. I'm pretty sure it means it's a pNft (programmable nft, from metaplex). That's why the token account is frozen, it is meant to protect creators (royalties). Meaning you have to transfer the NFT with an authorized program from the OKB team. If you try to transfer it directly from your wallet, is it working ? May be look how to transfer pNft ? I think you have to create a special instruction including metaplex program.

1

It is correct that tokenStandard === 4 implies pNFT. However, having a pNFT does not automatically mean that the account has been frozen.

If a pNFT/NFT/SPL token has metaplex metadata then the token accounts accounts can be frozen and thawed using endpoints provided in the mpl_token_metadata library. That is because mpl_token_metadata grabs hold of the freeze authority on the token when metadata is created.

When interacting with mpl_token_metadata, make sure you use the latest (currently 3.1.0) version of the library as there are some nice instruction builders both in rust and in TS.

In your case, you will be looking at UnlockV1Builder or ThawDelegatedAccountBuilder (depending on the state of the pNFT) to get it unfrozen.

For unlocking, the instruction builder would look something like the following (in rust, but TS is quite similar):

    let mut unlock_builder = UnlockV1Builder::new();

    let ix = unlock_builder
        .authority(escrow_wallet.key())
        .token(source_token_account.key())
        .mint(mint.key())
        .metadata(metadata.key())
        .edition(Some(edition.key()))
        .token_record(Some(token_record.key()))
        .payer(payer.key())
        .system_program(system_program.key())
        .sysvar_instructions(sysvar_instructions.key())
        .spl_token_program(Some(token_program.key()))
        .authorization_rules_program(Some(auth_rules_program.key()))
        .authorization_rules(Some(auth_rules.key())).instruction();

Don't forget that when you execute your transaction, the delegate will have to sign it, In the example below, you will need to use invoke_signed instead of invoke and get the signer seeds to match escrow_wallet in the example above.

2
  • Hi @neft- I'm experiencing similar issues with unlocking the pnft. Do we need to call a Metaplex function to unlock, or is there anything else we should do? Could you please provide the code snippet for this in TS?
    – Bobz
    Nov 24, 2023 at 10:04
  • hey @Maidi - yes the metaplex metadata program effectively owns your NFT - it sets freeze authority to the master edition PDA account so once metadata is in, you cannot freeze / unlock / lock the NFTs without using metaplex.
    – neft
    Jan 7 at 19:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.