如何编写要求调用者持有指定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
相关产品推荐
相关产品推荐

