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

NFT市场开发中buyNft函数出现Cannot read properties of undefined (reading '_hex')错误

解决ethers调用合约时出现的"Cannot read properties of undefined (reading '_hex')"错误

你遇到的错误是因为传入合约方法的某个参数不是ethers可识别的有效类型,导致内部读取_hex属性时对象未定义。结合你的代码和调试信息,给出以下排查和解决方向:

1. 检查nft.tokenId的有效性

虽然price能正常输出,但nft.tokenId可能是undefined、null,或者是无法被ethers解析为数值的字符串。ethers在处理合约的uint256类型参数时,需要传入BigNumber或可转换为BigNumber的有效数值。

解决方法:

  • 调用前打印nft.tokenId确认值是否存在
  • 用ethers.BigNumber.from()显式转换tokenId:
    const tokenId = ethers.BigNumber.from(nft.tokenId);
    const transaction = await contract.createMarketSale(tokenId, { value: price });
    

2. 核对合约ABI中createMarketSale的参数定义

大概率是你传入的参数顺序或数量和合约实际要求不匹配。比如很多NFT市场合约的createMarketSale方法需要两个参数:NFT合约地址和tokenId,而不是仅传tokenId。如果漏传参数,会导致后续的value配置被当成了需要解析的数值参数,从而触发错误。

解决方法:

  • 打开MarketAddressABI,找到createMarketSale的定义,确认参数数量、顺序和类型。比如如果合约方法是:
    function createMarketSale(address nftContract, uint256 tokenId) payable external
    
    你需要补传NFT合约地址:
    const transaction = await contract.createMarketSale(nft.contractAddress, tokenId, { value: price });
    

3. 验证合约实例的正确性

确保MarketAddress是NFT市场合约的正确地址,MarketAddressABI包含createMarketSale的完整定义。如果ABI错误或地址不匹配,ethers会动态生成方法,但参数处理会出现异常。

修正后的示例代码

const buyNft = async (nft) => {
    const web3Modal = new Web3Modal();
    const connection = await web3Modal.connect();
    const provider = new ethers.providers.Web3Provider(connection);
    const signer = provider.getSigner();
    const contract = new ethers.Contract(
      MarketAddress,
      MarketAddressABI,
      signer
    );

    const price = ethers.utils.parseUnits(nft.price.toString(), "ether");
    console.log("price:", price);

    // 校验并转换tokenId
    if (!nft.tokenId) {
        console.error("错误:tokenId未定义");
        return;
    }
    const tokenId = ethers.BigNumber.from(nft.tokenId);
    console.log("tokenId:", tokenId);

    try {
        // 注意:如果合约需要NFT合约地址,要加上第一个参数
        const transaction = await contract.createMarketSale(tokenId, {
          value: price,
        });
        await transaction.wait();
        console.log("购买NFT成功");
    } catch (err) {
        console.error("购买失败:", err);
    }
};

内容的提问来源于stack exchange,提问作者MALIK forz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:10:34