This design document discusses how the GNU Taler wallet can support both regional currency deployments and official fiat currencies.
Digital cash in a Taler wallet always requires some kind of trust anchor that backs its value, be it either an exchange directly or an auditor that vouches for one or more exchanges.
The currency code or symbol (EUR, USD, $, …) is thus not enough to know what a particular wallet balance really means. It also matters what exchange or auditor is behind it. Thus the wallet needs some mechanism to allow users to distinguish between an official deployment of a currency (say EUR in Europe) or deployments of regional currencies. Regional currencies might have coinciding currency names for different incompatible deployments (say, MANA to buy Club Mate drinks at different hacker events with completely separate and independent Taler deployments).
Users usually do not want to see and verify the auditor/exchange URL for their digital cash. The wallet thus needs to support some form of “scope” for currencies that indicates the trust anchor for particular amounts and balances.
The scope of a balance/amount gives the user additional information about the meaning and trust anchor of a balance/amount. The scope is always local and contextual to the wallet. Depending on the configuration, the wallet can show different scope information for the exact same coins.
A balance is in exactly one of three scopes:
Whenever the wallet reports an amount, scope information should be present in the same message with the following format:
type ScopeInfo =
| { kind: "global" }
| { kind: "exchange", baseUrl: string }
| { kind: "auditor", baseUrl: string };
The base URLs should be rendered without the https://
and without
trailing slashes:
https://exchange.demo.taler.net/
would be rendered as
exchange.demo.taler.net
.http://ex1.demo.taler.net/
would be rendered as
http://ex1.demo.taler.net
.https://ex2.demo.taler.net/foo/bar/
would be rendered as
ex2.demo.taler.net/foo/bar
.For each configured currency code, the wallet should store following information:
The following example shows how a wallet would render balances with global-scope EUR (i.e. a user would expect these to be “official” EUR that can be used with multiple vendors in Europe), two exchange-scoped MANA balances and one auditor-scoped MANA balance.
Balances:
1.5 EUR
3 MANA ([exchange-icon] exchange.leipzig.ccc.de)
3.3 MANA ([exchange-icon] exchange.berlin.ccc.de)
5 MANA ([auditor-icon] auditor.ccc.it]
In wallet-to-merchant payments, the merchant specifies which exchanges and auditors the merchant accepts. It is desirable that the wallet renders the scope information for a requested amount in a similar way that a balance amount would be rendered.
The amount should always be shown in the scope that is compatible with the merchant and that the wallet holds the highest amount in.
Let’s say a wallet has “auditor.ccc.it” as the global-scope auditor for MANA and holds mana audited by this auditor. A merchant accepts MANA from this auditor as well as from the exchange “mana.my-hackerspace.it”.
A payment request could then be rendered like this:
Summary: Club Mate (5x)
Amount: MANA:50
If a wallet (by a non-Italian hacker) would not have “auditor.ccc.it” as the global-scope auditor for MANA, it would show as:
Summary: Cart #123 at Foomerchant
Amount: MANA:123 ([auditor-icon] auditor.ccc.it)
Other currencies supported by the merchant:
[exchange-icon] mana.my-hackerspace.it
The last part should probably be hidden by default. There might be nicer ways to render this, such as some hoverable (?) icon after the amount that shows details about what currencies the merchant accepts.