This article describes how to stake TRX on Utila and freeze TRX. See also Staking TRX via TronScan.
1. Staking via the Yield page
Use this flow when you want the full staking experience: generate resources, vote for Super Representatives (SRs), and earn staking rewards on top of your energy or bandwidth generation.
Before you begin
You’ll need a dedicated wallet to act as your sponsor/staking wallet — this is the wallet that holds TRX, stakes it, and later delegates resources to your other wallets. It does not need to be the same wallet performing your transfers.
Step 1. Open the Yield page
Click Yield on the left navigation pane and then select your sponsor wallet. The Stake page is displayed.
Step 2. Configure your stake
a. Click Change to select one or more super representatives (SRs) from the list. These are the TRON validators you vote for with your staked TRX. The widget displays estimated reward rates to help you choose
If you select multiple SRs, your votes are split equally among them.
Only whole TRX count as voting power. If you stake 100.5 TRX, you can vote with 100 TRX. The remaining 0.5 TRX appear as a locked balance.
If you already have a staked position and are staking additional TRX, you must select the same SRs you originally voted for. Choosing different SRs during a subsequent stake will redirect your entire staked position — including previously staked TRX — to the newly selected SRs
b. Select the resource.
Choose Energy if your goal is to cover TRC-20 transfer costs (e.g., USDT).
Choose Bandwidth if your goal is to cover native TRX transfers or high volumes of staking and delegation operations.
c. Enter the amount of TRX to stake. Click Stake to proceed.
Keep the Yield tab open after approving. Once the freeze transaction confirms on-chain, a second transaction is automatically triggered.
Step 3. Approve and sign the Stake TRX transaction
The first transaction is a Stake TRX (Freeze). This locks your TRX and immediately generates the resource (energy or bandwidth) on your wallet.
Go to Transactions and open the wallet. Select the Stake TRX transaction and review the transaction details and approve according to your wallet’s policy.
Step 4. Approve the Vote transaction
Once the freeze is confirmed on-chain, a new transaction is automatically initiated for a Vote for Super Representatives transaction. This casts your Tron Power (1 TRX staked = 1 vote) to the SRs you selected.
Go to Transactions and open the wallet. Select the Vote for SR transaction. Approve and sign this second transaction. Once confirmed, your staking position is fully active.
Step 5. Manage your position
After staking, the Yield page displays your position and any available Pending Actions:
Claim Rewards — withdraw accumulated staking rewards into your available wallet balance.
Revote — re-cast votes to different SRs without unstaking.
Unstake (unlock locked) — release fractional locked TRX into unstaking status. It takes 14 days for your TRX to become available.
Withdraw — after the 14-day unstaking period, move TRX back to your available balance
Also available via TronScan: You can also stake TRX and manage your position using the Utila browser extension connected to TronScan, which provides additional SR statistics and management options. See Staking TRX via TronScan.
2, Direct freeze via TRON Management
Use this flow when you want to freeze TRX for a specific resource quickly, without SR voting or reward optimization.
Step 1. Open TRON Management
Click Wallets on the left navigation pane and then select your sponsor wallet. In the wallet details pane, click TRON Management.
Step 2. Stake TRX (Freeze)
Select the resource you want and click on Get Energy or Get Bandwidth.
Enter the amount and click Freeze TRX. This locks TRX to receive energy or bandwidth. This is the same as the staking flow, but without voting.
Review the transaction details and approve according to your wallet’s policy. Resources are available immediately once the transaction is confirmed on-chain
Step 3. Confirm your resource balance
Once confirmed, your energy or bandwidth balance updates in the wallet view.
When to use this flow vs. flow 1
The Yield page(flow 1) is better when you want to earn staking rewards alongside generating resources.
TRON Management (flow 2) is better when you need to freeze quickly for a specific operational need without validator selection or reward tracking.
API flow - Stake and delegate to multiple wallets
All requests go to POST /v2/vaults/{vault_id}/transactions:initiate with a tronTransaction body. Every response returns a v2Transaction object — poll transaction.state until it reaches CONFIRMED before proceeding to the next step.
All amount values are in SUN (1 TRX = 1,000,000 SUN), passed as strings. Addresses accept hex (41...) or base58 (T...) format.
1. Stake TRX — freezeBalanceV2
Request
{
"details": {
"tronTransaction": {
"network": "networks/tron-mainnet",
"freezeBalanceV2": {
"ownerAddress": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
"amount": "100000000",
"resource": "ENERGY"
}
}
}
}resource: ENERGY or BANDWIDTH
Response
transaction.tronTransaction.freezeBalanceV2
Field | Type | Description |
| string | Sponsor wallet address — use as |
| string (SUN) | Amount staked |
| ENERGY | BANDWIDTH | Resource type frozen |
| string | Always
|
2. Delegate to a spending wallet — delegateResource
One request per target wallet. The ownerAddress is the sponsor wallet address from step 1 (transaction.tronTransaction.freezeBalanceV2.ownerAddress.value).
Request
{
"details": {
"tronTransaction": {
"network": "networks/tron-mainnet",
"delegateResource": {
"ownerAddress": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
"resource": "ENERGY",
"amount": "10000000",
"receiverAddress": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8",
"lock": false
}
}
}
}To lock the delegation for a fixed period, set "lock": true and add "lockPeriod" in blocks (1 block ≈ 3s — for example, "28800" ≈ 24 hrs). Locked delegations cannot be undelegated until the period expires.
Response
transaction.tronTransaction.delegateResource
Field | Type | Description |
| string | Sponsor wallet address |
| string | Spending wallet that received the resources |
| ENERGY | BANDWIDTH | Resource type delegated |
| string (SUN) | Amount delegated |
| string | Always
|
| boolean | Whether the delegation is locked |
| string | Lock duration in blocks (if locked) |
Delegating to multiple wallets
Repeat this call for each receiverAddress. Each is an independent transaction. The total delegated amount across all wallets cannot exceed the sponsor’s total staked position.
Sizing
A single USDT transfer consumes approximately 64,000–128,000 energy. Size each delegation accordingly.
3. Undelegate — undelegateResource
Reclaim resources from a spending wallet back to the sponsor. Use the receiverAddress from the original delegation response.
Request
{
"details": {
"tronTransaction": {
"network": "networks/tron-mainnet",
"undelegateResource": {
"ownerAddress": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
"resource": "ENERGY",
"amount": "10000000",
"receiverAddress": "TJRabPrwbZy45sbavfcjinPJC18kjpRTv8"
}
}
}
}Response
transaction.tronTransaction.undelegateResource returns the same fields as delegateResource. Resources are immediately available in the sponsor wallet.
4. Unstake — unfreezeBalanceV2 → withdrawExpireUnfreeze
Initiate unstake
The resources are immediately removed and the 14-day lock period starts.
{
"details": {
"tronTransaction": {
"network": "networks/tron-mainnet",
"unfreezeBalanceV2": {
"ownerAddress": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
"amount": "100000000",
"resource": "ENERGY"
}
}
}
}Withdraw after 14 days
{
"details": {
"tronTransaction": {
"network": "networks/tron-mainnet",
"withdrawExpireUnfreeze": {
"ownerAddress": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g"
}
}
}
}
Cancel pending unstake
Immediately restake the TRX, restoring the resources.
{
"details": {
"tronTransaction": {
"network": "networks/tron-mainnet",
"cancelAllUnfreezeV2": {
"ownerAddress": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g"
}
}
}
}
Transaction response
Every InitiateTransaction response includes a top-level transaction object with these fields relevant to all TRON operations.
Field | Type | Description |
| string | Total SUN consumed by the transaction |
| string | Bandwidth units consumed |
| string | TRX burned for bandwidth (if any) |
| string | Energy units consumed |
| string | TRX burned for energy (if any) |
| bytes | ECDSA signature (available after signing) |
API quick reference
Operation | tronTransaction key | Required fields |
Stake TRX |
|
|
Unstake TRX |
|
|
Withdraw after 14 days |
|
|
Cancel pending unstake |
|
|
Delegate resource |
|
|
Undelegate resource |
|
|
Vote for Super Representatives |
|
|
Claim staking rewards |
|
|
Key reminders
All amounts are in SUN as strings
1 TRX = 1,000,000 SUN
Both hex (41...) and base58 (T...) addresses are accepted
Poll transaction.statetoCONFIRMEDbefore chaining calls
Governance and policies
All staking and delegation transactions go through Utila’s standard approval and policy flow. Policy enforcement, MPC signing security, and full transaction visibility are preserved throughout — no resource management operations bypass your governance configuration.
Currently, the staking wallet’s policy must include the Any / TRON rule to permit staking and delegation transactions. Granular policy rule types for staking and delegation are planned as a future improvement.
FAQs
Why are my USDT transfers still burning TRX after I staked?
Staking generates resources on the wallet that staked — not automatically on your spending wallets. You need to delegate energy from your sponsor wallet to each spending wallet via the delegateResource call.
I staked additional TRX and my votes changed unexpectedly.
When adding to an existing staked position via the Yield page, you must select the same SRs as before. Selecting different SRs redirects your entire position, including previously staked TRX, to the new SRs. Use the Revote pending action to redistribute votes if this happened unintentionally.
I see a “locked” balance in the Yield tab. What is it?
TRON only counts whole TRX as voting power. Fractional amounts (e.g. 0.5 TRX from a 100.5 TRX stake) accumulate as a locked balance. Once it reaches 1 TRX, Vote Locked becomes available to cast those votes. Use Unlock Locked to release the amount into unstaking.
How do I calculate the amount value for delegation?
Multiply the TRX amount by 1,000,000 and pass as a string. To delegate the energy generated by 25 TRX: "amount": "25000000".
Can I delegate to wallets outside of Utila?
Yes. The receiverAddress accepts any valid TRON address — it does not need to be a Utila-managed wallet.
Can I cancel a locked delegation early?
No. Locked delegations cannot be undelegated until the lockPeriod expires.
Why can’t I withdraw my TRX immediately after unstaking?
TRON enforces a mandatory 14-day waiting period after unfreezeBalanceV2 at the protocol level. Use cancelAllUnfreezeV2 within that window if you change your mind.






