taler-docs

Documentation for GNU Taler components, APIs and protocols
Log | Files | Refs | README | LICENSE

commit cc56686c3253a73c026af974f78f0e9568662d0b
parent 703a71813e390f533993e4e414471c63b0958d97
Author: Christian Grothoff <grothoff@gnunet.org>
Date:   Mon, 17 Aug 2026 20:53:43 +0200

initial draft

Diffstat:
Mdesign-documents/100-shares.rst | 97++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 96 insertions(+), 1 deletion(-)

diff --git a/design-documents/100-shares.rst b/design-documents/100-shares.rst @@ -9,16 +9,101 @@ CG has the lock on this. Motivation ========== +Taler can tokenize assets other than fiat-money or crypto-currencies. +One asset class that could be particularly promising are shares in +companies. This design document specifies how Taler could be used to +tokenize shares and pay out dividends. + Requirements ============ +- emit shares for fiat money (raising capital), showing investor brief / shareholder agreement before purchase +- sell shares for fiat money to new shareholders +- buy shares for fiat money from existing shareholders +- issue dividends from the business to shareholders +- notify shareholders about business developments, such as shareholder meetings + +Enabling shareholders to vote (e-voiting) on business decisions is out of +scope for this initial design and left for a future design document. + + Proposed Solution ================= +Shares are something a new frontend allows users to buy and sell +(or the company to emit) using a traditional merchant backend for +the cryptographic part: + +- add new token family "shares" in the merchant backend; it includes + new meta-data for wallets to learn about notifications and dividends + from the (new) frontend +- share token families have a generation, like 2024 and 2025, where + the contract for selling 2024 tokens for 2025 tokens yields + the dividend (see below) +- merchant backend tracks number of shares issued and bought back, + thus knows number of shares outstanding +- buying shares is a regular v1 contract with share tokens as outputs + and Taler payments in digital cash are inputs; the token family + references the shareholder agreement (must not be forgotten with the + purchase details) +- new frontend includes endpoints to send notifications to wallets + for issued shares, such as dividend notifications or shareholder + meeting announcements; wallets should request updates at a + frequency specified with the token family; all notifications are + ordered (numerically), with an endpoint to list all notifications + past a given serial ID, and another to download each of the + (historic) notifications; once issued, notifications never change; + notifications are signed by a long-term frontend key; note that + we probably want these announcements to be managed by the merchant + backend as a new feature: this way, all of the auditing can focus + just on the merchant backend +- new frontend includes its own wallet; it is used to pay dividends; + wallets can request a contract to sell generation X shares for + generation X+1 shares (once a notification has been posted that + dividends for generation X shares are available). In that contract, + the wallet_data includes either a p2p-pull request that tells the + frontend where to pay the dividend (from its local wallet); + note that the frontend probably should handle the case where the + local wallet does not have the required balance and merely exports + the list of p2p-pull requests instead of executing them immediately +- new frontend tracks order-book with buy and sell orders, allowing + share owners to indicate the number of shares they want to buy or + sell at a certain price; these bids must be *backed* by tokens + (money or shares) with signatures to buy or sell the respective + amount of stock at the given price; double-spending is NOT yet + detected when the order is made, but deferred up to the moment + where the order would be executed; here the frontend would use + a transient wallet: the buy order would be for an already + signed contract to buy shares, the sell order would include a + p2p-pull request to be satisfied; by giving the buyer the new + shares the frontend would be paid (into its bank account) and + could then (possibly delayed) use those funds to satisfy the + p2p-pull request from the seller; as above, a frontend-integrated + wallet may be able to immediately pay the p2p-pull requests (if + its balance is sufficient), or the p2p-pull requests are exported + to the administrator to be executed later +- new frontend allows admin to emit new shares (picks best bids from + order-book at the deadline, possibly conditional upon top N-bids + exceeding minimum investment, or top N-bids being above minimum + price) +- all requests are stored, and there is a new merchant auditor that + inspects the share transaction data and checks if all p2p-pull requests + have been paid out (the existing merchant backend reconciliation + logic should naturally already check the incoming deposits). + Note that the order book itself probably does NOT need to be in + the merchant backend, but we could keep it there as well (to keep + the new frontend "stateless"; in that case, we'd also want to track + the p2p-pull requests in the merchant backend) +- + + Test Plan ========= -(If this DD concerns a new or changed feature, describe how it can be tested.) +- backend logic to issue, sell, buy shares +- pay out dividends +- wallet-core and wallet-UI tests + Definition of Done ================== @@ -30,9 +115,19 @@ flag or dev-mode flag.) Alternatives ============ +- Using the exchange as the emitter of shares; not so good as it is + single-currency by design and not setup for dealing with purchases; + it might make p2p transfers easier, but regulation on trading is + different for shares and the mismatch is likely big enough that + not overloading the exchange code with is it is a good idea. + + + Drawbacks ========= + + Discussion / Q&A ================