使用ethers.js调用USDT transferFrom触发NUMERIC_FAULT underflow错误求助
问题分析与解决方案
错误根源
你遇到的NUMERIC_FAULT-underflow错误,并非来自transferFrom的金额参数,而是gasPrice的计算方式导致的:
ethersProvider.getGasPrice()返回的是BigNumber类型,直接用*1.2会将其转为带小数的浮点数(比如错误信息里的178193613693.6)- ethers的
BigNumber仅支持整数运算,当尝试将带小数的浮点数转为BigNumber时,就会触发下溢错误。 - BSC链未报错只是巧合(计算后的gasPrice刚好为整数),Polygon链的gasPrice乘以1.2后出现小数,直接触发了问题。
修复方案
将gasPrice的计算改为使用BigNumber的整数运算方法(mul和div),彻底避免浮点数操作:
const gasPrice = (await ethersProvider.getGasPrice()).mul(12).div(10);
额外验证点
虽然金额参数本身无问题,但可以额外确认:
- 确保
token.balanceRaw是纯数字字符串或整数,不要包含小数 - 使用
ethers.utils.parseUnits时,传入的金额字符串需精确到对应小数位,比如USDT(6位小数)传入"11.484059"是正确的:const value = ethers.utils.parseUnits(token.balance.toString(), token.decimals);
内容的提问来源于stack exchange,提问作者Hahan't
相关产品推荐
相关产品推荐

