Key takeaways
- A single contract,
AccountPermissionUpdateContract, rewrites an account's owner, witness, and active permissions — the complete key-set that decides who can sign for it. - It is all-or-nothing: the transaction carries the whole desired permission set and overwrites what was there. There is no "edit one field" — you resubmit everything or lose what you left out.
- Each permission lists up to five keys with weights and a threshold; a set whose threshold exceeds its combined key weight is valid to submit but impossible to sign — an account can lock itself out in one transaction.
- Because the change is deliberate, fee-bearing, and complete, a permission update is one of the most legible control events an account can leave on-chain.
Most TRON accounts never change their permissions. They are created with a default owner permission — one key, the account’s own, weight one, threshold one — and they keep it for life. Every transaction they send is authorized by that single key, and the permission structure is a formality.
When an account does change its permissions, one contract type does the job, and its shape is worth understanding up front: the transaction replaces the account’s entire authorization structure at once. Both the forensic value and the danger come from that.
This article is about the mechanic — the contract itself, what a permission is made of, and how a valid update can still be a fatal one. How to read a permission structure as a control signal is a separate question; here the subject is the transaction that writes it.
The contract that rewrites control
AccountPermissionUpdateContract is contract type 46 in the protocol. Its job is to set an account’s permissions, and its fields are the permissions themselves:
| Field | What it carries |
|---|---|
owner_address | The account being modified. |
owner | The new owner permission. The protocol marks it “Empty is invalidate” — you cannot submit without one. |
witness | The new witness permission. “Can be empty” — only Super Representative accounts use it. |
actives | The new active permissions, as a list. Also “Empty is invalidate.” |
The account’s stored state mirrors these fields exactly: an owner_permission, a witness_permission, and a list of active_permission. The update contract is a whole-state assignment — the permissions the account will have after it lands are the permissions inside the contract, and nothing else. The account model describes what those three permission slots mean; this contract is the only way to write them after creation.
What the contract writes
Each permission the contract carries is a compact structure. The full model — how keys, weights, and thresholds resolve, and what an operations bitmask allows — is the subject of the account-model article; the pieces the update writes are:
| Element | Meaning |
|---|---|
type / id | Owner (id 0), Witness (id 1), or Active (id 2 and up). |
threshold | The signing weight an action under this permission requires. |
keys | Up to five addresses, each with a weight. |
operations | Active permissions only — a 32-byte bitmask, one bit per contract type. |
permission_name | A human label, stored on-chain but not load-bearing. |
One asymmetry is worth flagging now. An active permission’s operations mask can be scoped to a narrow set of contract types. The owner permission carries no such limit — it can authorize anything, including the next AccountPermissionUpdateContract. Keep that in mind for the lockout section below.
All-or-nothing: the whole set, every time
The property that surprises people is that the update overwrites. The developer documentation is explicit: “This interface will override the original account permissions, so even if you only want to modify the owner permission, you still need to configure the witness (if it is a witness account) and active permissions.” The java-tron reference calls it “an ‘all-or-nothing’ update” and warns that “even if modifying a single permission, the full permission set must be resubmitted to prevent accidental loss of access.”
There is no partial update. To add one key to an active permission, you resubmit the owner permission, every active permission, and the witness permission if the account is a Super Representative. What you submit is the complete desired end-state, with the one change folded in. Whatever you leave out is gone.
The transaction also carries a fee. Modifying account permissions costs 100 TRX as of 2026 — not a resource cost paid in Bandwidth or Energy but a flat TRX fee, and one set by governance chain parameter, which means a Super Representative proposal can change it. The fee is small relative to what the transaction changes.
How an update locks an account out
The all-or-nothing design has a failure mode the static permission picture does not show. A permission whose threshold exceeds the combined weight of its keys is unsignable — an unreachable-threshold configuration the account-model article covers as a deliberate freeze. The danger unique to the update is how easily a routine change writes that state by accident.
Because every update resubmits the entire set, a permission is preserved only if you re-include it correctly. Omit your own key from the owner permission in a full resubmission, set a threshold one point too high, or list an address whose private key you do not hold — and the transaction is accepted, because its shape is valid, and the account is now unsignable under that permission.
Do this to an active permission and you disable one path. Do it to the owner permission — the only permission that can rewrite permissions — and there is no recovery: re-permissioning the account requires clearing the owner threshold that can no longer be met. The documentation’s warning about “accidental loss of access” is precisely this: one careless full resubmission, and the lockout is permanent.
What a permission change tells a reader
Permission changes are rare, fee-bearing, and irreversible. When an AccountPermissionUpdateContract appears in an account’s history, the control arrangement changed on purpose at that block — a key added, a threshold raised, authority handed to a new address.
The transaction is also a complete record of the handover. Because the contract carries the full new key-set, it shows the after-state on its face: which addresses can now sign, with what weights, against what threshold. Compare that to the before-state and you have exactly what changed — a single-key account becoming a multi-sig, say, or one owner key swapped for another.
Two smaller reads come along with it. The operations mask on each active permission records precisely which contract types a delegated key may run; a key granted broad operations is a different arrangement from one scoped to a single contract, and the mask spells out which. And a self-locked account is visible: one whose owner permission can never meet its threshold is inert, able to receive value but never to send or re-permission it. That terminal state was written by one transaction, and it is on the record.
The permission structure answers “who can sign for this account.” This contract marks the moment that answer was last written, and because it always carries the full set, the whole new answer is right there in the transaction.
Sources
- account_contract.proto — tronprotocol/protocol — the
AccountPermissionUpdateContractmessage:owner_address,owner(“Empty is invalidate”),witness(“Can be empty”), andactives(“Empty is invalidate”). - Tron.proto — tronprotocol/protocol — the
Permissionmessage (type,id,threshold,parent_id,operations“1 bit 1 contract”,keys), theKeymessage (address,weight), and theOwner/Witness/Activepermission-type enum. - Account Permission Management — TRON Developer Hub — the override behavior, permission IDs, up to 8 active permissions, and the threshold rule. The live page still gives the override warning, as “This contract overwrites all three permission slots at once”, but no longer in the words quoted in the body, so the archived revision below is cited for the wording.
- Account Permission Management — TRON Developer Hub, archived 2025-10-12 — the revision carrying the override wording quoted in the body: “This interface will override the original account permissions, so even if you only want to modify the owner permission, you still need to configure the witness (if it is a witness account) and active permissions.” TRON has since rewritten the live page in place, so the last archived revision carrying this wording is cited alongside it.
- Account Permission Management — java-tron documentation — the “all-or-nothing” characterization, up to five keys per permission, the 32-byte little-endian
operationsbitmask, and the 100 TRX fee to modify account permissions.