Key takeaways
- A resource delegation lends Bandwidth or Energy from one address to another — and no TRX changes hands. The staked balance stays with the delegator the entire time.
- Because nothing of value moves, a trace that follows transfers is blind to it. A delegation appears only as a
DelegateResourceContracttransaction, and its reversal as anUnDelegateResourceContract. - Those two contracts bracket the relationship in time: a grant, a lock period during which it can't be pulled back, and a reclaim. The fields name the delegator, the receiver, the resource, and the amount.
- A recurring delegation — one address keeping another's operations funded, top-up after top-up — is a real, ongoing economic tie that a value-only view never surfaces.
Most funding relationships on-chain are visible because value moves: A sends B some TRX, and the transfer is right there in B’s history. Resource delegation is the exception. It is how one address can pay for another’s transactions indefinitely, and it leaves no transfer behind — because no transfer happens.
That makes delegation the quietest funding relationship TRON has, and one of the more useful once you know where it hides. This article is about the trail itself: what a delegation transaction is, what its reversal looks like, and how to read a sequence of them. The economics of why staking and delegation work this way is the subject of Stake 2.0; here the subject is narrower — the transactions the relationship leaves behind.
A delegation moves no TRX
When an address delegates a resource, its staked TRX does not move. The delegator keeps the balance; what shifts is only the right to consume the Bandwidth or Energy that balance produces. The receiver transacts as though it had staked for itself, the cost draws down the delegator’s allowance, and the underlying TRX sits exactly where it was.
The consequence for a reader is direct. A trace that follows value — TRX transfers, token movements — passes straight over a delegation, because there is no value edge to follow. Two addresses can be in a months-long funding relationship, one carrying the other’s entire transaction cost, with nothing in either account’s transfer history to show it. The relationship is real; it is just recorded in a different place.
That place is the transaction type. A delegation is a DelegateResourceContract, and undoing it is an UnDelegateResourceContract — neither is a transfer, and neither shows up if those types are filtered out of a view.
The two contracts and their fields
The grant and its reversal are small, and their fields say exactly what happened.
DelegateResourceContract carries:
| Field | What it names |
|---|---|
owner_address | The delegator — the address that staked the TRX and is lending its resource. |
receiver_address | The address receiving the resource. |
resource | Which resource: Bandwidth or Energy. |
balance | The amount of staked TRX (in sun) whose resource is being delegated. |
lock / lock_period | Whether the delegation is time-locked, and for how many blocks. |
UnDelegateResourceContract is the mirror image — owner_address, receiver_address, resource, balance — and it reclaims the delegated resource back to the delegator. It has no lock fields; it is the reversal, not a new commitment.
Read together, the pair tells you the whole arrangement: who lent, to whom, which resource, how much, and — from the two timestamps — for how long.
The lifecycle: delegate, lock, reclaim
A delegation is not instantaneous-and-gone. It has a shape in time.
The DelegateResourceContract opens it. If the delegator sets lock, the delegation cannot be reclaimed until lock_period blocks have passed — a parameter added so the two parties can write a fixed resource-lease term straight into the chain. Set lock with lock_period left at zero and it falls back to the default of 86,400 blocks, about three days; set it higher and the lock runs longer. Until the lock clears, the receiver keeps the resource and the delegator cannot pull it back.
The UnDelegateResourceContract closes it. When it lands, the resource returns to the delegator’s allowance and the receiver loses it. The gap between the two transactions is the lifetime of that particular grant — a fact you can read off the block timestamps without any off-chain information.
Reading the trail
For someone following an address, the delegation transactions answer a question transfers cannot.
A recurring delegator is a funder. One DelegateResourceContract is a favor. A pattern of them — the same delegator topping the same receiver up again and again, each grant renewed before the resource runs dry — is a standing arrangement. Someone is absorbing the ongoing cost of keeping that address operational, and the trail shows it plainly even though no money ever moved.
The reclaim is a signal too. An UnDelegateResourceContract ends the relationship. A delegation that runs for months and is then abruptly reclaimed marks a change — the funder stepping back, an arrangement dissolved — dated to the block it lands in.
The fields scope the tie. resource and balance say what was being covered and how much: a small Bandwidth delegation keeps an address able to send simple transfers; a large Energy delegation underwrites heavy contract activity. The size and type of the lend describe the kind of operation the receiver runs.
None of this is visible to a view built around value. A delegation is a relationship without a payment, and the only trace it leaves is the pair of contracts that opened and closed it — which is exactly why, for an address that seems to transact for free, the first question worth asking is who is delegating to it.
Sources
- balance_contract.proto — tronprotocol/protocol — the
DelegateResourceContract(owner_address,receiver_address,resource,balance,lock,lock_period) andUnDelegateResourceContract(owner_address,receiver_address,resource,balance) message definitions. - TIP-467: TRON Stake 2.0 — the Stake 2.0 model that separates staking from delegation and defines the
DELEGATERESOURCE/UNDELEGATERESOURCEoperations. - TIP-542: Customizable delegate lock period — the
lock_periodparameter (in blocks) and the 86,400-block (~3-day) default lock.