Sub-accounts, Controllers and Agents

One identity, many pockets: sub-accounts with their own budgets, protocol controllers bounded to one route, bounded allowances for bots and agents — never your keys.

Last updated 2026-09-04 · maintained in the Final Wiki

Live on all five mainnets and both test networks.

#Sub-accounts

A sub-account is a separate pocket under your Final Identity: its own address, owned by exactly one wallet, for a protocol, a purpose or a person. It is a custody route, not a second wallet — the wallet executes through it, your recovery covers it, and it is created, funded and closed by intents you sign like any other.

  • Isolation is the point. What a sub-account holds is all it can lose. Its own scope — a time window, a native spend cap on a rolling window, an optional allowlist of targets and functions, and per-token budgets — is set by you and applies to every path into it.
  • A sub-account can pay its own fees. An intent may name a sub-account as its fee source; the fee then comes out of that pocket's budget, so a trading pocket funded in one token settles its own gas from that token and nothing leaks into the wallet root.
  • Two kinds. Unbound: general-purpose isolation. Controller-bound: the sub-account is bound to a controller contract, a protocol's policy, and execution through it is checked against that policy as well.

#Controllers

A controller is a protocol's policy contract, bound to one sub-account. The wallet knows no protocol and treats every controller as untrusted, generic and bounded:

  • Blast radius is one metered route. The wallet root is never controller-bound. A buggy or malicious controller can spend at most what you budgeted into that one sub-account — never the wallet, never another sub-account, never a token outside the budget.
  • The lane fails closed. A freshly created sub-account has an unbounded scope; a controller cannot act through it until you have set budgets. No budget, no controller action.
  • Scope sits above policy. Your scope binds the controller lane exactly as it binds your own; a controller neither replaces nor bypasses it.
  • Policy changes need your acceptance. A controller cannot change what a sub-account will do unilaterally; a one-way policy lock exists for protocols that need an irrevocable binding.
  • Exit is yours. An escape — queue, wait the policy's delay, finalise — unbinds a controller with no cooperation from it, under every scope state. Using the sub-account again while an escape is queued cancels the escape, so wind a position down first.

Integrators: the recognition views, the interfaces and the shape of a controller that deserves a budget are on Protocol integration.

#Agents: a bounded allowance for a program

An agent is any program that acts for you — a trading bot, an automation, an AI agent — under a grant you sign. The grant is enforced by a chain-global module of the wallet, and it never gives the agent your keys or your authority:

  • What it may call. An allowlist of targets and functions, with per-token caps on a tumbling window (or for the grant's lifetime), a limit on how many dispatches per window, and an expiry.
  • Which pockets. Either the wallet root or a named set of sub-accounts (up to sixteen). An agent may be allowed to create its own sub-accounts, which join its allowlist automatically; or not.
  • All or nothing. A grant may require that the agent's intents execute only inside atomic bundles, so a multi-step plan never settles halfway.
  • Approvals denied by default. Token approvals grant a claim that outlives the grant and cannot be metered at dispatch, so an agent may not grant them unless you allow it — and then the approved amount counts against its cap.
  • Authority is structurally out of reach. Ownership, recovery configuration, post-quantum keys and module administration are denied to every agent, allowlist or not; an agent can never widen, extend or revoke a grant, its own or anyone else's.
  • One signature, three checks. Every agent intent passes the agent grant, then the account's scope, then — on a controller-bound sub-account — the controller's policy. Each can refuse on its own; a mistake in one layer never escalates past the others.
  • You end it. Revoke one agent, revoke all in one action, or uninstall the module — the hardest stop. Remaining budget per token is readable at any time, so a wallet or a dashboard can show "so much left in this agent's allowance".

#What this is for

  • A trading agent on a sub-account funded in one stablecoin, paying its own fees from the same budget, allowed exactly the venues and functions you listed, capped per day, expiring in thirty days.
  • A protocol with a dedicated, policy-bound sub-account per user, whose rules the user accepted and can leave.
  • A person or a team with separate pockets for separate purposes under one identity, each with its own budget and window.

#Status

Live on Ethereum, Optimism, Base, Arbitrum and Polygon and on the test networks since the September rotation. The wallet's module surface follows the ERC-7579 module-management dialect; execution runs only through the Final Gateway's intent rail, never through account-abstraction user operations.

#See also

Final Wallet: security and capabilities · User guide · Protocol integration · Intents · Security-first architecture · Final Identity