如何将多个钱包的ERC-721代币批量归集至单个钱包?
能否通过单笔交易完成多钱包到单钱包的ERC-721转账
原生场景下无法直接实现。
EVM兼容链的单笔交易仅存在唯一的交易签名者(即msg.sender),交易执行时仅能获得签名者的操作权限,无法在单交易内同时获取多个独立钱包的操作授权,因此不可能在无提前设置的前提下,靠单笔交易让多个钱包主动转出ERC-721代币到目标地址。
50+枚分散ERC-721快速归集的可行方案
方案1:预授权+批量归集合约(综合成本最低、速度最快)
这是当前NFT批量归集最通用的方案,最终执行归集只需要1笔链上交易,具体流程:
- 先逐个登录持有NFT的钱包,对部署好的批量归集合约执行
setApprovalForAll授权,允许合约转移对应钱包下的目标系列ERC-721代币 - 授权完成后,用任意地址(可直接用你要归集的目标钱包地址)发起单笔交易,调用合约的批量归集函数,即可一次性把所有已授权钱包下的指定NFT全部转到目标地址
你只需要部署一个极简的无状态批量转账合约即可满足需求,核心逻辑参考:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC721 { function transferFrom(address from, address to, uint256 tokenId) external; } contract NFTBatchCollector { address public immutable owner; // 部署时指定合约控制人,避免非授权用户调用 constructor() { owner = msg.sender; } function batchCollect( address nftAddr, address[] calldata fromList, uint256[] calldata tokenIdList, address recipient ) external { require(msg.sender == owner, "No permission"); require(fromList.length == tokenIdList.length, "Param length mismatch"); for(uint256 i = 0; i < tokenIdList.length; i++) { IERC721(nftAddr).transferFrom(fromList[i], recipient, tokenIdList[i]); } } }
这个合约无资产托管风险,仅会在你主动调用时,转移你提前授权过的NFT,不会触碰钱包内其他资产。总Gas成本比逐个钱包、逐个NFT转账低60%以上。
如果觉得逐个发授权交易麻烦,也可以用批量交易工具把所有钱包的授权操作打包成多笔交易在同一区块快速确认,整体操作耗时不会超过5分钟。
方案2:Permit签名免授权归集(仅适用于支持EIP-2612的NFT合约)
如果你持有的ERC-721合约实现了EIP-2612 permit签名授权标准,你不需要给每个钱包发链上授权交易,只需要在本地给每个持有NFT的钱包生成授权签名,把所有签名作为参数传给归集合约,合约可以在单笔交易内完成签名验证、授权、转账全流程,全程仅需1笔链上交易。
这个方案的局限性是通用性差,2022年之前部署的绝大多数ERC-721合约都没有实现permit接口,无法使用。
方案3:无合约批量转账(操作门槛最低)
如果不想部署合约,可以直接用支持批量交易的钱包工具,为每个持有NFT的钱包打包一笔批量转账交易,一次性转出该钱包下所有需要归集的NFT。总交易数等于你持有NFT的钱包数量,比逐个转NFT的效率高很多,适合钱包数量少于5个、NFT总量不大的场景。
选型建议
如果分散NFT的钱包数量少于5个,直接用批量转账工具即可,不需要部署合约;如果钱包数量多、NFT总量大,优先选方案1,成本和效率最优。
内容的提问来源于stack exchange,提问作者pickselated

