We hereby announce the bookwerx multi-currency, client-server, bookkeeping system.
bookwerx-core-rust (https://github.com/bostontrader/bookwerx-core-rust) Is the meat and potatoes of bookwerx. This is a server, written in Rust, that implements an API for doing bookkeeping. With this API you can define the currencies and accounts that you wish to use, create suitable transactions, observe aggregate phenomenon via reporting tools, and hunt down nettle-some bits o' lint with the linter.
bookwerx-ui-elm (https://github.com/bostontrader/bookwerx-ui-elm) Is an example user interface, the primary purpose of which is to help the user understand the bookwerx-core-rust API. With this app the user can observe the http traffic between the UI and the server. In this way perhaps insight can be had.
Public Demonstration Server
We have a public demonstration server available at http://23.253.160.60. This will serve bookwerx-ui-elm. From there, work the app, observe the http traffic with the server, and gain personal edification.
Why?
As you might have experienced, doing bookkeeping for your crypto-empire is considered by some authorities to be the most tedious and boring thing there is. Typing this stuff into your spreadsheet by hand is absurdly labor-intensive and error-prone. But building stronger software to manage this better is a monstrous distraction from your primary goal of global conquest. Although none of this task is particularly rocket sciency, the individual pieces of it work well together to collectively put up quite a defence. Instead of wasting your time reinventing this wheel, why not let bookwerx do the dirty work for you?
Consider your own personal experience with mining pools and crypto-exchanges. As a user I want to know what my balances are. I want to be able to see all the transactions that created said balances and I'd like to see running totals to assist in debuggery. I do not want to see random fragments of this information scattered all over the website, complete with blind-spots, nor do I want to see numbers asserted as correct without any derivation, or lists of transactions with many currencies mixed together and no running totals.
Use cases:
- I'm doing automated trading. Where are all my coins _right now_ ?
- My mining pool creates a blizzard of transactions. My users want to know what they have earned, what they have received, and how much they are due now. I want a managerial accounting overview of the entire process.
- My MtGox killer crypto-exchange is almost ready to go. The setting sun reminds me that it's time to strap on a hastily built bookkeeping system, just in time for tomorrow morning's debut. My market supports 500 different coins and my customer funds are divided into 8 different locations. Those pesky customers want to know and verify all their balances. For extra credit: Realize that users of valuable coins don't like round-off error and that it annoys them to wonder if the discrepancies that are ubiquitous in my market's UI vs the customer's internal records are ordinary errors, round-off errors, theft, merely round-off-for-display issues or perhaps some new form of hitherto-now unknown form of dumfoolery.
Multi-Currenciarity
What exactly do this mean? In conventional bookkeeping the sum of the Debits of a transaction should equal the sum of the Credits. Bookwerx merely drops that constraint. The actual software plumbing of creating accounts, transactions, etc, remains essentially the same.
The DR=CR constraint in conventional bookkeeping works just fine when dealing with a single currency. The value in doing this is that a handful of conditions hold true such as Assets = Liabilities + Equity, or that Net Income = Revenue - Expenses. It also serves as a simple error detection scheme when creating transactions. However, the conventional system requires unpleasant contortions to try to squeeze in other currencies. It's bad enough when you try to work with just a few multi-currency transactions, but the scheme completely disintegrates when you push harder.
bookwerx simply drops this constraint. The sun still rises by command of the rooster.
With our new found freedom we can create transactions such as:
DR Cash in Mattress 500 Quatloos
CR Bank of Mises 15 General Atomic Shekles
What does this mean? By inspection it looks like a currency exchange and a bank withdrawal. The quantity of value withdrawn from the bank really does equal the quantity stuffed into the mattress, even if the actual numbers and units are different.
The loss of DR=CR as an error detection scheme for transactions is a minor price to pay. Fortunately, other error detection mechanisms exist, such as reconcile your balances.
The biggest issues comes from wrapping our heads around the meaning of financial reporting. Balance Sheet and Profit and Loss Statements work as usual, but it's not at all obvious how to "compare" things.
For example:
Assets: Dec 31, 2019 Dec 31, 2018
Cash in Mattress 500 QTL 200 QTL
Bank of Mises 250 GAS 550 GAS
------- -------
subtotal
Liabilities:
Wecheatembad Credit Corp 500 BTC 150 BTC
Equity
Owner's Equity 10000 CNY 10000 CNY
In this example, assets really do still equal the sum of liabilities and equity, even if there's an exchange rate issue to befuddle the analysis. Is the 2019 BS "better" than the 2018 edition?
The bottom line here is that the actual plumbing of bookkeeping does not require the DR=CR constraint and it works just fine without. However the analysis of the meaning of transactions and reports is a topic beyond the scope of mere bookkeeping. This distinction is hidden when only using a single currency, but is unfortunately not magically solved with bookwerx 1.0
But while you ponder the meaning of these deep questions, you'll still want to know the actual bookkeeping details of these things on a day-to-day basis.