summaryrefslogtreecommitdiff
path: root/taler-wallet.rst
diff options
context:
space:
mode:
Diffstat (limited to 'taler-wallet.rst')
-rw-r--r--taler-wallet.rst1198
1 files changed, 245 insertions, 953 deletions
diff --git a/taler-wallet.rst b/taler-wallet.rst
index 0d889a3a..4a975340 100644
--- a/taler-wallet.rst
+++ b/taler-wallet.rst
@@ -1,65 +1,28 @@
-GNU Taler Wallet Developer Manual
-#################################
+..
+ This file is part of GNU TALER.
+ Copyright (C) 2014-2024 Taler Systems SA
-The GNU Taler wallet allows customers to withdraw and spend digital cash.
-
-.. _command-line-wallet:
-
-Command-line Wallet
-===================
-
-The command-line wallet is used primarily for testing by developers.
-
-Building from source
---------------------
-
-.. code-block:: console
-
- $ git clone https://git.taler.net/wallet-core.git
- $ cd wallet-core
- $ ./bootstrap
- $ ./configure --prefix=$INSTALL_PREFIX
- $ make && make install
-
-The wallet command-line interface should then be available as ``taler-wallet-cli`` under ``$INSTALL_PREFIX/bin``.
-
-Installation via NPM
---------------------
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License as published by the Free Software
+ Foundation; either version 2.1, or (at your option) any later version.
-The wallet can also obtained via NPM, the Node Package Manager.
-
-To install the wallet as a global package, run:
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
-.. code-block:: console
-
- $ npm install -g taler-wallet
- # check if installation was successful
- $ taler-wallet-cli --version
+ You should have received a copy of the GNU Affero General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
-To install the wallet only for your user, run:
-.. code-block:: console
+Wallet Manual
+#############
- $ npm install -g --prefix=$HOME/local taler-wallet
- # check if installation was successful
- $ taler-wallet-cli --version
- # If this fails, make sure that $HOME/local/bin is in your $PATH
-
-To use the wallet as a library in your own project, run:
-
-.. code-block:: console
-
- $ npm install taler-wallet
-
-
-Manual withdrawing
-==================
+The GNU Taler wallet allows customers to withdraw and spend digital cash.
-.. code-block:: console
+.. contents:: Table of Contents
+ :depth: 1
+ :local:
- $ taler-wallet-cli advanced withdraw-manually \
- --exchange https://exchange.eurint.taler.net/ \
- --amount EUR:5
WebExtension Wallet
===================
@@ -83,556 +46,344 @@ Android Wallet
Please see :ref:`Build-apps-from-source` in the :doc:`taler-developer-manual`.
-APIs and Data Formats
-=====================
+iOS Wallet
+==========
-.. warning::
+Please see :ref:`Build-iOS-from-source` in the :doc:`taler-developer-manual`.
- These APIs are still a work in progress and *not* final.
+.. _command-line-wallet:
-Envelope Format
----------------
+Command-line Wallet
+===================
-All API responses and notifications are returned in the
-following envelope:
+This section describes how to use the GNU Taler wallet command line
+interface (CLI).
-.. ts:def:: WalletResponseEnvelope
+The the wallet CLI is targeted at developers and operators, but not meant to be
+used by customers. It exposes all functionality that the more user-friendly
+interfaces (Android app, browser extension) offer. However, it provides more
+diagnostics and advanced features as well.
- type WalletResponseEnvelope =
- | WalletSuccess
- | WalletError
- | WalletNotification
+Building from source
+--------------------
-.. ts:def:: WalletSuccess
+The easiest way to install the wallet is via NPM. Note that a recent version of
+Node.JS (``>=12.20.1``) is required.
- export interface WalletSuccess {
- type: "response";
- operation: string,
- // ID to correlate success response to request
- id: string;
- // Result type depends on operation
- result: unknown;
- }
+We recommend to install the wallet package on a per-user basis,
+thus setting ``$INSTALL_PREFIX`` to a directory in ``$HOME``.
-.. ts:def:: WalletError
+.. code-block:: console
- export interface WalletError {
- type: "error";
- operation: string,
- // ID to correlate error response to request
- id: string;
- error: WalletErrorInfo;
- }
+ $ git clone https://git.taler.net/wallet-core.git
+ $ cd wallet-core
+ $ ./bootstrap
+ $ ./configure --prefix=$INSTALL_PREFIX
+ $ make && make install
-.. ts:def:: WalletNotification
+The wallet command-line interface should then be available as ``taler-wallet-cli`` under ``$INSTALL_PREFIX/bin``.
- export interface WalletSuccess {
- type: "notification";
+Installation via NPM
+--------------------
- // actual type is WalletNotification,
- // to be documented here
- payload: any;
- }
+The wallet can also obtained via NPM, the Node Package Manager.
-.. ts:def:: WalletErrorInfo
+To install the wallet as a global package, run:
- export interface WalletErrorInfo {
- // Numeric error code defined defined in the
- // GANA gnu-taler-error-codes registry.
- talerErrorCode: number;
+.. code-block:: console
- // English description of the error code.
- talerErrorHint: string;
+ $ npm install -g taler-wallet
+ # check if installation was successful
+ $ taler-wallet-cli --version
- // English diagnostic message that can give details
- // for the instance of the error.
- message: string;
+To install the wallet only for your user, run:
- // Error details, type depends
- // on talerErrorCode
- details: unknown;
- }
+.. code-block:: console
-Balances
---------
+ $ npm install -g --prefix=$HOME/local taler-wallet
+ # check if installation was successful
+ $ taler-wallet-cli --version
+ # If this fails, make sure that $HOME/local/bin is in your $PATH
-Balances are the amounts of digital cash held by the wallet.
+To use the wallet as a library in your own project, run:
-:name: ``"getBalances"``
-:description: Get a list of balances per currency.
-:response:
- .. ts:def:: BalancesResponse
+.. code-block:: console
- interface BalancesResponse {
- // a list of balances sorted by currency.
- // (currencies with shorter names first, then lexically ascending).
- //
- // Note: Even when a currency has no balance, but pending or past transactions,
- // it should be included in this list with a balance of zero.
- balances: Balance[];
- }
+ $ npm install taler-wallet
- .. ts:def:: Balance
-
- // Balance for one currency.
- // The currency can be derived from any of the
- // "Amount" fields, as the currency is present even
- // when the amount is zero.
- interface Balance {
- // The total Amount that is currently available to be spent
- // including amounts tied up in ongoing refresh operations. These are hidden from the user.
- // If the user tries to spend coins locked up this way,
- // the wallet will give an error message different from "insufficient balance".
- available: Amount;
-
- // the total incoming amount that will be added to the available balance
- // when all pending transactions succeed (including internal refreshes)
- pendingIncoming: Amount;
-
- // the total outgoing amount that will be subtracted from the available balance
- // when all pending transactions succeed (including internal refreshes)
- pendingOutgoing: Amount;
-
- // true if the balance requires user-interaction, e.g. accepting a tip
- // (DEV: can be left out of a first implementation)
- requiresUserInput: boolean;
- }
-Transactions
+Getting Help
------------
-Transactions are all operations or events that affect the balance.
-
-:Name: ``"getTransactions"``
-:Description: Get a list of past and pending transactions.
-:Request:
- .. ts:def:: TransactionsRequest
-
- interface TransactionsRequest {
- // return only transactions in the given currency, if present
- currency?: string;
-
- // if present, results will be limited to transactions related to the given search string
- search?: string;
- }
-:Response:
- .. ts:def:: TransactionsResponse
-
- interface TransactionsResponse {
- // a list of past and pending transactions sorted by pending, timestamp and transactionId.
- // In case two events are both pending and have the same timestamp,
- // they are sorted by the transactionId
- // (i.e. pending before non-pending transactions, newer before older
- // and if all equal transactionId lexically ascending).
- transactions: Transaction[];
- }
-
- .. ts:def:: Transaction
-
- interface Transaction {
- // opaque unique ID for the transaction, used as a starting point for paginating queries
- // and for invoking actions on the transaction (e.g. deleting/hiding it from the history)
- transactionId: string;
-
- // the type of the transaction; different types might provide additional information
- type: TransactionType;
-
- // main timestamp of the transaction
- timestamp: Timestamp;
+The wallet CLI comes with built-in help. Invoke the wallet CLI (or any subcommand) with the ``--help`` flag to get help:
- // true if the transaction is still pending, false otherwise
- // If a transaction is not longer pending, its timestamp will be updated,
- // but its transactionId will remain unchanged
- pending: boolean;
-
- // if present, the transaction encountered a fatal error that needs to be shown to the user
- error?: TransactionError;
-
- // Raw amount of the transaction (exclusive of fees or other extra costs)
- amountRaw: Amount;
-
- // Amount added or removed from the wallet's balance (including all fees and other costs)
- amountEffective: Amount;
- }
-
- .. ts:def:: TransactionType
-
- type TransactionType = (
- TransactionWithdrawal |
- TransactionPayment |
- TransactionRefund |
- TransactionTip |
- TransactionRefresh
- )
-
- .. ts:def:: TransactionError
-
- interface TransactionError {
- // TALER_EC_* unique error code.
- // The action(s) offered and message displayed on the transaction item depend on this code.
- ec: number;
-
- // English-only error hint, if available.
- hint?: string;
-
- // Error details specific to "ec", if applicable/available
- details?: any;
- }
-
- .. ts:def:: WithdrawalDetails
-
- export type WithdrawalDetails =
- | WithdrawalDetailsForManualTransfer
- | WithdrawalDetailsForTalerBankIntegrationApi;
-
- .. ts:def:: WithdrawalDetailsForManualTransfer
-
- interface WithdrawalDetailsForManualTransfer {
- type: "manual-transfer";
-
- // Payto URIs that the exchange supports.
- // Already contains the amount and message.
- exchangePaytoUris: string[];
-
- // Public key of the newly created reserve.
- // Not useful for the UI, but required for integration testing.
- reservePub: string;
- }
-
- .. ts:def:: WithdrawalDetailsForTalerBankIntegrationApi
-
- interface WithdrawalDetailsForTalerBankIntegrationApi {
- type: "taler-bank-integration-api";
-
- // Set to true if the bank has confirmed the withdrawal, false if not.
- // An unconfirmed withdrawal usually requires user-input and should be highlighted in the UI.
- // See also bankConfirmationUrl below.
- confirmed: boolean;
-
- // If the withdrawal is unconfirmed, this can include a URL for user
- // initiated confirmation.
- bankConfirmationUrl?: string;
- }
-
- .. ts:def:: TransactionWithdrawal
-
- // This should only be used for actual withdrawals
- // and not for tips that have their own transactions type.
- interface TransactionWithdrawal extends Transaction {
- type: string = "withdrawal",
-
- // Exchange that was withdrawn from.
- exchangeBaseUrl: string;
-
- // Amount that has been subtracted from the reserve's balance for this withdrawal.
- amountRaw: Amount;
-
- // Amount that actually was (or will be) added to the wallet's balance.
- // Should always be shown as a positive amount.
- amountEffective: Amount;
+.. code-block:: console
- // Further details
- withdrawalDetails: WithdrawalDetails;
- }
+ $ taler-wallet-cli --help
+ Usage: taler-wallet-cli COMMAND
+
+ Command line interface for the GNU Taler wallet.
+
+ Options:
+ -h, --help Show this message and exit.
+ --wallet-db=VALUE location of the wallet database file
+ --timetravel=VALUE modify system time by given offset in microseconds
+ --inhibit=VALUE Inhibit running certain operations, useful for debugging and testing.
+ --no-throttle Don't do any request throttling.
+ -v, --version
+ -V, --verbose Enable verbose output.
+
+ Commands:
+ advanced Subcommands for advanced operations (only use if you know what you're doing!).
+ api Call the wallet-core API directly.
+ backup Subcommands for backups
+ balance Show wallet balance.
+ deposit Subcommands for depositing money to payto:// accounts
+ exchanges Manage exchanges.
+ handle-uri Handle a taler:// URI.
+ pending Show pending operations.
+ run-pending Run pending operations.
+ run-until-done Run until no more work is left.
+ testing Subcommands for testing GNU Taler deployments.
+ transactions Show transactions.
+
+Completing operations
+---------------------
+
+Note that the CLI does not run as a background daemon. When starting
+operations that don't immediately finish, the wallet needs to be run explicitly
+to finish any pending tasks:
- .. ts:def:: TransactionPayment
- interface TransactionPayment extends Transaction {
- type: string = "payment",
+.. code-block:: console
- // Additional information about the payment.
- info: OrderShortInfo;
+ # Do one attempt to finish all pending operations
+ $ taler-wallet-cli run-pending
- // Wallet-internal end-to-end identifier for the payment
- // (assigned before the order is even downloaded, thus the name).
- proposalId: string;
+ # Run until all work is done
+ $ taler-wallet-cli run-until-done
- // The current status of this payment.
- status: PaymentStatus;
+Resetting the wallet
+--------------------
- // Amount that must be paid for the contract
- amountRaw: Amount;
+The wallet can be reset by deleting its database file. By default, the database file
+is ``$HOME/.talerwalletdb.json``.
- // Amount that was paid, including deposit, wire and refresh fees.
- // Should always be shown as a negative amount.
- amountEffective: Amount;
- }
- .. ts:def:: OrderShortInfo
+Handling taler:// URIs
+----------------------
- interface OrderShortInfo {
- // Order ID, uniquely identifies the order within a merchant instance
- orderId: string;
+Many interactions with the Taler wallet happen by scanning QR codes or special
+headers on Websites. To emulate this with the command line interface, run the following
+command:
- // More information about the merchant
- merchant: Merchant;
+.. code-block:: console
- // Summary of the order, given by the merchant
- summary: string;
+ $ taler-wallet-cli handle-uri $URI
- // Map from IETF BCP 47 language tags to localized summaries
- summary_i18n?: { [lang_tag: string]: string };
- // List of products that are part of the order
- products: Product[];
+Manual withdrawing
+------------------
- // URL of the fulfillment, given by the merchant
- fulfillmentUrl?: string;
+.. code-block:: console
- // Message shown to the user after the payment is complete.
- fulfillmentMessage?: string;
+ $ taler-wallet-cli advanced withdraw-manually \
+ --exchange https://exchange.eurint.taler.net/ \
+ --amount EUR:5
- // Map from IETF BCP 47 language tags to localized fulfillment messages
- fulfillmentMessage_i18n: { [lang_tag: string]: string };
- }
- .. ts:def:: PaymentStatus
+P2P push payments
+-----------------
- enum PaymentStatus {
- // Explicitly aborted after timeout / failure
- Aborted = "aborted",
+The following code generates a P2P push transaction over 1 CHF
+with an expiration time of 30 days (assuming the wallet has a
+sufficient balance):
- // Payment failed, wallet will auto-retry.
- // User should be given the option to retry now / abort.
- Failed = "failed",
+.. code-block:: console
- // Paid successfully
- Paid = "paid",
+ $ taler-wallet-cli p2p initiate-push-debit \
+ --purse-expiration="30 d" \
+ --summary="The summary" \
+ CHF:1
- // Only offered, user must accept / decline
- Offered = "offered",
+The final URL can then be found in the transaction list:
- // User accepted, payment is processing.
- Accepted = "accepted",
- }
+.. code-block:: console
- .. ts:def:: TransactionRefund
+ $ taler-wallet-cli transactions
- interface TransactionRefund extends Transaction {
- type: string = "refund",
+Background wallet
+-----------------
- // ID for the transaction that is refunded
- refundedTransactionId: string;
+A wallet can be launched in the background:
- // Additional information about the refunded payment
- info: OrderShortInfo;
+.. code-block:: console
- // Part of the refund that couldn't be applied because the refund permissions were expired
- amountInvalid: Amount;
+ $ taler-wallet-cli advanced serve &
- // Amount that has been refunded by the merchant.
- // Corresponds to amountRefundGranted from the applyRefund response.
- amountRaw: Amount;
+You can then run various Taler operations faster against
+this one persistent instance:
- // Amount will be added to the wallet's balance after fees and refreshing.
- // Should always be shown as a positive amount.
- amountEffective: Amount;
- }
+.. code-block:: console
- .. ts:def:: TransactionTip
+ $ taler-wallet-cli --wallet-connection=wallet-core.sock ...
- interface TransactionTip extends Transaction {
- type: string = "tip",
+Here ``...`` needs to be changed to the commando to run.
+Make sure to run
- // The current status of this tip.
- status: TipStatus;
+.. code-block:: console
- // Exchange that the tip will be (or was) withdrawn from
- exchangeBaseUrl: string;
+ $ taler-wallet-cli --wallet-connection=wallet-core.sock \
+ run-until-done
- // More information about the merchant that sent the tip
- merchant: Merchant;
+to wait for pending transactions to complete.
- // Raw amount of the tip, without extra fees that apply
- amountRaw: Amount;
- // Amount will be (or was) added to the wallet's balance after fees and refreshing.
- // Should always be shown as a positive amount.
- amountEffective: Amount;
- }
+Testing an exchange deployment
+------------------------------
- .. ts:def:: TipStatus
+The following series of commands can be used to check that an exchange deployment
+is functional:
- enum TipStatus {
- // Only offered, user must accept / decline
- Offered = "offered",
+.. code-block:: console
- // User accepted, tip is processing.
- Accepted = "accepted",
+ # This will now output a payto URI that money needs to be sent to in order to allow withdrawal
+ # of taler coins
+ $ taler-wallet-cli advanced withdraw-manually --exchange $EXCHANGE_URL --amount EUR:10.50
- // User declined.
- Declined = "declined",
+ # Show the status of the manual withdrawal operation
+ $ taler-wallet-cli transactions
- // Received successfully
- Received = "received",
- }
+ # Once the transfer has been made, try completing the withdrawal
+ $ taler-wallet-cli run-pending
- .. ts:def:: TransactionRefresh
+ # Check status of transactions and show balance
+ $ taler-wallet-cli transactions
+ $ taler-wallet-cli balance
- // A transaction shown for refreshes that are not associated to other transactions
- // such as a refresh necessary before coin expiration.
- // It should only be returned by the API if the effective amount is different from zero.
- interface TransactionRefresh extends Transaction {
- type: string = "refresh",
+ # Now, directly deposit coins with the exchange into a target account
+ # (Usually, a payment is made via a merchant. The wallet provides
+ # this functionality for testing.)
+ $ taler-wallet-cli deposit create EUR:5 payto://iban/$IBAN
- // Exchange that the coins are refreshed with
- exchangeBaseUrl: string;
+ # Check if transaction was successful.
+ # (If not, fix issue with exchange and run "run-pending" command again)
+ $ taler-wallet-cli transactions
- // Raw amount that is refreshed
- amountRaw: Amount;
+ # The wallet can also track if the exchange wired the money to the merchant account.
+ # The "deposit group id" can be found in the output of the transactions list.
+ $ taler-wallet-cli deposit track $DEPOSIT_GROUP_ID
- // Amount that will be paid as fees for the refresh.
- // Should always be shown as a negative amount.
- amountEffective: Amount;
- }
+.. _withdraw-simulation:
-:Name: ``"deleteTransaction"``
-:Description: Delete a transaction by ID.
-:Request:
- .. ts:def:: DeleteTransactionRequest
+Paying for an order
+===================
- interface DeleteTransactionRequest {
- // Transaction ID (opaque!) as returned in
- // the transaction list response.
- transactionId: string;
- }
-:Response: Returns an empty object
+.. note::
-Refunds
--------
+ This section is in dire need for some editing...
-:Name: ``"applyRefund"``
-:Description: Process a refund from a ``taler://refund`` URI.
-:Request:
- .. ts:def:: WalletApplyRefundRequest
+This section explains how to pay for an order in a scenario where the fiat bank
+is simulated. The simulation takes place by crafting ad-hoc XML files as if the
+bank would have issued them. Such XML files carry information about incoming payments
+to the regional currency master bank account. Finally, the XML files are passed
+to LibEuFin nexus via a convenient CLI method. The responsible script for such
+simulation is ``withdraw.sh``.
- interface WalletApplyRefundRequest {
- talerRefundUri: string;
- }
-:Response:
- .. ts:def:: WalletApplyRefundResponse
+Run ``./withdraw.sh`` without any arguments. Assuming that you ran the command
+as the ``test-user``, after the execution, 5 units of the regional currency should
+be found in the CLI wallet owned by ``test-user``.
- interface WalletApplyRefundResponse {
- // Identifier for the purchase that was refunded
- // DEPRECATED: Will disappear soon.
- contractTermsHash: string;
- amountEffectivePaid: Amount;
+Check it with:
- amountRefundGranted: Amount;
+.. code-block:: console
- amountRefundGone: Amount;
+ $ taler-wallet-cli balance
- pendingAtExchange: boolean;
+If so, call the wallet in the following way to finally pay for the order just created:
- // Short info about the order being refunded.
- info: OrderShortInfo;
- }
+.. code-block:: console
-Exchange Management
--------------------
+ $ taler-wallet-cli handle-uri "$TALER_PAY_URI"
-List Exchanges
-~~~~~~~~~~~~~~
+.. note::
-:Name: ``"listExchanges"``
-:Description:
- List all exchanges.
-:Response:
- .. ts:def:: ExchangesListResponse
+ Reset the state before going to production, as it impacts the way nexus
+ asks records to the bank. In particular, delete: any database and the
+ files ``config/user.conf`` and ``config/internal.conf``, and finally run
+ ``./main.sh`` again.
- interface ExchangesListResponse {
- exchanges: ExchangeListItem[];
- }
- .. ts:def:: ExchangeListItem
- interface ExchangeListItem {
- exchangeBaseUrl: string;
- currency: string;
- paytoUris: string[];
- }
-Add Exchange
-~~~~~~~~~~~~
-:Name: ``"addExchange"``
-:Description:
- Add an exchange.
-:Request:
- .. ts:def:: ExchangeAddRequest
+APIs and Data Formats
+=====================
- interface ExchangeAddRequest {
- exchangeBaseUrl: string;
- }
-:Response:
- On success, the response is an `ExchangeListItem`.
+Envelope Format
+---------------
+All API responses and notifications are returned in the
+following envelope:
-Force Exchange Update
-~~~~~~~~~~~~~~~~~~~~~
+.. ts:def:: WalletResponseEnvelope
-:Name: ``"forceUpdateExchange"``
-:Description:
- Force updating an exchange.
- Re-queries current cryptographic key material, wire information
- and terms of service from the exchange. Also applies denomination revocations
- if applicable.
-:Request:
- .. ts:def:: ExchangeForceUpdateRequest
+ type WalletResponseEnvelope =
+ | WalletSuccess
+ | WalletError
+ | WalletNotification
- interface ExchangeForceUpdateRequest {
- exchangeBaseUrl: string;
- }
-:Response:
- On success, the response is an `ExchangeListItem`.
+.. ts:def:: WalletSuccess
+ export interface WalletSuccess {
+ type: "response";
+ operation: string;
+ // ID to correlate success response to request
+ id: string;
+ // Result type depends on operation
+ result: unknown;
+ }
-Get Terms of Service
-~~~~~~~~~~~~~~~~~~~~
+.. ts:def:: WalletError
-:Name: ``"getExchangeTos"``
-:Description:
- Get the exchange's current ToS and which version of the ToS (if any)
- the user has accepted.
-:Request:
- .. ts:def:: ExchangeGetTosRequest
+ export interface WalletError {
+ type: "error";
+ operation: string;
+ // ID to correlate error response to request
+ id: string;
+ error: WalletErrorInfo;
+ }
- interface ExchangeGetTosRequest {
- exchangeBaseUrl: string;
- }
-:Response:
- .. ts:def:: ExchangeGetTosResult
+.. ts:def:: WalletNotification
- interface GetExchangeTosResult {
- // Markdown version of the current ToS.
- content: string;
+ export interface WalletSuccess {
+ type: "notification";
- // Version tag of the current ToS.
- currentEtag: string;
+ // actual type is WalletNotification,
+ // to be documented here
+ payload: any;
+ }
- // Version tag of the last ToS that the user has accepted,
- // if any.
- acceptedEtag: string | undefined;
- }
+.. ts:def:: WalletErrorInfo
-Set Accepted Terms of Service Version
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ export interface WalletErrorInfo {
+ // Numeric error code defined defined in the
+ // GANA gnu-taler-error-codes registry.
+ talerErrorCode: number;
-:Name: ``"setExchangeTosAccepted"``
-:Description:
- Store that the user has accepted a version of the exchange's ToS.
-:Request:
- .. ts:def:: ExchangeSetTosAccepted
+ // English description of the error code.
+ talerErrorHint: string;
- interface ExchangeGetTosRequest {
- exchangeBaseUrl: string;
- etag: string;
- }
-:Response:
- On success, the response is an empty object.
+ // English diagnostic message that can give details
+ // for the instance of the error.
+ message: string;
+ // Error details, type depends
+ // on talerErrorCode
+ details: unknown;
+ }
Withdrawal
----------
@@ -657,464 +408,6 @@ A typical API sequence for *manual* withdrawals can for example look like this:
#. ``"acceptManualWithdrawal"`` after the user confirmed withdrawal with associated fees
-Get Details For Bank-integrated Withdrawal
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"getWithdrawalDetailsForUri"``
-:Description:
- Get information about exchanges for a bank-integrated withdrawal from a ``taler://withdraw`` URI.
-:Request:
- .. ts:def:: GetWithdrawalUriDetailsRequest
-
- interface GetWithdrawalUriDetailsRequest {
- talerWithdrawUri: string;
- }
-:Response:
- .. ts:def:: WithdrawalDetailsForUri
-
- interface WithdrawalDetailsForUri {
- // The amount that the user wants to withdraw
- amount: Amount;
-
- // Exchange suggested by the wallet
- defaultExchangeBaseUrl?: string;
-
- // A list of exchanges that can be used for this withdrawal
- possibleExchanges: ExchangeListItem[];
- }
-
-Get Withdrawal Details
-~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"getWithdrawalDetailsForAmount"``
-:Description:
- Get information about fees and exchange for a withdrawal of a given amount.
- Can be used for both bank-integrated and manual withdrawals.
-:Request:
- .. ts:def:: WithdrawalDetailsRequest
-
- interface WithdrawalDetailsRequest {
- exchangeBaseUrl: string;
- amount: Amount;
- }
-:Response:
- .. ts:def:: WithdrawalDetails
-
- interface WithdrawalDetails {
- // Did the user accept the current version of the exchange's terms of service?
- tosAccepted: boolean;
-
- // Amount that will be transferred to the exchange.
- amountRaw: Amount;
-
- // Amount that will be added to the user's wallet balance.
- amountEffective: Amount;
- }
-
-Accept Bank-integrated Withdrawal
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"acceptWithdrawal"``
-:Description:
- Accept a bank-integrated withdrawal, where the bank transfers funds automatically.
-:Request:
- .. ts:def:: GetManualWithdrawalDetailsRequest
-
- interface AcceptWithdrawalRequest {
- talerWithdrawUri: string;
- exchangeBaseUrl: string;
- }
-:Response:
- .. ts:def:: AcceptWithdrawalResponse
-
- interface AcceptWithdrawalResponse {
- // a URL for user initiated confirmation.
- bankConfirmationUrl?: string;
- }
-
-Accept Manual Withdrawal
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"acceptManualWithdrawal"``
-:Description:
- Accept a manual withdrawal, where the user has to transfer funds manually.
-:Request:
- .. ts:def:: AcceptManualWithdrawalRequest
-
- interface AcceptManualWithdrawalRequest {
- exchangeBaseUrl: string;
- amount: Amount;
- }
-:Response:
- .. ts:def:: AcceptManualWithdrawalResponse
-
- interface AcceptManualWithdrawalResponse {
- // Payto URIs to fund the withdrawal,
- // with amount and message provided.
- exchangePaytoUris: string[];
- }
-
-Deposits
---------
-
-Deposits are direct payments into a payment target (given via
-a payto URI). They don't involve a merchant.
-
-:Name: ``"createDepositGroup"``
-:Description:
- Deposit funds directly into a payment target.
-:Request:
- .. ts:def:: CreateDepositGroupRequest
-
- interface CreateDepositGroupRequest {
- depositPaytoUri: string;
- amount: Amount;
- }
-:Response:
- .. ts:def:: CreateDepositGroupResponse
-
- interface CreateDepositGroupResponse {
- depositGroupId: string;
- }
-
-
-Payments
---------
-
-Prepare Pay
-~~~~~~~~~~~
-
-:Name: ``"preparePay"``
-:Description:
- Fetch information about a payment request from a merchant.
-:Request:
- .. ts:def:: PreparePayRequest
-
- interface PreparePayRequest {
- talerPayUri: string;
- }
-:Response:
- .. ts:def:: PreparePayResponse
-
- type PreparePayResponse =
- | PreparePayPaymentPossibleResponse
- | PreparePayAlreadyConfirmedResponse
- | PreparePayInsufficientBalanceResponse;
-
- .. ts:def:: PreparePayPaymentPossibleResponse
-
- interface PreparePayPaymentPossibleResponse {
- status: "payment-possible";
-
- proposalId: string;
-
- // Verbatim contract terms as generated by the merchant.
- contractTerms: ContractTerms;
-
- // Amount that the merchant is asking for.
- amountRaw: Amount;
-
- // Amount that will effectively be subtracted from the wallet's
- // balance when accepting this proposal.
- amountEffective: Amount;
- }
-
- .. ts:def:: PreparePayInsufficientBalanceResponse
-
- interface PreparePayInsufficientBalanceResponse {
- status: "insufficient-balance";
-
- proposalId: string;
-
- // Amount that the merchant is asking for.
- amountRaw: Amount;
-
- // Verbatim contract terms as generated by the merchant.
- contractTerms: ContractTerms;
- }
-
- .. ts:def:: PreparePayAlreadyConfirmedResponse
-
- interface PreparePayAlreadyConfirmedResponse {
- status: "already-confirmed";
-
- proposalId: string;
-
- // Did the payment succeed?
- paid: boolean;
-
- // Amount that the merchant is asking for.
- amountRaw: Amount;
-
- // Amount that will be subtracted from the wallet balance
- amountEffective: Amount;
-
- // Verbatim contract terms as generated by the merchant.
- contractTerms: ContractTerms;
- }
-
-
-Confirm Payment
-~~~~~~~~~~~~~~~
-
-:Name: ``"confirmPay"``
-:Description:
- Confirm making a payment.
-
-:Request:
- .. ts:def:: GetManualWithdrawalDetailsRequest
-
- interface ConfirmPayRequest {
- proposalId: string;
- }
-:Response:
- .. ts:def:: ConfirmPayResultDone
-
- interface ConfirmPayResultDone {
- type: "done";
-
- contractTerms: ContractTerms;
- }
-
- .. ts:def:: ConfirmPayResultPending
-
- // Payment was marked as confirmed,
- // but the attempt(s) to pay were not successful yet.
- interface ConfirmPayPending {
- type: "pending";
-
- lastError: TransactionError;
- }
-
- .. ts:def:: ConfirmPayResult
-
- type ConfirmPayResult =
- | ConfirmPayResultDone;
- | ConfirmPayResultPending;
-
-Abort Failed Payment
-~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"abortFailedPayWithRefund"``
-:Description:
- Abort a failed payment and try to get a refund for the
- partially paid amount.
-:Request:
- .. ts:def:: AbortPayWithRefundRequest
-
- export interface AbortPayWithRefundRequest {
- proposalId: string;
- }
-:Response:
- On success, the response is an empty object.
-
-Tipping API Calls
------------------
-
-Preparing a tip
-~~~~~~~~~~~~~~~
-
-:Name: ``"prepareTip"``
-:Description:
- Prepare to accept a tip based in a ``taler://tip`` URI.
-:Request:
- .. ts:def:: PrepareTipRequest
-
- interface PrepareTipRequest {
- talerTipUri: string;
- }
-:Response:
- .. ts:def:: PrepareTipResult
-
- interface PrepareTipResult {
- // Unique ID for the tip assigned by the wallet.
- // Typically different from the merchant-generated tip ID.
- walletTipId: string;
-
- // Has the tip already been accepted?
- accepted: boolean;
- tipAmountRaw: Amount;
- tipAmountEffective: Amount;
- exchangeBaseUrl: string;
- expirationTimestamp: Timestamp;
- }
-
-
-Accepting a tip
-~~~~~~~~~~~~~~~
-
-:Name: ``"acceptTip"``
-:Description:
- Prepare to accept a tip based in a ``taler://tip`` URI.
-:Request:
- .. ts:def:: AcceptTipRequest
-
- interface AcceptTipRequest {
- walletTipId: string;
- }
-:Response:
- On success, the response is an empty object.
-
-Testing API calls
------------------
-
-The following API calls are useful for testing.
-
-Withdraw balance from the TESTKUDOS environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"withdrawTestkudos"``
-:Description:
- Withdraw a balance from the ``TESTKUDOS`` environment.
-:Request:
- The request parameters are ignored.
-:Response:
- On success, the response is an empty object.
-
-Withdraw balance from a test environment
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"withdrawTestBalance"``
-:Description:
- Withdraw a balance from a test environment.
-:Request:
- .. ts:def:: WithdrawTestBalanceRequest
-
- interface WithdrawTestBalanceRequest {
- amount: string;
- bankBaseUrl: string;
- exchangeBaseUrl: string;
- }
-:Response:
- On success, the response is an empty object.
-
-Run integration test
-~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"runIntegrationTest"``
-:Description:
- Run a basic integration test that does a withdrawal, payment,
- refund and again a payment. Useful to generate test data
- in the integration tests of other components.
-:Request:
- .. ts:def:: IntegrationTestArgs
-
- interface IntegrationTestArgs {
- exchangeBaseUrl: string;
- bankBaseUrl: string;
- merchantBaseUrl: string;
- merchantApiKey: string;
- amountToWithdraw: string;
- amountToSpend: string;
- }
-:Response:
- On success, the response is an empty object.
-
-Make a test payment
-~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"testPay"``
-:Description:
- Make a test payment with existing funds.
-:Request:
- .. ts:def:: TestPayArgs
-
- interface TestPayArgs {
- merchantBaseUrl: string;
- merchantApiKey: string;
- amount: string;
- summary: string;
- }
-
-
-Dump all coins to JSON
-~~~~~~~~~~~~~~~~~~~~~~
-
-:Name: ``"dumpCoins"``
-:Description:
- Make a test payment with existing funds.
-:Request:
- The request object is ignored.
-:Response:
- .. code:: ts
-
- interface CoinDumpJson {
- coins: Array<{
- /**
- * The coin's denomination's public key.
- */
- denom_pub: string;
- /**
- * Hash of denom_pub.
- */
- denom_pub_hash: string;
- /**
- * Value of the denomination (without any fees).
- */
- denom_value: string;
- /**
- * Public key of the coin.
- */
- coin_pub: string;
- /**
- * Base URL of the exchange for the coin.
- */
- exchange_base_url: string;
- /**
- * Remaining value on the coin, to the knowledge of
- * the wallet.
- */
- remaining_value: string;
- /**
- * Public key of the parent coin.
- * Only present if this coin was obtained via refreshing.
- */
- refresh_parent_coin_pub: string | undefined;
- /**
- * Public key of the reserve for this coin.
- * Only present if this coin was obtained via refreshing.
- */
- withdrawal_reserve_pub: string | undefined;
- /**
- * Is the coin suspended?
- * Suspended coins are not considered for payments.
- */
- coin_suspended: boolean;
- }>;
- }
-
-
-Suspend/unsuspend a coin
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-A suspended coin will not be used by the wallet for payments.
-This functionality is only used for testing.
-
-:Name: ``"setCoinSuspended"``
-:Description:
- Make a test payment with existing funds.
-:Request:
- .. ts:def:: SetCoinSuspendedRequest
-
- interface SetCoinSuspendedRequest {
- coinPub: string;
- suspended: boolean;
- }
-:Request:
- On success, the response is an empty object.
-
-Global Errors
--------------
-
-* Backup/Sync/Anastasis failed
-* refresh after pay failed for multiple attempts
- (depending on online status)
-* scheduled refresh (to avoid expiration) failed
-* general recoups (?)
-* failed recoup
-* (maybe) fatal errors during withdrawal
-* pending refund failed permanently (?)
-
Integration Tests
=================
@@ -1205,7 +498,6 @@ Things we still need tests for:
Or when the merchant is not reachable? Or the bank?
This can be tested by temporarily killing those services.
* How does the wallet deal with processing the same ``taler://(pay|withdraw)`` URI twice?
-* Test tipping (accepting/refusing a tip)
* Test refunds
* Test for :ref:`session-based payments <repurchase>`
* Test case for auto-refunds