Skip to content

代币手续费系统

代币手续费是一个用于管理代币交易手续费的系统。本教程将介绍如何实现一个安全可靠的手续费系统。

功能特性

  • 费率管理
  • 费用计算
  • 费用分配
  • 收益管理
  • 紧急处理

合约实现

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

/**
 * @title TokenFee
 * @dev 代币手续费合约实现
 */
contract TokenFee is Ownable, ReentrancyGuard, Pausable {
    using SafeMath for uint256;

    // 费率信息
    struct FeeInfo {
        uint256 rate;           // 费率
        uint256 minFee;        // 最小费用
        uint256 maxFee;        // 最大费用
        bool isActive;         // 是否激活
        address collector;     // 收集者
    }

    // 收益信息
    struct RevenueInfo {
        uint256 totalFees;     // 总费用
        uint256 pendingFees;   // 待处理费用
        uint256 lastUpdate;    // 最后更新
        bool isProcessing;     // 是否处理中
    }

    // 配置信息
    struct FeeConfig {
        uint256 defaultRate;   // 默认费率
        uint256 maxRate;       // 最大费率
        uint256 minAmount;     // 最小金额
        bool requiresApproval; // 是否需要审批
        bool isActive;         // 是否激活
    }

    // 状态变量
    mapping(address => FeeInfo) public fees;                    // 费率
    mapping(address => RevenueInfo) public revenues;            // 收益
    mapping(address => bool) public operators;                  // 操作员
    mapping(address => bool) public exemptAddresses;            // 豁免地址
    FeeConfig public config;                                    // 配置信息
    uint256 public totalRevenue;                               // 总收益

    // 事件
    event FeeUpdated(address indexed token, uint256 rate, uint256 minFee, uint256 maxFee);
    event FeeCollected(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 fee);
    event RevenueProcessed(address indexed token, uint256 amount);
    event OperatorUpdated(address indexed operator, bool status);
    event ExemptAddressUpdated(address indexed account, bool status);
    event ConfigUpdated(uint256 defaultRate, uint256 maxRate, uint256 minAmount);

    /**
     * @dev 构造函数
     */
    constructor(
        uint256 _defaultRate,
        uint256 _maxRate,
        uint256 _minAmount
    ) {
        require(_defaultRate <= _maxRate, "Invalid rates");
        config = FeeConfig({
            defaultRate: _defaultRate,
            maxRate: _maxRate,
            minAmount: _minAmount,
            requiresApproval: true,
            isActive: true
        });
    }

    /**
     * @dev 设置费率
     */
    function setFee(
        address _token,
        uint256 _rate,
        uint256 _minFee,
        uint256 _maxFee,
        address _collector
    ) external onlyOperator whenNotPaused {
        require(_token != address(0), "Invalid token");
        require(_rate <= config.maxRate, "Rate too high");
        require(_minFee <= _maxFee, "Invalid fee range");
        require(_collector != address(0), "Invalid collector");

        fees[_token] = FeeInfo({
            rate: _rate,
            minFee: _minFee,
            maxFee: _maxFee,
            isActive: true,
            collector: _collector
        });

        emit FeeUpdated(_token, _rate, _minFee, _maxFee);
    }

    /**
     * @dev 计算手续费
     */
    function calculateFee(
        address _token,
        uint256 _amount
    ) public view returns (uint256) {
        if (config.minAmount > 0 && _amount < config.minAmount) {
            return 0;
        }

        FeeInfo storage feeInfo = fees[_token];
        if (!feeInfo.isActive) {
            return 0;
        }

        uint256 fee = _amount.mul(feeInfo.rate).div(10000);
        if (fee < feeInfo.minFee) {
            return feeInfo.minFee;
        }
        if (fee > feeInfo.maxFee) {
            return feeInfo.maxFee;
        }
        return fee;
    }

    /**
     * @dev 收取手续费
     */
    function collectFee(
        address _token,
        address _from,
        address _to,
        uint256 _amount
    ) external onlyOperator whenNotPaused returns (uint256) {
        require(_token != address(0), "Invalid token");
        require(_from != address(0), "Invalid from");
        require(_to != address(0), "Invalid to");
        require(_amount > 0, "Invalid amount");

        if (exemptAddresses[_from] || exemptAddresses[_to]) {
            return 0;
        }

        uint256 fee = calculateFee(_token, _amount);
        if (fee == 0) {
            return 0;
        }

        FeeInfo storage feeInfo = fees[_token];
        RevenueInfo storage revenue = revenues[_token];

        require(
            IERC20(_token).transferFrom(_from, address(this), fee),
            "Fee transfer failed"
        );

        revenue.totalFees = revenue.totalFees.add(fee);
        revenue.pendingFees = revenue.pendingFees.add(fee);
        revenue.lastUpdate = block.timestamp;
        totalRevenue = totalRevenue.add(fee);

        emit FeeCollected(_token, _from, _to, _amount, fee);
        return fee;
    }

    /**
     * @dev 处理收益
     */
    function processRevenue(
        address _token
    ) external onlyOperator whenNotPaused {
        FeeInfo storage feeInfo = fees[_token];
        RevenueInfo storage revenue = revenues[_token];
        require(feeInfo.isActive, "Fee not active");
        require(revenue.pendingFees > 0, "No pending fees");
        require(!revenue.isProcessing, "Already processing");

        revenue.isProcessing = true;
        uint256 amount = revenue.pendingFees;
        revenue.pendingFees = 0;

        require(
            IERC20(_token).transfer(feeInfo.collector, amount),
            "Transfer failed"
        );

        revenue.isProcessing = false;
        revenue.lastUpdate = block.timestamp;

        emit RevenueProcessed(_token, amount);
    }

    /**
     * @dev 批量处理收益
     */
    function batchProcessRevenue(
        address[] calldata _tokens
    ) external onlyOperator whenNotPaused {
        for (uint256 i = 0; i < _tokens.length; i++) {
            address token = _tokens[i];
            FeeInfo storage feeInfo = fees[token];
            RevenueInfo storage revenue = revenues[token];

            if (!feeInfo.isActive || revenue.pendingFees == 0 || revenue.isProcessing) {
                continue;
            }

            revenue.isProcessing = true;
            uint256 amount = revenue.pendingFees;
            revenue.pendingFees = 0;

            require(
                IERC20(token).transfer(feeInfo.collector, amount),
                "Transfer failed"
            );

            revenue.isProcessing = false;
            revenue.lastUpdate = block.timestamp;

            emit RevenueProcessed(token, amount);
        }
    }

    /**
     * @dev 获取费率信息
     */
    function getFeeInfo(
        address _token
    ) external view returns (
        uint256 rate,
        uint256 minFee,
        uint256 maxFee,
        bool isActive,
        address collector
    ) {
        FeeInfo storage feeInfo = fees[_token];
        return (
            feeInfo.rate,
            feeInfo.minFee,
            feeInfo.maxFee,
            feeInfo.isActive,
            feeInfo.collector
        );
    }

    /**
     * @dev 获取收益信息
     */
    function getRevenueInfo(
        address _token
    ) external view returns (
        uint256 totalFees,
        uint256 pendingFees,
        uint256 lastUpdate,
        bool isProcessing
    ) {
        RevenueInfo storage revenue = revenues[_token];
        return (
            revenue.totalFees,
            revenue.pendingFees,
            revenue.lastUpdate,
            revenue.isProcessing
        );
    }

    /**
     * @dev 设置操作员
     */
    function setOperator(
        address _operator,
        bool _status
    ) external onlyOwner {
        require(_operator != address(0), "Invalid operator");
        operators[_operator] = _status;
        emit OperatorUpdated(_operator, _status);
    }

    /**
     * @dev 设置豁免地址
     */
    function setExemptAddress(
        address _account,
        bool _status
    ) external onlyOwner {
        require(_account != address(0), "Invalid account");
        exemptAddresses[_account] = _status;
        emit ExemptAddressUpdated(_account, _status);
    }

    /**
     * @dev 更新配置
     */
    function updateConfig(
        uint256 _defaultRate,
        uint256 _maxRate,
        uint256 _minAmount,
        bool _requiresApproval
    ) external onlyOwner {
        require(_defaultRate <= _maxRate, "Invalid rates");
        config.defaultRate = _defaultRate;
        config.maxRate = _maxRate;
        config.minAmount = _minAmount;
        config.requiresApproval = _requiresApproval;
        emit ConfigUpdated(_defaultRate, _maxRate, _minAmount);
    }

    /**
     * @dev 暂停合约
     */
    function pause() external onlyOwner {
        _pause();
    }

    /**
     * @dev 恢复合约
     */
    function unpause() external onlyOwner {
        _unpause();
    }

    /**
     * @dev 紧急提取代币
     */
    function emergencyWithdraw(
        address _token,
        address _to,
        uint256 _amount
    ) external onlyOwner {
        require(_token != address(0), "Invalid token");
        require(_to != address(0), "Invalid recipient");
        require(_amount > 0, "Invalid amount");
        require(IERC20(_token).transfer(_to, _amount), "Transfer failed");
    }

    /**
     * @dev 操作员修饰器
     */
    modifier onlyOperator() {
        require(operators[msg.sender] || msg.sender == owner(), "Not operator");
        _;
    }
}

关键概念

费率管理

费率功能包括:

  • 费率设置
  • 费率计算
  • 费率验证
  • 费率调整

收益管理

收益功能包括:

  • 收益计算
  • 收益分配
  • 收益处理
  • 收益统计

豁免管理

豁免功能包括:

  • 豁免设置
  • 豁免验证
  • 豁免调整
  • 豁免记录

安全考虑

  1. 费率安全

    • 费率验证
    • 金额验证
    • 地址验证
    • 状态检查
  2. 收益安全

    • 收益验证
    • 分配验证
    • 处理验证
    • 状态保护
  3. 系统安全

    • 权限控制
    • 暂停机制
    • 重入防护
    • 状态同步
  4. 升级安全

    • 配置更新
    • 费率调整
    • 状态迁移
    • 紧急处理

最佳实践

  1. 费率管理

    • 费率验证
    • 金额控制
    • 状态追踪
    • 异常处理
  2. 收益管理

    • 收益验证
    • 分配控制
    • 处理优化
    • 状态管理
  3. 风险管理

    • 费率监控
    • 异常检测
    • 风险预警
    • 应急处理
  4. 系统维护

    • 参数优化
    • 性能监控
    • 安全审计
    • 升级预案

扩展功能

  1. 多币种费率
  2. 动态费率
  3. 分级费率
  4. 收益分红
  5. 费率激励

应用场景

  1. 交易手续费

    • 交易费用
    • 转账费用
    • 兑换费用
    • 操作费用
  2. 收益分配

    • 收益计算
    • 收益分配
    • 收益提取
    • 收益统计
  3. 生态激励

    • 费率优惠
    • 交易返利
    • 持币激励
    • 生态建设

总结

代币手续费系统是DeFi生态的重要组件。通过本教程,你可以:

  • 实现费率管理
  • 优化收益分配
  • 控制交易成本
  • 提供激励机制

常见问题解答(FAQ)

基础概念

Q: 什么是代币手续费?

A: 代币手续费是一种收益管理机制,主要特点包括:

  • 自动收取交易费用
  • 支持多种费率设置
  • 灵活的分配机制
  • 维护系统运营
  • 激励生态发展

Q: 手续费有哪些类型?

A: 主要类型包括:

  • 固定费率型
  • 动态费率型
  • 阶梯费率型
  • 混合费率型
  • 优惠费率型

操作相关

Q: 如何设置手续费?

A: 设置步骤包括:

  • 确定费率类型
  • 设置费率参数
  • 配置分配规则
  • 实施收费机制
  • 监控费用流向

Q: 如何优化收费效果?

A: 优化方法包括:

  • 调整费率结构
  • 优化分配比例
  • 设置优惠机制
  • 实施激励计划
  • 保持市场竞争力

安全相关

Q: 手续费机制有哪些风险?

A: 主要风险包括:

  • 费率设置不当
  • 分配不合理
  • 合约漏洞
  • 绕过收费
  • 市场影响

Q: 如何确保收费安全?

A: 安全措施包括:

  • 多重签名控制
  • 费率上限控制
  • 分配权限管理
  • 收费记录审计
  • 应急暂停机制

Released under the MIT License by Vogeb.