You need to enable JavaScript to run this app. 如何编写要求调用者持有指定ERC20代币才可调用的合约函数
优惠活动
大模型
产品
解决方案
定价
更多

如何编写要求调用者持有指定ERC20代币才可调用的合约函数

实现方案

你可以通过调用ERC20标准合约的balanceOf方法来校验调用者的代币持有量,具体实现步骤如下:

  • 第一步:在你的合约中引入ERC20标准接口,最小实现仅需要包含balanceOf查询方法即可,示例如下:
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
}
  • 第二步:声明你要校验的目标ERC20代币的合约实例,如果要校验的就是当前合约自身发行的ERC20代币,可跳过这一步,直接使用合约内部存储的余额映射即可。
// 替换为你要校验的ERC20代币的实际合约地址
IERC20 public constant TARGET_TOKEN = IERC20(0xYourERC20ContractAddressHere);
  • 第三步:在需要权限控制的函数中添加校验逻辑,示例如下:
function yourRestrictedFunction() external {
    // 假设目标代币小数位为18,1枚代币对应 1 * 10 ** 18,等价于 1 ether 的数值大小
    require(TARGET_TOKEN.balanceOf(msg.sender) >= 1 * 10 ** 18, "Insufficient token balance");
    // 你的函数后续逻辑
}

特殊情况:校验当前合约自身发行的ERC20

如果你要校验的代币就是当前合约本身发行的,你可以直接复用合约内的余额映射,逻辑和你校验ETH余额的写法几乎一致:

// 假设你的合约内已经定义了ERC20的余额映射 balances
function yourRestrictedFunction() external {
    // 同样注意匹配代币的小数位设置
    require(balances[msg.sender] >= 1 * 10 ** 18, "Insufficient token balance");
    // 你的函数后续逻辑
}

注意:一定要确认目标ERC20代币的小数位(decimals)参数,部分代币小数位可能是6或者其他数值,1枚代币对应的最小单位数值需要按1 * 10 ** decimals计算,不要直接写>=1,否则会出现校验逻辑不符合预期的问题。

内容的提问来源于stack exchange,提问作者Brian Lee Victory

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 08:15:05