gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-docs] branch master updated (9edcc9d -> 71ba48b)


From: gnunet
Subject: [taler-docs] branch master updated (9edcc9d -> 71ba48b)
Date: Tue, 04 Oct 2022 15:56:23 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a change to branch master
in repository docs.

    from 9edcc9d  -fix name
     new 37901b6  tsdef extraction for wallet-core
     new 3801b23  auto-generated wallet-core API docs
     new 71ba48b  doc gen tweaks

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 conf.py                       |  615 +++++++---
 extract-tsdefs/.gitignore     |    3 +
 extract-tsdefs/README.md      |    8 +
 extract-tsdefs/extract.ts     |  300 +++++
 extract-tsdefs/myout.md       | 2514 +++++++++++++++++++++++++++++++++++++++++
 extract-tsdefs/package.json   |   19 +
 extract-tsdefs/pnpm-lock.yaml |   35 +
 extract-tsdefs/tsconfig.json  |  103 ++
 index.rst                     |    1 +
 wallet/wallet-core.md         | 2514 +++++++++++++++++++++++++++++++++++++++++
 10 files changed, 5927 insertions(+), 185 deletions(-)
 create mode 100644 extract-tsdefs/.gitignore
 create mode 100644 extract-tsdefs/README.md
 create mode 100644 extract-tsdefs/extract.ts
 create mode 100644 extract-tsdefs/myout.md
 create mode 100644 extract-tsdefs/package.json
 create mode 100644 extract-tsdefs/pnpm-lock.yaml
 create mode 100644 extract-tsdefs/tsconfig.json
 create mode 100644 wallet/wallet-core.md

diff --git a/conf.py b/conf.py
index a2fa348..2e60a30 100644
--- a/conf.py
+++ b/conf.py
@@ -35,61 +35,61 @@
 import sys
 import os
 
-sys.path.append(os.path.abspath('_exts'))
+sys.path.append(os.path.abspath("_exts"))
 
 import taler_sphinx_theme
 
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
+# sys.path.insert(0, os.path.abspath('.'))
 
 # -- General configuration ------------------------------------------------
 
 # If your documentation needs a minimal Sphinx version, state it here.
-needs_sphinx = '2.2.0'
+needs_sphinx = "2.2.0"
 
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
-    'ebicsdomain',
-    'typescriptdomain',
-    'taler_sphinx_theme',
-    'sphinx.ext.todo',
-    'sphinx.ext.imgmath',
-    'httpdomain.httpdomain',
-    'recommonmark',
-    'sphinx.ext.graphviz',
+    "ebicsdomain",
+    "typescriptdomain",
+    "taler_sphinx_theme",
+    "sphinx.ext.todo",
+    "sphinx.ext.imgmath",
+    "httpdomain.httpdomain",
+    "recommonmark",
+    "sphinx.ext.graphviz",
 ]
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
 
 source_suffix = {
-    '.rst': 'restructuredtext',
-    '.txt': 'markdown',
-    '.md': 'markdown',
+    ".rst": "restructuredtext",
+    ".txt": "markdown",
+    ".md": "markdown",
 }
 
 # The encoding of source files.
-#source_encoding = 'utf-8-sig'
+# source_encoding = 'utf-8-sig'
 
 # The master toctree document.
-master_doc = 'index'
+master_doc = "index"
 
 # General information about the project.
-project = u'GNU Taler'
-copyright = u'2014-2022 Taler Systems SA (GPLv3+ or GFDL 1.3+)'
+project = "GNU Taler"
+copyright = "2014-2022 Taler Systems SA (GPLv3+ or GFDL 1.3+)"
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = '0.9'
+version = "0.9"
 # The full version, including alpha/beta/rc tags.
-release = '0.9.0'
+release = "0.9.0"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -97,46 +97,53 @@ release = '0.9.0'
 
 # There are two options for replacing |today|: either, you set today to some
 # non-false value, then it is used:
-#today = ''
+# today = ''
 # Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
+# today_fmt = '%B %d, %Y'
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
-exclude_patterns = ['_build', '_exts', 'cf', 'prebuilt', '**/README.md']
+exclude_patterns = [
+    "_build",
+    "_exts",
+    "cf",
+    "prebuilt",
+    "**/README.md",
+    "extract-tsdefs",
+]
 
 # The reST default role (used for this markup: `text`) to use for all
 # documents.
 default_role = "ts:type"
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
+# add_function_parentheses = True
 
 # If true, the current module name will be prepended to all description
 # unit titles (such as .. function::).
-#add_module_names = True
+# add_module_names = True
 
 # If true, sectionauthor and moduleauthor directives will be shown in the
 # output. They are ignored by default.
-#show_authors = False
+# show_authors = False
 
 # The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = "sphinx"
 
 # A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
+# modindex_common_prefix = []
 
 # If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
+# keep_warnings = False
 
 # -- Options for HTML output ----------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
-html_theme = 'taler_sphinx_theme'
+html_theme = "taler_sphinx_theme"
 html_theme_path = taler_sphinx_theme.html_theme_path()
 
-html_sidebars = {'**': ['logo-text.html', 'globaltoc.html', 'searchbox.html']}
+html_sidebars = {"**": ["logo-text.html", "globaltoc.html", "searchbox.html"]}
 
 html_theme_options = {
     # Set the name of the project to appear in the sidebar
@@ -146,84 +153,82 @@ html_theme_options = {
 }
 
 # Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
+# html_theme_path = []
 
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
-#html_title = None
+# html_title = None
 
 # A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
+# html_short_title = None
 
 # The name of an image file (relative to this directory) to place at the top
 # of the sidebar.
-#html_logo = None
+# html_logo = None
 
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
-#html_favicon = None
+# html_favicon = None
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ["_static"]
 
 # Add any extra paths that contain custom files (such as robots.txt or
 # .htaccess) here, relative to this directory. These files are copied
 # directly to the root of the documentation.
-#html_extra_path = []
+# html_extra_path = []
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
 # using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
+# html_last_updated_fmt = '%b %d, %Y'
 
 # If true, SmartyPants will be used to convert quotes and dashes to
 # typographically correct entities.
-#html_use_smartypants = True
+# html_use_smartypants = True
 
 # Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
+# html_sidebars = {}
 
 # Additional templates that should be rendered to pages, maps page names to
 # template names.
-#html_additional_pages = {}
+# html_additional_pages = {}
 
 # If false, no module index is generated.
-#html_domain_indices = True
+# html_domain_indices = True
 
 # If false, no index is generated.
-#html_use_index = True
+# html_use_index = True
 
 # If true, the index is split into individual pages for each letter.
-#html_split_index = False
+# html_split_index = False
 
 # If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
+# html_show_sourcelink = True
 
 # If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
 html_show_sphinx = False
 
 # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
+# html_show_copyright = True
 
 # If true, an OpenSearch description file will be output, and all pages will
 # contain a <link> tag referring to it.  The value of this option must be the
 # base URL from which the finished HTML is served.
-#html_use_opensearch = ''
+# html_use_opensearch = ''
 
 # This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
+# html_file_suffix = None
 
 # -- Options for LaTeX output ---------------------------------------------
 
 latex_elements = {
     # The paper size ('letterpaper' or 'a4paper').
     #'papersize': 'letterpaper',
-
     # The font size ('10pt', '11pt' or '12pt').
     #'pointsize': '10pt',
-
     # Additional stuff for the LaTeX preamble.
     #'preamble': '',
 }
@@ -232,148 +237,352 @@ latex_elements = {
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-    ('taler-auditor-manual', 'taler-auditor-manual.tex',
-     'GNU Taler Auditor Manual', 'GNU Taler team', 'manual'),
-    ('taler-exchange-manual', 'taler-exchange-manual.tex',
-     'GNU Taler Exchange Manual', 'GNU Taler team', 'manual'),
-    ('taler-merchant-manual', 'taler-merchant-manual.tex',
-     'GNU Taler Merchant Manual', 'GNU Taler team', 'manual'),
-    ('taler-merchant-pos-terminal', 'taler-merchant-pos-terminal.tex',
-     'GNU Taler Merchant POS Terminal', 'GNU Taler team', 'manual'),
-    ('taler-merchant-api-tutorial', 'taler-merchant-api-tutorial.tex',
-     'GNU Taler Merchant API Tutorial', 'GNU Taler team', 'manual'),
-    ('taler-developer-manual', 'taler-developer-manual.tex', 'GNU Taler 
Developer Manual',
-     'GNU Taler team', 'manual'),
+    (
+        "taler-auditor-manual",
+        "taler-auditor-manual.tex",
+        "GNU Taler Auditor Manual",
+        "GNU Taler team",
+        "manual",
+    ),
+    (
+        "taler-exchange-manual",
+        "taler-exchange-manual.tex",
+        "GNU Taler Exchange Manual",
+        "GNU Taler team",
+        "manual",
+    ),
+    (
+        "taler-merchant-manual",
+        "taler-merchant-manual.tex",
+        "GNU Taler Merchant Manual",
+        "GNU Taler team",
+        "manual",
+    ),
+    (
+        "taler-merchant-pos-terminal",
+        "taler-merchant-pos-terminal.tex",
+        "GNU Taler Merchant POS Terminal",
+        "GNU Taler team",
+        "manual",
+    ),
+    (
+        "taler-merchant-api-tutorial",
+        "taler-merchant-api-tutorial.tex",
+        "GNU Taler Merchant API Tutorial",
+        "GNU Taler team",
+        "manual",
+    ),
+    (
+        "taler-developer-manual",
+        "taler-developer-manual.tex",
+        "GNU Taler Developer Manual",
+        "GNU Taler team",
+        "manual",
+    ),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
 # the title page.
-#latex_logo = None
+# latex_logo = None
 
 # For "manual" documents, if this is true, then toplevel headings are parts,
 # not chapters.
-#latex_use_parts = False
+# latex_use_parts = False
 
 # If true, show page references after internal links.
-#latex_show_pagerefs = False
+# latex_show_pagerefs = False
 
 # If true, show URL addresses after external links.
-#latex_show_urls = False
+# latex_show_urls = False
 
 # Documents to append as an appendix to all manuals.
 latex_appendices = ["fdl-1.3"]
 
 # If false, no module index is generated.
-#latex_domain_indices = True
+# latex_domain_indices = True
 
 # -- Options for manual page output ---------------------------------------
 
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    ("manpages/sync-config.1", "sync-config",
-     "manipulate Sync configuration files", "GNU Taler contributors", 1),
-    ("manpages/sync-dbinit.1", "sync-dbinit",
-     "initialize the Sync database", "GNU Taler contributors", 1),
-    ("manpages/sync-httpd.1", "sync-httpd",
-     "provide the Sync HTTP interface", "GNU Taler contributors", 1),
-    ("manpages/sync.conf.5", "sync.conf",
-     "Sync configuration file", "GNU Taler contributors", 5),
-    ("manpages/taler-auditor-exchange.1", "taler-auditor-exchange",
-     "add or remove exchange from auditor’s list", "GNU Taler contributors",
-     1),
-    ("manpages/taler-auditor-dbinit.1", "taler-auditor-dbinit",
-     "setup auditor database", "GNU Taler contributors", 1),
-    ("manpages/taler-auditor-sync.1", "taler-auditor-sync",
-     "tool to safely synchronize auditor database", "GNU Taler contributors", 
1),
-    ("manpages/taler-auditor-httpd.1", "taler-auditor-httpd",
-     "HTTP server providing a RESTful API to access a Taler auditor",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-auditor.1", "taler-auditor", "audit exchange",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-aggregator.1", "taler-exchange-aggregator",
-     "aggregate deposits into wire transfers", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-closer.1", "taler-exchange-closer",
-     "close idle reserves", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-drain.1", "taler-exchange-drain",
-     "drain profits from exchange", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-kyc-tester.1", "taler-exchange-kyc-tester",
-     "test KYC service integration", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-expire.1", "taler-exchange-expire",
-     "refund expired purses", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-router.1", "taler-exchange-router",
-     "route payments to partner exchanges", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-transfer.1", "taler-exchange-transfer",
-     "execute wire transfers", "GNU Taler contributors",
-     1),
-    ("manpages/taler-exchange-benchmark.1", "taler-exchange-benchmark",
-     "measure exchange performance", "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-dbinit.1", "taler-exchange-dbinit",
-     "initialize Taler exchange database", "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-httpd.1", "taler-exchange-httpd",
-     "run Taler exchange (with RESTful API)", "GNU Taler contributors", 1),
-    ("manpages/taler-auditor-offline.1", "taler-auditor-offline",
-     "Taler auditor certifies that it audits a Taler exchange",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-offline.1", "taler-exchange-offline",
-     "operations using the offline key of a Taler exchange",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-wirewatch.1", "taler-exchange-wirewatch",
-     "watch for incoming wire transfers", "GNU Taler contributors", 1),
-    ("manpages/taler-merchant-benchmark.1", "taler-merchant-benchmark",
-     "generate Taler-style benchmarking payments", "GNU Taler contributors",
-     1),
-    ("manpages/taler-merchant-dbinit.1", "taler-merchant-dbinit",
-     "initialize Taler merchant database", "GNU Taler contributors", 1),
-    ("manpages/taler-merchant-httpd.1", "taler-merchant-httpd",
-     "run Taler merchant backend (with RESTful API)", "GNU Taler contributors",
-     1),
-    ("manpages/taler-merchant-setup-reserve.1", "taler-merchant-setup-reserve",
-     "setup reserve for tipping at a Taler merchant backend", "GNU Taler 
contributors",
-     1),
-    ("manpages/taler-exchange-wire-gateway-client.1", 
"taler-exchange-wire-gateway-client",
-     "trigger a transfer at the bank", "GNU Taler contributors", 1),
-    ("manpages/taler-config.1", "taler-config", "Taler configuration 
inspection and editing",
-     "GNU Taler contributors", 1),
-    ("manpages/taler.conf.5", "taler.conf", "Taler configuration file",
-     "GNU Taler contributors", 5),
-    ("manpages/taler-exchange-secmod-eddsa.1", "taler-exchange-secmod-eddsa",
-     "handle private EDDSA key operations for a Taler exchange",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-secmod-cs.1", "taler-exchange-secmod-cs",
-     "handle private CS key operations for a Taler exchange",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-exchange-secmod-rsa.1", "taler-exchange-secmod-rsa",
-     "handle private RSA key operations for a Taler exchange",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-helper-auditor-aggregation.1", 
"taler-helper-auditor-aggregation",
-     "audit Taler exchange aggregation activity", "GNU Taler contributors", 1),
-    ("manpages/taler-helper-auditor-coins.1", "taler-helper-auditor-coins",
-     "audit Taler coin processing", "GNU Taler contributors", 1),
-    ("manpages/taler-helper-auditor-deposits.1", 
"taler-helper-auditor-deposits",
-     "audit Taler exchange database for deposit confirmation consistency",
-     "GNU Taler contributors", 1),
-    ("manpages/taler-helper-auditor-reserves.1", 
"taler-helper-auditor-reserves",
-     "audit Taler exchange reserve handling", "GNU Taler contributors", 1),
-    ("manpages/taler-helper-auditor-wire.1", "taler-helper-auditor-wire",
-     "audit exchange database for consistency with the bank's wire transfers",
-     "GNU Taler contributors", 1),
-    ("manpages/libeufin-sandbox.1", "libeufin-sandbox",
-     "simulate core banking system with EBICS access to bank accounts",
-     "GNU Taler contributors", 1),
-    ("manpages/libeufin-nexus.1", "libeufin-nexus",
-     "service to interface to various bank access APIs",
-     "GNU Taler contributors", 1),
+    (
+        "manpages/sync-config.1",
+        "sync-config",
+        "manipulate Sync configuration files",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/sync-dbinit.1",
+        "sync-dbinit",
+        "initialize the Sync database",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/sync-httpd.1",
+        "sync-httpd",
+        "provide the Sync HTTP interface",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/sync.conf.5",
+        "sync.conf",
+        "Sync configuration file",
+        "GNU Taler contributors",
+        5,
+    ),
+    (
+        "manpages/taler-auditor-exchange.1",
+        "taler-auditor-exchange",
+        "add or remove exchange from auditor’s list",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-auditor-dbinit.1",
+        "taler-auditor-dbinit",
+        "setup auditor database",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-auditor-sync.1",
+        "taler-auditor-sync",
+        "tool to safely synchronize auditor database",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-auditor-httpd.1",
+        "taler-auditor-httpd",
+        "HTTP server providing a RESTful API to access a Taler auditor",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-auditor.1",
+        "taler-auditor",
+        "audit exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-aggregator.1",
+        "taler-exchange-aggregator",
+        "aggregate deposits into wire transfers",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-closer.1",
+        "taler-exchange-closer",
+        "close idle reserves",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-drain.1",
+        "taler-exchange-drain",
+        "drain profits from exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-kyc-tester.1",
+        "taler-exchange-kyc-tester",
+        "test KYC service integration",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-expire.1",
+        "taler-exchange-expire",
+        "refund expired purses",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-router.1",
+        "taler-exchange-router",
+        "route payments to partner exchanges",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-transfer.1",
+        "taler-exchange-transfer",
+        "execute wire transfers",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-benchmark.1",
+        "taler-exchange-benchmark",
+        "measure exchange performance",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-dbinit.1",
+        "taler-exchange-dbinit",
+        "initialize Taler exchange database",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-httpd.1",
+        "taler-exchange-httpd",
+        "run Taler exchange (with RESTful API)",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-auditor-offline.1",
+        "taler-auditor-offline",
+        "Taler auditor certifies that it audits a Taler exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-offline.1",
+        "taler-exchange-offline",
+        "operations using the offline key of a Taler exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-wirewatch.1",
+        "taler-exchange-wirewatch",
+        "watch for incoming wire transfers",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-merchant-benchmark.1",
+        "taler-merchant-benchmark",
+        "generate Taler-style benchmarking payments",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-merchant-dbinit.1",
+        "taler-merchant-dbinit",
+        "initialize Taler merchant database",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-merchant-httpd.1",
+        "taler-merchant-httpd",
+        "run Taler merchant backend (with RESTful API)",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-merchant-setup-reserve.1",
+        "taler-merchant-setup-reserve",
+        "setup reserve for tipping at a Taler merchant backend",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-wire-gateway-client.1",
+        "taler-exchange-wire-gateway-client",
+        "trigger a transfer at the bank",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-config.1",
+        "taler-config",
+        "Taler configuration inspection and editing",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler.conf.5",
+        "taler.conf",
+        "Taler configuration file",
+        "GNU Taler contributors",
+        5,
+    ),
+    (
+        "manpages/taler-exchange-secmod-eddsa.1",
+        "taler-exchange-secmod-eddsa",
+        "handle private EDDSA key operations for a Taler exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-secmod-cs.1",
+        "taler-exchange-secmod-cs",
+        "handle private CS key operations for a Taler exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-exchange-secmod-rsa.1",
+        "taler-exchange-secmod-rsa",
+        "handle private RSA key operations for a Taler exchange",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-helper-auditor-aggregation.1",
+        "taler-helper-auditor-aggregation",
+        "audit Taler exchange aggregation activity",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-helper-auditor-coins.1",
+        "taler-helper-auditor-coins",
+        "audit Taler coin processing",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-helper-auditor-deposits.1",
+        "taler-helper-auditor-deposits",
+        "audit Taler exchange database for deposit confirmation consistency",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-helper-auditor-reserves.1",
+        "taler-helper-auditor-reserves",
+        "audit Taler exchange reserve handling",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/taler-helper-auditor-wire.1",
+        "taler-helper-auditor-wire",
+        "audit exchange database for consistency with the bank's wire 
transfers",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/libeufin-sandbox.1",
+        "libeufin-sandbox",
+        "simulate core banking system with EBICS access to bank accounts",
+        "GNU Taler contributors",
+        1,
+    ),
+    (
+        "manpages/libeufin-nexus.1",
+        "libeufin-nexus",
+        "service to interface to various bank access APIs",
+        "GNU Taler contributors",
+        1,
+    ),
 ]
 
 # If true, show URL addresses after external links.
-#man_show_urls = False
+# man_show_urls = False
 
 # -- Options for Texinfo output -------------------------------------------
 
@@ -381,31 +590,67 @@ man_pages = [
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    ("taler-auditor-manual", "taler-auditor", "Taler Auditor Manual",
-     "GNU Taler team", "MENU ENTRY", "DESCRIPTION", "CATEGORY"),
-    ("taler-exchange-manual", "taler-exchange", "Taler Exchange Manual",
-     "GNU Taler team", "MENU ENTRY", "DESCRIPTION", "CATEGORY"),
-    ("taler-merchant-manual", "taler-merchant", "Taler Merchant Manual",
-     "GNU Taler team", "MENU ENTRY", "DESCRIPTION", "CATEGORY"),
-    ("taler-merchant-api-tutorial", "taler-merchant-api-tutorial",
-     "Taler Merchant API Tutorial", "GNU Taler team", "MENU ENTRY",
-     "DESCRIPTION", "CATEGORY"),
-    ("taler-developer-manual", "taler-developer-manual", "Taler Developer 
Manual", "GNU Taler team",
-     "MENU ENTRY", "DESCRIPTION", "CATEGORY"),
+    (
+        "taler-auditor-manual",
+        "taler-auditor",
+        "Taler Auditor Manual",
+        "GNU Taler team",
+        "MENU ENTRY",
+        "DESCRIPTION",
+        "CATEGORY",
+    ),
+    (
+        "taler-exchange-manual",
+        "taler-exchange",
+        "Taler Exchange Manual",
+        "GNU Taler team",
+        "MENU ENTRY",
+        "DESCRIPTION",
+        "CATEGORY",
+    ),
+    (
+        "taler-merchant-manual",
+        "taler-merchant",
+        "Taler Merchant Manual",
+        "GNU Taler team",
+        "MENU ENTRY",
+        "DESCRIPTION",
+        "CATEGORY",
+    ),
+    (
+        "taler-merchant-api-tutorial",
+        "taler-merchant-api-tutorial",
+        "Taler Merchant API Tutorial",
+        "GNU Taler team",
+        "MENU ENTRY",
+        "DESCRIPTION",
+        "CATEGORY",
+    ),
+    (
+        "taler-developer-manual",
+        "taler-developer-manual",
+        "Taler Developer Manual",
+        "GNU Taler team",
+        "MENU ENTRY",
+        "DESCRIPTION",
+        "CATEGORY",
+    ),
 ]
 
 # Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
+# texinfo_appendices = []
 
 # If false, no module index is generated.
-#texinfo_domain_indices = True
+# texinfo_domain_indices = True
 
 # How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
+# texinfo_show_urls = 'footnote'
 
 # If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
+# texinfo_no_detailmenu = False
 
 # The output format for Graphviz when building HTML files.
 # This must be either 'png' or 'svg'; the default is 'png'.
-graphviz_output_format = 'svg'
+graphviz_output_format = "svg"
+
+myst_heading_anchors = 3
diff --git a/extract-tsdefs/.gitignore b/extract-tsdefs/.gitignore
new file mode 100644
index 0000000..fa29880
--- /dev/null
+++ b/extract-tsdefs/.gitignore
@@ -0,0 +1,3 @@
+extract.js
+node_modules/
+dist
diff --git a/extract-tsdefs/README.md b/extract-tsdefs/README.md
new file mode 100644
index 0000000..e668be8
--- /dev/null
+++ b/extract-tsdefs/README.md
@@ -0,0 +1,8 @@
+# Auto-generated wallet-core API docs
+
+Usage:
+```
+pnpm install
+pnpm run compile
+node dist/extract.js $WALLET_CORE_DIR $OUTFILENAME
+```
diff --git a/extract-tsdefs/extract.ts b/extract-tsdefs/extract.ts
new file mode 100644
index 0000000..7793881
--- /dev/null
+++ b/extract-tsdefs/extract.ts
@@ -0,0 +1,300 @@
+/*
+ This file is part of GNU Taler
+ (C) 2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+import * as ts from "typescript";
+import * as fs from "fs/promises";
+import * as path from "path";
+import * as prettier from "prettier";
+
+if (process.argv.length != 4) {
+  console.log(
+    `usage: ${process.argv[0]} ${process.argv[1]} WALLET_CORE_REPO OUTFILE`
+  );
+  process.exit(2);
+}
+
+const walletRootDir = process.argv[2];
+const outfile = process.argv[3];
+
+const walletCoreDir = path.join(walletRootDir, "packages/taler-wallet-core");
+const excludedNames = new Set(["TalerErrorCode", "WalletBackupContentV1"]);
+
+const configFile = ts.findConfigFile(
+  walletCoreDir,
+  ts.sys.fileExists,
+  "tsconfig.json"
+);
+if (!configFile) throw Error("tsconfig.json not found");
+const { config } = ts.readConfigFile(configFile, ts.sys.readFile);
+
+const { options, fileNames, errors } = ts.parseJsonConfigFileContent(
+  config,
+  ts.sys,
+  walletCoreDir
+);
+
+const program = ts.createProgram({
+  options,
+  rootNames: fileNames,
+  configFileParsingDiagnostics: errors,
+});
+
+const checker = program.getTypeChecker();
+
+const walletApiTypesFiles = `${walletCoreDir}/src/wallet-api-types.ts`;
+console.log("api types file:", walletApiTypesFiles);
+
+const sourceFile = program.getSourceFile(walletApiTypesFiles);
+
+if (!sourceFile) {
+  throw Error();
+}
+
+const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
+
+const fileSymbol = program.getTypeChecker().getSymbolAtLocation(sourceFile);
+
+const expo = fileSymbol?.exports;
+if (!expo) {
+  throw Error();
+}
+
+interface PerOpGatherState {
+  opName: string;
+  nameSet: Set<string>;
+  group: string;
+}
+
+interface GatherState {
+  declTexts: Map<string, string>;
+}
+
+function gatherDecls(
+  node: ts.Node,
+  gatherState: GatherState,
+  perOpState: PerOpGatherState
+): void {
+  switch (node.kind) {
+    case ts.SyntaxKind.TypeReference: {
+      console.log(`typeref ${node.getText()}`);
+      const type = checker.getTypeAtLocation(node);
+      if (type.flags === ts.TypeFlags.String) {
+        console.log("string!");
+        break;
+      }
+      const symbol = type.symbol || type.aliasSymbol;
+      if (!symbol) {
+        console.log(`no symbol for ${node.getText()}`);
+        break;
+      }
+      const name = symbol.name;
+      if (perOpState.nameSet.has(name)) {
+        break;
+      }
+      perOpState.nameSet.add(name);
+      if (excludedNames.has(name)) {
+        break;
+      }
+      const decls = symbol.getDeclarations();
+      decls?.forEach((decl) => {
+        console.log(`decl kind ${ts.SyntaxKind[node.kind]}`);
+        console.log(`decl for ${node.getText()}`);
+        const sourceFilename = decl.getSourceFile().fileName;
+        if (path.basename(sourceFilename).startsWith("lib.")) {
+          return;
+        }
+        console.log(`decl source ${decl.getSourceFile().fileName}`);
+        console.log(`mod name ${decl.getSourceFile().moduleName}`);
+        switch (decl.kind) {
+          case ts.SyntaxKind.EnumMember: {
+            const parentType = checker.getTypeAtLocation(decl.parent);
+            const declText = printer.printNode(
+              ts.EmitHint.Unspecified,
+              decl,
+              decl.getSourceFile()!
+            );
+            gatherState.declTexts.set(
+              name,
+              `// Enum value:\n// ${
+                parentType.symbol.name || parentType.aliasSymbol?.name
+              }.${declText}`
+            );
+            break;
+          }
+          case ts.SyntaxKind.InterfaceDeclaration:
+          case ts.SyntaxKind.EnumDeclaration:
+          case ts.SyntaxKind.TypeAliasDeclaration: {
+            const declText = printer.printNode(
+              ts.EmitHint.Unspecified,
+              decl,
+              decl.getSourceFile()!
+            );
+            gatherState.declTexts.set(name, declText);
+            console.log(declText);
+            break;
+          }
+          default:
+            console.log(`unknown decl kind ${ts.SyntaxKind[decl.kind]}`);
+            break;
+        }
+        gatherDecls(decl, gatherState, perOpState);
+      });
+      break;
+    }
+    default:
+      node.forEachChild((child) => {
+        gatherDecls(child, gatherState, perOpState);
+      });
+      //console.log(`// unknown node kind ${ts.SyntaxKind[node.kind]}`);
+      return;
+  }
+}
+
+const main = async () => {
+  const f = await fs.open(outfile, "w");
+  const gatherState: GatherState = {
+    declTexts: new Map<string, string>(),
+  };
+  const perOpStates: PerOpGatherState[] = [];
+
+  let currentGroup: string = "Unknown Group";
+
+  expo.forEach((v, k) => {
+    if (!v.name.endsWith("Op")) {
+      return;
+    }
+    const decls = v.getDeclarations();
+    decls?.forEach((decl) => {
+      const commentRanges = ts.getLeadingCommentRanges(
+        sourceFile.getFullText(),
+        decl.getFullStart()
+      );
+
+      console.log(commentRanges);
+      commentRanges?.forEach((r) => {
+        const text = sourceFile.getFullText().slice(r.pos, r.end);
+        console.log("comment text:", text);
+        const groupPrefix = "group:";
+        const loc = text.indexOf(groupPrefix);
+        if (loc >= 0) {
+          const groupName = text.slice(loc + groupPrefix.length);
+          console.log("got new group", groupName);
+          currentGroup = groupName;
+        }
+      });
+
+      const perOpState: PerOpGatherState = {
+        opName: v.name,
+        nameSet: new Set<string>(),
+        group: currentGroup,
+      };
+      const declText = printer.printNode(
+        ts.EmitHint.Unspecified,
+        decl,
+        decl.getSourceFile()!
+      );
+      perOpState.nameSet.add(v.name);
+      gatherState.declTexts.set(v.name, declText);
+      gatherDecls(decl, gatherState, perOpState);
+      perOpStates.push(perOpState);
+    });
+  });
+
+  const allNames: Set<string> = new Set();
+
+  for (const g of perOpStates) {
+    for (const k of g.nameSet.values()) {
+      allNames.add(k);
+    }
+  }
+
+  const commonNames: Set<string> = new Set();
+
+  for (const name of allNames) {
+    let count = 0;
+    for (const g of perOpStates) {
+      for (const k of g.nameSet.values()) {
+        if (name === k) {
+          count++;
+        }
+      }
+    }
+    if (count > 1) {
+      console.log(`common name: ${name}`);
+      commonNames.add(name);
+    }
+  }
+
+  const groups = new Set<string>();
+  for (const g of perOpStates) {
+    groups.add(g.group);
+  }
+
+  await f.write(`# Wallet API Documentation\n`);
+
+  await f.write(`## Overview\n`);
+  for (const g of groups.values()) {
+    await f.write(`### ${g}\n`);
+    for (const op of perOpStates) {
+      if (op.group !== g) {
+        continue;
+      }
+      await f.write(`* [${op.opName}](#${op.opName.toLowerCase()})\n`);
+    }
+  }
+
+  await f.write(`## Operation Reference\n`);
+  for (const g of perOpStates) {
+    await f.write(`(${g.opName.toLowerCase()})=\n`);
+    await f.write(`### ${g.opName}\n`);
+    for (const name of g.nameSet.values()) {
+      if (commonNames.has(name)) {
+        continue;
+      }
+      const text = gatherState.declTexts.get(name);
+      if (!text) {
+        continue;
+      }
+      await f.write("```typescript\n");
+      const formatted = prettier.format(text, {
+        semi: true,
+        parser: "typescript",
+      });
+      await f.write(`${formatted}\n`);
+      await f.write("```\n");
+    }
+    await f.write("\n");
+  }
+
+  await f.write(`## Common Declarations\n`);
+  for (const name of commonNames.values()) {
+    const text = gatherState.declTexts.get(name);
+    if (!text) {
+      continue;
+    }
+    await f.write("```typescript\n");
+    const formatted = prettier.format(text, {
+      semi: true,
+      parser: "typescript",
+    });
+    await f.write(`${formatted}`);
+    await f.write("```\n");
+  }
+
+  await f.close();
+};
+
+main();
diff --git a/extract-tsdefs/myout.md b/extract-tsdefs/myout.md
new file mode 100644
index 0000000..9af1669
--- /dev/null
+++ b/extract-tsdefs/myout.md
@@ -0,0 +1,2514 @@
+# Wallet API Documentation
+## Overview
+###  Initialization
+* [InitWalletOp](#initwalletop)
+###  Basic Wallet Information
+* [GetBalancesOp](#getbalancesop)
+###  Managing Transactions
+* [GetTransactionsOp](#gettransactionsop)
+* [DeleteTransactionOp](#deletetransactionop)
+* [RetryTransactionOp](#retrytransactionop)
+###  Withdrawals
+* [GetWithdrawalDetailsForAmountOp](#getwithdrawaldetailsforamountop)
+* [GetWithdrawalDetailsForUriOp](#getwithdrawaldetailsforuriop)
+* [AcceptBankIntegratedWithdrawalOp](#acceptbankintegratedwithdrawalop)
+* [AcceptManualWithdrawalOp](#acceptmanualwithdrawalop)
+###  Merchant Payments
+* [PreparePayForUriOp](#preparepayforuriop)
+* [ConfirmPayOp](#confirmpayop)
+* [AbortPayWithRefundOp](#abortpaywithrefundop)
+* [ApplyRefundOp](#applyrefundop)
+###  Tipping
+* [PrepareTipOp](#preparetipop)
+* [AcceptTipOp](#accepttipop)
+###  Exchange Management
+* [ListExchangesOp](#listexchangesop)
+* [AddExchangeOp](#addexchangeop)
+* [SetExchangeTosAcceptedOp](#setexchangetosacceptedop)
+* [GetExchangeTosOp](#getexchangetosop)
+* [ListCurrenciesOp](#listcurrenciesop)
+###  Deposits
+* [CreateDepositGroupOp](#createdepositgroupop)
+* [TrackDepositGroupOp](#trackdepositgroupop)
+###  Backups
+* [ExportBackupRecoveryOp](#exportbackuprecoveryop)
+* [ImportBackupRecoveryOp](#importbackuprecoveryop)
+* [RunBackupCycleOp](#runbackupcycleop)
+* [AddBackupProviderOp](#addbackupproviderop)
+* [GetBackupInfoOp](#getbackupinfoop)
+* [SetWalletDeviceIdOp](#setwalletdeviceidop)
+* [ExportBackupPlainOp](#exportbackupplainop)
+###  Peer Payments
+* [InitiatePeerPushPaymentOp](#initiatepeerpushpaymentop)
+* [CheckPeerPushPaymentOp](#checkpeerpushpaymentop)
+* [AcceptPeerPushPaymentOp](#acceptpeerpushpaymentop)
+* [InitiatePeerPullPaymentOp](#initiatepeerpullpaymentop)
+* [CheckPeerPullPaymentOp](#checkpeerpullpaymentop)
+* [AcceptPeerPullPaymentOp](#acceptpeerpullpaymentop)
+###  Database Management
+* [ExportDbOp](#exportdbop)
+* [ClearDbOp](#cleardbop)
+* [RecycleOp](#recycleop)
+###  Testing and Debugging
+* [RunIntegrationTestOp](#runintegrationtestop)
+* [WithdrawTestBalanceOp](#withdrawtestbalanceop)
+* [WithdrawTestkudosOp](#withdrawtestkudosop)
+* [TestPayOp](#testpayop)
+* [WithdrawFakebankOp](#withdrawfakebankop)
+* [GetPendingTasksOp](#getpendingtasksop)
+* [DumpCoinsOp](#dumpcoinsop)
+* [SetCoinSuspendedOp](#setcoinsuspendedop)
+* [ForceRefreshOp](#forcerefreshop)
+## Operation Reference
+(initwalletop)=
+### InitWalletOp
+```typescript
+// group: Initialization
+/**
+ * Initialize wallet-core.
+ *
+ * Must be the request before any other operations.
+ */
+export type InitWalletOp = {
+  op: WalletApiOperation.InitWallet;
+  request: {};
+  response: {};
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.InitWallet = "initWallet"
+
+```
+
+(getbalancesop)=
+### GetBalancesOp
+```typescript
+// group: Basic Wallet Information
+/**
+ * Get current wallet balance.
+ */
+export type GetBalancesOp = {
+  request: {};
+  response: BalancesResponse;
+};
+
+```
+```typescript
+export interface BalancesResponse {
+  balances: Balance[];
+}
+
+```
+```typescript
+export interface Balance {
+  available: AmountString;
+  pendingIncoming: AmountString;
+  pendingOutgoing: AmountString;
+  hasPendingTransactions: boolean;
+  requiresUserInput: boolean;
+}
+
+```
+
+(gettransactionsop)=
+### GetTransactionsOp
+```typescript
+// group: Managing Transactions
+/**
+ * Get transactions.
+ */
+export type GetTransactionsOp = {
+  request: TransactionsRequest;
+  response: TransactionsResponse;
+};
+
+```
+```typescript
+export interface TransactionsRequest {
+  /**
+   * return only transactions in the given currency
+   */
+  currency?: string;
+  /**
+   * if present, results will be limited to transactions related to the given 
search string
+   */
+  search?: string;
+}
+
+```
+```typescript
+export interface TransactionsResponse {
+  transactions: Transaction[];
+}
+
+```
+```typescript
+export declare type Transaction =
+  | TransactionWithdrawal
+  | TransactionPayment
+  | TransactionRefund
+  | TransactionTip
+  | TransactionRefresh
+  | TransactionDeposit
+  | TransactionPeerPullCredit
+  | TransactionPeerPullDebit
+  | TransactionPeerPushCredit
+  | TransactionPeerPushDebit;
+
+```
+```typescript
+export interface TransactionWithdrawal extends TransactionCommon {
+  type: TransactionType.Withdrawal;
+  /**
+   * Exchange of the withdrawal.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+  withdrawalDetails: WithdrawalDetails;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Withdrawal = "withdrawal"
+
+```
+```typescript
+export declare type WithdrawalDetails =
+  | WithdrawalDetailsForManualTransfer
+  | WithdrawalDetailsForTalerBankIntegrationApi;
+
+```
+```typescript
+interface WithdrawalDetailsForManualTransfer {
+  type: WithdrawalType.ManualTransfer;
+  /**
+   * Payto URIs that the exchange supports.
+   *
+   * Already contains the amount and message.
+   */
+  exchangePaytoUris: string[];
+  reservePub: string;
+}
+
+```
+```typescript
+// Enum value:
+// WithdrawalType.ManualTransfer = "manual-transfer"
+
+```
+```typescript
+interface WithdrawalDetailsForTalerBankIntegrationApi {
+  type: WithdrawalType.TalerBankIntegrationApi;
+  /**
+   * 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;
+  reservePub: string;
+}
+
+```
+```typescript
+// Enum value:
+// WithdrawalType.TalerBankIntegrationApi = "taler-bank-integration-api"
+
+```
+```typescript
+export interface TransactionPayment extends TransactionCommon {
+  type: TransactionType.Payment;
+  /**
+   * Additional information about the payment.
+   */
+  info: OrderShortInfo;
+  /**
+   * Wallet-internal end-to-end identifier for the payment.
+   */
+  proposalId: string;
+  /**
+   * How far did the wallet get with processing the payment?
+   */
+  status: PaymentStatus;
+  /**
+   * Amount that must be paid for the contract
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that was paid, including deposit, wire and refresh fees.
+   */
+  amountEffective: AmountString;
+  /**
+   * Amount that has been refunded by the merchant
+   */
+  totalRefundRaw: AmountString;
+  /**
+   * Amount will be added to the wallet's balance after fees and refreshing
+   */
+  totalRefundEffective: AmountString;
+  /**
+   * Amount pending to be picked up
+   */
+  refundPending: AmountString | undefined;
+  /**
+   * Reference to applied refunds
+   */
+  refunds: RefundInfoShort[];
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Payment = "payment"
+
+```
+```typescript
+export declare enum PaymentStatus {
+  /**
+   * Explicitly aborted after timeout / failure
+   */
+  Aborted = "aborted",
+  /**
+   * Payment failed, wallet will auto-retry.
+   * User should be given the option to retry now / abort.
+   */
+  Failed = "failed",
+  /**
+   * Paid successfully
+   */
+  Paid = "paid",
+  /**
+   * User accepted, payment is processing.
+   */
+  Accepted = "accepted",
+}
+
+```
+```typescript
+export interface RefundInfoShort {
+  transactionId: string;
+  timestamp: TalerProtocolTimestamp;
+  amountEffective: AmountString;
+  amountRaw: AmountString;
+}
+
+```
+```typescript
+export interface TransactionRefund extends TransactionCommon {
+  type: TransactionType.Refund;
+  refundedTransactionId: string;
+  info: OrderShortInfo;
+  /**
+   * Amount pending to be picked up
+   */
+  refundPending: AmountString | undefined;
+  amountRaw: AmountString;
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Refund = "refund"
+
+```
+```typescript
+export interface TransactionTip extends TransactionCommon {
+  type: TransactionType.Tip;
+  amountRaw: AmountString;
+  /**
+   * More information about the merchant
+   */
+  amountEffective: AmountString;
+  merchantBaseUrl: string;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Tip = "tip"
+
+```
+```typescript
+export interface TransactionRefresh extends TransactionCommon {
+  type: TransactionType.Refresh;
+  exchangeBaseUrl: string;
+  amountRaw: AmountString;
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+/**
+ * Deposit transaction, which effectively sends
+ * money from this wallet somewhere else.
+ */
+export interface TransactionDeposit extends TransactionCommon {
+  type: TransactionType.Deposit;
+  depositGroupId: string;
+  /**
+   * Target for the deposit.
+   */
+  targetPaytoUri: string;
+  /**
+   * Raw amount that is being deposited
+   */
+  amountRaw: AmountString;
+  /**
+   * Effective amount that is being deposited
+   */
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+/**
+ * Credit because we were paid for a P2P invoice we created.
+ */
+export interface TransactionPeerPullCredit extends TransactionCommon {
+  type: TransactionType.PeerPullCredit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+  /**
+   * URI to send to the other party.
+   */
+  talerUri: string;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPullCredit = "peer-pull-credit"
+
+```
+```typescript
+export interface PeerInfoShort {
+  expiration: TalerProtocolTimestamp | undefined;
+  summary: string | undefined;
+}
+
+```
+```typescript
+/**
+ * Debit because we paid someone's invoice.
+ */
+export interface TransactionPeerPullDebit extends TransactionCommon {
+  type: TransactionType.PeerPullDebit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  amountRaw: AmountString;
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPullDebit = "peer-pull-debit"
+
+```
+```typescript
+/**
+ * We received money via a P2P payment.
+ */
+export interface TransactionPeerPushCredit extends TransactionCommon {
+  type: TransactionType.PeerPushCredit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPushCredit = "peer-push-credit"
+
+```
+```typescript
+/**
+ * We sent money via a P2P payment.
+ */
+export interface TransactionPeerPushDebit extends TransactionCommon {
+  type: TransactionType.PeerPushDebit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+  /**
+   * URI to accept the payment.
+   */
+  talerUri: string;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPushDebit = "peer-push-debit"
+
+```
+
+(deletetransactionop)=
+### DeleteTransactionOp
+```typescript
+/**
+ * Delete a transaction locally in the wallet.
+ */
+export type DeleteTransactionOp = {
+  request: DeleteTransactionRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface DeleteTransactionRequest {
+  transactionId: string;
+}
+
+```
+
+(retrytransactionop)=
+### RetryTransactionOp
+```typescript
+/**
+ * Immediately retry a transaction.
+ */
+export type RetryTransactionOp = {
+  request: RetryTransactionRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface RetryTransactionRequest {
+  transactionId: string;
+}
+
+```
+
+(getwithdrawaldetailsforamountop)=
+### GetWithdrawalDetailsForAmountOp
+```typescript
+// group: Withdrawals
+/**
+ * Get details for withdrawing a particular amount (manual withdrawal).
+ */
+export type GetWithdrawalDetailsForAmountOp = {
+  request: GetWithdrawalDetailsForAmountRequest;
+  response: ManualWithdrawalDetails;
+};
+
+```
+```typescript
+export interface GetWithdrawalDetailsForAmountRequest {
+  exchangeBaseUrl: string;
+  amount: string;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface ManualWithdrawalDetails {
+  /**
+   * Did the user accept the current version of the exchange's
+   * terms of service?
+   */
+  tosAccepted: boolean;
+  /**
+   * Amount that the user will transfer to the exchange.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that will be added to the user's wallet balance.
+   */
+  amountEffective: AmountString;
+  /**
+   * Ways to pay the exchange.
+   */
+  paytoUris: string[];
+}
+
+```
+
+(getwithdrawaldetailsforuriop)=
+### GetWithdrawalDetailsForUriOp
+```typescript
+/**
+ * Get details for withdrawing via a particular taler:// URI.
+ */
+export type GetWithdrawalDetailsForUriOp = {
+  request: GetWithdrawalDetailsForUriRequest;
+  response: WithdrawUriInfoResponse;
+};
+
+```
+```typescript
+export interface GetWithdrawalDetailsForUriRequest {
+  talerWithdrawUri: string;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface WithdrawUriInfoResponse {
+  amount: AmountString;
+  defaultExchangeBaseUrl?: string;
+  possibleExchanges: ExchangeListItem[];
+}
+
+```
+
+(acceptbankintegratedwithdrawalop)=
+### AcceptBankIntegratedWithdrawalOp
+```typescript
+/**
+ * Accept a bank-integrated withdrawal.
+ */
+export type AcceptBankIntegratedWithdrawalOp = {
+  request: AcceptBankIntegratedWithdrawalRequest;
+  response: AcceptWithdrawalResponse;
+};
+
+```
+```typescript
+export interface AcceptBankIntegratedWithdrawalRequest {
+  talerWithdrawUri: string;
+  exchangeBaseUrl: string;
+  forcedDenomSel?: ForcedDenomSel;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface AcceptWithdrawalResponse {
+  reservePub: string;
+  confirmTransferUrl?: string;
+  transactionId: string;
+}
+
+```
+
+(acceptmanualwithdrawalop)=
+### AcceptManualWithdrawalOp
+```typescript
+/**
+ * Create a manual withdrawal.
+ */
+export type AcceptManualWithdrawalOp = {
+  request: AcceptManualWithdrawalRequest;
+  response: AcceptManualWithdrawalResult;
+};
+
+```
+```typescript
+export interface AcceptManualWithdrawalRequest {
+  exchangeBaseUrl: string;
+  amount: string;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface AcceptManualWithdrawalResult {
+  /**
+   * Payto URIs that can be used to fund the withdrawal.
+   */
+  exchangePaytoUris: string[];
+  /**
+   * Public key of the newly created reserve.
+   */
+  reservePub: string;
+  transactionId: string;
+}
+
+```
+
+(preparepayforuriop)=
+### PreparePayForUriOp
+```typescript
+// group: Merchant Payments
+/**
+ * Prepare to make a payment
+ */
+export type PreparePayForUriOp = {
+  op: WalletApiOperation.PreparePayForUri;
+  request: PreparePayRequest;
+  response: PreparePayResult;
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.PreparePayForUri = "preparePayForUri"
+
+```
+```typescript
+export interface PreparePayRequest {
+  talerPayUri: string;
+}
+
+```
+```typescript
+/**
+ * Result of a prepare pay operation.
+ */
+export declare type PreparePayResult =
+  | PreparePayResultInsufficientBalance
+  | PreparePayResultAlreadyConfirmed
+  | PreparePayResultPaymentPossible;
+
+```
+```typescript
+export interface PreparePayResultInsufficientBalance {
+  status: PreparePayResultType.InsufficientBalance;
+  proposalId: string;
+  contractTerms: ContractTerms;
+  amountRaw: string;
+  noncePriv: string;
+}
+
+```
+```typescript
+export interface PreparePayResultAlreadyConfirmed {
+  status: PreparePayResultType.AlreadyConfirmed;
+  contractTerms: ContractTerms;
+  paid: boolean;
+  amountRaw: string;
+  amountEffective: string;
+  contractTermsHash: string;
+  proposalId: string;
+}
+
+```
+```typescript
+// Enum value:
+// PreparePayResultType.AlreadyConfirmed = "already-confirmed"
+
+```
+```typescript
+/**
+ * Payment is possible.
+ */
+export interface PreparePayResultPaymentPossible {
+  status: PreparePayResultType.PaymentPossible;
+  proposalId: string;
+  contractTerms: ContractTerms;
+  contractTermsHash: string;
+  amountRaw: string;
+  amountEffective: string;
+  noncePriv: string;
+}
+
+```
+```typescript
+// Enum value:
+// PreparePayResultType.PaymentPossible = "payment-possible"
+
+```
+
+(confirmpayop)=
+### ConfirmPayOp
+```typescript
+/**
+ * Confirm a payment that was previously prepared with
+ * {@link PreparePayForUriOp}
+ */
+export type ConfirmPayOp = {
+  op: WalletApiOperation.ConfirmPay;
+  request: ConfirmPayRequest;
+  response: ConfirmPayResult;
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.ConfirmPay = "confirmPay"
+
+```
+```typescript
+export interface ConfirmPayRequest {
+  proposalId: string;
+  sessionId?: string;
+  forcedCoinSel?: ForcedCoinSel;
+}
+
+```
+```typescript
+export declare type ConfirmPayResult =
+  | ConfirmPayResultDone
+  | ConfirmPayResultPending;
+
+```
+```typescript
+/**
+ * Result for confirmPay
+ */
+export interface ConfirmPayResultDone {
+  type: ConfirmPayResultType.Done;
+  contractTerms: ContractTerms;
+  transactionId: string;
+}
+
+```
+```typescript
+// Enum value:
+// ConfirmPayResultType.Done = "done"
+
+```
+```typescript
+export interface ConfirmPayResultPending {
+  type: ConfirmPayResultType.Pending;
+  transactionId: string;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+
+(abortpaywithrefundop)=
+### AbortPayWithRefundOp
+```typescript
+/**
+ * Abort a pending payment with a refund.
+ */
+export type AbortPayWithRefundOp = {
+  request: AbortPayWithRefundRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AbortPayWithRefundRequest {
+  proposalId: string;
+}
+
+```
+
+(applyrefundop)=
+### ApplyRefundOp
+```typescript
+/**
+ * Check for a refund based on a taler://refund URI.
+ */
+export type ApplyRefundOp = {
+  request: ApplyRefundRequest;
+  response: ApplyRefundResponse;
+};
+
+```
+```typescript
+export interface ApplyRefundRequest {
+  talerRefundUri: string;
+}
+
+```
+```typescript
+export interface ApplyRefundResponse {
+  contractTermsHash: string;
+  transactionId: string;
+  proposalId: string;
+  amountEffectivePaid: AmountString;
+  amountRefundGranted: AmountString;
+  amountRefundGone: AmountString;
+  pendingAtExchange: boolean;
+  info: OrderShortInfo;
+}
+
+```
+
+(preparetipop)=
+### PrepareTipOp
+```typescript
+// group: Tipping
+/**
+ * Query and store information about a tip.
+ */
+export type PrepareTipOp = {
+  request: PrepareTipRequest;
+  response: PrepareTipResult;
+};
+
+```
+```typescript
+export interface PrepareTipRequest {
+  talerTipUri: string;
+}
+
+```
+```typescript
+export 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;
+  /**
+   * Amount that the merchant gave.
+   */
+  tipAmountRaw: AmountString;
+  /**
+   * Amount that arrived at the wallet.
+   * Might be lower than the raw amount due to fees.
+   */
+  tipAmountEffective: AmountString;
+  /**
+   * Base URL of the merchant backend giving then tip.
+   */
+  merchantBaseUrl: string;
+  /**
+   * Base URL of the exchange that is used to withdraw the tip.
+   * Determined by the merchant, the wallet/user has no choice here.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Time when the tip will expire.  After it expired, it can't be picked
+   * up anymore.
+   */
+  expirationTimestamp: TalerProtocolTimestamp;
+}
+
+```
+
+(accepttipop)=
+### AcceptTipOp
+```typescript
+/**
+ * Accept a tip.
+ */
+export type AcceptTipOp = {
+  request: AcceptTipRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptTipRequest {
+  walletTipId: string;
+}
+
+```
+
+(listexchangesop)=
+### ListExchangesOp
+```typescript
+// group: Exchange Management
+/**
+ * List exchanges known to the wallet.
+ */
+export type ListExchangesOp = {
+  request: {};
+  response: ExchangesListResponse;
+};
+
+```
+```typescript
+export interface ExchangesListResponse {
+  exchanges: ExchangeListItem[];
+}
+
+```
+
+(addexchangeop)=
+### AddExchangeOp
+```typescript
+/**
+ * Add / force-update an exchange.
+ */
+export type AddExchangeOp = {
+  request: AddExchangeRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AddExchangeRequest {
+  exchangeBaseUrl: string;
+  forceUpdate?: boolean;
+}
+
+```
+
+(setexchangetosacceptedop)=
+### SetExchangeTosAcceptedOp
+```typescript
+/**
+ * Accept a particular version of the exchange terms of service.
+ */
+export type SetExchangeTosAcceptedOp = {
+  request: AcceptExchangeTosRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptExchangeTosRequest {
+  exchangeBaseUrl: string;
+  etag: string | undefined;
+}
+
+```
+
+(getexchangetosop)=
+### GetExchangeTosOp
+```typescript
+/**
+ * Get the current terms of a service of an exchange.
+ */
+export type GetExchangeTosOp = {
+  request: GetExchangeTosRequest;
+  response: GetExchangeTosResult;
+};
+
+```
+```typescript
+export interface GetExchangeTosRequest {
+  exchangeBaseUrl: string;
+  acceptedFormat?: string[];
+}
+
+```
+```typescript
+export interface GetExchangeTosResult {
+  /**
+   * Markdown version of the current ToS.
+   */
+  content: string;
+  /**
+   * Version tag of the current ToS.
+   */
+  currentEtag: string;
+  /**
+   * Version tag of the last ToS that the user has accepted,
+   * if any.
+   */
+  acceptedEtag: string | undefined;
+  /**
+   * Accepted content type
+   */
+  contentType: string;
+}
+
+```
+
+(listcurrenciesop)=
+### ListCurrenciesOp
+```typescript
+/**
+ * List currencies known to the wallet.
+ */
+export type ListCurrenciesOp = {
+  request: {};
+  response: WalletCurrencyInfo;
+};
+
+```
+```typescript
+export interface WalletCurrencyInfo {
+  trustedAuditors: {
+    currency: string;
+    auditorPub: string;
+    auditorBaseUrl: string;
+  }[];
+  trustedExchanges: {
+    currency: string;
+    exchangeMasterPub: string;
+    exchangeBaseUrl: string;
+  }[];
+}
+
+```
+
+(createdepositgroupop)=
+### CreateDepositGroupOp
+```typescript
+// group: Deposits
+/**
+ * Create a new deposit group.
+ *
+ * Deposit groups are used to deposit multiple coins to a bank
+ * account, usually the wallet user's own bank account.
+ */
+export type CreateDepositGroupOp = {
+  request: CreateDepositGroupRequest;
+  response: CreateDepositGroupResponse;
+};
+
+```
+```typescript
+export interface CreateDepositGroupRequest {
+  depositPaytoUri: string;
+  amount: AmountString;
+}
+
+```
+```typescript
+export interface CreateDepositGroupResponse {
+  depositGroupId: string;
+  transactionId: string;
+}
+
+```
+
+(trackdepositgroupop)=
+### TrackDepositGroupOp
+```typescript
+/**
+ * Track the status of a deposit group by querying the exchange.
+ */
+export type TrackDepositGroupOp = {
+  request: TrackDepositGroupRequest;
+  response: TrackDepositGroupResponse;
+};
+
+```
+```typescript
+export interface TrackDepositGroupRequest {
+  depositGroupId: string;
+}
+
+```
+```typescript
+export interface TrackDepositGroupResponse {
+  responses: {
+    status: number;
+    body: any;
+  }[];
+}
+
+```
+
+(exportbackuprecoveryop)=
+### ExportBackupRecoveryOp
+```typescript
+// group: Backups
+/**
+ * Export the recovery information for the wallet.
+ */
+export type ExportBackupRecoveryOp = {
+  request: {};
+  response: BackupRecovery;
+};
+
+```
+
+(importbackuprecoveryop)=
+### ImportBackupRecoveryOp
+```typescript
+/**
+ * Import recovery information into the wallet.
+ */
+export type ImportBackupRecoveryOp = {
+  request: RecoveryLoadRequest;
+  response: {};
+};
+
+```
+```typescript
+/**
+ * Load recovery information into the wallet.
+ */
+export interface RecoveryLoadRequest {
+  recovery: BackupRecovery;
+  strategy?: RecoveryMergeStrategy;
+}
+
+```
+```typescript
+/**
+ * Strategy for loading recovery information.
+ */
+export declare enum RecoveryMergeStrategy {
+  /**
+   * Keep the local wallet root key, import and take over providers.
+   */
+  Ours = "ours",
+  /**
+   * Migrate to the wallet root key from the recovery information.
+   */
+  Theirs = "theirs",
+}
+
+```
+
+(runbackupcycleop)=
+### RunBackupCycleOp
+```typescript
+/**
+ * Manually make and upload a backup.
+ */
+export type RunBackupCycleOp = {
+  request: {};
+  response: {};
+};
+
+```
+
+(addbackupproviderop)=
+### AddBackupProviderOp
+```typescript
+/**
+ * Add a new backup provider.
+ */
+export type AddBackupProviderOp = {
+  request: AddBackupProviderRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AddBackupProviderRequest {
+  backupProviderBaseUrl: string;
+  name: string;
+  /**
+   * Activate the provider.  Should only be done after
+   * the user has reviewed the provider.
+   */
+  activate?: boolean;
+}
+
+```
+
+(getbackupinfoop)=
+### GetBackupInfoOp
+```typescript
+/**
+ * Get some useful stats about the backup state.
+ */
+export type GetBackupInfoOp = {
+  request: {};
+  response: BackupInfo;
+};
+
+```
+```typescript
+export interface BackupInfo {
+  walletRootPub: string;
+  deviceId: string;
+  providers: ProviderInfo[];
+}
+
+```
+```typescript
+/**
+ * Information about one provider.
+ *
+ * We don't store the account key here,
+ * as that's derived from the wallet root key.
+ */
+export interface ProviderInfo {
+  active: boolean;
+  syncProviderBaseUrl: string;
+  name: string;
+  terms?: BackupProviderTerms;
+  /**
+   * Last communication issue with the provider.
+   */
+  lastError?: TalerErrorDetail;
+  lastSuccessfulBackupTimestamp?: TalerProtocolTimestamp;
+  lastAttemptedBackupTimestamp?: TalerProtocolTimestamp;
+  paymentProposalIds: string[];
+  backupProblem?: BackupProblem;
+  paymentStatus: ProviderPaymentStatus;
+}
+
+```
+```typescript
+export interface BackupProviderTerms {
+  supportedProtocolVersion: string;
+  annualFee: AmountString;
+  storageLimitInMegabytes: number;
+}
+
+```
+```typescript
+export type BackupProblem =
+  | BackupUnreadableProblem
+  | BackupConflictingDeviceProblem;
+
+```
+```typescript
+export interface BackupUnreadableProblem {
+  type: "backup-unreadable";
+}
+
+```
+```typescript
+export interface BackupConflictingDeviceProblem {
+  type: "backup-conflicting-device";
+  otherDeviceId: string;
+  myDeviceId: string;
+  backupTimestamp: AbsoluteTime;
+}
+
+```
+```typescript
+export type ProviderPaymentStatus =
+  | ProviderPaymentTermsChanged
+  | ProviderPaymentPaid
+  | ProviderPaymentInsufficientBalance
+  | ProviderPaymentUnpaid
+  | ProviderPaymentPending;
+
+```
+```typescript
+export interface ProviderPaymentTermsChanged {
+  type: ProviderPaymentType.TermsChanged;
+  paidUntil: AbsoluteTime;
+  oldTerms: BackupProviderTerms;
+  newTerms: BackupProviderTerms;
+}
+
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.TermsChanged = "terms-changed"
+
+```
+```typescript
+export interface ProviderPaymentPaid {
+  type: ProviderPaymentType.Paid;
+  paidUntil: AbsoluteTime;
+}
+
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.Paid = "paid"
+
+```
+```typescript
+export interface ProviderPaymentInsufficientBalance {
+  type: ProviderPaymentType.InsufficientBalance;
+}
+
+```
+```typescript
+export interface ProviderPaymentUnpaid {
+  type: ProviderPaymentType.Unpaid;
+}
+
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.Unpaid = "unpaid"
+
+```
+```typescript
+export interface ProviderPaymentPending {
+  type: ProviderPaymentType.Pending;
+}
+
+```
+
+(setwalletdeviceidop)=
+### SetWalletDeviceIdOp
+```typescript
+/**
+ * Set the internal device ID of the wallet, used to
+ * identify whether a different/new wallet is accessing
+ * the backup of another wallet.
+ */
+export type SetWalletDeviceIdOp = {
+  request: SetWalletDeviceIdRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface SetWalletDeviceIdRequest {
+  /**
+   * New wallet device ID to set.
+   */
+  walletDeviceId: string;
+}
+
+```
+
+(exportbackupplainop)=
+### ExportBackupPlainOp
+```typescript
+/**
+ * Export a backup JSON, mostly useful for testing.
+ */
+export type ExportBackupPlainOp = {
+  request: {};
+  response: WalletBackupContentV1;
+};
+
+```
+
+(initiatepeerpushpaymentop)=
+### InitiatePeerPushPaymentOp
+```typescript
+// group: Peer Payments
+/**
+ * Initiate an outgoing peer push payment.
+ */
+export type InitiatePeerPushPaymentOp = {
+  request: InitiatePeerPushPaymentRequest;
+  response: InitiatePeerPushPaymentResponse;
+};
+
+```
+```typescript
+export interface InitiatePeerPushPaymentRequest {
+  amount: AmountString;
+  partialContractTerms: any;
+}
+
+```
+```typescript
+export interface InitiatePeerPushPaymentResponse {
+  exchangeBaseUrl: string;
+  pursePub: string;
+  mergePriv: string;
+  contractPriv: string;
+  talerUri: string;
+  transactionId: string;
+}
+
+```
+
+(checkpeerpushpaymentop)=
+### CheckPeerPushPaymentOp
+```typescript
+/**
+ * Check an incoming peer push payment.
+ */
+export type CheckPeerPushPaymentOp = {
+  request: CheckPeerPushPaymentRequest;
+  response: CheckPeerPushPaymentResponse;
+};
+
+```
+```typescript
+export interface CheckPeerPushPaymentRequest {
+  talerUri: string;
+}
+
+```
+```typescript
+export interface CheckPeerPushPaymentResponse {
+  contractTerms: any;
+  amount: AmountString;
+  peerPushPaymentIncomingId: string;
+}
+
+```
+
+(acceptpeerpushpaymentop)=
+### AcceptPeerPushPaymentOp
+```typescript
+/**
+ * Accept an incoming peer push payment.
+ */
+export type AcceptPeerPushPaymentOp = {
+  request: AcceptPeerPushPaymentRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptPeerPushPaymentRequest {
+  /**
+   * Transparent identifier of the incoming peer push payment.
+   */
+  peerPushPaymentIncomingId: string;
+}
+
+```
+
+(initiatepeerpullpaymentop)=
+### InitiatePeerPullPaymentOp
+```typescript
+/**
+ * Initiate an outgoing peer pull payment.
+ */
+export type InitiatePeerPullPaymentOp = {
+  request: InitiatePeerPullPaymentRequest;
+  response: InitiatePeerPullPaymentResponse;
+};
+
+```
+```typescript
+export interface InitiatePeerPullPaymentRequest {
+  /**
+   * FIXME: Make this optional?
+   */
+  exchangeBaseUrl: string;
+  amount: AmountString;
+  partialContractTerms: any;
+}
+
+```
+```typescript
+export interface InitiatePeerPullPaymentResponse {
+  /**
+   * Taler URI for the other party to make the payment
+   * that was requested.
+   */
+  talerUri: string;
+  transactionId: string;
+}
+
+```
+
+(checkpeerpullpaymentop)=
+### CheckPeerPullPaymentOp
+```typescript
+/**
+ * Prepare for an incoming peer pull payment.
+ */
+export type CheckPeerPullPaymentOp = {
+  request: CheckPeerPullPaymentRequest;
+  response: CheckPeerPullPaymentResponse;
+};
+
+```
+```typescript
+export interface CheckPeerPullPaymentRequest {
+  talerUri: string;
+}
+
+```
+```typescript
+export interface CheckPeerPullPaymentResponse {
+  contractTerms: any;
+  amount: AmountString;
+  peerPullPaymentIncomingId: string;
+}
+
+```
+
+(acceptpeerpullpaymentop)=
+### AcceptPeerPullPaymentOp
+```typescript
+/**
+ * Accept an incoming peer pull payment.
+ */
+export type AcceptPeerPullPaymentOp = {
+  request: AcceptPeerPullPaymentRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptPeerPullPaymentRequest {
+  /**
+   * Transparent identifier of the incoming peer pull payment.
+   */
+  peerPullPaymentIncomingId: string;
+}
+
+```
+
+(exportdbop)=
+### ExportDbOp
+```typescript
+// group: Database Management
+/**
+ * Exoport the wallet database's contents to JSON.
+ */
+export type ExportDbOp = {
+  request: {};
+  response: any;
+};
+
+```
+
+(cleardbop)=
+### ClearDbOp
+```typescript
+/**
+ * Dangerously clear the whole wallet database.
+ */
+export type ClearDbOp = {
+  request: {};
+  response: {};
+};
+
+```
+
+(recycleop)=
+### RecycleOp
+```typescript
+/**
+ * Export a backup, clear the database and re-import it.
+ */
+export type RecycleOp = {
+  request: {};
+  response: {};
+};
+
+```
+
+(runintegrationtestop)=
+### RunIntegrationTestOp
+```typescript
+// group: Testing and Debugging
+/**
+ * Run a simple integration test on a test deployment
+ * of the exchange and merchant.
+ */
+export type RunIntegrationTestOp = {
+  request: IntegrationTestArgs;
+  response: {};
+};
+
+```
+```typescript
+export interface IntegrationTestArgs {
+  exchangeBaseUrl: string;
+  bankBaseUrl: string;
+  bankAccessApiBaseUrl?: string;
+  merchantBaseUrl: string;
+  merchantAuthToken?: string;
+  amountToWithdraw: string;
+  amountToSpend: string;
+}
+
+```
+
+(withdrawtestbalanceop)=
+### WithdrawTestBalanceOp
+```typescript
+/**
+ * Make withdrawal on a test deployment of the exchange
+ * and merchant.
+ */
+export type WithdrawTestBalanceOp = {
+  request: WithdrawTestBalanceRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface WithdrawTestBalanceRequest {
+  amount: string;
+  bankBaseUrl: string;
+  /**
+   * Bank access API base URL.  Defaults to the bankBaseUrl.
+   */
+  bankAccessApiBaseUrl?: string;
+  exchangeBaseUrl: string;
+  forcedDenomSel?: ForcedDenomSel;
+}
+
+```
+
+(withdrawtestkudosop)=
+### WithdrawTestkudosOp
+```typescript
+/**
+ * Make a withdrawal of testkudos on test.taler.net.
+ */
+export type WithdrawTestkudosOp = {
+  op: WalletApiOperation.WithdrawTestkudos;
+  request: {};
+  response: {};
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.WithdrawTestkudos = "withdrawTestkudos"
+
+```
+
+(testpayop)=
+### TestPayOp
+```typescript
+/**
+ * Make a test payment using a test deployment of
+ * the exchange and merchant.
+ */
+export type TestPayOp = {
+  request: TestPayArgs;
+  response: TestPayResult;
+};
+
+```
+```typescript
+export interface TestPayArgs {
+  merchantBaseUrl: string;
+  merchantAuthToken?: string;
+  amount: string;
+  summary: string;
+  forcedCoinSel?: ForcedCoinSel;
+}
+
+```
+```typescript
+export interface TestPayResult {
+  payCoinSelection: PayCoinSelection;
+}
+
+```
+```typescript
+/**
+ * Result of selecting coins, contains the exchange, and selected
+ * coins with their denomination.
+ */
+export interface PayCoinSelection {
+  /**
+   * Amount requested by the merchant.
+   */
+  paymentAmount: AmountJson;
+  /**
+   * Public keys of the coins that were selected.
+   */
+  coinPubs: string[];
+  /**
+   * Amount that each coin contributes.
+   */
+  coinContributions: AmountJson[];
+  /**
+   * How much of the wire fees is the customer paying?
+   */
+  customerWireFees: AmountJson;
+  /**
+   * How much of the deposit fees is the customer paying?
+   */
+  customerDepositFees: AmountJson;
+}
+
+```
+```typescript
+/**
+ * Non-negative financial amount.  Fractional values are expressed as multiples
+ * of 1e-8.
+ */
+export interface AmountJson {
+  /**
+   * Value, must be an integer.
+   */
+  readonly value: number;
+  /**
+   * Fraction, must be an integer.  Represent 1/1e8 of a unit.
+   */
+  readonly fraction: number;
+  /**
+   * Currency of the amount.
+   */
+  readonly currency: string;
+}
+
+```
+
+(withdrawfakebankop)=
+### WithdrawFakebankOp
+```typescript
+/**
+ * Make a withdrawal from a fakebank, i.e.
+ * a bank where test users can be registered freely
+ * and testing APIs are available.
+ */
+export type WithdrawFakebankOp = {
+  op: WalletApiOperation.WithdrawFakebank;
+  request: WithdrawFakebankRequest;
+  response: {};
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.WithdrawFakebank = "withdrawFakebank"
+
+```
+```typescript
+export interface WithdrawFakebankRequest {
+  amount: AmountString;
+  exchange: string;
+  bank: string;
+}
+
+```
+
+(getpendingtasksop)=
+### GetPendingTasksOp
+```typescript
+/**
+ * Get wallet-internal pending tasks.
+ */
+export type GetPendingTasksOp = {
+  request: {};
+  response: PendingTasksResponse;
+};
+
+```
+```typescript
+/**
+ * Response returned from the pending operations API.
+ */
+export interface PendingOperationsResponse {
+  /**
+   * List of pending operations.
+   */
+  pendingOperations: PendingTaskInfo[];
+}
+
+```
+```typescript
+/**
+ * Information about a pending operation.
+ */
+export type PendingTaskInfo = PendingTaskInfoCommon &
+  (
+    | PendingExchangeUpdateTask
+    | PendingExchangeCheckRefreshTask
+    | PendingPayTask
+    | PendingProposalDownloadTask
+    | PendingRefreshTask
+    | PendingRefundQueryTask
+    | PendingTipPickupTask
+    | PendingWithdrawTask
+    | PendingRecoupTask
+    | PendingDepositTask
+    | PendingBackupTask
+  );
+
+```
+```typescript
+/**
+ * Fields that are present in every pending operation.
+ */
+export interface PendingTaskInfoCommon {
+  /**
+   * Type of the pending operation.
+   */
+  type: PendingTaskType;
+  /**
+   * Unique identifier for the pending task.
+   */
+  id: string;
+  /**
+   * Set to true if the operation indicates that something is really in 
progress,
+   * as opposed to some regular scheduled operation that can be tried later.
+   */
+  givesLifeness: boolean;
+  /**
+   * Timestamp when the pending operation should be executed next.
+   */
+  timestampDue: AbsoluteTime;
+  /**
+   * Retry info.  Currently used to stop the wallet after any operation
+   * exceeds a number of retries.
+   */
+  retryInfo?: RetryInfo;
+}
+
+```
+```typescript
+export enum PendingTaskType {
+  ExchangeUpdate = "exchange-update",
+  ExchangeCheckRefresh = "exchange-check-refresh",
+  Pay = "pay",
+  ProposalDownload = "proposal-download",
+  Refresh = "refresh",
+  Recoup = "recoup",
+  RefundQuery = "refund-query",
+  TipPickup = "tip-pickup",
+  Withdraw = "withdraw",
+  Deposit = "deposit",
+  Backup = "backup",
+}
+
+```
+```typescript
+export interface RetryInfo {
+  firstTry: AbsoluteTime;
+  nextRetry: AbsoluteTime;
+  retryCounter: number;
+}
+
+```
+```typescript
+export interface RetryPolicy {
+  readonly backoffDelta: Duration;
+  readonly backoffBase: number;
+  readonly maxTimeout: Duration;
+}
+
+```
+```typescript
+/**
+ * The wallet is currently updating information about an exchange.
+ */
+export interface PendingExchangeUpdateTask {
+  type: PendingTaskType.ExchangeUpdate;
+  exchangeBaseUrl: string;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.ExchangeUpdate = "exchange-update"
+
+```
+```typescript
+/**
+ * The wallet should check whether coins from this exchange
+ * need to be auto-refreshed.
+ */
+export interface PendingExchangeCheckRefreshTask {
+  type: PendingTaskType.ExchangeCheckRefresh;
+  exchangeBaseUrl: string;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.ExchangeCheckRefresh = "exchange-check-refresh"
+
+```
+```typescript
+/**
+ * The wallet is signing coins and then sending them to
+ * the merchant.
+ */
+export interface PendingPayTask {
+  type: PendingTaskType.Pay;
+  proposalId: string;
+  isReplay: boolean;
+  retryInfo?: RetryInfo;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Pay = "pay"
+
+```
+```typescript
+/**
+ * Status of downloading signed contract terms from a merchant.
+ */
+export interface PendingProposalDownloadTask {
+  type: PendingTaskType.ProposalDownload;
+  merchantBaseUrl: string;
+  proposalTimestamp: TalerProtocolTimestamp;
+  proposalId: string;
+  orderId: string;
+  lastError?: TalerErrorDetail;
+  retryInfo?: RetryInfo;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.ProposalDownload = "proposal-download"
+
+```
+```typescript
+/**
+ * Status of an ongoing withdrawal operation.
+ */
+export interface PendingRefreshTask {
+  type: PendingTaskType.Refresh;
+  lastError?: TalerErrorDetail;
+  refreshGroupId: string;
+  finishedPerCoin: boolean[];
+  retryInfo?: RetryInfo;
+}
+
+```
+```typescript
+/**
+ * The wallet is querying the merchant about whether any refund
+ * permissions are available for a purchase.
+ */
+export interface PendingRefundQueryTask {
+  type: PendingTaskType.RefundQuery;
+  proposalId: string;
+  retryInfo?: RetryInfo;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.RefundQuery = "refund-query"
+
+```
+```typescript
+/**
+ * The wallet is picking up a tip that the user has accepted.
+ */
+export interface PendingTipPickupTask {
+  type: PendingTaskType.TipPickup;
+  tipId: string;
+  merchantBaseUrl: string;
+  merchantTipId: string;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.TipPickup = "tip-pickup"
+
+```
+```typescript
+/**
+ * Status of an ongoing withdrawal operation.
+ */
+export interface PendingWithdrawTask {
+  type: PendingTaskType.Withdraw;
+  lastError: TalerErrorDetail | undefined;
+  retryInfo?: RetryInfo;
+  withdrawalGroupId: string;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Withdraw = "withdraw"
+
+```
+```typescript
+export interface PendingRecoupTask {
+  type: PendingTaskType.Recoup;
+  recoupGroupId: string;
+  retryInfo?: RetryInfo;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Recoup = "recoup"
+
+```
+```typescript
+/**
+ * Status of an ongoing deposit operation.
+ */
+export interface PendingDepositTask {
+  type: PendingTaskType.Deposit;
+  lastError: TalerErrorDetail | undefined;
+  retryInfo: RetryInfo | undefined;
+  depositGroupId: string;
+}
+
+```
+```typescript
+export interface PendingBackupTask {
+  type: PendingTaskType.Backup;
+  backupProviderBaseUrl: string;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Backup = "backup"
+
+```
+
+(dumpcoinsop)=
+### DumpCoinsOp
+```typescript
+/**
+ * Dump all coins of the wallet in a simple JSON format.
+ */
+export type DumpCoinsOp = {
+  request: {};
+  response: CoinDumpJson;
+};
+
+```
+```typescript
+/**
+ * Easy to process format for the public data of coins
+ * managed by the wallet.
+ */
+export interface CoinDumpJson {
+  coins: Array<{
+    /**
+     * The coin's denomination's public key.
+     */
+    denom_pub: DenominationPubKey;
+    /**
+     * 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;
+    /**
+     * Information about the age restriction
+     */
+    ageCommitmentProof: AgeCommitmentProof | undefined;
+  }>;
+}
+
+```
+```typescript
+interface Array<T> extends RelativeIndexable<T> {}
+
+```
+
+(setcoinsuspendedop)=
+### SetCoinSuspendedOp
+```typescript
+/**
+ * Set a coin as (un-)suspended.
+ * Suspended coins won't be used for payments.
+ */
+export type SetCoinSuspendedOp = {
+  request: SetCoinSuspendedRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface SetCoinSuspendedRequest {
+  coinPub: string;
+  suspended: boolean;
+}
+
+```
+
+(forcerefreshop)=
+### ForceRefreshOp
+```typescript
+/**
+ * Force a refresh on coins where it would not
+ * be necessary.
+ */
+export type ForceRefreshOp = {
+  request: ForceRefreshRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface ForceRefreshRequest {
+  coinPubList: string[];
+}
+
+```
+
+## Common Declarations
+```typescript
+export interface OrderShortInfo {
+  /**
+   * Order ID, uniquely identifies the order within a merchant instance
+   */
+  orderId: string;
+  /**
+   * Hash of the contract terms.
+   */
+  contractTermsHash: string;
+  /**
+   * More information about the merchant
+   */
+  merchant: MerchantInfo;
+  /**
+   * Summary of the order, given by the merchant
+   */
+  summary: string;
+  /**
+   * Map from IETF BCP 47 language tags to localized summaries
+   */
+  summary_i18n?: InternationalizedString;
+  /**
+   * List of products that are part of the order
+   */
+  products: Product[] | undefined;
+  /**
+   * Time indicating when the order should be delivered.
+   * May be overwritten by individual products.
+   */
+  delivery_date?: TalerProtocolTimestamp;
+  /**
+   * Delivery location for (all!) products.
+   */
+  delivery_location?: Location;
+  /**
+   * URL of the fulfillment, given by the merchant
+   */
+  fulfillmentUrl?: string;
+  /**
+   * Plain text message that should be shown to the user
+   * when the payment is complete.
+   */
+  fulfillmentMessage?: string;
+  /**
+   * Translations of fulfillmentMessage.
+   */
+  fulfillmentMessage_i18n?: InternationalizedString;
+}
+```
+```typescript
+export interface MerchantInfo {
+  name: string;
+  jurisdiction?: Location;
+  address?: Location;
+  logo?: string;
+  website?: string;
+  email?: string;
+}
+```
+```typescript
+export interface Location {
+  country?: string;
+  country_subdivision?: string;
+  district?: string;
+  town?: string;
+  town_location?: string;
+  post_code?: string;
+  street?: string;
+  building_name?: string;
+  building_number?: string;
+  address_lines?: string[];
+}
+```
+```typescript
+export interface InternationalizedString {
+  [lang_tag: string]: string;
+}
+```
+```typescript
+export interface Product {
+  product_id?: string;
+  description: string;
+  description_i18n?: {
+    [lang_tag: string]: string;
+  };
+  quantity?: number;
+  unit?: string;
+  price?: AmountString;
+  image?: string;
+  taxes?: Tax[];
+  delivery_date?: TalerProtocolTimestamp;
+}
+```
+```typescript
+export interface Tax {
+  name: string;
+  tax: AmountString;
+}
+```
+```typescript
+export interface TalerProtocolTimestamp {
+  readonly t_s: number | "never";
+}
+```
+```typescript
+// Enum value:
+// PendingTaskType.Refresh = "refresh"
+```
+```typescript
+// Enum value:
+// PendingTaskType.Deposit = "deposit"
+```
+```typescript
+export interface ExchangeListItem {
+  exchangeBaseUrl: string;
+  currency: string;
+  paytoUris: string[];
+  tos: ExchangeTos;
+}
+```
+```typescript
+export interface ExchangeTos {
+  acceptedVersion?: string;
+  currentVersion?: string;
+  contentType?: string;
+  content?: string;
+}
+```
+```typescript
+export interface ForcedDenomSel {
+  denoms: {
+    value: AmountString;
+    count: number;
+  }[];
+}
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.InsufficientBalance = "insufficient-balance"
+```
+```typescript
+/**
+ * Contract terms from a merchant.
+ */
+export interface ContractTerms {
+  /**
+   * Hash of the merchant's wire details.
+   */
+  h_wire: string;
+  /**
+   * Hash of the merchant's wire details.
+   */
+  auto_refund?: TalerProtocolDuration;
+  /**
+   * Wire method the merchant wants to use.
+   */
+  wire_method: string;
+  /**
+   * Human-readable short summary of the contract.
+   */
+  summary: string;
+  summary_i18n?: InternationalizedString;
+  /**
+   * Nonce used to ensure freshness.
+   */
+  nonce: string;
+  /**
+   * Total amount payable.
+   */
+  amount: string;
+  /**
+   * Auditors accepted by the merchant.
+   */
+  auditors: AuditorHandle[];
+  /**
+   * Deadline to pay for the contract.
+   */
+  pay_deadline: TalerProtocolTimestamp;
+  /**
+   * Maximum deposit fee covered by the merchant.
+   */
+  max_fee: string;
+  /**
+   * Information about the merchant.
+   */
+  merchant: MerchantInfo;
+  /**
+   * Public key of the merchant.
+   */
+  merchant_pub: string;
+  /**
+   * Time indicating when the order should be delivered.
+   * May be overwritten by individual products.
+   */
+  delivery_date?: TalerProtocolTimestamp;
+  /**
+   * Delivery location for (all!) products.
+   */
+  delivery_location?: Location;
+  /**
+   * List of accepted exchanges.
+   */
+  exchanges: ExchangeHandle[];
+  /**
+   * Products that are sold in this contract.
+   */
+  products?: Product[];
+  /**
+   * Deadline for refunds.
+   */
+  refund_deadline: TalerProtocolTimestamp;
+  /**
+   * Deadline for the wire transfer.
+   */
+  wire_transfer_deadline: TalerProtocolTimestamp;
+  /**
+   * Time when the contract was generated by the merchant.
+   */
+  timestamp: TalerProtocolTimestamp;
+  /**
+   * Order id to uniquely identify the purchase within
+   * one merchant instance.
+   */
+  order_id: string;
+  /**
+   * Base URL of the merchant's backend.
+   */
+  merchant_base_url: string;
+  /**
+   * Fulfillment URL to view the product or
+   * delivery status.
+   */
+  fulfillment_url?: string;
+  /**
+   * URL meant to share the shopping cart.
+   */
+  public_reorder_url?: string;
+  /**
+   * Plain text fulfillment message in the merchant's default language.
+   */
+  fulfillment_message?: string;
+  /**
+   * Internationalized fulfillment messages.
+   */
+  fulfillment_message_i18n?: InternationalizedString;
+  /**
+   * Share of the wire fee that must be settled with one payment.
+   */
+  wire_fee_amortization?: number;
+  /**
+   * Maximum wire fee that the merchant agrees to pay for.
+   */
+  max_wire_fee?: string;
+  minimum_age?: number;
+  /**
+   * Extra data, interpreted by the mechant only.
+   */
+  extra?: any;
+}
+```
+```typescript
+export interface TalerProtocolDuration {
+  readonly d_us: number | "forever";
+}
+```
+```typescript
+export interface AuditorHandle {
+  /**
+   * Official name of the auditor.
+   */
+  name: string;
+  /**
+   * Master public signing key of the auditor.
+   */
+  auditor_pub: string;
+  /**
+   * Base URL of the auditor.
+   */
+  url: string;
+}
+```
+```typescript
+/**
+ * Information about an exchange as stored inside a
+ * merchant's contract terms.
+ */
+export interface ExchangeHandle {
+  /**
+   * Master public signing key of the exchange.
+   */
+  master_pub: string;
+  /**
+   * Base URL of the exchange.
+   */
+  url: string;
+}
+```
+```typescript
+/**
+ * Forced coin selection for deposits/payments.
+ */
+export interface ForcedCoinSel {
+  coins: {
+    value: AmountString;
+    contribution: AmountString;
+  }[];
+}
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.Pending = "pending"
+```
+```typescript
+export interface TalerErrorDetail {
+  code: TalerErrorCode;
+  hint?: string;
+  [x: string]: unknown;
+}
+```
+```typescript
+export interface BackupRecovery {
+  walletRootPriv: string;
+  providers: {
+    url: string;
+  }[];
+}
+```
+```typescript
+export interface AbsoluteTime {
+  /**
+   * Timestamp in milliseconds.
+   */
+  readonly t_ms: number | "never";
+}
+```
+```typescript
+export interface Duration {
+  /**
+   * Duration in milliseconds.
+   */
+  readonly d_ms: number | "forever";
+}
+```
diff --git a/extract-tsdefs/package.json b/extract-tsdefs/package.json
new file mode 100644
index 0000000..cf3ba34
--- /dev/null
+++ b/extract-tsdefs/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "extract-tsdefs",
+  "version": "0.0.1",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "compile": "tsc",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "GPL-3.0",
+  "devDependencies": {
+    "@types/node": "^18.8.1",
+    "@types/prettier": "^2.7.1",
+    "prettier": "^2.7.1",
+    "typescript": "^4.8.4"
+  }
+}
diff --git a/extract-tsdefs/pnpm-lock.yaml b/extract-tsdefs/pnpm-lock.yaml
new file mode 100644
index 0000000..9de1119
--- /dev/null
+++ b/extract-tsdefs/pnpm-lock.yaml
@@ -0,0 +1,35 @@
+lockfileVersion: 5.4
+
+specifiers:
+  '@types/node': ^18.8.1
+  '@types/prettier': ^2.7.1
+  prettier: ^2.7.1
+  typescript: ^4.8.4
+
+devDependencies:
+  '@types/node': 18.8.1
+  '@types/prettier': 2.7.1
+  prettier: 2.7.1
+  typescript: 4.8.4
+
+packages:
+
+  /@types/node/18.8.1:
+    resolution: {integrity: 
sha512-vuYaNuEIbOYLTLUAJh50ezEbvxrD43iby+lpUA2aa148Nh5kX/AVO/9m1Ahmbux2iU5uxJTNF9g2Y+31uml7RQ==}
+    dev: true
+
+  /@types/prettier/2.7.1:
+    resolution: {integrity: 
sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==}
+    dev: true
+
+  /prettier/2.7.1:
+    resolution: {integrity: 
sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dev: true
+
+  /typescript/4.8.4:
+    resolution: {integrity: 
sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+    dev: true
diff --git a/extract-tsdefs/tsconfig.json b/extract-tsdefs/tsconfig.json
new file mode 100644
index 0000000..83ee9e2
--- /dev/null
+++ b/extract-tsdefs/tsconfig.json
@@ -0,0 +1,103 @@
+{
+  "compilerOptions": {
+    /* Visit https://aka.ms/tsconfig to read more about this file */
+
+    /* Projects */
+    // "incremental": true,                              /* Save .tsbuildinfo 
files to allow for incremental compilation of projects. */
+    // "composite": true,                                /* Enable constraints 
that allow a TypeScript project to be used with project references. */
+    // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path 
to .tsbuildinfo incremental compilation file. */
+    // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring 
source files instead of declaration files when referencing composite projects. 
*/
+    // "disableSolutionSearching": true,                 /* Opt a project out 
of multi-project reference checking when editing. */
+    // "disableReferencedProjectLoad": true,             /* Reduce the number 
of projects loaded automatically by TypeScript. */
+
+    /* Language and Environment */
+    "target": "es2016",                                  /* Set the JavaScript 
language version for emitted JavaScript and include compatible library 
declarations. */
+    // "lib": [],                                        /* Specify a set of 
bundled library declaration files that describe the target runtime environment. 
*/
+    // "jsx": "preserve",                                /* Specify what JSX 
code is generated. */
+    // "experimentalDecorators": true,                   /* Enable 
experimental support for TC39 stage 2 draft decorators. */
+    // "emitDecoratorMetadata": true,                    /* Emit design-type 
metadata for decorated declarations in source files. */
+    // "jsxFactory": "",                                 /* Specify the JSX 
factory function used when targeting React JSX emit, e.g. 'React.createElement' 
or 'h'. */
+    // "jsxFragmentFactory": "",                         /* Specify the JSX 
Fragment reference used for fragments when targeting React JSX emit e.g. 
'React.Fragment' or 'Fragment'. */
+    // "jsxImportSource": "",                            /* Specify module 
specifier used to import the JSX factory functions when using 'jsx: 
react-jsx*'. */
+    // "reactNamespace": "",                             /* Specify the object 
invoked for 'createElement'. This only applies when targeting 'react' JSX emit. 
*/
+    // "noLib": true,                                    /* Disable including 
any library files, including the default lib.d.ts. */
+    // "useDefineForClassFields": true,                  /* Emit 
ECMAScript-standard-compliant class fields. */
+    // "moduleDetection": "auto",                        /* Control what 
method is used to detect module-format JS files. */
+
+    /* Modules */
+    "module": "commonjs",                                /* Specify what 
module code is generated. */
+    // "rootDir": "./",                                  /* Specify the root 
folder within your source files. */
+    // "moduleResolution": "node",                       /* Specify how 
TypeScript looks up a file from a given module specifier. */
+    // "baseUrl": "./",                                  /* Specify the base 
directory to resolve non-relative module names. */
+    // "paths": {},                                      /* Specify a set of 
entries that re-map imports to additional lookup locations. */
+    // "rootDirs": [],                                   /* Allow multiple 
folders to be treated as one when resolving modules. */
+    // "typeRoots": [],                                  /* Specify multiple 
folders that act like './node_modules/@types'. */
+    // "types": [],                                      /* Specify type 
package names to be included without being referenced in a source file. */
+    // "allowUmdGlobalAccess": true,                     /* Allow accessing 
UMD globals from modules. */
+    // "moduleSuffixes": [],                             /* List of file name 
suffixes to search when resolving a module. */
+    // "resolveJsonModule": true,                        /* Enable importing 
.json files. */
+    // "noResolve": true,                                /* Disallow 
'import's, 'require's or '<reference>'s from expanding the number of files 
TypeScript should add to a project. */
+
+    /* JavaScript Support */
+    // "allowJs": true,                                  /* Allow JavaScript 
files to be a part of your program. Use the 'checkJS' option to get errors from 
these files. */
+    // "checkJs": true,                                  /* Enable error 
reporting in type-checked JavaScript files. */
+    // "maxNodeModuleJsDepth": 1,                        /* Specify the 
maximum folder depth used for checking JavaScript files from 'node_modules'. 
Only applicable with 'allowJs'. */
+
+    /* Emit */
+    // "declaration": true,                              /* Generate .d.ts 
files from TypeScript and JavaScript files in your project. */
+    // "declarationMap": true,                           /* Create sourcemaps 
for d.ts files. */
+    // "emitDeclarationOnly": true,                      /* Only output d.ts 
files and not JavaScript files. */
+    // "sourceMap": true,                                /* Create source map 
files for emitted JavaScript files. */
+    // "outFile": "./",                                  /* Specify a file 
that bundles all outputs into one JavaScript file. If 'declaration' is true, 
also designates a file that bundles all .d.ts output. */
+    "outDir": "./dist",                                   /* Specify an output 
folder for all emitted files. */
+    // "removeComments": true,                           /* Disable emitting 
comments. */
+    // "noEmit": true,                                   /* Disable emitting 
files from a compilation. */
+    // "importHelpers": true,                            /* Allow importing 
helper functions from tslib once per project, instead of including them 
per-file. */
+    // "importsNotUsedAsValues": "remove",               /* Specify 
emit/checking behavior for imports that are only used for types. */
+    // "downlevelIteration": true,                       /* Emit more 
compliant, but verbose and less performant JavaScript for iteration. */
+    // "sourceRoot": "",                                 /* Specify the root 
path for debuggers to find the reference source code. */
+    // "mapRoot": "",                                    /* Specify the 
location where debugger should locate map files instead of generated locations. 
*/
+    // "inlineSourceMap": true,                          /* Include sourcemap 
files inside the emitted JavaScript. */
+    // "inlineSources": true,                            /* Include source 
code in the sourcemaps inside the emitted JavaScript. */
+    // "emitBOM": true,                                  /* Emit a UTF-8 Byte 
Order Mark (BOM) in the beginning of output files. */
+    // "newLine": "crlf",                                /* Set the newline 
character for emitting files. */
+    // "stripInternal": true,                            /* Disable emitting 
declarations that have '@internal' in their JSDoc comments. */
+    // "noEmitHelpers": true,                            /* Disable generating 
custom helper functions like '__extends' in compiled output. */
+    // "noEmitOnError": true,                            /* Disable emitting 
files if any type checking errors are reported. */
+    // "preserveConstEnums": true,                       /* Disable erasing 
'const enum' declarations in generated code. */
+    // "declarationDir": "./",                           /* Specify the output 
directory for generated declaration files. */
+    // "preserveValueImports": true,                     /* Preserve unused 
imported values in the JavaScript output that would otherwise be removed. */
+
+    /* Interop Constraints */
+    // "isolatedModules": true,                          /* Ensure that each 
file can be safely transpiled without relying on other imports. */
+    // "allowSyntheticDefaultImports": true,             /* Allow 'import x 
from y' when a module doesn't have a default export. */
+    "esModuleInterop": true,                             /* Emit additional 
JavaScript to ease support for importing CommonJS modules. This enables 
'allowSyntheticDefaultImports' for type compatibility. */
+    // "preserveSymlinks": true,                         /* Disable resolving 
symlinks to their realpath. This correlates to the same flag in node. */
+    "forceConsistentCasingInFileNames": true,            /* Ensure that casing 
is correct in imports. */
+
+    /* Type Checking */
+    "strict": true,                                      /* Enable all strict 
type-checking options. */
+    // "noImplicitAny": true,                            /* Enable error 
reporting for expressions and declarations with an implied 'any' type. */
+    // "strictNullChecks": true,                         /* When type 
checking, take into account 'null' and 'undefined'. */
+    // "strictFunctionTypes": true,                      /* When assigning 
functions, check to ensure parameters and the return values are 
subtype-compatible. */
+    // "strictBindCallApply": true,                      /* Check that the 
arguments for 'bind', 'call', and 'apply' methods match the original function. 
*/
+    // "strictPropertyInitialization": true,             /* Check for class 
properties that are declared but not set in the constructor. */
+    // "noImplicitThis": true,                           /* Enable error 
reporting when 'this' is given the type 'any'. */
+    // "useUnknownInCatchVariables": true,               /* Default catch 
clause variables as 'unknown' instead of 'any'. */
+    // "alwaysStrict": true,                             /* Ensure 'use 
strict' is always emitted. */
+    // "noUnusedLocals": true,                           /* Enable error 
reporting when local variables aren't read. */
+    // "noUnusedParameters": true,                       /* Raise an error 
when a function parameter isn't read. */
+    // "exactOptionalPropertyTypes": true,               /* Interpret optional 
property types as written, rather than adding 'undefined'. */
+    // "noImplicitReturns": true,                        /* Enable error 
reporting for codepaths that do not explicitly return in a function. */
+    // "noFallthroughCasesInSwitch": true,               /* Enable error 
reporting for fallthrough cases in switch statements. */
+    // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to 
a type when accessed using an index. */
+    // "noImplicitOverride": true,                       /* Ensure overriding 
members in derived classes are marked with an override modifier. */
+    // "noPropertyAccessFromIndexSignature": true,       /* Enforces using 
indexed accessors for keys declared using an indexed type. */
+    // "allowUnusedLabels": true,                        /* Disable error 
reporting for unused labels. */
+    // "allowUnreachableCode": true,                     /* Disable error 
reporting for unreachable code. */
+
+    /* Completeness */
+    // "skipDefaultLibCheck": true,                      /* Skip type checking 
.d.ts files that are included with TypeScript. */
+    "skipLibCheck": true                                 /* Skip type checking 
all .d.ts files. */
+  }
+}
diff --git a/index.rst b/index.rst
index 1d63e79..3d3b305 100644
--- a/index.rst
+++ b/index.rst
@@ -66,6 +66,7 @@ Documentation Overview
   taler-auditor-manual
   taler-developer-manual
   taler-wallet
+  wallet/wallet-core
   design-documents/index
   libeufin/index
   global-licensing
diff --git a/wallet/wallet-core.md b/wallet/wallet-core.md
new file mode 100644
index 0000000..d560979
--- /dev/null
+++ b/wallet/wallet-core.md
@@ -0,0 +1,2514 @@
+# Wallet-Core API Documentation
+## Overview
+###  Initialization
+* [InitWalletOp](#initwalletop)
+###  Basic Wallet Information
+* [GetBalancesOp](#getbalancesop)
+###  Managing Transactions
+* [GetTransactionsOp](#gettransactionsop)
+* [DeleteTransactionOp](#deletetransactionop)
+* [RetryTransactionOp](#retrytransactionop)
+###  Withdrawals
+* [GetWithdrawalDetailsForAmountOp](#getwithdrawaldetailsforamountop)
+* [GetWithdrawalDetailsForUriOp](#getwithdrawaldetailsforuriop)
+* [AcceptBankIntegratedWithdrawalOp](#acceptbankintegratedwithdrawalop)
+* [AcceptManualWithdrawalOp](#acceptmanualwithdrawalop)
+###  Merchant Payments
+* [PreparePayForUriOp](#preparepayforuriop)
+* [ConfirmPayOp](#confirmpayop)
+* [AbortPayWithRefundOp](#abortpaywithrefundop)
+* [ApplyRefundOp](#applyrefundop)
+###  Tipping
+* [PrepareTipOp](#preparetipop)
+* [AcceptTipOp](#accepttipop)
+###  Exchange Management
+* [ListExchangesOp](#listexchangesop)
+* [AddExchangeOp](#addexchangeop)
+* [SetExchangeTosAcceptedOp](#setexchangetosacceptedop)
+* [GetExchangeTosOp](#getexchangetosop)
+* [ListCurrenciesOp](#listcurrenciesop)
+###  Deposits
+* [CreateDepositGroupOp](#createdepositgroupop)
+* [TrackDepositGroupOp](#trackdepositgroupop)
+###  Backups
+* [ExportBackupRecoveryOp](#exportbackuprecoveryop)
+* [ImportBackupRecoveryOp](#importbackuprecoveryop)
+* [RunBackupCycleOp](#runbackupcycleop)
+* [AddBackupProviderOp](#addbackupproviderop)
+* [GetBackupInfoOp](#getbackupinfoop)
+* [SetWalletDeviceIdOp](#setwalletdeviceidop)
+* [ExportBackupPlainOp](#exportbackupplainop)
+###  Peer Payments
+* [InitiatePeerPushPaymentOp](#initiatepeerpushpaymentop)
+* [CheckPeerPushPaymentOp](#checkpeerpushpaymentop)
+* [AcceptPeerPushPaymentOp](#acceptpeerpushpaymentop)
+* [InitiatePeerPullPaymentOp](#initiatepeerpullpaymentop)
+* [CheckPeerPullPaymentOp](#checkpeerpullpaymentop)
+* [AcceptPeerPullPaymentOp](#acceptpeerpullpaymentop)
+###  Database Management
+* [ExportDbOp](#exportdbop)
+* [ClearDbOp](#cleardbop)
+* [RecycleOp](#recycleop)
+###  Testing and Debugging
+* [RunIntegrationTestOp](#runintegrationtestop)
+* [WithdrawTestBalanceOp](#withdrawtestbalanceop)
+* [WithdrawTestkudosOp](#withdrawtestkudosop)
+* [TestPayOp](#testpayop)
+* [WithdrawFakebankOp](#withdrawfakebankop)
+* [GetPendingTasksOp](#getpendingtasksop)
+* [DumpCoinsOp](#dumpcoinsop)
+* [SetCoinSuspendedOp](#setcoinsuspendedop)
+* [ForceRefreshOp](#forcerefreshop)
+## Operation Reference
+(initwalletop)=
+### InitWalletOp
+```typescript
+// group: Initialization
+/**
+ * Initialize wallet-core.
+ *
+ * Must be the request before any other operations.
+ */
+export type InitWalletOp = {
+  op: WalletApiOperation.InitWallet;
+  request: {};
+  response: {};
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.InitWallet = "initWallet"
+
+```
+
+(getbalancesop)=
+### GetBalancesOp
+```typescript
+// group: Basic Wallet Information
+/**
+ * Get current wallet balance.
+ */
+export type GetBalancesOp = {
+  request: {};
+  response: BalancesResponse;
+};
+
+```
+```typescript
+export interface BalancesResponse {
+  balances: Balance[];
+}
+
+```
+```typescript
+export interface Balance {
+  available: AmountString;
+  pendingIncoming: AmountString;
+  pendingOutgoing: AmountString;
+  hasPendingTransactions: boolean;
+  requiresUserInput: boolean;
+}
+
+```
+
+(gettransactionsop)=
+### GetTransactionsOp
+```typescript
+// group: Managing Transactions
+/**
+ * Get transactions.
+ */
+export type GetTransactionsOp = {
+  request: TransactionsRequest;
+  response: TransactionsResponse;
+};
+
+```
+```typescript
+export interface TransactionsRequest {
+  /**
+   * return only transactions in the given currency
+   */
+  currency?: string;
+  /**
+   * if present, results will be limited to transactions related to the given 
search string
+   */
+  search?: string;
+}
+
+```
+```typescript
+export interface TransactionsResponse {
+  transactions: Transaction[];
+}
+
+```
+```typescript
+export declare type Transaction =
+  | TransactionWithdrawal
+  | TransactionPayment
+  | TransactionRefund
+  | TransactionTip
+  | TransactionRefresh
+  | TransactionDeposit
+  | TransactionPeerPullCredit
+  | TransactionPeerPullDebit
+  | TransactionPeerPushCredit
+  | TransactionPeerPushDebit;
+
+```
+```typescript
+export interface TransactionWithdrawal extends TransactionCommon {
+  type: TransactionType.Withdrawal;
+  /**
+   * Exchange of the withdrawal.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+  withdrawalDetails: WithdrawalDetails;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Withdrawal = "withdrawal"
+
+```
+```typescript
+export declare type WithdrawalDetails =
+  | WithdrawalDetailsForManualTransfer
+  | WithdrawalDetailsForTalerBankIntegrationApi;
+
+```
+```typescript
+interface WithdrawalDetailsForManualTransfer {
+  type: WithdrawalType.ManualTransfer;
+  /**
+   * Payto URIs that the exchange supports.
+   *
+   * Already contains the amount and message.
+   */
+  exchangePaytoUris: string[];
+  reservePub: string;
+}
+
+```
+```typescript
+// Enum value:
+// WithdrawalType.ManualTransfer = "manual-transfer"
+
+```
+```typescript
+interface WithdrawalDetailsForTalerBankIntegrationApi {
+  type: WithdrawalType.TalerBankIntegrationApi;
+  /**
+   * 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;
+  reservePub: string;
+}
+
+```
+```typescript
+// Enum value:
+// WithdrawalType.TalerBankIntegrationApi = "taler-bank-integration-api"
+
+```
+```typescript
+export interface TransactionPayment extends TransactionCommon {
+  type: TransactionType.Payment;
+  /**
+   * Additional information about the payment.
+   */
+  info: OrderShortInfo;
+  /**
+   * Wallet-internal end-to-end identifier for the payment.
+   */
+  proposalId: string;
+  /**
+   * How far did the wallet get with processing the payment?
+   */
+  status: PaymentStatus;
+  /**
+   * Amount that must be paid for the contract
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that was paid, including deposit, wire and refresh fees.
+   */
+  amountEffective: AmountString;
+  /**
+   * Amount that has been refunded by the merchant
+   */
+  totalRefundRaw: AmountString;
+  /**
+   * Amount will be added to the wallet's balance after fees and refreshing
+   */
+  totalRefundEffective: AmountString;
+  /**
+   * Amount pending to be picked up
+   */
+  refundPending: AmountString | undefined;
+  /**
+   * Reference to applied refunds
+   */
+  refunds: RefundInfoShort[];
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Payment = "payment"
+
+```
+```typescript
+export declare enum PaymentStatus {
+  /**
+   * Explicitly aborted after timeout / failure
+   */
+  Aborted = "aborted",
+  /**
+   * Payment failed, wallet will auto-retry.
+   * User should be given the option to retry now / abort.
+   */
+  Failed = "failed",
+  /**
+   * Paid successfully
+   */
+  Paid = "paid",
+  /**
+   * User accepted, payment is processing.
+   */
+  Accepted = "accepted",
+}
+
+```
+```typescript
+export interface RefundInfoShort {
+  transactionId: string;
+  timestamp: TalerProtocolTimestamp;
+  amountEffective: AmountString;
+  amountRaw: AmountString;
+}
+
+```
+```typescript
+export interface TransactionRefund extends TransactionCommon {
+  type: TransactionType.Refund;
+  refundedTransactionId: string;
+  info: OrderShortInfo;
+  /**
+   * Amount pending to be picked up
+   */
+  refundPending: AmountString | undefined;
+  amountRaw: AmountString;
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Refund = "refund"
+
+```
+```typescript
+export interface TransactionTip extends TransactionCommon {
+  type: TransactionType.Tip;
+  amountRaw: AmountString;
+  /**
+   * More information about the merchant
+   */
+  amountEffective: AmountString;
+  merchantBaseUrl: string;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.Tip = "tip"
+
+```
+```typescript
+export interface TransactionRefresh extends TransactionCommon {
+  type: TransactionType.Refresh;
+  exchangeBaseUrl: string;
+  amountRaw: AmountString;
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+/**
+ * Deposit transaction, which effectively sends
+ * money from this wallet somewhere else.
+ */
+export interface TransactionDeposit extends TransactionCommon {
+  type: TransactionType.Deposit;
+  depositGroupId: string;
+  /**
+   * Target for the deposit.
+   */
+  targetPaytoUri: string;
+  /**
+   * Raw amount that is being deposited
+   */
+  amountRaw: AmountString;
+  /**
+   * Effective amount that is being deposited
+   */
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+/**
+ * Credit because we were paid for a P2P invoice we created.
+ */
+export interface TransactionPeerPullCredit extends TransactionCommon {
+  type: TransactionType.PeerPullCredit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+  /**
+   * URI to send to the other party.
+   */
+  talerUri: string;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPullCredit = "peer-pull-credit"
+
+```
+```typescript
+export interface PeerInfoShort {
+  expiration: TalerProtocolTimestamp | undefined;
+  summary: string | undefined;
+}
+
+```
+```typescript
+/**
+ * Debit because we paid someone's invoice.
+ */
+export interface TransactionPeerPullDebit extends TransactionCommon {
+  type: TransactionType.PeerPullDebit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  amountRaw: AmountString;
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPullDebit = "peer-pull-debit"
+
+```
+```typescript
+/**
+ * We received money via a P2P payment.
+ */
+export interface TransactionPeerPushCredit extends TransactionCommon {
+  type: TransactionType.PeerPushCredit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPushCredit = "peer-push-credit"
+
+```
+```typescript
+/**
+ * We sent money via a P2P payment.
+ */
+export interface TransactionPeerPushDebit extends TransactionCommon {
+  type: TransactionType.PeerPushDebit;
+  info: PeerInfoShort;
+  /**
+   * Exchange used.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Amount that got subtracted from the reserve balance.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that actually was (or will be) added to the wallet's balance.
+   */
+  amountEffective: AmountString;
+  /**
+   * URI to accept the payment.
+   */
+  talerUri: string;
+}
+
+```
+```typescript
+// Enum value:
+// TransactionType.PeerPushDebit = "peer-push-debit"
+
+```
+
+(deletetransactionop)=
+### DeleteTransactionOp
+```typescript
+/**
+ * Delete a transaction locally in the wallet.
+ */
+export type DeleteTransactionOp = {
+  request: DeleteTransactionRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface DeleteTransactionRequest {
+  transactionId: string;
+}
+
+```
+
+(retrytransactionop)=
+### RetryTransactionOp
+```typescript
+/**
+ * Immediately retry a transaction.
+ */
+export type RetryTransactionOp = {
+  request: RetryTransactionRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface RetryTransactionRequest {
+  transactionId: string;
+}
+
+```
+
+(getwithdrawaldetailsforamountop)=
+### GetWithdrawalDetailsForAmountOp
+```typescript
+// group: Withdrawals
+/**
+ * Get details for withdrawing a particular amount (manual withdrawal).
+ */
+export type GetWithdrawalDetailsForAmountOp = {
+  request: GetWithdrawalDetailsForAmountRequest;
+  response: ManualWithdrawalDetails;
+};
+
+```
+```typescript
+export interface GetWithdrawalDetailsForAmountRequest {
+  exchangeBaseUrl: string;
+  amount: string;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface ManualWithdrawalDetails {
+  /**
+   * Did the user accept the current version of the exchange's
+   * terms of service?
+   */
+  tosAccepted: boolean;
+  /**
+   * Amount that the user will transfer to the exchange.
+   */
+  amountRaw: AmountString;
+  /**
+   * Amount that will be added to the user's wallet balance.
+   */
+  amountEffective: AmountString;
+  /**
+   * Ways to pay the exchange.
+   */
+  paytoUris: string[];
+}
+
+```
+
+(getwithdrawaldetailsforuriop)=
+### GetWithdrawalDetailsForUriOp
+```typescript
+/**
+ * Get details for withdrawing via a particular taler:// URI.
+ */
+export type GetWithdrawalDetailsForUriOp = {
+  request: GetWithdrawalDetailsForUriRequest;
+  response: WithdrawUriInfoResponse;
+};
+
+```
+```typescript
+export interface GetWithdrawalDetailsForUriRequest {
+  talerWithdrawUri: string;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface WithdrawUriInfoResponse {
+  amount: AmountString;
+  defaultExchangeBaseUrl?: string;
+  possibleExchanges: ExchangeListItem[];
+}
+
+```
+
+(acceptbankintegratedwithdrawalop)=
+### AcceptBankIntegratedWithdrawalOp
+```typescript
+/**
+ * Accept a bank-integrated withdrawal.
+ */
+export type AcceptBankIntegratedWithdrawalOp = {
+  request: AcceptBankIntegratedWithdrawalRequest;
+  response: AcceptWithdrawalResponse;
+};
+
+```
+```typescript
+export interface AcceptBankIntegratedWithdrawalRequest {
+  talerWithdrawUri: string;
+  exchangeBaseUrl: string;
+  forcedDenomSel?: ForcedDenomSel;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface AcceptWithdrawalResponse {
+  reservePub: string;
+  confirmTransferUrl?: string;
+  transactionId: string;
+}
+
+```
+
+(acceptmanualwithdrawalop)=
+### AcceptManualWithdrawalOp
+```typescript
+/**
+ * Create a manual withdrawal.
+ */
+export type AcceptManualWithdrawalOp = {
+  request: AcceptManualWithdrawalRequest;
+  response: AcceptManualWithdrawalResult;
+};
+
+```
+```typescript
+export interface AcceptManualWithdrawalRequest {
+  exchangeBaseUrl: string;
+  amount: string;
+  restrictAge?: number;
+}
+
+```
+```typescript
+export interface AcceptManualWithdrawalResult {
+  /**
+   * Payto URIs that can be used to fund the withdrawal.
+   */
+  exchangePaytoUris: string[];
+  /**
+   * Public key of the newly created reserve.
+   */
+  reservePub: string;
+  transactionId: string;
+}
+
+```
+
+(preparepayforuriop)=
+### PreparePayForUriOp
+```typescript
+// group: Merchant Payments
+/**
+ * Prepare to make a payment
+ */
+export type PreparePayForUriOp = {
+  op: WalletApiOperation.PreparePayForUri;
+  request: PreparePayRequest;
+  response: PreparePayResult;
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.PreparePayForUri = "preparePayForUri"
+
+```
+```typescript
+export interface PreparePayRequest {
+  talerPayUri: string;
+}
+
+```
+```typescript
+/**
+ * Result of a prepare pay operation.
+ */
+export declare type PreparePayResult =
+  | PreparePayResultInsufficientBalance
+  | PreparePayResultAlreadyConfirmed
+  | PreparePayResultPaymentPossible;
+
+```
+```typescript
+export interface PreparePayResultInsufficientBalance {
+  status: PreparePayResultType.InsufficientBalance;
+  proposalId: string;
+  contractTerms: ContractTerms;
+  amountRaw: string;
+  noncePriv: string;
+}
+
+```
+```typescript
+export interface PreparePayResultAlreadyConfirmed {
+  status: PreparePayResultType.AlreadyConfirmed;
+  contractTerms: ContractTerms;
+  paid: boolean;
+  amountRaw: string;
+  amountEffective: string;
+  contractTermsHash: string;
+  proposalId: string;
+}
+
+```
+```typescript
+// Enum value:
+// PreparePayResultType.AlreadyConfirmed = "already-confirmed"
+
+```
+```typescript
+/**
+ * Payment is possible.
+ */
+export interface PreparePayResultPaymentPossible {
+  status: PreparePayResultType.PaymentPossible;
+  proposalId: string;
+  contractTerms: ContractTerms;
+  contractTermsHash: string;
+  amountRaw: string;
+  amountEffective: string;
+  noncePriv: string;
+}
+
+```
+```typescript
+// Enum value:
+// PreparePayResultType.PaymentPossible = "payment-possible"
+
+```
+
+(confirmpayop)=
+### ConfirmPayOp
+```typescript
+/**
+ * Confirm a payment that was previously prepared with
+ * {@link PreparePayForUriOp}
+ */
+export type ConfirmPayOp = {
+  op: WalletApiOperation.ConfirmPay;
+  request: ConfirmPayRequest;
+  response: ConfirmPayResult;
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.ConfirmPay = "confirmPay"
+
+```
+```typescript
+export interface ConfirmPayRequest {
+  proposalId: string;
+  sessionId?: string;
+  forcedCoinSel?: ForcedCoinSel;
+}
+
+```
+```typescript
+export declare type ConfirmPayResult =
+  | ConfirmPayResultDone
+  | ConfirmPayResultPending;
+
+```
+```typescript
+/**
+ * Result for confirmPay
+ */
+export interface ConfirmPayResultDone {
+  type: ConfirmPayResultType.Done;
+  contractTerms: ContractTerms;
+  transactionId: string;
+}
+
+```
+```typescript
+// Enum value:
+// ConfirmPayResultType.Done = "done"
+
+```
+```typescript
+export interface ConfirmPayResultPending {
+  type: ConfirmPayResultType.Pending;
+  transactionId: string;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+
+(abortpaywithrefundop)=
+### AbortPayWithRefundOp
+```typescript
+/**
+ * Abort a pending payment with a refund.
+ */
+export type AbortPayWithRefundOp = {
+  request: AbortPayWithRefundRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AbortPayWithRefundRequest {
+  proposalId: string;
+}
+
+```
+
+(applyrefundop)=
+### ApplyRefundOp
+```typescript
+/**
+ * Check for a refund based on a taler://refund URI.
+ */
+export type ApplyRefundOp = {
+  request: ApplyRefundRequest;
+  response: ApplyRefundResponse;
+};
+
+```
+```typescript
+export interface ApplyRefundRequest {
+  talerRefundUri: string;
+}
+
+```
+```typescript
+export interface ApplyRefundResponse {
+  contractTermsHash: string;
+  transactionId: string;
+  proposalId: string;
+  amountEffectivePaid: AmountString;
+  amountRefundGranted: AmountString;
+  amountRefundGone: AmountString;
+  pendingAtExchange: boolean;
+  info: OrderShortInfo;
+}
+
+```
+
+(preparetipop)=
+### PrepareTipOp
+```typescript
+// group: Tipping
+/**
+ * Query and store information about a tip.
+ */
+export type PrepareTipOp = {
+  request: PrepareTipRequest;
+  response: PrepareTipResult;
+};
+
+```
+```typescript
+export interface PrepareTipRequest {
+  talerTipUri: string;
+}
+
+```
+```typescript
+export 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;
+  /**
+   * Amount that the merchant gave.
+   */
+  tipAmountRaw: AmountString;
+  /**
+   * Amount that arrived at the wallet.
+   * Might be lower than the raw amount due to fees.
+   */
+  tipAmountEffective: AmountString;
+  /**
+   * Base URL of the merchant backend giving then tip.
+   */
+  merchantBaseUrl: string;
+  /**
+   * Base URL of the exchange that is used to withdraw the tip.
+   * Determined by the merchant, the wallet/user has no choice here.
+   */
+  exchangeBaseUrl: string;
+  /**
+   * Time when the tip will expire.  After it expired, it can't be picked
+   * up anymore.
+   */
+  expirationTimestamp: TalerProtocolTimestamp;
+}
+
+```
+
+(accepttipop)=
+### AcceptTipOp
+```typescript
+/**
+ * Accept a tip.
+ */
+export type AcceptTipOp = {
+  request: AcceptTipRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptTipRequest {
+  walletTipId: string;
+}
+
+```
+
+(listexchangesop)=
+### ListExchangesOp
+```typescript
+// group: Exchange Management
+/**
+ * List exchanges known to the wallet.
+ */
+export type ListExchangesOp = {
+  request: {};
+  response: ExchangesListResponse;
+};
+
+```
+```typescript
+export interface ExchangesListResponse {
+  exchanges: ExchangeListItem[];
+}
+
+```
+
+(addexchangeop)=
+### AddExchangeOp
+```typescript
+/**
+ * Add / force-update an exchange.
+ */
+export type AddExchangeOp = {
+  request: AddExchangeRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AddExchangeRequest {
+  exchangeBaseUrl: string;
+  forceUpdate?: boolean;
+}
+
+```
+
+(setexchangetosacceptedop)=
+### SetExchangeTosAcceptedOp
+```typescript
+/**
+ * Accept a particular version of the exchange terms of service.
+ */
+export type SetExchangeTosAcceptedOp = {
+  request: AcceptExchangeTosRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptExchangeTosRequest {
+  exchangeBaseUrl: string;
+  etag: string | undefined;
+}
+
+```
+
+(getexchangetosop)=
+### GetExchangeTosOp
+```typescript
+/**
+ * Get the current terms of a service of an exchange.
+ */
+export type GetExchangeTosOp = {
+  request: GetExchangeTosRequest;
+  response: GetExchangeTosResult;
+};
+
+```
+```typescript
+export interface GetExchangeTosRequest {
+  exchangeBaseUrl: string;
+  acceptedFormat?: string[];
+}
+
+```
+```typescript
+export interface GetExchangeTosResult {
+  /**
+   * Markdown version of the current ToS.
+   */
+  content: string;
+  /**
+   * Version tag of the current ToS.
+   */
+  currentEtag: string;
+  /**
+   * Version tag of the last ToS that the user has accepted,
+   * if any.
+   */
+  acceptedEtag: string | undefined;
+  /**
+   * Accepted content type
+   */
+  contentType: string;
+}
+
+```
+
+(listcurrenciesop)=
+### ListCurrenciesOp
+```typescript
+/**
+ * List currencies known to the wallet.
+ */
+export type ListCurrenciesOp = {
+  request: {};
+  response: WalletCurrencyInfo;
+};
+
+```
+```typescript
+export interface WalletCurrencyInfo {
+  trustedAuditors: {
+    currency: string;
+    auditorPub: string;
+    auditorBaseUrl: string;
+  }[];
+  trustedExchanges: {
+    currency: string;
+    exchangeMasterPub: string;
+    exchangeBaseUrl: string;
+  }[];
+}
+
+```
+
+(createdepositgroupop)=
+### CreateDepositGroupOp
+```typescript
+// group: Deposits
+/**
+ * Create a new deposit group.
+ *
+ * Deposit groups are used to deposit multiple coins to a bank
+ * account, usually the wallet user's own bank account.
+ */
+export type CreateDepositGroupOp = {
+  request: CreateDepositGroupRequest;
+  response: CreateDepositGroupResponse;
+};
+
+```
+```typescript
+export interface CreateDepositGroupRequest {
+  depositPaytoUri: string;
+  amount: AmountString;
+}
+
+```
+```typescript
+export interface CreateDepositGroupResponse {
+  depositGroupId: string;
+  transactionId: string;
+}
+
+```
+
+(trackdepositgroupop)=
+### TrackDepositGroupOp
+```typescript
+/**
+ * Track the status of a deposit group by querying the exchange.
+ */
+export type TrackDepositGroupOp = {
+  request: TrackDepositGroupRequest;
+  response: TrackDepositGroupResponse;
+};
+
+```
+```typescript
+export interface TrackDepositGroupRequest {
+  depositGroupId: string;
+}
+
+```
+```typescript
+export interface TrackDepositGroupResponse {
+  responses: {
+    status: number;
+    body: any;
+  }[];
+}
+
+```
+
+(exportbackuprecoveryop)=
+### ExportBackupRecoveryOp
+```typescript
+// group: Backups
+/**
+ * Export the recovery information for the wallet.
+ */
+export type ExportBackupRecoveryOp = {
+  request: {};
+  response: BackupRecovery;
+};
+
+```
+
+(importbackuprecoveryop)=
+### ImportBackupRecoveryOp
+```typescript
+/**
+ * Import recovery information into the wallet.
+ */
+export type ImportBackupRecoveryOp = {
+  request: RecoveryLoadRequest;
+  response: {};
+};
+
+```
+```typescript
+/**
+ * Load recovery information into the wallet.
+ */
+export interface RecoveryLoadRequest {
+  recovery: BackupRecovery;
+  strategy?: RecoveryMergeStrategy;
+}
+
+```
+```typescript
+/**
+ * Strategy for loading recovery information.
+ */
+export declare enum RecoveryMergeStrategy {
+  /**
+   * Keep the local wallet root key, import and take over providers.
+   */
+  Ours = "ours",
+  /**
+   * Migrate to the wallet root key from the recovery information.
+   */
+  Theirs = "theirs",
+}
+
+```
+
+(runbackupcycleop)=
+### RunBackupCycleOp
+```typescript
+/**
+ * Manually make and upload a backup.
+ */
+export type RunBackupCycleOp = {
+  request: {};
+  response: {};
+};
+
+```
+
+(addbackupproviderop)=
+### AddBackupProviderOp
+```typescript
+/**
+ * Add a new backup provider.
+ */
+export type AddBackupProviderOp = {
+  request: AddBackupProviderRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AddBackupProviderRequest {
+  backupProviderBaseUrl: string;
+  name: string;
+  /**
+   * Activate the provider.  Should only be done after
+   * the user has reviewed the provider.
+   */
+  activate?: boolean;
+}
+
+```
+
+(getbackupinfoop)=
+### GetBackupInfoOp
+```typescript
+/**
+ * Get some useful stats about the backup state.
+ */
+export type GetBackupInfoOp = {
+  request: {};
+  response: BackupInfo;
+};
+
+```
+```typescript
+export interface BackupInfo {
+  walletRootPub: string;
+  deviceId: string;
+  providers: ProviderInfo[];
+}
+
+```
+```typescript
+/**
+ * Information about one provider.
+ *
+ * We don't store the account key here,
+ * as that's derived from the wallet root key.
+ */
+export interface ProviderInfo {
+  active: boolean;
+  syncProviderBaseUrl: string;
+  name: string;
+  terms?: BackupProviderTerms;
+  /**
+   * Last communication issue with the provider.
+   */
+  lastError?: TalerErrorDetail;
+  lastSuccessfulBackupTimestamp?: TalerProtocolTimestamp;
+  lastAttemptedBackupTimestamp?: TalerProtocolTimestamp;
+  paymentProposalIds: string[];
+  backupProblem?: BackupProblem;
+  paymentStatus: ProviderPaymentStatus;
+}
+
+```
+```typescript
+export interface BackupProviderTerms {
+  supportedProtocolVersion: string;
+  annualFee: AmountString;
+  storageLimitInMegabytes: number;
+}
+
+```
+```typescript
+export type BackupProblem =
+  | BackupUnreadableProblem
+  | BackupConflictingDeviceProblem;
+
+```
+```typescript
+export interface BackupUnreadableProblem {
+  type: "backup-unreadable";
+}
+
+```
+```typescript
+export interface BackupConflictingDeviceProblem {
+  type: "backup-conflicting-device";
+  otherDeviceId: string;
+  myDeviceId: string;
+  backupTimestamp: AbsoluteTime;
+}
+
+```
+```typescript
+export type ProviderPaymentStatus =
+  | ProviderPaymentTermsChanged
+  | ProviderPaymentPaid
+  | ProviderPaymentInsufficientBalance
+  | ProviderPaymentUnpaid
+  | ProviderPaymentPending;
+
+```
+```typescript
+export interface ProviderPaymentTermsChanged {
+  type: ProviderPaymentType.TermsChanged;
+  paidUntil: AbsoluteTime;
+  oldTerms: BackupProviderTerms;
+  newTerms: BackupProviderTerms;
+}
+
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.TermsChanged = "terms-changed"
+
+```
+```typescript
+export interface ProviderPaymentPaid {
+  type: ProviderPaymentType.Paid;
+  paidUntil: AbsoluteTime;
+}
+
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.Paid = "paid"
+
+```
+```typescript
+export interface ProviderPaymentInsufficientBalance {
+  type: ProviderPaymentType.InsufficientBalance;
+}
+
+```
+```typescript
+export interface ProviderPaymentUnpaid {
+  type: ProviderPaymentType.Unpaid;
+}
+
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.Unpaid = "unpaid"
+
+```
+```typescript
+export interface ProviderPaymentPending {
+  type: ProviderPaymentType.Pending;
+}
+
+```
+
+(setwalletdeviceidop)=
+### SetWalletDeviceIdOp
+```typescript
+/**
+ * Set the internal device ID of the wallet, used to
+ * identify whether a different/new wallet is accessing
+ * the backup of another wallet.
+ */
+export type SetWalletDeviceIdOp = {
+  request: SetWalletDeviceIdRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface SetWalletDeviceIdRequest {
+  /**
+   * New wallet device ID to set.
+   */
+  walletDeviceId: string;
+}
+
+```
+
+(exportbackupplainop)=
+### ExportBackupPlainOp
+```typescript
+/**
+ * Export a backup JSON, mostly useful for testing.
+ */
+export type ExportBackupPlainOp = {
+  request: {};
+  response: WalletBackupContentV1;
+};
+
+```
+
+(initiatepeerpushpaymentop)=
+### InitiatePeerPushPaymentOp
+```typescript
+// group: Peer Payments
+/**
+ * Initiate an outgoing peer push payment.
+ */
+export type InitiatePeerPushPaymentOp = {
+  request: InitiatePeerPushPaymentRequest;
+  response: InitiatePeerPushPaymentResponse;
+};
+
+```
+```typescript
+export interface InitiatePeerPushPaymentRequest {
+  amount: AmountString;
+  partialContractTerms: any;
+}
+
+```
+```typescript
+export interface InitiatePeerPushPaymentResponse {
+  exchangeBaseUrl: string;
+  pursePub: string;
+  mergePriv: string;
+  contractPriv: string;
+  talerUri: string;
+  transactionId: string;
+}
+
+```
+
+(checkpeerpushpaymentop)=
+### CheckPeerPushPaymentOp
+```typescript
+/**
+ * Check an incoming peer push payment.
+ */
+export type CheckPeerPushPaymentOp = {
+  request: CheckPeerPushPaymentRequest;
+  response: CheckPeerPushPaymentResponse;
+};
+
+```
+```typescript
+export interface CheckPeerPushPaymentRequest {
+  talerUri: string;
+}
+
+```
+```typescript
+export interface CheckPeerPushPaymentResponse {
+  contractTerms: any;
+  amount: AmountString;
+  peerPushPaymentIncomingId: string;
+}
+
+```
+
+(acceptpeerpushpaymentop)=
+### AcceptPeerPushPaymentOp
+```typescript
+/**
+ * Accept an incoming peer push payment.
+ */
+export type AcceptPeerPushPaymentOp = {
+  request: AcceptPeerPushPaymentRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptPeerPushPaymentRequest {
+  /**
+   * Transparent identifier of the incoming peer push payment.
+   */
+  peerPushPaymentIncomingId: string;
+}
+
+```
+
+(initiatepeerpullpaymentop)=
+### InitiatePeerPullPaymentOp
+```typescript
+/**
+ * Initiate an outgoing peer pull payment.
+ */
+export type InitiatePeerPullPaymentOp = {
+  request: InitiatePeerPullPaymentRequest;
+  response: InitiatePeerPullPaymentResponse;
+};
+
+```
+```typescript
+export interface InitiatePeerPullPaymentRequest {
+  /**
+   * FIXME: Make this optional?
+   */
+  exchangeBaseUrl: string;
+  amount: AmountString;
+  partialContractTerms: any;
+}
+
+```
+```typescript
+export interface InitiatePeerPullPaymentResponse {
+  /**
+   * Taler URI for the other party to make the payment
+   * that was requested.
+   */
+  talerUri: string;
+  transactionId: string;
+}
+
+```
+
+(checkpeerpullpaymentop)=
+### CheckPeerPullPaymentOp
+```typescript
+/**
+ * Prepare for an incoming peer pull payment.
+ */
+export type CheckPeerPullPaymentOp = {
+  request: CheckPeerPullPaymentRequest;
+  response: CheckPeerPullPaymentResponse;
+};
+
+```
+```typescript
+export interface CheckPeerPullPaymentRequest {
+  talerUri: string;
+}
+
+```
+```typescript
+export interface CheckPeerPullPaymentResponse {
+  contractTerms: any;
+  amount: AmountString;
+  peerPullPaymentIncomingId: string;
+}
+
+```
+
+(acceptpeerpullpaymentop)=
+### AcceptPeerPullPaymentOp
+```typescript
+/**
+ * Accept an incoming peer pull payment.
+ */
+export type AcceptPeerPullPaymentOp = {
+  request: AcceptPeerPullPaymentRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface AcceptPeerPullPaymentRequest {
+  /**
+   * Transparent identifier of the incoming peer pull payment.
+   */
+  peerPullPaymentIncomingId: string;
+}
+
+```
+
+(exportdbop)=
+### ExportDbOp
+```typescript
+// group: Database Management
+/**
+ * Exoport the wallet database's contents to JSON.
+ */
+export type ExportDbOp = {
+  request: {};
+  response: any;
+};
+
+```
+
+(cleardbop)=
+### ClearDbOp
+```typescript
+/**
+ * Dangerously clear the whole wallet database.
+ */
+export type ClearDbOp = {
+  request: {};
+  response: {};
+};
+
+```
+
+(recycleop)=
+### RecycleOp
+```typescript
+/**
+ * Export a backup, clear the database and re-import it.
+ */
+export type RecycleOp = {
+  request: {};
+  response: {};
+};
+
+```
+
+(runintegrationtestop)=
+### RunIntegrationTestOp
+```typescript
+// group: Testing and Debugging
+/**
+ * Run a simple integration test on a test deployment
+ * of the exchange and merchant.
+ */
+export type RunIntegrationTestOp = {
+  request: IntegrationTestArgs;
+  response: {};
+};
+
+```
+```typescript
+export interface IntegrationTestArgs {
+  exchangeBaseUrl: string;
+  bankBaseUrl: string;
+  bankAccessApiBaseUrl?: string;
+  merchantBaseUrl: string;
+  merchantAuthToken?: string;
+  amountToWithdraw: string;
+  amountToSpend: string;
+}
+
+```
+
+(withdrawtestbalanceop)=
+### WithdrawTestBalanceOp
+```typescript
+/**
+ * Make withdrawal on a test deployment of the exchange
+ * and merchant.
+ */
+export type WithdrawTestBalanceOp = {
+  request: WithdrawTestBalanceRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface WithdrawTestBalanceRequest {
+  amount: string;
+  bankBaseUrl: string;
+  /**
+   * Bank access API base URL.  Defaults to the bankBaseUrl.
+   */
+  bankAccessApiBaseUrl?: string;
+  exchangeBaseUrl: string;
+  forcedDenomSel?: ForcedDenomSel;
+}
+
+```
+
+(withdrawtestkudosop)=
+### WithdrawTestkudosOp
+```typescript
+/**
+ * Make a withdrawal of testkudos on test.taler.net.
+ */
+export type WithdrawTestkudosOp = {
+  op: WalletApiOperation.WithdrawTestkudos;
+  request: {};
+  response: {};
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.WithdrawTestkudos = "withdrawTestkudos"
+
+```
+
+(testpayop)=
+### TestPayOp
+```typescript
+/**
+ * Make a test payment using a test deployment of
+ * the exchange and merchant.
+ */
+export type TestPayOp = {
+  request: TestPayArgs;
+  response: TestPayResult;
+};
+
+```
+```typescript
+export interface TestPayArgs {
+  merchantBaseUrl: string;
+  merchantAuthToken?: string;
+  amount: string;
+  summary: string;
+  forcedCoinSel?: ForcedCoinSel;
+}
+
+```
+```typescript
+export interface TestPayResult {
+  payCoinSelection: PayCoinSelection;
+}
+
+```
+```typescript
+/**
+ * Result of selecting coins, contains the exchange, and selected
+ * coins with their denomination.
+ */
+export interface PayCoinSelection {
+  /**
+   * Amount requested by the merchant.
+   */
+  paymentAmount: AmountJson;
+  /**
+   * Public keys of the coins that were selected.
+   */
+  coinPubs: string[];
+  /**
+   * Amount that each coin contributes.
+   */
+  coinContributions: AmountJson[];
+  /**
+   * How much of the wire fees is the customer paying?
+   */
+  customerWireFees: AmountJson;
+  /**
+   * How much of the deposit fees is the customer paying?
+   */
+  customerDepositFees: AmountJson;
+}
+
+```
+```typescript
+/**
+ * Non-negative financial amount.  Fractional values are expressed as multiples
+ * of 1e-8.
+ */
+export interface AmountJson {
+  /**
+   * Value, must be an integer.
+   */
+  readonly value: number;
+  /**
+   * Fraction, must be an integer.  Represent 1/1e8 of a unit.
+   */
+  readonly fraction: number;
+  /**
+   * Currency of the amount.
+   */
+  readonly currency: string;
+}
+
+```
+
+(withdrawfakebankop)=
+### WithdrawFakebankOp
+```typescript
+/**
+ * Make a withdrawal from a fakebank, i.e.
+ * a bank where test users can be registered freely
+ * and testing APIs are available.
+ */
+export type WithdrawFakebankOp = {
+  op: WalletApiOperation.WithdrawFakebank;
+  request: WithdrawFakebankRequest;
+  response: {};
+};
+
+```
+```typescript
+// Enum value:
+// WalletApiOperation.WithdrawFakebank = "withdrawFakebank"
+
+```
+```typescript
+export interface WithdrawFakebankRequest {
+  amount: AmountString;
+  exchange: string;
+  bank: string;
+}
+
+```
+
+(getpendingtasksop)=
+### GetPendingTasksOp
+```typescript
+/**
+ * Get wallet-internal pending tasks.
+ */
+export type GetPendingTasksOp = {
+  request: {};
+  response: PendingTasksResponse;
+};
+
+```
+```typescript
+/**
+ * Response returned from the pending operations API.
+ */
+export interface PendingOperationsResponse {
+  /**
+   * List of pending operations.
+   */
+  pendingOperations: PendingTaskInfo[];
+}
+
+```
+```typescript
+/**
+ * Information about a pending operation.
+ */
+export type PendingTaskInfo = PendingTaskInfoCommon &
+  (
+    | PendingExchangeUpdateTask
+    | PendingExchangeCheckRefreshTask
+    | PendingPayTask
+    | PendingProposalDownloadTask
+    | PendingRefreshTask
+    | PendingRefundQueryTask
+    | PendingTipPickupTask
+    | PendingWithdrawTask
+    | PendingRecoupTask
+    | PendingDepositTask
+    | PendingBackupTask
+  );
+
+```
+```typescript
+/**
+ * Fields that are present in every pending operation.
+ */
+export interface PendingTaskInfoCommon {
+  /**
+   * Type of the pending operation.
+   */
+  type: PendingTaskType;
+  /**
+   * Unique identifier for the pending task.
+   */
+  id: string;
+  /**
+   * Set to true if the operation indicates that something is really in 
progress,
+   * as opposed to some regular scheduled operation that can be tried later.
+   */
+  givesLifeness: boolean;
+  /**
+   * Timestamp when the pending operation should be executed next.
+   */
+  timestampDue: AbsoluteTime;
+  /**
+   * Retry info.  Currently used to stop the wallet after any operation
+   * exceeds a number of retries.
+   */
+  retryInfo?: RetryInfo;
+}
+
+```
+```typescript
+export enum PendingTaskType {
+  ExchangeUpdate = "exchange-update",
+  ExchangeCheckRefresh = "exchange-check-refresh",
+  Pay = "pay",
+  ProposalDownload = "proposal-download",
+  Refresh = "refresh",
+  Recoup = "recoup",
+  RefundQuery = "refund-query",
+  TipPickup = "tip-pickup",
+  Withdraw = "withdraw",
+  Deposit = "deposit",
+  Backup = "backup",
+}
+
+```
+```typescript
+export interface RetryInfo {
+  firstTry: AbsoluteTime;
+  nextRetry: AbsoluteTime;
+  retryCounter: number;
+}
+
+```
+```typescript
+export interface RetryPolicy {
+  readonly backoffDelta: Duration;
+  readonly backoffBase: number;
+  readonly maxTimeout: Duration;
+}
+
+```
+```typescript
+/**
+ * The wallet is currently updating information about an exchange.
+ */
+export interface PendingExchangeUpdateTask {
+  type: PendingTaskType.ExchangeUpdate;
+  exchangeBaseUrl: string;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.ExchangeUpdate = "exchange-update"
+
+```
+```typescript
+/**
+ * The wallet should check whether coins from this exchange
+ * need to be auto-refreshed.
+ */
+export interface PendingExchangeCheckRefreshTask {
+  type: PendingTaskType.ExchangeCheckRefresh;
+  exchangeBaseUrl: string;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.ExchangeCheckRefresh = "exchange-check-refresh"
+
+```
+```typescript
+/**
+ * The wallet is signing coins and then sending them to
+ * the merchant.
+ */
+export interface PendingPayTask {
+  type: PendingTaskType.Pay;
+  proposalId: string;
+  isReplay: boolean;
+  retryInfo?: RetryInfo;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Pay = "pay"
+
+```
+```typescript
+/**
+ * Status of downloading signed contract terms from a merchant.
+ */
+export interface PendingProposalDownloadTask {
+  type: PendingTaskType.ProposalDownload;
+  merchantBaseUrl: string;
+  proposalTimestamp: TalerProtocolTimestamp;
+  proposalId: string;
+  orderId: string;
+  lastError?: TalerErrorDetail;
+  retryInfo?: RetryInfo;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.ProposalDownload = "proposal-download"
+
+```
+```typescript
+/**
+ * Status of an ongoing withdrawal operation.
+ */
+export interface PendingRefreshTask {
+  type: PendingTaskType.Refresh;
+  lastError?: TalerErrorDetail;
+  refreshGroupId: string;
+  finishedPerCoin: boolean[];
+  retryInfo?: RetryInfo;
+}
+
+```
+```typescript
+/**
+ * The wallet is querying the merchant about whether any refund
+ * permissions are available for a purchase.
+ */
+export interface PendingRefundQueryTask {
+  type: PendingTaskType.RefundQuery;
+  proposalId: string;
+  retryInfo?: RetryInfo;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.RefundQuery = "refund-query"
+
+```
+```typescript
+/**
+ * The wallet is picking up a tip that the user has accepted.
+ */
+export interface PendingTipPickupTask {
+  type: PendingTaskType.TipPickup;
+  tipId: string;
+  merchantBaseUrl: string;
+  merchantTipId: string;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.TipPickup = "tip-pickup"
+
+```
+```typescript
+/**
+ * Status of an ongoing withdrawal operation.
+ */
+export interface PendingWithdrawTask {
+  type: PendingTaskType.Withdraw;
+  lastError: TalerErrorDetail | undefined;
+  retryInfo?: RetryInfo;
+  withdrawalGroupId: string;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Withdraw = "withdraw"
+
+```
+```typescript
+export interface PendingRecoupTask {
+  type: PendingTaskType.Recoup;
+  recoupGroupId: string;
+  retryInfo?: RetryInfo;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Recoup = "recoup"
+
+```
+```typescript
+/**
+ * Status of an ongoing deposit operation.
+ */
+export interface PendingDepositTask {
+  type: PendingTaskType.Deposit;
+  lastError: TalerErrorDetail | undefined;
+  retryInfo: RetryInfo | undefined;
+  depositGroupId: string;
+}
+
+```
+```typescript
+export interface PendingBackupTask {
+  type: PendingTaskType.Backup;
+  backupProviderBaseUrl: string;
+  lastError: TalerErrorDetail | undefined;
+}
+
+```
+```typescript
+// Enum value:
+// PendingTaskType.Backup = "backup"
+
+```
+
+(dumpcoinsop)=
+### DumpCoinsOp
+```typescript
+/**
+ * Dump all coins of the wallet in a simple JSON format.
+ */
+export type DumpCoinsOp = {
+  request: {};
+  response: CoinDumpJson;
+};
+
+```
+```typescript
+/**
+ * Easy to process format for the public data of coins
+ * managed by the wallet.
+ */
+export interface CoinDumpJson {
+  coins: Array<{
+    /**
+     * The coin's denomination's public key.
+     */
+    denom_pub: DenominationPubKey;
+    /**
+     * 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;
+    /**
+     * Information about the age restriction
+     */
+    ageCommitmentProof: AgeCommitmentProof | undefined;
+  }>;
+}
+
+```
+```typescript
+interface Array<T> extends RelativeIndexable<T> {}
+
+```
+
+(setcoinsuspendedop)=
+### SetCoinSuspendedOp
+```typescript
+/**
+ * Set a coin as (un-)suspended.
+ * Suspended coins won't be used for payments.
+ */
+export type SetCoinSuspendedOp = {
+  request: SetCoinSuspendedRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface SetCoinSuspendedRequest {
+  coinPub: string;
+  suspended: boolean;
+}
+
+```
+
+(forcerefreshop)=
+### ForceRefreshOp
+```typescript
+/**
+ * Force a refresh on coins where it would not
+ * be necessary.
+ */
+export type ForceRefreshOp = {
+  request: ForceRefreshRequest;
+  response: {};
+};
+
+```
+```typescript
+export interface ForceRefreshRequest {
+  coinPubList: string[];
+}
+
+```
+
+## Common Declarations
+```typescript
+export interface OrderShortInfo {
+  /**
+   * Order ID, uniquely identifies the order within a merchant instance
+   */
+  orderId: string;
+  /**
+   * Hash of the contract terms.
+   */
+  contractTermsHash: string;
+  /**
+   * More information about the merchant
+   */
+  merchant: MerchantInfo;
+  /**
+   * Summary of the order, given by the merchant
+   */
+  summary: string;
+  /**
+   * Map from IETF BCP 47 language tags to localized summaries
+   */
+  summary_i18n?: InternationalizedString;
+  /**
+   * List of products that are part of the order
+   */
+  products: Product[] | undefined;
+  /**
+   * Time indicating when the order should be delivered.
+   * May be overwritten by individual products.
+   */
+  delivery_date?: TalerProtocolTimestamp;
+  /**
+   * Delivery location for (all!) products.
+   */
+  delivery_location?: Location;
+  /**
+   * URL of the fulfillment, given by the merchant
+   */
+  fulfillmentUrl?: string;
+  /**
+   * Plain text message that should be shown to the user
+   * when the payment is complete.
+   */
+  fulfillmentMessage?: string;
+  /**
+   * Translations of fulfillmentMessage.
+   */
+  fulfillmentMessage_i18n?: InternationalizedString;
+}
+```
+```typescript
+export interface MerchantInfo {
+  name: string;
+  jurisdiction?: Location;
+  address?: Location;
+  logo?: string;
+  website?: string;
+  email?: string;
+}
+```
+```typescript
+export interface Location {
+  country?: string;
+  country_subdivision?: string;
+  district?: string;
+  town?: string;
+  town_location?: string;
+  post_code?: string;
+  street?: string;
+  building_name?: string;
+  building_number?: string;
+  address_lines?: string[];
+}
+```
+```typescript
+export interface InternationalizedString {
+  [lang_tag: string]: string;
+}
+```
+```typescript
+export interface Product {
+  product_id?: string;
+  description: string;
+  description_i18n?: {
+    [lang_tag: string]: string;
+  };
+  quantity?: number;
+  unit?: string;
+  price?: AmountString;
+  image?: string;
+  taxes?: Tax[];
+  delivery_date?: TalerProtocolTimestamp;
+}
+```
+```typescript
+export interface Tax {
+  name: string;
+  tax: AmountString;
+}
+```
+```typescript
+export interface TalerProtocolTimestamp {
+  readonly t_s: number | "never";
+}
+```
+```typescript
+// Enum value:
+// PendingTaskType.Refresh = "refresh"
+```
+```typescript
+// Enum value:
+// PendingTaskType.Deposit = "deposit"
+```
+```typescript
+export interface ExchangeListItem {
+  exchangeBaseUrl: string;
+  currency: string;
+  paytoUris: string[];
+  tos: ExchangeTos;
+}
+```
+```typescript
+export interface ExchangeTos {
+  acceptedVersion?: string;
+  currentVersion?: string;
+  contentType?: string;
+  content?: string;
+}
+```
+```typescript
+export interface ForcedDenomSel {
+  denoms: {
+    value: AmountString;
+    count: number;
+  }[];
+}
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.InsufficientBalance = "insufficient-balance"
+```
+```typescript
+/**
+ * Contract terms from a merchant.
+ */
+export interface ContractTerms {
+  /**
+   * Hash of the merchant's wire details.
+   */
+  h_wire: string;
+  /**
+   * Hash of the merchant's wire details.
+   */
+  auto_refund?: TalerProtocolDuration;
+  /**
+   * Wire method the merchant wants to use.
+   */
+  wire_method: string;
+  /**
+   * Human-readable short summary of the contract.
+   */
+  summary: string;
+  summary_i18n?: InternationalizedString;
+  /**
+   * Nonce used to ensure freshness.
+   */
+  nonce: string;
+  /**
+   * Total amount payable.
+   */
+  amount: string;
+  /**
+   * Auditors accepted by the merchant.
+   */
+  auditors: AuditorHandle[];
+  /**
+   * Deadline to pay for the contract.
+   */
+  pay_deadline: TalerProtocolTimestamp;
+  /**
+   * Maximum deposit fee covered by the merchant.
+   */
+  max_fee: string;
+  /**
+   * Information about the merchant.
+   */
+  merchant: MerchantInfo;
+  /**
+   * Public key of the merchant.
+   */
+  merchant_pub: string;
+  /**
+   * Time indicating when the order should be delivered.
+   * May be overwritten by individual products.
+   */
+  delivery_date?: TalerProtocolTimestamp;
+  /**
+   * Delivery location for (all!) products.
+   */
+  delivery_location?: Location;
+  /**
+   * List of accepted exchanges.
+   */
+  exchanges: ExchangeHandle[];
+  /**
+   * Products that are sold in this contract.
+   */
+  products?: Product[];
+  /**
+   * Deadline for refunds.
+   */
+  refund_deadline: TalerProtocolTimestamp;
+  /**
+   * Deadline for the wire transfer.
+   */
+  wire_transfer_deadline: TalerProtocolTimestamp;
+  /**
+   * Time when the contract was generated by the merchant.
+   */
+  timestamp: TalerProtocolTimestamp;
+  /**
+   * Order id to uniquely identify the purchase within
+   * one merchant instance.
+   */
+  order_id: string;
+  /**
+   * Base URL of the merchant's backend.
+   */
+  merchant_base_url: string;
+  /**
+   * Fulfillment URL to view the product or
+   * delivery status.
+   */
+  fulfillment_url?: string;
+  /**
+   * URL meant to share the shopping cart.
+   */
+  public_reorder_url?: string;
+  /**
+   * Plain text fulfillment message in the merchant's default language.
+   */
+  fulfillment_message?: string;
+  /**
+   * Internationalized fulfillment messages.
+   */
+  fulfillment_message_i18n?: InternationalizedString;
+  /**
+   * Share of the wire fee that must be settled with one payment.
+   */
+  wire_fee_amortization?: number;
+  /**
+   * Maximum wire fee that the merchant agrees to pay for.
+   */
+  max_wire_fee?: string;
+  minimum_age?: number;
+  /**
+   * Extra data, interpreted by the mechant only.
+   */
+  extra?: any;
+}
+```
+```typescript
+export interface TalerProtocolDuration {
+  readonly d_us: number | "forever";
+}
+```
+```typescript
+export interface AuditorHandle {
+  /**
+   * Official name of the auditor.
+   */
+  name: string;
+  /**
+   * Master public signing key of the auditor.
+   */
+  auditor_pub: string;
+  /**
+   * Base URL of the auditor.
+   */
+  url: string;
+}
+```
+```typescript
+/**
+ * Information about an exchange as stored inside a
+ * merchant's contract terms.
+ */
+export interface ExchangeHandle {
+  /**
+   * Master public signing key of the exchange.
+   */
+  master_pub: string;
+  /**
+   * Base URL of the exchange.
+   */
+  url: string;
+}
+```
+```typescript
+/**
+ * Forced coin selection for deposits/payments.
+ */
+export interface ForcedCoinSel {
+  coins: {
+    value: AmountString;
+    contribution: AmountString;
+  }[];
+}
+```
+```typescript
+// Enum value:
+// ProviderPaymentType.Pending = "pending"
+```
+```typescript
+export interface TalerErrorDetail {
+  code: TalerErrorCode;
+  hint?: string;
+  [x: string]: unknown;
+}
+```
+```typescript
+export interface BackupRecovery {
+  walletRootPriv: string;
+  providers: {
+    url: string;
+  }[];
+}
+```
+```typescript
+export interface AbsoluteTime {
+  /**
+   * Timestamp in milliseconds.
+   */
+  readonly t_ms: number | "never";
+}
+```
+```typescript
+export interface Duration {
+  /**
+   * Duration in milliseconds.
+   */
+  readonly d_ms: number | "forever";
+}
+```

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]