使用@hashgraph/sdk内置方法转移NFT失败,报错TOKEN_NOT_ASSOCIATED_TO_ACCOUNT
解决Hedera NFT转账报错
TOKEN_NOT_ASSOCIATED_TO_ACCOUNT 错误原因
报错TOKEN_NOT_ASSOCIATED_TO_ACCOUNT的核心原因是接收NFT的买家账户尚未关联该NFT对应的Token ID。Hedera网络规则明确要求:任何账户要接收特定Token(包括NFT),必须先完成Token关联操作,否则无法接收该Token资产。
解决方案步骤
1. 验证买家账户的Token关联状态
先通过AccountInfoQuery查询买家账户是否已关联目标Token ID:
const checkTokenAssociation = async (accountId, tokenId) => { const client = await getClient(); const accountInfo = await new AccountInfoQuery() .setAccountId(accountId) .execute(client); // 检查账户关联的Token列表 const isAssociated = accountInfo.tokenRelationships.some( rel => rel.tokenId.toString() === tokenId.toString() ); console.log(`买家账户是否关联该Token: ${isAssociated}`); return isAssociated; };
2. 为买家账户关联目标Token
如果验证后发现未关联,执行TokenAssociateTransaction完成关联(需要买家私钥签名):
const associateTokenToBuyer = async (buyerAccount, buyerKey, tokenId) => { const client = await getClient(); const associateTx = await new TokenAssociateTransaction() .setAccountId(buyerAccount) .setTokenIds([tokenId]) .freezeWith(client) .sign(buyerKey); const associateSubmit = await associateTx.execute(client); const associateRx = await associateSubmit.getReceipt(client); console.log(`Token关联状态: ${associateRx.status}`); return associateRx.status; };
3. 修改原转账逻辑,先关联再转账
在原TransferNft函数中加入关联检查与关联操作:
const TransferNft = async (tokenId, sellerAccount, sellerId, buyerAccount, buyerId) => { try { const client = await getClient(); tokenId = TokenId.fromString(tokenId); let sellerKey = await getPrivateKey(sellerId); sellerKey = PrivateKey.fromString(sellerKey); let buyerKey = await getPrivateKey(buyerId); buyerKey = PrivateKey.fromString(buyerKey); // 新增:检查买家是否关联Token,未关联则执行关联 const isAssociated = await checkTokenAssociation(buyerAccount, tokenId); if (!isAssociated) { await associateTokenToBuyer(buyerAccount, buyerKey, tokenId); } // 执行NFT与Hbar转账 let tokenTransferTx2 = await new TransferTransaction() .addNftTransfer(tokenId, 2, sellerAccount, buyerAccount) .addHbarTransfer(sellerAccount, Hbar.fromTinybars(100)) .addHbarTransfer(buyerAccount, Hbar.fromTinybars(-100)) .freezeWith(client) .sign(sellerKey); let tokenTransferTx2Sign = await tokenTransferTx2.sign(buyerKey); let tokenTransferSubmit2 = await tokenTransferTx2Sign.execute(client); let tokenTransferRx2 = await tokenTransferSubmit2.getReceipt(client); console.log(`\n NFT transfer Alice->Bob status: ${tokenTransferRx2.status} \n`); return tokenTransferRx2.status; } catch (error) { console.log('Error in HederaToken/TransferNft/TransferNft: \n', error) } };
额外注意事项
- 关联Token操作需要消耗少量Hbar作为交易手续费,确保买家账户有足够余额。
- 如果NFT的Token设置了
kycRequired,还需要确保买家账户已通过KYC验证,否则也会导致转账失败。 - 确认NFT的序列号
2确实属于卖家账户,避免因序列号错误导致的其他问题。
内容的提问来源于stack exchange,提问作者Paras Dalsaniya
相关产品推荐
相关产品推荐

