老陈上周TPWallet里把一只像素头像转给朋友,点开资产页,选里面NFT,按了“发送”,填了对方0x地址,Gas调到默认。十分钟后区块浏览器显示成功,朋友那边却没收到的。他以为tpwallet转让NFT操作就是普通代币转账。
忽略了NFT合约里的safeTransferFrom需要先授权,也忽略了网络选错。那次他选的是BSC,NFT却在Polygon上,资产页看得见,是因为钱包加了自定义网络,发送时默认网络没切过去。我让他把交易哈希贴出来。浏览器里确实有一笔合约调用,目标合约就是他之前授权过的市场合约。TPWallet的NFT转让一般有两种路径,站内直接发送,或跳转市场挂单后转移。直接发送适合同链、同标准,ERC-721和ERC-1155了;跨链、跨标准就容易出岔子。
选NFT后要看三件事。链名称、合约地址、Token ID。少一个,接收方可能只看到一笔无意义的合约交互。
重新操作时,他把网络切到Polygon,Gas费显示0.03 MATIC,约几毛钱吧?点确认后,TPWallet弹出授权请求,他一开始想关掉,以为又是骗签。其实ERC-721的转移需要调用setApprovalForAll或safeTransferFrom,钱包只是把权限范围写清楚。这里有个细节,NFT在挂单状态。得先去市场取消的,不然资产页会显示“锁定”。
他那只头像之前挂过Opensea,忘了下架,难怪发送按钮是灰的。成功那笔到账后,朋友在TPWallet里刷新了三次才显示。
链上确认和钱包缓存不是一回事。特别的Polygon浏览器已经确认了,钱包资产页还可能延迟。我的判断是做TPWallet里的NFT转让操作。不要只盯“发送”按钮。先核对链、合约、Token ID的,再看Gas是否够呢?还要确认接收地址支持该NFT标准。
老陈后来把常用网络置顶,转账前截图核对的,第二次转同一系列NFT只花了二十秒。省下的不是时间,是避免把唯一版NFT送进黑洞的代价。