使用Python发送TRC20 USDT遇FAILED-OUT OF ENERGY错误求助
解决TRC20 USDT转账提示"OUT OF ENERGY"的问题
核心原因解析
"OUT OF ENERGY"的本质不是fee_limit设置不足,而是发送地址没有足够的TRX支付转账所需的能量消耗。波场网络中,TRC20代币转账需要消耗能量(Energy),能量可通过冻结TRX获取,也可直接用TRX抵扣(无冻结能量时,会自动扣除对应TRX支付能量费用)。你必须确保发送地址持有足够的TRX(至少0.1 TRX以上,留作手续费),否则即使调高fee_limit也会失败。
代码优化方案
假设你使用的是tronpy库,基于你的代码给出以下关键优化:
校验地址格式
确保receiver_address和sender_address都是波场标准T开头地址,避免使用hex格式地址引发错误。添加余额前置校验
构建交易前检查发送地址的TRX余额,提前规避余额不足问题:# 检查发送地址TRX余额(单位:SUN) balance = client.get_account_balance(sender_address) if balance < 100000: # 至少保留0.01 TRX作为手续费 raise ValueError("发送地址TRX余额不足,无法支付能量费用")显式设置call_value
TRC20的transfer是non-payable函数,需明确指定call_value=0,避免库默认值引发异常:txn = ( contract.functions.transfer(receiver_address, amount_in_sun) .with_owner(sender_address) .fee_limit(50_000_000) .call_value(0) # 符合non-payable函数要求,显式设为0 .build() .sign(private_key) )使用完整合约ABI
替换现有ABI片段为Tronscan上获取的TRC20 USDT完整ABI,避免潜在的函数签名匹配错误。
额外排查要点
- 查看交易详情中的"Energy Used"和"Energy Limit",确认实际消耗能量是否超出
fee_limit对应的额度; - 确认发送地址是否冻结了足够TRX获取能量,若无冻结,需保证地址有足够TRX用于自动抵扣能量费用。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

