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

ERC721转账报错transfer of token that is not own及gas估算失败求助

错误根因

ERC721: transfer of token that is not own报错的直接触发点是你在createSale函数中调用transferFrom时传入的转出地址错误,不是对应NFT的实际持有者,具体问题如下:

  • 你写的转账逻辑为IERC721(nftContract).transferFrom(owner, msg.sender, tokenId);,其中的owner是你合约的全局所有者地址,但是对应NFT的实际持有者是上架该商品的卖家,也就是idToMarketItem[itemId].seller,你从根本没有持有该NFT的地址发起转账,自然会触发ERC721的所有权校验报错。
  • 附带的gas估算失败报错是因为链上执行逻辑会回滚,节点无法估算出成功执行的gas消耗,属于主报错衍生的前端提示。
修复方案
  1. 修正转账逻辑的转出地址
    将createSale中的转账代码替换为:
IERC721(nftContract).transferFrom(idToMarketItem[itemId].seller, msg.sender, tokenId);

直接从NFT实际持有人(商品卖家)的地址转出即可解决所有权校验报错。

  1. 补充前置校验避免同类问题
    可以在createSale函数开头新增授权校验逻辑,避免卖家未给交易市场合约开转账权限的问题:
require(IERC721(nftContract).isApprovedForAll(idToMarketItem[itemId].seller, address(this)), "Seller not approved market to transfer");
  1. 前端兼容优化
    前端发起交易前可以先调用ERC721合约的ownerOf(tokenId)接口,查询确认对应NFT的实际持有者和存储的卖家地址一致,同时手动设置合理的gasLimit值,规避gas估算失败的提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:48:04