You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:00:30