First tagged release of the OpenAjo application layer, running against the deployed testnet contracts.
Contracts this targets
| Contract | ID |
|---|---|
circle |
CCLVOHGHDH32GWFAMCEMVHLNJSF6ENVHERYWU2OHUYWWLAOKLVR3HGKS |
reputation |
CDXPH2PYUTRW7GV57X6CJH3E3JOPROSC23NXPMAXOO3EOBI5UTCB2GTQ |
What's in it
packages/sdk— typed client for both contracts. Reads run as RPC simulations; writes take a pluggableSignFnso the SDK never touches a key. Decoded contract errors, event decoding, andbigintamount helpers.indexer/— polls SorobangetEventsinto Postgres, serves a read-only REST API (/health,/circles,/circles/:id,/members/:address,/stats), and optionally crankssettle_cyclefor due circles.apps/web— Next.js app: create/join/contribute/settle with Freighter, circle timelines, member reputation. Light and dark themes.
Design
- Writes go from the browser straight to Soroban RPC, signed by the user's wallet. No server holds user keys; the only server key is the optional crank, which pays fees for the permissionless
settle_cycleand can move nothing else. - The indexer folds events to learn which circles changed, then re-reads state from the contract by simulation — so the database cannot drift from on-chain truth.
bigintraw token units end-to-end; no floating-point math on money.
Verification
- 8 SDK unit tests passing (ScVal round-trips, amount parsing, event decoding).
- SDK reads and writes verified against the live testnet contracts.
- Typecheck clean across all workspaces; web production build passes (6 routes).
Notes
Unaudited. Testnet only.