Skip to main content

TRON staking and resource delegation

Updated over a month ago

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

ownerAddress.value

string

Sponsor wallet address — use as ownerAddress in delegation calls

amount

string (SUN)

Amount staked

resource

ENERGY | BANDWIDTH

Resource type frozen

asset

string

Always

assets/native.tron-mainnet

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

ownerAddress.value

string

Sponsor wallet address

receiverAddress.value

string

Spending wallet that received the resources

resource

ENERGY | BANDWIDTH

Resource type delegated

amount

string (SUN)

Amount delegated

asset

string

Always

assets/native.tron-mainnet

lock

boolean

Whether the delegation is locked

lockPeriod

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

transaction.tronTransaction.fee.usedSun

string

Total SUN consumed by the transaction

transaction.tronTransaction.fee.bandwidth.consumed

string

Bandwidth units consumed

transaction.tronTransaction.fee.bandwidth.burned

string

TRX burned for bandwidth (if any)

transaction.tronTransaction.fee.energy.consumed

string

Energy units consumed

transaction.tronTransaction.fee.energy.burned

string

TRX burned for energy (if any)

transaction.tronTransaction.signature

bytes

ECDSA signature (available after signing)

API quick reference

Operation

tronTransaction key

Required fields

Stake TRX

freezeBalanceV2

ownerAddress, amount (SUN), resource

Unstake TRX

unfreezeBalanceV2

ownerAddress, amount (SUN), resource

Withdraw after 14 days

withdrawExpireUnfreeze

ownerAddress

Cancel pending unstake

cancelAllUnfreezeV2

ownerAddress

Delegate resource

delegateResource

ownerAddress, resource, amount (SUN), receiverAddress, lock, lockPeriod (if locked)

Undelegate resource

undelegateResource

ownerAddress, resource, amount (SUN), receiverAddress

Vote for Super Representatives

voteWitness

ownerAddress, votes[].voteAddress, votes[].voteCount (max 30)

Claim staking rewards

withdrawBalance

ownerAddress

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.state to CONFIRMED before 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.

Did this answer your question?