Skip to content

Implementation status

Last verified: 2026-09-10.

This page states what exists today across the contracts, the production dApp and relayer, the TypeScript SDK, and this documentation. Every other page documents shipped code — nothing here describes planned code as though it were live.

Contracts

All seven production contracts are implemented and tested. All seven are deployed on Stellar testnet; six are deployed on Stellar mainnet through account_factory (sta-webauthn-verifier is only needed for passkey signers and is not deployed there yet).

ContractStatusNotes
sta-smart-accountImplementedRoot treasury authority, custom account, 37 tests passing. Reference
sta-policy-engineImplementedAsset/recipient/operation allowlists, amount caps, policy versioning, fail-closed validation. 12 tests passing. Reference
sta-intent-registryImplementedScheduled-payment lifecycle, execution windows, exactly-once child execution. 14 tests passing.
sta-recovery-managerImplementedGuardian quorum, timelocked guardian administration, guardian-pulled freeze, finalized recovery record. 35 tests passing.
sta-transfer-adapterImplementedNarrow, preauthorized single-recipient SAC transfer. 5 tests passing.
sta-split-adapterImplementedNarrow, preauthorized one-to-many SAC transfer. 8 tests passing.
sta-webauthn-verifierImplementedReal secp256r1/passkey signature verification backing Signer::External. 9 tests passing.

120 tests total, cargo test --workspace, 0 failures.

Proof-of-concept contracts

Four earlier PoC crates — smart_account_poc, policy_registry_poc, intent_registry_poc, recovery_guard_poc — still exist on disk in the smart-contracts repository's contracts/ directory but are not members of the Cargo workspace and are not built, tested, or deployed by anything current. They predate the OpenZeppelin-composed V1 rewrite, use a different soroban-sdk version, and do not execute real Stellar Asset Contract transfers. Their earlier testnet deployment record is archived separately — not part of what to review.

Toolchain

ComponentVersionWhy
soroban-sdk26.1.0Pinned to the 26.x line: OpenZeppelin Stellar 0.7.2 requires ^26.1.0, which excludes 27.x
OpenZeppelin Stellar0.7.2stellar-accounts, stellar-access, stellar-contract-utils
Stellar CLI (build and deployment)26.0.0 exactlyThe CLI stamps its version into every artifact's cliver metadata, so the deployed WASM hashes only reproduce with this version — see Mainnet deployment
Rust (contract builds)1.94.1 (pinned)Pinned by the repository's toolchain file; the reference build host is the Linux x86_64 CI runner
Rust (CI, stellar-cli install step only)1.96.0 (pinned)cargo install --locked stellar-cli pulls a lockfile-pinned ethnum version incompatible with Rust ≥1.97 (rust-lang/rust#157363); this one CI step is pinned below that regression

Testnet deployment

All seven contracts are deployed and live on Stellar testnet, with published contract addresses, WASM hashes, and transaction references for every deploy/init/wiring step — see docs/TESTNET_DEPLOYMENT.md in the smart-contracts repository. That record includes a real signer-authorized SAC payment executed on-chain, live-reproducible policy rejections (stale version, disallowed recipient, amount above cap), and a second independently-registered signer under a second context rule confirming the authorization model isn't specific to the founding deployer key.

Mainnet deployment

account_factory and a first example treasury are live on Stellar mainnet: addresses, WASM hashes, initialization parameters, and every transaction of the setup and testing sessions are in docs/MAINNET_DEPLOYMENT.md and docs/MAINNET_TESTING_TRANSACTIONS.md; summarized on Mainnet deployment. Exercised there with real transactions: XLM and USDC transfers, split payments, scheduled payment create/execute/cancel, pause/unpause, TTL maintenance, signer and context-rule management. Not exercised on mainnet because of their real ~24 h timelocks: guardian freeze/recovery and adapter reconfiguration. On testnet the adapter change was proven under the real delay, and freeze/recovery on a reduced-delay throwaway build — see the Testing support guide.

Production dApp, relayer, and SDK

ComponentStatus
Production dAppLive at smarttreasury.io/app on mainnet (repository dApp, branch main). Deploys treasuries through the factory, reads state live, manages signers, rules, policy, one-shot, split, and scheduled payments. See the Operator guide.
Testnet dAppDeployed from branch testnet as a Vercel preview; not publicly reachable. Run it locally against testnet instead (see the Testing support guide).
RelayerLive inside the dApp: durable job queue in Postgres, idempotent execution (on-chain is_child_executed check, optimistic locking, and a five-minute executing lease so two runs never submit the same child), per-treasury authorization — a signer proves their wallet with a signed message and may queue and Execute only for treasuries they sign for; no operator token ever reaches the browser. Scheduled trigger: live — a QStash schedule calls POST /api/relayer/run in production with a signature the route verifies; QStash retries a failed run and reports it to its failure callback, which is where alerting hooks in. pnpm relayer:run (operator token) is the manual fallback; there is no runbook beyond it yet.
Recovery in the dAppNot built: guardians can be added and checked from the dApp; freeze, recovery proposal, approval, and finalization have no screen and are operated through the SDK or CLI.
TypeScript SDK (sta-sdk)Published on npm: 0.2.1 (2026-09-11). 0.1.x targets testnet only; 0.2.0 added the mainnet configuration and examples; 0.2.1 makes prepare* work against the deployed contracts (a two-node authorization tree for fund-moving calls, a market inclusion fee instead of BASE_FEE, which mainnet refuses) and adds submitTransaction for wallet-signed envelopes. See TypeScript SDK.
dApp ↔ SDKThe dApp builds on sta-sdk 0.2.1: the four payment flows call its prepare* helpers, the relayer prepareRelayerExecution, account deployment buildClassicAuthEntry, and every state read its state module. What the dApp keeps of its own: the wallet signing callback, its receipt handling, context-rule selection, SAC balance and instance-storage reads, and the scheduled-intent event scan.

What's deliberately not built

  • ConditionVerifier (optional proof-gated execution using signed external attestations) — explicitly out of scope, not part of the reviewed concerns.
  • Scoped session keys — a bounded-delegation signer model (per-action scope, cumulative amount caps, expiry, single-use auto-revoke) is specified in the architecture but not implemented; treated as a separate, larger feature rather than folded in under time pressure.
  • Multisig admin/owner role — the owner/admin role that proposes governance changes is still a single key, not itself a multisig. Design notes for distributing it exist but nothing is implemented.
  • Third-party security audit — an internal/independent review pass found and fixed real defects across three rounds, but the contracts have not been through a professional external audit. Do not represent them as audited.
  • Any-one-of-N signer rules — a context rule with several signers and no policy attached requires all of them to co-sign. "Any one of N" needs a threshold policy contract that is implemented (threshold_policy) but not deployed. The dApp warns before a write that would make a rule unanimous.

These are not gaps in a plan running behind schedule — they're named boundaries of the current scope. See docs/V1_SCOPE.md in the smart-contracts repository for the full detail on each.

The Smart Treasury Account contracts have not been independently audited. OpenZeppelin's Stellar libraries, which they build on, have been.