跳转到内容

TRC20 手续费代付:TronFuel 与 Paymaster

问题所在:没有 TRX,代币就动不了

Section titled “问题所在:没有 TRX,代币就动不了”

一笔 TRC20 转账是一次智能合约调用。TRON 会为此收取 energy 和 bandwidth 费用,一个地址要么通过燃烧 TRX 来支付这些资源成本,要么使用自己质押或被委托而获得的资源。代币本身永远不会为此付费。

这就带来了每一个 TRON 集成迟早都会遇到的情况:一位客户把 USDT 存入一个刚创建的地址。这个地址此时只持有代币,别无他物。把这些代币继续转出会失败,返回状态码 422,消息为 balance is not sufficient,因为没有 TRX 可以支付资源成本。提前为每一个存款地址充值 TRX 可以解决这个问题,但这会把 TRX 锁在一些可能永远用不上的地址里。

代付手续费从另一个方向解决了这个问题:由第三方支付资源成本,钱包发送代币时始终不需要持有 TRX。

我们目前推荐使用 TronFuel。它以批量方式从质押者那里租用 energy,而不是燃烧 TRX,节省下来的成本正是来自这里,相比直接燃烧更加划算。相关背景见博客文章《TRON TRC-20 交易手续费最多可节省 60%》

TronFuel 是一个独立的服务。它在 Chaingateway API 内部没有对应的接口,因此本文档不涉及它的具体调用方式。请通过上面的链接查阅它自己的文档。

Chaingateway 的 Paymaster 曾在 API 内部完成同样的工作:它承担 bandwidth 和 energy 的费用,使钱包无需持有 TRX 就能发送 TRC20 代币,并把成本计入你账户的信用额度。

这项服务已被弃用。已经在调用 Paymaster 接口的现有集成仍可以正常运行,出于这个原因,下面依然保留了这些接口的文档。请不要在它们之上构建新的集成。

接口用途
POST /v2/tron/paymaster创建一个代付交易请求
GET /v2/tron/paymaster列出你的请求及其状态
GET /v2/tron/paymaster/{id}读取单个请求
POST /v2/tron/paymaster/estimate预估 energy、bandwidth 和手续费
GET /v2/tron/paymaster/balance查询剩余的信用额度

一笔交易需要多少 energy 和 bandwidth,取决于交易类型以及它调用的合约,因此这个数字并不固定。POST /v2/tron/paymaster/estimate 接受与请求本身相同的参数体,并返回这笔交易预计花费多少。

Terminal window
curl --request POST\
--url https://api.chaingateway.io/v2/tron/paymaster/estimate\
--header 'Accept: application/json'\
--header 'content-type: application/json'\
--header 'Authorization: YOUR_API_TOKEN'\
--data '{
"type": "TRC20",
"from": "TLkkCeNdJKPNUwucdro84WjswkzM62LCTH",
"to": "TUwmZghA7u2GxGxKaxM1mkCmsTF4wHs4vp",
"contractaddress": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"amount": "1"
}'
{
"status": 200,
"ok": true,
"message": "Successfully estimated the fees",
"data": {
"energy_consumption": 32000,
"bandwidth_consumption": 368,
"paymaster_fee": 0.15
}
}

这笔费用会在请求结算时从信用额度中扣除。如果余额不足以覆盖,请求会失败。GET /v2/tron/paymaster/balance 会返回剩余额度。

type 接受 TRXTRC10TRC20TRC721。它与 fromtoamount 一样是必填项。对于 TRC20TRC721,还需要传入 contractaddress;对于 TRC721TRC10,需要传入 tokenid。签名方式与 API 中其他地方一致:受密码保护的 Chaingateway 地址传 password,否则传 privatekey。可选参数 callback_url 用于接收结果。

Terminal window
curl --request POST\
--url https://api.chaingateway.io/v2/tron/paymaster\
--header 'Accept: application/json'\
--header 'content-type: application/json'\
--header 'Authorization: YOUR_API_TOKEN'\
--data '{
"type": "TRC20",
"from": "TLkkCeNdJKPNUwucdro84WjswkzM62LCTH",
"to": "TUwmZghA7u2GxGxKaxM1mkCmsTF4wHs4vp",
"contractaddress": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"amount": "1",
"password": "test123",
"callback_url": "https://example.com/callback"
}'

响应中返回的不是交易哈希,而是这个请求的 id:

{
"status": 200,
"ok": true,
"message": "Successfully created paymaster request",
"data": {
"id": "9c72d676-8180-4cd2-a406-f0f1cd097506"
}
}

用这个 id 轮询 GET /v2/tron/paymaster/{id},或者用 GET /v2/tron/paymaster 列出全部请求。status 字段会依次经过 pending(等待处理)、processing(交易正在处理中),最终在结算完成后变为 completed。失败时会显示为 failed - [reason],具体原因写在连字符之后。交易完成后,记录中会出现对应的交易哈希。

{
"id": "9cfbfcaf-68b2-47e9-bf55-5b6b4875e84d",
"type": "TRC20",
"from": "THG9nncwASg3ub5rvVquocAHwwQbnKZxpH",
"to": "TPUjdnMrS7XDUFp5W6zgh4QDCW34nXa2x1",
"contract_address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"amount": "200",
"token_id": null,
"transaction_hash": "80a223e0cb20ef692fbd23d3cbaf3cc1dfa2b9667aaef70c7da8ca8f707ec28b",
"status": "success",
"used_credits": "2.178413",
"callback_url": "https://api.chaingateway.io/receiver/webhooks/tron",
"created_at": "2024-09-11T15:28:57.000000Z"
}

如果 TRX 本来就是你自己的,你可以一次性质押它,重复使用这些资源,而不是按笔支付费用。POST /v2/tron/freeze 质押 TRX 以获得 energy 或 bandwidth,POST /v2/tron/delegate 把这些资源委托给另一个地址,POST /v2/tron/undelegatePOST /v2/tron/unfreeze 则分别撤销这两步操作。一个质押地址就可以为它背后的一批存款地址提供资源,这正好适合拥有大量收款地址的支付流程。

发送转账本身的操作见创建 TRC20 代币交易