You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:18:27