Dara Docs
ReferenceSecurity

Authority Matrix (Stage 6/12)

Two layers must both agree before anything with financial effect happens:

  1. Application RBAC + four-eyes: who may request and approve, in the database.
  2. Stellar signatures: which keys can make the network accept it.

Neither layer trusts the other. The backend cannot issue alone (it holds no issuance-capable key), and human signers sign only proposals that reference an approved request (the signing tool shows the request ID and the decoded operations).

1. Stellar signer configuration

The number of human signers is configuration (ISSUER_SIGNERS, TREASURY_SIGNERS, 1–10 keys each); thresholds follow from it (ceremony.Quorum): with n signers of weight 10, approving needs a = min(2, n) of them and a signer change needs a + 1 when one lost key still leaves that reachable, else a.

nApprove (issue, burn, refill, clawback)Change signersSurvives one lost key
1 (launch, owner decision 2026-10-31)11No
222No
322Yes
4 (reference design)23Yes

At launch one person holds both the issuer key and the Treasury key (../decisions/OWNER_DECISIONS_20261031.md, accepted risks). The table below is written for n signers H1…Hn and T1…Tn; the numbers in brackets are the launch values.

AccountMasterSigners (weight)Low / Med / HighNotes
ISSUER (one per asset)0H1…Hn (10 each), AUTH (1)1 / 10·a / 10·change (1 / 10 / 10)Humans issue or claw back at the medium threshold; AUTH alone only SetTrustLineFlags
TREASURY_COLD0T1…Tn (10 each)10 / 10·a / 10·change (10 / 10 / 10)Refill and burn at the medium threshold
TREASURY_HOT0HOT (10), T1…Tn (10 each)10 / 10 / 20HOT pays alone; a signer change needs HOT and one T, or two T
RESERVE_SPONSOR0SPONSOR (10), T1…Tn (10)10 / 10 / 20Same shape as HOT
FUNDER0FUNDER (10), T1…Tn (10)10 / 10 / 20Same shape
CHANNEL_n, GOV_CHANNEL0CHANNEL (1)1 / 1 / 1Holds only fee XLM; worst case if lost: fees and sequence numbers
Customer accounts0CUSTODY (1)1 / 1 / 1Shared custody key; the app layer decides which account may be moved

Every SetOptions that changes signers or thresholds goes through the signer-change procedure (../operations/ISSUER_OPERATIONS.md §2): a snapshot of the current configuration, the proposed one, a simulation proving every threshold stays reachable by the remaining signers if any one signer is lost (from three signers up), four-eyes in the app, the human signatures, then post-change verification by the authority watcher.

2. Online keys and blast radius

KeyCanCannotIf compromised
AUTHAuthorize or revoke trustlinesIssue, claw back, move tokens, change configFreeze or unfreeze customers (DoS); authorize strangers (harmless, since only our accounts hold or send). Rotate at the issuer's high threshold
HOTPay from TREASURY_HOT (to authorized holders only)Touch COLD, issue, change signersLoss ≤ float, and only to authorized accounts (all ours); recover with clawback; rotate via T
CUSTODYMove customer balances between authorized accounts, or to HOT/issuerIssue, authorizeCustomer balances can be shuffled among our accounts or burned to the issuer. Detected by the indexer (no matching intent memo); recover with clawback + re-issue
SPONSORSponsor new reservesMove tokensXLM loss ≤ its balance
FUNDER / CHANNELPay feesMove tokensXLM loss ≤ balance

3. Application roles (RBAC)

Ported from the siblings' actor package, extended for Stellar.

RoleRequestApproveRead
PLATFORM_ADMINAsset definitions, staff provisioning, trading suspend/resume, emergency gate closeStaff provisioning (other admin)All
RESERVE_MANAGERBacking changes—Reserves
RESERVE_APPROVER—Backing changes, issuance, burn, refillReserves, supply
TREASURY_OPERATORIssuance, burn, refill; prices; cash entriesCash entries made by othersTreasury
COMPLIANCE_OFFICERKYC approval, freeze, clawback requestsUnfreeze and clawback requested by othersCustomers
SECURITY_ADMINSigner-change requests, key rotationSigner changes (with PLATFORM_ADMIN)Security
RECONCILIATION_OPERATORRun reconciliation; annotate findingsClose findings raised by othersReconciliation
AUDITOR——Everything, read-only
SUPPORT——Customers and orders, read-only, no KYC documents

Four-eyes (requester ≠ approver, enforced by a database CHECK and by the service): backing change, issuance, burn, Treasury refill, clawback, unfreeze, signer/threshold change, large price move, manual cash, staff provisioning.

High-risk request state machine: REQUESTED → APPROVED → AWAITING_SIGNATURES → EXECUTED, or REJECTED / EXPIRED / FAILED.

4. Signer proposal procedure (Stellar multisig without a hosted service)

  1. Approval creates a signing_proposals row: the unsigned envelope XDR (source GOV_CHANNEL, op source ISSUER/TREASURY_COLD, MEMO_HASH of the intent, maxTime = now + 24 h), its transaction hash, the network passphrase and the decoded operations.
  2. Each human signer reviews the decoded proposal in the admin console (environment, network, asset, issuer, destination, amount, request ID, approvals: brief §71), then signs the hash on a hardware key offline. They upload the decorated signature (or the signed XDR).
  3. The backend verifies each signature against the transaction hash and the signer's public key, sums the weights, and moves the operation to SIGNED at the threshold. It never holds the human keys.
  4. The submitter sends the envelope like any other (§7 of ../stellar/STELLAR_ARCHITECTURE.md).

At launch the signer signs with the Stellar CLI and a software key on a dedicated laptop (KEY_MANAGEMENT.md §1a); a hardware wallet (Ledger with the Stellar app) works the same way through the CLI. The dev stand-in signs with local keys on Quickstart only.

On this page