ERC20已完成授权仍提示transfer amount exceeds allowance错误如何解决
问题原因
- 授权主体和对象反向:ERC20的
approve方法规则是代币持有方调用,给*需要划转其代币的第三方地址(spender)*授予可操作额度。你当前代码中是合约自身作为调用方,给tokenHolder授权了10单位的额度,相当于允许tokenHolder划转你合约的代币,但你后续transferFrom的逻辑是要从tokenHolder地址划转代币到你的合约,该操作要求的是tokenHolder提前给你的合约地址授权,和你当前的授权操作逻辑完全反向。 - 代币精度计算错误:从日志可判断你操作的是以太坊主网USDC,该代币小数位为6位,所有转账、授权的数值单位都是代币最小单位(也就是1枚USDC对应1000000个最小单位)。你当前授权传入的数值是10(仅对应0.00001枚USDC),远低于你要转账的1枚USDC所需的1000000最小单位,自然触发额度不足报错。
解决方案
- 调整授权发起方:改为由
tokenHolder地址(日志中对应0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F)在链下发起approve交易,授权对象为你的合约地址,不要由合约主动发起授权操作。 - 修正数值精度:授权和转账的数值都需要乘以对应代币的小数位,比如要授权10枚USDC,传入的数值应为
10 * 10 ** 6 = 10000000;要转账1枚USDC,传入的数值应为1 * 10 ** 6 = 1000000,不要直接按整数枚数值传入。 - 增加前置校验:调用
transferFrom前先调用ERC20的allowance(tokenHolder, address(this))方法查询实际可用授权额度,和待转账数值对比,提前识别额度不足问题。
内容的提问来源于stack exchange,提问作者taranchik
相关产品推荐
相关产品推荐

