Design: choose unit-of-account convention (fiat-first vs bitcoin-first) and migration path #18
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Libra today records postings as fiat-denominated with
@@ SATSprice notation — fiat is the unit of account, SATS is metadata about the BTC/fiat rate at posting time. The long-term thesis is bitcoin-first accounting (SATS as unit of account, fiat as cost basis). This issue tracks the decision and the eventual migration.The trade-off surfaces every time the BTC/fiat rate moves between accrual and settlement (or between any two postings on the same lot). See #16's comment thread for a worked example: a $200 debt booked at 200,000 sats and settled later for $200 = 250,000 sats — the 50k sats delta has to land somewhere, and where depends on this convention.
Today: fiat-first (
@@price notation)Encoded in
beancount_format.py—format_expense_entry,format_income_entry,format_revenue_entry, etc. all emit<fiat> <CCY> @@ <sats> SATS.Target: bitcoin-first (
{}cost basis){}is the per-lot cost basis.Income:PnL(or equivalent) account in the default chart; every existing entry's notation needs migration; UI has to communicate fluctuating sats balances and explain realized gain/loss to non-bitcoiners.Canonical reference: Beancount's trading_with_beancount doc (originally for stocks, applies cleanly to BTC). Community "bitcoin-only" Beancount setups follow this pattern.
Hybrid (transitional)
Keep day-to-day postings fiat-first today, but emit Beancount
pricedirectives for BTC/ on every posting date. Doesn't change the unit of account; lets a separate report derive "what would this look like under bitcoin-first?" The fiat-first ledger stays the source of truth.Useful as: (a) a low-risk way to expose the bitcoin-first perspective in the UI without breaking the ledger; (b) a discovery phase before committing to a full migration; (c) a permanent option if the user base never tolerates fluctuating sats balances.
What to decide
@@entries as{}? Keep history as-is and only flip new entries? What does Fava show for the seam?Income:PnLvsIncome:Trading:BTCvs a separateEquity:UnrealizedGainsfor unrealized; needs to land in the default chart of accounts.fava_client.py, the webapp Transaction History) assumes fiat-denominated balances; a flip needs each touched.Why this matters
Not blocking
This is a design issue, not implementation. No code change is associated. Cross-link from any feature that meaningfully depends on the answer.