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

如何在Solidity智能合约中区分买卖双方并识别BSC链代币购买行为

在BSC链Solidity代币合约中准确识别用户买入操作的实现方案

核心判定逻辑

BSC链上以PancakeSwap为代表的DEX买入代币的本质是:流动性配对合约将代币转账给发起兑换的普通用户地址,你可以基于这一特征做买入判定。

  • 基础判定规则:转账的发起方(from)为已登记的DEX流动性配对合约,转账接收方(to)为未被排除在检测外的普通用户地址
  • 要避免误判,需要提前排除项目方地址、合约地址、中心化交易所充值地址等特殊地址的检测

具体实现步骤

  1. 提前登记流动性配对地址
    你完成代币流动性添加后,将生成的DEX配对合约地址存入合约状态变量,如果后续要上线多个DEX,可以用映射存储所有合法配对地址:
// 单DEX场景用不可变变量存储
address public immutable pancakePair;
// 多DEX场景用映射存储
mapping(address => bool) public isRegisteredPair;
// 排除检测的地址名单
mapping(address => bool) public isExcludedFromBuyCheck;
  1. 重写ERC20的_transfer方法做逻辑拦截
    所有代币转账都会经过_transfer方法,你可以在原生转账逻辑执行前做买入判定,触发自定义逻辑:
function _transfer(
    address from,
    address to,
    uint256 amount
) internal virtual override {
    // 判定是否为有效买入操作
    bool isUserBuy = isRegisteredPair[from] 
        && !isExcludedFromBuyCheck[to]
        && to.code.length == 0; // 额外校验接收方是普通EOA地址,排除合约地址转账
    
    if (isUserBuy) {
        // 此处写入你需要触发的自定义逻辑,比如收交易税、发放空投、解锁权益等
        _handleBuyBehavior(to, amount);
    }

    // 执行原生ERC20转账逻辑
    super._transfer(from, to, amount);
}

注意事项

  • 部署合约后,第一时间将项目方钱包、代币合约自身、质押/挖矿合约、合作方地址等特殊地址加入isExcludedFromBuyCheck排除名单,避免误触发买入逻辑
  • 不要只依赖转账发起方是否为配对地址做判定,必须添加接收方校验规则,否则配对合约之间的代币划转、套利机器人的合约地址转账都会被判定为普通用户买入
  • 如果你的代币存在预挖、空投类的定向转账,也要提前把这类操作的发起方加入排除名单,避免和真实买入行为混淆

内容的提问来源于stack exchange,提问作者Gualther

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:48:03