Нет описания

Cesar Rodas 8908a515ca Add a subaccount dimension so an account can hold many inflights 5 часов назад
.github ee2e0e2b12 Introduce Kuatia, an append-only, auditable multi-asset ledger 4 дней назад
crates 8908a515ca Add a subaccount dimension so an account can hold many inflights 5 часов назад
doc 8908a515ca Add a subaccount dimension so an account can hold many inflights 5 часов назад
.gitignore ee2e0e2b12 Introduce Kuatia, an append-only, auditable multi-asset ledger 4 дней назад
CHANGELOG.md b3fcc0152e Prepare 0.2.0 release 3 дней назад
CLAUDE.md ee2e0e2b12 Introduce Kuatia, an append-only, auditable multi-asset ledger 4 дней назад
Cargo.lock fc96f6c73b Use CBOR for inflight metadata and make confirm batch 21 часов назад
Cargo.toml fc96f6c73b Use CBOR for inflight metadata and make confirm batch 21 часов назад
LICENSE ee2e0e2b12 Introduce Kuatia, an append-only, auditable multi-asset ledger 4 дней назад
README.md ee2e0e2b12 Introduce Kuatia, an append-only, auditable multi-asset ledger 4 дней назад
rust-toolchain.toml ee2e0e2b12 Introduce Kuatia, an append-only, auditable multi-asset ledger 4 дней назад

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.