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消耗,属于主报错衍生的前端提示。
修复方案
- 修正转账逻辑的转出地址
将createSale中的转账代码替换为:
IERC721(nftContract).transferFrom(idToMarketItem[itemId].seller, msg.sender, tokenId);
直接从NFT实际持有人(商品卖家)的地址转出即可解决所有权校验报错。
- 补充前置校验避免同类问题
可以在createSale函数开头新增授权校验逻辑,避免卖家未给交易市场合约开转账权限的问题:
require(IERC721(nftContract).isApprovedForAll(idToMarketItem[itemId].seller, address(this)), "Seller not approved market to transfer");
- 前端兼容优化
前端发起交易前可以先调用ERC721合约的ownerOf(tokenId)接口,查询确认对应NFT的实际持有者和存储的卖家地址一致,同时手动设置合理的gasLimit值,规避gas估算失败的提示。
内容的提问来源于stack exchange,提问作者user2975934
相关产品推荐
相关产品推荐

