通过 TronWeb 在 TRON 上以编程方式发送 USDT — TRON Wiki

通过 TronWeb 在 TRON 上以编程方式发送 USDT

11 分钟阅读 · ⌘K 搜索

在 TRON 上自动化支付USDT — 工资、提款、商家退款 — 需要通过 TronWeb 或原始 HTTP API 构建签名的 TRC-20 transfer 交易。当您正确处理能源和安全性时,TRON 的约 3 秒最终确定性使程序化 USDT 成为高吞吐量结算的理想选择。

本指南涵盖从后端服务的端到端 USDT 发送。

先决条件{#先决条件}

  • TronWeb + TronGrid API 密钥
  • 带有USDT余额+TRX或冻结能量的热钱包
  • 官方USDT合约:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
  • 每次发送前进行地址验证
热钱包风险
自动签名密钥是盗窃目标。使用 HSM、MPC 或具有最低余额的专用支付服务器。

金额换算

USDT 使用 6 位小数

代码
function toUsdtBaseUnits(humanAmount) {
  return Math.round(Number(humanAmount) * 1e6);
}

function fromUsdtBaseUnits(base) {
  return Number(base) / 1e6;
}

对于大值,首选 BigInt。

使用 TronWeb 进行基本传输

代码
const TronWeb = require('tronweb');

const tronWeb = new TronWeb({
  fullHost: 'https://api.trongrid.io',
  privateKey: process.env.PAYOUT_PRIVATE_KEY,
  headers: { 'TRON-PRO-API-KEY': process.env.TRONGRID_KEY },
});

const USDT = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t';

async function sendUsdt(toAddress, amountHuman) {
  if (!tronWeb.isAddress(toAddress)) {
    throw new Error('Invalid TRON address');
  }

  const contract = await tronWeb.contract().at(USDT);
  const amount = toUsdtBaseUnits(amountHuman);

  const txid = await contract.transfer(toAddress, amount).send({
    feeLimit: 100_000_000,
    callValue: 0,
    shouldPollResponse: true,
  });

  return txid;
}

能量和费用限制

  • feeLimit设置得足够高以避免OUT_OF_ENERGY(100个TRX太阳单位共同起点 - 根据经验进行调整)。
  • 监控发送器能量:tronWeb.trx.getAccountResources(address)
  • 冻结支付钱包上的 TRX 以获取可预测的费用

面向用户的费用上下文:如何发送USDTTRC-20

幂等性和安全性

生产支付系统需要:

控制目的
幂等键防止重试时重复发送
余额预检转账前【查询余额】(/zh/articles/query-trc20-balance-api/)
允许名单可选的收件人验证
每日最大交易量限制热钱包暴露
发送日志存储每个付款请求的 txid

确认发货

播出后:

代码
const info = await tronWeb.trx.getTransactionInfo(txid);
// info.receipt.result === 'SUCCESS'

完整模式:验证交易 API

TransferFrom 模式(托管){#transferfrom}

如果用户批准了您的合同/支出者:

代码
await contract.transferFrom(userAddress, toAddress, amount).send({ feeLimit: 100_000_000 });

需要用户事先提供approve——这在 DeFi 中很常见,在简单支付中很少见。

错误处理

错误行动
OUT_OF_ENERGY充值TRX或冻结更多TRX
REVERT查看余额、合约暂停、黑名单
重复幂等性 — tx 可能已经存在
地址无效在 API 验证层拒绝

在 Shasta {#shasta} 上测试

在 Shasta 上部署带有 6 位小数的模拟 TRC-20 或使用测试代币。切勿使用存储库中的主网私钥进行测试。

合规说明

自动USDT转移可能会触发反洗钱义务,具体取决于司法管辖区。这是技术文档,而不是法律建议。

生产中的错误处理

.send() 包裹在 try/catch 中。失败时,在重试之前获取getTransactionInfo——部分广播在TRON上很少见,但幂等性很重要。记录调整热钱包上冻结的 TRX 金额所消耗的能量。

TronLink 与服务器签名

浏览器应用程序应使用 TronLink window.tronWeb 作为用户控制的按键。服务器支付扫描在TronWeb构造函数中使用私钥——隔离在VPC中,永远不会暴露给前端。多重签名金库需要帐户权限工作流程而不是单密钥TronWeb。

相关指南 {#相关}

常见问题解答

一次USDT传输需要多少能量?

当接收者已经持有 USDT 时,主网上约 65,000 能量用于标准 TRC-20 传输。首次接收者的费用可能会更高。

我可以在同一个钱包中发送USDT而不发送TRX吗?

发送账户需要能量或TRX来燃烧费用。单独USDT无法支付网络资源。

如何批量付款?

具有速率限制的循环 - TRON 没有本机 ERC-4337 批处理。考虑具有并发上限的队列工作线程。

不需要。服务器直接通过TronWeb使用私钥。

以编程方式发送的地址错误?

不可逆转。验证 tronWeb.isAddress() 并可选择确认校验和模式。