如何自动将子钱包的ETH及ERC20代币转入父钱包?(已知ETH实现方法)
ERC20代币自动转入父钱包的实现方案
嘿,这个需求挺实用的,我来给你详细说说ERC20代币自动转发到父钱包的实现思路~
首先得明确:ERC20代币和ETH的转账机制不一样——ETH转入合约时会触发receive()或fallback()函数,但ERC20代币的transfer操作只会更新代币合约的余额,不会主动触发接收方合约的任何函数,所以没法像ETH那样完全被动自动转发,得结合主动调用或自动化工具来实现。
核心实现代码
首先我们需要基于ERC20的标准接口来编写转账逻辑,推荐用OpenZeppelin的安全库来避免非标准代币的坑:
1. 基础版(单个代币转发)
// 引入OpenZeppelin的安全ERC20工具,处理非标准代币 import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract ChildWallet { // 用SafeERC20封装IERC20,自动处理转账安全检查 using SafeERC20 for IERC20; // 父钱包地址,部署后不可修改 address public immutable parentWallet; constructor(address _parentWallet) { parentWallet = _parentWallet; } // ETH自动转发逻辑(你已经掌握的部分) receive() external payable { payable(parentWallet).transfer(address(this).balance); } // 转发指定ERC20代币到父钱包 function forwardERC20(address token) external { // 获取当前合约持有该代币的余额 uint256 tokenBalance = IERC20(token).balanceOf(address(this)); if (tokenBalance > 0) { // 用safeTransfer替代transfer,兼容不返回bool的非标准代币 IERC20(token).safeTransfer(parentWallet, tokenBalance); } } }
2. 进阶版(批量转发多个代币)
如果需要同时处理多种ERC20代币,可以加一个批量处理函数:
function forwardMultipleERC20(address[] calldata tokens) external { for (uint256 i = 0; i < tokens.length; i++) { address token = tokens[i]; uint256 balance = IERC20(token).balanceOf(address(this)); if (balance > 0) { IERC20(token).safeTransfer(parentWallet, balance); } } }
实现“自动”转发的两种方式
因为ERC20不会主动触发合约函数,所以需要额外手段触发forwardERC20:
- 前端主动调用:如果是你的用户向子钱包转代币,可以在前端转账完成后,自动调用子钱包的
forwardERC20函数,实现即时转发。 - 自动化工具触发:如果需要完全无人值守,可以用Chainlink Keepers这类链上自动化服务,设置一个检查条件:当子钱包持有某ERC20代币余额>0时,自动调用转发函数。也可以用外部服务(比如自己写个监听脚本)订阅链上Transfer事件,发现子钱包收到代币后触发转发逻辑。
注意事项
- 一定要用
SafeERC20的safeTransfer,避免遇到那些不遵循ERC20标准(比如转账不返回bool、失败不回滚)的代币,导致转账失败或资金卡住。 - 如果你需要监听所有可能转入的ERC20代币,可以通过链上事件监听服务订阅所有转到子钱包地址的ERC20 Transfer事件,再触发转发逻辑。
内容的提问来源于stack exchange,提问作者Strikers
相关产品推荐
相关产品推荐

