如何用Remix实现ERC20合约要求转账时支付ETH到指定地址作为手续费
实现带ETH前置支付的ERC20转账功能(Remix开发流程)
一、核心合约代码实现
基于OpenZeppelin的ERC20标准合约扩展,添加支付验证逻辑,直接复制可用:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract PayToTransferERC20 is ERC20 { // 固定接收ETH的目标地址(部署时指定) address public immutable payTarget; // 记录已完成ETH支付的钱包地址 mapping(address => bool) public hasPaid; // 要求支付的ETH金额(可自行调整,此处为0.01 ETH) uint256 public constant REQUIRED_ETH = 0.01 ether; constructor(address _payTarget) ERC20("PayToken", "PTK") { payTarget = _payTarget; // 给部署者 mint 测试代币 _mint(msg.sender, 1000 * 10 ** decimals()); } // 处理ETH转账的核心函数 receive() external payable { require(msg.value == REQUIRED_ETH, "必须支付指定金额的ETH"); require(!hasPaid[msg.sender], "该地址已完成支付"); hasPaid[msg.sender] = true; // 将收到的ETH转至目标地址 (bool success,) = payTarget.call{value: msg.value}(""); require(success, "ETH转至目标地址失败"); } // 重写ERC20转账函数,添加支付验证 function transfer(address to, uint256 amount) public override returns (bool) { require(hasPaid[msg.sender], "需先支付ETH才能转账"); return super.transfer(to, amount); } // 重写授权转账函数,同样验证支付状态 function transferFrom(address from, address to, uint256 amount) public override returns (bool) { require(hasPaid[from], "转账发起方需先支付ETH"); return super.transferFrom(from, to, amount); } }
代码关键说明
payTarget:部署时传入的固定ETH接收地址,不可修改hasPaid:标记哪些钱包已经完成前置支付,解锁转账权限receive():处理ETH支付请求,验证金额后更新支付状态,并将ETH转至目标地址- 重写的
transfer/transferFrom:拦截未支付地址的转账请求
二、Remix开发操作步骤
1. 创建合约文件
打开Remix在线编辑器,左侧文件管理器点击「+」,新建PayToTransferERC20.sol文件,粘贴上述代码。
2. 导入OpenZeppelin依赖
Remix会自动识别导入语句,点击左侧「Dependencies」标签,选择「Install OpenZeppelin Contracts」,安装与代码pragma版本匹配的合约包(选0.8.20系列)。
3. 编译合约
切换到左侧「Solidity Compiler」标签:
- 选择编译器版本为
0.8.20+commit.a1b79de6(与代码声明一致) - 点击「Compile PayToTransferERC20.sol」,确认编译无报错。
4. 部署合约
切换到左侧「Deploy & Run Transactions」标签:
- 环境选择「Remix VM (London)」(测试用,也可切换到测试网)
- 在Deploy按钮上方的输入框,填入你指定的ETH接收地址(比如你的测试钱包地址)
- 点击「Deploy」,完成合约部署。
5. 功能测试
步骤1:验证未支付时无法转账
切换到另一个测试账户(比如Account 1),调用transfer函数输入目标地址和金额,会触发报错「需先支付ETH才能转账」,验证限制生效。
步骤2:支付ETH解锁权限
在Account 1界面,点击「Send Ether & Tokens」,接收地址填合约地址,金额输入0.01、单位选ETH,发送交易。交易完成后调用hasPaid函数,传入Account 1地址,返回值为true。
步骤3:验证转账功能
用Account 1再次调用transfer函数,输入目标地址和金额,交易成功执行,转账生效。
三、可选调整说明
- 如果需要每次转账都支付ETH,而非一次支付永久解锁:删除
hasPaid映射,在transfer函数中要求附带ETH,直接将ETH转至目标地址(此方式会改变ERC20标准流程,需谨慎)。 - 可修改
REQUIRED_ETH的值,调整前置支付的ETH金额。
内容的提问来源于stack exchange,提问作者paul somto
相关产品推荐
相关产品推荐

