polycratia

A balance column is the most expensive shortcut in a custodial system.

It reads like a fact. It is actually a cache — one you now have to invalidate correctly under concurrency, retries and partial settlement, forever.

I have built custodial wallets for BTC and ETH, a fiat-to-crypto onramp, and per-user virtual account ledgering where money arrived tagged only by requisites and had to be attributed before it could be trusted. The same pattern survived all of them: a balance is derived from paired postings, never stored. You append, you do not update. The number becomes a query, and it stays reconstructible from history instead of from a support ticket.

A hold follows from that. It is not a subtraction from an available column — it is its own object with a lifecycle: reserved, then settled or released, sometimes for less than it reserved. The moment partial settlement is possible, the two-phase object is the only model that stays honest.

And the money type should not belong to the ledger. Amount and currency as a protocol the ledger accepts is what lets card rails, account-to-account transfers and USDT postings land in one journal without the ledger knowing anything about any of them.

Where does your ledger keep the truth today — in a column, or in the postings?

https://polycratia.com/blog/a-balance-is-a-query-and-a-hold-is-not-a-column/

react

$ new-project --brief

or email hey@polycratia.com