TRC20 手续费代付:TronFuel 与 Paymaster
问题所在:没有 TRX,代币就动不了
Section titled “问题所在:没有 TRX,代币就动不了”一笔 TRC20 转账是一次智能合约调用。TRON 会为此收取 energy 和 bandwidth 费用,一个地址要么通过燃烧 TRX 来支付这些资源成本,要么使用自己质押或被委托而获得的资源。代币本身永远不会为此付费。
这就带来了每一个 TRON 集成迟早都会遇到的情况:一位客户把 USDT 存入一个刚创建的地址。这个地址此时只持有代币,别无他物。把这些代币继续转出会失败,返回状态码 422,消息为 balance is not sufficient,因为没有 TRX 可以支付资源成本。提前为每一个存款地址充值 TRX 可以解决这个问题,但这会把 TRX 锁在一些可能永远用不上的地址里。
代付手续费从另一个方向解决了这个问题:由第三方支付资源成本,钱包发送代币时始终不需要持有 TRX。
TronFuel 是目前推荐的方式
Section titled “TronFuel 是目前推荐的方式”我们目前推荐使用 TronFuel。它以批量方式从质押者那里租用 energy,而不是燃烧 TRX,节省下来的成本正是来自这里,相比直接燃烧更加划算。相关背景见博客文章《TRON TRC-20 交易手续费最多可节省 60%》。
TronFuel 是一个独立的服务。它在 Chaingateway API 内部没有对应的接口,因此本文档不涉及它的具体调用方式。请通过上面的链接查阅它自己的文档。
Paymaster 已被弃用
Section titled “Paymaster 已被弃用”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 接受与请求本身相同的参数体,并返回这笔交易预计花费多少。
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 会返回剩余额度。
创建一个代付请求
Section titled “创建一个代付请求”type 接受 TRX、TRC10、TRC20 和 TRC721。它与 from、to、amount 一样是必填项。对于 TRC20 和 TRC721,还需要传入 contractaddress;对于 TRC721 和 TRC10,需要传入 tokenid。签名方式与 API 中其他地方一致:受密码保护的 Chaingateway 地址传 password,否则传 privatekey。可选参数 callback_url 用于接收结果。
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" }}跟踪一个请求
Section titled “跟踪一个请求”用这个 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"}质押作为第三种选择
Section titled “质押作为第三种选择”如果 TRX 本来就是你自己的,你可以一次性质押它,重复使用这些资源,而不是按笔支付费用。POST /v2/tron/freeze 质押 TRX 以获得 energy 或 bandwidth,POST /v2/tron/delegate 把这些资源委托给另一个地址,POST /v2/tron/undelegate 和 POST /v2/tron/unfreeze 则分别撤销这两步操作。一个质押地址就可以为它背后的一批存款地址提供资源,这正好适合拥有大量收款地址的支付流程。
发送转账本身的操作见创建 TRC20 代币交易。