Sen descrición

Cesar Rodas 4f8f528196 Make crash recovery validating, phase-tracked, and non-double-spending hai 5 días
.github c6ef03c386 Kuatia: append-only, auditable, multi-asset UTXO-style ledger hai 1 semana
crates 4f8f528196 Make crash recovery validating, phase-tracked, and non-double-spending hai 5 días
doc 4f8f528196 Make crash recovery validating, phase-tracked, and non-double-spending hai 5 días
.gitignore 7dee7fe3d0 Add accounting-mapping doc and ignore .DS_Store hai 1 semana
CLAUDE.md 4f8f528196 Make crash recovery validating, phase-tracked, and non-double-spending hai 5 días
Cargo.lock 45b57f2319 Make storage a dumb instruction-follower; move commit + recovery into the saga hai 6 días
Cargo.toml c6ef03c386 Kuatia: append-only, auditable, multi-asset UTXO-style ledger hai 1 semana
LICENSE c6ef03c386 Kuatia: append-only, auditable, multi-asset UTXO-style ledger hai 1 semana
README.md c715bd3924 Make the Store the atomic invariant boundary for commits hai 1 semana

README.md

kuatia

kuatia (kuatiʼa) — Guaraní for paper, document, writing. A fitting name for a small, append-only ledger library.

Auditable, multi-asset UTXO-style ledger in Rust.

Overview

kuatia models value as postings — signed amounts owned by exactly one account. Transfers atomically consume existing postings and create new ones, enforcing per-asset conservation. This gives the same safety guarantee as double-entry bookkeeping (Σ debits = Σ credits), expressed as sum(consumed) == sum(created) per asset over signed postings. There are no mutable balance fields; an account's balance is always the sum of its active postings.

┌─────────────────────────────────────────────────────┐
│                   kuatia (async)                    │
│                                                     │
│  Intent layer:  TransferBuilder + commit · balance   │
│  Saga pipeline: resolve → reserve → validate → fin.  │
│  Raw pipeline:  load  →  plan  →  apply             │
│  Saga steps:    legend step adapters                 │
├─────────────────────────────────────────────────────┤
│               kuatia-core (pure)                    │
│                                                     │
│  Types:         Account · Transfer · Posting · Cent │
│  Validation:    validate_and_plan()                 │
│  Hashing:       double-SHA256, content-addressed    │
│  Selection:     greedy posting selection             │
└─────────────────────────────────────────────────────┘

Crates

Crate Purpose
kuatia-types Domain types — AccountId, Posting, Transfer, Cent, etc.
kuatia-core Pure, sans-IO decision logic — validation, hashing, posting selection.
kuatia-storage Store trait (7 sub-traits), InMemoryStore, store_tests! conformance macro.
kuatia-storage-sql SQL-backed Store — SQLite and PostgreSQL via sqlx.
kuatia Async resource layer — Ledger, saga commit pipeline, intent-layer API.

Quick Example

use std::sync::Arc;
use kuatia::ledger::Ledger;
use kuatia::mem_store::InMemoryStore;
use kuatia_core::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let ledger = Arc::new(Ledger::new(InMemoryStore::new()));

    let usd = AssetId::new(1);
    let alice = AccountId::new(1);
    let bob = AccountId::new(2);
    let bank = AccountId::new(3); // external account

    // Create accounts, deposit, pay...
    // See doc/crates.md for the full API reference.

    Ok(())
}

Documentation

License

See LICENSE for details.