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

求助:IERC20授权未设置额度,Allowance始终返回0

IERC20授权无效问题分析与解决

核心问题原因

你在合约内调用approve的逻辑完全错误——IERC20标准的approve函数要求调用者必须是代币的持有者(即持有该代币的外部用户钱包地址),而非你的合约地址。

当你通过合约的approveTransfer函数调用代币的approve时,此时的调用者是你的合约本身,而合约并没有持有用户钱包里的代币,所以这个授权操作根本不会生效,查询allowance自然始终返回0。

你尝试的方案为什么都没用

  • 两种approve写法(token.call(abi.encode...)和IERC20(token).approve(...))本质一致,都是以合约地址作为msg.sender发起授权,不符合approve的调用者要求。
  • 尝试授权给合约_owner地址也无效,因为_owner并非持有代币的用户地址,只有代币的实际持有者(用户自己的钱包)才能发起有效的授权操作。

正确的解决流程

必须让用户直接通过钱包工具(如MetaMask、Ethers.js等)调用目标代币合约的approve函数,完成对你合约地址的授权,具体步骤:

  1. 用户调用代币合约的approve(spender, amount)方法,其中spender填你的合约地址,amount填允许合约花费的代币数量。
  2. 授权完成后,用户再调用你合约内的转账/交易函数,此时合约即可通过transferFrom完成代币转移:

合约内正确的转账函数示例

function transferTokens(uint256 _token, uint256 _amount, address _recipient) external {
    address token = tokenAddresses[_token];
    bool success = IERC20(token).transferFrom(msg.sender, _recipient, _amount);
    require(success, "Token transfer failed");
}

关于你的getAllowance函数

你的getAllowance函数逻辑是正确的,它查询的是msg.sender(用户地址)对你合约地址的授权额度。之前返回0是因为所有授权操作都不是用户本人发起的,所以没有有效授权记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:06:27