Skip to content

System Architecture

Governing principle

AURA is an operating system for blockchain: a set of smart contracts with a good user interface. The contracts are the kernel, not plumbing under someone else's rails. Every security guarantee the product makes is enforced in the kernel. If a guarantee lives only in the UI, it is not a guarantee.

The decision everything follows from

The product makes security promises: trusted payees get less friction, large payments to new payees get more, very large ones need a second signer, sanctioned addresses are refused. There are two places those rules can live.

Rules in the backend Rules in the contracts
Compromise the backend Attacker moves everyone's money Attacker can submit, but not authorise
User verifies the rules Must trust AURA's word Reads the contract
"Non-custodial" claim Weak, you enforce policy on their funds Genuine, the account enforces its own policy
Enterprise API story A SaaS product Infrastructure others build on
Regulatory posture Looks like control Looks like software

AURA chooses the right-hand column. That is what "operating system" means here.

Layer map

flowchart TB
    subgraph UI["SHELL, what the user touches"]
        W["Next.js web app<br/>mobile-shaped"]
        AI["AI layer<br/>Concierge · Navigator · Address Intelligence"]
    end
    subgraph SVC["SERVICES, untrusted by design"]
        REL["Relayer<br/>submits, never authorises"]
        VER["Address Intelligence API<br/>AURA Guard"]
        IDX["Indexer<br/>ledger, statements"]
        ATT["Attestation issuer<br/>KYC to signed claim"]
        FAC["Second-factor service<br/>issues co-signatures"]
    end
    subgraph KERN["KERNEL, the product"]
        ACC["AuraAccount<br/>ERC-4337 + ERC-7579"]
        SEC["AuraSecurityManager<br/>hook · the auth ladder"]
        REG["AuraPayeeRegistry<br/>trust state"]
        SES["SessionKeyValidator"]
        PK["PasskeyValidator<br/>WebAuthn P-256"]
        REC["RecoveryModule<br/>timelocked"]
        PM["AuraPaymaster<br/>gas sponsorship"]
    end
    subgraph CHAIN["BASE"]
        EP["EntryPoint v0.7"]
        TOK["USDC · EURC · GBPT · USDT"]
    end

    W --> AI
    W --> REL
    W --> VER
    W --> IDX
    AI -.proposes only.-> W
    REL --> EP
    EP --> ACC
    ACC --> SEC
    SEC --> REG
    ACC --> SES
    ACC --> PK
    ACC --> REC
    EP --> PM
    ACC --> TOK
    ATT -.signed claim.-> ACC
    FAC -.co-signature.-> W

Three layers, one rule: the shell and the services are untrusted; only the kernel and the user's signature are.

The trust boundary that matters most

The relayer is untrusted. It can submit a UserOperation and it can pay for gas. It cannot authorise one. Compromising the relayer costs availability and money; it does not cost users their funds.

This is a deliberate correction to the obvious design. The natural reading of "emit an event, the relayer catches it, does 2FA, then executes" makes the relayer a trusted authoriser, a single point of compromise that can move every user's money. That is a custodian wearing non-custodial clothes.

Instead:

The second factor does not trigger execution. It releases a signature.

A separate second-factor service holds an independent key. When the user passes OTP or approves on a second device, that service returns a co-signature over the exact UserOperation hash. The account verifies both signatures. The relayer only carries bytes.

  • The relayer can be a commodity bundler, replaced or run by a third party.
  • The second-factor service can only ever co-sign what the user's device already signed.
  • Neither service alone, nor both together, can move funds without the user's device signature.

Mapping to the named AURA modules

The app is the first consumer client of the company's infrastructure. Nothing is invented for AURA Money alone.

Capability in the app AURA module Where it lives
Payee verification, sanctions, risk scoring AURA Guard Service + on-chain policy in AuraSecurityManager
Auth ladder, limits, trusted payees AURA Guard Kernel, AuraSecurityManager + AuraPayeeRegistry
Route and currency selection AURA Flow Service (single chain in v1, framed honestly)
Transfers between accounts, later cross-chain AURA Bridge Service + CCTP adapter, chain 2 onward
Scheduled payments, payroll AURA Treasury Kernel module, later
API, SDK, auth, identity AURA Core SDK + relayer + attestation issuer

Request lifecycle: a Tier 3 payment

sequenceDiagram
    participant U as User
    participant App
    participant G as Guard API
    participant F as 2FA service
    participant R as Relayer
    participant EP as EntryPoint
    participant A as AuraAccount
    participant S as SecurityManager

    U->>App: Pay Sarah $2,500
    App->>G: re-screen payee (fresh, not cached)
    G-->>App: clear · risk low
    App->>App: build UserOp · compute hash
    U->>App: passkey signature
    App->>F: request co-signature (+ OTP)
    F-->>U: OTP
    U->>F: code
    F-->>App: co-signature over the same hash
    App->>R: submit
    R->>EP: handleOps
    EP->>A: validateUserOp
    A->>A: verify passkey sig + co-signature
    A->>S: preCheck(target, value, payee state)
    S->>S: score · Tier 3 · queue with delay
    S-->>A: QUEUED (not executed)
    Note over S: 30-min cooling-off · user may cancel
    R->>EP: execute queued intent after delay
    EP->>A: execute
    A->>A: transfer USDC

The contract enforces the tier, the delay, the cancellation window, and the two-signature requirement. The UI merely displays them. A malicious client cannot skip any of it.

What is deliberately off-chain

On-chain is expensive, public, and permanent. These do not belong there:

Off-chain Why
Payee names "Sarah Chen" on a public ledger is a privacy leak dressed as a feature
KYC documents and PII Only a signed attestation reaches the chain
Risk scores and sanctions results Provider data, changes constantly, commercially licensed
Statements and categorisation Derived; rebuilt from chain rather than stored
AI conversation history User data, not consensus data

Failure posture

If this dies Effect Mitigation
Relayer No new payments; funds safe and withdrawable Multiple bundlers; documented direct-submit escape hatch
Guard API No new payees, no sends, fail closed Never fail open. Refusing to guess is the product.
2FA service Tier 2+ blocked; Tier 0/1 still work Second device as an alternate factor
Indexer History/statements stale; balances still read from chain Chain is the source of truth for money
Paymaster funded out Payments stall Alerting on balance; user never sees gas
Privy Users cannot sign in The escape hatch below

The escape hatch

A non-custodial claim is only true if the user can leave. The user must always be able to withdraw their funds without AURA's cooperation, no relayer, no Guard API, no frontend.

The account contract is fully functional standalone, its address and ABI are published, and an emergency-withdrawal path is documented. It is a hard requirement, it will be tested end to end, and it is what makes the custody conversation with regulators winnable rather than hopeful.