求助: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函数,完成对你合约地址的授权,具体步骤:
- 用户调用代币合约的
approve(spender, amount)方法,其中spender填你的合约地址,amount填允许合约花费的代币数量。 - 授权完成后,用户再调用你合约内的转账/交易函数,此时合约即可通过
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
相关产品推荐
相关产品推荐

