ERC20代币的转移需要遵循ERC20标准接口,即调用代币合约的transferFrom(address from, address to, uint256 amount)或transfer(address to, uint256 amount)函数(取决于代币是否允许合约转出,通常使用transferFrom,并需要先授权)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract ContractWallet {
address public owner;
IERC20 public immutable token; // 假设我们针对特定代币,或可以动态传入
constructor(address _tokenAddress) {
owner = msg.sender;
token = IERC20(_tokenAddress);
}
// 转出ERC20代币函数
function transferToken(address recipient, uint256 amount) external onlyOwner {
require(recipient != address(0), "ContractWallet: recipient is the zero address");
require(token.balanceOf(address(this)) >= amount, "ContractWallet: insufficient token balance");
// 假设合约已经获得了足够的allowance
bool success = token.transferFrom(msg.sender, recipient, amount); // 注意:这里msg.sender应该是授权者,通常是钱包本身或其控制者
// 更常见的可能是:token.transfer(recipient, amount); 如果代币合约允许直接转出
// 但更严谨的是,钱包需要先被授权,然后调用transferFrom
// 这里简化示例,实际中需要处理allowance逻辑
require(success, "ContractWallet: Token transfer failed");
}
modifier onlyOwner() {
require(msg.sender == owner, "ContractWallet: caller is not the owner");
_;
}
}