gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-core] branch master updated (680d61df -> aaf950e2)


From: gnunet
Subject: [taler-wallet-core] branch master updated (680d61df -> aaf950e2)
Date: Mon, 30 Mar 2020 12:39:41 +0200

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

dold pushed a change to branch master
in repository wallet-core.

    from 680d61df node version check in build system
     new ad661a63 reformat
     new 15e18440 change applyRefund return signature
     new aaf950e2 re-format with prettier v2, fix HTML

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:
 package.json                               |    3 +-
 src/android/index.ts                       |    4 +-
 src/crypto/primitives/nacl-fast.ts         |   25 +-
 src/crypto/primitives/sha256.ts            |    5 +-
 src/crypto/talerCrypto-test.ts             |   37 +-
 src/crypto/workers/cryptoApi.ts            |    5 +-
 src/crypto/workers/cryptoImplementation.ts |    8 +-
 src/crypto/workers/cryptoWorker.ts         |    2 +-
 src/crypto/workers/nodeThreadWorker.ts     |    2 +-
 src/crypto/workers/synchronousWorker.ts    |    4 +-
 src/headless/NodeHttpLib.ts                |   14 +-
 src/headless/clk.ts                        |   26 +-
 src/headless/helpers.ts                    |    6 +-
 src/headless/integrationtest.ts            |   11 +-
 src/headless/merchant.ts                   |    7 +-
 src/i18n/strings.ts                        | 1433 +++++++---------------------
 src/operations/balance.ts                  |   33 +-
 src/operations/errors.ts                   |   21 +-
 src/operations/exchanges.ts                |   16 +-
 src/operations/history.ts                  |   53 +-
 src/operations/pay.ts                      |   34 +-
 src/operations/pending.ts                  |   18 +-
 src/operations/refresh.ts                  |   20 +-
 src/operations/refund.ts                   |   50 +-
 src/operations/reserves.ts                 |   37 +-
 src/operations/state.ts                    |    5 +-
 src/operations/tip.ts                      |   23 +-
 src/operations/versions.ts                 |    6 +-
 src/operations/withdraw.ts                 |   66 +-
 src/types/dbTypes.ts                       |    4 +-
 src/types/history.ts                       |    6 +-
 src/types/schemacore.ts                    |    4 +-
 src/types/types-test.ts                    |   16 +-
 src/types/walletTypes.ts                   |    3 +-
 src/util/RequestThrottler.ts               |   29 +-
 src/util/assertUnreachable.ts              |    2 +-
 src/util/asyncMemo.ts                      |    7 +-
 src/util/codec-test.ts                     |   12 +-
 src/util/codec.ts                          |   27 +-
 src/util/helpers-test.ts                   |   11 +-
 src/util/helpers.ts                        |   19 +-
 src/util/http.ts                           |    6 +-
 src/util/libtoolVersion-test.ts            |   30 +-
 src/util/libtoolVersion.ts                 |   18 +-
 src/util/payto-test.ts                     |    2 +-
 src/util/payto.ts                          |    7 +-
 src/util/promiseUtils.ts                   |    6 +-
 src/util/query.ts                          |   37 +-
 src/util/talerconfig.ts                    |    6 +-
 src/util/taleruri-test.ts                  |   50 +-
 src/util/time.ts                           |    6 +-
 src/util/timer.ts                          |    7 +-
 src/util/wire.ts                           |    2 -
 src/wallet-test.ts                         |   21 +-
 src/wallet.ts                              |    4 +-
 src/webex/background.html                  |   16 +-
 src/webex/chromeBadge.ts                   |   59 +-
 src/webex/compat.ts                        |   14 +-
 src/webex/i18n.tsx                         |   75 +-
 src/webex/messages.ts                      |    8 +-
 src/webex/notify.ts                        |   44 +-
 src/webex/pages/add-auditor.html           |   44 +-
 src/webex/pages/add-auditor.tsx            |    8 +-
 src/webex/pages/auditors.html              |   50 +-
 src/webex/pages/auditors.tsx               |   84 +-
 src/webex/pages/benchmark.html             |   16 +-
 src/webex/pages/benchmark.tsx              |   49 +-
 src/webex/pages/pay.html                   |  129 ++-
 src/webex/pages/pay.tsx                    |   17 +-
 src/webex/pages/payback.html               |   50 +-
 src/webex/pages/popup.css                  |  278 +++---
 src/webex/pages/popup.html                 |   22 +-
 src/webex/pages/popup.tsx                  |   80 +-
 src/webex/pages/redirect.html              |   16 +-
 src/webex/pages/redirect.js                |    2 +-
 src/webex/pages/refund.html                |   16 +-
 src/webex/pages/refund.tsx                 |    7 +-
 src/webex/pages/reset-required.html        |   43 +-
 src/webex/pages/reset-required.tsx         |   40 +-
 src/webex/pages/return-coins.html          |   18 +-
 src/webex/pages/return-coins.tsx           |  167 ++--
 src/webex/pages/show-db.html               |   10 +-
 src/webex/pages/show-db.ts                 |   41 +-
 src/webex/pages/tip.html                   |   33 +-
 src/webex/pages/tip.tsx                    |   10 +-
 src/webex/pages/welcome.html               |   33 +-
 src/webex/pages/welcome.tsx                |    2 +-
 src/webex/pages/withdraw.html              |   31 +-
 src/webex/pages/withdraw.tsx               |    2 +-
 src/webex/renderHtml.tsx                   |   14 +-
 src/webex/style/pure.css                   |  853 +++++++++--------
 src/webex/style/wallet.css                 |  196 ++--
 src/webex/wxApi.ts                         |    2 +-
 src/webex/wxBackend.ts                     |   12 +-
 94 files changed, 2176 insertions(+), 2731 deletions(-)

diff --git a/package.json b/package.json
index 387f1c46..a13dbded 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
     "taler-wallet-cli": "./bin/taler-wallet-cli"
   },
   "scripts": {
-    "build": "make tsc"
+    "build": "make tsc",
+    "pretty": "prettier --config .prettierrc --write src"
   },
   "files": [
     "AUTHORS",
diff --git a/src/android/index.ts b/src/android/index.ts
index 351d8924..6e43fe31 100644
--- a/src/android/index.ts
+++ b/src/android/index.ts
@@ -151,7 +151,7 @@ class AndroidWalletMessageHandler {
         };
         const w = await getDefaultNodeWallet(this.walletArgs);
         this.maybeWallet = w;
-        w.runRetryLoop().catch(e => {
+        w.runRetryLoop().catch((e) => {
           console.error("Error during wallet retry loop", e);
         });
         this.wp.resolve(w);
@@ -250,7 +250,7 @@ class AndroidWalletMessageHandler {
         this.maybeWallet = undefined;
         const w = await getDefaultNodeWallet(this.walletArgs);
         this.maybeWallet = w;
-        w.runRetryLoop().catch(e => {
+        w.runRetryLoop().catch((e) => {
           console.error("Error during wallet retry loop", e);
         });
         this.wp.resolve(w);
diff --git a/src/crypto/primitives/nacl-fast.ts 
b/src/crypto/primitives/nacl-fast.ts
index 66ab7816..14cf569d 100644
--- a/src/crypto/primitives/nacl-fast.ts
+++ b/src/crypto/primitives/nacl-fast.ts
@@ -5,14 +5,14 @@
 // Implementation derived from TweetNaCl version 20140427.
 // See for details: http://tweetnacl.cr.yp.to/
 
-const gf = function(init: number[] = []) {
+const gf = function (init: number[] = []) {
   const r = new Float64Array(16);
   if (init) for (let i = 0; i < init.length; i++) r[i] = init[i];
   return r;
 };
 
 //  Pluggable, initialized in high-level API below.
-let randombytes = function(x: Uint8Array, n: number): void {
+let randombytes = function (x: Uint8Array, n: number): void {
   throw new Error("no PRNG");
 };
 
@@ -2373,13 +2373,11 @@ function crypto_hash(out: Uint8Array, m: Uint8Array, n: 
number) {
   ts64(x, n - 8, (b / 0x20000000) | 0, b << 3);
   crypto_hashblocks_hl(hh, hl, x, n);
 
-  for (let i = 0; i < 8; i++)
-    ts64(out, 8 * i, hh[i], hl[i]);
+  for (let i = 0; i < 8; i++) ts64(out, 8 * i, hh[i], hl[i]);
 
   return 0;
 }
 
-
 /**
  * Incremental version of crypto_hash.
  */
@@ -2400,7 +2398,7 @@ export class HashState {
     this.hh[5] = 0x9b05688c;
     this.hh[6] = 0x1f83d9ab;
     this.hh[7] = 0x5be0cd19;
-  
+
     this.hl[0] = 0xf3bcc908;
     this.hl[1] = 0x84caa73b;
     this.hl[2] = 0xfe94f82b;
@@ -2416,7 +2414,7 @@ export class HashState {
     let i = 0;
     while (i < data.length) {
       const r = 128 - this.p;
-      if (r > (data.length - i)) {
+      if (r > data.length - i) {
         for (let j = 0; i + j < data.length; j++) {
           this.next[this.p + j] = data[i + j];
         }
@@ -2441,14 +2439,13 @@ export class HashState {
     let b = this.total;
     for (let i = 0; i < n; i++) x[i] = this.next[i];
     x[n] = 128;
-  
+
     n = 256 - 128 * (n < 112 ? 1 : 0);
     x[n - 9] = 0;
     ts64(x, n - 8, (b / 0x20000000) | 0, b << 3);
     crypto_hashblocks_hl(this.hh, this.hl, x, n);
-  
-    for (let i = 0; i < 8; i++)
-      ts64(out, 8 * i, this.hh[i], this.hl[i]);
+
+    for (let i = 0; i < 8; i++) ts64(out, 8 * i, this.hh[i], this.hl[i]);
     return out;
   }
 }
@@ -3078,7 +3075,7 @@ export function sign_ed25519_pk_to_curve25519(
   return x25519_pk;
 }
 
-(function() {
+(function () {
   // Initialize PRNG if environment provides CSPRNG.
   // If not, methods calling randombytes will throw.
   const crypto =
@@ -3086,7 +3083,7 @@ export function sign_ed25519_pk_to_curve25519(
   if (crypto && crypto.getRandomValues) {
     // Browsers.
     var QUOTA = 65536;
-    setPRNG(function(x: Uint8Array, n: number) {
+    setPRNG(function (x: Uint8Array, n: number) {
       var i,
         v = new Uint8Array(n);
       for (i = 0; i < n; i += QUOTA) {
@@ -3099,7 +3096,7 @@ export function sign_ed25519_pk_to_curve25519(
     // Node.js.
     const cr = require("crypto");
     if (cr && cr.randomBytes) {
-      setPRNG(function(x: Uint8Array, n: number) {
+      setPRNG(function (x: Uint8Array, n: number) {
         var i,
           v = cr.randomBytes(n);
         for (i = 0; i < n; i++) x[i] = v[i];
diff --git a/src/crypto/primitives/sha256.ts b/src/crypto/primitives/sha256.ts
index f4f6690c..c0f245bb 100644
--- a/src/crypto/primitives/sha256.ts
+++ b/src/crypto/primitives/sha256.ts
@@ -339,10 +339,7 @@ export class HMAC {
   constructor(key: Uint8Array) {
     const pad = new Uint8Array(this.blockSize);
     if (key.length > this.blockSize) {
-      new HashSha256()
-        .update(key)
-        .finish(pad)
-        .clean();
+      new HashSha256().update(key).finish(pad).clean();
     } else {
       for (let i = 0; i < key.length; i++) {
         pad[i] = key[i];
diff --git a/src/crypto/talerCrypto-test.ts b/src/crypto/talerCrypto-test.ts
index 59949dbd..85c22d60 100644
--- a/src/crypto/talerCrypto-test.ts
+++ b/src/crypto/talerCrypto-test.ts
@@ -47,7 +47,7 @@ function bytesToHex(bytes: Uint8Array): string {
   return hex.join("");
 }
 
-test("encoding", t => {
+test("encoding", (t) => {
   const utf8decoder = new TextDecoder("utf-8");
   const utf8encoder = new TextEncoder();
   const s = "Hello, World";
@@ -57,7 +57,7 @@ test("encoding", t => {
   t.deepEqual(s, sOut);
 });
 
-test("taler-exchange-tvg hash code", t => {
+test("taler-exchange-tvg hash code", (t) => {
   const input = "91JPRV3F5GG4EKJN41A62V35E8";
   const output =
     
"CW96WR74JS8T53EC8GKSGD49QKH4ZNFTZXDAWMMV5GJ1E4BM6B8GPN5NVHDJ8ZVXNCW7Q4WBYCV61HCA3PZC2YJD850DT29RHHN7ESR";
@@ -67,7 +67,7 @@ test("taler-exchange-tvg hash code", t => {
   t.deepEqual(myOutput, output);
 });
 
-test("taler-exchange-tvg ecdhe key", t => {
+test("taler-exchange-tvg ecdhe key", (t) => {
   const priv1 = "X4T4N0M8PVQXQEBW2BA7049KFSM7J437NSDFC6GDNM3N5J9367A0";
   const pub1 = "M997P494MS6A95G1P0QYWW2VNPSHSX5Q6JBY5B9YMNYWP0B50X3G";
   const priv2 = "14A0MMQ64DCV8HE0CS3WBC9DHFJAHXRGV7NEARFJPC5R5E1697E0";
@@ -83,7 +83,7 @@ test("taler-exchange-tvg ecdhe key", t => {
   t.deepEqual(encodeCrock(mySkm), skm);
 });
 
-test("taler-exchange-tvg eddsa key", t => {
+test("taler-exchange-tvg eddsa key", (t) => {
   const priv = "9TM70AKDTS57AWY9JK2J4TMBTMW6K62WHHGZWYDG0VM5ABPZKD40";
   const pub = "8GSJZ649T2PXMKZC01Y4ANNBE7MF14QVK9SQEC4E46ZHKCVG8AS0";
 
@@ -91,7 +91,7 @@ test("taler-exchange-tvg eddsa key", t => {
   t.deepEqual(encodeCrock(pair.publicKey), pub);
 });
 
-test("taler-exchange-tvg kdf", t => {
+test("taler-exchange-tvg kdf", (t) => {
   const salt = "94KPT83PCNS7J83KC5P78Y8";
   const ikm = "94KPT83MD1JJ0WV5CDS6AX10D5Q70XBM41NPAY90DNGQ8SBJD5GPR";
   const ctx =
@@ -110,7 +110,7 @@ test("taler-exchange-tvg kdf", t => {
   t.deepEqual(encodeCrock(myOut), out);
 });
 
-test("taler-exchange-tvg eddsa_ecdh", t => {
+test("taler-exchange-tvg eddsa_ecdh", (t) => {
   const priv_ecdhe = "4AFZWMSGTVCHZPQ0R81NWXDCK4N58G7SDBBE5KXE080Y50370JJG";
   const pub_ecdhe = "FXFN5GPAFTKVPWJDPVXQ87167S8T82T5ZV8CDYC0NH2AE14X0M30";
   const priv_eddsa = "1KG54M8T3X8BSFSZXCR3SQBSR7Y9P53NX61M864S7TEVMJ2XVPF0";
@@ -137,7 +137,7 @@ test("taler-exchange-tvg eddsa_ecdh", t => {
   t.deepEqual(encodeCrock(myKm2), key_material);
 });
 
-test("taler-exchange-tvg blind signing", t => {
+test("taler-exchange-tvg blind signing", (t) => {
   const messageHash =
     
"TT1R28D79EJEJ9PC35AQS35CCG85DSXSZ508MV2HS2FN4ME6AHESZX5WP485R8A75KG53FN6F1YNW95008663TKAPWB81420VG17BY8";
   const rsaPublicKey =
@@ -149,18 +149,29 @@ test("taler-exchange-tvg blind signing", t => {
     
"5VW0MS5PRBA3W8TPATSTDA2YRFQM1Z7F2DWKQ8ATMZYYY768Q3STZ3HGNVYQ6JB5NKP80G5HGE58616FPA70SX9PTW7EN8EJ23E26FASBWZBP8E2RWQQ5E0F72B2PWRP5ZCA2J3AB3F6P86XK4PZYT64RF94MDGHY0GSDSSBH5YSFB3VM0KVXA52H2Y2G9S85AVCSD3BTMHQRF5BJJ8JE00T4GK70PSTVCGMRKRNA7DGW7GD2F35W55AXF7R2YJC8PAGNSJYWKC3PC75A5N8H69K299AK5PM3CDDHNS4BMRNGF7K49CR4ZBFRXDAWMB3X6T05Q4NKSG0F1KP5JA0XBMF2YJK7KEPRD1EWCHJE44T9YXBTK4W9CV77X7Z9P407ZC6YB3M2ARANZXHJKSM3XC33M";
   const sig =
     
"PFT6WQJGCM9DE6264DJS6RMG4XDMCDBJKZGSXAF3BEXWZ979Q13NETKK05S1YV91CX3Y034FSS86SSHZTTE8097RRESQP52EKFGTWJXKHZJEQJ49YHMBNQDHW4CFBJECNJSV2PMHWVGXV7HB84R6P0S3ES559HWQX01Q9MYDEGRNHKW87QR2BNSG951D5NQGAKEJ2SSJBE18S6WYAC24FAP8TT8ANECH5371J0DJY0YR0VWAFWVJDV8XQSFXWMJ80N3A80SPSHPYJY3WZZXW63WQ46WHYY56ZSNE5G1RZ5CR0XYV2ECKPM8R0FS58EV16WTRAM1ABBFVNAT3CAEFAZCWP3XHPVBQY5NZVTD5QS2Q8SKJQ2XB30E11CWDN9KTV5CBK4DN72EVG73F3W3BATAKHG";
-  
-  const myBm = rsaBlind(decodeCrock(messageHash), decodeCrock(bks), 
decodeCrock(rsaPublicKey));
+
+  const myBm = rsaBlind(
+    decodeCrock(messageHash),
+    decodeCrock(bks),
+    decodeCrock(rsaPublicKey),
+  );
   t.deepEqual(encodeCrock(myBm), bm);
 
-  const mySig = rsaUnblind(decodeCrock(bs), decodeCrock(rsaPublicKey), 
decodeCrock(bks));
+  const mySig = rsaUnblind(
+    decodeCrock(bs),
+    decodeCrock(rsaPublicKey),
+    decodeCrock(bks),
+  );
   t.deepEqual(encodeCrock(mySig), sig);
 
-  const v = rsaVerify(decodeCrock(messageHash), decodeCrock(sig), 
decodeCrock(rsaPublicKey));
+  const v = rsaVerify(
+    decodeCrock(messageHash),
+    decodeCrock(sig),
+    decodeCrock(rsaPublicKey),
+  );
   t.true(v);
 });
 
-
 test("incremental hashing #1", (t) => {
   const n = 1024;
   const d = nacl.randomBytes(n);
@@ -198,4 +209,4 @@ test("incremental hashing #2", (t) => {
 
   t.deepEqual(encodeCrock(h1), encodeCrock(h3));
   t.deepEqual(encodeCrock(h1), encodeCrock(h2));
-});
\ No newline at end of file
+});
diff --git a/src/crypto/workers/cryptoApi.ts b/src/crypto/workers/cryptoApi.ts
index 0b7c2e23..ab97e127 100644
--- a/src/crypto/workers/cryptoApi.ts
+++ b/src/crypto/workers/cryptoApi.ts
@@ -281,8 +281,9 @@ export class CryptoApi {
 
     CryptoApi.enableTracing &&
       console.log(
-        `rpc ${currentWorkItem.operation} took ${timer.performanceNow() -
-          currentWorkItem.startTime}ms`,
+        `rpc ${currentWorkItem.operation} took ${
+          timer.performanceNow() - currentWorkItem.startTime
+        }ms`,
       );
     currentWorkItem.resolve(msg.data.result);
   }
diff --git a/src/crypto/workers/cryptoImplementation.ts 
b/src/crypto/workers/cryptoImplementation.ts
index 55caecb4..156c72ba 100644
--- a/src/crypto/workers/cryptoImplementation.ts
+++ b/src/crypto/workers/cryptoImplementation.ts
@@ -313,9 +313,7 @@ export class CryptoImplementation {
       stringToBytes(paytoUri + "\0"),
       new Uint8Array(0),
     );
-    const p = buildSigPS(SignaturePurpose.MASTER_WIRE_DETAILS)
-      .put(h)
-      .build();
+    const p = buildSigPS(SignaturePurpose.MASTER_WIRE_DETAILS).put(h).build();
     return eddsaVerify(p, decodeCrock(sig), decodeCrock(masterPub));
   }
 
@@ -467,8 +465,8 @@ export class CryptoImplementation {
       exchangeBaseUrl,
       hash: encodeCrock(sessionHash),
       meltCoinPub: meltCoin.coinPub,
-      newDenomHashes: newCoinDenoms.map(d => d.denomPubHash),
-      newDenoms: newCoinDenoms.map(d => d.denomPub),
+      newDenomHashes: newCoinDenoms.map((d) => d.denomPubHash),
+      newDenoms: newCoinDenoms.map((d) => d.denomPub),
       norevealIndex: undefined,
       planchetsForGammas: planchetsForGammas,
       transferPrivs,
diff --git a/src/crypto/workers/cryptoWorker.ts 
b/src/crypto/workers/cryptoWorker.ts
index d4449f4a..9f3ee6f5 100644
--- a/src/crypto/workers/cryptoWorker.ts
+++ b/src/crypto/workers/cryptoWorker.ts
@@ -5,4 +5,4 @@ export interface CryptoWorker {
 
   onmessage: ((m: any) => void) | undefined;
   onerror: ((m: any) => void) | undefined;
-}
\ No newline at end of file
+}
diff --git a/src/crypto/workers/nodeThreadWorker.ts 
b/src/crypto/workers/nodeThreadWorker.ts
index e40f3c95..1247900f 100644
--- a/src/crypto/workers/nodeThreadWorker.ts
+++ b/src/crypto/workers/nodeThreadWorker.ts
@@ -96,7 +96,7 @@ export function handleWorkerMessage(msg: any) {
     }
   };
 
-  handleRequest().catch(e => {
+  handleRequest().catch((e) => {
     console.error("error in node worker", e);
   });
 }
diff --git a/src/crypto/workers/synchronousWorker.ts 
b/src/crypto/workers/synchronousWorker.ts
index 12eecde9..b453468d 100644
--- a/src/crypto/workers/synchronousWorker.ts
+++ b/src/crypto/workers/synchronousWorker.ts
@@ -37,12 +37,10 @@ export class SynchronousCryptoWorkerFactory implements 
CryptoWorkerFactory {
   }
 }
 
-
 /**
  * Worker implementation that uses node subprocesses.
  */
 export class SynchronousCryptoWorker {
-
   /**
    * Function to be called when we receive a message from the worker thread.
    */
@@ -121,7 +119,7 @@ export class SynchronousCryptoWorker {
       return;
     }
 
-    this.handleRequest(operation, id, args).catch(e => {
+    this.handleRequest(operation, id, args).catch((e) => {
       console.error("Error while handling crypto request:", e);
     });
   }
diff --git a/src/headless/NodeHttpLib.ts b/src/headless/NodeHttpLib.ts
index 5cbb40cc..735d6b3c 100644
--- a/src/headless/NodeHttpLib.ts
+++ b/src/headless/NodeHttpLib.ts
@@ -16,7 +16,12 @@
  SPDX-License-Identifier: AGPL3.0-or-later
 */
 
-import { Headers, HttpRequestLibrary, HttpRequestOptions, HttpResponse } from 
"../util/http";
+import {
+  Headers,
+  HttpRequestLibrary,
+  HttpRequestOptions,
+  HttpResponse,
+} from "../util/http";
 import { RequestThrottler } from "../util/RequestThrottler";
 import Axios, { AxiosResponse } from "axios";
 
@@ -85,10 +90,7 @@ export class NodeHttpLib implements HttpRequestLibrary {
     };
   }
 
-  async get(
-    url: string,
-    opt?: HttpRequestOptions,
-  ): Promise<HttpResponse> {
+  async get(url: string, opt?: HttpRequestOptions): Promise<HttpResponse> {
     return this.req("get", url, undefined, opt);
   }
 
@@ -99,4 +101,4 @@ export class NodeHttpLib implements HttpRequestLibrary {
   ): Promise<HttpResponse> {
     return this.req("post", url, body, opt);
   }
-}
\ No newline at end of file
+}
diff --git a/src/headless/clk.ts b/src/headless/clk.ts
index ab6526f9..7d7417ea 100644
--- a/src/headless/clk.ts
+++ b/src/headless/clk.ts
@@ -340,7 +340,9 @@ export class CommandGroup<GN extends keyof any, TG> {
           const r = splitOpt(opt);
           const d = this.longOptions[r.key];
           if (!d) {
-            console.error(`error: unknown option '--${r.key}' for 
${currentName}`);
+            console.error(
+              `error: unknown option '--${r.key}' for ${currentName}`,
+            );
             process.exit(-1);
             throw Error("not reached");
           }
@@ -359,7 +361,7 @@ export class CommandGroup<GN extends keyof any, TG> {
                 process.exit(-1);
                 throw Error("not reached");
               }
-              myArgs[d.name] = unparsedArgs[i+1];
+              myArgs[d.name] = unparsedArgs[i + 1];
               i++;
             } else {
               myArgs[d.name] = r.value;
@@ -427,14 +429,15 @@ export class CommandGroup<GN extends keyof any, TG> {
       throw Error("not reached");
     }
 
-
     for (let i = posArgIndex; i < this.arguments.length; i++) {
       const d = this.arguments[i];
       if (d.required) {
         if (d.args.default !== undefined) {
           myArgs[d.name] = d.args.default;
         } else {
-          console.error(`error: missing positional argument '${d.name}' for 
${currentName}`);
+          console.error(
+            `error: missing positional argument '${d.name}' for 
${currentName}`,
+          );
           process.exit(-1);
           throw Error("not reached");
         }
@@ -447,7 +450,7 @@ export class CommandGroup<GN extends keyof any, TG> {
           if (option.args.default !== undefined) {
             myArgs[option.name] = option.args.default;
           } else {
-            const name = option.flagspec.join(",")
+            const name = option.flagspec.join(",");
             console.error(`error: missing option '${name}'`);
             process.exit(-1);
             throw Error("not reached");
@@ -584,10 +587,11 @@ export class Program<PN extends keyof any, T> {
   }
 }
 
-export type GetArgType<T> =
-  T extends Program<any, infer AT> ? AT :
-  T extends CommandGroup<any, infer AT> ? AT :
-  any;
+export type GetArgType<T> = T extends Program<any, infer AT>
+  ? AT
+  : T extends CommandGroup<any, infer AT>
+  ? AT
+  : any;
 
 export function program<PN extends keyof any>(
   argKey: PN,
@@ -596,15 +600,13 @@ export function program<PN extends keyof any>(
   return new Program(argKey as string, args);
 }
 
-
-
 export function prompt(question: string): Promise<string> {
   const stdinReadline = readline.createInterface({
     input: process.stdin,
     output: process.stdout,
   });
   return new Promise<string>((resolve, reject) => {
-    stdinReadline.question(question, res => {
+    stdinReadline.question(question, (res) => {
       resolve(res);
       stdinReadline.close();
     });
diff --git a/src/headless/helpers.ts b/src/headless/helpers.ts
index dc56a987..fb3d800d 100644
--- a/src/headless/helpers.ts
+++ b/src/headless/helpers.ts
@@ -120,7 +120,9 @@ export async function getDefaultNodeWallet(
     require("worker_threads");
     workerFactory = new NodeThreadCryptoWorkerFactory();
   } catch (e) {
-    console.log("worker threads not available, falling back to synchronous 
workers");
+    console.log(
+      "worker threads not available, falling back to synchronous workers",
+    );
     workerFactory = new SynchronousCryptoWorkerFactory();
   }
 
@@ -161,7 +163,7 @@ export async function withdrawTestBalance(
     myWallet.runRetryLoop().catch((x) => {
       reject(x);
     });
-    myWallet.addNotificationListener(n => {
+    myWallet.addNotificationListener((n) => {
       if (
         n.type === NotificationType.ReserveDepleted &&
         n.reservePub === reservePub
diff --git a/src/headless/integrationtest.ts b/src/headless/integrationtest.ts
index 0c015207..191e48ff 100644
--- a/src/headless/integrationtest.ts
+++ b/src/headless/integrationtest.ts
@@ -99,7 +99,7 @@ export async function runIntegrationTest(args: 
IntegrationTestArgs) {
 
   const myWallet = await getDefaultNodeWallet({ httpLib: myHttpLib });
 
-  myWallet.runRetryLoop().catch(e => {
+  myWallet.runRetryLoop().catch((e) => {
     console.error("exception during retry loop:", e);
   });
 
@@ -233,7 +233,7 @@ export async function runIntegrationTestBasic(cfg: 
Configuration) {
     persistentStoragePath: walletDbPath,
   });
 
-  myWallet.runRetryLoop().catch(e => {
+  myWallet.runRetryLoop().catch((e) => {
     console.error("exception during retry loop:", e);
   });
 
@@ -255,7 +255,12 @@ export async function runIntegrationTestBasic(cfg: 
Configuration) {
     merchantApiKey,
   );
 
-  await makePayment(myWallet, myMerchant, Amounts.toString(parsedSpendAmount), 
"hello world");
+  await makePayment(
+    myWallet,
+    myMerchant,
+    Amounts.toString(parsedSpendAmount),
+    "hello world",
+  );
 
   // Wait until the refresh is done
   await myWallet.runUntilDone();
diff --git a/src/headless/merchant.ts b/src/headless/merchant.ts
index b30e00d8..27e7e3f2 100644
--- a/src/headless/merchant.ts
+++ b/src/headless/merchant.ts
@@ -23,7 +23,10 @@
  * Imports.
  */
 import axios from "axios";
-import { CheckPaymentResponse, codecForCheckPaymentResponse } from 
"../types/talerTypes";
+import {
+  CheckPaymentResponse,
+  codecForCheckPaymentResponse,
+} from "../types/talerTypes";
 
 /**
  * Connection to the *internal* merchant backend.
@@ -133,7 +136,7 @@ export class MerchantBackendConnection {
     if (resp.status != 200) {
       throw Error("failed to check payment");
     }
-    
+
     return codecForCheckPaymentResponse().decode(resp.data);
   }
 }
diff --git a/src/i18n/strings.ts b/src/i18n/strings.ts
index e77fc71a..289dcbed 100644
--- a/src/i18n/strings.ts
+++ b/src/i18n/strings.ts
@@ -14,1144 +14,391 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-export let strings: {[s: string]: any} = {};
-strings['de'] = {
-  "domain": "messages",
-  "locale_data": {
-    "messages": {
+export let strings: { [s: string]: any } = {};
+strings["de"] = {
+  domain: "messages",
+  locale_data: {
+    messages: {
       "": {
-        "domain": "messages",
-        "plural_forms": "nplurals=2; plural=(n != 1);",
-        "lang": ""
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
       },
-      "Invalid Wire": [
-        null,
-        ""
-      ],
-      "Invalid Test Wire Detail": [
-        null,
-        ""
-      ],
-      "Test Wire Acct #%1$s on %2$s": [
-        null,
-        ""
-      ],
-      "Unknown Wire Detail": [
-        null,
-        ""
-      ],
-      "Operation": [
-        null,
-        ""
-      ],
-      "time (ms/op)": [
-        null,
-        ""
-      ],
-      "The merchant %1$s offers you to purchase:": [
-        null,
-        "Der Händler %1$s möchte einen Vertrag über %2$s mit Ihnen 
abschließen."
-      ],
-      "The total price is %1$s (plus %2$s fees).": [
-        null,
-        ""
-      ],
-      "The total price is %1$s.": [
-        null,
-        ""
-      ],
-      "Retry": [
-        null,
-        ""
-      ],
-      "Confirm payment": [
-        null,
-        "Bezahlung bestätigen"
-      ],
-      "Balance": [
-        null,
-        "Saldo"
-      ],
-      "History": [
-        null,
-        "Verlauf"
-      ],
-      "Debug": [
-        null,
-        "Debug"
-      ],
-      "You have no balance to show. Need some %1$s getting started?": [
-        null,
-        "Sie haben kein Digitalgeld. Wollen Sie %1$s? abheben?"
-      ],
-      "%1$s incoming": [
-        null,
-        ""
-      ],
-      "%1$s being spent": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve balance information.": [
-        null,
-        ""
-      ],
-      "Invalid ": [
-        null,
-        ""
-      ],
-      "Fees ": [
-        null,
-        ""
-      ],
-      "Refresh sessions has completed": [
-        null,
-        ""
-      ],
-      "Order Refused": [
-        null,
-        ""
-      ],
-      "Order redirected": [
-        null,
-        ""
-      ],
-      "Payment aborted": [
-        null,
-        ""
-      ],
-      "Payment Sent": [
-        null,
-        ""
-      ],
-      "Order accepted": [
-        null,
-        ""
-      ],
-      "Reserve balance updated": [
-        null,
-        ""
-      ],
-      "Payment refund": [
-        null,
-        ""
-      ],
-      "Withdrawn": [
-        null,
-        "Abheben bei %1$s"
-      ],
-      "Tip Accepted": [
-        null,
-        ""
-      ],
-      "Tip Declined": [
-        null,
-        ""
-      ],
-      "%1$s": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve event history": [
-        null,
-        ""
-      ],
-      "Your wallet has no events recorded.": [
-        null,
-        "Ihre Geldbörse verzeichnet keine Vorkommnisse."
-      ],
-      "Wire to bank account": [
-        null,
-        ""
-      ],
-      "Confirm": [
-        null,
-        "Bezahlung bestätigen"
-      ],
-      "Cancel": [
-        null,
-        "Saldo"
-      ],
-      "Fatal error: \"%1$s\".": [
-        null,
-        ""
-      ],
-      "Could not get details for withdraw operation:": [
-        null,
-        ""
-      ],
-      "Chose different exchange provider": [
-        null,
-        ""
-      ],
-      "Please select an exchange.  You can review the details before after 
your selection.": [
-        null,
-        ""
-      ],
-      "Select %1$s": [
-        null,
-        ""
-      ],
-      "Select custom exchange": [
-        null,
-        ""
-      ],
-      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
-        null,
-        ""
-      ],
-      "Accept fees and withdraw": [
-        null,
-        ""
-      ],
-      "Cancel withdraw operation": [
-        null,
-        ""
-      ],
-      "Withdrawal fees:": [
-        null,
-        "Abheben bei"
-      ],
-      "Rounding loss:": [
-        null,
-        ""
-      ],
-      "Earliest expiration (for deposit): %1$s": [
-        null,
-        ""
-      ],
-      "# Coins": [
-        null,
-        ""
-      ],
-      "Value": [
-        null,
-        ""
-      ],
-      "Withdraw Fee": [
-        null,
-        "Abheben bei %1$s"
-      ],
-      "Refresh Fee": [
-        null,
-        ""
-      ],
-      "Deposit Fee": [
-        null,
-        ""
-      ]
-    }
-  }
-};
-strings['en-US'] = {
-  "domain": "messages",
-  "locale_data": {
-    "messages": {
-      "": {
-        "domain": "messages",
-        "plural_forms": "nplurals=2; plural=(n != 1);",
-        "lang": ""
-      },
-      "Invalid Wire": [
-        null,
-        ""
-      ],
-      "Invalid Test Wire Detail": [
-        null,
-        ""
-      ],
-      "Test Wire Acct #%1$s on %2$s": [
-        null,
-        ""
-      ],
-      "Unknown Wire Detail": [
-        null,
-        ""
-      ],
-      "Operation": [
-        null,
-        ""
-      ],
-      "time (ms/op)": [
-        null,
-        ""
-      ],
-      "The merchant %1$s offers you to purchase:": [
-        null,
-        ""
-      ],
-      "The total price is %1$s (plus %2$s fees).": [
-        null,
-        ""
-      ],
-      "The total price is %1$s.": [
-        null,
-        ""
-      ],
-      "Retry": [
-        null,
-        ""
-      ],
-      "Confirm payment": [
-        null,
-        ""
-      ],
-      "Balance": [
-        null,
-        ""
-      ],
-      "History": [
-        null,
-        ""
-      ],
-      "Debug": [
-        null,
-        ""
-      ],
-      "You have no balance to show. Need some %1$s getting started?": [
-        null,
-        ""
-      ],
-      "%1$s incoming": [
-        null,
-        ""
-      ],
-      "%1$s being spent": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve balance information.": [
-        null,
-        ""
-      ],
-      "Invalid ": [
-        null,
-        ""
-      ],
-      "Fees ": [
-        null,
-        ""
-      ],
-      "Refresh sessions has completed": [
-        null,
-        ""
-      ],
-      "Order Refused": [
-        null,
-        ""
-      ],
-      "Order redirected": [
-        null,
-        ""
-      ],
-      "Payment aborted": [
-        null,
-        ""
-      ],
-      "Payment Sent": [
-        null,
-        ""
-      ],
-      "Order accepted": [
-        null,
-        ""
-      ],
-      "Reserve balance updated": [
-        null,
-        ""
-      ],
-      "Payment refund": [
-        null,
-        ""
-      ],
-      "Withdrawn": [
-        null,
-        ""
-      ],
-      "Tip Accepted": [
-        null,
-        ""
-      ],
-      "Tip Declined": [
-        null,
-        ""
-      ],
-      "%1$s": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve event history": [
-        null,
-        ""
-      ],
-      "Your wallet has no events recorded.": [
-        null,
-        ""
-      ],
-      "Wire to bank account": [
-        null,
-        ""
-      ],
-      "Confirm": [
-        null,
-        ""
-      ],
-      "Cancel": [
-        null,
-        ""
-      ],
-      "Fatal error: \"%1$s\".": [
-        null,
-        ""
-      ],
-      "Could not get details for withdraw operation:": [
-        null,
-        ""
-      ],
-      "Chose different exchange provider": [
-        null,
-        ""
-      ],
-      "Please select an exchange.  You can review the details before after 
your selection.": [
-        null,
-        ""
-      ],
-      "Select %1$s": [
-        null,
-        ""
-      ],
-      "Select custom exchange": [
-        null,
-        ""
-      ],
-      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
-        null,
-        ""
-      ],
-      "Accept fees and withdraw": [
-        null,
-        ""
-      ],
-      "Cancel withdraw operation": [
-        null,
-        ""
-      ],
-      "Withdrawal fees:": [
-        null,
-        ""
-      ],
-      "Rounding loss:": [
-        null,
-        ""
-      ],
-      "Earliest expiration (for deposit): %1$s": [
-        null,
-        ""
-      ],
-      "# Coins": [
-        null,
-        ""
-      ],
-      "Value": [
-        null,
-        ""
-      ],
-      "Withdraw Fee": [
-        null,
-        ""
-      ],
-      "Refresh Fee": [
-        null,
-        ""
-      ],
-      "Deposit Fee": [
-        null,
-        ""
-      ]
-    }
-  }
-};
-strings['fr'] = {
-  "domain": "messages",
-  "locale_data": {
-    "messages": {
-      "": {
-        "domain": "messages",
-        "plural_forms": "nplurals=2; plural=(n != 1);",
-        "lang": ""
-      },
-      "Invalid Wire": [
-        null,
-        ""
-      ],
-      "Invalid Test Wire Detail": [
-        null,
-        ""
-      ],
-      "Test Wire Acct #%1$s on %2$s": [
-        null,
-        ""
-      ],
-      "Unknown Wire Detail": [
-        null,
-        ""
-      ],
-      "Operation": [
-        null,
-        ""
-      ],
-      "time (ms/op)": [
-        null,
-        ""
-      ],
-      "The merchant %1$s offers you to purchase:": [
-        null,
-        ""
-      ],
-      "The total price is %1$s (plus %2$s fees).": [
-        null,
-        ""
-      ],
-      "The total price is %1$s.": [
-        null,
-        ""
-      ],
-      "Retry": [
-        null,
-        ""
-      ],
-      "Confirm payment": [
-        null,
-        ""
-      ],
-      "Balance": [
-        null,
-        ""
-      ],
-      "History": [
-        null,
-        ""
-      ],
-      "Debug": [
-        null,
-        ""
-      ],
-      "You have no balance to show. Need some %1$s getting started?": [
-        null,
-        ""
-      ],
-      "%1$s incoming": [
-        null,
-        ""
-      ],
-      "%1$s being spent": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve balance information.": [
-        null,
-        ""
-      ],
-      "Invalid ": [
-        null,
-        ""
-      ],
-      "Fees ": [
-        null,
-        ""
-      ],
-      "Refresh sessions has completed": [
-        null,
-        ""
-      ],
-      "Order Refused": [
-        null,
-        ""
-      ],
-      "Order redirected": [
-        null,
-        ""
-      ],
-      "Payment aborted": [
-        null,
-        ""
-      ],
-      "Payment Sent": [
-        null,
-        ""
-      ],
-      "Order accepted": [
-        null,
-        ""
-      ],
-      "Reserve balance updated": [
-        null,
-        ""
-      ],
-      "Payment refund": [
-        null,
-        ""
-      ],
-      "Withdrawn": [
-        null,
-        ""
-      ],
-      "Tip Accepted": [
-        null,
-        ""
-      ],
-      "Tip Declined": [
-        null,
-        ""
-      ],
-      "%1$s": [
+      "Invalid Wire": [null, ""],
+      "Invalid Test Wire Detail": [null, ""],
+      "Test Wire Acct #%1$s on %2$s": [null, ""],
+      "Unknown Wire Detail": [null, ""],
+      Operation: [null, ""],
+      "time (ms/op)": [null, ""],
+      "The merchant %1$s offers you to purchase:": [
         null,
-        ""
+        "Der Händler %1$s möchte einen Vertrag über %2$s mit Ihnen 
abschließen.",
       ],
-      "Error: could not retrieve event history": [
+      "The total price is %1$s (plus %2$s fees).": [null, ""],
+      "The total price is %1$s.": [null, ""],
+      Retry: [null, ""],
+      "Confirm payment": [null, "Bezahlung bestätigen"],
+      Balance: [null, "Saldo"],
+      History: [null, "Verlauf"],
+      Debug: [null, "Debug"],
+      "You have no balance to show. Need some %1$s getting started?": [
         null,
-        ""
-      ],
+        "Sie haben kein Digitalgeld. Wollen Sie %1$s? abheben?",
+      ],
+      "%1$s incoming": [null, ""],
+      "%1$s being spent": [null, ""],
+      "Error: could not retrieve balance information.": [null, ""],
+      "Invalid ": [null, ""],
+      "Fees ": [null, ""],
+      "Refresh sessions has completed": [null, ""],
+      "Order Refused": [null, ""],
+      "Order redirected": [null, ""],
+      "Payment aborted": [null, ""],
+      "Payment Sent": [null, ""],
+      "Order accepted": [null, ""],
+      "Reserve balance updated": [null, ""],
+      "Payment refund": [null, ""],
+      Withdrawn: [null, "Abheben bei %1$s"],
+      "Tip Accepted": [null, ""],
+      "Tip Declined": [null, ""],
+      "%1$s": [null, ""],
+      "Error: could not retrieve event history": [null, ""],
       "Your wallet has no events recorded.": [
         null,
-        ""
-      ],
-      "Wire to bank account": [
-        null,
-        ""
-      ],
-      "Confirm": [
-        null,
-        ""
-      ],
-      "Cancel": [
-        null,
-        ""
-      ],
-      "Fatal error: \"%1$s\".": [
-        null,
-        ""
-      ],
-      "Could not get details for withdraw operation:": [
-        null,
-        ""
-      ],
-      "Chose different exchange provider": [
-        null,
-        ""
+        "Ihre Geldbörse verzeichnet keine Vorkommnisse.",
       ],
+      "Wire to bank account": [null, ""],
+      Confirm: [null, "Bezahlung bestätigen"],
+      Cancel: [null, "Saldo"],
+      'Fatal error: "%1$s".': [null, ""],
+      "Could not get details for withdraw operation:": [null, ""],
+      "Chose different exchange provider": [null, ""],
       "Please select an exchange.  You can review the details before after 
your selection.": [
         null,
-        ""
-      ],
-      "Select %1$s": [
-        null,
-        ""
-      ],
-      "Select custom exchange": [
-        null,
-        ""
+        "",
       ],
+      "Select %1$s": [null, ""],
+      "Select custom exchange": [null, ""],
       "You are about to withdraw %1$s from your bank account into your 
wallet.": [
         null,
-        ""
-      ],
-      "Accept fees and withdraw": [
-        null,
-        ""
-      ],
-      "Cancel withdraw operation": [
-        null,
-        ""
-      ],
-      "Withdrawal fees:": [
-        null,
-        ""
-      ],
-      "Rounding loss:": [
-        null,
-        ""
-      ],
-      "Earliest expiration (for deposit): %1$s": [
-        null,
-        ""
-      ],
-      "# Coins": [
-        null,
-        ""
-      ],
-      "Value": [
-        null,
-        ""
-      ],
-      "Withdraw Fee": [
-        null,
-        ""
-      ],
-      "Refresh Fee": [
-        null,
-        ""
-      ],
-      "Deposit Fee": [
-        null,
-        ""
-      ]
-    }
-  }
+        "",
+      ],
+      "Accept fees and withdraw": [null, ""],
+      "Cancel withdraw operation": [null, ""],
+      "Withdrawal fees:": [null, "Abheben bei"],
+      "Rounding loss:": [null, ""],
+      "Earliest expiration (for deposit): %1$s": [null, ""],
+      "# Coins": [null, ""],
+      Value: [null, ""],
+      "Withdraw Fee": [null, "Abheben bei %1$s"],
+      "Refresh Fee": [null, ""],
+      "Deposit Fee": [null, ""],
+    },
+  },
 };
-strings['it'] = {
-  "domain": "messages",
-  "locale_data": {
-    "messages": {
+strings["en-US"] = {
+  domain: "messages",
+  locale_data: {
+    messages: {
       "": {
-        "domain": "messages",
-        "plural_forms": "nplurals=2; plural=(n != 1);",
-        "lang": ""
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
       },
-      "Invalid Wire": [
-        null,
-        ""
-      ],
-      "Invalid Test Wire Detail": [
-        null,
-        ""
-      ],
-      "Test Wire Acct #%1$s on %2$s": [
-        null,
-        ""
-      ],
-      "Unknown Wire Detail": [
-        null,
-        ""
-      ],
-      "Operation": [
-        null,
-        ""
-      ],
-      "time (ms/op)": [
-        null,
-        ""
-      ],
-      "The merchant %1$s offers you to purchase:": [
-        null,
-        ""
-      ],
-      "The total price is %1$s (plus %2$s fees).": [
-        null,
-        ""
-      ],
-      "The total price is %1$s.": [
-        null,
-        ""
-      ],
-      "Retry": [
-        null,
-        ""
-      ],
-      "Confirm payment": [
-        null,
-        ""
-      ],
-      "Balance": [
-        null,
-        ""
-      ],
-      "History": [
-        null,
-        ""
-      ],
-      "Debug": [
-        null,
-        ""
-      ],
+      "Invalid Wire": [null, ""],
+      "Invalid Test Wire Detail": [null, ""],
+      "Test Wire Acct #%1$s on %2$s": [null, ""],
+      "Unknown Wire Detail": [null, ""],
+      Operation: [null, ""],
+      "time (ms/op)": [null, ""],
+      "The merchant %1$s offers you to purchase:": [null, ""],
+      "The total price is %1$s (plus %2$s fees).": [null, ""],
+      "The total price is %1$s.": [null, ""],
+      Retry: [null, ""],
+      "Confirm payment": [null, ""],
+      Balance: [null, ""],
+      History: [null, ""],
+      Debug: [null, ""],
       "You have no balance to show. Need some %1$s getting started?": [
         null,
-        ""
-      ],
-      "%1$s incoming": [
-        null,
-        ""
-      ],
-      "%1$s being spent": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve balance information.": [
-        null,
-        ""
-      ],
-      "Invalid ": [
-        null,
-        ""
-      ],
-      "Fees ": [
-        null,
-        ""
-      ],
-      "Refresh sessions has completed": [
-        null,
-        ""
-      ],
-      "Order Refused": [
-        null,
-        ""
-      ],
-      "Order redirected": [
-        null,
-        ""
-      ],
-      "Payment aborted": [
-        null,
-        ""
-      ],
-      "Payment Sent": [
-        null,
-        ""
-      ],
-      "Order accepted": [
-        null,
-        ""
-      ],
-      "Reserve balance updated": [
-        null,
-        ""
-      ],
-      "Payment refund": [
-        null,
-        ""
-      ],
-      "Withdrawn": [
-        null,
-        ""
-      ],
-      "Tip Accepted": [
-        null,
-        ""
-      ],
-      "Tip Declined": [
-        null,
-        ""
-      ],
-      "%1$s": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve event history": [
-        null,
-        ""
-      ],
-      "Your wallet has no events recorded.": [
-        null,
-        ""
-      ],
-      "Wire to bank account": [
-        null,
-        ""
-      ],
-      "Confirm": [
-        null,
-        ""
-      ],
-      "Cancel": [
-        null,
-        ""
-      ],
-      "Fatal error: \"%1$s\".": [
-        null,
-        ""
-      ],
-      "Could not get details for withdraw operation:": [
-        null,
-        ""
-      ],
-      "Chose different exchange provider": [
-        null,
-        ""
-      ],
+        "",
+      ],
+      "%1$s incoming": [null, ""],
+      "%1$s being spent": [null, ""],
+      "Error: could not retrieve balance information.": [null, ""],
+      "Invalid ": [null, ""],
+      "Fees ": [null, ""],
+      "Refresh sessions has completed": [null, ""],
+      "Order Refused": [null, ""],
+      "Order redirected": [null, ""],
+      "Payment aborted": [null, ""],
+      "Payment Sent": [null, ""],
+      "Order accepted": [null, ""],
+      "Reserve balance updated": [null, ""],
+      "Payment refund": [null, ""],
+      Withdrawn: [null, ""],
+      "Tip Accepted": [null, ""],
+      "Tip Declined": [null, ""],
+      "%1$s": [null, ""],
+      "Error: could not retrieve event history": [null, ""],
+      "Your wallet has no events recorded.": [null, ""],
+      "Wire to bank account": [null, ""],
+      Confirm: [null, ""],
+      Cancel: [null, ""],
+      'Fatal error: "%1$s".': [null, ""],
+      "Could not get details for withdraw operation:": [null, ""],
+      "Chose different exchange provider": [null, ""],
       "Please select an exchange.  You can review the details before after 
your selection.": [
         null,
-        ""
-      ],
-      "Select %1$s": [
-        null,
-        ""
-      ],
-      "Select custom exchange": [
-        null,
-        ""
+        "",
       ],
+      "Select %1$s": [null, ""],
+      "Select custom exchange": [null, ""],
       "You are about to withdraw %1$s from your bank account into your 
wallet.": [
         null,
-        ""
-      ],
-      "Accept fees and withdraw": [
-        null,
-        ""
-      ],
-      "Cancel withdraw operation": [
-        null,
-        ""
-      ],
-      "Withdrawal fees:": [
-        null,
-        ""
-      ],
-      "Rounding loss:": [
-        null,
-        ""
-      ],
-      "Earliest expiration (for deposit): %1$s": [
-        null,
-        ""
-      ],
-      "# Coins": [
-        null,
-        ""
-      ],
-      "Value": [
-        null,
-        ""
-      ],
-      "Withdraw Fee": [
-        null,
-        ""
-      ],
-      "Refresh Fee": [
-        null,
-        ""
-      ],
-      "Deposit Fee": [
-        null,
-        ""
-      ]
-    }
-  }
+        "",
+      ],
+      "Accept fees and withdraw": [null, ""],
+      "Cancel withdraw operation": [null, ""],
+      "Withdrawal fees:": [null, ""],
+      "Rounding loss:": [null, ""],
+      "Earliest expiration (for deposit): %1$s": [null, ""],
+      "# Coins": [null, ""],
+      Value: [null, ""],
+      "Withdraw Fee": [null, ""],
+      "Refresh Fee": [null, ""],
+      "Deposit Fee": [null, ""],
+    },
+  },
 };
-strings['sv'] = {
-  "domain": "messages",
-  "locale_data": {
-    "messages": {
+strings["fr"] = {
+  domain: "messages",
+  locale_data: {
+    messages: {
       "": {
-        "domain": "messages",
-        "plural_forms": "nplurals=2; plural=(n != 1);",
-        "lang": ""
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
       },
-      "Invalid Wire": [
+      "Invalid Wire": [null, ""],
+      "Invalid Test Wire Detail": [null, ""],
+      "Test Wire Acct #%1$s on %2$s": [null, ""],
+      "Unknown Wire Detail": [null, ""],
+      Operation: [null, ""],
+      "time (ms/op)": [null, ""],
+      "The merchant %1$s offers you to purchase:": [null, ""],
+      "The total price is %1$s (plus %2$s fees).": [null, ""],
+      "The total price is %1$s.": [null, ""],
+      Retry: [null, ""],
+      "Confirm payment": [null, ""],
+      Balance: [null, ""],
+      History: [null, ""],
+      Debug: [null, ""],
+      "You have no balance to show. Need some %1$s getting started?": [
         null,
-        ""
-      ],
-      "Invalid Test Wire Detail": [
+        "",
+      ],
+      "%1$s incoming": [null, ""],
+      "%1$s being spent": [null, ""],
+      "Error: could not retrieve balance information.": [null, ""],
+      "Invalid ": [null, ""],
+      "Fees ": [null, ""],
+      "Refresh sessions has completed": [null, ""],
+      "Order Refused": [null, ""],
+      "Order redirected": [null, ""],
+      "Payment aborted": [null, ""],
+      "Payment Sent": [null, ""],
+      "Order accepted": [null, ""],
+      "Reserve balance updated": [null, ""],
+      "Payment refund": [null, ""],
+      Withdrawn: [null, ""],
+      "Tip Accepted": [null, ""],
+      "Tip Declined": [null, ""],
+      "%1$s": [null, ""],
+      "Error: could not retrieve event history": [null, ""],
+      "Your wallet has no events recorded.": [null, ""],
+      "Wire to bank account": [null, ""],
+      Confirm: [null, ""],
+      Cancel: [null, ""],
+      'Fatal error: "%1$s".': [null, ""],
+      "Could not get details for withdraw operation:": [null, ""],
+      "Chose different exchange provider": [null, ""],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
         null,
-        ""
+        "",
       ],
-      "Test Wire Acct #%1$s on %2$s": [
+      "Select %1$s": [null, ""],
+      "Select custom exchange": [null, ""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
         null,
-        ""
-      ],
-      "Unknown Wire Detail": [
+        "",
+      ],
+      "Accept fees and withdraw": [null, ""],
+      "Cancel withdraw operation": [null, ""],
+      "Withdrawal fees:": [null, ""],
+      "Rounding loss:": [null, ""],
+      "Earliest expiration (for deposit): %1$s": [null, ""],
+      "# Coins": [null, ""],
+      Value: [null, ""],
+      "Withdraw Fee": [null, ""],
+      "Refresh Fee": [null, ""],
+      "Deposit Fee": [null, ""],
+    },
+  },
+};
+strings["it"] = {
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [null, ""],
+      "Invalid Test Wire Detail": [null, ""],
+      "Test Wire Acct #%1$s on %2$s": [null, ""],
+      "Unknown Wire Detail": [null, ""],
+      Operation: [null, ""],
+      "time (ms/op)": [null, ""],
+      "The merchant %1$s offers you to purchase:": [null, ""],
+      "The total price is %1$s (plus %2$s fees).": [null, ""],
+      "The total price is %1$s.": [null, ""],
+      Retry: [null, ""],
+      "Confirm payment": [null, ""],
+      Balance: [null, ""],
+      History: [null, ""],
+      Debug: [null, ""],
+      "You have no balance to show. Need some %1$s getting started?": [
         null,
-        "visa mer"
-      ],
-      "Operation": [
+        "",
+      ],
+      "%1$s incoming": [null, ""],
+      "%1$s being spent": [null, ""],
+      "Error: could not retrieve balance information.": [null, ""],
+      "Invalid ": [null, ""],
+      "Fees ": [null, ""],
+      "Refresh sessions has completed": [null, ""],
+      "Order Refused": [null, ""],
+      "Order redirected": [null, ""],
+      "Payment aborted": [null, ""],
+      "Payment Sent": [null, ""],
+      "Order accepted": [null, ""],
+      "Reserve balance updated": [null, ""],
+      "Payment refund": [null, ""],
+      Withdrawn: [null, ""],
+      "Tip Accepted": [null, ""],
+      "Tip Declined": [null, ""],
+      "%1$s": [null, ""],
+      "Error: could not retrieve event history": [null, ""],
+      "Your wallet has no events recorded.": [null, ""],
+      "Wire to bank account": [null, ""],
+      Confirm: [null, ""],
+      Cancel: [null, ""],
+      'Fatal error: "%1$s".': [null, ""],
+      "Could not get details for withdraw operation:": [null, ""],
+      "Chose different exchange provider": [null, ""],
+      "Please select an exchange.  You can review the details before after 
your selection.": [
         null,
-        ""
+        "",
       ],
-      "time (ms/op)": [
+      "Select %1$s": [null, ""],
+      "Select custom exchange": [null, ""],
+      "You are about to withdraw %1$s from your bank account into your 
wallet.": [
         null,
-        ""
-      ],
+        "",
+      ],
+      "Accept fees and withdraw": [null, ""],
+      "Cancel withdraw operation": [null, ""],
+      "Withdrawal fees:": [null, ""],
+      "Rounding loss:": [null, ""],
+      "Earliest expiration (for deposit): %1$s": [null, ""],
+      "# Coins": [null, ""],
+      Value: [null, ""],
+      "Withdraw Fee": [null, ""],
+      "Refresh Fee": [null, ""],
+      "Deposit Fee": [null, ""],
+    },
+  },
+};
+strings["sv"] = {
+  domain: "messages",
+  locale_data: {
+    messages: {
+      "": {
+        domain: "messages",
+        plural_forms: "nplurals=2; plural=(n != 1);",
+        lang: "",
+      },
+      "Invalid Wire": [null, ""],
+      "Invalid Test Wire Detail": [null, ""],
+      "Test Wire Acct #%1$s on %2$s": [null, ""],
+      "Unknown Wire Detail": [null, "visa mer"],
+      Operation: [null, ""],
+      "time (ms/op)": [null, ""],
       "The merchant %1$s offers you to purchase:": [
         null,
-        "Säljaren %1$s erbjuder följande:"
+        "Säljaren %1$s erbjuder följande:",
       ],
       "The total price is %1$s (plus %2$s fees).": [
         null,
-        "Det totala priset är %1$s (plus %2$s avgifter).\n"
-      ],
-      "The total price is %1$s.": [
-        null,
-        "Det totala priset är %1$s."
-      ],
-      "Retry": [
-        null,
-        ""
-      ],
-      "Confirm payment": [
-        null,
-        "Godkän betalning"
-      ],
-      "Balance": [
-        null,
-        "Balans"
-      ],
-      "History": [
-        null,
-        "Historia"
-      ],
-      "Debug": [
-        null,
-        ""
+        "Det totala priset är %1$s (plus %2$s avgifter).\n",
       ],
+      "The total price is %1$s.": [null, "Det totala priset är %1$s."],
+      Retry: [null, ""],
+      "Confirm payment": [null, "Godkän betalning"],
+      Balance: [null, "Balans"],
+      History: [null, "Historia"],
+      Debug: [null, ""],
       "You have no balance to show. Need some %1$s getting started?": [
         null,
-        "Du har ingen balans att visa. Behöver du\n %1$s att börja?\n"
-      ],
-      "%1$s incoming": [
-        null,
-        "%1$s inkommande"
-      ],
-      "%1$s being spent": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve balance information.": [
-        null,
-        ""
-      ],
-      "Invalid ": [
-        null,
-        ""
-      ],
-      "Fees ": [
-        null,
-        ""
-      ],
-      "Refresh sessions has completed": [
-        null,
-        ""
-      ],
-      "Order Refused": [
-        null,
-        ""
-      ],
-      "Order redirected": [
-        null,
-        ""
-      ],
-      "Payment aborted": [
-        null,
-        ""
-      ],
-      "Payment Sent": [
-        null,
-        ""
-      ],
-      "Order accepted": [
-        null,
-        ""
-      ],
-      "Reserve balance updated": [
-        null,
-        ""
-      ],
-      "Payment refund": [
-        null,
-        ""
-      ],
-      "Withdrawn": [
-        null,
-        "Utbetalnings avgift"
-      ],
-      "Tip Accepted": [
-        null,
-        ""
-      ],
-      "Tip Declined": [
-        null,
-        ""
-      ],
-      "%1$s": [
-        null,
-        ""
-      ],
-      "Error: could not retrieve event history": [
-        null,
-        ""
-      ],
-      "Your wallet has no events recorded.": [
-        null,
-        "plånboken"
-      ],
-      "Wire to bank account": [
-        null,
-        "Övervisa till bank konto"
-      ],
-      "Confirm": [
-        null,
-        "Bekräfta"
-      ],
-      "Cancel": [
-        null,
-        "Avbryt"
-      ],
-      "Fatal error: \"%1$s\".": [
-        null,
-        ""
-      ],
-      "Could not get details for withdraw operation:": [
-        null,
-        ""
-      ],
-      "Chose different exchange provider": [
-        null,
-        "Ändra tjänsteleverantörer"
-      ],
+        "Du har ingen balans att visa. Behöver du\n %1$s att börja?\n",
+      ],
+      "%1$s incoming": [null, "%1$s inkommande"],
+      "%1$s being spent": [null, ""],
+      "Error: could not retrieve balance information.": [null, ""],
+      "Invalid ": [null, ""],
+      "Fees ": [null, ""],
+      "Refresh sessions has completed": [null, ""],
+      "Order Refused": [null, ""],
+      "Order redirected": [null, ""],
+      "Payment aborted": [null, ""],
+      "Payment Sent": [null, ""],
+      "Order accepted": [null, ""],
+      "Reserve balance updated": [null, ""],
+      "Payment refund": [null, ""],
+      Withdrawn: [null, "Utbetalnings avgift"],
+      "Tip Accepted": [null, ""],
+      "Tip Declined": [null, ""],
+      "%1$s": [null, ""],
+      "Error: could not retrieve event history": [null, ""],
+      "Your wallet has no events recorded.": [null, "plånboken"],
+      "Wire to bank account": [null, "Övervisa till bank konto"],
+      Confirm: [null, "Bekräfta"],
+      Cancel: [null, "Avbryt"],
+      'Fatal error: "%1$s".': [null, ""],
+      "Could not get details for withdraw operation:": [null, ""],
+      "Chose different exchange provider": [null, "Ändra tjänsteleverantörer"],
       "Please select an exchange.  You can review the details before after 
your selection.": [
         null,
-        ""
-      ],
-      "Select %1$s": [
-        null,
-        "Välj %1$s"
-      ],
-      "Select custom exchange": [
-        null,
-        ""
+        "",
       ],
+      "Select %1$s": [null, "Välj %1$s"],
+      "Select custom exchange": [null, ""],
       "You are about to withdraw %1$s from your bank account into your 
wallet.": [
         null,
-        "Du är på väg att ta ut\n %1$s från ditt bankkonto till din plånbok.\n"
-      ],
-      "Accept fees and withdraw": [
-        null,
-        "Acceptera avgifter och utbetala"
-      ],
-      "Cancel withdraw operation": [
-        null,
-        ""
-      ],
-      "Withdrawal fees:": [
-        null,
-        "Utbetalnings avgifter:"
-      ],
-      "Rounding loss:": [
-        null,
-        ""
-      ],
-      "Earliest expiration (for deposit): %1$s": [
-        null,
-        ""
-      ],
-      "# Coins": [
-        null,
-        "# Mynt"
-      ],
-      "Value": [
-        null,
-        "Värde"
-      ],
-      "Withdraw Fee": [
-        null,
-        "Utbetalnings avgift"
-      ],
-      "Refresh Fee": [
-        null,
-        "Återhämtnings avgift"
-      ],
-      "Deposit Fee": [
-        null,
-        "Depostitions avgift"
-      ]
-    }
-  }
+        "Du är på väg att ta ut\n %1$s från ditt bankkonto till din 
plånbok.\n",
+      ],
+      "Accept fees and withdraw": [null, "Acceptera avgifter och utbetala"],
+      "Cancel withdraw operation": [null, ""],
+      "Withdrawal fees:": [null, "Utbetalnings avgifter:"],
+      "Rounding loss:": [null, ""],
+      "Earliest expiration (for deposit): %1$s": [null, ""],
+      "# Coins": [null, "# Mynt"],
+      Value: [null, "Värde"],
+      "Withdraw Fee": [null, "Utbetalnings avgift"],
+      "Refresh Fee": [null, "Återhämtnings avgift"],
+      "Deposit Fee": [null, "Depostitions avgift"],
+    },
+  },
 };
diff --git a/src/operations/balance.ts b/src/operations/balance.ts
index 03d1b2a9..8858e8b4 100644
--- a/src/operations/balance.ts
+++ b/src/operations/balance.ts
@@ -34,8 +34,7 @@ export async function getBalancesInsideTransaction(
   ws: InternalWalletState,
   tx: TransactionHandle,
 ): Promise<WalletBalance> {
-
-    /**
+  /**
    * Add amount to a balance field, both for
    * the slicing by exchange and currency.
    */
@@ -74,7 +73,7 @@ export async function getBalancesInsideTransaction(
     byExchange: {},
   };
 
-  await tx.iter(Stores.coins).forEach(c => {
+  await tx.iter(Stores.coins).forEach((c) => {
     if (c.suspended) {
       return;
     }
@@ -82,7 +81,7 @@ export async function getBalancesInsideTransaction(
       addTo(balanceStore, "available", c.currentAmount, c.exchangeBaseUrl);
     }
   });
-  await tx.iter(Stores.refreshGroups).forEach(r => {
+  await tx.iter(Stores.refreshGroups).forEach((r) => {
     // Don't count finished refreshes, since the refresh already resulted
     // in coins being added to the wallet.
     if (r.timestampFinished) {
@@ -107,7 +106,7 @@ export async function getBalancesInsideTransaction(
     }
   });
 
-  await tx.iter(Stores.withdrawalSession).forEach(wds => {
+  await tx.iter(Stores.withdrawalSession).forEach((wds) => {
     let w = wds.totalCoinValue;
     for (let i = 0; i < wds.planchets.length; i++) {
       if (wds.withdrawn[i]) {
@@ -120,7 +119,7 @@ export async function getBalancesInsideTransaction(
     addTo(balanceStore, "pendingIncoming", w, wds.exchangeBaseUrl);
   });
 
-  await tx.iter(Stores.purchases).forEach(t => {
+  await tx.iter(Stores.purchases).forEach((t) => {
     if (t.timestampFirstSuccessfulPay) {
       return;
     }
@@ -145,14 +144,16 @@ export async function getBalances(
 ): Promise<WalletBalance> {
   logger.trace("starting to compute balance");
 
-  return await ws.db.runWithReadTransaction([
-    Stores.coins,
-    Stores.refreshGroups,
-    Stores.reserves,
-    Stores.purchases,
-    Stores.withdrawalSession,
-  ],
-  async tx => {
-    return getBalancesInsideTransaction(ws, tx);
-  });
+  return await ws.db.runWithReadTransaction(
+    [
+      Stores.coins,
+      Stores.refreshGroups,
+      Stores.reserves,
+      Stores.purchases,
+      Stores.withdrawalSession,
+    ],
+    async (tx) => {
+      return getBalancesInsideTransaction(ws, tx);
+    },
+  );
 }
diff --git a/src/operations/errors.ts b/src/operations/errors.ts
index 751a5711..50e68993 100644
--- a/src/operations/errors.ts
+++ b/src/operations/errors.ts
@@ -64,7 +64,6 @@ export async function scrutinizeTalerJsonResponse<T>(
   resp: HttpResponse,
   codec: Codec<T>,
 ): Promise<T> {
-
   // FIXME: We should distinguish between different types of error status
   // to react differently (throttle, report permanent failure)
 
@@ -82,7 +81,7 @@ export async function scrutinizeTalerJsonResponse<T>(
         details: {
           httpStatusCode: resp.status,
           errorResponse: errorJson,
-        }
+        },
       });
     } catch (e) {
       const m = "could not parse response JSON";
@@ -91,7 +90,7 @@ export async function scrutinizeTalerJsonResponse<T>(
         message: m,
         details: {
           status: resp.status,
-        }
+        },
       });
     }
     throw exc;
@@ -101,13 +100,13 @@ export async function scrutinizeTalerJsonResponse<T>(
     json = await resp.json();
   } catch (e) {
     const m = "could not parse response JSON";
-      throw new OperationFailedError({
-        type: "network",
-        message: m,
-        details: {
-          status: resp.status,
-        }
-      });
+    throw new OperationFailedError({
+      type: "network",
+      message: m,
+      details: {
+        status: resp.status,
+      },
+    });
   }
   return codec.decode(json);
 }
@@ -138,7 +137,7 @@ export async function guardOperationException<T>(
         type: "exception",
         message: e.message,
         details: {},
-      }
+      };
       await onOpError(opErr);
       throw new OperationFailedAndReportedError(opErr);
     }
diff --git a/src/operations/exchanges.ts b/src/operations/exchanges.ts
index f920a5a5..3aaf7746 100644
--- a/src/operations/exchanges.ts
+++ b/src/operations/exchanges.ts
@@ -193,7 +193,7 @@ async function updateExchangeWithKeys(
     .currency;
 
   const newDenominations = await Promise.all(
-    exchangeKeysJson.denoms.map(d =>
+    exchangeKeysJson.denoms.map((d) =>
       denominationRecordFromKeys(ws, baseUrl, d),
     ),
   );
@@ -202,7 +202,7 @@ async function updateExchangeWithKeys(
 
   await ws.db.runWithWriteTransaction(
     [Stores.exchanges, Stores.denominations, Stores.recoupGroups, 
Stores.coins],
-    async tx => {
+    async (tx) => {
       const r = await tx.get(Stores.exchanges, baseUrl);
       if (!r) {
         console.warn(`exchange ${baseUrl} no longer present`);
@@ -275,7 +275,7 @@ async function updateExchangeWithKeys(
   if (recoupGroupId) {
     // Asynchronously start recoup.  This doesn't need to finish
     // for the exchange update to be considered finished.
-    processRecoupGroup(ws, recoupGroupId).catch(e => {
+    processRecoupGroup(ws, recoupGroupId).catch((e) => {
       console.log("error while recouping coins:", e);
     });
   }
@@ -294,7 +294,7 @@ async function updateExchangeFinalize(
   }
   await ws.db.runWithWriteTransaction(
     [Stores.exchanges, Stores.exchangeUpdatedEvents],
-    async tx => {
+    async (tx) => {
       const r = await tx.get(Stores.exchanges, exchangeBaseUrl);
       if (!r) {
         return;
@@ -338,7 +338,7 @@ async function updateExchangeWithTermsOfService(
   const tosText = await resp.text();
   const tosEtag = resp.headers.get("etag") || undefined;
 
-  await ws.db.runWithWriteTransaction([Stores.exchanges], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.exchanges], async (tx) => {
     const r = await tx.get(Stores.exchanges, exchangeBaseUrl);
     if (!r) {
       return;
@@ -358,7 +358,7 @@ export async function acceptExchangeTermsOfService(
   exchangeBaseUrl: string,
   etag: string | undefined,
 ) {
-  await ws.db.runWithWriteTransaction([Stores.exchanges], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.exchanges], async (tx) => {
     const r = await tx.get(Stores.exchanges, exchangeBaseUrl);
     if (!r) {
       return;
@@ -438,7 +438,7 @@ async function updateExchangeWithWireInfo(
     feesForType[wireMethod] = feeList;
   }
 
-  await ws.db.runWithWriteTransaction([Stores.exchanges], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.exchanges], async (tx) => {
     const r = await tx.get(Stores.exchanges, exchangeBaseUrl);
     if (!r) {
       return;
@@ -500,7 +500,7 @@ async function updateExchangeFromUrlImpl(
     };
     await ws.db.put(Stores.exchanges, newExchangeRecord);
   } else {
-    await ws.db.runWithWriteTransaction([Stores.exchanges], async t => {
+    await ws.db.runWithWriteTransaction([Stores.exchanges], async (t) => {
       const rec = await t.get(Stores.exchanges, baseUrl);
       if (!rec) {
         return;
diff --git a/src/operations/history.ts b/src/operations/history.ts
index 65907de8..1b417252 100644
--- a/src/operations/history.ts
+++ b/src/operations/history.ts
@@ -47,7 +47,7 @@ import { timestampCmp } from "../util/time";
  * Create an event ID from the type and the primary key for the event.
  */
 function makeEventId(type: HistoryEventType, ...args: string[]) {
-  return type + ";" + args.map(x => encodeURIComponent(x)).join(";");
+  return type + ";" + args.map((x) => encodeURIComponent(x)).join(";");
 }
 
 function getOrderShortInfo(
@@ -72,7 +72,7 @@ async function collectProposalHistory(
   history: HistoryEvent[],
   historyQuery?: HistoryQuery,
 ) {
-  tx.iter(Stores.proposals).forEachAsync(async proposal => {
+  tx.iter(Stores.proposals).forEachAsync(async (proposal) => {
     const status = proposal.proposalStatus;
     switch (status) {
       case ProposalStatus.ACCEPTED:
@@ -182,8 +182,8 @@ export async function getHistory(
       Stores.reserveUpdatedEvents,
       Stores.recoupGroups,
     ],
-    async tx => {
-      tx.iter(Stores.exchanges).forEach(exchange => {
+    async (tx) => {
+      tx.iter(Stores.exchanges).forEach((exchange) => {
         history.push({
           type: HistoryEventType.ExchangeAdded,
           builtIn: false,
@@ -196,7 +196,7 @@ export async function getHistory(
         });
       });
 
-      tx.iter(Stores.exchangeUpdatedEvents).forEach(eu => {
+      tx.iter(Stores.exchangeUpdatedEvents).forEach((eu) => {
         history.push({
           type: HistoryEventType.ExchangeUpdated,
           eventId: makeEventId(
@@ -208,7 +208,7 @@ export async function getHistory(
         });
       });
 
-      tx.iter(Stores.withdrawalSession).forEach(wsr => {
+      tx.iter(Stores.withdrawalSession).forEach((wsr) => {
         if (wsr.timestampFinish) {
           const cs: PlanchetRecord[] = [];
           wsr.planchets.forEach((x) => {
@@ -226,7 +226,7 @@ export async function getHistory(
               })),
             };
           }
-          
+
           history.push({
             type: HistoryEventType.Withdrawn,
             withdrawSessionId: wsr.withdrawSessionId,
@@ -246,7 +246,7 @@ export async function getHistory(
 
       await collectProposalHistory(tx, history, historyQuery);
 
-      await tx.iter(Stores.payEvents).forEachAsync(async pe => {
+      await tx.iter(Stores.payEvents).forEachAsync(async (pe) => {
         const proposal = await tx.get(Stores.proposals, pe.proposalId);
         if (!proposal) {
           return;
@@ -262,7 +262,7 @@ export async function getHistory(
         let verboseDetails: VerbosePayCoinDetails | undefined = undefined;
         if (historyQuery?.extraDebug) {
           const coins: {
-            value: string,
+            value: string;
             contribution: string;
             denomPub: string;
           }[] = [];
@@ -272,7 +272,10 @@ export async function getHistory(
               // FIXME: what to do here??
               continue;
             }
-            const d = await tx.get(Stores.denominations, [c.exchangeBaseUrl, 
c.denomPub]);
+            const d = await tx.get(Stores.denominations, [
+              c.exchangeBaseUrl,
+              c.denomPub,
+            ]);
             if (!d) {
               // FIXME: what to do here??
               continue;
@@ -283,10 +286,12 @@ export async function getHistory(
               value: Amounts.toString(d.value),
             });
           }
-          verboseDetails = { coins }; 
+          verboseDetails = { coins };
         }
         const amountPaidWithFees = Amounts.sum(
-          purchase.payReq.coins.map(x => Amounts.parseOrThrow(x.contribution)),
+          purchase.payReq.coins.map((x) =>
+            Amounts.parseOrThrow(x.contribution),
+          ),
         ).amount;
         history.push({
           type: HistoryEventType.PaymentSent,
@@ -301,7 +306,7 @@ export async function getHistory(
         });
       });
 
-      await tx.iter(Stores.refreshGroups).forEachAsync(async rg => {
+      await tx.iter(Stores.refreshGroups).forEachAsync(async (rg) => {
         if (!rg.timestampFinished) {
           return;
         }
@@ -340,7 +345,7 @@ export async function getHistory(
         if (historyQuery?.extraDebug) {
           const outputCoins: {
             value: string;
-            denomPub: string,
+            denomPub: string;
           }[] = [];
           for (const rs of rg.refreshSessionPerCoin) {
             if (!rs) {
@@ -350,7 +355,10 @@ export async function getHistory(
               if (!nd) {
                 continue;
               }
-              const d = await tx.get(Stores.denominations, 
[rs.exchangeBaseUrl, nd]);
+              const d = await tx.get(Stores.denominations, [
+                rs.exchangeBaseUrl,
+                nd,
+              ]);
               if (!d) {
                 continue;
               }
@@ -362,7 +370,7 @@ export async function getHistory(
           }
           verboseDetails = {
             outputCoins: outputCoins,
-          }
+          };
         }
         history.push({
           type: HistoryEventType.Refreshed,
@@ -379,7 +387,7 @@ export async function getHistory(
         });
       });
 
-      tx.iter(Stores.reserveUpdatedEvents).forEachAsync(async ru => {
+      tx.iter(Stores.reserveUpdatedEvents).forEachAsync(async (ru) => {
         const reserve = await tx.get(Stores.reserves, ru.reservePub);
         if (!reserve) {
           return;
@@ -413,7 +421,7 @@ export async function getHistory(
         });
       });
 
-      tx.iter(Stores.tips).forEach(tip => {
+      tx.iter(Stores.tips).forEach((tip) => {
         if (tip.acceptedTimestamp) {
           history.push({
             type: HistoryEventType.TipAccepted,
@@ -425,7 +433,7 @@ export async function getHistory(
         }
       });
 
-      tx.iter(Stores.refundEvents).forEachAsync(async re => {
+      tx.iter(Stores.refundEvents).forEachAsync(async (re) => {
         const proposal = await tx.get(Stores.proposals, re.proposalId);
         if (!proposal) {
           return;
@@ -486,7 +494,7 @@ export async function getHistory(
         });
       });
 
-      tx.iter(Stores.recoupGroups).forEach(rg => {
+      tx.iter(Stores.recoupGroups).forEach((rg) => {
         if (rg.timestampFinished) {
           let verboseDetails: any = undefined;
           if (historyQuery?.extraDebug) {
@@ -498,7 +506,10 @@ export async function getHistory(
           history.push({
             type: HistoryEventType.FundsRecouped,
             timestamp: rg.timestampFinished,
-            eventId: makeEventId(HistoryEventType.FundsRecouped, 
rg.recoupGroupId),
+            eventId: makeEventId(
+              HistoryEventType.FundsRecouped,
+              rg.recoupGroupId,
+            ),
             numCoinsRecouped: rg.coinPubs.length,
             verboseDetails,
           });
diff --git a/src/operations/pay.ts b/src/operations/pay.ts
index f3468ae4..9b9d2fa9 100644
--- a/src/operations/pay.ts
+++ b/src/operations/pay.ts
@@ -127,7 +127,7 @@ export interface AvailableCoinInfo {
 
 /**
  * Compute the total cost of a payment to the customer.
- * 
+ *
  * This includes the amount taken by the merchant, fees (wire/deposit) 
contributed
  * by the customer, refreshing fees, fees for withdraw-after-refresh and 
"trimmings"
  * of coins that are too small to spend.
@@ -461,7 +461,7 @@ async function recordConfirmPay(
 
   await ws.db.runWithWriteTransaction(
     [Stores.coins, Stores.purchases, Stores.proposals, Stores.refreshGroups],
-    async tx => {
+    async (tx) => {
       const p = await tx.get(Stores.proposals, proposal.proposalId);
       if (p) {
         p.proposalStatus = ProposalStatus.ACCEPTED;
@@ -486,7 +486,9 @@ async function recordConfirmPay(
         coin.currentAmount = remaining.amount;
         await tx.put(Stores.coins, coin);
       }
-      const refreshCoinPubs = coinSelection.coinPubs.map(x => ({ coinPub: x 
}));
+      const refreshCoinPubs = coinSelection.coinPubs.map((x) => ({
+        coinPub: x,
+      }));
       await createRefreshGroup(tx, refreshCoinPubs, RefreshReason.Pay);
     },
   );
@@ -560,7 +562,7 @@ export async function abortFailedPayment(
     RefundReason.AbortRefund,
   );
 
-  await ws.db.runWithWriteTransaction([Stores.purchases], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.purchases], async (tx) => {
     const p = await tx.get(Stores.purchases, proposalId);
     if (!p) {
       return;
@@ -575,7 +577,7 @@ async function incrementProposalRetry(
   proposalId: string,
   err: OperationError | undefined,
 ): Promise<void> {
-  await ws.db.runWithWriteTransaction([Stores.proposals], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.proposals], async (tx) => {
     const pr = await tx.get(Stores.proposals, proposalId);
     if (!pr) {
       return;
@@ -597,7 +599,7 @@ async function incrementPurchasePayRetry(
   err: OperationError | undefined,
 ): Promise<void> {
   console.log("incrementing purchase pay retry with error", err);
-  await ws.db.runWithWriteTransaction([Stores.purchases], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.purchases], async (tx) => {
     const pr = await tx.get(Stores.purchases, proposalId);
     if (!pr) {
       return;
@@ -630,7 +632,7 @@ async function resetDownloadProposalRetry(
   ws: InternalWalletState,
   proposalId: string,
 ) {
-  await ws.db.mutate(Stores.proposals, proposalId, x => {
+  await ws.db.mutate(Stores.proposals, proposalId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
     }
@@ -685,7 +687,7 @@ async function processDownloadProposalImpl(
 
   await ws.db.runWithWriteTransaction(
     [Stores.proposals, Stores.purchases],
-    async tx => {
+    async (tx) => {
       const p = await tx.get(Stores.proposals, proposalId);
       if (!p) {
         return;
@@ -715,11 +717,11 @@ async function processDownloadProposalImpl(
           payDeadline: parsedContractTerms.pay_deadline,
           refundDeadline: parsedContractTerms.refund_deadline,
           wireFeeAmortization: parsedContractTerms.wire_fee_amortization || 1,
-          allowedAuditors: parsedContractTerms.auditors.map(x => ({
+          allowedAuditors: parsedContractTerms.auditors.map((x) => ({
             auditorBaseUrl: x.url,
             auditorPub: x.master_pub,
           })),
-          allowedExchanges: parsedContractTerms.exchanges.map(x => ({
+          allowedExchanges: parsedContractTerms.exchanges.map((x) => ({
             exchangeBaseUrl: x.url,
             exchangePub: x.master_pub,
           })),
@@ -797,7 +799,7 @@ async function startDownloadProposal(
     downloadSessionId: sessionId,
   };
 
-  await ws.db.runWithWriteTransaction([Stores.proposals], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.proposals], async (tx) => {
     const existingRecord = await tx.getIndexed(
       Stores.proposals.urlAndOrderIdIndex,
       [merchantBaseUrl, orderId],
@@ -878,7 +880,7 @@ export async function submitPay(
 
   await ws.db.runWithWriteTransaction(
     [Stores.purchases, Stores.payEvents],
-    async tx => {
+    async (tx) => {
       await tx.put(Stores.purchases, purchase);
       const payEvent: PayEventRecord = {
         proposalId,
@@ -984,7 +986,7 @@ export async function preparePayForUri(
     console.log(
       "automatically re-submitting payment with different session ID",
     );
-    await ws.db.runWithWriteTransaction([Stores.purchases], async tx => {
+    await ws.db.runWithWriteTransaction([Stores.purchases], async (tx) => {
       const p = await tx.get(Stores.purchases, proposalId);
       if (!p) {
         return;
@@ -1035,7 +1037,7 @@ export async function confirmPay(
       sessionIdOverride != purchase.lastSessionId
     ) {
       logger.trace(`changing session ID to ${sessionIdOverride}`);
-      await ws.db.mutate(Stores.purchases, purchase.proposalId, x => {
+      await ws.db.mutate(Stores.purchases, purchase.proposalId, (x) => {
         x.lastSessionId = sessionIdOverride;
         x.paymentSubmitPending = true;
         return x;
@@ -1118,7 +1120,7 @@ async function resetPurchasePayRetry(
   ws: InternalWalletState,
   proposalId: string,
 ) {
-  await ws.db.mutate(Stores.purchases, proposalId, x => {
+  await ws.db.mutate(Stores.purchases, proposalId, (x) => {
     if (x.payRetryInfo.active) {
       x.payRetryInfo = initRetryInfo();
     }
@@ -1151,7 +1153,7 @@ export async function refuseProposal(
 ) {
   const success = await ws.db.runWithWriteTransaction(
     [Stores.proposals],
-    async tx => {
+    async (tx) => {
       const proposal = await tx.get(Stores.proposals, proposalId);
       if (!proposal) {
         logger.trace(`proposal ${proposalId} not found, won't refuse 
proposal`);
diff --git a/src/operations/pending.ts b/src/operations/pending.ts
index a628d613..adf47b15 100644
--- a/src/operations/pending.ts
+++ b/src/operations/pending.ts
@@ -59,7 +59,7 @@ async function gatherExchangePending(
     // FIXME: exchanges should also be updated regularly
     return;
   }
-  await tx.iter(Stores.exchanges).forEach(e => {
+  await tx.iter(Stores.exchanges).forEach((e) => {
     switch (e.updateStatus) {
       case ExchangeUpdateStatus.Finished:
         if (e.lastError) {
@@ -148,7 +148,7 @@ async function gatherReservePending(
   onlyDue: boolean = false,
 ): Promise<void> {
   // FIXME: this should be optimized by using an index for "onlyDue==true".
-  await tx.iter(Stores.reserves).forEach(reserve => {
+  await tx.iter(Stores.reserves).forEach((reserve) => {
     const reserveType = reserve.bankWithdrawStatusUrl ? "taler-bank" : 
"manual";
     if (!reserve.retryInfo.active) {
       return;
@@ -214,7 +214,7 @@ async function gatherRefreshPending(
   resp: PendingOperationsResponse,
   onlyDue: boolean = false,
 ): Promise<void> {
-  await tx.iter(Stores.refreshGroups).forEach(r => {
+  await tx.iter(Stores.refreshGroups).forEach((r) => {
     if (r.timestampFinished) {
       return;
     }
@@ -243,7 +243,7 @@ async function gatherWithdrawalPending(
   resp: PendingOperationsResponse,
   onlyDue: boolean = false,
 ): Promise<void> {
-  await tx.iter(Stores.withdrawalSession).forEach(wsr => {
+  await tx.iter(Stores.withdrawalSession).forEach((wsr) => {
     if (wsr.timestampFinish) {
       return;
     }
@@ -277,7 +277,7 @@ async function gatherProposalPending(
   resp: PendingOperationsResponse,
   onlyDue: boolean = false,
 ): Promise<void> {
-  await tx.iter(Stores.proposals).forEach(proposal => {
+  await tx.iter(Stores.proposals).forEach((proposal) => {
     if (proposal.proposalStatus == ProposalStatus.PROPOSED) {
       if (onlyDue) {
         return;
@@ -318,7 +318,7 @@ async function gatherTipPending(
   resp: PendingOperationsResponse,
   onlyDue: boolean = false,
 ): Promise<void> {
-  await tx.iter(Stores.tips).forEach(tip => {
+  await tx.iter(Stores.tips).forEach((tip) => {
     if (tip.pickedUp) {
       return;
     }
@@ -348,7 +348,7 @@ async function gatherPurchasePending(
   resp: PendingOperationsResponse,
   onlyDue: boolean = false,
 ): Promise<void> {
-  await tx.iter(Stores.purchases).forEach(pr => {
+  await tx.iter(Stores.purchases).forEach((pr) => {
     if (pr.paymentSubmitPending) {
       resp.nextRetryDelay = updateRetryDelay(
         resp.nextRetryDelay,
@@ -411,7 +411,7 @@ async function gatherRecoupPending(
   resp: PendingOperationsResponse,
   onlyDue: boolean = false,
 ): Promise<void> {
-  await tx.iter(Stores.recoupGroups).forEach(rg => {
+  await tx.iter(Stores.recoupGroups).forEach((rg) => {
     if (rg.timestampFinished) {
       return;
     }
@@ -450,7 +450,7 @@ export async function getPendingOperations(
       Stores.purchases,
       Stores.recoupGroups,
     ],
-    async tx => {
+    async (tx) => {
       const walletBalance = await getBalancesInsideTransaction(ws, tx);
       const resp: PendingOperationsResponse = {
         nextRetryDelay: { d_ms: Number.MAX_SAFE_INTEGER },
diff --git a/src/operations/refresh.ts b/src/operations/refresh.ts
index f196fc5e..5628263e 100644
--- a/src/operations/refresh.ts
+++ b/src/operations/refresh.ts
@@ -68,7 +68,7 @@ export function getTotalRefreshCost(
   const withdrawDenoms = getWithdrawDenomList(withdrawAmount, denoms);
   const resultingAmount = Amounts.add(
     Amounts.getZero(withdrawAmount.currency),
-    ...withdrawDenoms.map(d => d.value),
+    ...withdrawDenoms.map((d) => d.value),
   ).amount;
   const totalCost = Amounts.sub(amountLeft, resultingAmount).amount;
   logger.trace(
@@ -139,7 +139,7 @@ async function refreshCreateSession(
     );
     await ws.db.runWithWriteTransaction(
       [Stores.coins, Stores.refreshGroups],
-      async tx => {
+      async (tx) => {
         const rg = await tx.get(Stores.refreshGroups, refreshGroupId);
         if (!rg) {
           return;
@@ -175,7 +175,7 @@ async function refreshCreateSession(
   // coin in the same transaction.
   await ws.db.runWithWriteTransaction(
     [Stores.refreshGroups, Stores.coins],
-    async tx => {
+    async (tx) => {
       const c = await tx.get(Stores.coins, coin.coinPub);
       if (!c) {
         throw Error("coin not found, but marked for refresh");
@@ -274,7 +274,7 @@ async function refreshMelt(
 
   refreshSession.norevealIndex = norevealIndex;
 
-  await ws.db.mutate(Stores.refreshGroups, refreshGroupId, rg => {
+  await ws.db.mutate(Stores.refreshGroups, refreshGroupId, (rg) => {
     const rs = rg.refreshSessionPerCoin[coinIndex];
     if (!rs) {
       return;
@@ -420,7 +420,7 @@ async function refreshReveal(
 
   await ws.db.runWithWriteTransaction(
     [Stores.coins, Stores.refreshGroups],
-    async tx => {
+    async (tx) => {
       const rg = await tx.get(Stores.refreshGroups, refreshGroupId);
       if (!rg) {
         console.log("no refresh session found");
@@ -464,7 +464,7 @@ async function incrementRefreshRetry(
   refreshGroupId: string,
   err: OperationError | undefined,
 ): Promise<void> {
-  await ws.db.runWithWriteTransaction([Stores.refreshGroups], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.refreshGroups], async (tx) => {
     const r = await tx.get(Stores.refreshGroups, refreshGroupId);
     if (!r) {
       return;
@@ -499,7 +499,7 @@ async function resetRefreshGroupRetry(
   ws: InternalWalletState,
   refreshSessionId: string,
 ) {
-  await ws.db.mutate(Stores.refreshGroups, refreshSessionId, x => {
+  await ws.db.mutate(Stores.refreshGroups, refreshSessionId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
     }
@@ -578,13 +578,13 @@ export async function createRefreshGroup(
 
   const refreshGroup: RefreshGroupRecord = {
     timestampFinished: undefined,
-    finishedPerCoin: oldCoinPubs.map(x => false),
+    finishedPerCoin: oldCoinPubs.map((x) => false),
     lastError: undefined,
     lastErrorPerCoin: {},
-    oldCoinPubs: oldCoinPubs.map(x => x.coinPub),
+    oldCoinPubs: oldCoinPubs.map((x) => x.coinPub),
     reason,
     refreshGroupId,
-    refreshSessionPerCoin: oldCoinPubs.map(x => undefined),
+    refreshSessionPerCoin: oldCoinPubs.map((x) => undefined),
     retryInfo: initRetryInfo(),
   };
 
diff --git a/src/operations/refund.ts b/src/operations/refund.ts
index c856bb7d..64ab1f1e 100644
--- a/src/operations/refund.ts
+++ b/src/operations/refund.ts
@@ -64,7 +64,7 @@ async function incrementPurchaseQueryRefundRetry(
   err: OperationError | undefined,
 ): Promise<void> {
   console.log("incrementing purchase refund query retry with error", err);
-  await ws.db.runWithWriteTransaction([Stores.purchases], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.purchases], async (tx) => {
     const pr = await tx.get(Stores.purchases, proposalId);
     if (!pr) {
       return;
@@ -86,7 +86,7 @@ async function incrementPurchaseApplyRefundRetry(
   err: OperationError | undefined,
 ): Promise<void> {
   console.log("incrementing purchase refund apply retry with error", err);
-  await ws.db.runWithWriteTransaction([Stores.purchases], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.purchases], async (tx) => {
     const pr = await tx.get(Stores.purchases, proposalId);
     if (!pr) {
       return;
@@ -161,7 +161,7 @@ export async function acceptRefundResponse(
 
   const refundGroupId = encodeCrock(randomBytes(32));
 
-  await ws.db.runWithWriteTransaction([Stores.purchases], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.purchases], async (tx) => {
     const p = await tx.get(Stores.purchases, proposalId);
     if (!p) {
       console.error("purchase not found, not adding refunds");
@@ -239,7 +239,7 @@ async function startRefundQuery(
 ): Promise<void> {
   const success = await ws.db.runWithWriteTransaction(
     [Stores.purchases],
-    async tx => {
+    async (tx) => {
       const p = await tx.get(Stores.purchases, proposalId);
       if (!p) {
         console.log("no purchase found for refund URL");
@@ -271,7 +271,7 @@ async function startRefundQuery(
 export async function applyRefund(
   ws: InternalWalletState,
   talerRefundUri: string,
-): Promise<string> {
+): Promise<{ contractTermsHash: string }> {
   const parseResult = parseRefundUri(talerRefundUri);
 
   console.log("applying refund", parseResult);
@@ -286,13 +286,15 @@ export async function applyRefund(
   ]);
 
   if (!purchase) {
-    throw Error(`no purchase for the taler://refund/ URI (${talerRefundUri}) 
was found`);
+    throw Error(
+      `no purchase for the taler://refund/ URI (${talerRefundUri}) was found`,
+    );
   }
 
   console.log("processing purchase for refund");
   await startRefundQuery(ws, purchase.proposalId);
 
-  return purchase.contractData.contractTermsHash;
+  return { contractTermsHash: purchase.contractData.contractTermsHash };
 }
 
 export async function processPurchaseQueryRefund(
@@ -312,7 +314,7 @@ async function resetPurchaseQueryRefundRetry(
   ws: InternalWalletState,
   proposalId: string,
 ) {
-  await ws.db.mutate(Stores.purchases, proposalId, x => {
+  await ws.db.mutate(Stores.purchases, proposalId, (x) => {
     if (x.refundStatusRetryInfo.active) {
       x.refundStatusRetryInfo = initRetryInfo();
     }
@@ -336,10 +338,7 @@ async function processPurchaseQueryRefundImpl(
     return;
   }
 
-  const refundUrlObj = new URL(
-    "refund",
-    purchase.contractData.merchantBaseUrl,
-  );
+  const refundUrlObj = new URL("refund", 
purchase.contractData.merchantBaseUrl);
   refundUrlObj.searchParams.set("order_id", purchase.contractData.orderId);
   const refundUrl = refundUrlObj.href;
   let resp;
@@ -353,7 +352,9 @@ async function processPurchaseQueryRefundImpl(
     throw Error(`unexpected status code (${resp.status}) for /refund`);
   }
 
-  const refundResponse = codecForMerchantRefundResponse().decode(await 
resp.json());
+  const refundResponse = codecForMerchantRefundResponse().decode(
+    await resp.json(),
+  );
   await acceptRefundResponse(
     ws,
     proposalId,
@@ -379,7 +380,7 @@ async function resetPurchaseApplyRefundRetry(
   ws: InternalWalletState,
   proposalId: string,
 ) {
-  await ws.db.mutate(Stores.purchases, proposalId, x => {
+  await ws.db.mutate(Stores.purchases, proposalId, (x) => {
     if (x.refundApplyRetryInfo.active) {
       x.refundApplyRetryInfo = initRetryInfo();
     }
@@ -452,7 +453,7 @@ async function processPurchaseApplyRefundImpl(
   let allRefundsProcessed = false;
   await ws.db.runWithWriteTransaction(
     [Stores.purchases, Stores.coins, Stores.refreshGroups, 
Stores.refundEvents],
-    async tx => {
+    async (tx) => {
       const p = await tx.get(Stores.purchases, proposalId);
       if (!p) {
         return;
@@ -471,8 +472,12 @@ async function processPurchaseApplyRefundImpl(
           return;
         }
         refreshCoinsMap[c.coinPub] = { coinPub: c.coinPub };
-        logger.trace(`commiting refund ${perm.merchant_sig} to coin 
${c.coinPub}`);
-        logger.trace(`coin amount before is 
${Amounts.toString(c.currentAmount)}`)
+        logger.trace(
+          `commiting refund ${perm.merchant_sig} to coin ${c.coinPub}`,
+        );
+        logger.trace(
+          `coin amount before is ${Amounts.toString(c.currentAmount)}`,
+        );
         logger.trace(`refund amount (via merchant) is ${perm.refund_amount}`);
         logger.trace(`refund fee (via merchant) is ${perm.refund_fee}`);
         const refundAmount = Amounts.parseOrThrow(perm.refund_amount);
@@ -480,7 +485,9 @@ async function processPurchaseApplyRefundImpl(
         c.status = CoinStatus.Dormant;
         c.currentAmount = Amounts.add(c.currentAmount, refundAmount).amount;
         c.currentAmount = Amounts.sub(c.currentAmount, refundFee).amount;
-        logger.trace(`coin amount after is 
${Amounts.toString(c.currentAmount)}`)
+        logger.trace(
+          `coin amount after is ${Amounts.toString(c.currentAmount)}`,
+        );
         await tx.put(Stores.coins, c);
       };
 
@@ -511,7 +518,7 @@ async function processPurchaseApplyRefundImpl(
       for (const g of Object.keys(groups)) {
         let groupDone = true;
         for (const pk of Object.keys(p.refundState.refundsPending)) {
-          const r  = p.refundState.refundsPending[pk];
+          const r = p.refundState.refundsPending[pk];
           if (r.refundGroupId == g) {
             groupDone = false;
           }
@@ -521,7 +528,7 @@ async function processPurchaseApplyRefundImpl(
             proposalId,
             refundGroupId: g,
             timestamp: now,
-          }
+          };
           await tx.put(Stores.refundEvents, refundEvent);
         }
       }
@@ -533,8 +540,7 @@ async function processPurchaseApplyRefundImpl(
       }
       await tx.put(Stores.purchases, p);
       const coinsPubsToBeRefreshed = Object.values(refreshCoinsMap);
-      if (coinsPubsToBeRefreshed.length > 0)
-      {
+      if (coinsPubsToBeRefreshed.length > 0) {
         await createRefreshGroup(
           tx,
           coinsPubsToBeRefreshed,
diff --git a/src/operations/reserves.ts b/src/operations/reserves.ts
index c0e22b3c..5cf189d3 100644
--- a/src/operations/reserves.ts
+++ b/src/operations/reserves.ts
@@ -65,7 +65,7 @@ import { getTimestampNow } from "../util/time";
 const logger = new Logger("reserves.ts");
 
 async function resetReserveRetry(ws: InternalWalletState, reservePub: string) {
-  await ws.db.mutate(Stores.reserves, reservePub, x => {
+  await ws.db.mutate(Stores.reserves, reservePub, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
     }
@@ -156,7 +156,7 @@ export async function createReserve(
 
   const resp = await ws.db.runWithWriteTransaction(
     [Stores.currencies, Stores.reserves, Stores.bankWithdrawUris],
-    async tx => {
+    async (tx) => {
       // Check if we have already created a reserve for that 
bankWithdrawStatusUrl
       if (reserveRecord.bankWithdrawStatusUrl) {
         const bwi = await tx.get(
@@ -194,7 +194,7 @@ export async function createReserve(
 
   // Asynchronously process the reserve, but return
   // to the caller already.
-  processReserve(ws, resp.reservePub, true).catch(e => {
+  processReserve(ws, resp.reservePub, true).catch((e) => {
     console.error("Processing reserve (after createReserve) failed:", e);
   });
 
@@ -208,7 +208,7 @@ export async function forceQueryReserve(
   ws: InternalWalletState,
   reservePub: string,
 ): Promise<void> {
-  await ws.db.runWithWriteTransaction([Stores.reserves], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.reserves], async (tx) => {
     const reserve = await tx.get(Stores.reserves, reservePub);
     if (!reserve) {
       return;
@@ -275,7 +275,7 @@ async function registerReserveWithBank(
     reserve_pub: reservePub,
     selected_exchange: reserve.exchangeWire,
   });
-  await ws.db.mutate(Stores.reserves, reservePub, r => {
+  await ws.db.mutate(Stores.reserves, reservePub, (r) => {
     switch (r.reserveStatus) {
       case ReserveRecordStatus.REGISTERING_BANK:
       case ReserveRecordStatus.WAIT_CONFIRM_BANK:
@@ -349,7 +349,7 @@ async function processReserveBankStatusImpl(
   }
 
   if (status.transfer_done) {
-    await ws.db.mutate(Stores.reserves, reservePub, r => {
+    await ws.db.mutate(Stores.reserves, reservePub, (r) => {
       switch (r.reserveStatus) {
         case ReserveRecordStatus.REGISTERING_BANK:
         case ReserveRecordStatus.WAIT_CONFIRM_BANK:
@@ -365,7 +365,7 @@ async function processReserveBankStatusImpl(
     });
     await processReserveImpl(ws, reservePub, true);
   } else {
-    await ws.db.mutate(Stores.reserves, reservePub, r => {
+    await ws.db.mutate(Stores.reserves, reservePub, (r) => {
       switch (r.reserveStatus) {
         case ReserveRecordStatus.WAIT_CONFIRM_BANK:
           break;
@@ -385,7 +385,7 @@ async function incrementReserveRetry(
   reservePub: string,
   err: OperationError | undefined,
 ): Promise<void> {
-  await ws.db.runWithWriteTransaction([Stores.reserves], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.reserves], async (tx) => {
     const r = await tx.get(Stores.reserves, reservePub);
     if (!r) {
       return;
@@ -462,7 +462,7 @@ async function updateReserve(
   const balance = Amounts.parseOrThrow(reserveInfo.balance);
   await ws.db.runWithWriteTransaction(
     [Stores.reserves, Stores.reserveUpdatedEvents],
-    async tx => {
+    async (tx) => {
       const r = await tx.get(Stores.reserves, reservePub);
       if (!r) {
         return;
@@ -501,8 +501,7 @@ async function updateReserve(
         if (cmp == 0) {
           // Nothing changed, go back to sleep!
           r.reserveStatus = ReserveRecordStatus.DORMANT;
-        }
-        else if (cmp > 0) {
+        } else if (cmp > 0) {
           const extra = Amounts.sub(balance, expectedBalance.amount).amount;
           r.amountWithdrawRemaining = Amounts.add(
             r.amountWithdrawRemaining,
@@ -591,7 +590,7 @@ export async function confirmReserve(
   req: ConfirmReserveRequest,
 ): Promise<void> {
   const now = getTimestampNow();
-  await ws.db.mutate(Stores.reserves, req.reservePub, reserve => {
+  await ws.db.mutate(Stores.reserves, req.reservePub, (reserve) => {
     if (reserve.reserveStatus !== ReserveRecordStatus.UNCONFIRMED) {
       return;
     }
@@ -603,7 +602,7 @@ export async function confirmReserve(
 
   ws.notify({ type: NotificationType.ReserveUpdated });
 
-  processReserve(ws, req.reservePub, true).catch(e => {
+  processReserve(ws, req.reservePub, true).catch((e) => {
     console.log("processing reserve (after confirmReserve) failed:", e);
   });
 }
@@ -653,7 +652,7 @@ async function depleteReserve(
 
   const withdrawalSessionId = encodeCrock(randomBytes(32));
 
-  const totalCoinValue = Amounts.sum(denomsForWithdraw.map(x => x.value))
+  const totalCoinValue = Amounts.sum(denomsForWithdraw.map((x) => x.value))
     .amount;
 
   const withdrawalRecord: WithdrawalSessionRecord = {
@@ -665,9 +664,9 @@ async function depleteReserve(
     },
     rawWithdrawalAmount: withdrawAmount,
     timestampStart: getTimestampNow(),
-    denoms: denomsForWithdraw.map(x => x.denomPub),
-    withdrawn: denomsForWithdraw.map(x => false),
-    planchets: denomsForWithdraw.map(x => undefined),
+    denoms: denomsForWithdraw.map((x) => x.denomPub),
+    withdrawn: denomsForWithdraw.map((x) => false),
+    planchets: denomsForWithdraw.map((x) => undefined),
     totalCoinValue,
     retryInfo: initRetryInfo(),
     lastErrorPerCoin: {},
@@ -675,7 +674,7 @@ async function depleteReserve(
   };
 
   const totalCoinWithdrawFee = Amounts.sum(
-    denomsForWithdraw.map(x => x.feeWithdraw),
+    denomsForWithdraw.map((x) => x.feeWithdraw),
   ).amount;
   const totalWithdrawAmount = Amounts.add(totalCoinValue, totalCoinWithdrawFee)
     .amount;
@@ -706,7 +705,7 @@ async function depleteReserve(
 
   const success = await ws.db.runWithWriteTransaction(
     [Stores.withdrawalSession, Stores.reserves],
-    async tx => {
+    async (tx) => {
       const myReserve = await tx.get(Stores.reserves, reservePub);
       if (!myReserve) {
         return false;
diff --git a/src/operations/state.ts b/src/operations/state.ts
index ae32db2b..f571fe93 100644
--- a/src/operations/state.ts
+++ b/src/operations/state.ts
@@ -15,10 +15,7 @@
  */
 
 import { HttpRequestLibrary } from "../util/http";
-import {
-  NextUrlResult,
-  WalletBalance,
-} from "../types/walletTypes";
+import { NextUrlResult, WalletBalance } from "../types/walletTypes";
 import { CryptoApi, CryptoWorkerFactory } from "../crypto/workers/cryptoApi";
 import { AsyncOpMemoMap, AsyncOpMemoSingle } from "../util/asyncMemo";
 import { Logger } from "../util/logging";
diff --git a/src/operations/tip.ts b/src/operations/tip.ts
index fcdda076..3636dd24 100644
--- a/src/operations/tip.ts
+++ b/src/operations/tip.ts
@@ -16,10 +16,7 @@
 
 import { InternalWalletState } from "./state";
 import { parseTipUri } from "../util/taleruri";
-import {
-  TipStatus,
-  OperationError,
-} from "../types/walletTypes";
+import { TipStatus, OperationError } from "../types/walletTypes";
 import {
   TipPickupGetResponse,
   TipPlanchetDetail,
@@ -130,7 +127,7 @@ async function incrementTipRetry(
   refreshSessionId: string,
   err: OperationError | undefined,
 ): Promise<void> {
-  await ws.db.runWithWriteTransaction([Stores.tips], async tx => {
+  await ws.db.runWithWriteTransaction([Stores.tips], async (tx) => {
     const t = await tx.get(Stores.tips, refreshSessionId);
     if (!t) {
       return;
@@ -162,7 +159,7 @@ async function resetTipRetry(
   ws: InternalWalletState,
   tipId: string,
 ): Promise<void> {
-  await ws.db.mutate(Stores.tips, tipId, x => {
+  await ws.db.mutate(Stores.tips, tipId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
     }
@@ -197,10 +194,10 @@ async function processTipImpl(
     );
 
     const planchets = await Promise.all(
-      denomsForWithdraw.map(d => ws.cryptoApi.createTipPlanchet(d)),
+      denomsForWithdraw.map((d) => ws.cryptoApi.createTipPlanchet(d)),
     );
 
-    await ws.db.mutate(Stores.tips, tipId, r => {
+    await ws.db.mutate(Stores.tips, tipId, (r) => {
       if (!r.planchets) {
         r.planchets = planchets;
       }
@@ -220,7 +217,7 @@ async function processTipImpl(
   console.log("got planchets for tip!");
 
   // Planchets in the form that the merchant expects
-  const planchetsDetail: TipPlanchetDetail[] = tipRecord.planchets.map(p => ({
+  const planchetsDetail: TipPlanchetDetail[] = tipRecord.planchets.map((p) => 
({
     coin_ev: p.coinEv,
     denom_pub_hash: p.denomPubHash,
   }));
@@ -269,7 +266,7 @@ async function processTipImpl(
   const withdrawalSessionId = encodeCrock(getRandomBytes(32));
 
   const withdrawalSession: WithdrawalSessionRecord = {
-    denoms: planchets.map(x => x.denomPub),
+    denoms: planchets.map((x) => x.denomPub),
     exchangeBaseUrl: tipRecord.exchangeUrl,
     planchets: planchets,
     source: {
@@ -279,8 +276,8 @@ async function processTipImpl(
     timestampStart: getTimestampNow(),
     withdrawSessionId: withdrawalSessionId,
     rawWithdrawalAmount: tipRecord.amount,
-    withdrawn: planchets.map(x => false),
-    totalCoinValue: Amounts.sum(planchets.map(p => p.coinValue)).amount,
+    withdrawn: planchets.map((x) => false),
+    totalCoinValue: Amounts.sum(planchets.map((p) => p.coinValue)).amount,
     lastErrorPerCoin: {},
     retryInfo: initRetryInfo(),
     timestampFinish: undefined,
@@ -289,7 +286,7 @@ async function processTipImpl(
 
   await ws.db.runWithWriteTransaction(
     [Stores.tips, Stores.withdrawalSession],
-    async tx => {
+    async (tx) => {
       const tr = await tx.get(Stores.tips, tipId);
       if (!tr) {
         return;
diff --git a/src/operations/versions.ts b/src/operations/versions.ts
index 6ac78f01..8b55bd4d 100644
--- a/src/operations/versions.ts
+++ b/src/operations/versions.ts
@@ -26,7 +26,7 @@ export const WALLET_EXCHANGE_PROTOCOL_VERSION = "7:0:0";
  * Cache breaker that is appended to queries such as /keys and /wire
  * to break through caching, if it has been accidentally/badly configured
  * by the exchange.
- * 
- * This is only a temporary measure. 
+ *
+ * This is only a temporary measure.
  */
-export const WALLET_CACHE_BREAKER_CLIENT_VERSION = "3";
\ No newline at end of file
+export const WALLET_CACHE_BREAKER_CLIENT_VERSION = "3";
diff --git a/src/operations/withdraw.ts b/src/operations/withdraw.ts
index 37993023..4d8af9fc 100644
--- a/src/operations/withdraw.ts
+++ b/src/operations/withdraw.ts
@@ -144,7 +144,7 @@ async function getPossibleDenoms(
 ): Promise<DenominationRecord[]> {
   return await ws.db
     .iterIndex(Stores.denominations.exchangeBaseUrlIndex, exchangeBaseUrl)
-    .filter(d => {
+    .filter((d) => {
       return (
         (d.status === DenominationStatus.Unverified ||
           d.status === DenominationStatus.VerifiedGood) &&
@@ -248,7 +248,7 @@ async function processPlanchet(
 
   const success = await ws.db.runWithWriteTransaction(
     [Stores.coins, Stores.withdrawalSession, Stores.reserves],
-    async tx => {
+    async (tx) => {
       const ws = await tx.get(Stores.withdrawalSession, withdrawalSessionId);
       if (!ws) {
         return false;
@@ -429,17 +429,20 @@ async function makePlanchet(
     reservePub: r.reservePub,
     withdrawSig: r.withdrawSig,
   };
-  await ws.db.runWithWriteTransaction([Stores.withdrawalSession], async tx => {
-    const myWs = await tx.get(Stores.withdrawalSession, withdrawalSessionId);
-    if (!myWs) {
-      return;
-    }
-    if (myWs.planchets[coinIndex]) {
-      return;
-    }
-    myWs.planchets[coinIndex] = newPlanchet;
-    await tx.put(Stores.withdrawalSession, myWs);
-  });
+  await ws.db.runWithWriteTransaction(
+    [Stores.withdrawalSession],
+    async (tx) => {
+      const myWs = await tx.get(Stores.withdrawalSession, withdrawalSessionId);
+      if (!myWs) {
+        return;
+      }
+      if (myWs.planchets[coinIndex]) {
+        return;
+      }
+      myWs.planchets[coinIndex] = newPlanchet;
+      await tx.put(Stores.withdrawalSession, myWs);
+    },
+  );
 }
 
 async function processWithdrawCoin(
@@ -483,19 +486,22 @@ async function incrementWithdrawalRetry(
   withdrawalSessionId: string,
   err: OperationError | undefined,
 ): Promise<void> {
-  await ws.db.runWithWriteTransaction([Stores.withdrawalSession], async tx => {
-    const wsr = await tx.get(Stores.withdrawalSession, withdrawalSessionId);
-    if (!wsr) {
-      return;
-    }
-    if (!wsr.retryInfo) {
-      return;
-    }
-    wsr.retryInfo.retryCounter++;
-    updateRetryInfoTimeout(wsr.retryInfo);
-    wsr.lastError = err;
-    await tx.put(Stores.withdrawalSession, wsr);
-  });
+  await ws.db.runWithWriteTransaction(
+    [Stores.withdrawalSession],
+    async (tx) => {
+      const wsr = await tx.get(Stores.withdrawalSession, withdrawalSessionId);
+      if (!wsr) {
+        return;
+      }
+      if (!wsr.retryInfo) {
+        return;
+      }
+      wsr.retryInfo.retryCounter++;
+      updateRetryInfoTimeout(wsr.retryInfo);
+      wsr.lastError = err;
+      await tx.put(Stores.withdrawalSession, wsr);
+    },
+  );
   ws.notify({ type: NotificationType.WithdrawOperationError });
 }
 
@@ -516,7 +522,7 @@ async function resetWithdrawSessionRetry(
   ws: InternalWalletState,
   withdrawalSessionId: string,
 ) {
-  await ws.db.mutate(Stores.withdrawalSession, withdrawalSessionId, x => {
+  await ws.db.mutate(Stores.withdrawalSession, withdrawalSessionId, (x) => {
     if (x.retryInfo.active) {
       x.retryInfo = initRetryInfo();
     }
@@ -594,12 +600,14 @@ export async function getExchangeWithdrawalInfo(
 
   const possibleDenoms = await ws.db
     .iterIndex(Stores.denominations.exchangeBaseUrlIndex, baseUrl)
-    .filter(d => d.isOffered);
+    .filter((d) => d.isOffered);
 
   const trustedAuditorPubs = [];
   const currencyRecord = await ws.db.get(Stores.currencies, amount.currency);
   if (currencyRecord) {
-    trustedAuditorPubs.push(...currencyRecord.auditors.map(a => a.auditorPub));
+    trustedAuditorPubs.push(
+      ...currencyRecord.auditors.map((a) => a.auditorPub),
+    );
   }
 
   let versionMatch;
diff --git a/src/types/dbTypes.ts b/src/types/dbTypes.ts
index 5a0a653e..db71db71 100644
--- a/src/types/dbTypes.ts
+++ b/src/types/dbTypes.ts
@@ -1370,7 +1370,7 @@ export interface BankWithdrawUriRecord {
 
 /**
  * Status of recoup operations that were grouped together.
- * 
+ *
  * The remaining amount of involved coins should be set to zero
  * in the same transaction that inserts the RecoupGroupRecord.
  */
@@ -1387,7 +1387,7 @@ export interface RecoupGroupRecord {
   /**
    * Public keys that identify the coins being recouped
    * as part of this session.
-   * 
+   *
    * (Structured like this to enable multiEntry indexing in IndexedDB.)
    */
   coinPubs: string[];
diff --git a/src/types/history.ts b/src/types/history.ts
index 976788fc..f4f3872c 100644
--- a/src/types/history.ts
+++ b/src/types/history.ts
@@ -18,9 +18,9 @@
  * Type and schema definitions for the wallet's history.
  */
 
- /**
-  * Imports.
-  */
+/**
+ * Imports.
+ */
 import { RefreshReason } from "./walletTypes";
 import { ReserveTransaction } from "./ReserveTransaction";
 import { WithdrawalSource } from "./dbTypes";
diff --git a/src/types/schemacore.ts b/src/types/schemacore.ts
index c709e3d7..820f68d1 100644
--- a/src/types/schemacore.ts
+++ b/src/types/schemacore.ts
@@ -17,7 +17,7 @@
 /**
  * Core of the wallet's schema, used for painless export, import
  * and schema migration.
- * 
+ *
  * If this schema is extended, it must be extended in a completely
  * backwards-compatible way.
  */
@@ -55,4 +55,4 @@ interface SchemaCore {
    * Schema version of the database that has been exported to the core schema
    */
   versionSourceDatabase: number;
-}
\ No newline at end of file
+}
diff --git a/src/types/types-test.ts b/src/types/types-test.ts
index 67d379f7..885371a1 100644
--- a/src/types/types-test.ts
+++ b/src/types/types-test.ts
@@ -24,7 +24,7 @@ const amt = (
   currency: string,
 ): Amounts.AmountJson => ({ value, fraction, currency });
 
-test("amount addition (simple)", t => {
+test("amount addition (simple)", (t) => {
   const a1 = amt(1, 0, "EUR");
   const a2 = amt(1, 0, "EUR");
   const a3 = amt(2, 0, "EUR");
@@ -32,14 +32,14 @@ test("amount addition (simple)", t => {
   t.pass();
 });
 
-test("amount addition (saturation)", t => {
+test("amount addition (saturation)", (t) => {
   const a1 = amt(1, 0, "EUR");
   const res = Amounts.add(amt(Amounts.maxAmountValue, 0, "EUR"), a1);
   t.true(res.saturated);
   t.pass();
 });
 
-test("amount subtraction (simple)", t => {
+test("amount subtraction (simple)", (t) => {
   const a1 = amt(2, 5, "EUR");
   const a2 = amt(1, 0, "EUR");
   const a3 = amt(1, 5, "EUR");
@@ -47,7 +47,7 @@ test("amount subtraction (simple)", t => {
   t.pass();
 });
 
-test("amount subtraction (saturation)", t => {
+test("amount subtraction (saturation)", (t) => {
   const a1 = amt(0, 0, "EUR");
   const a2 = amt(1, 0, "EUR");
   let res = Amounts.sub(a1, a2);
@@ -57,7 +57,7 @@ test("amount subtraction (saturation)", t => {
   t.pass();
 });
 
-test("amount comparison", t => {
+test("amount comparison", (t) => {
   t.is(Amounts.cmp(amt(1, 0, "EUR"), amt(1, 0, "EUR")), 0);
   t.is(Amounts.cmp(amt(1, 1, "EUR"), amt(1, 0, "EUR")), 1);
   t.is(Amounts.cmp(amt(1, 1, "EUR"), amt(1, 2, "EUR")), -1);
@@ -68,7 +68,7 @@ test("amount comparison", t => {
   t.pass();
 });
 
-test("amount parsing", t => {
+test("amount parsing", (t) => {
   t.is(
     Amounts.cmp(Amounts.parseOrThrow("TESTKUDOS:0"), amt(0, 0, "TESTKUDOS")),
     0,
@@ -117,7 +117,7 @@ test("amount parsing", t => {
   t.pass();
 });
 
-test("amount stringification", t => {
+test("amount stringification", (t) => {
   t.is(Amounts.toString(amt(0, 0, "TESTKUDOS")), "TESTKUDOS:0");
   t.is(Amounts.toString(amt(4, 94000000, "TESTKUDOS")), "TESTKUDOS:4.94");
   t.is(Amounts.toString(amt(0, 10000000, "TESTKUDOS")), "TESTKUDOS:0.1");
@@ -128,7 +128,7 @@ test("amount stringification", t => {
   t.pass();
 });
 
-test("contract terms validation", t => {
+test("contract terms validation", (t) => {
   const c = {
     nonce: "123123123",
     h_wire: "123",
diff --git a/src/types/walletTypes.ts b/src/types/walletTypes.ts
index c6473a9b..7b58ba50 100644
--- a/src/types/walletTypes.ts
+++ b/src/types/walletTypes.ts
@@ -20,7 +20,7 @@
  * These types are defined in a separate file make tree shaking easier, since
  * some components use these types (via RPC) but do not depend on the wallet
  * code directly.
- * 
+ *
  * @author Florian Dold <address@hidden>
  */
 
@@ -317,7 +317,6 @@ export class ReturnCoinsRequest {
   static checked: (obj: any) => ReturnCoinsRequest;
 }
 
-
 /**
  * Status of processing a tip.
  */
diff --git a/src/util/RequestThrottler.ts b/src/util/RequestThrottler.ts
index 0566306d..c99c7e94 100644
--- a/src/util/RequestThrottler.ts
+++ b/src/util/RequestThrottler.ts
@@ -21,7 +21,12 @@
 /**
  * Imports.
  */
-import { getTimestampNow, Timestamp, timestampSubtractDuraction, 
timestampDifference } from "../util/time";
+import {
+  getTimestampNow,
+  Timestamp,
+  timestampSubtractDuraction,
+  timestampDifference,
+} from "../util/time";
 
 /**
  * Maximum request per second, per origin.
@@ -38,7 +43,6 @@ const MAX_PER_MINUTE = 100;
  */
 const MAX_PER_HOUR = 1000;
 
-
 /**
  * Throttling state for one origin.
  */
@@ -52,12 +56,21 @@ class OriginState {
     const now = getTimestampNow();
     const d = timestampDifference(now, this.lastUpdate);
     if (d.d_ms === "forever") {
-      throw Error("assertion failed")
+      throw Error("assertion failed");
     }
     const d_s = d.d_ms / 1000;
-    this.tokensSecond = Math.min(MAX_PER_SECOND, this.tokensSecond + (d_s / 
1000));
-    this.tokensMinute = Math.min(MAX_PER_MINUTE, this.tokensMinute + (d_s / 
1000 * 60));
-    this.tokensHour = Math.min(MAX_PER_HOUR, this.tokensHour + (d_s / 1000 * 
60 * 60));
+    this.tokensSecond = Math.min(
+      MAX_PER_SECOND,
+      this.tokensSecond + d_s / 1000,
+    );
+    this.tokensMinute = Math.min(
+      MAX_PER_MINUTE,
+      this.tokensMinute + (d_s / 1000) * 60,
+    );
+    this.tokensHour = Math.min(
+      MAX_PER_HOUR,
+      this.tokensHour + (d_s / 1000) * 60 * 60,
+    );
     this.lastUpdate = now;
   }
 
@@ -104,13 +117,13 @@ export class RequestThrottler {
     if (s) {
       return s;
     }
-    const ns = this.perOriginInfo[origin] = new OriginState();
+    const ns = (this.perOriginInfo[origin] = new OriginState());
     return ns;
   }
 
   /**
    * Apply throttling to a request.
-   * 
+   *
    * @returns whether the request should be throttled.
    */
   applyThrottle(requestUrl: string): boolean {
diff --git a/src/util/assertUnreachable.ts b/src/util/assertUnreachable.ts
index 90f2476b..ffdf88f0 100644
--- a/src/util/assertUnreachable.ts
+++ b/src/util/assertUnreachable.ts
@@ -16,4 +16,4 @@
 
 export function assertUnreachable(x: never): never {
   throw new Error("Didn't expect to get here");
-}
\ No newline at end of file
+}
diff --git a/src/util/asyncMemo.ts b/src/util/asyncMemo.ts
index 17204a88..84fe6b80 100644
--- a/src/util/asyncMemo.ts
+++ b/src/util/asyncMemo.ts
@@ -40,9 +40,9 @@ export class AsyncOpMemoMap<T> {
     // Wrap the operation in case it immediately throws
     const p = Promise.resolve().then(() => pg());
     this.memoMap[key] = {
-     p,
-     n,
-     t: new Date().getTime(),
+      p,
+      n,
+      t: new Date().getTime(),
     };
     return p.finally(() => {
       this.cleanUp(key, n);
@@ -53,7 +53,6 @@ export class AsyncOpMemoMap<T> {
   }
 }
 
-
 export class AsyncOpMemoSingle<T> {
   private n = 0;
   private memoEntry: MemoEntry<T> | undefined;
diff --git a/src/util/codec-test.ts b/src/util/codec-test.ts
index 7c7c93c7..e25a9d3c 100644
--- a/src/util/codec-test.ts
+++ b/src/util/codec-test.ts
@@ -19,7 +19,13 @@
  */
 
 import test from "ava";
-import { Codec, makeCodecForObject, makeCodecForConstString, codecForString, 
makeCodecForUnion } from "./codec";
+import {
+  Codec,
+  makeCodecForObject,
+  makeCodecForConstString,
+  codecForString,
+  makeCodecForUnion,
+} from "./codec";
 
 interface MyObj {
   foo: string;
@@ -37,7 +43,7 @@ interface AltTwo {
 
 type MyUnion = AltOne | AltTwo;
 
-test("basic codec", t => {
+test("basic codec", (t) => {
   const myObjCodec = makeCodecForObject<MyObj>()
     .property("foo", codecForString)
     .build("MyObj");
@@ -49,7 +55,7 @@ test("basic codec", t => {
   });
 });
 
-test("union", t => {
+test("union", (t) => {
   const altOneCodec: Codec<AltOne> = makeCodecForObject<AltOne>()
     .property("type", makeCodecForConstString("one"))
     .property("foo", codecForString)
diff --git a/src/util/codec.ts b/src/util/codec.ts
index 09fa9f95..a8f49523 100644
--- a/src/util/codec.ts
+++ b/src/util/codec.ts
@@ -110,7 +110,8 @@ class ObjectCodecBuilder<OutputType, PartialOutputType> {
           throw new DecodingError(
             `expected object for ${objectDisplayName} at ${renderContext(
               c,
-            )} but got ${typeof x}`)
+            )} but got ${typeof x}`,
+          );
         }
         const obj: any = {};
         for (const prop of propList) {
@@ -273,7 +274,9 @@ export const codecForNumber: Codec<number> = {
     if (typeof x === "number") {
       return x;
     }
-    throw new DecodingError(`expected number at ${renderContext(c)} but got 
${typeof x}`);
+    throw new DecodingError(
+      `expected number at ${renderContext(c)} but got ${typeof x}`,
+    );
   },
 };
 
@@ -285,7 +288,9 @@ export const codecForBoolean: Codec<boolean> = {
     if (typeof x === "boolean") {
       return x;
     }
-    throw new DecodingError(`expected boolean at ${renderContext(c)} but got 
${typeof x}`);
+    throw new DecodingError(
+      `expected boolean at ${renderContext(c)} but got ${typeof x}`,
+    );
   },
 };
 
@@ -297,7 +302,9 @@ export const codecForString: Codec<string> = {
     if (typeof x === "string") {
       return x;
     }
-    throw new DecodingError(`expected string at ${renderContext(c)} but got 
${typeof x}`);
+    throw new DecodingError(
+      `expected string at ${renderContext(c)} but got ${typeof x}`,
+    );
   },
 };
 
@@ -320,21 +327,25 @@ export function makeCodecForConstString<V extends 
string>(s: V): Codec<V> {
         return x;
       }
       throw new DecodingError(
-        `expected string constant "${s}" at ${renderContext(c)}  but got 
${typeof x}`,
+        `expected string constant "${s}" at ${renderContext(
+          c,
+        )}  but got ${typeof x}`,
       );
     },
   };
 }
 
-export function makeCodecOptional<V>(innerCodec: Codec<V>): Codec<V | 
undefined> {
+export function makeCodecOptional<V>(
+  innerCodec: Codec<V>,
+): Codec<V | undefined> {
   return {
     decode(x: any, c?: Context): V | undefined {
       if (x === undefined || x === null) {
         return undefined;
       }
       return innerCodec.decode(x, c);
-    }
-  }
+    },
+  };
 }
 
 export function typecheckedCodec<T = undefined>(c: Codec<T>): Codec<T> {
diff --git a/src/util/helpers-test.ts b/src/util/helpers-test.ts
index 74817120..35f3d87b 100644
--- a/src/util/helpers-test.ts
+++ b/src/util/helpers-test.ts
@@ -14,25 +14,26 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-
 import test from "ava";
 import * as helpers from "./helpers";
 
-
 test("URL canonicalization", (t) => {
   // converts to relative, adds https
   t.is(
     "https://alice.example.com/exchange/";,
-    helpers.canonicalizeBaseUrl("alice.example.com/exchange"));
+    helpers.canonicalizeBaseUrl("alice.example.com/exchange"),
+  );
 
   // keeps http, adds trailing slash
   t.is(
     "http://alice.example.com/exchange/";,
-    helpers.canonicalizeBaseUrl("http://alice.example.com/exchange";));
+    helpers.canonicalizeBaseUrl("http://alice.example.com/exchange";),
+  );
 
   // keeps http, adds trailing slash
   t.is(
     "http://alice.example.com/exchange/";,
-    helpers.canonicalizeBaseUrl("http://alice.example.com/exchange#foobar";));
+    helpers.canonicalizeBaseUrl("http://alice.example.com/exchange#foobar";),
+  );
   t.pass();
 });
diff --git a/src/util/helpers.ts b/src/util/helpers.ts
index 722688d3..130dcdae 100644
--- a/src/util/helpers.ts
+++ b/src/util/helpers.ts
@@ -34,7 +34,6 @@ export function amountToPretty(amount: AmountJson): string {
   return `${x} ${amount.currency}`;
 }
 
-
 /**
  * Canonicalize a base url, typically for the exchange.
  *
@@ -53,7 +52,6 @@ export function canonicalizeBaseUrl(url: string) {
   return x.href;
 }
 
-
 /**
  * Convert object to JSON with canonical ordering of keys
  * and whitespace omitted.
@@ -84,7 +82,6 @@ export function canonicalJson(obj: any): string {
   return s + "}";
 }
 
-
 /**
  * Check for deep equality of two objects.
  * Only arrays, objects and primitives are supported.
@@ -99,11 +96,12 @@ export function deepEquals(x: any, y: any): boolean {
   }
 
   const p = Object.keys(x);
-  return Object.keys(y).every((i) => p.indexOf(i) !== -1) &&
-    p.every((i) => deepEquals(x[i], y[i]));
+  return (
+    Object.keys(y).every((i) => p.indexOf(i) !== -1) &&
+    p.every((i) => deepEquals(x[i], y[i]))
+  );
 }
 
-
 /**
  * Map from a collection to a list or results and then
  * concatenate the results.
@@ -125,12 +123,11 @@ export function hash(val: any): number {
   }
 
   /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed
-  * integers. Since we want the results to be always positive, convert the
-  * signed int to an unsigned by doing an unsigned bitshift. */
+   * integers. Since we want the results to be always positive, convert the
+   * signed int to an unsigned by doing an unsigned bitshift. */
   return h >>> 0;
 }
 
-
 /**
  * Lexically compare two strings.
  */
@@ -146,10 +143,10 @@ export function strcmp(s1: string, s2: string): number {
 
 /**
  * Run a function and return its result.
- * 
+ *
  * Used as a nicer-looking way to do immediately invoked function
  * expressions (IFFEs).
  */
 export function runBlock<T>(f: () => T) {
   return f();
-}
\ No newline at end of file
+}
diff --git a/src/util/http.ts b/src/util/http.ts
index 93c748d7..1a5cb85f 100644
--- a/src/util/http.ts
+++ b/src/util/http.ts
@@ -101,12 +101,12 @@ export class BrowserHttpLib implements HttpRequestLibrary 
{
         myRequest.send();
       }
 
-      myRequest.onerror = e => {
+      myRequest.onerror = (e) => {
         console.error("http request error");
         reject(Error("could not make XMLHttpRequest"));
       };
 
-      myRequest.addEventListener("readystatechange", e => {
+      myRequest.addEventListener("readystatechange", (e) => {
         if (myRequest.readyState === XMLHttpRequest.DONE) {
           if (myRequest.status === 0) {
             reject(
@@ -134,7 +134,7 @@ export class BrowserHttpLib implements HttpRequestLibrary {
 
           // Create a map of header names to values
           const headerMap = new Headers();
-          arr.forEach(function(line) {
+          arr.forEach(function (line) {
             const parts = line.split(": ");
             const header = parts.shift();
             const value = parts.join(": ");
diff --git a/src/util/libtoolVersion-test.ts b/src/util/libtoolVersion-test.ts
index 0a610e45..e58e9475 100644
--- a/src/util/libtoolVersion-test.ts
+++ b/src/util/libtoolVersion-test.ts
@@ -19,12 +19,30 @@ import * as LibtoolVersion from "./libtoolVersion";
 import test from "ava";
 
 test("version comparison", (t) => {
-  t.deepEqual(LibtoolVersion.compare("0:0:0", "0:0:0"), {compatible: true, 
currentCmp: 0});
+  t.deepEqual(LibtoolVersion.compare("0:0:0", "0:0:0"), {
+    compatible: true,
+    currentCmp: 0,
+  });
   t.deepEqual(LibtoolVersion.compare("0:0:0", ""), undefined);
   t.deepEqual(LibtoolVersion.compare("foo", "0:0:0"), undefined);
-  t.deepEqual(LibtoolVersion.compare("0:0:0", "1:0:1"), {compatible: true, 
currentCmp: -1});
-  t.deepEqual(LibtoolVersion.compare("0:0:0", "1:5:1"), {compatible: true, 
currentCmp: -1});
-  t.deepEqual(LibtoolVersion.compare("0:0:0", "1:5:0"), {compatible: false, 
currentCmp: -1});
-  t.deepEqual(LibtoolVersion.compare("1:0:0", "0:5:0"), {compatible: false, 
currentCmp: 1});
-  t.deepEqual(LibtoolVersion.compare("1:0:1", "1:5:1"), {compatible: true, 
currentCmp: 0});
+  t.deepEqual(LibtoolVersion.compare("0:0:0", "1:0:1"), {
+    compatible: true,
+    currentCmp: -1,
+  });
+  t.deepEqual(LibtoolVersion.compare("0:0:0", "1:5:1"), {
+    compatible: true,
+    currentCmp: -1,
+  });
+  t.deepEqual(LibtoolVersion.compare("0:0:0", "1:5:0"), {
+    compatible: false,
+    currentCmp: -1,
+  });
+  t.deepEqual(LibtoolVersion.compare("1:0:0", "0:5:0"), {
+    compatible: false,
+    currentCmp: 1,
+  });
+  t.deepEqual(LibtoolVersion.compare("1:0:1", "1:5:1"), {
+    compatible: true,
+    currentCmp: 0,
+  });
 });
diff --git a/src/util/libtoolVersion.ts b/src/util/libtoolVersion.ts
index cc2435b9..5e9d0b74 100644
--- a/src/util/libtoolVersion.ts
+++ b/src/util/libtoolVersion.ts
@@ -19,7 +19,6 @@
  * See 
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
  */
 
-
 /**
  * Result of comparing two libtool versions.
  */
@@ -44,7 +43,10 @@ interface Version {
 /**
  * Compare two libtool-style version strings.
  */
-export function compare(me: string, other: string): 
VersionMatchResult|undefined {
+export function compare(
+  me: string,
+  other: string,
+): VersionMatchResult | undefined {
   const meVer = parseVersion(me);
   const otherVer = parseVersion(other);
 
@@ -52,16 +54,16 @@ export function compare(me: string, other: string): 
VersionMatchResult|undefined
     return undefined;
   }
 
-  const compatible = (meVer.current - meVer.age <= otherVer.current &&
-                      meVer.current >= (otherVer.current - otherVer.age));
+  const compatible =
+    meVer.current - meVer.age <= otherVer.current &&
+    meVer.current >= otherVer.current - otherVer.age;
 
   const currentCmp = Math.sign(meVer.current - otherVer.current);
 
-  return {compatible, currentCmp};
+  return { compatible, currentCmp };
 }
 
-
-function parseVersion(v: string): Version|undefined {
+function parseVersion(v: string): Version | undefined {
   const [currentStr, revisionStr, ageStr, ...rest] = v.split(":");
   if (rest.length !== 0) {
     return undefined;
@@ -82,5 +84,5 @@ function parseVersion(v: string): Version|undefined {
     return undefined;
   }
 
-  return {current, revision, age};
+  return { current, revision, age };
 }
diff --git a/src/util/payto-test.ts b/src/util/payto-test.ts
index 82daff16..01280b65 100644
--- a/src/util/payto-test.ts
+++ b/src/util/payto-test.ts
@@ -28,4 +28,4 @@ test("basic payto parsing", (t) => {
   const r3 = parsePaytoUri("payto://x-taler-bank/123");
   t.is(r3?.targetType, "x-taler-bank");
   t.is(r3?.targetPath, "123");
-});
\ No newline at end of file
+});
diff --git a/src/util/payto.ts b/src/util/payto.ts
index 0926fdee..ac5bc0c7 100644
--- a/src/util/payto.ts
+++ b/src/util/payto.ts
@@ -20,9 +20,8 @@ interface PaytoUri {
   params: { [name: string]: string };
 }
 
-
 export function parsePaytoUri(s: string): PaytoUri | undefined {
-  const pfx = "payto://"
+  const pfx = "payto://";
   if (!s.startsWith(pfx)) {
     return undefined;
   }
@@ -50,5 +49,5 @@ export function parsePaytoUri(s: string): PaytoUri | 
undefined {
     targetPath,
     targetType,
     params,
-  }
-}
\ No newline at end of file
+  };
+}
diff --git a/src/util/promiseUtils.ts b/src/util/promiseUtils.ts
index 9add2c40..d409686d 100644
--- a/src/util/promiseUtils.ts
+++ b/src/util/promiseUtils.ts
@@ -14,11 +14,11 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
- export interface OpenedPromise<T> {
+export interface OpenedPromise<T> {
   promise: Promise<T>;
   resolve: (val: T) => void;
   reject: (err: any) => void;
- }
+}
 
 /**
  * Get an unresolved promise together with its extracted resolve / reject
@@ -57,4 +57,4 @@ export class AsyncCondition {
     this._waitPromise = op.promise;
     this._resolveWaitPromise = op.resolve;
   }
-}
\ No newline at end of file
+}
diff --git a/src/util/query.ts b/src/util/query.ts
index 3303907f..ce704b4f 100644
--- a/src/util/query.ts
+++ b/src/util/query.ts
@@ -271,11 +271,14 @@ export class TransactionHandle {
     return new ResultStream<T>(req);
   }
 
-  iterIndexed<S extends IDBValidKey,T>(
+  iterIndexed<S extends IDBValidKey, T>(
     index: Index<S, T>,
     key?: any,
   ): ResultStream<T> {
-    const req = 
this.tx.objectStore(index.storeName).index(index.indexName).openCursor(key);
+    const req = this.tx
+      .objectStore(index.storeName)
+      .index(index.indexName)
+      .openCursor(key);
     return new ResultStream<T>(req);
   }
 
@@ -298,7 +301,7 @@ function runWithTransaction<T>(
 ): Promise<T> {
   const stack = Error("Failed transaction was started here.");
   return new Promise((resolve, reject) => {
-    const storeName = stores.map(x => x.name);
+    const storeName = stores.map((x) => x.name);
     const tx = db.transaction(storeName, mode);
     let funResult: any = undefined;
     let gotFunResult: boolean = false;
@@ -332,11 +335,11 @@ function runWithTransaction<T>(
     const th = new TransactionHandle(tx);
     const resP = Promise.resolve().then(() => f(th));
     resP
-      .then(result => {
+      .then((result) => {
         gotFunResult = true;
         funResult = result;
       })
-      .catch(e => {
+      .catch((e) => {
         if (e == TransactionAbort) {
           console.info("aborting transaction");
         } else {
@@ -344,7 +347,8 @@ function runWithTransaction<T>(
           console.error(stack);
           tx.abort();
         }
-      }).catch((e) => {
+      })
+      .catch((e) => {
         console.error("fatal: aborting transaction failed", e);
       });
   });
@@ -394,15 +398,19 @@ export function openDatabase(
   databaseName: string,
   databaseVersion: number,
   onVersionChange: () => void,
-  onUpgradeNeeded: (db: IDBDatabase, oldVersion: number, newVersion: number) 
=> void,
+  onUpgradeNeeded: (
+    db: IDBDatabase,
+    oldVersion: number,
+    newVersion: number,
+  ) => void,
 ): Promise<IDBDatabase> {
   return new Promise<IDBDatabase>((resolve, reject) => {
     const req = idbFactory.open(databaseName, databaseVersion);
-    req.onerror = e => {
+    req.onerror = (e) => {
       console.log("taler database error", e);
       reject(new Error("database error"));
     };
-    req.onsuccess = e => {
+    req.onsuccess = (e) => {
       req.result.onversionchange = (evt: IDBVersionChangeEvent) => {
         console.log(
           `handling live db version change from ${evt.oldVersion} to 
${evt.newVersion}`,
@@ -412,7 +420,7 @@ export function openDatabase(
       };
       resolve(req.result);
     };
-    req.onupgradeneeded = e => {
+    req.onupgradeneeded = (e) => {
       const db = req.result;
       onUpgradeNeeded(db, e.oldVersion, e.newVersion!);
       console.log(
@@ -441,7 +449,7 @@ export class Database {
       stores: {} as { [s: string]: any },
       version: db.version,
     };
-  
+
     return new Promise((resolve, reject) => {
       const tx = db.transaction(Array.from(db.objectStoreNames));
       tx.addEventListener("complete", () => {
@@ -489,7 +497,7 @@ export class Database {
       });
     });
   }
-  
+
   async get<T>(store: Store<T>, key: any): Promise<T | undefined> {
     const tx = this.db.transaction([store.name], "readonly");
     const req = tx.objectStore(store.name).get(key);
@@ -503,10 +511,7 @@ export class Database {
     key: any,
   ): Promise<T | undefined> {
     const tx = this.db.transaction([index.storeName], "readonly");
-    const req = tx
-      .objectStore(index.storeName)
-      .index(index.indexName)
-      .get(key);
+    const req = 
tx.objectStore(index.storeName).index(index.indexName).get(key);
     const v = await requestToPromise(req);
     await transactionToPromise(tx);
     return v;
diff --git a/src/util/talerconfig.ts b/src/util/talerconfig.ts
index 333bcd1b..61c75574 100644
--- a/src/util/talerconfig.ts
+++ b/src/util/talerconfig.ts
@@ -110,11 +110,13 @@ export class Configuration {
 
   getString(section: string, option: string): ConfigValue<string> {
     const val = (this.sectionMap[section] ?? {})[option];
-    return new ConfigValue(section, option, val, x => x);
+    return new ConfigValue(section, option, val, (x) => x);
   }
 
   getAmount(section: string, option: string): ConfigValue<AmountJson> {
     const val = (this.sectionMap[section] ?? {})[option];
-    return new ConfigValue(section, option, val, x => Amounts.parseOrThrow(x));
+    return new ConfigValue(section, option, val, (x) =>
+      Amounts.parseOrThrow(x),
+    );
   }
 }
diff --git a/src/util/taleruri-test.ts b/src/util/taleruri-test.ts
index 052581a9..9efc1846 100644
--- a/src/util/taleruri-test.ts
+++ b/src/util/taleruri-test.ts
@@ -22,7 +22,7 @@ import {
   parseTipUri,
 } from "./taleruri";
 
-test("taler pay url parsing: wrong scheme", t => {
+test("taler pay url parsing: wrong scheme", (t) => {
   const url1 = "talerfoo://";
   const r1 = parsePayUri(url1);
   t.is(r1, undefined);
@@ -32,7 +32,7 @@ test("taler pay url parsing: wrong scheme", t => {
   t.is(r2, undefined);
 });
 
-test("taler pay url parsing: defaults", t => {
+test("taler pay url parsing: defaults", (t) => {
   const url1 = "taler://pay/example.com/-/-/myorder";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -52,7 +52,7 @@ test("taler pay url parsing: defaults", t => {
   t.is(r2.sessionId, "mysession");
 });
 
-test("taler pay url parsing: trailing parts", t => {
+test("taler pay url parsing: trailing parts", (t) => {
   const url1 = "taler://pay/example.com/-/-/myorder/mysession/spam/eggs";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -63,7 +63,7 @@ test("taler pay url parsing: trailing parts", t => {
   t.is(r1.sessionId, "mysession");
 });
 
-test("taler pay url parsing: instance", t => {
+test("taler pay url parsing: instance", (t) => {
   const url1 = "taler://pay/example.com/-/myinst/myorder";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -74,7 +74,7 @@ test("taler pay url parsing: instance", t => {
   t.is(r1.orderId, "myorder");
 });
 
-test("taler pay url parsing: path prefix and instance", t => {
+test("taler pay url parsing: path prefix and instance", (t) => {
   const url1 = "taler://pay/example.com/mypfx/myinst/myorder";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -84,7 +84,7 @@ test("taler pay url parsing: path prefix and instance", t => {
   t.is(r1.merchantBaseUrl, "https://example.com/mypfx/instances/myinst/";);
 });
 
-test("taler pay url parsing: complex path prefix", t => {
+test("taler pay url parsing: complex path prefix", (t) => {
   const url1 = "taler://pay/example.com/mypfx%2Fpublic/-/myorder";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -96,7 +96,7 @@ test("taler pay url parsing: complex path prefix", t => {
   t.is(r1.sessionId, undefined);
 });
 
-test("taler pay uri parsing: complex path prefix and instance", t => {
+test("taler pay uri parsing: complex path prefix and instance", (t) => {
   const url1 = "taler://pay/example.com/mypfx%2Fpublic/foo/myorder";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -107,29 +107,29 @@ test("taler pay uri parsing: complex path prefix and 
instance", t => {
   t.is(r1.orderId, "myorder");
 });
 
-test("taler refund uri parsing: non-https #1", t => {
+test("taler refund uri parsing: non-https #1", (t) => {
   const url1 = "taler://refund/example.com/-/-/myorder?insecure=1";
   const r1 = parseRefundUri(url1);
   if (!r1) {
     t.fail();
     return;
-  } 
+  }
   t.is(r1.merchantBaseUrl, "http://example.com/public/";);
-  t.is(r1.orderId, "myorder")
+  t.is(r1.orderId, "myorder");
 });
 
-test("taler pay uri parsing: non-https #1", t => {
+test("taler pay uri parsing: non-https #1", (t) => {
   const url1 = "taler://pay/example.com/-/-/myorder?insecure=1";
   const r1 = parsePayUri(url1);
   if (!r1) {
     t.fail();
     return;
-  } 
+  }
   t.is(r1.merchantBaseUrl, "http://example.com/public/";);
-  t.is(r1.orderId, "myorder")
+  t.is(r1.orderId, "myorder");
 });
 
-test("taler pay url parsing: non-https #2", t => {
+test("taler pay url parsing: non-https #2", (t) => {
   const url1 = "taler://pay/example.com/-/-/myorder?insecure=2";
   const r1 = parsePayUri(url1);
   if (!r1) {
@@ -140,7 +140,7 @@ test("taler pay url parsing: non-https #2", t => {
   t.is(r1.orderId, "myorder");
 });
 
-test("taler withdraw uri parsing", t => {
+test("taler withdraw uri parsing", (t) => {
   const url1 = "taler://withdraw/bank.example.com/-/12345";
   const r1 = parseWithdrawUri(url1);
   if (!r1) {
@@ -150,7 +150,7 @@ test("taler withdraw uri parsing", t => {
   t.is(r1.statusUrl, "https://bank.example.com/api/withdraw-operation/12345";);
 });
 
-test("taler refund uri parsing", t => {
+test("taler refund uri parsing", (t) => {
   const url1 = "taler://refund/merchant.example.com/-/-/1234";
   const r1 = parseRefundUri(url1);
   if (!r1) {
@@ -161,7 +161,7 @@ test("taler refund uri parsing", t => {
   t.is(r1.orderId, "1234");
 });
 
-test("taler refund uri parsing with instance", t => {
+test("taler refund uri parsing with instance", (t) => {
   const url1 = "taler://refund/merchant.example.com/-/myinst/1234";
   const r1 = parseRefundUri(url1);
   if (!r1) {
@@ -169,23 +169,23 @@ test("taler refund uri parsing with instance", t => {
     return;
   }
   t.is(r1.orderId, "1234");
-  t.is(r1.merchantBaseUrl, 
"https://merchant.example.com/public/instances/myinst/";);
+  t.is(
+    r1.merchantBaseUrl,
+    "https://merchant.example.com/public/instances/myinst/";,
+  );
 });
 
-test("taler tip pickup uri", t => {
+test("taler tip pickup uri", (t) => {
   const url1 = "taler://tip/merchant.example.com/-/-/tipid";
   const r1 = parseTipUri(url1);
   if (!r1) {
     t.fail();
     return;
   }
-  t.is(
-    r1.merchantBaseUrl,
-    "https://merchant.example.com/public/";,
-  );
+  t.is(r1.merchantBaseUrl, "https://merchant.example.com/public/";);
 });
 
-test("taler tip pickup uri with instance", t => {
+test("taler tip pickup uri with instance", (t) => {
   const url1 = "taler://tip/merchant.example.com/-/tipm/tipid";
   const r1 = parseTipUri(url1);
   if (!r1) {
@@ -199,7 +199,7 @@ test("taler tip pickup uri with instance", t => {
   t.is(r1.merchantTipId, "tipid");
 });
 
-test("taler tip pickup uri with instance and prefix", t => {
+test("taler tip pickup uri with instance and prefix", (t) => {
   const url1 = "taler://tip/merchant.example.com/my%2fpfx/tipm/tipid";
   const r1 = parseTipUri(url1);
   if (!r1) {
diff --git a/src/util/time.ts b/src/util/time.ts
index 2740c361..138ecb87 100644
--- a/src/util/time.ts
+++ b/src/util/time.ts
@@ -138,7 +138,11 @@ export function timestampDifference(t1: Timestamp, t2: 
Timestamp): Duration {
   return { d_ms: Math.abs(t1.t_ms - t2.t_ms) };
 }
 
-export function timestampIsBetween(t: Timestamp, start: Timestamp, end: 
Timestamp) {
+export function timestampIsBetween(
+  t: Timestamp,
+  start: Timestamp,
+  end: Timestamp,
+) {
   if (timestampCmp(t, start) < 0) {
     return false;
   }
diff --git a/src/util/timer.ts b/src/util/timer.ts
index 000f3660..8706c939 100644
--- a/src/util/timer.ts
+++ b/src/util/timer.ts
@@ -31,8 +31,7 @@ export interface TimerHandle {
 }
 
 class IntervalHandle {
-  constructor(public h: any) {
-  }
+  constructor(public h: any) {}
 
   clear() {
     clearInterval(this.h);
@@ -40,8 +39,7 @@ class IntervalHandle {
 }
 
 class TimeoutHandle {
-  constructor(public h: any) {
-  }
+  constructor(public h: any) {}
 
   clear() {
     clearTimeout(this.h);
@@ -78,7 +76,6 @@ export function after(delayMs: number, callback: () => void): 
TimerHandle {
   return new TimeoutHandle(setTimeout(callback, delayMs));
 }
 
-
 const nullTimerHandle = {
   clear() {
     // do nothing
diff --git a/src/util/wire.ts b/src/util/wire.ts
index 757ba926..21ad600f 100644
--- a/src/util/wire.ts
+++ b/src/util/wire.ts
@@ -14,7 +14,6 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-
 /**
  * Display and manipulate wire information.
  *
@@ -50,4 +49,3 @@ export function summarizeWire(w: any): string {
       return i18n.str`Unknown Wire Detail`;
   }
 }
-
diff --git a/src/wallet-test.ts b/src/wallet-test.ts
index a465db51..d1551b09 100644
--- a/src/wallet-test.ts
+++ b/src/wallet-test.ts
@@ -31,21 +31,16 @@ function a(x: string): AmountJson {
   return amt;
 }
 
-
-function fakeAci(
-  current: string,
-  feeDeposit: string,
-): AvailableCoinInfo {
+function fakeAci(current: string, feeDeposit: string): AvailableCoinInfo {
   return {
     availableAmount: a(current),
     coinPub: "foobar",
     denomPub: "foobar",
     feeDeposit: a(feeDeposit),
-  }
-
+  };
 }
 
-test("coin selection 1", t => {
+test("coin selection 1", (t) => {
   const acis: AvailableCoinInfo[] = [
     fakeAci("EUR:1.0", "EUR:0.1"),
     fakeAci("EUR:1.0", "EUR:0.0"),
@@ -60,7 +55,7 @@ test("coin selection 1", t => {
   t.pass();
 });
 
-test("coin selection 2", t => {
+test("coin selection 2", (t) => {
   const acis: AvailableCoinInfo[] = [
     fakeAci("EUR:1.0", "EUR:0.5"),
     fakeAci("EUR:1.0", "EUR:0.0"),
@@ -76,7 +71,7 @@ test("coin selection 2", t => {
   t.pass();
 });
 
-test("coin selection 3", t => {
+test("coin selection 3", (t) => {
   const acis: AvailableCoinInfo[] = [
     fakeAci("EUR:1.0", "EUR:0.5"),
     fakeAci("EUR:1.0", "EUR:0.5"),
@@ -92,7 +87,7 @@ test("coin selection 3", t => {
   t.pass();
 });
 
-test("coin selection 4", t => {
+test("coin selection 4", (t) => {
   const acis: AvailableCoinInfo[] = [
     fakeAci("EUR:1.0", "EUR:0.5"),
     fakeAci("EUR:1.0", "EUR:0.5"),
@@ -107,7 +102,7 @@ test("coin selection 4", t => {
   t.pass();
 });
 
-test("coin selection 5", t => {
+test("coin selection 5", (t) => {
   const acis: AvailableCoinInfo[] = [
     fakeAci("EUR:1.0", "EUR:0.5"),
     fakeAci("EUR:1.0", "EUR:0.5"),
@@ -118,7 +113,7 @@ test("coin selection 5", t => {
   t.pass();
 });
 
-test("coin selection 6", t => {
+test("coin selection 6", (t) => {
   const acis: AvailableCoinInfo[] = [
     fakeAci("EUR:1.0", "EUR:0.5"),
     fakeAci("EUR:1.0", "EUR:0.5"),
diff --git a/src/wallet.ts b/src/wallet.ts
index df83eec8..2560b0dc 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -640,7 +640,9 @@ export class Wallet {
    * Accept a refund, return the contract hash for the contract
    * that was involved in the refund.
    */
-  async applyRefund(talerRefundUri: string): Promise<string> {
+  async applyRefund(
+    talerRefundUri: string,
+  ): Promise<{ contractTermsHash: string }> {
     return applyRefund(this.ws, talerRefundUri);
   }
 
diff --git a/src/webex/background.html b/src/webex/background.html
index 0535dd5f..12a962c6 100644
--- a/src/webex/background.html
+++ b/src/webex/background.html
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
 <html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <script src="../../dist/background-bundle.js"></script>
-  <title>(wallet bg page)</title>
-</head>
-<body>
-  <img id="taler-logo" src="/img/icon.png">
-</body>
+  <head>
+    <meta charset="UTF-8" />
+    <script src="../../dist/background-bundle.js"></script>
+    <title>(wallet bg page)</title>
+  </head>
+  <body>
+    <img id="taler-logo" src="/img/icon.png" />
+  </body>
 </html>
diff --git a/src/webex/chromeBadge.ts b/src/webex/chromeBadge.ts
index e6b21ad9..cdd99f8c 100644
--- a/src/webex/chromeBadge.ts
+++ b/src/webex/chromeBadge.ts
@@ -14,10 +14,8 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-
 import { isFirefox } from "./compat";
 
-
 /**
  * Polyfill for requestAnimationFrame, which
  * doesn't work from a background page.
@@ -28,7 +26,6 @@ function rAF(cb: (ts: number) => void) {
   }, 100 /* 100 ms delay between frames */);
 }
 
-
 /**
  * Badge for Chrome that renders a Taler logo with a rotating ring if some
  * background activity is happening.
@@ -139,16 +136,27 @@ export class ChromeBadge {
     if (this.animationRunning) {
       /* Draw circle around the "T" with an opening of this.gapWidth */
       const aMax = ChromeBadge.rotationAngleMax;
-      const startAngle = this.rotationAngle / aMax * Math.PI * 2;
-      const stopAngle = ((this.rotationAngle + aMax - this.gapWidth) / aMax) * 
Math.PI * 2;
-      this.ctx.arc(0, 0, this.canvas.width / 2 - 2, /* radius */ startAngle, 
stopAngle, false);
+      const startAngle = (this.rotationAngle / aMax) * Math.PI * 2;
+      const stopAngle =
+        ((this.rotationAngle + aMax - this.gapWidth) / aMax) * Math.PI * 2;
+      this.ctx.arc(
+        0,
+        0,
+        this.canvas.width / 2 - 2,
+        /* radius */ startAngle,
+        stopAngle,
+        false,
+      );
     } else {
       /* Draw full circle */
-      this.ctx.arc(0, 0,
-                   this.canvas.width / 2 - 2, /* radius */
-                   0,
-                   Math.PI * 2,
-                   false);
+      this.ctx.arc(
+        0,
+        0,
+        this.canvas.width / 2 - 2 /* radius */,
+        0,
+        Math.PI * 2,
+        false,
+      );
     }
     this.ctx.stroke();
     // go back to the origin
@@ -162,7 +170,14 @@ export class ChromeBadge {
       const ch = this.canvas.height;
       this.ctx.beginPath();
       this.ctx.arc(cw - r, ch - r, r, 0, 2 * Math.PI, false);
-      const gradient = this.ctx.createRadialGradient(cw - r, ch - r, r, cw - 
r, ch - r, 5);
+      const gradient = this.ctx.createRadialGradient(
+        cw - r,
+        ch - r,
+        r,
+        cw - r,
+        ch - r,
+        5,
+      );
       gradient.addColorStop(0, "rgba(255, 255, 255, 1)");
       gradient.addColorStop(1, "blue");
       this.ctx.fillStyle = gradient;
@@ -173,11 +188,13 @@ export class ChromeBadge {
     // tslint:disable-next-line:no-string-literal
     if (window["chrome"] && window.chrome["browserAction"]) {
       try {
-        const imageData = this.ctx.getImageData(0,
-                                                0,
-                                                this.canvas.width,
-                                                this.canvas.height);
-        chrome.browserAction.setIcon({imageData});
+        const imageData = this.ctx.getImageData(
+          0,
+          0,
+          this.canvas.width,
+          this.canvas.height,
+        );
+        chrome.browserAction.setIcon({ imageData });
       } catch (e) {
         // Might fail if browser has over-eager canvas fingerprinting 
countermeasures.
         // There's nothing we can do then ...
@@ -194,7 +211,7 @@ export class ChromeBadge {
       return;
     }
     this.animationRunning = true;
-    let start: number|undefined;
+    let start: number | undefined;
     const step = (timestamp: number) => {
       if (!this.animationRunning) {
         return;
@@ -206,8 +223,10 @@ export class ChromeBadge {
         // stop if we're close enough to origin
         this.rotationAngle = 0;
       } else {
-        this.rotationAngle = (this.rotationAngle + (timestamp - start) *
-                              ChromeBadge.rotationSpeed) % 
ChromeBadge.rotationAngleMax;
+        this.rotationAngle =
+          (this.rotationAngle +
+            (timestamp - start) * ChromeBadge.rotationSpeed) %
+          ChromeBadge.rotationAngleMax;
       }
       if (this.isBusy) {
         if (this.gapWidth < ChromeBadge.openMax) {
diff --git a/src/webex/compat.ts b/src/webex/compat.ts
index 121c58e7..f1a68f33 100644
--- a/src/webex/compat.ts
+++ b/src/webex/compat.ts
@@ -20,16 +20,16 @@
  */
 
 export function isFirefox(): boolean {
-    const rt = chrome.runtime as any;
-    if (typeof rt.getBrowserInfo === "function") {
-        return true;
-    }
-    return false;
+  const rt = chrome.runtime as any;
+  if (typeof rt.getBrowserInfo === "function") {
+    return true;
+  }
+  return false;
 }
 
 /**
  * Check if we are running under nodejs.
  */
 export function isNode() {
-    return (typeof process !== 'undefined') && (process.release.name === 
'node')
-}
\ No newline at end of file
+  return typeof process !== "undefined" && process.release.name === "node";
+}
diff --git a/src/webex/i18n.tsx b/src/webex/i18n.tsx
index 3923654e..2e753e44 100644
--- a/src/webex/i18n.tsx
+++ b/src/webex/i18n.tsx
@@ -21,19 +21,17 @@
 /**
  * Imports.
  */
-import {strings} from "../i18n/strings";
+import { strings } from "../i18n/strings";
 
 // @ts-ignore: no type decl for this library
 import * as jedLib from "jed";
 
 import * as React from "react";
 
-
 const jed = setupJed();
 
 let enableTracing = false;
 
-
 /**
  * Set up jed library for internationalization,
  * based on browser language settings.
@@ -56,7 +54,6 @@ function setupJed(): any {
   return new jedLib.Jed(strings[lang]);
 }
 
-
 /**
  * Convert template strings to a msgid
  */
@@ -71,22 +68,22 @@ function toI18nString(stringSeq: ReadonlyArray<string>) {
   return s;
 }
 
-
 /**
  * Internationalize a string template with arbitrary serialized values.
  */
 export function str(stringSeq: TemplateStringsArray, ...values: any[]) {
   const s = toI18nString(stringSeq);
-  const tr = jed.translate(s).ifPlural(1, s).fetch(...values);
+  const tr = jed
+    .translate(s)
+    .ifPlural(1, s)
+    .fetch(...values);
   return tr;
 }
 
-
 interface TranslateSwitchProps {
   target: number;
 }
 
-
 function stringifyChildren(children: any): string {
   let n = 1;
   const ss = React.Children.map(children, (c) => {
@@ -100,7 +97,6 @@ function stringifyChildren(children: any): string {
   return s;
 }
 
-
 interface TranslateProps {
   /**
    * Component that the translated element should be wrapped in.
@@ -114,7 +110,6 @@ interface TranslateProps {
   wrapProps?: any;
 }
 
-
 /**
  * Translate text node children of this component.
  * If a child component might produce a text node, it must be wrapped
@@ -130,11 +125,19 @@ interface TranslateProps {
 export class Translate extends React.Component<TranslateProps, {}> {
   render(): JSX.Element {
     const s = stringifyChildren(this.props.children);
-    const tr = jed.ngettext(s, s, 1).split(/%(\d+)\$s/).filter((e: any, i: 
number) => i % 2 === 0);
+    const tr = jed
+      .ngettext(s, s, 1)
+      .split(/%(\d+)\$s/)
+      .filter((e: any, i: number) => i % 2 === 0);
     const childArray = React.Children.toArray(this.props.children!);
     for (let i = 0; i < childArray.length - 1; ++i) {
-      if ((typeof childArray[i]) === "string" && (typeof childArray[i + 1]) 
=== "string") {
-        childArray[i + 1] = (childArray[i] as string).concat(childArray[i + 1] 
as string);
+      if (
+        typeof childArray[i] === "string" &&
+        typeof childArray[i + 1] === "string"
+      ) {
+        childArray[i + 1] = (childArray[i] as string).concat(
+          childArray[i + 1] as string,
+        );
         childArray.splice(i, 1);
       }
     }
@@ -158,7 +161,6 @@ export class Translate extends 
React.Component<TranslateProps, {}> {
   }
 }
 
-
 /**
  * Switch translation based on singular or plural based on the target prop.
  * Should only contain TranslateSingular and TransplatePlural as children.
@@ -171,7 +173,10 @@ export class Translate extends 
React.Component<TranslateProps, {}> {
  * </TranslateSwitch>
  * ```
  */
-export class TranslateSwitch extends React.Component<TranslateSwitchProps, 
void> {
+export class TranslateSwitch extends React.Component<
+  TranslateSwitchProps,
+  void
+> {
   render(): JSX.Element {
     let singular: React.ReactElement<TranslationPluralProps> | undefined;
     let plural: React.ReactElement<TranslationPluralProps> | undefined;
@@ -186,7 +191,7 @@ export class TranslateSwitch extends 
React.Component<TranslateSwitchProps, void>
         }
       });
     }
-    if ((!singular) || (!plural)) {
+    if (!singular || !plural) {
       console.error("translation not found");
       return React.createElement("span", {}, ["translation not found"]);
     }
@@ -198,7 +203,6 @@ export class TranslateSwitch extends 
React.Component<TranslateSwitchProps, void>
   }
 }
 
-
 interface TranslationPluralProps {
   target: number;
 }
@@ -206,14 +210,24 @@ interface TranslationPluralProps {
 /**
  * See [[TranslateSwitch]].
  */
-export class TranslatePlural extends React.Component<TranslationPluralProps, 
void> {
+export class TranslatePlural extends React.Component<
+  TranslationPluralProps,
+  void
+> {
   render(): JSX.Element {
     const s = stringifyChildren(this.props.children);
-    const tr = jed.ngettext(s, s, 1).split(/%(\d+)\$s/).filter((e: any, i: 
number) => i % 2 === 0);
+    const tr = jed
+      .ngettext(s, s, 1)
+      .split(/%(\d+)\$s/)
+      .filter((e: any, i: number) => i % 2 === 0);
     const childArray = React.Children.toArray(this.props.children!);
     for (let i = 0; i < childArray.length - 1; ++i) {
-      if ((typeof childArray[i]) === "string" && (typeof childArray[i + 1]) 
=== "string") {
-        childArray[i + i] = childArray[i] as string + childArray[i + 1] as 
string;
+      if (
+        typeof childArray[i] === "string" &&
+        typeof childArray[i + 1] === "string"
+      ) {
+        childArray[i + i] = ((childArray[i] as string) +
+          childArray[i + 1]) as string;
         childArray.splice(i, 1);
       }
     }
@@ -234,18 +248,27 @@ export class TranslatePlural extends 
React.Component<TranslationPluralProps, voi
   }
 }
 
-
 /**
  * See [[TranslateSwitch]].
  */
-export class TranslateSingular extends React.Component<TranslationPluralProps, 
void> {
+export class TranslateSingular extends React.Component<
+  TranslationPluralProps,
+  void
+> {
   render(): JSX.Element {
     const s = stringifyChildren(this.props.children);
-    const tr = jed.ngettext(s, s, 1).split(/%(\d+)\$s/).filter((e: any, i: 
number) => i % 2 === 0);
+    const tr = jed
+      .ngettext(s, s, 1)
+      .split(/%(\d+)\$s/)
+      .filter((e: any, i: number) => i % 2 === 0);
     const childArray = React.Children.toArray(this.props.children!);
     for (let i = 0; i < childArray.length - 1; ++i) {
-      if ((typeof childArray[i]) === "string" && (typeof childArray[i + 1]) 
=== "string") {
-        childArray[i + i] = childArray[i] as string + childArray[i + 1] as 
string;
+      if (
+        typeof childArray[i] === "string" &&
+        typeof childArray[i + 1] === "string"
+      ) {
+        childArray[i + i] = ((childArray[i] as string) +
+          childArray[i + 1]) as string;
         childArray.splice(i, 1);
       }
     }
diff --git a/src/webex/messages.ts b/src/webex/messages.ts
index 7672fcb4..b695b4ab 100644
--- a/src/webex/messages.ts
+++ b/src/webex/messages.ts
@@ -147,7 +147,10 @@ export interface MessageMap {
     response: walletTypes.BenchmarkResult;
   };
   "get-withdraw-details": {
-    request: { talerWithdrawUri: string; maybeSelectedExchange: string | 
undefined };
+    request: {
+      talerWithdrawUri: string;
+      maybeSelectedExchange: string | undefined;
+    };
     response: walletTypes.WithdrawDetails;
   };
   "accept-withdrawal": {
@@ -159,12 +162,11 @@ export interface MessageMap {
     response: walletTypes.PreparePayResult;
   };
   "get-diagnostics": {
-    request: { };
+    request: {};
     response: walletTypes.WalletDiagnostics;
   };
 }
 
-
 /**
  * String literal types for messages.
  */
diff --git a/src/webex/notify.ts b/src/webex/notify.ts
index 61a96cb1..910a2099 100644
--- a/src/webex/notify.ts
+++ b/src/webex/notify.ts
@@ -41,18 +41,17 @@ if 
(document.documentElement.getAttribute("data-taler-nojs")) {
 
 interface Handler {
   type: string;
-  listener: (e: Event) => void|Promise<void>;
+  listener: (e: Event) => void | Promise<void>;
 }
 const handlers: Handler[] = [];
 
-
-let sheet: CSSStyleSheet|null;
+let sheet: CSSStyleSheet | null;
 
 function initStyle() {
   logVerbose && console.log("taking over styles");
   const name = "taler-presence-stylesheet";
   const content = "/* Taler stylesheet controlled by JS */";
-  let style = document.getElementById(name) as HTMLStyleElement|null;
+  let style = document.getElementById(name) as HTMLStyleElement | null;
   if (!style) {
     style = document.createElement("style");
     // Needed by WebKit
@@ -68,7 +67,9 @@ function initStyle() {
       style.innerText = content;
     }
     if (!style.sheet) {
-      throw Error("taler-presence-stylesheet should be a style sheet (<link> 
or <style>)");
+      throw Error(
+        "taler-presence-stylesheet should be a style sheet (<link> or 
<style>)",
+      );
     }
     sheet = style.sheet as CSSStyleSheet;
     while (sheet.cssRules.length > 0) {
@@ -77,7 +78,6 @@ function initStyle() {
   }
 }
 
-
 function setStyles(installed: boolean) {
   if (!sheet || !sheet.cssRules) {
     return;
@@ -93,7 +93,6 @@ function setStyles(installed: boolean) {
   }
 }
 
-
 function onceOnComplete(cb: () => void) {
   if (document.readyState === "complete") {
     cb();
@@ -106,7 +105,6 @@ function onceOnComplete(cb: () => void) {
   }
 }
 
-
 function init() {
   onceOnComplete(() => {
     if (document.documentElement.getAttribute("data-taler-nojs")) {
@@ -131,7 +129,6 @@ function init() {
 
 type HandlerFn = (detail: any, sendResponse: (msg: any) => void) => void;
 
-
 function registerHandlers() {
   /**
    * Add a handler for a DOM event, which automatically
@@ -149,12 +146,16 @@ function registerHandlers() {
       }
       let callId: number | undefined;
       let detail;
-      if ((e instanceof CustomEvent) && e.detail && e.detail.callId !== 
undefined) {
+      if (
+        e instanceof CustomEvent &&
+        e.detail &&
+        e.detail.callId !== undefined
+      ) {
         callId = e.detail.callId;
         detail = e.detail;
       }
       const responder = (msg?: any) => {
-        const fullMsg = Object.assign({}, msg, {callId});
+        const fullMsg = Object.assign({}, msg, { callId });
         let opts = { detail: fullMsg };
         if ("function" === typeof cloneInto) {
           opts = cloneInto(opts, document.defaultView);
@@ -165,7 +166,7 @@ function registerHandlers() {
       handler(detail, responder);
     };
     document.addEventListener(type, handlerWrap);
-    handlers.push({type, listener: handlerWrap});
+    handlers.push({ type, listener: handlerWrap });
   }
 
   addHandler("taler-query-id", (msg: any, sendResponse: any) => {
@@ -178,25 +179,34 @@ function registerHandlers() {
   });
 
   addHandler("taler-create-reserve", (msg: any) => {
-    const uri = new 
URL(chrome.extension.getURL("/src/webex/pages/confirm-create-reserve.html"));
+    const uri = new URL(
+      chrome.extension.getURL("/src/webex/pages/confirm-create-reserve.html"),
+    );
     uri.searchParams.set("amount", JSON.stringify(msg.amount));
     uri.searchParams.set("bank_url", document.location.href);
-    uri.searchParams.set("callback_url", new URL(msg.callback_url, 
document.location.href).href);
+    uri.searchParams.set(
+      "callback_url",
+      new URL(msg.callback_url, document.location.href).href,
+    );
     uri.searchParams.set("suggested_exchange_url", msg.suggested_exchange_url);
     uri.searchParams.set("wt_types", JSON.stringify(msg.wt_types));
     window.location.href = uri.href;
   });
 
   addHandler("taler-add-auditor", (msg: any) => {
-    const uri = new 
URL(chrome.extension.getURL("/src/webex/pages/add-auditor.html"));
-    uri.searchParams.set("req", JSON.stringify(msg))
+    const uri = new URL(
+      chrome.extension.getURL("/src/webex/pages/add-auditor.html"),
+    );
+    uri.searchParams.set("req", JSON.stringify(msg));
     window.location.href = uri.href;
   });
 
   addHandler("taler-confirm-reserve", async (msg: any, sendResponse: any) => {
     const reservePub = msg.reserve_pub;
     if (typeof reservePub !== "string") {
-      console.error("taler-confirm-reserve expects parameter reserve_pub of 
type 'string'");
+      console.error(
+        "taler-confirm-reserve expects parameter reserve_pub of type 'string'",
+      );
       return;
     }
     await wxApi.confirmReserve(msg.reserve_pub);
diff --git a/src/webex/pages/add-auditor.html b/src/webex/pages/add-auditor.html
index b7a9d041..7f30b5fb 100644
--- a/src/webex/pages/add-auditor.html
+++ b/src/webex/pages/add-auditor.html
@@ -1,32 +1,32 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
 
-<head>
-  <meta charset="UTF-8">
+    <title>Taler Wallet: Add Auditor</title>
 
-  <title>Taler Wallet: Add Auditor</title>
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <link rel="icon" href="/img/icon.png" />
 
-  <link rel="icon" href="/img/icon.png">
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/add-auditor-bundle.js"></script>
 
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/add-auditor-bundle.js"></script>
-
-  <style>
-    .tree-item {
-            margin: 2em;
-            border-radius: 5px;
-            border: 1px solid gray;
-            padding: 1em;
-    }
-    .button-linky {
-      background: none;
-      color: black;
-      text-decoration: underline;
-      border: none;
-    }
-  </style>
+    <style>
+      .tree-item {
+        margin: 2em;
+        border-radius: 5px;
+        border: 1px solid gray;
+        padding: 1em;
+      }
+      .button-linky {
+        background: none;
+        color: black;
+        text-decoration: underline;
+        border: none;
+      }
+    </style>
+  </head>
 
   <body>
     <div id="container"></div>
diff --git a/src/webex/pages/add-auditor.tsx b/src/webex/pages/add-auditor.tsx
index 0f681aae..5840f4d6 100644
--- a/src/webex/pages/add-auditor.tsx
+++ b/src/webex/pages/add-auditor.tsx
@@ -35,8 +35,7 @@ interface ConfirmAuditorProps {
 function ConfirmAuditor(props: ConfirmAuditorProps) {
   const [addDone, setAddDone] = useState(false);
 
-
-  const add = async() => {
+  const add = async () => {
     const currencies = await getCurrencies();
     let currency: CurrencyRecord | undefined;
 
@@ -78,7 +77,7 @@ function ConfirmAuditor(props: ConfirmAuditorProps) {
     await updateCurrency(currency);
 
     setAddDone(true);
-  }
+  };
 
   const back = () => {
     window.history.back();
@@ -115,7 +114,6 @@ function ConfirmAuditor(props: ConfirmAuditorProps) {
   );
 }
 
-
 registerMountPage(() => {
   const walletPageUrl = new URL(document.location.href);
   const url = walletPageUrl.searchParams.get("url");
@@ -136,5 +134,5 @@ registerMountPage(() => {
   }
   const expirationStamp = Number.parseInt(auditorStampStr);
   const args = { url, currency, auditorPub, expirationStamp };
-  return <ConfirmAuditor {...args}/>;
+  return <ConfirmAuditor {...args} />;
 });
diff --git a/src/webex/pages/auditors.html b/src/webex/pages/auditors.html
index cbfc3b4b..7c207f75 100644
--- a/src/webex/pages/auditors.html
+++ b/src/webex/pages/auditors.html
@@ -1,34 +1,34 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Auditors</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Auditors</title>
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <link rel="icon" href="/img/icon.png" />
 
-  <link rel="icon" href="/img/icon.png">
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/auditors-bundle.js"></script>
 
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/auditors-bundle.js"></script>
-
-  <style>
-    body {
-      font-size: 100%;
-    }
-    .tree-item {
-            margin: 2em;
-            border-radius: 5px;
-            border: 1px solid gray;
-            padding: 1em;
-    }
-    .button-linky {
-      background: none;
-      color: black;
-      text-decoration: underline;
-      border: none;
-    }
-  </style>
+    <style>
+      body {
+        font-size: 100%;
+      }
+      .tree-item {
+        margin: 2em;
+        border-radius: 5px;
+        border: 1px solid gray;
+        padding: 1em;
+      }
+      .button-linky {
+        background: none;
+        color: black;
+        text-decoration: underline;
+        border: none;
+      }
+    </style>
+  </head>
 
   <body>
     <div id="container"></div>
diff --git a/src/webex/pages/auditors.tsx b/src/webex/pages/auditors.tsx
index 876cf326..e2bb29af 100644
--- a/src/webex/pages/auditors.tsx
+++ b/src/webex/pages/auditors.tsx
@@ -20,17 +20,13 @@
  * @author Florian Dold
  */
 
-
 import {
   AuditorRecord,
   CurrencyRecord,
   ExchangeForCurrencyRecord,
 } from "../../types/dbTypes";
 
-import {
-  getCurrencies,
-  updateCurrency,
-} from "../wxApi";
+import { getCurrencies, updateCurrency } from "../wxApi";
 
 import * as React from "react";
 import * as ReactDOM from "react-dom";
@@ -60,14 +56,22 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
   }
 
   async confirmRemoveAuditor(c: CurrencyRecord, a: AuditorRecord) {
-    if (window.confirm(`Do you really want to remove auditor ${a.baseUrl} for 
currency ${c.name}?`)) {
+    if (
+      window.confirm(
+        `Do you really want to remove auditor ${a.baseUrl} for currency 
${c.name}?`,
+      )
+    ) {
       c.auditors = c.auditors.filter((x) => x.auditorPub !== a.auditorPub);
       await updateCurrency(c);
     }
   }
 
   async confirmRemoveExchange(c: CurrencyRecord, e: ExchangeForCurrencyRecord) 
{
-    if (window.confirm(`Do you really want to remove exchange ${e.baseUrl} for 
currency ${c.name}?`)) {
+    if (
+      window.confirm(
+        `Do you really want to remove exchange ${e.baseUrl} for currency 
${c.name}?`,
+      )
+    ) {
       c.exchanges = c.exchanges.filter((x) => x.baseUrl !== e.baseUrl);
       await updateCurrency(c);
     }
@@ -81,18 +85,21 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
       <div>
         <p>Trusted Auditors:</p>
         <ul>
-        {c.auditors.map((a) => (
-          <li>
-            {a.baseUrl}{" "}
-            <button className="pure-button button-destructive" onClick={() => 
this.confirmRemoveAuditor(c, a)}>
-              Remove
-            </button>
-            <ul>
-              <li>valid until {new Date(a.expirationStamp).toString()}</li>
-              <li>public key {a.auditorPub}</li>
-            </ul>
-          </li>
-        ))}
+          {c.auditors.map((a) => (
+            <li>
+              {a.baseUrl}{" "}
+              <button
+                className="pure-button button-destructive"
+                onClick={() => this.confirmRemoveAuditor(c, a)}
+              >
+                Remove
+              </button>
+              <ul>
+                <li>valid until {new Date(a.expirationStamp).toString()}</li>
+                <li>public key {a.auditorPub}</li>
+              </ul>
+            </li>
+          ))}
         </ul>
       </div>
     );
@@ -106,14 +113,17 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
       <div>
         <p>Trusted Exchanges:</p>
         <ul>
-        {c.exchanges.map((e) => (
-          <li>
-            {e.baseUrl}{" "}
-            <button className="pure-button button-destructive" onClick={() => 
this.confirmRemoveExchange(c, e)}>
-              Remove
-            </button>
-          </li>
-        ))}
+          {c.exchanges.map((e) => (
+            <li>
+              {e.baseUrl}{" "}
+              <button
+                className="pure-button button-destructive"
+                onClick={() => this.confirmRemoveExchange(c, e)}
+              >
+                Remove
+              </button>
+            </li>
+          ))}
         </ul>
       </div>
     );
@@ -126,16 +136,16 @@ class CurrencyList extends React.Component<{}, 
CurrencyListState> {
     }
     return (
       <div id="main">
-      {currencies.map((c) => (
-        <div>
-          <h1>Currency {c.name}</h1>
-          <p>Displayed with {c.fractionalDigits} fractional digits.</p>
-          <h2>Auditors</h2>
-          <div>{this.renderAuditors(c)}</div>
-          <h2>Exchanges</h2>
-          <div>{this.renderExchanges(c)}</div>
-        </div>
-      ))}
+        {currencies.map((c) => (
+          <div>
+            <h1>Currency {c.name}</h1>
+            <p>Displayed with {c.fractionalDigits} fractional digits.</p>
+            <h2>Auditors</h2>
+            <div>{this.renderAuditors(c)}</div>
+            <h2>Exchanges</h2>
+            <div>{this.renderExchanges(c)}</div>
+          </div>
+        ))}
       </div>
     );
   }
diff --git a/src/webex/pages/benchmark.html b/src/webex/pages/benchmark.html
index a593d1e3..d4216eca 100644
--- a/src/webex/pages/benchmark.html
+++ b/src/webex/pages/benchmark.html
@@ -1,17 +1,17 @@
-<!doctype html>
+<!DOCTYPE html>
 <html>
   <head>
-    <meta charset="UTF-8">
+    <meta charset="UTF-8" />
     <title>Taler Wallet: Benchmarks</title>
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css">
-    <link rel="icon" href="/img/icon.png">
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="icon" href="/img/icon.png" />
     <script src="/dist/page-common-bundle.js"></script>
     <script src="/dist/benchmark-bundle.js"></script>
   </head>
   <body>
-  <section id="main">
-    <h1>Benchmarks</h1>
-    <div id="container"></div>
-  </section>
+    <section id="main">
+      <h1>Benchmarks</h1>
+      <div id="container"></div>
+    </section>
   </body>
 </html>
diff --git a/src/webex/pages/benchmark.tsx b/src/webex/pages/benchmark.tsx
index fe874f2b..7de546bb 100644
--- a/src/webex/pages/benchmark.tsx
+++ b/src/webex/pages/benchmark.tsx
@@ -14,7 +14,6 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-
 /**
  * Benchmarks for the wallet.
  *
@@ -31,14 +30,12 @@ import * as React from "react";
 import * as ReactDOM from "react-dom";
 import { registerMountPage } from "../renderHtml";
 
-
 interface BenchmarkRunnerState {
   repetitions: number;
   result?: BenchmarkResult;
   running: boolean;
 }
 
-
 function BenchmarkDisplay(props: BenchmarkRunnerState) {
   const result = props.result;
   if (!result) {
@@ -50,24 +47,23 @@ function BenchmarkDisplay(props: BenchmarkRunnerState) {
   }
   return (
     <>
-    <h2>Results for {result.repetitions} repetitions</h2>
-    <table className="pure-table">
-      <thead>
-      <tr>
-        <th>{i18n.str`Operation`}</th>
-        <th>{i18n.str`time (ms/op)`}</th>
-      </tr>
-      {
-        Object.keys(result.time).sort().map(
-          k =>
-            <tr>
-              <td>{k}</td>
-              <td>{result.time[k] / result.repetitions}</td>
-            </tr>
-        )
-      }
-      </thead>
-    </table>
+      <h2>Results for {result.repetitions} repetitions</h2>
+      <table className="pure-table">
+        <thead>
+          <tr>
+            <th>{i18n.str`Operation`}</th>
+            <th>{i18n.str`time (ms/op)`}</th>
+          </tr>
+          {Object.keys(result.time)
+            .sort()
+            .map((k) => (
+              <tr>
+                <td>{k}</td>
+                <td>{result.time[k] / result.repetitions}</td>
+              </tr>
+            ))}
+        </thead>
+      </table>
     </>
   );
 }
@@ -91,10 +87,13 @@ class BenchmarkRunner extends React.Component<any, 
BenchmarkRunnerState> {
     return (
       <div>
         <label>Repetitions:</label>
-        <input type="number"
-               value={this.state.repetitions}
-               onChange={(evt) => this.setState({ repetitions: 
Number.parseInt(evt.target.value) })} />
-        {" "}
+        <input
+          type="number"
+          value={this.state.repetitions}
+          onChange={(evt) =>
+            this.setState({ repetitions: Number.parseInt(evt.target.value) })
+          }
+        />{" "}
         <button onClick={() => this.run()}>Run</button>
         <BenchmarkDisplay {...this.state} />
       </div>
diff --git a/src/webex/pages/pay.html b/src/webex/pages/pay.html
index 20605ac4..6afc9561 100644
--- a/src/webex/pages/pay.html
+++ b/src/webex/pages/pay.html
@@ -1,79 +1,76 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Confirm Contract</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Confirm Contract</title>
+    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/pure.css">
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <link rel="icon" href="/img/icon.png" />
 
-  <link rel="icon" href="/img/icon.png">
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/pay-bundle.js"></script>
 
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/pay-bundle.js"></script>
+    <style>
+      button.accept {
+        background-color: #5757d2;
+        border: 1px solid black;
+        border-radius: 5px;
+        margin: 1em 0;
+        padding: 0.5em;
+        font-weight: bold;
+        color: white;
+      }
+      button.linky {
+        background: none !important;
+        border: none;
+        padding: 0 !important;
 
-  <style>
-    button.accept {
-      background-color: #5757D2;
-      border: 1px solid black;
-      border-radius: 5px;
-      margin: 1em 0;
-      padding: 0.5em;
-      font-weight: bold;
-      color: white;
-    }
-    button.linky {
-      background:none!important;
-      border:none;
-      padding:0!important;
+        font-family: arial, sans-serif;
+        color: #069;
+        text-decoration: underline;
+        cursor: pointer;
+      }
 
-      font-family:arial,sans-serif;
-      color:#069;
-      text-decoration:underline;
-      cursor:pointer;
-    }
+      input.url {
+        width: 25em;
+      }
 
-    input.url {
-      width: 25em;
-    }
+      button.accept:disabled {
+        background-color: #dedbe8;
+        border: 1px solid white;
+        border-radius: 5px;
+        margin: 1em 0;
+        padding: 0.5em;
+        font-weight: bold;
+        color: #2c2c2c;
+      }
 
+      .errorbox {
+        border: 1px solid;
+        display: inline-block;
+        margin: 1em;
+        padding: 1em;
+        font-weight: bold;
+        background: #ff8a8a;
+      }
 
-    button.accept:disabled {
-      background-color: #dedbe8;
-      border: 1px solid white;
-      border-radius: 5px;
-      margin: 1em 0;
-      padding: 0.5em;
-      font-weight: bold;
-      color: #2C2C2C;
-    }
-
-    .errorbox {
-      border: 1px solid;
-      display: inline-block;
-      margin: 1em;
-      padding: 1em;
-      font-weight: bold;
-      background: #FF8A8A;
-    }
-
-    .okaybox {
-      border: 1px solid;
-      display: inline-block;
-      margin: 1em;
-      padding: 1em;
-      font-weight: bold;
-      background: #00FA9A;
-    }
-  </style>
-</head>
-
-<body>
-  <section id="main">
-    <h1>GNU Taler Wallet</h1>
-    <article id="container" class="fade"></article>
-  </section>
-</body>
+      .okaybox {
+        border: 1px solid;
+        display: inline-block;
+        margin: 1em;
+        padding: 1em;
+        font-weight: bold;
+        background: #00fa9a;
+      }
+    </style>
+  </head>
 
+  <body>
+    <section id="main">
+      <h1>GNU Taler Wallet</h1>
+      <article id="container" class="fade"></article>
+    </section>
+  </body>
 </html>
diff --git a/src/webex/pages/pay.tsx b/src/webex/pages/pay.tsx
index 7f36cb66..714e3b0a 100644
--- a/src/webex/pages/pay.tsx
+++ b/src/webex/pages/pay.tsx
@@ -78,17 +78,15 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: 
string }) {
   let contractTerms: ContractTerms;
 
   try {
-    contractTerms = 
codecForContractTerms().decode(JSON.parse(payStatus.contractTermsRaw));
+    contractTerms = codecForContractTerms().decode(
+      JSON.parse(payStatus.contractTermsRaw),
+    );
   } catch (e) {
     // This should never happen, as the wallet is supposed to check the 
contract terms
     // before storing them.
     console.error(e);
     console.log("raw contract terms were", payStatus.contractTermsRaw);
-    return (
-      <span>
-        Invalid contract terms.
-      </span>
-    );
+    return <span>Invalid contract terms.</span>;
   }
 
   if (!contractTerms) {
@@ -149,7 +147,9 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: 
string }) {
 
       {insufficientBalance ? (
         <div>
-          <p style={{color: "red", fontWeight: "bold"}}>Unable to pay: Your 
balance is insufficient.</p>
+          <p style={{ color: "red", fontWeight: "bold" }}>
+            Unable to pay: Your balance is insufficient.
+          </p>
         </div>
       ) : null}
 
@@ -168,7 +168,8 @@ function TalerPayDialog({ talerPayUri }: { talerPayUri: 
string }) {
           <ProgressButton
             loading={loading}
             disabled={insufficientBalance}
-            onClick={() => doPayment()}>
+            onClick={() => doPayment()}
+          >
             {i18n.str`Confirm payment`}
           </ProgressButton>
         </div>
diff --git a/src/webex/pages/payback.html b/src/webex/pages/payback.html
index d6fe334c..70694954 100644
--- a/src/webex/pages/payback.html
+++ b/src/webex/pages/payback.html
@@ -1,34 +1,34 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Payback</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Payback</title>
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <link rel="icon" href="/img/icon.png" />
 
-  <link rel="icon" href="/img/icon.png">
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/payback-bundle.js"></script>
 
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/payback-bundle.js"></script>
-
-  <style>
-    body {
-      font-size: 100%;
-    }
-    .tree-item {
-            margin: 2em;
-            border-radius: 5px;
-            border: 1px solid gray;
-            padding: 1em;
-    }
-    .button-linky {
-      background: none;
-      color: black;
-      text-decoration: underline;
-      border: none;
-    }
-  </style>
+    <style>
+      body {
+        font-size: 100%;
+      }
+      .tree-item {
+        margin: 2em;
+        border-radius: 5px;
+        border: 1px solid gray;
+        padding: 1em;
+      }
+      .button-linky {
+        background: none;
+        color: black;
+        text-decoration: underline;
+        border: none;
+      }
+    </style>
+  </head>
 
   <body>
     <div id="container"></div>
diff --git a/src/webex/pages/popup.css b/src/webex/pages/popup.css
index 4cae6617..cca00239 100644
--- a/src/webex/pages/popup.css
+++ b/src/webex/pages/popup.css
@@ -1,4 +1,3 @@
-
 /**
  * @author Gabor X. Toth
  * @author Marcello Stanisci
@@ -6,182 +5,181 @@
  */
 
 body {
-    min-height: 20em;
-    width: 30em;
-    margin: 0;
-    padding: 0;
-    max-height: 800px;
-    overflow: hidden;
-    background-color: #f8faf7;
-    font-family: Arial, Helvetica, sans-serif;
+  min-height: 20em;
+  width: 30em;
+  margin: 0;
+  padding: 0;
+  max-height: 800px;
+  overflow: hidden;
+  background-color: #f8faf7;
+  font-family: Arial, Helvetica, sans-serif;
 }
 
 .nav {
-    background-color: #033;
-    padding: 0.5em 0;
+  background-color: #033;
+  padding: 0.5em 0;
 }
 
 .nav a {
-    color: #f8faf7;
-    padding: 0.7em 1.4em;
-    text-decoration: none;
+  color: #f8faf7;
+  padding: 0.7em 1.4em;
+  text-decoration: none;
 }
 
 .nav a.active {
-    background-color: #f8faf7;
-    color: #000;
-    font-weight: bold;
+  background-color: #f8faf7;
+  color: #000;
+  font-weight: bold;
 }
 
-
 .container {
-    overflow-y: scroll;
-    max-height: 400px;
+  overflow-y: scroll;
+  max-height: 400px;
 }
 
 .abbrev {
-    text-decoration-style: dotted;
+  text-decoration-style: dotted;
 }
 
 #content {
-    padding: 1em;
+  padding: 1em;
 }
 
-
 #wallet-table .amount {
-    text-align: right;
+  text-align: right;
 }
 
 .hidden {
-    display: none;
+  display: none;
 }
 
 #transactions-table th,
 #transactions-table td {
-    padding: 0.2em 0.5em;
+  padding: 0.2em 0.5em;
 }
 
 #reserve-create table {
-    width: 100%;
+  width: 100%;
 }
 
 #reserve-create table td.label {
-    width: 5em;
+  width: 5em;
 }
 
 #reserve-create table .input input[type="text"] {
-    width: 100%;
+  width: 100%;
 }
 
 .historyItem {
-    min-width: 380px;
-    display: flex;
-    flex-direction: row;
-    border-bottom: 1px solid #d9dbd8;
-    padding: 0.5em;
-    align-items: center;
-  }
-  
-  .historyItem .amount {
-    font-size: 110%;
-    font-weight: bold;
-    text-align: right;
-  }
-  
-  .historyDate,
-  .historyTitle,
-  .historyText,
-  .historySmall {
-    margin: 0.3em;
-  }
-  
-  .historyDate {
-    font-size: 90%;
-    color: slategray;
-    text-align: right;
-  }
-  
-  .historyLeft {
-    display: flex;
-    flex-direction: column;
-    text-align: right;
-  }
-  
-  .historyContent {
-    flex: 1;
-  }
-  
-  .historyTitle {
-    font-weight: 400;
-  }
-  
-  .historyText {
-    font-size: 90%;
-  }
-  
-  .historySmall {
-    font-size: 70%;
-    text-transform: uppercase;
-  }
-  
-  .historyAmount {
-    flex-grow: 1;
-  }
-  
-  .historyAmount .primary {
-    font-size: 100%;
-  }
-  
-  .historyAmount .secondary {
-    font-size: 80%;
-  }
-  
-  .historyAmount .positive {
-    color: #088;
-  }
-  
-  .historyAmount .positive:before {
-    content: "+";
-  }
-  
-  .historyAmount .negative {
-    color: #800
-  }
-  
-  .historyAmount .negative:before {
-    color: #800;
-    content: "-";
-  }
-  .icon {
-    margin: 0 10px;
-    text-align: center;
-    width: 35px;
-    font-size: 20px;
-    border-radius: 50%;
-    background: #ccc;
-    color: #fff;
-    padding-top: 4px;
-    height: 30px;
-  }
-  
-  .option {
-      text-transform: uppercase;
-      text-align: right;
-      padding: 0.4em;
-      font-size: 0.9em;
-  }
-  
-  input[type=checkbox], input[type=radio] {
-    vertical-align: middle;
-    position: relative;
-    bottom: 1px;
-  }
-  
-  input[type=radio] { 
-    bottom: 2px; 
-  } 
-
-  .balance {
-      text-align: center;
-      padding-top: 2em;
-  }
\ No newline at end of file
+  min-width: 380px;
+  display: flex;
+  flex-direction: row;
+  border-bottom: 1px solid #d9dbd8;
+  padding: 0.5em;
+  align-items: center;
+}
+
+.historyItem .amount {
+  font-size: 110%;
+  font-weight: bold;
+  text-align: right;
+}
+
+.historyDate,
+.historyTitle,
+.historyText,
+.historySmall {
+  margin: 0.3em;
+}
+
+.historyDate {
+  font-size: 90%;
+  color: slategray;
+  text-align: right;
+}
+
+.historyLeft {
+  display: flex;
+  flex-direction: column;
+  text-align: right;
+}
+
+.historyContent {
+  flex: 1;
+}
+
+.historyTitle {
+  font-weight: 400;
+}
+
+.historyText {
+  font-size: 90%;
+}
+
+.historySmall {
+  font-size: 70%;
+  text-transform: uppercase;
+}
+
+.historyAmount {
+  flex-grow: 1;
+}
+
+.historyAmount .primary {
+  font-size: 100%;
+}
+
+.historyAmount .secondary {
+  font-size: 80%;
+}
+
+.historyAmount .positive {
+  color: #088;
+}
+
+.historyAmount .positive:before {
+  content: "+";
+}
+
+.historyAmount .negative {
+  color: #800;
+}
+
+.historyAmount .negative:before {
+  color: #800;
+  content: "-";
+}
+.icon {
+  margin: 0 10px;
+  text-align: center;
+  width: 35px;
+  font-size: 20px;
+  border-radius: 50%;
+  background: #ccc;
+  color: #fff;
+  padding-top: 4px;
+  height: 30px;
+}
+
+.option {
+  text-transform: uppercase;
+  text-align: right;
+  padding: 0.4em;
+  font-size: 0.9em;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+  vertical-align: middle;
+  position: relative;
+  bottom: 1px;
+}
+
+input[type="radio"] {
+  bottom: 2px;
+}
+
+.balance {
+  text-align: center;
+  padding-top: 2em;
+}
diff --git a/src/webex/pages/popup.html b/src/webex/pages/popup.html
index 7929da76..030641d6 100644
--- a/src/webex/pages/popup.html
+++ b/src/webex/pages/popup.html
@@ -1,18 +1,16 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="utf-8" />
 
-<head>
-  <meta charset="utf-8">
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="stylesheet" type="text/css" href="popup.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
-  <link rel="stylesheet" type="text/css" href="popup.css">
-
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/popup-bundle.js"></script>
-</head>
-
-<body>
-  <div id="container" style="margin:0;padding:0"></div>
-</body>
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/popup-bundle.js"></script>
+  </head>
 
+  <body>
+    <div id="container" style="margin: 0; padding: 0;"></div>
+  </body>
 </html>
diff --git a/src/webex/pages/popup.tsx b/src/webex/pages/popup.tsx
index 44f45f9d..7b20f222 100644
--- a/src/webex/pages/popup.tsx
+++ b/src/webex/pages/popup.tsx
@@ -29,10 +29,7 @@ import * as i18n from "../i18n";
 import { AmountJson } from "../../util/amounts";
 import * as Amounts from "../../util/amounts";
 
-import {
-  WalletBalance,
-  WalletBalanceEntry,
-} from "../../types/walletTypes";
+import { WalletBalance, WalletBalanceEntry } from "../../types/walletTypes";
 
 import {
   abbrev,
@@ -98,7 +95,7 @@ class Router extends React.Component<any, any> {
     console.log("rendering route", route);
     let defaultChild: React.ReactChild | null = null;
     let foundChild: React.ReactChild | null = null;
-    React.Children.forEach(this.props.children, child => {
+    React.Children.forEach(this.props.children, (child) => {
       const childProps: any = (child as any).props;
       if (!childProps) {
         return;
@@ -188,7 +185,7 @@ function bigAmount(amount: AmountJson): JSX.Element {
   const v = amount.value + amount.fraction / Amounts.fractionalBase;
   return (
     <span>
-      <span style={{ fontSize: "5em", display: 'block'}}>{v}</span>{" "}
+      <span style={{ fontSize: "5em", display: "block" }}>{v}</span>{" "}
       <span>{amount.currency}</span>
     </span>
   );
@@ -281,7 +278,7 @@ class WalletBalanceView extends React.Component<any, any> {
       );
     }
 
-    const l = [incoming, payment].filter(x => x !== undefined);
+    const l = [incoming, payment].filter((x) => x !== undefined);
     if (l.length === 0) {
       return <span />;
     }
@@ -300,7 +297,7 @@ class WalletBalanceView extends React.Component<any, any> {
     const wallet = this.balance;
     if (this.gotError) {
       return (
-        <div className='balance'>
+        <div className="balance">
           <p>{i18n.str`Error: could not retrieve balance information.`}</p>
           <p>
             Click <PageLink pageName="welcome.html">here</PageLink> for help 
and
@@ -313,7 +310,7 @@ class WalletBalanceView extends React.Component<any, any> {
       return <span></span>;
     }
     console.log(wallet);
-    const listing = Object.keys(wallet.byCurrency).map(key => {
+    const listing = Object.keys(wallet.byCurrency).map((key) => {
       const entry: WalletBalanceEntry = wallet.byCurrency[key];
       return (
         <p>
@@ -321,7 +318,11 @@ class WalletBalanceView extends React.Component<any, any> {
         </p>
       );
     });
-    return listing.length > 0 ? <div className='balance'>{listing}</div> : 
<EmptyBalanceView />;
+    return listing.length > 0 ? (
+      <div className="balance">{listing}</div>
+    ) : (
+      <EmptyBalanceView />
+    );
   }
 }
 
@@ -356,7 +357,7 @@ function HistoryItem({
   invalid,
   timestamp,
   icon,
-  negative = false
+  negative = false,
 }: HistoryItemProps) {
   function formatDate(timestamp: number | "never") {
     if (timestamp !== "never") {
@@ -425,7 +426,7 @@ function HistoryItem({
 
 function amountDiff(
   total: string | Amounts.AmountJson,
-  partial: string | Amounts.AmountJson
+  partial: string | Amounts.AmountJson,
 ): Amounts.AmountJson | string {
   let a = typeof total === "string" ? Amounts.parse(total) : total;
   let b = typeof partial === "string" ? Amounts.parse(partial) : partial;
@@ -436,12 +437,11 @@ function amountDiff(
   }
 }
 
-
 function parseSummary(summary: string) {
   let parsed = summary.split(/: (.+)/);
   return {
     merchant: parsed[0],
-    item: parsed[1]
+    item: parsed[1],
   };
 }
 
@@ -454,7 +454,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
           small={i18n.str`Refresh sessions has completed`}
           fees={amountDiff(
             historyItem.amountRefreshedRaw,
-            historyItem.amountRefreshedEffective
+            historyItem.amountRefreshedEffective,
           )}
         />
       );
@@ -462,7 +462,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
 
     case "order-refused": {
       const { merchant, item } = parseSummary(
-        historyItem.orderShortInfo.summary
+        historyItem.orderShortInfo.summary,
       );
       return (
         <HistoryItem
@@ -477,7 +477,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
 
     case "order-redirected": {
       const { merchant, item } = parseSummary(
-        historyItem.newOrderShortInfo.summary
+        historyItem.newOrderShortInfo.summary,
       );
       return (
         <HistoryItem
@@ -492,7 +492,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
 
     case "payment-aborted": {
       const { merchant, item } = parseSummary(
-        historyItem.orderShortInfo.summary
+        historyItem.orderShortInfo.summary,
       );
       return (
         <HistoryItem
@@ -510,18 +510,15 @@ function formatHistoryItem(historyItem: HistoryEvent) {
     case "payment-sent": {
       const url = historyItem.orderShortInfo.fulfillmentUrl;
       const { merchant, item } = parseSummary(
-        historyItem.orderShortInfo.summary
+        historyItem.orderShortInfo.summary,
       );
       const fees = amountDiff(
         historyItem.amountPaidWithFees,
-        historyItem.orderShortInfo.amount
+        historyItem.orderShortInfo.amount,
       );
       const fulfillmentLinkElem = (
         <Fragment>
-          <a
-            href={url}
-            onClick={openTab(url)}
-          >
+          <a href={url} onClick={openTab(url)}>
             {item ? abbrev(item, 30) : null}
           </a>
         </Fragment>
@@ -542,14 +539,11 @@ function formatHistoryItem(historyItem: HistoryEvent) {
     case "order-accepted": {
       const url = historyItem.orderShortInfo.fulfillmentUrl;
       const { merchant, item } = parseSummary(
-        historyItem.orderShortInfo.summary
+        historyItem.orderShortInfo.summary,
       );
       const fulfillmentLinkElem = (
         <Fragment>
-          <a
-            href={url}
-            onClick={openTab(url)}
-          >
+          <a href={url} onClick={openTab(url)}>
             {item ? abbrev(item, 40) : null}
           </a>
         </Fragment>
@@ -573,7 +567,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
           small={i18n.str`Reserve balance updated`}
           fees={amountDiff(
             historyItem.amountExpected,
-            historyItem.amountReserveBalance
+            historyItem.amountReserveBalance,
           )}
         />
       );
@@ -593,9 +587,9 @@ function formatHistoryItem(historyItem: HistoryEvent) {
           fees={amountDiff(
             amountDiff(
               historyItem.amountRefundedRaw,
-              historyItem.amountRefundedInvalid
+              historyItem.amountRefundedInvalid,
             ),
-            historyItem.amountRefundedEffective
+            historyItem.amountRefundedEffective,
           )}
         />
       );
@@ -604,7 +598,7 @@ function formatHistoryItem(historyItem: HistoryEvent) {
       const exchange = new URL(historyItem.exchangeBaseUrl).host;
       const fees = amountDiff(
         historyItem.amountWithdrawnRaw,
-        historyItem.amountWithdrawnEffective
+        historyItem.amountWithdrawnEffective,
       );
       return (
         <HistoryItem
@@ -663,9 +657,9 @@ class WalletHistory extends React.Component<any, any> {
     "refreshed",
     "reserve-balance-updated",
     "exchange-updated",
-    "exchange-added"
+    "exchange-added",
   ];
- 
+
   componentWillMount() {
     this.update();
     this.setState({ filter: true });
@@ -678,7 +672,7 @@ class WalletHistory extends React.Component<any, any> {
   }
 
   update() {
-    chrome.runtime.sendMessage({ type: "get-history" }, resp => {
+    chrome.runtime.sendMessage({ type: "get-history" }, (resp) => {
       if (this.unmounted) {
         return;
       }
@@ -709,15 +703,13 @@ class WalletHistory extends React.Component<any, any> {
     }
 
     const listing: any[] = [];
-    const messages = history
-      .reverse()
-      .filter(hEvent => {
-        if (!this.state.filter) return true;
-        return this.hidenTypes.indexOf(hEvent.type) === -1;
-      });
+    const messages = history.reverse().filter((hEvent) => {
+      if (!this.state.filter) return true;
+      return this.hidenTypes.indexOf(hEvent.type) === -1;
+    });
 
     for (const record of messages) {
-      const item = (<HistoryComponent key={record.eventId} record={record} />);
+      const item = <HistoryComponent key={record.eventId} record={record} />;
       listing.push(item);
     }
 
@@ -821,5 +813,5 @@ function WalletPopup() {
 
 registerMountPage(() => {
   chrome.runtime.connect({ name: "popup" });
-  return <WalletPopup />
+  return <WalletPopup />;
 });
diff --git a/src/webex/pages/redirect.html b/src/webex/pages/redirect.html
index 9d07d3d2..67fddb52 100644
--- a/src/webex/pages/redirect.html
+++ b/src/webex/pages/redirect.html
@@ -1,14 +1,12 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="utf-8" />
 
-<head>
-  <meta charset="utf-8">
-
-  <script src="/src/webex/pages/redirect.js"></script>
-</head>
-
-<body>
-  Redirecting to extension page ...
-</body>
+    <script src="/src/webex/pages/redirect.js"></script>
+  </head>
 
+  <body>
+    Redirecting to extension page ...
+  </body>
 </html>
diff --git a/src/webex/pages/redirect.js b/src/webex/pages/redirect.js
index 879f5b53..547b225b 100644
--- a/src/webex/pages/redirect.js
+++ b/src/webex/pages/redirect.js
@@ -2,7 +2,7 @@
  * This is the entry point for redirects, and should be the only
  * web-accessible resource declared in the manifest.  This prevents
  * malicious websites from embedding wallet pages in them.
- * 
+ *
  * We still need this redirect page since a webRequest can only directly
  * redirect to pages inside the extension that are a web-accessible resource.
  */
diff --git a/src/webex/pages/refund.html b/src/webex/pages/refund.html
index 203fda21..c671bb19 100644
--- a/src/webex/pages/refund.html
+++ b/src/webex/pages/refund.html
@@ -1,16 +1,16 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Refund Status</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Refund Status</title>
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <link rel="icon" href="/img/icon.png" />
 
-  <link rel="icon" href="/img/icon.png">
-
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/refund-bundle.js"></script>
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/refund-bundle.js"></script>
+  </head>
 
   <body>
     <section id="main">
diff --git a/src/webex/pages/refund.tsx b/src/webex/pages/refund.tsx
index 2a3f65d2..389d5e56 100644
--- a/src/webex/pages/refund.tsx
+++ b/src/webex/pages/refund.tsx
@@ -65,11 +65,10 @@ function RefundStatusView(props: { talerRefundUri: string 
}) {
       <h2>Refund Status</h2>
       <p>
         The product <em>{purchaseDetails.contractTerms.summary!}</em> has
-        received a total refund of <AmountView 
amount={purchaseDetails.totalRefundAmount} />.
-      </p>
-      <p>
-        Note that additional fees from the exchange may apply.
+        received a total refund of{" "}
+        <AmountView amount={purchaseDetails.totalRefundAmount} />.
       </p>
+      <p>Note that additional fees from the exchange may apply.</p>
     </>
   );
 }
diff --git a/src/webex/pages/reset-required.html 
b/src/webex/pages/reset-required.html
index 72b176b4..124d5f46 100644
--- a/src/webex/pages/reset-required.html
+++ b/src/webex/pages/reset-required.html
@@ -1,30 +1,27 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Select Taler Provider</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Select Taler Provider</title>
+    <link rel="icon" href="/img/icon.png" />
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
 
-  <link rel="icon" href="/img/icon.png">
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
-  <link rel="stylesheet" type="text/css" href="../style/pure.css">
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/reset-required-bundle.js"></script>
 
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/reset-required-bundle.js"></script>
-
-  <style>
-    body {
-      font-size: 100%;
-      overflow-y: scroll;
-    }
-  </style>
-
-</head>
-
-<body>
-  <section id="main">
-    <div id="container"></div>
-  </section>
-</body>
+    <style>
+      body {
+        font-size: 100%;
+        overflow-y: scroll;
+      }
+    </style>
+  </head>
 
+  <body>
+    <section id="main">
+      <div id="container"></div>
+    </section>
+  </body>
 </html>
diff --git a/src/webex/pages/reset-required.tsx 
b/src/webex/pages/reset-required.tsx
index 6631705a..81f21f45 100644
--- a/src/webex/pages/reset-required.tsx
+++ b/src/webex/pages/reset-required.tsx
@@ -14,7 +14,6 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-
 /**
  * Page to inform the user when a database reset is required.
  *
@@ -38,16 +37,15 @@ class State {
   resetRequired: boolean;
 }
 
-
 class ResetNotification extends React.Component<any, State> {
   constructor(props: any) {
     super(props);
-    this.state = {checked: false, resetRequired: true};
+    this.state = { checked: false, resetRequired: true };
     setInterval(() => this.update(), 500);
   }
   async update() {
     const res = await wxApi.checkUpgrade();
-    this.setState({resetRequired: res.dbResetRequired});
+    this.setState({ resetRequired: res.dbResetRequired });
   }
   render() {
     if (this.state.resetRequired) {
@@ -55,32 +53,42 @@ class ResetNotification extends React.Component<any, State> 
{
         <div>
           <h1>Manual Reset Reqired</h1>
           <p>
-              The wallet's database in your browser is incompatible with the 
{" "}
-              currently installed wallet.  Please reset manually.
+            The wallet's database in your browser is incompatible with the{" "}
+            currently installed wallet. Please reset manually.
           </p>
-          <p>Once the database format has stabilized, we will provide 
automatic upgrades.</p>
-          <input id="check"
-                 type="checkbox"
-                 checked={this.state.checked}
-                 onChange={(e) => this.setState({checked: e.target.checked})} 
/>{" "}
+          <p>
+            Once the database format has stabilized, we will provide automatic
+            upgrades.
+          </p>
+          <input
+            id="check"
+            type="checkbox"
+            checked={this.state.checked}
+            onChange={(e) => this.setState({ checked: e.target.checked })}
+          />{" "}
           <label htmlFor="check">
             I understand that I will lose all my data
           </label>
           <br />
-          <button className="pure-button" disabled={!this.state.checked} 
onClick={() => wxApi.resetDb()}>Reset</button>
+          <button
+            className="pure-button"
+            disabled={!this.state.checked}
+            onClick={() => wxApi.resetDb()}
+          >
+            Reset
+          </button>
         </div>
       );
     }
     return (
       <div>
-        <h1>Everything is fine!</h1>
-        A reset is not required anymore, you can close this page.
+        <h1>Everything is fine!</h1>A reset is not required anymore, you can
+        close this page.
       </div>
     );
   }
 }
 
-
 document.addEventListener("DOMContentLoaded", () => {
-  ReactDOM.render(<ResetNotification />, document.getElementById( 
"container")!);
+  ReactDOM.render(<ResetNotification />, 
document.getElementById("container")!);
 });
diff --git a/src/webex/pages/return-coins.html 
b/src/webex/pages/return-coins.html
index c0ab218d..54106f3e 100644
--- a/src/webex/pages/return-coins.html
+++ b/src/webex/pages/return-coins.html
@@ -1,17 +1,17 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Return Coins to Bank Account</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Return Coins to Bank Account</title>
+    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="stylesheet" type="text/css" href="../style/pure.css">
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <link rel="icon" href="/img/icon.png" />
 
-  <link rel="icon" href="/img/icon.png">
-
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/return-coins-bundle.js"></script>
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/return-coins-bundle.js"></script>
+  </head>
 
   <body>
     <div id="container"></div>
diff --git a/src/webex/pages/return-coins.tsx b/src/webex/pages/return-coins.tsx
index 7c835da0..fd9238ee 100644
--- a/src/webex/pages/return-coins.tsx
+++ b/src/webex/pages/return-coins.tsx
@@ -20,7 +20,6 @@
  * @author Florian Dold
  */
 
-
 /**
  * Imports.
  */
@@ -28,20 +27,13 @@
 import { AmountJson } from "../../util/amounts";
 import * as Amounts from "../../util/amounts";
 
-import {
-  SenderWireInfos,
-  WalletBalance,
-} from "../../types/walletTypes";
+import { SenderWireInfos, WalletBalance } from "../../types/walletTypes";
 
 import * as i18n from "../i18n";
 
 import * as wire from "../../util/wire";
 
-import {
-  getBalance,
-  getSenderWireInfos,
-  returnCoins,
-} from "../wxApi";
+import { getBalance, getSenderWireInfos, returnCoins } from "../wxApi";
 
 import { renderAmount } from "../renderHtml";
 
@@ -60,17 +52,27 @@ interface ReturnSelectionItemState {
   currency: string;
 }
 
-class ReturnSelectionItem extends React.Component<ReturnSelectionItemProps, 
ReturnSelectionItemState> {
+class ReturnSelectionItem extends React.Component<
+  ReturnSelectionItemProps,
+  ReturnSelectionItemState
+> {
   constructor(props: ReturnSelectionItemProps) {
     super(props);
     const exchange = this.props.exchangeUrl;
     const wireTypes = this.props.senderWireInfos.exchangeWireTypes;
-    const supportedWires = this.props.senderWireInfos.senderWires.filter((x) 
=> {
-      return wireTypes[exchange] && wireTypes[exchange].indexOf((x as 
any).type) >= 0;
-    });
+    const supportedWires = this.props.senderWireInfos.senderWires.filter(
+      (x) => {
+        return (
+          wireTypes[exchange] &&
+          wireTypes[exchange].indexOf((x as any).type) >= 0
+        );
+      },
+    );
     this.state = {
       currency: props.balance.byExchange[props.exchangeUrl].available.currency,
-      selectedValue: 
Amounts.toString(props.balance.byExchange[props.exchangeUrl].available),
+      selectedValue: Amounts.toString(
+        props.balance.byExchange[props.exchangeUrl].available,
+      ),
       selectedWire: "",
       supportedWires,
     };
@@ -83,28 +85,46 @@ class ReturnSelectionItem extends 
React.Component<ReturnSelectionItemProps, Retu
       <div key={exchange}>
         <h2>Exchange {exchange}</h2>
         <p>Available amount: {renderAmount(byExchange[exchange].available)}</p>
-        <p>Supported wire methods: {wireTypes[exchange].length ? 
wireTypes[exchange].join(", ") : "none"}</p>
-        <p>Wire {""}
-            <input
-              type="text"
-              size={this.state.selectedValue.length || 1}
-              value={this.state.selectedValue}
-              onChange={(evt) => this.setState({selectedValue: 
evt.target.value})}
-              style={{textAlign: "center"}}
-            /> {this.props.balance.byExchange[exchange].available.currency} 
{""}
-            to account {""}
-            <select value={this.state.selectedWire} onChange={(evt) => 
this.setState({selectedWire: evt.target.value})}>
-              <option style={{display: "none"}}>Select account</option>
-              {this.state.supportedWires.map((w, n) =>
-                <option value={n.toString()} key={JSON.stringify(w)}>{n + 1}: 
{wire.summarizeWire(w)}</option>,
-              )}
-            </select>.
+        <p>
+          Supported wire methods:{" "}
+          {wireTypes[exchange].length ? wireTypes[exchange].join(", ") : 
"none"}
+        </p>
+        <p>
+          Wire {""}
+          <input
+            type="text"
+            size={this.state.selectedValue.length || 1}
+            value={this.state.selectedValue}
+            onChange={(evt) =>
+              this.setState({ selectedValue: evt.target.value })
+            }
+            style={{ textAlign: "center" }}
+          />{" "}
+          {this.props.balance.byExchange[exchange].available.currency} {""}
+          to account {""}
+          <select
+            value={this.state.selectedWire}
+            onChange={(evt) =>
+              this.setState({ selectedWire: evt.target.value })
+            }
+          >
+            <option style={{ display: "none" }}>Select account</option>
+            {this.state.supportedWires.map((w, n) => (
+              <option value={n.toString()} key={JSON.stringify(w)}>
+                {n + 1}: {wire.summarizeWire(w)}
+              </option>
+            ))}
+          </select>
+          .
         </p>
-        {this.state.selectedWire
-          ? <button className="pure-button button-success" onClick={() => 
this.select()}>
-              {i18n.str`Wire to bank account`}
-            </button>
-          : null}
+        {this.state.selectedWire ? (
+          <button
+            className="pure-button button-success"
+            onClick={() => this.select()}
+          >
+            {i18n.str`Wire to bank account`}
+          </button>
+        ) : null}
       </div>
     );
   }
@@ -133,16 +153,23 @@ interface ReturnSelectionListProps {
   selectDetail(d: SelectedDetail): void;
 }
 
-class ReturnSelectionList extends React.Component<ReturnSelectionListProps, 
{}> {
+class ReturnSelectionList extends React.Component<
+  ReturnSelectionListProps,
+  {}
+> {
   render(): JSX.Element {
     const byExchange = this.props.balance.byExchange;
     const exchanges = Object.keys(byExchange);
     if (!exchanges.length) {
-      return <p className="errorbox">Currently no funds available to 
transfer.</p>;
+      return (
+        <p className="errorbox">Currently no funds available to transfer.</p>
+      );
     }
     return (
       <div>
-      {exchanges.map((e) => <ReturnSelectionItem key={e} exchangeUrl={e} 
{...this.props} />)}
+        {exchanges.map((e) => (
+          <ReturnSelectionItem key={e} exchangeUrl={e} {...this.props} />
+        ))}
       </div>
     );
   }
@@ -154,7 +181,6 @@ interface SelectedDetail {
   exchange: string;
 }
 
-
 interface ReturnConfirmationProps {
   detail: SelectedDetail;
   cancel(): void;
@@ -165,11 +191,19 @@ class ReturnConfirmation extends 
React.Component<ReturnConfirmationProps, {}> {
   render() {
     return (
       <div>
-        <p>Please confirm if you want to transmit 
<strong>{renderAmount(this.props.detail.amount)}</strong> at {""}
-           {this.props.detail.exchange} to account {""}
-            <strong style={{whiteSpace: 
"nowrap"}}>{wire.summarizeWire(this.props.detail.senderWire)}</strong>.
+        <p>
+          Please confirm if you want to transmit{" "}
+          <strong>{renderAmount(this.props.detail.amount)}</strong> at {""}
+          {this.props.detail.exchange} to account {""}
+          <strong style={{ whiteSpace: "nowrap" }}>
+            {wire.summarizeWire(this.props.detail.senderWire)}
+          </strong>
+          .
         </p>
-        <button className="pure-button button-success" onClick={() => 
this.props.confirm()}>
+        <button
+          className="pure-button button-success"
+          onClick={() => this.props.confirm()}
+        >
           {i18n.str`Confirm`}
         </button>
         <button className="pure-button" onClick={() => this.props.cancel()}>
@@ -213,7 +247,7 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
   }
 
   selectDetail(d: SelectedDetail) {
-    this.setState({selectedReturn: d});
+    this.setState({ selectedReturn: d });
   }
 
   async confirm() {
@@ -223,11 +257,17 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
     }
     await returnCoins(selectedReturn);
     await this.update();
-    this.setState({selectedReturn: undefined, lastConfirmedDetail: 
selectedReturn});
+    this.setState({
+      selectedReturn: undefined,
+      lastConfirmedDetail: selectedReturn,
+    });
   }
 
   async cancel() {
-    this.setState({selectedReturn: undefined, lastConfirmedDetail: undefined});
+    this.setState({
+      selectedReturn: undefined,
+      lastConfirmedDetail: undefined,
+    });
   }
 
   render() {
@@ -248,25 +288,28 @@ class ReturnCoins extends React.Component<{}, 
ReturnCoinsState> {
       );
     }
     return (
-        <div id="main">
-          <h1>Wire electronic cash back to own bank account</h1>
-          <p>You can send coins back into your own bank account.  Note that
-          you're acting as a merchant when doing this, and thus the same fees 
apply.</p>
-          {this.state.lastConfirmedDetail
-            ? <p className="okaybox">
-                Transfer of 
{renderAmount(this.state.lastConfirmedDetail.amount)} successfully initiated.
-              </p>
-            : null}
-          <ReturnSelectionList
-            selectDetail={(d) => this.selectDetail(d)}
-            balance={balance}
-            senderWireInfos={senderWireInfos} />
-        </div>
+      <div id="main">
+        <h1>Wire electronic cash back to own bank account</h1>
+        <p>
+          You can send coins back into your own bank account. Note that you're
+          acting as a merchant when doing this, and thus the same fees apply.
+        </p>
+        {this.state.lastConfirmedDetail ? (
+          <p className="okaybox">
+            Transfer of 
{renderAmount(this.state.lastConfirmedDetail.amount)}{" "}
+            successfully initiated.
+          </p>
+        ) : null}
+        <ReturnSelectionList
+          selectDetail={(d) => this.selectDetail(d)}
+          balance={balance}
+          senderWireInfos={senderWireInfos}
+        />
+      </div>
     );
   }
 }
 
-
 function main() {
   ReactDOM.render(<ReturnCoins />, document.getElementById("container")!);
 }
diff --git a/src/webex/pages/show-db.html b/src/webex/pages/show-db.html
index 71408955..ae77e3fb 100644
--- a/src/webex/pages/show-db.html
+++ b/src/webex/pages/show-db.html
@@ -1,16 +1,16 @@
-<!doctype html>
+<!DOCTYPE html>
 <html>
   <head>
-    <meta charset="UTF-8">
+    <meta charset="UTF-8" />
     <title>Taler Wallet: Reserve Created</title>
-    <link rel="stylesheet" type="text/css" href="../style/wallet.css">
-    <link rel="icon" href="/img/icon.png">
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
+    <link rel="icon" href="/img/icon.png" />
     <script src="/dist/page-common-bundle.js"></script>
     <script src="/dist/show-db-bundle.js"></script>
   </head>
   <body>
     <h1>DB Dump</h1>
-    <input type="file" id="fileInput" style="display:none">
+    <input type="file" id="fileInput" style="display: none;" />
     <button id="import">Import Dump</button>
     <button id="download">Download Dump</button>
     <pre id="dump"></pre>
diff --git a/src/webex/pages/show-db.ts b/src/webex/pages/show-db.ts
index d9595138..16ea80d2 100644
--- a/src/webex/pages/show-db.ts
+++ b/src/webex/pages/show-db.ts
@@ -14,15 +14,19 @@
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-
 /**
  * Wallet database dump for debugging.
  *
  * @author Florian Dold
  */
 
-function replacer(match: string, pIndent: string, pKey: string, pVal: string,
-                  pEnd: string) {
+function replacer(
+  match: string,
+  pIndent: string,
+  pKey: string,
+  pVal: string,
+  pEnd: string,
+) {
   const key = "<span class=json-key>";
   const val = "<span class=json-value>";
   const str = "<span class=json-string>";
@@ -36,18 +40,18 @@ function replacer(match: string, pIndent: string, pKey: 
string, pVal: string,
   return r + (pEnd || "");
 }
 
-
 function prettyPrint(obj: any) {
-  const jsonLine = /^( *)("[\w]+": )?("[^"]*"|[\w.+-]*)?([,[{])?$/mg;
+  const jsonLine = /^( *)("[\w]+": )?("[^"]*"|[\w.+-]*)?([,[{])?$/gm;
   return JSON.stringify(obj, null as any, 3)
-             .replace(/&/g, "&amp;").replace(/\\"/g, "&quot;")
-             .replace(/</g, "&lt;").replace(/>/g, "&gt;")
-             .replace(jsonLine, replacer);
+    .replace(/&/g, "&amp;")
+    .replace(/\\"/g, "&quot;")
+    .replace(/</g, "&lt;")
+    .replace(/>/g, "&gt;")
+    .replace(jsonLine, replacer);
 }
 
-
 document.addEventListener("DOMContentLoaded", () => {
-  chrome.runtime.sendMessage({type: "dump-db"}, (resp) => {
+  chrome.runtime.sendMessage({ type: "dump-db" }, (resp) => {
     const el = document.getElementById("dump");
     if (!el) {
       throw Error();
@@ -57,16 +61,18 @@ document.addEventListener("DOMContentLoaded", () => {
     document.getElementById("download")!.addEventListener("click", (evt) => {
       console.log("creating download");
       const element = document.createElement("a");
-      element.setAttribute("href", "data:text/plain;charset=utf-8," + 
encodeURIComponent(JSON.stringify(resp)));
+      element.setAttribute(
+        "href",
+        "data:text/plain;charset=utf-8," +
+          encodeURIComponent(JSON.stringify(resp)),
+      );
       element.setAttribute("download", "wallet-dump.txt");
       element.style.display = "none";
       document.body.appendChild(element);
       element.click();
     });
-
   });
 
-
   const fileInput = document.getElementById("fileInput")! as HTMLInputElement;
   fileInput.onchange = (evt) => {
     if (!fileInput.files || fileInput.files.length !== 1) {
@@ -79,9 +85,12 @@ document.addEventListener("DOMContentLoaded", () => {
       console.log("got file");
       const dump = JSON.parse(e.target.result);
       console.log("parsed contents", dump);
-      chrome.runtime.sendMessage({ type: "import-db", detail: { dump } }, 
(resp) => {
-        alert("loaded");
-      });
+      chrome.runtime.sendMessage(
+        { type: "import-db", detail: { dump } },
+        (resp) => {
+          alert("loaded");
+        },
+      );
     };
     console.log("reading file", file);
     fr.readAsText(file);
diff --git a/src/webex/pages/tip.html b/src/webex/pages/tip.html
index 72d91a12..0625640e 100644
--- a/src/webex/pages/tip.html
+++ b/src/webex/pages/tip.html
@@ -1,24 +1,21 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Received Tip</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Received Tip</title>
+    <link rel="icon" href="/img/icon.png" />
+    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="icon" href="/img/icon.png">
-  <link rel="stylesheet" type="text/css" href="../style/pure.css">
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
-
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/tip-bundle.js"></script>
-
-</head>
-
-<body>
-  <section id="main">
-    <h1>GNU Taler Wallet</h1>
-    <div id="container"></div>
-  </section>
-</body>
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/tip-bundle.js"></script>
+  </head>
 
+  <body>
+    <section id="main">
+      <h1>GNU Taler Wallet</h1>
+      <div id="container"></div>
+    </section>
+  </body>
 </html>
diff --git a/src/webex/pages/tip.tsx b/src/webex/pages/tip.tsx
index c44b343a..35e033c0 100644
--- a/src/webex/pages/tip.tsx
+++ b/src/webex/pages/tip.tsx
@@ -28,13 +28,16 @@ import * as i18n from "../i18n";
 
 import { acceptTip, getReserveCreationInfo, getTipStatus } from "../wxApi";
 
-import { WithdrawDetailView, renderAmount, ProgressButton } from 
"../renderHtml";
+import {
+  WithdrawDetailView,
+  renderAmount,
+  ProgressButton,
+} from "../renderHtml";
 
 import * as Amounts from "../../util/amounts";
 import { useState, useEffect } from "react";
 import { TipStatus } from "../../types/walletTypes";
 
-
 function TipDisplay(props: { talerTipUri: string }) {
   const [tipStatus, setTipStatus] = useState<TipStatus | undefined>(undefined);
   const [discarded, setDiscarded] = useState(false);
@@ -88,8 +91,7 @@ function TipDisplay(props: { talerTipUri: string }) {
       <form className="pure-form">
         <ProgressButton loading={loading} onClick={() => accept()}>
           Accept Tip
-        </ProgressButton>
-        {" "}
+        </ProgressButton>{" "}
         <button className="pure-button" type="button" onClick={() => 
discard()}>
           Discard tip
         </button>
diff --git a/src/webex/pages/welcome.html b/src/webex/pages/welcome.html
index 9a96d04a..8f17891e 100644
--- a/src/webex/pages/welcome.html
+++ b/src/webex/pages/welcome.html
@@ -1,24 +1,21 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Withdraw</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Withdraw</title>
+    <link rel="icon" href="/img/icon.png" />
+    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="icon" href="/img/icon.png">
-  <link rel="stylesheet" type="text/css" href="../style/pure.css">
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
-
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/welcome-bundle.js"></script>
-
-</head>
-
-<body>
-  <section id="main">
-    <h1>GNU Taler Wallet Installed!</h1>
-    <div id="container">Loading...</div>
-  </section>
-</body>
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/welcome-bundle.js"></script>
+  </head>
 
+  <body>
+    <section id="main">
+      <h1>GNU Taler Wallet Installed!</h1>
+      <div id="container">Loading...</div>
+    </section>
+  </body>
 </html>
diff --git a/src/webex/pages/welcome.tsx b/src/webex/pages/welcome.tsx
index e8f7028e..83f4f01d 100644
--- a/src/webex/pages/welcome.tsx
+++ b/src/webex/pages/welcome.tsx
@@ -68,7 +68,7 @@ function Diagnostics() {
         >
           <p>Problems detected:</p>
           <ol>
-            {diagnostics.errors.map(errMsg => (
+            {diagnostics.errors.map((errMsg) => (
               <li>{errMsg}</li>
             ))}
           </ol>
diff --git a/src/webex/pages/withdraw.html b/src/webex/pages/withdraw.html
index e5c52727..861b219f 100644
--- a/src/webex/pages/withdraw.html
+++ b/src/webex/pages/withdraw.html
@@ -1,24 +1,21 @@
 <!DOCTYPE html>
 <html>
+  <head>
+    <meta charset="UTF-8" />
+    <title>Taler Wallet: Withdraw</title>
 
-<head>
-  <meta charset="UTF-8">
-  <title>Taler Wallet: Withdraw</title>
+    <link rel="icon" href="/img/icon.png" />
+    <link rel="stylesheet" type="text/css" href="../style/pure.css" />
+    <link rel="stylesheet" type="text/css" href="../style/wallet.css" />
 
-  <link rel="icon" href="/img/icon.png">
-  <link rel="stylesheet" type="text/css" href="../style/pure.css">
-  <link rel="stylesheet" type="text/css" href="../style/wallet.css">
+    <script src="/dist/page-common-bundle.js"></script>
+    <script src="/dist/withdraw-bundle.js"></script>
+  </head>
 
-  <script src="/dist/page-common-bundle.js"></script>
-  <script src="/dist/withdraw-bundle.js"></script>
-
-</head>
-
-<body>
-  <section id="main">
-    <h1>GNU Taler Wallet</h1>
+  <body>
+    <section id="main">
+      <h1>GNU Taler Wallet</h1>
       <div class="fade" id="exchange-selection"></div>
-  </section>
-</body>
-
+    </section>
+  </body>
 </html>
diff --git a/src/webex/pages/withdraw.tsx b/src/webex/pages/withdraw.tsx
index c123e2a6..7a266531 100644
--- a/src/webex/pages/withdraw.tsx
+++ b/src/webex/pages/withdraw.tsx
@@ -127,7 +127,7 @@ function NewExchangeSelection(props: { talerWithdrawUri: 
string }) {
         <p>
           <input
             type="text"
-            onChange={e => setCustomUrl(e.target.value)}
+            onChange={(e) => setCustomUrl(e.target.value)}
             value={customUrl}
           />
         </p>
diff --git a/src/webex/renderHtml.tsx b/src/webex/renderHtml.tsx
index 3204c410..08e7de60 100644
--- a/src/webex/renderHtml.tsx
+++ b/src/webex/renderHtml.tsx
@@ -143,7 +143,7 @@ function AuditorDetailsView(props: {
   }
   return (
     <div>
-      {(rci.exchangeInfo.details?.auditors ?? []).map(a => (
+      {(rci.exchangeInfo.details?.auditors ?? []).map((a) => (
         <div>
           <h3>Auditor {a.auditor_url}</h3>
           <p>
@@ -214,7 +214,7 @@ function FeeDetailsView(props: {
         </tr>
       </thead>,
       <tbody>
-        {rci!.wireFees.feesForType[s].map(f => (
+        {rci!.wireFees.feesForType[s].map((f) => (
           <tr>
             <td>{stringifyTimestamp(f.endStamp)}</td>
             <td>{renderAmount(f.wireFee)}</td>
@@ -232,7 +232,10 @@ function FeeDetailsView(props: {
     <div>
       <h3>Overview</h3>
       <p>
-        Public key: <ExpanderText 
text={rci.exchangeInfo.details?.masterPublicKey ?? "??"} />
+        Public key:{" "}
+        <ExpanderText
+          text={rci.exchangeInfo.details?.masterPublicKey ?? "??"}
+        />
       </p>
       <p>
         {i18n.str`Withdrawal fees:`} {withdrawFee}
@@ -240,8 +243,9 @@ function FeeDetailsView(props: {
       <p>
         {i18n.str`Rounding loss:`} {overhead}
       </p>
-      <p>{i18n.str`Earliest expiration (for deposit): ${
-        stringifyTimestamp(rci.earliestDepositExpiration)}`}</p>
+      <p>{i18n.str`Earliest expiration (for deposit): ${stringifyTimestamp(
+        rci.earliestDepositExpiration,
+      )}`}</p>
       <h3>Coin Fees</h3>
       <div style={{ overflow: "auto" }}>
         <table className="pure-table">
diff --git a/src/webex/style/pure.css b/src/webex/style/pure.css
index 73911397..88a4bb7d 100644
--- a/src/webex/style/pure.css
+++ b/src/webex/style/pure.css
@@ -449,7 +449,7 @@ th {
 
 .hidden,
 [hidden] {
-    display: none !important;
+  display: none !important;
 }
 
 /**
@@ -457,20 +457,20 @@ th {
  * aspect ratio.
  */
 .pure-img {
-    max-width: 100%;
-    height: auto;
-    display: block;
+  max-width: 100%;
+  height: auto;
+  display: block;
 }
 
 /*csslint regex-selectors:false, known-properties:false, 
duplicate-properties:false*/
 
 .pure-g {
-    letter-spacing: -0.31em; /* Webkit: collapse white-space between units */
-    *letter-spacing: normal; /* reset IE < 8 */
-    *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */
-    text-rendering: optimizespeed; /* Webkit: fixes text-rendering: 
optimizeLegibility */
+  letter-spacing: -0.31em; /* Webkit: collapse white-space between units */
+  *letter-spacing: normal; /* reset IE < 8 */
+  *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */
+  text-rendering: optimizespeed; /* Webkit: fixes text-rendering: 
optimizeLegibility */
 
-    /*
+  /*
     Sets the font stack to fonts known to work properly with the above letter
     and word spacings. See: https://github.com/yahoo/pure/issues/41/
 
@@ -486,28 +486,28 @@ th {
 
     * Helvetica, Arial, sans-serif: Common font stack on OS X and Windows.
     */
-    font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
+  font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
 
-    /* Use flexbox when possible to avoid `letter-spacing` side-effects. */
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-flex-flow: row wrap;
-        -ms-flex-flow: row wrap;
-            flex-flow: row wrap;
+  /* Use flexbox when possible to avoid `letter-spacing` side-effects. */
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-flow: row wrap;
+  -ms-flex-flow: row wrap;
+  flex-flow: row wrap;
 
-    /* Prevents distributing space between rows */
-    -webkit-align-content: flex-start;
-        -ms-flex-line-pack: start;
-            align-content: flex-start;
+  /* Prevents distributing space between rows */
+  -webkit-align-content: flex-start;
+  -ms-flex-line-pack: start;
+  align-content: flex-start;
 }
 
 /* IE10 display: -ms-flexbox (and display: flex in IE 11) does not work inside 
a table; fall back to block and rely on font hack */
 @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
-       table .pure-g {
-               display: block;
-       }
+  table .pure-g {
+    display: block;
+  }
 }
 
 /* Opera as of 12 on Windows needs word-spacing.
@@ -516,25 +516,25 @@ th {
 */
 .opera-only :-o-prefocus,
 .pure-g {
-    word-spacing: -0.43em;
+  word-spacing: -0.43em;
 }
 
 .pure-u {
-    display: inline-block;
-    *display: inline; /* IE < 8: fake inline-block */
-    zoom: 1;
-    letter-spacing: normal;
-    word-spacing: normal;
-    vertical-align: top;
-    text-rendering: auto;
+  display: inline-block;
+  *display: inline; /* IE < 8: fake inline-block */
+  zoom: 1;
+  letter-spacing: normal;
+  word-spacing: normal;
+  vertical-align: top;
+  text-rendering: auto;
 }
 
 /*
 Resets the font family back to the OS/browser's default sans-serif font,
 this the same font stack that Normalize.css sets for the `body`.
 */
-.pure-g [class *= "pure-u"] {
-    font-family: sans-serif;
+.pure-g [class*="pure-u"] {
+  font-family: sans-serif;
 }
 
 .pure-u-1,
@@ -583,245 +583,254 @@ this the same font stack that Normalize.css sets for 
the `body`.
 .pure-u-22-24,
 .pure-u-23-24,
 .pure-u-24-24 {
-    display: inline-block;
-    *display: inline;
-    zoom: 1;
-    letter-spacing: normal;
-    word-spacing: normal;
-    vertical-align: top;
-    text-rendering: auto;
+  display: inline-block;
+  *display: inline;
+  zoom: 1;
+  letter-spacing: normal;
+  word-spacing: normal;
+  vertical-align: top;
+  text-rendering: auto;
 }
 
 .pure-u-1-24 {
-    width: 4.1667%;
-    *width: 4.1357%;
+  width: 4.1667%;
+  *width: 4.1357%;
 }
 
 .pure-u-1-12,
 .pure-u-2-24 {
-    width: 8.3333%;
-    *width: 8.3023%;
+  width: 8.3333%;
+  *width: 8.3023%;
 }
 
 .pure-u-1-8,
 .pure-u-3-24 {
-    width: 12.5000%;
-    *width: 12.4690%;
+  width: 12.5%;
+  *width: 12.469%;
 }
 
 .pure-u-1-6,
 .pure-u-4-24 {
-    width: 16.6667%;
-    *width: 16.6357%;
+  width: 16.6667%;
+  *width: 16.6357%;
 }
 
 .pure-u-1-5 {
-    width: 20%;
-    *width: 19.9690%;
+  width: 20%;
+  *width: 19.969%;
 }
 
 .pure-u-5-24 {
-    width: 20.8333%;
-    *width: 20.8023%;
+  width: 20.8333%;
+  *width: 20.8023%;
 }
 
 .pure-u-1-4,
 .pure-u-6-24 {
-    width: 25%;
-    *width: 24.9690%;
+  width: 25%;
+  *width: 24.969%;
 }
 
 .pure-u-7-24 {
-    width: 29.1667%;
-    *width: 29.1357%;
+  width: 29.1667%;
+  *width: 29.1357%;
 }
 
 .pure-u-1-3,
 .pure-u-8-24 {
-    width: 33.3333%;
-    *width: 33.3023%;
+  width: 33.3333%;
+  *width: 33.3023%;
 }
 
 .pure-u-3-8,
 .pure-u-9-24 {
-    width: 37.5000%;
-    *width: 37.4690%;
+  width: 37.5%;
+  *width: 37.469%;
 }
 
 .pure-u-2-5 {
-    width: 40%;
-    *width: 39.9690%;
+  width: 40%;
+  *width: 39.969%;
 }
 
 .pure-u-5-12,
 .pure-u-10-24 {
-    width: 41.6667%;
-    *width: 41.6357%;
+  width: 41.6667%;
+  *width: 41.6357%;
 }
 
 .pure-u-11-24 {
-    width: 45.8333%;
-    *width: 45.8023%;
+  width: 45.8333%;
+  *width: 45.8023%;
 }
 
 .pure-u-1-2,
 .pure-u-12-24 {
-    width: 50%;
-    *width: 49.9690%;
+  width: 50%;
+  *width: 49.969%;
 }
 
 .pure-u-13-24 {
-    width: 54.1667%;
-    *width: 54.1357%;
+  width: 54.1667%;
+  *width: 54.1357%;
 }
 
 .pure-u-7-12,
 .pure-u-14-24 {
-    width: 58.3333%;
-    *width: 58.3023%;
+  width: 58.3333%;
+  *width: 58.3023%;
 }
 
 .pure-u-3-5 {
-    width: 60%;
-    *width: 59.9690%;
+  width: 60%;
+  *width: 59.969%;
 }
 
 .pure-u-5-8,
 .pure-u-15-24 {
-    width: 62.5000%;
-    *width: 62.4690%;
+  width: 62.5%;
+  *width: 62.469%;
 }
 
 .pure-u-2-3,
 .pure-u-16-24 {
-    width: 66.6667%;
-    *width: 66.6357%;
+  width: 66.6667%;
+  *width: 66.6357%;
 }
 
 .pure-u-17-24 {
-    width: 70.8333%;
-    *width: 70.8023%;
+  width: 70.8333%;
+  *width: 70.8023%;
 }
 
 .pure-u-3-4,
 .pure-u-18-24 {
-    width: 75%;
-    *width: 74.9690%;
+  width: 75%;
+  *width: 74.969%;
 }
 
 .pure-u-19-24 {
-    width: 79.1667%;
-    *width: 79.1357%;
+  width: 79.1667%;
+  *width: 79.1357%;
 }
 
 .pure-u-4-5 {
-    width: 80%;
-    *width: 79.9690%;
+  width: 80%;
+  *width: 79.969%;
 }
 
 .pure-u-5-6,
 .pure-u-20-24 {
-    width: 83.3333%;
-    *width: 83.3023%;
+  width: 83.3333%;
+  *width: 83.3023%;
 }
 
 .pure-u-7-8,
 .pure-u-21-24 {
-    width: 87.5000%;
-    *width: 87.4690%;
+  width: 87.5%;
+  *width: 87.469%;
 }
 
 .pure-u-11-12,
 .pure-u-22-24 {
-    width: 91.6667%;
-    *width: 91.6357%;
+  width: 91.6667%;
+  *width: 91.6357%;
 }
 
 .pure-u-23-24 {
-    width: 95.8333%;
-    *width: 95.8023%;
+  width: 95.8333%;
+  *width: 95.8023%;
 }
 
 .pure-u-1,
 .pure-u-1-1,
 .pure-u-5-5,
 .pure-u-24-24 {
-    width: 100%;
+  width: 100%;
 }
 .pure-button {
-    /* Structure */
-    display: inline-block;
-    zoom: 1;
-    line-height: normal;
-    white-space: nowrap;
-    vertical-align: middle;
-    text-align: center;
-    cursor: pointer;
-    -webkit-user-drag: none;
-    -webkit-user-select: none;
-       -moz-user-select: none;
-        -ms-user-select: none;
-            user-select: none;
-    box-sizing: border-box;
+  /* Structure */
+  display: inline-block;
+  zoom: 1;
+  line-height: normal;
+  white-space: nowrap;
+  vertical-align: middle;
+  text-align: center;
+  cursor: pointer;
+  -webkit-user-drag: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  box-sizing: border-box;
 }
 
 /* Firefox: Get rid of the inner focus border */
 .pure-button::-moz-focus-inner {
-    padding: 0;
-    border: 0;
+  padding: 0;
+  border: 0;
 }
 
 /* Inherit .pure-g styles */
 .pure-button-group {
-    letter-spacing: -0.31em; /* Webkit: collapse white-space between units */
-    *letter-spacing: normal; /* reset IE < 8 */
-    *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */
-    text-rendering: optimizespeed; /* Webkit: fixes text-rendering: 
optimizeLegibility */
+  letter-spacing: -0.31em; /* Webkit: collapse white-space between units */
+  *letter-spacing: normal; /* reset IE < 8 */
+  *word-spacing: -0.43em; /* IE < 8: collapse white-space between units */
+  text-rendering: optimizespeed; /* Webkit: fixes text-rendering: 
optimizeLegibility */
 }
 
 .opera-only :-o-prefocus,
 .pure-button-group {
-    word-spacing: -0.43em;
+  word-spacing: -0.43em;
 }
 
 .pure-button-group .pure-button {
-    letter-spacing: normal;
-    word-spacing: normal;
-    vertical-align: top;
-    text-rendering: auto;
+  letter-spacing: normal;
+  word-spacing: normal;
+  vertical-align: top;
+  text-rendering: auto;
 }
 
 /*csslint outline-none:false*/
 
 .pure-button {
-    font-family: inherit;
-    font-size: 100%;
-    padding: 0.5em 1em;
-    color: #444; /* rgba not supported (IE 8) */
-    color: rgba(0, 0, 0, 0.80); /* rgba supported */
-    border: 1px solid #999;  /*IE 6/7/8*/
-    border: none rgba(0, 0, 0, 0);  /*IE9 + everything else*/
-    background-color: #E6E6E6;
-    text-decoration: none;
-    border-radius: 2px;
+  font-family: inherit;
+  font-size: 100%;
+  padding: 0.5em 1em;
+  color: #444; /* rgba not supported (IE 8) */
+  color: rgba(0, 0, 0, 0.8); /* rgba supported */
+  border: 1px solid #999; /*IE 6/7/8*/
+  border: none rgba(0, 0, 0, 0); /*IE9 + everything else*/
+  background-color: #e6e6e6;
+  text-decoration: none;
+  border-radius: 2px;
 }
 
 .pure-button-hover,
 .pure-button:hover,
 .pure-button:focus {
-    /* csslint ignore:start */
-    filter: alpha(opacity=90);
-    /* csslint ignore:end */
-    background-image: -webkit-linear-gradient(transparent, rgba(0,0,0, 0.05) 
40%, rgba(0,0,0, 0.10));
-    background-image: linear-gradient(transparent, rgba(0,0,0, 0.05) 40%, 
rgba(0,0,0, 0.10));
+  /* csslint ignore:start */
+  filter: alpha(opacity=90);
+  /* csslint ignore:end */
+  background-image: -webkit-linear-gradient(
+    transparent,
+    rgba(0, 0, 0, 0.05) 40%,
+    rgba(0, 0, 0, 0.1)
+  );
+  background-image: linear-gradient(
+    transparent,
+    rgba(0, 0, 0, 0.05) 40%,
+    rgba(0, 0, 0, 0.1)
+  );
 }
 .pure-button:focus {
-    outline: 0;
+  outline: 0;
 }
 .pure-button-active,
 .pure-button:active {
-    box-shadow: 0 0 0 1px rgba(0,0,0, 0.15) inset, 0 0 6px rgba(0,0,0, 0.20) 
inset;
-    border-color: #000\9;
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset,
+    0 0 6px rgba(0, 0, 0, 0.2) inset;
+  border-color: #000\9;
 }
 
 .pure-button[disabled],
@@ -829,46 +838,45 @@ this the same font stack that Normalize.css sets for the 
`body`.
 .pure-button-disabled:hover,
 .pure-button-disabled:focus,
 .pure-button-disabled:active {
-    border: none;
-    background-image: none;
-    /* csslint ignore:start */
-    filter: alpha(opacity=40);
-    /* csslint ignore:end */
-    opacity: 0.40;
-    cursor: not-allowed;
-    box-shadow: none;
-    pointer-events: none;
+  border: none;
+  background-image: none;
+  /* csslint ignore:start */
+  filter: alpha(opacity=40);
+  /* csslint ignore:end */
+  opacity: 0.4;
+  cursor: not-allowed;
+  box-shadow: none;
+  pointer-events: none;
 }
 
 .pure-button-hidden {
-    display: none;
+  display: none;
 }
 
 .pure-button-primary,
 .pure-button-selected,
 a.pure-button-primary,
 a.pure-button-selected {
-    background-color: rgb(0, 120, 231);
-    color: #fff;
+  background-color: rgb(0, 120, 231);
+  color: #fff;
 }
 
 /* Button Groups */
 .pure-button-group .pure-button {
-    margin: 0;
-    border-radius: 0;
-    border-right: 1px solid #111;  /* fallback color for rgba() for IE7/8 */
-    border-right: 1px solid rgba(0, 0, 0, 0.2);
-
+  margin: 0;
+  border-radius: 0;
+  border-right: 1px solid #111; /* fallback color for rgba() for IE7/8 */
+  border-right: 1px solid rgba(0, 0, 0, 0.2);
 }
 
 .pure-button-group .pure-button:first-child {
-    border-top-left-radius: 2px;
-    border-bottom-left-radius: 2px;
+  border-top-left-radius: 2px;
+  border-bottom-left-radius: 2px;
 }
 .pure-button-group .pure-button:last-child {
-    border-top-right-radius: 2px;
-    border-bottom-right-radius: 2px;
-    border-right: none;
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-right: none;
 }
 
 /*csslint box-model:false*/
@@ -895,13 +903,13 @@ so we can ignore the csslint warning.
 .pure-form input[type="color"],
 .pure-form select,
 .pure-form textarea {
-    padding: 0.5em 0.6em;
-    display: inline-block;
-    border: 1px solid #ccc;
-    box-shadow: inset 0 1px 3px #ddd;
-    border-radius: 4px;
-    vertical-align: middle;
-    box-sizing: border-box;
+  padding: 0.5em 0.6em;
+  display: inline-block;
+  border: 1px solid #ccc;
+  box-shadow: inset 0 1px 3px #ddd;
+  border-radius: 4px;
+  vertical-align: middle;
+  box-sizing: border-box;
 }
 
 /*
@@ -909,22 +917,20 @@ Need to separate out the :not() selector from the rest of 
the CSS 2.1 selectors
 since IE8 won't execute CSS that contains a CSS3 selector.
 */
 .pure-form input:not([type]) {
-    padding: 0.5em 0.6em;
-    display: inline-block;
-    border: 1px solid #ccc;
-    box-shadow: inset 0 1px 3px #ddd;
-    border-radius: 4px;
-    box-sizing: border-box;
+  padding: 0.5em 0.6em;
+  display: inline-block;
+  border: 1px solid #ccc;
+  box-shadow: inset 0 1px 3px #ddd;
+  border-radius: 4px;
+  box-sizing: border-box;
 }
 
-
 /* Chrome (as of v.32/34 on OS X) needs additional room for color to display. 
*/
 /* May be able to remove this tweak as color inputs become more standardized 
across browsers. */
 .pure-form input[type="color"] {
-    padding: 0.2em 0.5em;
+  padding: 0.2em 0.5em;
 }
 
-
 .pure-form input[type="text"]:focus,
 .pure-form input[type="password"]:focus,
 .pure-form input[type="email"]:focus,
@@ -941,8 +947,8 @@ since IE8 won't execute CSS that contains a CSS3 selector.
 .pure-form input[type="color"]:focus,
 .pure-form select:focus,
 .pure-form textarea:focus {
-    outline: 0;
-    border-color: #129FEA;
+  outline: 0;
+  border-color: #129fea;
 }
 
 /*
@@ -950,20 +956,20 @@ Need to separate out the :not() selector from the rest of 
the CSS 2.1 selectors
 since IE8 won't execute CSS that contains a CSS3 selector.
 */
 .pure-form input:not([type]):focus {
-    outline: 0;
-    border-color: #129FEA;
+  outline: 0;
+  border-color: #129fea;
 }
 
 .pure-form input[type="file"]:focus,
 .pure-form input[type="radio"]:focus,
 .pure-form input[type="checkbox"]:focus {
-    outline: thin solid #129FEA;
-    outline: 1px auto #129FEA;
+  outline: thin solid #129fea;
+  outline: 1px auto #129fea;
 }
 .pure-form .pure-checkbox,
 .pure-form .pure-radio {
-    margin: 0.5em 0;
-    display: block;
+  margin: 0.5em 0;
+  display: block;
 }
 
 .pure-form input[type="text"][disabled],
@@ -982,9 +988,9 @@ since IE8 won't execute CSS that contains a CSS3 selector.
 .pure-form input[type="color"][disabled],
 .pure-form select[disabled],
 .pure-form textarea[disabled] {
-    cursor: not-allowed;
-    background-color: #eaeded;
-    color: #cad2d3;
+  cursor: not-allowed;
+  background-color: #eaeded;
+  color: #cad2d3;
 }
 
 /*
@@ -992,53 +998,53 @@ Need to separate out the :not() selector from the rest of 
the CSS 2.1 selectors
 since IE8 won't execute CSS that contains a CSS3 selector.
 */
 .pure-form input:not([type])[disabled] {
-    cursor: not-allowed;
-    background-color: #eaeded;
-    color: #cad2d3;
+  cursor: not-allowed;
+  background-color: #eaeded;
+  color: #cad2d3;
 }
 .pure-form input[readonly],
 .pure-form select[readonly],
 .pure-form textarea[readonly] {
-    background-color: #eee; /* menu hover bg color */
-    color: #777; /* menu text color */
-    border-color: #ccc;
+  background-color: #eee; /* menu hover bg color */
+  color: #777; /* menu text color */
+  border-color: #ccc;
 }
 
 .pure-form input:focus:invalid,
 .pure-form textarea:focus:invalid,
 .pure-form select:focus:invalid {
-    color: #b94a48;
-    border-color: #e9322d;
+  color: #b94a48;
+  border-color: #e9322d;
 }
 .pure-form input[type="file"]:focus:invalid:focus,
 .pure-form input[type="radio"]:focus:invalid:focus,
 .pure-form input[type="checkbox"]:focus:invalid:focus {
-    outline-color: #e9322d;
+  outline-color: #e9322d;
 }
 .pure-form select {
-    /* Normalizes the height; padding is not sufficient. */
-    height: 2.25em;
-    border: 1px solid #ccc;
-    background-color: white;
+  /* Normalizes the height; padding is not sufficient. */
+  height: 2.25em;
+  border: 1px solid #ccc;
+  background-color: white;
 }
 .pure-form select[multiple] {
-    height: auto;
+  height: auto;
 }
 .pure-form label {
-    margin: 0.5em 0 0.2em;
+  margin: 0.5em 0 0.2em;
 }
 .pure-form fieldset {
-    margin: 0;
-    padding: 0.35em 0 0.75em;
-    border: 0;
+  margin: 0;
+  padding: 0.35em 0 0.75em;
+  border: 0;
 }
 .pure-form legend {
-    display: block;
-    width: 100%;
-    padding: 0.3em 0;
-    margin-bottom: 0.3em;
-    color: #333;
-    border-bottom: 1px solid #e5e5e5;
+  display: block;
+  width: 100%;
+  padding: 0.3em 0;
+  margin-bottom: 0.3em;
+  color: #333;
+  border-bottom: 1px solid #e5e5e5;
 }
 
 .pure-form-stacked input[type="text"],
@@ -1059,8 +1065,8 @@ since IE8 won't execute CSS that contains a CSS3 selector.
 .pure-form-stacked select,
 .pure-form-stacked label,
 .pure-form-stacked textarea {
-    display: block;
-    margin: 0.25em 0;
+  display: block;
+  margin: 0.25em 0;
 }
 
 /*
@@ -1068,8 +1074,8 @@ Need to separate out the :not() selector from the rest of 
the CSS 2.1 selectors
 since IE8 won't execute CSS that contains a CSS3 selector.
 */
 .pure-form-stacked input:not([type]) {
-    display: block;
-    margin: 0.25em 0;
+  display: block;
+  margin: 0.25em 0;
 }
 .pure-form-aligned input,
 .pure-form-aligned textarea,
@@ -1077,397 +1083,397 @@ since IE8 won't execute CSS that contains a CSS3 
selector.
 /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline 
instead. */
 .pure-form-aligned .pure-help-inline,
 .pure-form-message-inline {
-    display: inline-block;
-    *display: inline;
-    *zoom: 1;
-    vertical-align: middle;
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+  vertical-align: middle;
 }
 .pure-form-aligned textarea {
-    vertical-align: top;
+  vertical-align: top;
 }
 
 /* Aligned Forms */
 .pure-form-aligned .pure-control-group {
-    margin-bottom: 0.5em;
+  margin-bottom: 0.5em;
 }
 .pure-form-aligned .pure-control-group label {
-    text-align: right;
-    display: inline-block;
-    vertical-align: middle;
-    width: 10em;
-    margin: 0 1em 0 0;
+  text-align: right;
+  display: inline-block;
+  vertical-align: middle;
+  width: 10em;
+  margin: 0 1em 0 0;
 }
 .pure-form-aligned .pure-controls {
-    margin: 1.5em 0 0 11em;
+  margin: 1.5em 0 0 11em;
 }
 
 /* Rounded Inputs */
 .pure-form input.pure-input-rounded,
 .pure-form .pure-input-rounded {
-    border-radius: 2em;
-    padding: 0.5em 1em;
+  border-radius: 2em;
+  padding: 0.5em 1em;
 }
 
 /* Grouped Inputs */
 .pure-form .pure-group fieldset {
-    margin-bottom: 10px;
+  margin-bottom: 10px;
 }
 .pure-form .pure-group input,
 .pure-form .pure-group textarea {
-    display: block;
-    padding: 10px;
-    margin: 0 0 -1px;
-    border-radius: 0;
-    position: relative;
-    top: -1px;
+  display: block;
+  padding: 10px;
+  margin: 0 0 -1px;
+  border-radius: 0;
+  position: relative;
+  top: -1px;
 }
 .pure-form .pure-group input:focus,
 .pure-form .pure-group textarea:focus {
-    z-index: 3;
+  z-index: 3;
 }
 .pure-form .pure-group input:first-child,
 .pure-form .pure-group textarea:first-child {
-    top: 1px;
-    border-radius: 4px 4px 0 0;
-    margin: 0;
+  top: 1px;
+  border-radius: 4px 4px 0 0;
+  margin: 0;
 }
 .pure-form .pure-group input:first-child:last-child,
 .pure-form .pure-group textarea:first-child:last-child {
-    top: 1px;
-    border-radius: 4px;
-    margin: 0;
+  top: 1px;
+  border-radius: 4px;
+  margin: 0;
 }
 .pure-form .pure-group input:last-child,
 .pure-form .pure-group textarea:last-child {
-    top: -2px;
-    border-radius: 0 0 4px 4px;
-    margin: 0;
+  top: -2px;
+  border-radius: 0 0 4px 4px;
+  margin: 0;
 }
 .pure-form .pure-group button {
-    margin: 0.35em 0;
+  margin: 0.35em 0;
 }
 
 .pure-form .pure-input-1 {
-    width: 100%;
+  width: 100%;
 }
 .pure-form .pure-input-3-4 {
-    width: 75%;
+  width: 75%;
 }
 .pure-form .pure-input-2-3 {
-    width: 66%;
+  width: 66%;
 }
 .pure-form .pure-input-1-2 {
-    width: 50%;
+  width: 50%;
 }
 .pure-form .pure-input-1-3 {
-    width: 33%;
+  width: 33%;
 }
 .pure-form .pure-input-1-4 {
-    width: 25%;
+  width: 25%;
 }
 
 /* Inline help for forms */
 /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline 
instead. */
 .pure-form .pure-help-inline,
 .pure-form-message-inline {
-    display: inline-block;
-    padding-left: 0.3em;
-    color: #666;
-    vertical-align: middle;
-    font-size: 0.875em;
+  display: inline-block;
+  padding-left: 0.3em;
+  color: #666;
+  vertical-align: middle;
+  font-size: 0.875em;
 }
 
 /* Block help for forms */
 .pure-form-message {
+  display: block;
+  color: #666;
+  font-size: 0.875em;
+}
+
+@media only screen and (max-width: 480px) {
+  .pure-form button[type="submit"] {
+    margin: 0.7em 0 0;
+  }
+
+  .pure-form input:not([type]),
+  .pure-form input[type="text"],
+  .pure-form input[type="password"],
+  .pure-form input[type="email"],
+  .pure-form input[type="url"],
+  .pure-form input[type="date"],
+  .pure-form input[type="month"],
+  .pure-form input[type="time"],
+  .pure-form input[type="datetime"],
+  .pure-form input[type="datetime-local"],
+  .pure-form input[type="week"],
+  .pure-form input[type="number"],
+  .pure-form input[type="search"],
+  .pure-form input[type="tel"],
+  .pure-form input[type="color"],
+  .pure-form label {
+    margin-bottom: 0.3em;
     display: block;
-    color: #666;
-    font-size: 0.875em;
-}
-
-@media only screen and (max-width : 480px) {
-    .pure-form button[type="submit"] {
-        margin: 0.7em 0 0;
-    }
-
-    .pure-form input:not([type]),
-    .pure-form input[type="text"],
-    .pure-form input[type="password"],
-    .pure-form input[type="email"],
-    .pure-form input[type="url"],
-    .pure-form input[type="date"],
-    .pure-form input[type="month"],
-    .pure-form input[type="time"],
-    .pure-form input[type="datetime"],
-    .pure-form input[type="datetime-local"],
-    .pure-form input[type="week"],
-    .pure-form input[type="number"],
-    .pure-form input[type="search"],
-    .pure-form input[type="tel"],
-    .pure-form input[type="color"],
-    .pure-form label {
-        margin-bottom: 0.3em;
-        display: block;
-    }
-
-    .pure-group input:not([type]),
-    .pure-group input[type="text"],
-    .pure-group input[type="password"],
-    .pure-group input[type="email"],
-    .pure-group input[type="url"],
-    .pure-group input[type="date"],
-    .pure-group input[type="month"],
-    .pure-group input[type="time"],
-    .pure-group input[type="datetime"],
-    .pure-group input[type="datetime-local"],
-    .pure-group input[type="week"],
-    .pure-group input[type="number"],
-    .pure-group input[type="search"],
-    .pure-group input[type="tel"],
-    .pure-group input[type="color"] {
-        margin-bottom: 0;
-    }
-
-    .pure-form-aligned .pure-control-group label {
-        margin-bottom: 0.3em;
-        text-align: left;
-        display: block;
-        width: 100%;
-    }
-
-    .pure-form-aligned .pure-controls {
-        margin: 1.5em 0 0 0;
-    }
-
-    /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline 
instead. */
-    .pure-form .pure-help-inline,
-    .pure-form-message-inline,
-    .pure-form-message {
-        display: block;
-        font-size: 0.75em;
-        /* Increased bottom padding to make it group with its related input 
element. */
-        padding: 0.2em 0 0.8em;
-    }
+  }
+
+  .pure-group input:not([type]),
+  .pure-group input[type="text"],
+  .pure-group input[type="password"],
+  .pure-group input[type="email"],
+  .pure-group input[type="url"],
+  .pure-group input[type="date"],
+  .pure-group input[type="month"],
+  .pure-group input[type="time"],
+  .pure-group input[type="datetime"],
+  .pure-group input[type="datetime-local"],
+  .pure-group input[type="week"],
+  .pure-group input[type="number"],
+  .pure-group input[type="search"],
+  .pure-group input[type="tel"],
+  .pure-group input[type="color"] {
+    margin-bottom: 0;
+  }
+
+  .pure-form-aligned .pure-control-group label {
+    margin-bottom: 0.3em;
+    text-align: left;
+    display: block;
+    width: 100%;
+  }
+
+  .pure-form-aligned .pure-controls {
+    margin: 1.5em 0 0 0;
+  }
+
+  /* NOTE: pure-help-inline is deprecated. Use .pure-form-message-inline 
instead. */
+  .pure-form .pure-help-inline,
+  .pure-form-message-inline,
+  .pure-form-message {
+    display: block;
+    font-size: 0.75em;
+    /* Increased bottom padding to make it group with its related input 
element. */
+    padding: 0.2em 0 0.8em;
+  }
 }
 
 /*csslint adjoining-classes: false, box-model:false*/
 .pure-menu {
-    box-sizing: border-box;
+  box-sizing: border-box;
 }
 
 .pure-menu-fixed {
-    position: fixed;
-    left: 0;
-    top: 0;
-    z-index: 3;
+  position: fixed;
+  left: 0;
+  top: 0;
+  z-index: 3;
 }
 
 .pure-menu-list,
 .pure-menu-item {
-    position: relative;
+  position: relative;
 }
 
 .pure-menu-list {
-    list-style: none;
-    margin: 0;
-    padding: 0;
+  list-style: none;
+  margin: 0;
+  padding: 0;
 }
 
 .pure-menu-item {
-    padding: 0;
-    margin: 0;
-    height: 100%;
+  padding: 0;
+  margin: 0;
+  height: 100%;
 }
 
 .pure-menu-link,
 .pure-menu-heading {
-    display: block;
-    text-decoration: none;
-    white-space: nowrap;
+  display: block;
+  text-decoration: none;
+  white-space: nowrap;
 }
 
 /* HORIZONTAL MENU */
 .pure-menu-horizontal {
-    width: 100%;
-    white-space: nowrap;
+  width: 100%;
+  white-space: nowrap;
 }
 
 .pure-menu-horizontal .pure-menu-list {
-    display: inline-block;
+  display: inline-block;
 }
 
 /* Initial menus should be inline-block so that they are horizontal */
 .pure-menu-horizontal .pure-menu-item,
 .pure-menu-horizontal .pure-menu-heading,
 .pure-menu-horizontal .pure-menu-separator {
-    display: inline-block;
-    *display: inline;
-    zoom: 1;
-    vertical-align: middle;
+  display: inline-block;
+  *display: inline;
+  zoom: 1;
+  vertical-align: middle;
 }
 
 /* Submenus should still be display: block; */
 .pure-menu-item .pure-menu-item {
-    display: block;
+  display: block;
 }
 
 .pure-menu-children {
-    display: none;
-    position: absolute;
-    left: 100%;
-    top: 0;
-    margin: 0;
-    padding: 0;
-    z-index: 3;
+  display: none;
+  position: absolute;
+  left: 100%;
+  top: 0;
+  margin: 0;
+  padding: 0;
+  z-index: 3;
 }
 
 .pure-menu-horizontal .pure-menu-children {
-    left: 0;
-    top: auto;
-    width: inherit;
+  left: 0;
+  top: auto;
+  width: inherit;
 }
 
 .pure-menu-allow-hover:hover > .pure-menu-children,
 .pure-menu-active > .pure-menu-children {
-    display: block;
-    position: absolute;
+  display: block;
+  position: absolute;
 }
 
 /* Vertical Menus - show the dropdown arrow */
 .pure-menu-has-children > .pure-menu-link:after {
-    padding-left: 0.5em;
-    content: "\25B8";
-    font-size: small;
+  padding-left: 0.5em;
+  content: "\25B8";
+  font-size: small;
 }
 
 /* Horizontal Menus - show the dropdown arrow */
 .pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after {
-    content: "\25BE";
+  content: "\25BE";
 }
 
 /* scrollable menus */
 .pure-menu-scrollable {
-    overflow-y: scroll;
-    overflow-x: hidden;
+  overflow-y: scroll;
+  overflow-x: hidden;
 }
 
 .pure-menu-scrollable .pure-menu-list {
-    display: block;
+  display: block;
 }
 
 .pure-menu-horizontal.pure-menu-scrollable .pure-menu-list {
-    display: inline-block;
+  display: inline-block;
 }
 
 .pure-menu-horizontal.pure-menu-scrollable {
-    white-space: nowrap;
-    overflow-y: hidden;
-    overflow-x: auto;
-    -ms-overflow-style: none;
-    -webkit-overflow-scrolling: touch;
-    /* a little extra padding for this style to allow for scrollbars */
-    padding: .5em 0;
+  white-space: nowrap;
+  overflow-y: hidden;
+  overflow-x: auto;
+  -ms-overflow-style: none;
+  -webkit-overflow-scrolling: touch;
+  /* a little extra padding for this style to allow for scrollbars */
+  padding: 0.5em 0;
 }
 
 .pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar {
-    display: none;
+  display: none;
 }
 
 /* misc default styling */
 
 .pure-menu-separator,
 .pure-menu-horizontal .pure-menu-children .pure-menu-separator {
-    background-color: #ccc;
-    height: 1px;
-    margin: .3em 0;
+  background-color: #ccc;
+  height: 1px;
+  margin: 0.3em 0;
 }
 
 .pure-menu-horizontal .pure-menu-separator {
-    width: 1px;
-    height: 1.3em;
-    margin: 0 .3em ;
+  width: 1px;
+  height: 1.3em;
+  margin: 0 0.3em;
 }
 
 /* Need to reset the separator since submenu is vertical */
 .pure-menu-horizontal .pure-menu-children .pure-menu-separator {
-    display: block;
-    width: auto;
+  display: block;
+  width: auto;
 }
 
 .pure-menu-heading {
-    text-transform: uppercase;
-    color: #565d64;
+  text-transform: uppercase;
+  color: #565d64;
 }
 
 .pure-menu-link {
-    color: #777;
+  color: #777;
 }
 
 .pure-menu-children {
-    background-color: #fff;
+  background-color: #fff;
 }
 
 .pure-menu-link,
 .pure-menu-disabled,
 .pure-menu-heading {
-    padding: .5em 1em;
+  padding: 0.5em 1em;
 }
 
 .pure-menu-disabled {
-    opacity: .5;
+  opacity: 0.5;
 }
 
 .pure-menu-disabled .pure-menu-link:hover {
-    background-color: transparent;
+  background-color: transparent;
 }
 
 .pure-menu-active > .pure-menu-link,
 .pure-menu-link:hover,
 .pure-menu-link:focus {
-    background-color: #eee;
+  background-color: #eee;
 }
 
 .pure-menu-selected .pure-menu-link,
 .pure-menu-selected .pure-menu-link:visited {
-    color: #000;
+  color: #000;
 }
 
 .pure-table {
-    /* Remove spacing between table cells (from Normalize.css) */
-    border-collapse: collapse;
-    border-spacing: 0;
-    empty-cells: show;
-    border: 1px solid #cbcbcb;
+  /* Remove spacing between table cells (from Normalize.css) */
+  border-collapse: collapse;
+  border-spacing: 0;
+  empty-cells: show;
+  border: 1px solid #cbcbcb;
 }
 
 .pure-table caption {
-    color: #000;
-    font: italic 85%/1 arial, sans-serif;
-    padding: 1em 0;
-    text-align: center;
+  color: #000;
+  font: italic 85%/1 arial, sans-serif;
+  padding: 1em 0;
+  text-align: center;
 }
 
 .pure-table td,
 .pure-table th {
-    border-left: 1px solid #cbcbcb;/*  inner column border */
-    border-width: 0 0 0 1px;
-    font-size: inherit;
-    margin: 0;
-    overflow: visible; /*to make ths where the title is really long work*/
-    padding: 0.5em 1em; /* cell padding */
+  border-left: 1px solid #cbcbcb; /*  inner column border */
+  border-width: 0 0 0 1px;
+  font-size: inherit;
+  margin: 0;
+  overflow: visible; /*to make ths where the title is really long work*/
+  padding: 0.5em 1em; /* cell padding */
 }
 
 /* Consider removing this next declaration block, as it causes problems when
 there's a rowspan on the first cell. Case added to the tests. issue#432 */
 .pure-table td:first-child,
 .pure-table th:first-child {
-    border-left-width: 0;
+  border-left-width: 0;
 }
 
 .pure-table thead {
-    background-color: #e0e0e0;
-    color: #000;
-    text-align: left;
-    vertical-align: bottom;
+  background-color: #e0e0e0;
+  color: #000;
+  text-align: left;
+  vertical-align: bottom;
 }
 
 /*
@@ -1476,33 +1482,32 @@ striping:
    odd  - #f2f2f2 (light gray)
 */
 .pure-table td {
-    background-color: transparent;
+  background-color: transparent;
 }
 .pure-table-odd td {
-    background-color: #f2f2f2;
+  background-color: #f2f2f2;
 }
 
 /* nth-child selector for modern browsers */
 .pure-table-striped tr:nth-child(2n-1) td {
-    background-color: #f2f2f2;
+  background-color: #f2f2f2;
 }
 
 /* BORDERED TABLES */
 .pure-table-bordered td {
-    border-bottom: 1px solid #cbcbcb;
+  border-bottom: 1px solid #cbcbcb;
 }
 .pure-table-bordered tbody > tr:last-child > td {
-    border-bottom-width: 0;
+  border-bottom-width: 0;
 }
 
-
 /* HORIZONTAL BORDERED TABLES */
 
 .pure-table-horizontal td,
 .pure-table-horizontal th {
-    border-width: 0 0 1px 0;
-    border-bottom: 1px solid #cbcbcb;
+  border-width: 0 0 1px 0;
+  border-bottom: 1px solid #cbcbcb;
 }
 .pure-table-horizontal tbody > tr:last-child > td {
-    border-bottom-width: 0;
+  border-bottom-width: 0;
 }
diff --git a/src/webex/style/wallet.css b/src/webex/style/wallet.css
index b4bfd6f6..16a414b3 100644
--- a/src/webex/style/wallet.css
+++ b/src/webex/style/wallet.css
@@ -4,75 +4,77 @@ body {
 }
 
 #main {
-    border: solid 1px black;
-    border-radius: 10px;
-    margin-left: auto;
-    margin-right: auto;
-    margin-top: 2em;
-    max-width: 50%;
-    padding: 2em;
+  border: solid 1px black;
+  border-radius: 10px;
+  margin-left: auto;
+  margin-right: auto;
+  margin-top: 2em;
+  max-width: 50%;
+  padding: 2em;
 }
 
 header {
-    width: 100%;
-    height: 100px;
-    margin: 0;
-    padding: 0;
-    border-bottom: 1px solid black;
+  width: 100%;
+  height: 100px;
+  margin: 0;
+  padding: 0;
+  border-bottom: 1px solid black;
 }
 
 header h1 {
-    font-size: 200%;
-    margin: 0;
-    padding: 0 0 0 120px;
-    position: relative;
-    top: 50%;
-    transform: translateY(-50%);
+  font-size: 200%;
+  margin: 0;
+  padding: 0 0 0 120px;
+  position: relative;
+  top: 50%;
+  transform: translateY(-50%);
 }
 
 header #logo {
-    float: left;
-    width: 100px;
-    height: 100px;
-    padding: 0;
-    margin: 0;
-    text-align: center;
-    border-right: 1px solid black;
-    background-image: url(/img/logo.png);
-    background-size: 100px;
+  float: left;
+  width: 100px;
+  height: 100px;
+  padding: 0;
+  margin: 0;
+  text-align: center;
+  border-right: 1px solid black;
+  background-image: url(/img/logo.png);
+  background-size: 100px;
 }
 
 aside {
-    width: 100px;
-    float: left;
+  width: 100px;
+  float: left;
 }
 
 section#main {
-    margin: auto;
-    padding: 20px;
-    border-left: 1px solid black;
-    height: 100%;
-    max-width: 50%;
+  margin: auto;
+  padding: 20px;
+  border-left: 1px solid black;
+  height: 100%;
+  max-width: 50%;
 }
 
 section#main h1:first-child {
-    margin-top: 0;
+  margin-top: 0;
 }
 
 h1 {
-    font-size: 160%;
+  font-size: 160%;
 }
 
 h2 {
-    font-size: 140%;
+  font-size: 140%;
 }
 
 h3 {
-    font-size: 120%;
+  font-size: 120%;
 }
 
-h4, h5, h6 {
-    font-size: 100%;
+h4,
+h5,
+h6 {
+  font-size: 100%;
 }
 
 .form-row {
@@ -92,63 +94,74 @@ input.url {
 }
 
 .json-key {
-   color: brown;
+  color: brown;
 }
 .json-value {
-   color: navy;
-   }
+  color: navy;
+}
 .json-string {
-   color: olive;
+  color: olive;
 }
 
 button {
-    font-size: 120%;
-    padding: 0.5em;
+  font-size: 120%;
+  padding: 0.5em;
 }
 
 button.confirm-pay {
-    float: right;
+  float: right;
 }
 
 /* We use fading to hide slower DOM updates */
 .fade {
-    -webkit-animation: fade 0.7s;
-    animation: fade 0.7s;
-    opacity: 1;
+  -webkit-animation: fade 0.7s;
+  animation: fade 0.7s;
+  opacity: 1;
 }
 
 @-webkit-keyframes fade {
-    from {opacity: 0}
-    to {opacity: 1}
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
 }
 @keyframes fade {
-     from {opacity: 0}
-     to {opacity: 1}
- }
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
 
 button.linky {
-    background:none!important;
-    border:none;
-    padding:0!important;
+  background: none !important;
+  border: none;
+  padding: 0 !important;
 
-    font-family:arial,sans-serif;
-    color:#069;
-    text-decoration:underline;
-    cursor:pointer;
+  font-family: arial, sans-serif;
+  color: #069;
+  text-decoration: underline;
+  cursor: pointer;
 }
 
-.blacklink a:link, .blacklink a:visited, .blacklink a:hover, .blacklink 
a:active {
+.blacklink a:link,
+.blacklink a:visited,
+.blacklink a:hover,
+.blacklink a:active {
   color: #000;
 }
 
-
-table, th, td {
-    border: 1px solid black;
+table,
+th,
+td {
+  border: 1px solid black;
 }
 
-
 button.accept {
-  background-color: #5757D2;
+  background-color: #5757d2;
   border: 1px solid black;
   border-radius: 5px;
   margin: 1em 0;
@@ -157,17 +170,16 @@ button.accept {
   color: white;
 }
 button.linky {
-  background:none!important;
-  border:none;
-  padding:0!important;
+  background: none !important;
+  border: none;
+  padding: 0 !important;
 
-  font-family:arial,sans-serif;
-  color:#069;
-  text-decoration:underline;
-  cursor:pointer;
+  font-family: arial, sans-serif;
+  color: #069;
+  text-decoration: underline;
+  cursor: pointer;
 }
 
-
 button.accept:disabled {
   background-color: #dedbe8;
   border: 1px solid white;
@@ -175,7 +187,7 @@ button.accept:disabled {
   margin: 1em 0;
   padding: 0.5em;
   font-weight: bold;
-  color: #2C2C2C;
+  color: #2c2c2c;
 }
 
 input.url {
@@ -202,39 +214,38 @@ span.spacer {
 .button-destructive,
 .button-warning,
 .button-secondary {
-    color: white;
-    border-radius: 4px;
-    text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+  color: white;
+  border-radius: 4px;
+  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
 }
 
 .button-success {
-    background: rgb(28, 184, 65);
+  background: rgb(28, 184, 65);
 }
 
 .button-destructive {
-    background: rgb(202, 60, 60);
+  background: rgb(202, 60, 60);
 }
 
 .button-warning {
-    background: rgb(223, 117, 20);
+  background: rgb(223, 117, 20);
 }
 
 .button-secondary {
-    background: rgb(66, 184, 221);
+  background: rgb(66, 184, 221);
 }
 
 a.actionLink {
   color: black;
 }
 
-
 .errorbox {
   border: 1px solid;
   display: inline-block;
   margin: 1em;
   padding: 1em;
   font-weight: bold;
-  background: #FF8A8A;
+  background: #ff8a8a;
 }
 
 .okaybox {
@@ -243,18 +254,17 @@ a.actionLink {
   margin: 1em;
   padding: 1em;
   font-weight: bold;
-  background: #00FA9A;
+  background: #00fa9a;
 }
 
-
-a.opener  {
+a.opener {
   color: black;
 }
 .opener-open::before {
-  content: "\25bc"
+  content: "\25bc";
 }
 .opener-collapsed::before {
-  content: "\25b6 "
+  content: "\25b6 ";
 }
 
 .svg-icon {
@@ -265,8 +275,8 @@ a.opener  {
   width: 1em;
 }
 .svg-icon svg {
-  height:1em;
-  width:1em;
+  height: 1em;
+  width: 1em;
 }
 object.svg-icon.svg-baseline {
   transform: translate(0, 0.125em);
diff --git a/src/webex/wxApi.ts b/src/webex/wxApi.ts
index 5edd1907..a530b750 100644
--- a/src/webex/wxApi.ts
+++ b/src/webex/wxApi.ts
@@ -79,7 +79,7 @@ async function callBackend<T extends MessageType>(
   detail: MessageMap[T]["request"],
 ): Promise<MessageMap[T]["response"]> {
   return new Promise<MessageMap[T]["response"]>((resolve, reject) => {
-    chrome.runtime.sendMessage({ type, detail }, resp => {
+    chrome.runtime.sendMessage({ type, detail }, (resp) => {
       if (chrome.runtime.lastError) {
         console.log("Error calling backend");
         reject(
diff --git a/src/webex/wxBackend.ts b/src/webex/wxBackend.ts
index 248e6dfb..dd0b9168 100644
--- a/src/webex/wxBackend.ts
+++ b/src/webex/wxBackend.ts
@@ -406,7 +406,7 @@ async function reinitWallet() {
     http,
     new BrowserCryptoWorkerFactory(),
   );
-  wallet.runRetryLoop().catch(e => {
+  wallet.runRetryLoop().catch((e) => {
     console.log("error during wallet retry loop", e);
   });
   // Useful for debugging in the background page.
@@ -443,7 +443,7 @@ function injectScript(
 try {
   // This needs to be outside of main, as Firefox won't fire the event if
   // the listener isn't created synchronously on loading the backend.
-  chrome.runtime.onInstalled.addListener(details => {
+  chrome.runtime.onInstalled.addListener((details) => {
     console.log("onInstalled with reason", details.reason);
     if (details.reason === "install") {
       const url = chrome.extension.getURL("/src/webex/pages/welcome.html");
@@ -462,12 +462,12 @@ try {
 export async function wxMain() {
   // Explicitly unload the extension page as soon as an update is available,
   // so the update gets installed as soon as possible.
-  chrome.runtime.onUpdateAvailable.addListener(details => {
+  chrome.runtime.onUpdateAvailable.addListener((details) => {
     console.log("update available:", details);
     chrome.runtime.reload();
   });
 
-  chrome.tabs.query({}, tabs => {
+  chrome.tabs.query({}, (tabs) => {
     console.log("got tabs", tabs);
     for (const tab of tabs) {
       if (!tab.url || !tab.id) {
@@ -520,7 +520,7 @@ export async function wxMain() {
 
     const run = () => {
       timers.shift();
-      chrome.tabs.get(tabId, tab => {
+      chrome.tabs.get(tabId, (tab) => {
         if (chrome.runtime.lastError) {
           return;
         }
@@ -562,7 +562,7 @@ export async function wxMain() {
 
   // Handlers for catching HTTP requests
   chrome.webRequest.onHeadersReceived.addListener(
-    details => {
+    (details) => {
       const wallet = currentWallet;
       if (!wallet) {
         console.warn("wallet not available while handling header");

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

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