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

使用tronpy转账TRC20代币失败,求问题排查及解决方案

问题分析

你的TRC20转账失败主要源于以下几个关键问题:

  1. 未设置足够的手续费上限(fee_limit):TRON智能合约交易必须指定fee_limit以覆盖合约执行的手续费消耗,你注释掉了该配置,默认值不足以支撑TRC20转账的手续费需求,导致交易失败。
  2. 地址格式不匹配:TRC20合约的transfer函数要求_to参数为十六进制格式地址(不带0x前缀),你传入的是Base58格式地址,合约无法识别目标地址。
  3. 手动设置ABI冗余且存在风险:tronpy的get_contract方法会自动从链上拉取合约ABI,手动覆盖ABI可能因版本不一致引发执行错误。

修正后的代码

以下是仅用tronpy完成TRC20转账的正确实现:

import codecs
from tronpy.keys import PrivateKey
from hexbytes import HexBytes
from tronpy import Tron

class TronTRC20Transfer:
    def __init__(self):
        # 初始化Tron客户端,此处为Nile测试网,主网替换为"mainnet"
        self._tron = Tron(network="nile")

    def transfer_trc20(self, private_key: str, to_address_base58: str, amount: int, contract_address_base58: str) -> HexBytes:
        pk = PrivateKey(bytes.fromhex(private_key))
        owner_address = pk.public_key.to_base58check_address()

        # 自动拉取合约ABI,无需手动指定
        contract = self._tron.get_contract(contract_address_base58)

        # 将Base58地址转换为合约要求的十六进制格式
        to_address_hex = self._tron.to_hex_address(to_address_base58)

        # 构建并签名交易:USDT小数位为6,amount需传入最小代币单位(如1 USDT对应1000000)
        tx = (
            contract.functions.transfer(to_address_hex, amount)
            .with_owner(owner_address)
            .fee_limit(10_000_000)  # 设置10 TRX作为手续费上限(1 TRX = 1e6 SUN)
            .build()
            .sign(pk)
        )

        broadcasted_tx = tx.broadcast().wait()
        return HexBytes(codecs.decode(broadcasted_tx['id'], 'hex_codec'))

# 使用示例
if __name__ == "__main__":
    transfer_handler = TronTRC20Transfer()
    tx_hash = transfer_handler.transfer_trc20(
        private_key="你的私钥十六进制字符串",
        to_address_base58="目标地址的Base58格式",
        amount=1000000,  # 转账1 USDT
        contract_address_base58="TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf"
    )
    print(f"交易哈希: {tx_hash.hex()}")

关键注意事项

  • 金额单位:TRC20 USDT的小数位为6,转账时需将实际金额乘以10^6(如转1 USDT需传入1000000)。
  • fee_limit配置:建议设置至少10 TRX(即10_000_000 SUN)作为手续费上限,确保覆盖合约执行成本。
  • 地址转换:始终使用tronpy内置的to_hex_address/to_base58_address方法转换地址格式,避免手动处理出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:45:33