TRON · Meta-transaction smart account

Gas2Free

TNop firma off-chain. Il relayer paga la rete. Il saldo spendibile appartiene al gasless wallet separato.

LIVE

Console operativa · TRON mainnet

Prima di finanziare: due saldi distinti

Gli USDT presenti su TNop non vengono sbloccati, trasferiti o duplicati dalla firma. Questi contratti spendono solo gli USDT depositati nel gasless wallet separato. Il ricevente è TUa8. Nessun bridge verso BSC/Ethereum è incluso.

Verifica il contratto prima di depositare. Non inserire mai seed o private key in questa pagina. Nessuna transazione parte automaticamente.

01 · Contratti e saldoDa verificare
Nessun contratto viene inventato o selezionato automaticamente.
Non verificato. Collega TronLink per leggere la rete.
Il wallet va creato e verificato prima del deposito pilota. Il deploy ha un costo di rete.
02 · Connessione e firmeDisconnesso

In Edge seleziona TNop per firmare off-chain, DEPLOYER per i deploy, RELAYER per trasmettere. Cambiare account non cambia una firma già verificata; cambiare rete la invalida nella console.

Importo e fee sono proposte modificabili, non autorizzazioni. Nonce letto dal contratto, mai forzato.
Prepara un pagamento per vedere destinatario, importo, fee, nonce e scadenza.

Scartare nella pagina non revoca una firma eventualmente già copiata: restano validi nonce e scadenza on-chain. La firma non è salvata dal sito.

Inizializzazione della console…
RUOLI

Indirizzi della tua configurazione

Gli indirizzi qui elencati sono pubblici. BRIDGE_OWNER è solo un riferimento operativo: non esiste un bridge in questa versione. ENERGY_SPONSOR non attiva automaticamente deleghe. TREASURY riceve la fee solo se firmata da TNop.

Test suite18 / 18 passing
Contracts6 · solc 0.8.24
Wallet runtime3 317 bytes
Canonical USDTTR7NHqje…gjLj6t
Payout selector0xa9059cbb
Network statusTRON mainnet · not deployed
01

What the system does

Ordinary TRON payments fail for a user with USDT but no TRX: they cannot pay the network fee. Here the user never touches the chain. They sign a typed message; anyone can carry it.

The wallet owns the money

Each user gets their own contract at an address derived from their key. That contract holds the USDT, so paying out is a plain transfer() from its own balance.

Nobody ever calls approve(), and the payout path never uses transferFrom(). There is no allowance to steal.

The signature is the authority

The owner signs an EIP-712 message binding the exact call: receiver, amount, fee, deadline. Change one digit and the signature no longer matches.

A relayer submits it and pays the bandwidth and energy. The relayer cannot alter the payment.

The address exists before the contract

The factory derives wallet addresses with CREATE2, so an address can be handed out and funded while the contract is still undeployed.

Deployment happens later, at that exact address, with the balance intact.

This release is TRON-only

A TRON account is displayed as T... for users and as a 20-byte 0x... value inside the TVM. They are two representations of the same TRON account, not proof of Ethereum support.

Ethereum requires a separate factory, wallet artifact, token configuration, relayer and deployment record.

DEMO

Simulatore locale · nessun fondo reale

Laboratorio indipendente dalla console LIVE: usa una chiave di test pubblica, saldi inventati e una factory dimostrativa. La crittografia è reale, ma non legge e non modifica la blockchain.

Signing desk
Accepts a TRON Base58Check T..., wire-level 41..., or internal 20-byte 0x... address.
Wallet fee cap: 0.00 USDT. A fee above the cap reverts.
One owner can hold many wallets. The index changes the derived address.
Cryptographic readoutTRON mainnet · 728126428
Calldata handed to the self-call
function selector encoded arguments signer appended by executeMetaTransaction

Why the last 20 bytes matter

After checking the signature, the wallet calls itself with the signed calldata plus the signer's address glued onto the end.

Inside that call msg.sender is the wallet, which would fail every ownership check. So _msgSender() notices the self-call and reads the address back off the tail of the calldata instead. The owner check then passes, and the relayer's identity never enters the decision.

Reading the trace

Six stages run in order. Each shows the real comparison it performs. A stage that fails halts everything after it, and the relayer sees the revert reason the contract actually produces.

Note that a failure inside the payment surfaces to the relayer as META_TX_FAILED: the inner reason is swallowed by the low-level self-call.

03

Execution trace

Pick a scenario, then press Sign & relay. Each scenario breaks exactly one thing, so you can see which guard catches it.

Ready Press Sign & relay to run the pipeline.
Wallet USDT1 000.00
Receiver USDT0.00
Relayer earned0.00
Wallet nonce0
Owner TRX spent0.00
Payments settled0
04

Counterfactual lifecycle

The address a user is given is computed, not assigned. Step through the four stages and watch the address stay identical from prediction to deployment.

05

What each guard protects

Every check in the pipeline exists because of a specific attack. The test suite has one case per row.

Signature binding

The signed digest covers the whole calldata, hashed. Editing the receiver or the amount after signing changes the hash, so recovery returns a different address and the call reverts with BAD_SIGNATURE.

Replay

The digest includes the wallet's current nonce, which increments on every accepted message. Re-submitting a spent signature recovers the wrong address, because the digest it was signed over no longer matches.

Domain separation

The domain binds the wallet address and the chain id. A signature for one wallet is meaningless at another, and a signature made on a testnet cannot be replayed on mainnet.

Deadline

The expiry sits inside the signed calldata, so the relayer cannot extend it. A message held back until after expiry simply stops working.

Fee cap

The wallet is deployed with a hard maximum fee. A relayer that inflates its own fee beyond the cap gets FEE_TOO_HIGH, no matter what the owner signed.

Re-entrancy

The payout is wrapped in a lock, so a token that calls back into the wallet mid-transfer cannot start a second payment.

06

TRON mainnet readiness

Use the companion deployment guide before spending anything: complete the pre-flight checklist, deploy the factory, verify the live bytecode and CREATE2 vectors, then run one limited end-to-end payment.

The one hazard to understand first

The USDT address is a compile-time constant in the wallet. On a network where no token contract lives at that address, a call to it succeeds and returns nothing, and the helper accepts empty returndata as success.

A payment would then report success while moving nothing. Deploy only where the canonical token actually exists.

Why not the usual deploy command

TRON does not accept Ethereum-signed deployment transactions, so the ordinary Hardhat deploy path does not reach it. The deployment uses TronWeb against the compiled artifacts.

The exact sequence and the required evidence are documented in the companion deployment guide.

Cost, in one line

Il deployer paga i deploy, il relayer paga i pagamenti. Il costo dipende da risorse disponibili e parametri correnti della rete. Il firmatario off-chain non paga quella transazione.

Energy delegation can reduce TRX burned, but it does not guarantee free execution. Check the current estimate in TronLink before approving.

07

Deploy from this page

Connect the TronLink extension and the page runs every pre-flight check against the live chain. You sign in TronLink; this page never sees a key and never holds one.

Critical derivation fix applied Wallet prediction now matches TRON's CREATE2 rule

TRON derives CREATE2 addresses with the prefix byte 0x41. Ethereum uses 0xff. The two produce different, equally valid addresses.

The factory now uses 0x41 in predictWallet(), the same rule the TVM applies when create2 deploys the wallet. The address shown to a user is therefore the address that can later receive the contract.

The suite keeps the Ethereum VM lifecycle checks separate and pins the production TRON formula against a fixed vector. The comparison below remains visible so the network-specific difference cannot be missed.

Deployment is no longer blocked by address derivation. TronLink still requires every live pre-flight check and explicit acknowledgement before it enables deployment.

Proof · both derivations, same inputscomputed in this page
TronLinknot connected
No wallet connected. The page reads nothing until you connect.
Default dei wallet standard. La console usa il cap esplicito scelto sopra, anche diverso dal default.