summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-03-17 17:56:37 +0100
committerFlorian Dold <florian@dold.me>2021-03-17 17:56:37 +0100
commit07cdfb2e4ec761021477271776b81f33af0e731d (patch)
treecb62b1d1a04e1e64b8ee47e78196e858727d2c0a /packages
parent42a4d666f42ce94274995bfdae644444ff5f6d53 (diff)
downloadwallet-core-07cdfb2e4ec761021477271776b81f33af0e731d.tar.gz
wallet-core-07cdfb2e4ec761021477271776b81f33af0e731d.tar.bz2
wallet-core-07cdfb2e4ec761021477271776b81f33af0e731d.zip
towards wallet-core / util split
Diffstat (limited to 'packages')
-rw-r--r--packages/taler-util/README.md9
-rw-r--r--packages/taler-util/package.json44
-rw-r--r--packages/taler-util/src/ReserveStatus.ts (renamed from packages/taler-wallet-core/src/types/ReserveStatus.ts)2
-rw-r--r--packages/taler-util/src/ReserveTransaction.ts (renamed from packages/taler-wallet-core/src/types/ReserveTransaction.ts)4
-rw-r--r--packages/taler-util/src/amounts.test.ts (renamed from packages/taler-wallet-core/src/util/amounts-test.ts)2
-rw-r--r--packages/taler-util/src/amounts.ts (renamed from packages/taler-wallet-core/src/util/amounts.ts)2
-rw-r--r--packages/taler-util/src/backupTypes.ts (renamed from packages/taler-wallet-core/src/types/backupTypes.ts)13
-rw-r--r--packages/taler-util/src/codec.test.ts (renamed from packages/taler-wallet-core/src/util/codec-test.ts)0
-rw-r--r--packages/taler-util/src/codec.ts (renamed from packages/taler-wallet-core/src/util/codec.ts)0
-rw-r--r--packages/taler-util/src/helpers.ts152
-rw-r--r--packages/taler-util/src/index.ts19
-rw-r--r--packages/taler-util/src/libtool-version.test.ts (renamed from packages/taler-wallet-core/src/util/libtoolVersion-test.ts)2
-rw-r--r--packages/taler-util/src/libtool-version.ts (renamed from packages/taler-wallet-core/src/util/libtoolVersion.ts)0
-rw-r--r--packages/taler-util/src/notifications.ts (renamed from packages/taler-wallet-core/src/types/notifications.ts)0
-rw-r--r--packages/taler-util/src/payto.test.ts (renamed from packages/taler-wallet-core/src/util/payto-test.ts)0
-rw-r--r--packages/taler-util/src/payto.ts (renamed from packages/taler-wallet-core/src/util/payto.ts)2
-rw-r--r--packages/taler-util/src/taler-error-codes.ts (renamed from packages/taler-wallet-core/src/TalerErrorCode.ts)0
-rw-r--r--packages/taler-util/src/talerTypes.ts (renamed from packages/taler-wallet-core/src/types/talerTypes.ts)6
-rw-r--r--packages/taler-util/src/talerconfig.test.ts (renamed from packages/taler-wallet-core/src/util/talerconfig-test.ts)0
-rw-r--r--packages/taler-util/src/talerconfig.ts (renamed from packages/taler-wallet-core/src/util/talerconfig.ts)0
-rw-r--r--packages/taler-util/src/taleruri.test.ts (renamed from packages/taler-wallet-core/src/util/taleruri-test.ts)0
-rw-r--r--packages/taler-util/src/taleruri.ts (renamed from packages/taler-wallet-core/src/util/taleruri.ts)0
-rw-r--r--packages/taler-util/src/time.ts (renamed from packages/taler-wallet-core/src/util/time.ts)7
-rw-r--r--packages/taler-util/src/transactionsTypes.ts (renamed from packages/taler-wallet-core/src/types/transactionsTypes.ts)8
-rw-r--r--packages/taler-util/src/types-test.ts (renamed from packages/taler-wallet-core/src/types/types-test.ts)0
-rw-r--r--packages/taler-util/src/url.ts74
-rw-r--r--packages/taler-util/src/walletTypes.ts (renamed from packages/taler-wallet-core/src/types/walletTypes.ts)102
-rw-r--r--packages/taler-util/tsconfig.json27
-rw-r--r--packages/taler-wallet-cli/package.json1
-rw-r--r--packages/taler-wallet-cli/src/index.ts35
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/harness.ts112
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/helpers.ts42
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/sync.ts3
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts8
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-libeufin-refund.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-libeufin-tutorial.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-merchant-exchange-confusion.ts3
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts3
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts11
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-refund.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts4
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-doublespend.ts5
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts5
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts2
-rw-r--r--packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts4
-rw-r--r--packages/taler-wallet-cli/tsconfig.json3
-rw-r--r--packages/taler-wallet-core/package.json1
-rw-r--r--packages/taler-wallet-core/src/crypto/cryptoTypes.ts (renamed from packages/taler-wallet-core/src/types/cryptoTypes.ts)2
-rw-r--r--packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts8
-rw-r--r--packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts14
-rw-r--r--packages/taler-wallet-core/src/db.ts1737
-rw-r--r--packages/taler-wallet-core/src/headless/NodeHttpLib.ts3
-rw-r--r--packages/taler-wallet-core/src/headless/helpers.ts12
-rw-r--r--packages/taler-wallet-core/src/index.ts16
-rw-r--r--packages/taler-wallet-core/src/operations/backup/export.ts6
-rw-r--r--packages/taler-wallet-core/src/operations/backup/import.ts37
-rw-r--r--packages/taler-wallet-core/src/operations/backup/index.ts20
-rw-r--r--packages/taler-wallet-core/src/operations/backup/state.ts11
-rw-r--r--packages/taler-wallet-core/src/operations/balance.ts10
-rw-r--r--packages/taler-wallet-core/src/operations/deposits.ts40
-rw-r--r--packages/taler-wallet-core/src/operations/errors.ts3
-rw-r--r--packages/taler-wallet-core/src/operations/exchanges.ts68
-rw-r--r--packages/taler-wallet-core/src/operations/pay.ts77
-rw-r--r--packages/taler-wallet-core/src/operations/pending.ts6
-rw-r--r--packages/taler-wallet-core/src/operations/recoup.ts18
-rw-r--r--packages/taler-wallet-core/src/operations/refresh.ts14
-rw-r--r--packages/taler-wallet-core/src/operations/refund.ts49
-rw-r--r--packages/taler-wallet-core/src/operations/reserves.ts80
-rw-r--r--packages/taler-wallet-core/src/operations/state.ts17
-rw-r--r--packages/taler-wallet-core/src/operations/testing.ts24
-rw-r--r--packages/taler-wallet-core/src/operations/tip.ts57
-rw-r--r--packages/taler-wallet-core/src/operations/transactions.ts8
-rw-r--r--packages/taler-wallet-core/src/operations/withdraw-test.ts4
-rw-r--r--packages/taler-wallet-core/src/operations/withdraw.ts112
-rw-r--r--packages/taler-wallet-core/src/pending-types.ts (renamed from packages/taler-wallet-core/src/types/pendingTypes.ts)10
-rw-r--r--packages/taler-wallet-core/src/types/dbTypes.ts1775
-rw-r--r--packages/taler-wallet-core/src/util/RequestThrottler.ts2
-rw-r--r--packages/taler-wallet-core/src/util/coinSelection-test.ts2
-rw-r--r--packages/taler-wallet-core/src/util/coinSelection.ts2
-rw-r--r--packages/taler-wallet-core/src/util/helpers.ts3
-rw-r--r--packages/taler-wallet-core/src/util/http.ts9
-rw-r--r--packages/taler-wallet-core/src/util/retries.ts2
-rw-r--r--packages/taler-wallet-core/src/util/testvectors.ts36
-rw-r--r--packages/taler-wallet-core/src/util/timer.ts2
-rw-r--r--packages/taler-wallet-core/src/util/wire.ts51
-rw-r--r--packages/taler-wallet-core/src/wallet.ts19
-rw-r--r--packages/taler-wallet-core/tsconfig.json5
100 files changed, 2553 insertions, 2581 deletions
diff --git a/packages/taler-util/README.md b/packages/taler-util/README.md
new file mode 100644
index 00000000..07d74eee
--- /dev/null
+++ b/packages/taler-util/README.md
@@ -0,0 +1,9 @@
+# @gnu-taler/taler-util
+
+This package implements various utility functionality for GNU Taler.
+
+
+## When should something be moved to this package?
+
+The ``@gnu-taler/taler-util`` package should have minimal dependencies
+and as few platform-specific functionality as possible.
diff --git a/packages/taler-util/package.json b/packages/taler-util/package.json
new file mode 100644
index 00000000..aacabd21
--- /dev/null
+++ b/packages/taler-util/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "@gnu-taler/taler-util",
+ "version": "0.8.2",
+ "description": "Generic helper functionality for GNU Taler",
+ "exports": {
+ ".": "./lib/index.js"
+ },
+ "module": "./lib/index.js",
+ "types": "./lib/index.d.ts",
+ "typesVersions": {
+ "*": {
+ "lib/index.d.ts": [
+ "lib/index.d.ts"
+ ],
+ "src/*": [],
+ "*": []
+ }
+ },
+ "author": "Florian Dold",
+ "license": "AGPL-3.0-or-later",
+ "private": false,
+ "scripts": {
+ "prepare": "tsc",
+ "test": "tsc && ava",
+ "clean": "rimraf dist lib tsconfig.tsbuildinfo",
+ "pretty": "prettier --write src"
+ },
+ "devDependencies": {
+ "@types/node": "^14.14.22",
+ "ava": "^3.15.0",
+ "esbuild": "^0.9.2",
+ "prettier": "^2.2.1",
+ "rimraf": "^3.0.2",
+ "typescript": "^4.2.3"
+ },
+ "dependencies": {
+ "tslib": "^2.1.0"
+ },
+ "ava": {
+ "require": [
+ "esm"
+ ]
+ }
+}
diff --git a/packages/taler-wallet-core/src/types/ReserveStatus.ts b/packages/taler-util/src/ReserveStatus.ts
index 8a6092a7..cd204f55 100644
--- a/packages/taler-wallet-core/src/types/ReserveStatus.ts
+++ b/packages/taler-util/src/ReserveStatus.ts
@@ -26,7 +26,7 @@ import {
buildCodecForObject,
codecForList,
Codec,
-} from "../util/codec";
+} from "./codec.js";
import { AmountString } from "./talerTypes";
import {
ReserveTransaction,
diff --git a/packages/taler-wallet-core/src/types/ReserveTransaction.ts b/packages/taler-util/src/ReserveTransaction.ts
index 6847d837..f477106b 100644
--- a/packages/taler-wallet-core/src/types/ReserveTransaction.ts
+++ b/packages/taler-util/src/ReserveTransaction.ts
@@ -30,7 +30,7 @@ import {
buildCodecForUnion,
Codec,
codecForNumber,
-} from "../util/codec";
+} from "./codec.js";
import {
AmountString,
Base32String,
@@ -38,7 +38,7 @@ import {
EddsaPublicKeyString,
CoinPublicKeyString,
} from "./talerTypes";
-import { Timestamp, codecForTimestamp } from "../util/time";
+import { Timestamp, codecForTimestamp } from "./time.js";
export enum ReserveTransactionType {
Withdraw = "WITHDRAW",
diff --git a/packages/taler-wallet-core/src/util/amounts-test.ts b/packages/taler-util/src/amounts.test.ts
index afd8caa5..d9734ce8 100644
--- a/packages/taler-wallet-core/src/util/amounts-test.ts
+++ b/packages/taler-util/src/amounts.test.ts
@@ -16,7 +16,7 @@
import test from "ava";
-import { Amounts, AmountJson } from "../util/amounts";
+import { Amounts, AmountJson } from "./amounts.js";
const jAmt = (
value: number,
diff --git a/packages/taler-wallet-core/src/util/amounts.ts b/packages/taler-util/src/amounts.ts
index 7a242f41..8984db11 100644
--- a/packages/taler-wallet-core/src/util/amounts.ts
+++ b/packages/taler-util/src/amounts.ts
@@ -27,7 +27,7 @@ import {
codecForNumber,
Codec,
} from "./codec";
-import { AmountString } from "../types/talerTypes";
+import { AmountString } from "./talerTypes";
/**
* Number of fractional units that one value unit represents.
diff --git a/packages/taler-wallet-core/src/types/backupTypes.ts b/packages/taler-util/src/backupTypes.ts
index 7e6ceb04..b31b8e58 100644
--- a/packages/taler-wallet-core/src/types/backupTypes.ts
+++ b/packages/taler-util/src/backupTypes.ts
@@ -53,7 +53,7 @@
/**
* Imports.
*/
-import { Duration, Timestamp } from "../util/time";
+import { Duration, Timestamp } from "./time.js";
/**
* Type alias for strings that are to be treated like amounts.
@@ -1094,7 +1094,7 @@ export class BackupExchangeSignKey {
/**
* Signature by the auditor that a particular denomination key is audited.
*/
-export class AuditorDenomSig {
+export class BackupAuditorDenomSig {
/**
* Denomination public key's hash.
*/
@@ -1123,7 +1123,7 @@ export class BackupExchangeAuditor {
/**
* List of signatures for denominations by the auditor.
*/
- denomination_keys: AuditorDenomSig[];
+ denomination_keys: BackupAuditorDenomSig[];
}
/**
@@ -1297,3 +1297,10 @@ export interface BackupProposal {
*/
download_session_id?: string;
}
+
+export interface BackupRecovery {
+ walletRootPriv: string;
+ providers: {
+ url: string;
+ }[];
+} \ No newline at end of file
diff --git a/packages/taler-wallet-core/src/util/codec-test.ts b/packages/taler-util/src/codec.test.ts
index f8f4c797..f8f4c797 100644
--- a/packages/taler-wallet-core/src/util/codec-test.ts
+++ b/packages/taler-util/src/codec.test.ts
diff --git a/packages/taler-wallet-core/src/util/codec.ts b/packages/taler-util/src/codec.ts
index 8605ff33..8605ff33 100644
--- a/packages/taler-wallet-core/src/util/codec.ts
+++ b/packages/taler-util/src/codec.ts
diff --git a/packages/taler-util/src/helpers.ts b/packages/taler-util/src/helpers.ts
new file mode 100644
index 00000000..f5c20431
--- /dev/null
+++ b/packages/taler-util/src/helpers.ts
@@ -0,0 +1,152 @@
+/*
+ This file is part of TALER
+ (C) 2016 GNUnet e.V.
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+ * Small helper functions that don't fit anywhere else.
+ */
+
+/**
+ * Imports.
+ */
+import { AmountJson } from "./amounts";
+import * as Amounts from "./amounts";
+import { URL } from "./url";
+
+/**
+ * Show an amount in a form suitable for the user.
+ * FIXME: In the future, this should consider currency-specific
+ * settings such as significant digits or currency symbols.
+ */
+export function amountToPretty(amount: AmountJson): string {
+ const x = amount.value + amount.fraction / Amounts.fractionalBase;
+ return `${x} ${amount.currency}`;
+}
+
+/**
+ * Canonicalize a base url, typically for the exchange.
+ *
+ * See http://api.taler.net/wallet.html#general
+ */
+export function canonicalizeBaseUrl(url: string): string {
+ if (!url.startsWith("http") && !url.startsWith("https")) {
+ url = "https://" + url;
+ }
+ const x = new URL(url);
+ if (!x.pathname.endsWith("/")) {
+ x.pathname = x.pathname + "/";
+ }
+ x.search = "";
+ x.hash = "";
+ return x.href;
+}
+
+/**
+ * Convert object to JSON with canonical ordering of keys
+ * and whitespace omitted.
+ */
+export function canonicalJson(obj: any): string {
+ // Check for cycles, etc.
+ obj = JSON.parse(JSON.stringify(obj));
+ if (typeof obj === "string" || typeof obj === "number" || obj === null) {
+ return JSON.stringify(obj);
+ }
+ if (Array.isArray(obj)) {
+ const objs: string[] = obj.map((e) => canonicalJson(e));
+ return `[${objs.join(",")}]`;
+ }
+ const keys: string[] = [];
+ for (const key in obj) {
+ keys.push(key);
+ }
+ keys.sort();
+ let s = "{";
+ for (let i = 0; i < keys.length; i++) {
+ const key = keys[i];
+ s += JSON.stringify(key) + ":" + canonicalJson(obj[key]);
+ if (i !== keys.length - 1) {
+ s += ",";
+ }
+ }
+ return s + "}";
+}
+
+/**
+ * Check for deep equality of two objects.
+ * Only arrays, objects and primitives are supported.
+ */
+export function deepEquals(x: any, y: any): boolean {
+ if (x === y) {
+ return true;
+ }
+
+ if (Array.isArray(x) && x.length !== y.length) {
+ return false;
+ }
+
+ const p = Object.keys(x);
+ return (
+ Object.keys(y).every((i) => p.indexOf(i) !== -1) &&
+ p.every((i) => deepEquals(x[i], y[i]))
+ );
+}
+
+export function deepCopy(x: any): any {
+ // FIXME: this has many issues ...
+ return JSON.parse(JSON.stringify(x));
+}
+
+/**
+ * Map from a collection to a list or results and then
+ * concatenate the results.
+ */
+export function flatMap<T, U>(xs: T[], f: (x: T) => U[]): U[] {
+ return xs.reduce((acc: U[], next: T) => [...f(next), ...acc], []);
+}
+
+/**
+ * Compute the hash function of a JSON object.
+ */
+export function hash(val: any): number {
+ const str = canonicalJson(val);
+ // https://github.com/darkskyapp/string-hash
+ let h = 5381;
+ let i = str.length;
+ while (i) {
+ h = (h * 33) ^ str.charCodeAt(--i);
+ }
+
+ /* 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. */
+ return h >>> 0;
+}
+
+/**
+ * Lexically compare two strings.
+ */
+export function strcmp(s1: string, s2: string): number {
+ if (s1 < s2) {
+ return -1;
+ }
+ if (s1 > s2) {
+ return 1;
+ }
+ return 0;
+}
+
+export function j2s(x: any): string {
+ return JSON.stringify(x, undefined, 2);
+}
diff --git a/packages/taler-util/src/index.ts b/packages/taler-util/src/index.ts
new file mode 100644
index 00000000..5a82ea08
--- /dev/null
+++ b/packages/taler-util/src/index.ts
@@ -0,0 +1,19 @@
+import { TalerErrorCode } from "./taler-error-codes.js";
+
+export { TalerErrorCode };
+
+export * from "./codec.js";
+export * from "./amounts.js";
+export * from "./talerconfig.js";
+export * from "./time.js";
+export * from "./walletTypes";
+export * from "./transactionsTypes";
+export * from "./notifications";
+export * from "./talerTypes";
+export * from "./talerconfig";
+export * from "./taleruri";
+export * from "./ReserveStatus";
+export * from "./ReserveTransaction";
+export * from "./backupTypes";
+export * from "./payto.js";
+export * from "./libtool-version"; \ No newline at end of file
diff --git a/packages/taler-wallet-core/src/util/libtoolVersion-test.ts b/packages/taler-util/src/libtool-version.test.ts
index e58e9475..19f99772 100644
--- a/packages/taler-wallet-core/src/util/libtoolVersion-test.ts
+++ b/packages/taler-util/src/libtool-version.test.ts
@@ -14,7 +14,7 @@
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import * as LibtoolVersion from "./libtoolVersion";
+import * as LibtoolVersion from "./libtool-version";
import test from "ava";
diff --git a/packages/taler-wallet-core/src/util/libtoolVersion.ts b/packages/taler-util/src/libtool-version.ts
index 5e9d0b74..5e9d0b74 100644
--- a/packages/taler-wallet-core/src/util/libtoolVersion.ts
+++ b/packages/taler-util/src/libtool-version.ts
diff --git a/packages/taler-wallet-core/src/types/notifications.ts b/packages/taler-util/src/notifications.ts
index edfb377b..edfb377b 100644
--- a/packages/taler-wallet-core/src/types/notifications.ts
+++ b/packages/taler-util/src/notifications.ts
diff --git a/packages/taler-wallet-core/src/util/payto-test.ts b/packages/taler-util/src/payto.test.ts
index 01280b65..01280b65 100644
--- a/packages/taler-wallet-core/src/util/payto-test.ts
+++ b/packages/taler-util/src/payto.test.ts
diff --git a/packages/taler-wallet-core/src/util/payto.ts b/packages/taler-util/src/payto.ts
index a1c47eb2..504db533 100644
--- a/packages/taler-wallet-core/src/util/payto.ts
+++ b/packages/taler-util/src/payto.ts
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { URLSearchParams } from "./url";
+import { URLSearchParams } from "./url.js";
interface PaytoUri {
targetType: string;
diff --git a/packages/taler-wallet-core/src/TalerErrorCode.ts b/packages/taler-util/src/taler-error-codes.ts
index a78b04f2..a78b04f2 100644
--- a/packages/taler-wallet-core/src/TalerErrorCode.ts
+++ b/packages/taler-util/src/taler-error-codes.ts
diff --git a/packages/taler-wallet-core/src/types/talerTypes.ts b/packages/taler-util/src/talerTypes.ts
index fe1370cb..bef7ab22 100644
--- a/packages/taler-wallet-core/src/types/talerTypes.ts
+++ b/packages/taler-util/src/talerTypes.ts
@@ -40,14 +40,14 @@ import {
codecForConstNumber,
buildCodecForUnion,
codecForConstString,
-} from "../util/codec";
+} from "./codec";
import {
Timestamp,
codecForTimestamp,
Duration,
codecForDuration,
-} from "../util/time";
-import { codecForAmountString } from "../util/amounts";
+} from "./time";
+import { codecForAmountString } from "./amounts";
/**
* Denomination as found in the /keys response from the exchange.
diff --git a/packages/taler-wallet-core/src/util/talerconfig-test.ts b/packages/taler-util/src/talerconfig.test.ts
index 2f920fcc..2f920fcc 100644
--- a/packages/taler-wallet-core/src/util/talerconfig-test.ts
+++ b/packages/taler-util/src/talerconfig.test.ts
diff --git a/packages/taler-wallet-core/src/util/talerconfig.ts b/packages/taler-util/src/talerconfig.ts
index fa8c2d40..fa8c2d40 100644
--- a/packages/taler-wallet-core/src/util/talerconfig.ts
+++ b/packages/taler-util/src/talerconfig.ts
diff --git a/packages/taler-wallet-core/src/util/taleruri-test.ts b/packages/taler-util/src/taleruri.test.ts
index e80acc5c..e80acc5c 100644
--- a/packages/taler-wallet-core/src/util/taleruri-test.ts
+++ b/packages/taler-util/src/taleruri.test.ts
diff --git a/packages/taler-wallet-core/src/util/taleruri.ts b/packages/taler-util/src/taleruri.ts
index d8366fd0..d8366fd0 100644
--- a/packages/taler-wallet-core/src/util/taleruri.ts
+++ b/packages/taler-util/src/taleruri.ts
diff --git a/packages/taler-wallet-core/src/util/time.ts b/packages/taler-util/src/time.ts
index be63aef6..1a23037a 100644
--- a/packages/taler-wallet-core/src/util/time.ts
+++ b/packages/taler-util/src/time.ts
@@ -1,5 +1,3 @@
-import { Codec, renderContext, Context } from "./codec";
-
/*
This file is part of GNU Taler
(C) 2017-2019 Taler Systems S.A.
@@ -20,6 +18,11 @@ import { Codec, renderContext, Context } from "./codec";
* Helpers for relative and absolute time.
*/
+/**
+ * Imports.
+ */
+import { Codec, renderContext, Context } from "./codec";
+
export class Timestamp {
/**
* Timestamp in milliseconds.
diff --git a/packages/taler-wallet-core/src/types/transactionsTypes.ts b/packages/taler-util/src/transactionsTypes.ts
index 81dc7803..b3cc274a 100644
--- a/packages/taler-wallet-core/src/types/transactionsTypes.ts
+++ b/packages/taler-util/src/transactionsTypes.ts
@@ -24,7 +24,7 @@
/**
* Imports.
*/
-import { Timestamp } from "../util/time";
+import { Timestamp } from "./time.js";
import {
AmountString,
Product,
@@ -33,7 +33,7 @@ import {
codecForInternationalizedString,
codecForMerchantInfo,
codecForProduct,
-} from "./talerTypes";
+} from "./talerTypes.js";
import {
Codec,
buildCodecForObject,
@@ -41,8 +41,8 @@ import {
codecForString,
codecForList,
codecForAny,
-} from "../util/codec";
-import { TalerErrorDetails } from "./walletTypes";
+} from "./codec.js";
+import { TalerErrorDetails } from "./walletTypes.js";
export interface TransactionsRequest {
/**
diff --git a/packages/taler-wallet-core/src/types/types-test.ts b/packages/taler-util/src/types-test.ts
index 19c9b5aa..19c9b5aa 100644
--- a/packages/taler-wallet-core/src/types/types-test.ts
+++ b/packages/taler-util/src/types-test.ts
diff --git a/packages/taler-util/src/url.ts b/packages/taler-util/src/url.ts
new file mode 100644
index 00000000..b50b4b46
--- /dev/null
+++ b/packages/taler-util/src/url.ts
@@ -0,0 +1,74 @@
+/*
+ This file is part of GNU Taler
+ (C) 2020 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+ */
+
+interface URL {
+ hash: string;
+ host: string;
+ hostname: string;
+ href: string;
+ toString(): string;
+ readonly origin: string;
+ password: string;
+ pathname: string;
+ port: string;
+ protocol: string;
+ search: string;
+ readonly searchParams: URLSearchParams;
+ username: string;
+ toJSON(): string;
+}
+
+interface URLSearchParams {
+ append(name: string, value: string): void;
+ delete(name: string): void;
+ get(name: string): string | null;
+ getAll(name: string): string[];
+ has(name: string): boolean;
+ set(name: string, value: string): void;
+ sort(): void;
+ toString(): string;
+ forEach(
+ callbackfn: (value: string, key: string, parent: URLSearchParams) => void,
+ thisArg?: any,
+ ): void;
+}
+
+export interface URLSearchParamsCtor {
+ new (
+ init?: string[][] | Record<string, string> | string | URLSearchParams,
+ ): URLSearchParams;
+}
+
+export interface URLCtor {
+ new (url: string, base?: string | URL): URL;
+}
+
+// @ts-ignore
+const _URL = globalThis.URL;
+if (!_URL) {
+ throw Error("FATAL: URL not available");
+}
+
+export const URL: URLCtor = _URL;
+
+// @ts-ignore
+const _URLSearchParams = globalThis.URLSearchParams;
+
+if (!_URLSearchParams) {
+ throw Error("FATAL: URLSearchParams not available");
+}
+
+export const URLSearchParams: URLSearchParamsCtor = _URLSearchParams;
diff --git a/packages/taler-wallet-core/src/types/walletTypes.ts b/packages/taler-util/src/walletTypes.ts
index 9ecca059..d25108df 100644
--- a/packages/taler-wallet-core/src/types/walletTypes.ts
+++ b/packages/taler-util/src/walletTypes.ts
@@ -31,14 +31,9 @@ import {
AmountJson,
codecForAmountJson,
codecForAmountString,
-} from "../util/amounts";
-import * as LibtoolVersion from "../util/libtoolVersion";
-import {
- ExchangeRecord,
- ExchangeWireInfo,
- DenominationSelectionInfo,
-} from "./dbTypes";
-import { Timestamp, codecForTimestamp } from "../util/time";
+} from "./amounts.js";
+import * as LibtoolVersion from "./libtool-version.js";
+import { Timestamp, codecForTimestamp } from "./time.js";
import {
buildCodecForObject,
codecForString,
@@ -49,14 +44,14 @@ import {
codecForConstString,
codecForAny,
buildCodecForUnion,
-} from "../util/codec";
+} from "./codec.js";
import {
AmountString,
codecForContractTerms,
ContractTerms,
-} from "./talerTypes";
+} from "./talerTypes.js";
import { OrderShortInfo, codecForOrderShortInfo } from "./transactionsTypes";
-import { BackupRecovery } from "../operations/backup";
+import { BackupRecovery } from "./backupTypes.js";
/**
* Response for the create reserve request to the wallet.
@@ -74,92 +69,7 @@ export class CreateReserveResponse {
reservePub: string;
}
-/**
- * Information about what will happen when creating a reserve.
- *
- * Sent to the wallet frontend to be rendered and shown to the user.
- */
-export interface ExchangeWithdrawDetails {
- /**
- * Exchange that the reserve will be created at.
- */
- exchangeInfo: ExchangeRecord;
-
- /**
- * Filtered wire info to send to the bank.
- */
- exchangeWireAccounts: string[];
-
- /**
- * Selected denominations for withdraw.
- */
- selectedDenoms: DenominationSelectionInfo;
-
- /**
- * Fees for withdraw.
- */
- withdrawFee: AmountJson;
-
- /**
- * Remaining balance that is too small to be withdrawn.
- */
- overhead: AmountJson;
-
- /**
- * Wire fees from the exchange.
- */
- wireFees: ExchangeWireInfo;
-
- /**
- * Does the wallet know about an auditor for
- * the exchange that the reserve.
- */
- isAudited: boolean;
-
- /**
- * Did the user already accept the current terms of service for the exchange?
- */
- termsOfServiceAccepted: boolean;
-
- /**
- * The exchange is trusted directly.
- */
- isTrusted: boolean;
-
- /**
- * The earliest deposit expiration of the selected coins.
- */
- earliestDepositExpiration: Timestamp;
-
- /**
- * Number of currently offered denominations.
- */
- numOfferedDenoms: number;
-
- /**
- * Public keys of trusted auditors for the currency we're withdrawing.
- */
- trustedAuditorPubs: string[];
-
- /**
- * Result of checking the wallet's version
- * against the exchange's version.
- *
- * Older exchanges don't return version information.
- */
- versionMatch: LibtoolVersion.VersionMatchResult | undefined;
-
- /**
- * Libtool-style version string for the exchange or "unknown"
- * for older exchanges.
- */
- exchangeVersion: string;
- /**
- * Libtool-style version string for the wallet.
- */
- walletVersion: string;
-}
export interface Balance {
available: AmountString;
diff --git a/packages/taler-util/tsconfig.json b/packages/taler-util/tsconfig.json
new file mode 100644
index 00000000..30cb65e1
--- /dev/null
+++ b/packages/taler-util/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compileOnSave": true,
+ "compilerOptions": {
+ "composite": true,
+ "declaration": true,
+ "declarationMap": false,
+ "target": "ES6",
+ "module": "ESNext",
+ "moduleResolution": "node",
+ "sourceMap": true,
+ "lib": ["es6"],
+ "types": ["node"],
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "strict": true,
+ "strictPropertyInitialization": false,
+ "outDir": "lib",
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "incremental": true,
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "rootDir": "./src",
+ "typeRoots": ["./node_modules/@types"]
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/taler-wallet-cli/package.json b/packages/taler-wallet-cli/package.json
index 99372327..1c391e1d 100644
--- a/packages/taler-wallet-cli/package.json
+++ b/packages/taler-wallet-cli/package.json
@@ -44,6 +44,7 @@
"typescript": "^4.1.3"
},
"dependencies": {
+ "@gnu-taler/taler-util": "workspace:*",
"@gnu-taler/taler-wallet-core": "workspace:*",
"@types/minimatch": "^3.0.3",
"axios": "^0.21.1",
diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts
index acf46526..8865c330 100644
--- a/packages/taler-wallet-cli/src/index.ts
+++ b/packages/taler-wallet-cli/src/index.ts
@@ -14,34 +14,16 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
+/**
+ * Imports.
+ */
import os from "os";
import fs from "fs";
-import {
- getDefaultNodeWallet,
- Logger,
- Amounts,
- Wallet,
- OperationFailedAndReportedError,
- OperationFailedError,
- NodeHttpLib,
- PreparePayResultType,
- setDangerousTimetravel,
- classifyTalerUri,
- TalerUriType,
- decodeCrock,
- addPaytoQueryParams,
- codecForList,
- codecForString,
- printTestVectors,
- NodeThreadCryptoWorkerFactory,
- CryptoApi,
- rsaBlind,
- RecoveryMergeStrategy,
- stringToBytes,
-} from "@gnu-taler/taler-wallet-core";
-import * as clk from "./clk";
+import * as clk from "./clk.js";
import { deepStrictEqual } from "assert";
-import { getTestInfo, runTests } from "./integrationtests/testrunner";
+import { getTestInfo, runTests } from "./integrationtests/testrunner.js";
+import { PreparePayResultType, setDangerousTimetravel, classifyTalerUri, TalerUriType, RecoveryMergeStrategy, Amounts, addPaytoQueryParams, codecForList, codecForString } from "@gnu-taler/taler-util";
+import { Logger, Wallet, NodeHttpLib, getDefaultNodeWallet, OperationFailedAndReportedError, OperationFailedError, decodeCrock, rsaBlind, NodeThreadCryptoWorkerFactory, CryptoApi } from "@gnu-taler/taler-wallet-core";
// This module also serves as the entry point for the crypto
// thread worker, and thus must expose these two handlers.
@@ -811,9 +793,6 @@ testCli
});
});
-testCli.subcommand("vectors", "vectors").action(async (args) => {
- printTestVectors();
-});
async function read(stream: NodeJS.ReadStream) {
const chunks = [];
diff --git a/packages/taler-wallet-cli/src/integrationtests/harness.ts b/packages/taler-wallet-cli/src/integrationtests/harness.ts
index 31f9131a..65ffdafb 100644
--- a/packages/taler-wallet-cli/src/integrationtests/harness.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/harness.ts
@@ -30,81 +30,83 @@ import * as path from "path";
import * as http from "http";
import { deepStrictEqual } from "assert";
import { ChildProcess, spawn } from "child_process";
+import { URL } from "url";
+import axios, { AxiosError } from "axios";
+import {
+ codecForMerchantOrderPrivateStatusResponse,
+ codecForPostOrderResponse,
+ PostOrderRequest,
+ PostOrderResponse,
+ MerchantOrderPrivateStatusResponse,
+ TippingReserveStatus,
+ TipCreateConfirmation,
+ TipCreateRequest,
+ MerchantInstancesResponse,
+} from "./merchantApiTypes";
+import {
+ createEddsaKeyPair,
+ eddsaGetPublic,
+ EddsaKeyPair,
+ encodeCrock,
+ getRandomBytes,
+ openPromise,
+ OperationFailedError,
+} from "@gnu-taler/taler-wallet-core";
import {
- Configuration,
AmountJson,
Amounts,
+ Configuration,
+ AmountString,
Codec,
buildCodecForObject,
codecForString,
Duration,
+ parsePaytoUri,
CoreApiResponse,
- PreparePayResult,
+ ApplyRefundRequest,
+ ApplyRefundResponse,
+ codecForApplyRefundResponse,
PreparePayRequest,
+ PreparePayResult,
codecForPreparePayResult,
- OperationFailedError,
- AddExchangeRequest,
- ExchangesListRespose,
- codecForExchangesListResponse,
- GetWithdrawalDetailsForUriRequest,
- WithdrawUriInfoResponse,
- codecForWithdrawUriInfoResponse,
+ CreateDepositGroupRequest,
+ CreateDepositGroupResponse,
+ AbortPayWithRefundRequest,
ConfirmPayRequest,
ConfirmPayResult,
codecForConfirmPayResult,
- IntegrationTestArgs,
- TestPayArgs,
+ PrepareTipRequest,
+ PrepareTipResult,
+ codecForPrepareTipResult,
+ AcceptTipRequest,
+ CoinDumpJson,
+ codecForAny,
+ AddExchangeRequest,
+ ForceExchangeUpdateRequest,
+ ForceRefreshRequest,
+ ExchangesListRespose,
+ codecForExchangesListResponse,
BalancesResponse,
codecForBalancesResponse,
- encodeCrock,
- getRandomBytes,
- EddsaKeyPair,
- eddsaGetPublic,
- createEddsaKeyPair,
TransactionsResponse,
codecForTransactionsResponse,
- WithdrawTestBalanceRequest,
- AmountString,
- ApplyRefundRequest,
- codecForApplyRefundResponse,
- codecForAny,
- CoinDumpJson,
- ForceExchangeUpdateRequest,
- ForceRefreshRequest,
- PrepareTipResult,
- PrepareTipRequest,
- codecForPrepareTipResult,
- AcceptTipRequest,
- AbortPayWithRefundRequest,
- openPromise,
- parsePaytoUri,
- CreateDepositGroupRequest,
- CreateDepositGroupResponse,
TrackDepositGroupRequest,
TrackDepositGroupResponse,
+ IntegrationTestArgs,
+ TestPayArgs,
+ WithdrawTestBalanceRequest,
+ GetWithdrawalDetailsForUriRequest,
+ WithdrawUriInfoResponse,
+ codecForWithdrawUriInfoResponse,
+ BackupRecovery,
RecoveryLoadRequest,
-} from "@gnu-taler/taler-wallet-core";
-import { URL } from "url";
-import axios, { AxiosError } from "axios";
-import {
- codecForMerchantOrderPrivateStatusResponse,
- codecForPostOrderResponse,
- PostOrderRequest,
- PostOrderResponse,
- MerchantOrderPrivateStatusResponse,
- TippingReserveStatus,
- TipCreateConfirmation,
- TipCreateRequest,
- MerchantInstancesResponse,
-} from "./merchantApiTypes";
-import { ApplyRefundResponse } from "@gnu-taler/taler-wallet-core";
-import { PendingOperationsResponse } from "@gnu-taler/taler-wallet-core";
-import { CoinConfig } from "./denomStructures";
+} from "@gnu-taler/taler-util";
import {
AddBackupProviderRequest,
BackupInfo,
- BackupRecovery,
} from "@gnu-taler/taler-wallet-core/src/operations/backup";
+import { PendingOperationsResponse } from "@gnu-taler/taler-wallet-core/src/pending-types";
+import { CoinConfig } from "./denomStructures.js";
const exec = util.promisify(require("child_process").exec);
@@ -486,7 +488,7 @@ export async function pingProc(
}
}
-export interface ExchangeBankAccount {
+export interface HarnessExchangeBankAccount {
accountName: string;
accountPassword: string;
accountPaytoUri: string;
@@ -573,7 +575,7 @@ export namespace BankApi {
export async function adminAddIncoming(
bank: BankServiceInterface,
params: {
- exchangeBankAccount: ExchangeBankAccount;
+ exchangeBankAccount: HarnessExchangeBankAccount;
amount: string;
reservePub: string;
debitAccountPayto: string;
@@ -701,7 +703,7 @@ export class BankService implements BankServiceInterface {
async createExchangeAccount(
accountName: string,
password: string,
- ): Promise<ExchangeBankAccount> {
+ ): Promise<HarnessExchangeBankAccount> {
await sh(
this.globalTestState,
"taler-bank-manage_django",
@@ -944,7 +946,7 @@ export class ExchangeService implements ExchangeServiceInterface {
async addBankAccount(
localName: string,
- exchangeBankAccount: ExchangeBankAccount,
+ exchangeBankAccount: HarnessExchangeBankAccount,
): Promise<void> {
const config = Configuration.load(this.configFilename);
config.setString(
diff --git a/packages/taler-wallet-cli/src/integrationtests/helpers.ts b/packages/taler-wallet-cli/src/integrationtests/helpers.ts
index bca98375..35146a82 100644
--- a/packages/taler-wallet-cli/src/integrationtests/helpers.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/helpers.ts
@@ -24,38 +24,38 @@
* Imports
*/
import {
- GlobalTestState,
+ FaultInjectedExchangeService,
+ FaultInjectedMerchantService,
+} from "./faultInjection";
+import { CoinConfig, defaultCoinConfig } from "./denomStructures";
+import {
+ AmountString,
+ Duration,
+ ContractTerms,
+ PreparePayResultType,
+ ConfirmPayResultType,
+} from "@gnu-taler/taler-util";
+import {
DbInfo,
+ BankService,
ExchangeService,
- WalletCli,
MerchantService,
+ WalletCli,
+ GlobalTestState,
setupDb,
- BankService,
- ExchangeBankAccount,
- MerchantServiceInterface,
+ ExchangeServiceInterface,
BankApi,
BankAccessApi,
+ MerchantServiceInterface,
MerchantPrivateApi,
- ExchangeServiceInterface,
-} from "./harness";
-import {
- AmountString,
- Duration,
- PreparePayResultType,
- ConfirmPayResultType,
- ContractTerms,
-} from "@gnu-taler/taler-wallet-core";
-import {
- FaultInjectedExchangeService,
- FaultInjectedMerchantService,
-} from "./faultInjection";
-import { CoinConfig, defaultCoinConfig } from "./denomStructures";
+ HarnessExchangeBankAccount,
+} from "./harness.js";
export interface SimpleTestEnvironment {
commonDb: DbInfo;
bank: BankService;
exchange: ExchangeService;
- exchangeBankAccount: ExchangeBankAccount;
+ exchangeBankAccount: HarnessExchangeBankAccount;
merchant: MerchantService;
wallet: WalletCli;
}
@@ -154,7 +154,7 @@ export interface FaultyMerchantTestEnvironment {
bank: BankService;
exchange: ExchangeService;
faultyExchange: FaultInjectedExchangeService;
- exchangeBankAccount: ExchangeBankAccount;
+ exchangeBankAccount: HarnessExchangeBankAccount;
merchant: MerchantService;
faultyMerchant: FaultInjectedMerchantService;
wallet: WalletCli;
diff --git a/packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts b/packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts
index 1326d3a5..2233c7ad 100644
--- a/packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/merchantApiTypes.ts
@@ -41,7 +41,7 @@ import {
Timestamp,
CoinPublicKeyString,
EddsaPublicKeyString,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
import { codecForAmountString } from "@gnu-taler/taler-wallet-core/lib/util/amounts";
export interface PostOrderRequest {
diff --git a/packages/taler-wallet-cli/src/integrationtests/sync.ts b/packages/taler-wallet-cli/src/integrationtests/sync.ts
index 83024ec7..e0f9e22c 100644
--- a/packages/taler-wallet-cli/src/integrationtests/sync.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/sync.ts
@@ -18,7 +18,7 @@
* Imports.
*/
import axios from "axios";
-import { Configuration, URL } from "@gnu-taler/taler-wallet-core";
+import { URL } from "@gnu-taler/taler-wallet-core";
import * as fs from "fs";
import * as util from "util";
import {
@@ -30,6 +30,7 @@ import {
setupDb,
sh,
} from "./harness";
+import { Configuration } from "@gnu-taler/taler-util";
const exec = util.promisify(require("child_process").exec);
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts
index 1b7deefc..0d0253d7 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts
@@ -28,11 +28,9 @@ import {
BankAccessApi,
} from "./harness";
import {
- PreparePayResultType,
- ExchangesListRespose,
URL,
- TalerErrorCode,
} from "@gnu-taler/taler-wallet-core";
+import { ExchangesListRespose, TalerErrorCode } from "@gnu-taler/taler-util";
import {
FaultInjectedExchangeService,
FaultInjectionResponseContext,
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts
index 609ec596..655f1863 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts
@@ -17,11 +17,11 @@
/**
* Imports.
*/
-import { CoreApiResponse } from "@gnu-taler/taler-wallet-core";
+import { CoreApiResponse } from "@gnu-taler/taler-util";
import { CoinConfig, defaultCoinConfig } from "./denomStructures";
import {
DbInfo,
- ExchangeBankAccount,
+ HarnessExchangeBankAccount,
ExchangeService,
GlobalTestState,
MerchantService,
@@ -44,7 +44,7 @@ const merchantIban = "DE42500105171245624648";
export interface LibeufinTestEnvironment {
commonDb: DbInfo;
exchange: ExchangeService;
- exchangeBankAccount: ExchangeBankAccount;
+ exchangeBankAccount: HarnessExchangeBankAccount;
merchant: MerchantService;
wallet: WalletCli;
libeufinSandbox: LibeufinSandboxService;
@@ -181,7 +181,7 @@ export async function createLibeufinTestEnvironment(
database: db.connStr,
});
- const exchangeBankAccount: ExchangeBankAccount = {
+ const exchangeBankAccount: HarnessExchangeBankAccount = {
accountName: "twguser",
accountPassword: "twgpw",
accountPaytoUri: `payto://iban/${exchangeIban}?receiver-name=Exchange`,
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-refund.ts b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-refund.ts
index 2ceb8be0..0adabbf4 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-refund.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-refund.ts
@@ -17,15 +17,11 @@
/**
* Imports.
*/
-import { CoreApiResponse } from "@gnu-taler/taler-wallet-core";
-import { CoinConfig, defaultCoinConfig } from "./denomStructures";
import { GlobalTestState } from "./harness";
-import { getRandomIban } from "./helpers";
import {
SandboxUserBundle,
NexusUserBundle,
launchLibeufinServices,
- LibeufinNexusApi,
LibeufinSandboxApi,
} from "./libeufin";
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-tutorial.ts b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-tutorial.ts
index 23fc9126..271eedbc 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-tutorial.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-tutorial.ts
@@ -17,13 +17,9 @@
/**
* Imports.
*/
-import { CoreApiResponse } from "@gnu-taler/taler-wallet-core";
-import { CoinConfig, defaultCoinConfig } from "./denomStructures";
import { GlobalTestState } from "./harness";
import {
- LibeufinNexusApi,
LibeufinNexusService,
- LibeufinSandboxApi,
LibeufinSandboxService,
LibeufinCli,
} from "./libeufin";
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-exchange-confusion.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-exchange-confusion.ts
index a60f7f01..a14b63e0 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-exchange-confusion.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-exchange-confusion.ts
@@ -35,8 +35,7 @@ import {
PreparePayResultType,
codecForMerchantOrderStatusUnpaid,
ConfirmPayResultType,
- URL,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
import axios from "axios";
import {
FaultInjectedExchangeService,
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts
index 17563c02..0f6ba654 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts
@@ -23,9 +23,9 @@ import {
PreparePayResultType,
codecForMerchantOrderStatusUnpaid,
ConfirmPayResultType,
- URL,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
import axios from "axios";
+import { URL } from "@gnu-taler/taler-wallet-core";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts b/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts
index 07ed5639..25c2ea36 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-merchant-refund-api.ts
@@ -33,9 +33,9 @@ import {
import {
durationFromSpec,
PreparePayResultType,
- URL,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
import axios from "axios";
+import { URL } from "@gnu-taler/taler-wallet-core";
async function testRefundApiWithFulfillmentUrl(
t: GlobalTestState,
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts
index 44a81b51..1a4219a9 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts
@@ -22,9 +22,8 @@
/**
* Imports.
*/
+import { PreparePayResultType, TalerErrorCode } from "@gnu-taler/taler-util";
import {
- PreparePayResultType,
- TalerErrorCode,
URL,
} from "@gnu-taler/taler-wallet-core";
import {
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts
index f826bdc6..575228a8 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts
@@ -26,10 +26,10 @@ import {
PreparePayResultType,
codecForMerchantOrderStatusUnpaid,
ConfirmPayResultType,
- URL,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
import axios from "axios";
import { FaultInjectionRequestContext } from "./faultInjection";
+import { URL } from "@gnu-taler/taler-wallet-core";
/**
* Run test for the wallets repurchase detection mechanism
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts
index 2432c111..a26b6724 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts
@@ -21,8 +21,8 @@ import { GlobalTestState, MerchantPrivateApi, WalletCli } from "./harness";
import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
import {
PreparePayResultType,
- TalerErrorCode,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
+import { TalerErrorCode } from "@gnu-taler/taler-util";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts
index 713f7162..d467eb66 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts
@@ -37,7 +37,7 @@ import {
FaultInjectionRequestContext,
FaultInjectionResponseContext,
} from "./faultInjection";
-import { CoreApiResponse } from "@gnu-taler/taler-wallet-core";
+import { CoreApiResponse } from "@gnu-taler/taler-util";
import { defaultCoinConfig } from "./denomStructures";
/**
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts
index d456554c..4d7d5f95 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts
@@ -19,7 +19,7 @@
*/
import { GlobalTestState, MerchantPrivateApi } from "./harness";
import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
-import { PreparePayResultType } from "@gnu-taler/taler-wallet-core";
+import { PreparePayResultType } from "@gnu-taler/taler-util";
/**
* Test the wallet-core payment API, especially that repeated operations
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts
index b9e5670d..8825def7 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts
@@ -22,20 +22,13 @@ import {
withdrawViaBank,
createFaultInjectedMerchantTestkudosEnvironment,
} from "./helpers";
-import {
- PreparePayResultType,
- codecForMerchantOrderStatusUnpaid,
- ConfirmPayResultType,
- URL,
- codecForExchangeKeysJson,
- TalerErrorDetails,
- TalerErrorCode,
-} from "@gnu-taler/taler-wallet-core";
import axios from "axios";
import {
FaultInjectionRequestContext,
FaultInjectionResponseContext,
} from "./faultInjection";
+import { codecForMerchantOrderStatusUnpaid, ConfirmPayResultType, PreparePayResultType, TalerErrorCode, TalerErrorDetails } from "@gnu-taler/taler-util";
+import { URL } from "@gnu-taler/taler-wallet-core";
/**
* Run test for a payment where the merchant has a transient
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts b/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts
index 4d5fac5c..85bcbfd0 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts
@@ -23,7 +23,7 @@ import {
PreparePayResultType,
codecForMerchantOrderStatusUnpaid,
ConfirmPayResultType,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
import axios from "axios";
/**
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts
index 4ec4ff5a..1b3fb285 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts
@@ -19,7 +19,7 @@
*/
import { GlobalTestState, MerchantPrivateApi } from "./harness";
import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
-import { durationFromSpec } from "@gnu-taler/taler-wallet-core";
+import { durationFromSpec } from "@gnu-taler/taler-util";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts
index 74c99ec3..7158a40a 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts
@@ -28,7 +28,7 @@ import {
timestampAddDuration,
getTimestampNow,
timestampTruncateToSecond,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts
index 69d50326..9f961b2b 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts
@@ -23,7 +23,7 @@ import {
TransactionType,
Amounts,
durationFromSpec,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-refund.ts b/packages/taler-wallet-cli/src/integrationtests/test-refund.ts
index c6af7cdc..b97b21b3 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund.ts
@@ -17,7 +17,7 @@
/**
* Imports.
*/
-import { durationFromSpec } from "@gnu-taler/taler-wallet-core";
+import { durationFromSpec } from "@gnu-taler/taler-util";
import { GlobalTestState, MerchantPrivateApi } from "./harness";
import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts
index f7e51e71..c54f667a 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts
@@ -21,9 +21,9 @@ import {
ConfirmPayResultType,
Duration,
durationFromSpec,
- PendingOperationsResponse,
PreparePayResultType,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
+import { PendingOperationsResponse } from "@gnu-taler/taler-wallet-core";
import { makeNoFeeCoinConfig } from "./denomStructures";
import {
BankService,
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts
index 3b2fac58..4af85585 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts
@@ -23,7 +23,7 @@ import {
withdrawViaBank,
startWithdrawViaBank,
} from "./helpers";
-import { Duration, TransactionType } from "@gnu-taler/taler-wallet-core";
+import { Duration, TransactionType } from "@gnu-taler/taler-util";
/**
* Basic time travel test.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-doublespend.ts b/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-doublespend.ts
index 94cad751..ef53046c 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-doublespend.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-doublespend.ts
@@ -17,12 +17,9 @@
/**
* Imports.
*/
-import { PreparePayResultType } from "@gnu-taler/taler-wallet-core";
-import { testPay } from "@gnu-taler/taler-wallet-core/src/operations/testing";
+import { PreparePayResultType } from "@gnu-taler/taler-util";
import {
GlobalTestState,
- BankApi,
- BankAccessApi,
WalletCli,
MerchantPrivateApi,
} from "./harness";
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts
index 861e616e..6cd508b2 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-abort-bank.ts
@@ -17,12 +17,9 @@
/**
* Imports.
*/
+import { TalerErrorCode } from "@gnu-taler/taler-util";
import { GlobalTestState, BankApi, BankAccessApi } from "./harness";
import { createSimpleTestkudosEnvironment } from "./helpers";
-import {
- codecForBalancesResponse,
- TalerErrorCode,
-} from "@gnu-taler/taler-wallet-core";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts
index e21434ff..1a3268ad 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-bank-integrated.ts
@@ -19,7 +19,7 @@
*/
import { GlobalTestState, BankApi, BankAccessApi } from "./harness";
import { createSimpleTestkudosEnvironment } from "./helpers";
-import { codecForBalancesResponse } from "@gnu-taler/taler-wallet-core";
+import { codecForBalancesResponse } from "@gnu-taler/taler-util";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts
index dc0180de..5921510b 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts
@@ -19,8 +19,8 @@
*/
import { GlobalTestState, BankApi } from "./harness";
import { createSimpleTestkudosEnvironment } from "./helpers";
-import { CoreApiResponse } from "@gnu-taler/taler-wallet-core";
-import { codecForBalancesResponse } from "@gnu-taler/taler-wallet-core";
+import { CoreApiResponse } from "@gnu-taler/taler-util";
+import { codecForBalancesResponse } from "@gnu-taler/taler-util";
/**
* Run test for basic, bank-integrated withdrawal.
diff --git a/packages/taler-wallet-cli/tsconfig.json b/packages/taler-wallet-cli/tsconfig.json
index 5985a516..5ded91d7 100644
--- a/packages/taler-wallet-cli/tsconfig.json
+++ b/packages/taler-wallet-cli/tsconfig.json
@@ -25,6 +25,9 @@
"references": [
{
"path": "../taler-wallet-core/"
+ },
+ {
+ "path": "../taler-util/"
}
]
}
diff --git a/packages/taler-wallet-core/package.json b/packages/taler-wallet-core/package.json
index 82ef825b..15485cb5 100644
--- a/packages/taler-wallet-core/package.json
+++ b/packages/taler-wallet-core/package.json
@@ -58,6 +58,7 @@
},
"dependencies": {
"@gnu-taler/idb-bridge": "workspace:*",
+ "@gnu-taler/taler-util": "workspace:*",
"@types/node": "^14.14.22",
"axios": "^0.21.1",
"big-integer": "^1.6.48",
diff --git a/packages/taler-wallet-core/src/types/cryptoTypes.ts b/packages/taler-wallet-core/src/crypto/cryptoTypes.ts
index 9b67b596..922fbbfa 100644
--- a/packages/taler-wallet-core/src/types/cryptoTypes.ts
+++ b/packages/taler-wallet-core/src/crypto/cryptoTypes.ts
@@ -27,7 +27,7 @@
/**
* Imports.
*/
-import { AmountJson } from "../util/amounts";
+import { AmountJson } from "@gnu-taler/taler-util";
export interface RefreshNewDenomInfo {
count: number;
diff --git a/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts b/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts
index d7eddd69..c124b89d 100644
--- a/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts
+++ b/packages/taler-wallet-core/src/crypto/workers/cryptoApi.ts
@@ -22,11 +22,11 @@
/**
* Imports.
*/
-import { CoinRecord, DenominationRecord, WireFee } from "../../types/dbTypes";
+import { CoinRecord, DenominationRecord, WireFee } from "../../db";
import { CryptoWorker } from "./cryptoWorker";
-import { RecoupRequest, CoinDepositPermission } from "../../types/talerTypes";
+import { RecoupRequest, CoinDepositPermission } from "@gnu-taler/taler-util";
import {
BenchmarkResult,
@@ -34,7 +34,7 @@ import {
PlanchetCreationRequest,
DepositInfo,
MakeSyncSignatureRequest,
-} from "../../types/walletTypes";
+} from "@gnu-taler/taler-util";
import * as timer from "../../util/timer";
import { Logger } from "../../util/logging";
@@ -44,7 +44,7 @@ import {
DeriveRefreshSessionRequest,
DeriveTipRequest,
SignTrackTransactionRequest,
-} from "../../types/cryptoTypes";
+} from "../cryptoTypes.js";
const logger = new Logger("cryptoApi.ts");
diff --git a/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts b/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
index 87fad863..6e9427e5 100644
--- a/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
+++ b/packages/taler-wallet-core/src/crypto/workers/cryptoImplementation.ts
@@ -26,23 +26,25 @@
* Imports.
*/
+// FIXME: Crypto should not use DB Types!
import {
CoinRecord,
DenominationRecord,
RefreshPlanchet,
WireFee,
CoinSourceType,
-} from "../../types/dbTypes";
+} from "../../db.js";
-import { CoinDepositPermission, RecoupRequest } from "../../types/talerTypes";
+import { CoinDepositPermission, RecoupRequest } from "@gnu-taler/taler-util";
+// FIXME: These types should be internal to the wallet!
import {
BenchmarkResult,
PlanchetCreationResult,
PlanchetCreationRequest,
DepositInfo,
MakeSyncSignatureRequest,
-} from "../../types/walletTypes";
-import { AmountJson, Amounts } from "../../util/amounts";
+} from "@gnu-taler/taler-util";
+import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import * as timer from "../../util/timer";
import {
encodeCrock,
@@ -64,7 +66,7 @@ import {
} from "../talerCrypto";
import { randomBytes } from "../primitives/nacl-fast";
import { kdf } from "../primitives/kdf";
-import { Timestamp, timestampTruncateToSecond } from "../../util/time";
+import { Timestamp, timestampTruncateToSecond } from "@gnu-taler/taler-util";
import { Logger } from "../../util/logging";
import {
@@ -73,7 +75,7 @@ import {
DeriveRefreshSessionRequest,
DeriveTipRequest,
SignTrackTransactionRequest,
-} from "../../types/cryptoTypes";
+} from "../cryptoTypes.js";
const logger = new Logger("cryptoImplementation.ts");
diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts
index bc0e4501..c1076b90 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -1,4 +1,3 @@
-import { MetaStores, Stores } from "./types/dbTypes";
import {
openDatabase,
Database,
@@ -11,8 +10,12 @@ import {
IDBDatabase,
IDBObjectStore,
IDBTransaction,
+ IDBKeyPath,
} from "@gnu-taler/idb-bridge";
import { Logger } from "./util/logging";
+import { AmountJson, AmountString, Auditor, CoinDepositPermission, ContractTerms, Duration, ExchangeSignKeyJson, InternationalizedString, MerchantInfo, Product, RefreshReason, ReserveTransaction, TalerErrorDetails, Timestamp } from "@gnu-taler/taler-util";
+import { RetryInfo } from "./util/retries.js";
+import { PayCoinSelection } from "./util/coinSelection.js";
/**
* Name of the Taler database. This is effectively the major
@@ -166,3 +169,1735 @@ export async function openTalerDatabase(
export function deleteTalerDatabase(idbFactory: IDBFactory): void {
Database.deleteDatabase(idbFactory, TALER_DB_NAME);
}
+
+
+export enum ReserveRecordStatus {
+ /**
+ * Reserve must be registered with the bank.
+ */
+ REGISTERING_BANK = "registering-bank",
+
+ /**
+ * We've registered reserve's information with the bank
+ * and are now waiting for the user to confirm the withdraw
+ * with the bank (typically 2nd factor auth).
+ */
+ WAIT_CONFIRM_BANK = "wait-confirm-bank",
+
+ /**
+ * Querying reserve status with the exchange.
+ */
+ QUERYING_STATUS = "querying-status",
+
+ /**
+ * The corresponding withdraw record has been created.
+ * No further processing is done, unless explicitly requested
+ * by the user.
+ */
+ DORMANT = "dormant",
+
+ /**
+ * The bank aborted the withdrawal.
+ */
+ BANK_ABORTED = "bank-aborted",
+}
+
+export interface ReserveBankInfo {
+ /**
+ * Status URL that the wallet will use to query the status
+ * of the Taler withdrawal operation on the bank's side.
+ */
+ statusUrl: string;
+
+ confirmUrl?: string;
+
+ /**
+ * Exchange payto URI that the bank will use to fund the reserve.
+ */
+ exchangePaytoUri: string;
+}
+
+/**
+ * A reserve record as stored in the wallet's database.
+ */
+export interface ReserveRecord {
+ /**
+ * The reserve public key.
+ */
+ reservePub: string;
+
+ /**
+ * The reserve private key.
+ */
+ reservePriv: string;
+
+ /**
+ * The exchange base URL.
+ */
+ exchangeBaseUrl: string;
+
+ /**
+ * Currency of the reserve.
+ */
+ currency: string;
+
+ /**
+ * Time when the reserve was created.
+ */
+ timestampCreated: Timestamp;
+
+ /**
+ * Time when the information about this reserve was posted to the bank.
+ *
+ * Only applies if bankWithdrawStatusUrl is defined.
+ *
+ * Set to 0 if that hasn't happened yet.
+ */
+ timestampReserveInfoPosted: Timestamp | undefined;
+
+ /**
+ * Time when the reserve was confirmed by the bank.
+ *
+ * Set to undefined if not confirmed yet.
+ */
+ timestampBankConfirmed: Timestamp | undefined;
+
+ /**
+ * Wire information (as payto URI) for the bank account that
+ * transfered funds for this reserve.
+ */
+ senderWire?: string;
+
+ /**
+ * Amount that was sent by the user to fund the reserve.
+ */
+ instructedAmount: AmountJson;
+
+ /**
+ * Extra state for when this is a withdrawal involving
+ * a Taler-integrated bank.
+ */
+ bankInfo?: ReserveBankInfo;
+
+ initialWithdrawalGroupId: string;
+
+ /**
+ * Did we start the first withdrawal for this reserve?
+ *
+ * We only report a pending withdrawal for the reserve before
+ * the first withdrawal has started.
+ */
+ initialWithdrawalStarted: boolean;
+
+ /**
+ * Initial denomination selection, stored here so that
+ * we can show this information in the transactions/balances
+ * before we have a withdrawal group.
+ */
+ initialDenomSel: DenomSelectionState;
+
+ reserveStatus: ReserveRecordStatus;
+
+ /**
+ * Was a reserve query requested? If so, query again instead
+ * of going into dormant status.
+ */
+ requestedQuery: boolean;
+
+ /**
+ * Time of the last successful status query.
+ */
+ lastSuccessfulStatusQuery: Timestamp | undefined;
+
+ /**
+ * Retry info. This field is present even if no retry is scheduled,
+ * because we need it to be present for the index on the object store
+ * to work.
+ */
+ retryInfo: RetryInfo;
+
+ /**
+ * Last error that happened in a reserve operation
+ * (either talking to the bank or the exchange).
+ */
+ lastError: TalerErrorDetails | undefined;
+}
+
+/**
+ * Auditor record as stored with currencies in the exchange database.
+ */
+export interface AuditorRecord {
+ /**
+ * Base url of the auditor.
+ */
+ baseUrl: string;
+
+ /**
+ * Public signing key of the auditor.
+ */
+ auditorPub: string;
+
+ /**
+ * Time when the auditing expires.
+ */
+ expirationStamp: number;
+}
+
+/**
+ * Exchange for currencies as stored in the wallet's currency
+ * information database.
+ */
+export interface ExchangeForCurrencyRecord {
+ /**
+ * FIXME: unused?
+ */
+ exchangeMasterPub: string;
+
+ /**
+ * Base URL of the exchange.
+ */
+ exchangeBaseUrl: string;
+}
+
+/**
+ * Information about a currency as displayed in the wallet's database.
+ */
+export interface CurrencyRecord {
+ /**
+ * Name of the currency.
+ */
+ name: string;
+
+ /**
+ * Number of fractional digits to show when rendering the currency.
+ */
+ fractionalDigits: number;
+
+ /**
+ * Auditors that the wallet trusts for this currency.
+ */
+ auditors: AuditorRecord[];
+
+ /**
+ * Exchanges that the wallet trusts for this currency.
+ */
+ exchanges: ExchangeForCurrencyRecord[];
+}
+
+/**
+ * Status of a denomination.
+ */
+export enum DenominationStatus {
+ /**
+ * Verification was delayed.
+ */
+ Unverified = "unverified",
+ /**
+ * Verified as valid.
+ */
+ VerifiedGood = "verified-good",
+ /**
+ * Verified as invalid.
+ */
+ VerifiedBad = "verified-bad",
+}
+
+/**
+ * Denomination record as stored in the wallet's database.
+ */
+export interface DenominationRecord {
+ /**
+ * Value of one coin of the denomination.
+ */
+ value: AmountJson;
+
+ /**
+ * The denomination public key.
+ */
+ denomPub: string;
+
+ /**
+ * Hash of the denomination public key.
+ * Stored in the database for faster lookups.
+ */
+ denomPubHash: string;
+
+ /**
+ * Fee for withdrawing.
+ */
+ feeWithdraw: AmountJson;
+
+ /**
+ * Fee for depositing.
+ */
+ feeDeposit: AmountJson;
+
+ /**
+ * Fee for refreshing.
+ */
+ feeRefresh: AmountJson;
+
+ /**
+ * Fee for refunding.
+ */
+ feeRefund: AmountJson;
+
+ /**
+ * Validity start date of the denomination.
+ */
+ stampStart: Timestamp;
+
+ /**
+ * Date after which the currency can't be withdrawn anymore.
+ */
+ stampExpireWithdraw: Timestamp;
+
+ /**
+ * Date after the denomination officially doesn't exist anymore.
+ */
+ stampExpireLegal: Timestamp;
+
+ /**
+ * Data after which coins of this denomination can't be deposited anymore.
+ */
+ stampExpireDeposit: Timestamp;
+
+ /**
+ * Signature by the exchange's master key over the denomination
+ * information.
+ */
+ masterSig: string;
+
+ /**
+ * Did we verify the signature on the denomination?
+ *
+ * FIXME: Rename to "verificationStatus"?
+ */
+ status: DenominationStatus;
+
+ /**
+ * Was this denomination still offered by the exchange the last time
+ * we checked?
+ * Only false when the exchange redacts a previously published denomination.
+ */
+ isOffered: boolean;
+
+ /**
+ * Did the exchange revoke the denomination?
+ * When this field is set to true in the database, the same transaction
+ * should also mark all affected coins as revoked.
+ */
+ isRevoked: boolean;
+
+ /**
+ * Base URL of the exchange.
+ */
+ exchangeBaseUrl: string;
+}
+
+/**
+ * Details about the exchange that we only know after
+ * querying /keys and /wire.
+ */
+export interface ExchangeDetails {
+ /**
+ * Master public key of the exchange.
+ */
+ masterPublicKey: string;
+
+ /**
+ * Auditors (partially) auditing the exchange.
+ */
+ auditors: Auditor[];
+
+ /**
+ * Currency that the exchange offers.
+ */
+ currency: string;
+
+ /**
+ * Last observed protocol version.
+ */
+ protocolVersion: string;
+
+ reserveClosingDelay: Duration;
+
+ /**
+ * Signing keys we got from the exchange, can also contain
+ * older signing keys that are not returned by /keys anymore.
+ */
+ signingKeys: ExchangeSignKeyJson[];
+
+ /**
+ * Timestamp for last update.
+ */
+ lastUpdateTime: Timestamp;
+
+ /**
+ * When should we next update the information about the exchange?
+ */
+ nextUpdateTime: Timestamp;
+}
+
+export enum ExchangeUpdateStatus {
+ FetchKeys = "fetch-keys",
+ FetchWire = "fetch-wire",
+ FetchTerms = "fetch-terms",
+ FinalizeUpdate = "finalize-update",
+ Finished = "finished",
+}
+
+export interface ExchangeBankAccount {
+ payto_uri: string;
+ master_sig: string;
+}
+
+export interface ExchangeWireInfo {
+ feesForType: { [wireMethod: string]: WireFee[] };
+ accounts: ExchangeBankAccount[];
+}
+
+export enum ExchangeUpdateReason {
+ Initial = "initial",
+ Forced = "forced",
+ Scheduled = "scheduled",
+}
+
+/**
+ * Exchange record as stored in the wallet's database.
+ */
+export interface ExchangeRecord {
+ /**
+ * Base url of the exchange.
+ */
+ baseUrl: string;
+
+ /**
+ * Did we finish adding the exchange?
+ */
+ addComplete: boolean;
+
+ /**
+ * Is this a permanent or temporary exchange record?
+ */
+ permanent: boolean;
+
+ /**
+ * Was the exchange added as a built-in exchange?
+ */
+ builtIn: boolean;
+
+ /**
+ * Details, once known.
+ */
+ details: ExchangeDetails | undefined;
+
+ /**
+ * Mapping from wire method type to the wire fee.
+ */
+ wireInfo: ExchangeWireInfo | undefined;
+
+ /**
+ * Terms of service text or undefined if not downloaded yet.
+ *
+ * This is just used as a cache of the last downloaded ToS.
+ */
+ termsOfServiceText: string | undefined;
+
+ /**
+ * ETag for last terms of service download.
+ */
+ termsOfServiceLastEtag: string | undefined;
+
+ /**
+ * ETag for last terms of service download.
+ */
+ termsOfServiceAcceptedEtag: string | undefined;
+
+ /**
+ * Time when the update to the exchange has been started or
+ * undefined if no update is in progress.
+ */
+ updateStarted: Timestamp | undefined;
+
+ /**
+ * Status of updating the info about the exchange.
+ */
+ updateStatus: ExchangeUpdateStatus;
+
+ updateReason?: ExchangeUpdateReason;
+
+ lastError?: TalerErrorDetails;
+
+ /**
+ * Retry status for fetching updated information about the exchange.
+ */
+ retryInfo: RetryInfo;
+
+ /**
+ * Next time that we should check if coins need to be refreshed.
+ *
+ * Updated whenever the exchange's denominations are updated or when
+ * the refresh check has been done.
+ */
+ nextRefreshCheck?: Timestamp;
+}
+
+/**
+ * A coin that isn't yet signed by an exchange.
+ */
+export interface PlanchetRecord {
+ /**
+ * Public key of the coin.
+ */
+ coinPub: string;
+
+ /**
+ * Private key of the coin.
+ */
+ coinPriv: string;
+
+ /**
+ * Withdrawal group that this planchet belongs to
+ * (or the empty string).
+ */
+ withdrawalGroupId: string;
+
+ /**
+ * Index within the withdrawal group (or -1).
+ */
+ coinIdx: number;
+
+ withdrawalDone: boolean;
+
+ lastError: TalerErrorDetails | undefined;
+
+ /**
+ * Public key of the reserve that this planchet
+ * is being withdrawn from.
+ *
+ * Can be the empty string (non-null/undefined for DB indexing)
+ * if this is a tipping reserve.
+ */
+ reservePub: string;
+
+ denomPubHash: string;
+
+ denomPub: string;
+
+ blindingKey: string;
+
+ withdrawSig: string;
+
+ coinEv: string;
+
+ coinEvHash: string;
+
+ coinValue: AmountJson;
+
+ isFromTip: boolean;
+}
+
+/**
+ * Planchet for a coin during refrehs.
+ */
+export interface RefreshPlanchet {
+ /**
+ * Public key for the coin.
+ */
+ publicKey: string;
+
+ /**
+ * Private key for the coin.
+ */
+ privateKey: string;
+
+ /**
+ * Blinded public key.
+ */
+ coinEv: string;
+
+ coinEvHash: string;
+
+ /**
+ * Blinding key used.
+ */
+ blindingKey: string;
+}
+
+/**
+ * Status of a coin.
+ */
+export enum CoinStatus {
+ /**
+ * Withdrawn and never shown to anybody.
+ */
+ Fresh = "fresh",
+ /**
+ * A coin that has been spent and refreshed.
+ */
+ Dormant = "dormant",
+}
+
+export enum CoinSourceType {
+ Withdraw = "withdraw",
+ Refresh = "refresh",
+ Tip = "tip",
+}
+
+export interface WithdrawCoinSource {
+ type: CoinSourceType.Withdraw;
+
+ /**
+ * Can be the empty string for orphaned coins.
+ */
+ withdrawalGroupId: string;
+
+ /**
+ * Index of the coin in the withdrawal session.
+ */
+ coinIndex: number;
+
+ /**
+ * Reserve public key for the reserve we got this coin from.
+ */
+ reservePub: string;
+}
+
+export interface RefreshCoinSource {
+ type: CoinSourceType.Refresh;
+ oldCoinPub: string;
+}
+
+export interface TipCoinSource {
+ type: CoinSourceType.Tip;
+ walletTipId: string;
+ coinIndex: number;
+}
+
+export type CoinSource = WithdrawCoinSource | RefreshCoinSource | TipCoinSource;
+
+/**
+ * CoinRecord as stored in the "coins" data store
+ * of the wallet database.
+ */
+export interface CoinRecord {
+ /**
+ * Where did the coin come from? Used for recouping coins.
+ */
+ coinSource: CoinSource;
+
+ /**
+ * Public key of the coin.
+ */
+ coinPub: string;
+
+ /**
+ * Private key to authorize operations on the coin.
+ */
+ coinPriv: string;
+
+ /**
+ * Key used by the exchange used to sign the coin.
+ */
+ denomPub: string;
+
+ /**
+ * Hash of the public key that signs the coin.
+ */
+ denomPubHash: string;
+
+ /**
+ * Unblinded signature by the exchange.
+ */
+ denomSig: string;
+
+ /**
+ * Amount that's left on the coin.
+ */
+ currentAmount: AmountJson;
+
+ /**
+ * Base URL that identifies the exchange from which we got the
+ * coin.
+ */
+ exchangeBaseUrl: string;
+
+ /**
+ * The coin is currently suspended, and will not be used for payments.
+ */
+ suspended: boolean;
+
+ /**
+ * Blinding key used when withdrawing the coin.
+ * Potentionally used again during payback.
+ */
+ blindingKey: string;
+
+ /**
+ * Hash of the coin envelope.
+ *
+ * Stored here for indexing purposes, so that when looking at a
+ * reserve history, we can quickly find the coin for a withdrawal transaction.
+ */
+ coinEvHash: string;
+
+ /**
+ * Status of the coin.
+ */
+ status: CoinStatus;
+}
+
+export enum ProposalStatus {
+ /**
+ * Not downloaded yet.
+ */
+ DOWNLOADING = "downloading",
+ /**
+ * Proposal downloaded, but the user needs to accept/reject it.
+ */
+ PROPOSED = "proposed",
+ /**
+ * The user has accepted the proposal.
+ */
+ ACCEPTED = "accepted",
+ /**
+ * The user has rejected the proposal.
+ */
+ REFUSED = "refused",
+ /**
+ * Downloading or processing the proposal has failed permanently.
+ */
+ PERMANENTLY_FAILED = "permanently-failed",
+ /**
+ * Downloaded proposal was detected as a re-purchase.
+ */
+ REPURCHASE = "repurchase",
+}
+
+export interface ProposalDownload {
+ /**
+ * The contract that was offered by the merchant.
+ */
+ contractTermsRaw: any;
+
+ contractData: WalletContractData;
+}
+
+/**
+ * Record for a downloaded order, stored in the wallet's database.
+ */
+export interface ProposalRecord {
+ orderId: string;
+
+ merchantBaseUrl: string;
+
+ /**
+ * Downloaded data from the merchant.
+ */
+ download: ProposalDownload | undefined;
+
+ /**
+ * Unique ID when the order is stored in the wallet DB.
+ */
+ proposalId: string;
+
+ /**
+ * Timestamp (in ms) of when the record
+ * was created.
+ */
+ timestamp: Timestamp;
+
+ /**
+ * Private key for the nonce.
+ */
+ noncePriv: string;
+
+ /**
+ * Public key for the nonce.
+ */
+ noncePub: string;
+
+ claimToken: string | undefined;
+
+ proposalStatus: ProposalStatus;
+
+ repurchaseProposalId: string | undefined;
+
+ /**
+ * Session ID we got when downloading the contract.
+ */
+ downloadSessionId?: string;
+
+ /**
+ * Retry info, even present when the operation isn't active to allow indexing
+ * on the next retry timestamp.
+ */
+ retryInfo: RetryInfo;
+
+ lastError: TalerErrorDetails | undefined;
+}
+
+/**
+ * Status of a tip we got from a merchant.
+ */
+export interface TipRecord {
+ lastError: TalerErrorDetails | undefined;
+
+ /**
+ * Has the user accepted the tip? Only after the tip has been accepted coins
+ * withdrawn from the tip may be used.
+ */
+ acceptedTimestamp: Timestamp | undefined;
+
+ /**
+ * The tipped amount.
+ */
+ tipAmountRaw: AmountJson;
+
+ tipAmountEffective: AmountJson;
+
+ /**
+ * Timestamp, the tip can't be picked up anymore after this deadline.
+ */
+ tipExpiration: Timestamp;
+
+ /**
+ * The exchange that will sign our coins, chosen by the merchant.
+ */
+ exchangeBaseUrl: string;
+
+ /**
+ * Base URL of the merchant that is giving us the tip.
+ */
+ merchantBaseUrl: string;
+
+ /**
+ * Denomination selection made by the wallet for picking up
+ * this tip.
+ */
+ denomsSel: DenomSelectionState;
+
+ /**
+ * Tip ID chosen by the wallet.
+ */
+ walletTipId: string;
+
+ /**
+ * Secret seed used to derive planchets for this tip.
+ */
+ secretSeed: string;
+
+ /**
+ * The merchant's identifier for this tip.
+ */
+ merchantTipId: string;
+
+ createdTimestamp: Timestamp;
+
+ /**
+ * Timestamp for when the wallet finished picking up the tip
+ * from the merchant.
+ */
+ pickedUpTimestamp: Timestamp | undefined;
+
+ /**
+ * Retry info, even present when the operation isn't active to allow indexing
+ * on the next retry timestamp.
+ */
+ retryInfo: RetryInfo;
+}
+
+export interface RefreshGroupRecord {
+ /**
+ * Retry info, even present when the operation isn't active to allow indexing
+ * on the next retry timestamp.
+ */
+ retryInfo: RetryInfo;
+
+ lastError: TalerErrorDetails | undefined;
+
+ lastErrorPerCoin: { [coinIndex: number]: TalerErrorDetails };
+
+ refreshGroupId: string;
+
+ reason: RefreshReason;
+
+ oldCoinPubs: string[];
+
+ refreshSessionPerCoin: (RefreshSessionRecord | undefined)[];
+
+ inputPerCoin: AmountJson[];
+
+ estimatedOutputPerCoin: AmountJson[];
+
+ /**
+ * Flag for each coin whether refreshing finished.
+ * If a coin can't be refreshed (remaining value too small),
+ * it will be marked as finished, but no refresh session will
+ * be created.
+ */
+ finishedPerCoin: boolean[];
+
+ timestampCreated: Timestamp;
+
+ /**
+ * Timestamp when the refresh session finished.
+ */
+ timestampFinished: Timestamp | undefined;
+}
+
+/**
+ * Ongoing refresh
+ */
+export interface RefreshSessionRecord {
+ /**
+ * 512-bit secret that can be used to derive
+ * the other cryptographic material for the refresh session.
+ *
+ * FIXME: We currently store the derived material, but
+ * should always derive it.
+ */
+ sessionSecretSeed: string;
+
+ /**
+ * Sum of the value of denominations we want
+ * to withdraw in this session, without fees.
+ */
+ amountRefreshOutput: AmountJson;
+
+ /**
+ * Hashed denominations of the newly requested coins.
+ */
+ newDenoms: {
+ denomPubHash: string;
+ count: number;
+ }[];
+
+ /**
+ * The no-reveal-index after we've done the melting.
+ */
+ norevealIndex?: number;
+}
+
+/**
+ * Wire fee for one wire method as stored in the
+ * wallet's database.
+ */
+export interface WireFee {
+ /**
+ * Fee for wire transfers.
+ */
+ wireFee: AmountJson;
+
+ /**
+ * Fees to close and refund a reserve.
+ */
+ closingFee: AmountJson;
+
+ /**
+ * Start date of the fee.
+ */
+ startStamp: Timestamp;
+
+ /**
+ * End date of the fee.
+ */
+ endStamp: Timestamp;
+
+ /**
+ * Signature made by the exchange master key.
+ */
+ sig: string;
+}
+
+/**
+ * Record to store information about a refund event.
+ *
+ * All information about a refund is stored with the purchase,
+ * this event is just for the history.
+ *
+ * The event is only present for completed refunds.
+ */
+export interface RefundEventRecord {
+ timestamp: Timestamp;
+ merchantExecutionTimestamp: Timestamp;
+ refundGroupId: string;
+ proposalId: string;
+}
+
+export enum RefundState {
+ Failed = "failed",
+ Applied = "applied",
+ Pending = "pending",
+}
+
+/**
+ * State of one refund from the merchant, maintained by the wallet.
+ */
+export type WalletRefundItem =
+ | WalletRefundFailedItem
+ | WalletRefundPendingItem
+ | WalletRefundAppliedItem;
+
+export interface WalletRefundItemCommon {
+ // Execution time as claimed by the merchant
+ executionTime: Timestamp;
+
+ /**
+ * Time when the wallet became aware of the refund.
+ */
+ obtainedTime: Timestamp;
+
+ refundAmount: AmountJson;
+
+ refundFee: AmountJson;
+
+ /**
+ * Upper bound on the refresh cost incurred by
+ * applying this refund.
+ *
+ * Might be lower in practice when two refunds on the same
+ * coin are refreshed in the same refresh operation.
+ */
+ totalRefreshCostBound: AmountJson;
+
+ coinPub: string;
+
+ rtransactionId: number;
+}
+
+/**
+ * Failed refund, either because the merchant did
+ * something wrong or it expired.
+ */
+export interface WalletRefundFailedItem extends WalletRefundItemCommon {
+ type: RefundState.Failed;
+}
+
+export interface WalletRefundPendingItem extends WalletRefundItemCommon {
+ type: RefundState.Pending;
+}
+
+export interface WalletRefundAppliedItem extends WalletRefundItemCommon {
+ type: RefundState.Applied;
+}
+
+export enum RefundReason {
+ /**
+ * Normal refund given by the merchant.
+ */
+ NormalRefund = "normal-refund",
+ /**
+ * Refund from an aborted payment.
+ */
+ AbortRefund = "abort-pay-refund",
+}
+
+/**
+ * Record stored for every time we successfully submitted
+ * a payment to the merchant (both first time and re-play).
+ */
+export interface PayEventRecord {
+ proposalId: string;
+ sessionId: string | undefined;
+ isReplay: boolean;
+ timestamp: Timestamp;
+}
+
+export interface ExchangeUpdatedEventRecord {
+ exchangeBaseUrl: string;
+ timestamp: Timestamp;
+}
+
+export interface ReserveUpdatedEventRecord {
+ amountReserveBalance: string;
+ amountExpected: string;
+ reservePub: string;
+ timestamp: Timestamp;
+ reserveUpdateId: string;
+ newHistoryTransactions: ReserveTransaction[];
+}
+
+export interface AllowedAuditorInfo {
+ auditorBaseUrl: string;
+ auditorPub: string;
+}
+
+export interface AllowedExchangeInfo {
+ exchangeBaseUrl: string;
+ exchangePub: string;
+}
+
+/**
+ * Data extracted from the contract terms that is relevant for payment
+ * processing in the wallet.
+ */
+export interface WalletContractData {
+ products?: Product[];
+ summaryI18n: { [lang_tag: string]: string } | undefined;
+
+ /**
+ * Fulfillment URL, or the empty string if the order has no fulfillment URL.
+ *
+ * Stored as a non-nullable string as we use this field for IndexedDB indexing.
+ */
+ fulfillmentUrl: string;
+
+ contractTermsHash: string;
+ fulfillmentMessage?: string;
+ fulfillmentMessageI18n?: InternationalizedString;
+ merchantSig: string;
+ merchantPub: string;
+ merchant: MerchantInfo;
+ amount: AmountJson;
+ orderId: string;
+ merchantBaseUrl: string;
+ summary: string;
+ autoRefund: Duration | undefined;
+ maxWireFee: AmountJson;
+ wireFeeAmortization: number;
+ payDeadline: Timestamp;
+ refundDeadline: Timestamp;
+ allowedAuditors: AllowedAuditorInfo[];
+ allowedExchanges: AllowedExchangeInfo[];
+ timestamp: Timestamp;
+ wireMethod: string;
+ wireInfoHash: string;
+ maxDepositFee: AmountJson;
+}
+
+
+export enum AbortStatus {
+ None = "none",
+ AbortRefund = "abort-refund",
+ AbortFinished = "abort-finished",
+}
+
+/**
+ * Record that stores status information about one purchase, starting from when
+ * the customer accepts a proposal. Includes refund status if applicable.
+ */
+export interface PurchaseRecord {
+ /**
+ * Proposal ID for this purchase. Uniquely identifies the
+ * purchase and the proposal.
+ */
+ proposalId: string;
+
+ /**
+ * Private key for the nonce.
+ */
+ noncePriv: string;
+
+ /**
+ * Public key for the nonce.
+ */
+ noncePub: string;
+
+ /**
+ * Downloaded and parsed proposal data.
+ */
+ download: ProposalDownload;
+
+ /**
+ * Deposit permissions, available once the user has accepted the payment.
+ *
+ * This value is cached and derived from payCoinSelection.
+ */
+ coinDepositPermissions: CoinDepositPermission[] | undefined;
+
+ payCoinSelection: PayCoinSelection;
+
+ /**
+ * Pending removals from pay coin selection.
+ *
+ * Used when a the pay coin selection needs to be changed
+ * because a coin became known as double-spent or invalid,
+ * but a new coin selection can't immediately be done, as
+ * there is not enough balance (e.g. when waiting for a refresh).
+ */
+ pendingRemovedCoinPubs?: string[];
+
+ totalPayCost: AmountJson;
+
+ /**
+ * Timestamp of the first time that sending a payment to the merchant
+ * for this purchase was successful.
+ */
+ timestampFirstSuccessfulPay: Timestamp | undefined;
+
+ merchantPaySig: string | undefined;
+
+ /**
+ * When was the purchase made?
+ * Refers to the time that the user accepted.
+ */
+ timestampAccept: Timestamp;
+
+ /**
+ * Pending refunds for the purchase. A refund is pending
+ * when the merchant reports a transient error from the exchange.
+ */
+ refunds: { [refundKey: string]: WalletRefundItem };
+
+ /**
+ * When was the last refund made?
+ * Set to 0 if no refund was made on the purchase.
+ */
+ timestampLastRefundStatus: Timestamp | undefined;
+
+ /**
+ * Last session signature that we submitted to /pay (if any).
+ */
+ lastSessionId: string | undefined;
+
+ /**
+ * Set for the first payment, or on re-plays.
+ */
+ paymentSubmitPending: boolean;
+
+ /**
+ * Do we need to query the merchant for the refund status
+ * of the payment?
+ */
+ refundQueryRequested: boolean;
+
+ abortStatus: AbortStatus;
+
+ payRetryInfo: RetryInfo;
+
+ lastPayError: TalerErrorDetails | undefined;
+
+ /**
+ * Retry information for querying the refund status with the merchant.
+ */
+ refundStatusRetryInfo: RetryInfo;
+
+ /**
+ * Last error (or undefined) for querying the refund status with the merchant.
+ */
+ lastRefundStatusError: TalerErrorDetails | undefined;
+
+ /**
+ * Continue querying the refund status until this deadline has expired.
+ */
+ autoRefundDeadline: Timestamp | undefined;
+}
+
+/**
+ * Configuration key/value entries to configure
+ * the wallet.
+ */
+export interface ConfigRecord<T> {
+ key: string;
+ value: T;
+}
+
+/**
+ * FIXME: Eliminate this in favor of DenomSelectionState.
+ */
+export interface DenominationSelectionInfo {
+ totalCoinValue: AmountJson;
+ totalWithdrawCost: AmountJson;
+ selectedDenoms: {
+ /**
+ * How many times do we withdraw this denomination?
+ */
+ count: number;
+ denom: DenominationRecord;
+ }[];
+}
+
+/**
+ * Selected denominations withn some extra info.
+ */
+export interface DenomSelectionState {
+ totalCoinValue: AmountJson;
+ totalWithdrawCost: AmountJson;
+ selectedDenoms: {
+ denomPubHash: string;
+ count: number;
+ }[];
+}
+
+/**
+ * Group of withdrawal operations that need to be executed.
+ * (Either for a normal withdrawal or from a tip.)
+ *
+ * The withdrawal group record is only created after we know
+ * the coin selection we want to withdraw.
+ */
+export interface WithdrawalGroupRecord {
+ withdrawalGroupId: string;
+
+ /**
+ * Secret seed used to derive planchets.
+ */
+ secretSeed: string;
+
+ reservePub: string;
+
+ exchangeBaseUrl: string;
+
+ /**
+ * When was the withdrawal operation started started?
+ * Timestamp in milliseconds.
+ */
+ timestampStart: Timestamp;
+
+ /**
+ * When was the withdrawal operation completed?
+ */
+ timestampFinish?: Timestamp;
+
+ /**
+ * Amount including fees (i.e. the amount subtracted from the
+ * reserve to withdraw all coins in this withdrawal session).
+ */
+ rawWithdrawalAmount: AmountJson;
+
+ denomsSel: DenomSelectionState;
+
+ /**
+ * Retry info, always present even on completed operations so that indexing works.
+ */
+ retryInfo: RetryInfo;
+
+ lastError: TalerErrorDetails | undefined;
+}
+
+export interface BankWithdrawUriRecord {
+ /**
+ * The withdraw URI we got from the bank.
+ */
+ talerWithdrawUri: string;
+
+ /**
+ * Reserve that was created for the withdraw URI.
+ */
+ reservePub: string;
+}
+
+/**
+ * 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.
+ */
+export interface RecoupGroupRecord {
+ /**
+ * Unique identifier for the recoup group record.
+ */
+ recoupGroupId: string;
+
+ timestampStarted: Timestamp;
+
+ timestampFinished: Timestamp | undefined;
+
+ /**
+ * Public keys that identify the coins being recouped
+ * as part of this session.
+ *
+ * (Structured like this to enable multiEntry indexing in IndexedDB.)
+ */
+ coinPubs: string[];
+
+ /**
+ * Array of flags to indicate whether the recoup finished on each individual coin.
+ */
+ recoupFinishedPerCoin: boolean[];
+
+ /**
+ * We store old amount (i.e. before recoup) of recouped coins here,
+ * as the balance of a recouped coin is set to zero when the
+ * recoup group is created.
+ */
+ oldAmountPerCoin: AmountJson[];
+
+ /**
+ * Public keys of coins that should be scheduled for refreshing
+ * after all individual recoups are done.
+ */
+ scheduleRefreshCoins: string[];
+
+ /**
+ * Retry info.
+ */
+ retryInfo: RetryInfo;
+
+ /**
+ * Last error that occured, if any.
+ */
+ lastError: TalerErrorDetails | undefined;
+}
+
+export enum ImportPayloadType {
+ CoreSchema = "core-schema",
+}
+
+export enum BackupProviderStatus {
+ PaymentRequired = "payment-required",
+ Ready = "ready",
+}
+
+export interface BackupProviderRecord {
+ baseUrl: string;
+
+ /**
+ * Terms of service of the provider.
+ * Might be unavailable in the DB in certain situations
+ * (such as loading a recovery document).
+ */
+ terms?: {
+ supportedProtocolVersion: string;
+ annualFee: AmountString;
+ storageLimitInMegabytes: number;
+ };
+
+ active: boolean;
+
+ /**
+ * Hash of the last encrypted backup that we already merged
+ * or successfully uploaded ourselves.
+ */
+ lastBackupHash?: string;
+
+ /**
+ * Clock of the last backup that we already
+ * merged.
+ */
+ lastBackupClock?: number;
+
+ lastBackupTimestamp?: Timestamp;
+
+ /**
+ * Proposal that we're currently trying to pay for.
+ *
+ * (Also included in paymentProposalIds.)
+ */
+ currentPaymentProposalId?: string;
+
+ /**
+ * Proposals that were used to pay (or attempt to pay) the provider.
+ *
+ * Stored to display a history of payments to the provider, and
+ * to make sure that the wallet isn't overpaying.
+ */
+ paymentProposalIds: string[];
+
+ /**
+ * Next scheduled backup.
+ */
+ nextBackupTimestamp?: Timestamp;
+
+ /**
+ * Retry info.
+ */
+ retryInfo: RetryInfo;
+
+ /**
+ * Last error that occured, if any.
+ */
+ lastError: TalerErrorDetails | undefined;
+}
+
+/**
+ * Group of deposits made by the wallet.
+ */
+export interface DepositGroupRecord {
+ depositGroupId: string;
+
+ merchantPub: string;
+ merchantPriv: string;
+
+ noncePriv: string;
+ noncePub: string;
+
+ /**
+ * Wire information used by all deposits in this
+ * deposit group.
+ */
+ wire: {
+ payto_uri: string;
+ salt: string;
+ };
+
+ /**
+ * Verbatim contract terms.
+ */
+ contractTermsRaw: ContractTerms;
+
+ contractTermsHash: string;
+
+ payCoinSelection: PayCoinSelection;
+
+ totalPayCost: AmountJson;
+
+ effectiveDepositAmount: AmountJson;
+
+ depositedPerCoin: boolean[];
+
+ timestampCreated: Timestamp;
+
+ timestampFinished: Timestamp | undefined;
+
+ lastError: TalerErrorDetails | undefined;
+
+ /**
+ * Retry info.
+ */
+ retryInfo: RetryInfo;
+}
+
+/**
+ * Record for a deposits that the wallet observed
+ * as a result of double spending, but which is not
+ * present in the wallet's own database otherwise.
+ */
+export interface GhostDepositGroupRecord {
+ /**
+ * When multiple deposits for the same contract terms hash
+ * have a different timestamp, we choose the earliest one.
+ */
+ timestamp: Timestamp;
+
+ contractTermsHash: string;
+
+ deposits: {
+ coinPub: string;
+ amount: AmountString;
+ timestamp: Timestamp;
+ depositFee: AmountString;
+ merchantPub: string;
+ coinSig: string;
+ wireHash: string;
+ }[];
+}
+
+class ExchangesStore extends Store<"exchanges", ExchangeRecord> {
+ constructor() {
+ super("exchanges", { keyPath: "baseUrl" });
+ }
+}
+
+class CoinsStore extends Store<"coins", CoinRecord> {
+ constructor() {
+ super("coins", { keyPath: "coinPub" });
+ }
+
+ exchangeBaseUrlIndex = new Index<
+ "coins",
+ "exchangeBaseUrl",
+ string,
+ CoinRecord
+ >(this, "exchangeBaseUrl", "exchangeBaseUrl");
+
+ denomPubHashIndex = new Index<
+ "coins",
+ "denomPubHashIndex",
+ string,
+ CoinRecord
+ >(this, "denomPubHashIndex", "denomPubHash");
+
+ coinEvHashIndex = new Index<"coins", "coinEvHashIndex", string, CoinRecord>(
+ this,
+ "coinEvHashIndex",
+ "coinEvHash",
+ );
+}
+
+class ProposalsStore extends Store<"proposals", ProposalRecord> {
+ constructor() {
+ super("proposals", { keyPath: "proposalId" });
+ }
+ urlAndOrderIdIndex = new Index<
+ "proposals",
+ "urlIndex",
+ string,
+ ProposalRecord
+ >(this, "urlIndex", ["merchantBaseUrl", "orderId"]);
+}
+
+class PurchasesStore extends Store<"purchases", PurchaseRecord> {
+ constructor() {
+ super("purchases", { keyPath: "proposalId" });
+ }
+
+ fulfillmentUrlIndex = new Index<
+ "purchases",
+ "fulfillmentUrlIndex",
+ string,
+ PurchaseRecord
+ >(this, "fulfillmentUrlIndex", "download.contractData.fulfillmentUrl");
+
+ orderIdIndex = new Index<"purchases", "orderIdIndex", string, PurchaseRecord>(
+ this,
+ "orderIdIndex",
+ ["download.contractData.merchantBaseUrl", "download.contractData.orderId"],
+ );
+}
+
+class DenominationsStore extends Store<"denominations", DenominationRecord> {
+ constructor() {
+ // cast needed because of bug in type annotations
+ super("denominations", {
+ keyPath: (["exchangeBaseUrl", "denomPubHash"] as any) as IDBKeyPath,
+ });
+ }
+ exchangeBaseUrlIndex = new Index<
+ "denominations",
+ "exchangeBaseUrlIndex",
+ string,
+ DenominationRecord
+ >(this, "exchangeBaseUrlIndex", "exchangeBaseUrl");
+}
+
+class CurrenciesStore extends Store<"currencies", CurrencyRecord> {
+ constructor() {
+ super("currencies", { keyPath: "name" });
+ }
+}
+
+class ConfigStore extends Store<"config", ConfigRecord<any>> {
+ constructor() {
+ super("config", { keyPath: "key" });
+ }
+}
+
+class ReservesStore extends Store<"reserves", ReserveRecord> {
+ constructor() {
+ super("reserves", { keyPath: "reservePub" });
+ }
+}
+
+class TipsStore extends Store<"tips", TipRecord> {
+ constructor() {
+ super("tips", { keyPath: "walletTipId" });
+ }
+ // Added in version 2
+ byMerchantTipIdAndBaseUrl = new Index<
+ "tips",
+ "tipsByMerchantTipIdAndOriginIndex",
+ [string, string],
+ TipRecord
+ >(this, "tipsByMerchantTipIdAndOriginIndex", [
+ "merchantTipId",
+ "merchantBaseUrl",
+ ]);
+}
+
+class WithdrawalGroupsStore extends Store<
+ "withdrawals",
+ WithdrawalGroupRecord
+> {
+ constructor() {
+ super("withdrawals", { keyPath: "withdrawalGroupId" });
+ }
+ byReservePub = new Index<
+ "withdrawals",
+ "withdrawalsByReserveIndex",
+ string,
+ WithdrawalGroupRecord
+ >(this, "withdrawalsByReserveIndex", "reservePub");
+}
+
+class PlanchetsStore extends Store<"planchets", PlanchetRecord> {
+ constructor() {
+ super("planchets", { keyPath: "coinPub" });
+ }
+ byGroupAndIndex = new Index<
+ "planchets",
+ "withdrawalGroupAndCoinIdxIndex",
+ string,
+ PlanchetRecord
+ >(this, "withdrawalGroupAndCoinIdxIndex", ["withdrawalGroupId", "coinIdx"]);
+ byGroup = new Index<
+ "planchets",
+ "withdrawalGroupIndex",
+ string,
+ PlanchetRecord
+ >(this, "withdrawalGroupIndex", "withdrawalGroupId");
+
+ coinEvHashIndex = new Index<
+ "planchets",
+ "coinEvHashIndex",
+ string,
+ PlanchetRecord
+ >(this, "coinEvHashIndex", "coinEvHash");
+}
+
+/**
+ * This store is effectively a materialized index for
+ * reserve records that are for a bank-integrated withdrawal.
+ */
+class BankWithdrawUrisStore extends Store<
+ "bankWithdrawUris",
+ BankWithdrawUriRecord
+> {
+ constructor() {
+ super("bankWithdrawUris", { keyPath: "talerWithdrawUri" });
+ }
+}
+
+/**
+ */
+class BackupProvidersStore extends Store<
+ "backupProviders",
+ BackupProviderRecord
+> {
+ constructor() {
+ super("backupProviders", { keyPath: "baseUrl" });
+ }
+}
+
+class DepositGroupsStore extends Store<"depositGroups", DepositGroupRecord> {
+ constructor() {
+ super("depositGroups", { keyPath: "depositGroupId" });
+ }
+}
+
+/**
+ * The stores and indices for the wallet database.
+ */
+export const Stores = {
+ coins: new CoinsStore(),
+ config: new ConfigStore(),
+ currencies: new CurrenciesStore(),
+ denominations: new DenominationsStore(),
+ exchanges: new ExchangesStore(),
+ proposals: new ProposalsStore(),
+ refreshGroups: new Store<"refreshGroups", RefreshGroupRecord>(
+ "refreshGroups",
+ {
+ keyPath: "refreshGroupId",
+ },
+ ),
+ recoupGroups: new Store<"recoupGroups", RecoupGroupRecord>("recoupGroups", {
+ keyPath: "recoupGroupId",
+ }),
+ reserves: new ReservesStore(),
+ purchases: new PurchasesStore(),
+ tips: new TipsStore(),
+ withdrawalGroups: new WithdrawalGroupsStore(),
+ planchets: new PlanchetsStore(),
+ bankWithdrawUris: new BankWithdrawUrisStore(),
+ backupProviders: new BackupProvidersStore(),
+ depositGroups: new DepositGroupsStore(),
+ ghostDepositGroups: new Store<"ghostDepositGroups", GhostDepositGroupRecord>(
+ "ghostDepositGroups",
+ {
+ keyPath: "contractTermsHash",
+ },
+ ),
+};
+
+export class MetaConfigStore extends Store<"metaConfig", ConfigRecord<any>> {
+ constructor() {
+ super("metaConfig", { keyPath: "key" });
+ }
+}
+
+export const MetaStores = {
+ metaConfig: new MetaConfigStore(),
+};
diff --git a/packages/taler-wallet-core/src/headless/NodeHttpLib.ts b/packages/taler-wallet-core/src/headless/NodeHttpLib.ts
index dc649a65..74672cd3 100644
--- a/packages/taler-wallet-core/src/headless/NodeHttpLib.ts
+++ b/packages/taler-wallet-core/src/headless/NodeHttpLib.ts
@@ -28,11 +28,10 @@ import {
import { RequestThrottler } from "../util/RequestThrottler";
import Axios, { AxiosResponse } from "axios";
import { OperationFailedError, makeErrorDetails } from "../operations/errors";
-import { TalerErrorCode } from "../TalerErrorCode";
import { URL } from "../util/url";
import { Logger } from "../util/logging";
import { bytesToString } from "../crypto/talerCrypto";
-import { j2s } from "../util/helpers";
+import { TalerErrorCode } from "@gnu-taler/taler-util";
const logger = new Logger("NodeHttpLib.ts");
diff --git a/packages/taler-wallet-core/src/headless/helpers.ts b/packages/taler-wallet-core/src/headless/helpers.ts
index ef97bc48..5007a65a 100644
--- a/packages/taler-wallet-core/src/headless/helpers.ts
+++ b/packages/taler-wallet-core/src/headless/helpers.ts
@@ -23,18 +23,20 @@
* Imports.
*/
import { Wallet } from "../wallet";
-import { MemoryBackend, BridgeIDBFactory, shimIndexedDB } from "@gnu-taler/idb-bridge";
+import {
+ MemoryBackend,
+ BridgeIDBFactory,
+ shimIndexedDB,
+} from "@gnu-taler/idb-bridge";
import { openTalerDatabase } from "../db";
import { HttpRequestLibrary } from "../util/http";
import fs from "fs";
import { NodeThreadCryptoWorkerFactory } from "../crypto/workers/nodeThreadWorker";
-import { WalletNotification } from "../types/notifications";
-import { Database } from "../util/query";
import { NodeHttpLib } from "./NodeHttpLib";
import { Logger } from "../util/logging";
import { SynchronousCryptoWorkerFactory } from "../crypto/workers/synchronousWorker";
-import type { IDBFactory } from "@gnu-taler/idb-bridge/lib/idbtypes";
-import { Stores } from "../types/dbTypes";
+import type { IDBFactory } from "@gnu-taler/idb-bridge";
+import { WalletNotification } from "@gnu-taler/taler-util";
const logger = new Logger("headless/helpers.ts");
diff --git a/packages/taler-wallet-core/src/index.ts b/packages/taler-wallet-core/src/index.ts
index c446a0ff..1faf4e5f 100644
--- a/packages/taler-wallet-core/src/index.ts
+++ b/packages/taler-wallet-core/src/index.ts
@@ -21,7 +21,6 @@
export { Wallet } from "./wallet";
// Errors
-export { TalerErrorCode } from "./TalerErrorCode";
export * from "./operations/errors";
// Utils for using the wallet under node
@@ -34,7 +33,6 @@ export {
export * from "./operations/versions";
export * from "./db";
-export * from "./types/dbTypes";
// Internationalization
export * from "./i18n";
@@ -47,22 +45,10 @@ export { CryptoWorkerFactory, CryptoApi } from "./crypto/workers/cryptoApi";
export * from "./crypto/talerCrypto";
// Util functionality
-export { Amounts, AmountJson } from "./util/amounts";
export { Logger } from "./util/logging";
-export { Configuration } from "./util/talerconfig";
export { URL } from "./util/url";
-export * from "./util/codec";
export * from "./util/promiseUtils";
export * from "./util/query";
export * from "./util/http";
-export * from "./util/payto";
-export * from "./util/testvectors";
-export * from "./util/taleruri";
-export * from "./util/time";
-// Types
-export * from "./types/talerTypes";
-export * from "./types/walletTypes";
-export * from "./types/notifications";
-export * from "./types/transactionsTypes";
-export * from "./types/pendingTypes";
+export * from "./pending-types"; \ No newline at end of file
diff --git a/packages/taler-wallet-core/src/operations/backup/export.ts b/packages/taler-wallet-core/src/operations/backup/export.ts
index a32aec39..c6e24289 100644
--- a/packages/taler-wallet-core/src/operations/backup/export.ts
+++ b/packages/taler-wallet-core/src/operations/backup/export.ts
@@ -14,12 +14,14 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { Stores, Amounts, CoinSourceType, CoinStatus, RefundState, AbortStatus, ProposalStatus, getTimestampNow, encodeCrock, stringToBytes, getRandomBytes } from "../..";
import { hash } from "../../crypto/primitives/nacl-fast";
-import { WalletBackupContentV1, BackupExchange, BackupCoin, BackupDenomination, BackupReserve, BackupPurchase, BackupProposal, BackupRefreshGroup, BackupBackupProvider, BackupTip, BackupRecoupGroup, BackupWithdrawalGroup, BackupBackupProviderTerms, BackupCoinSource, BackupCoinSourceType, BackupExchangeWireFee, BackupRefundItem, BackupRefundState, BackupProposalStatus, BackupRefreshOldCoin, BackupRefreshSession } from "../../types/backupTypes";
+import { WalletBackupContentV1, BackupExchange, BackupCoin, BackupDenomination, BackupReserve, BackupPurchase, BackupProposal, BackupRefreshGroup, BackupBackupProvider, BackupTip, BackupRecoupGroup, BackupWithdrawalGroup, BackupBackupProviderTerms, BackupCoinSource, BackupCoinSourceType, BackupExchangeWireFee, BackupRefundItem, BackupRefundState, BackupProposalStatus, BackupRefreshOldCoin, BackupRefreshSession } from "@gnu-taler/taler-util";
import { canonicalizeBaseUrl, canonicalJson } from "../../util/helpers";
import { InternalWalletState } from "../state";
import { provideBackupState, getWalletBackupState, WALLET_BACKUP_STATE_KEY } from "./state";
+import { Amounts, getTimestampNow } from "@gnu-taler/taler-util";
+import { Stores, CoinSourceType, CoinStatus, RefundState, AbortStatus, ProposalStatus } from "../../db.js";
+import { encodeCrock, stringToBytes, getRandomBytes } from "../../index.js";
/**
* Implementation of wallet backups (export/import/upload) and sync
diff --git a/packages/taler-wallet-core/src/operations/backup/import.ts b/packages/taler-wallet-core/src/operations/backup/import.ts
index 2e33c207..05b6da08 100644
--- a/packages/taler-wallet-core/src/operations/backup/import.ts
+++ b/packages/taler-wallet-core/src/operations/backup/import.ts
@@ -14,40 +14,9 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import {
- AbortStatus,
- AmountJson,
- Amounts,
- codecForContractTerms,
- CoinSource,
- CoinSourceType,
- CoinStatus,
- DenominationStatus,
- DenomSelectionState,
- ExchangeUpdateStatus,
- ExchangeWireInfo,
- getTimestampNow,
- ProposalDownload,
- ProposalStatus,
- RefreshReason,
- RefreshSessionRecord,
- RefundState,
- ReserveBankInfo,
- ReserveRecordStatus,
- Stores,
- TransactionHandle,
- WalletContractData,
- WalletRefundItem,
-} from "../..";
-import {
- BackupCoinSourceType,
- BackupDenomSel,
- BackupProposalStatus,
- BackupPurchase,
- BackupRefreshReason,
- BackupRefundState,
- WalletBackupContentV1,
-} from "../../types/backupTypes";
+import { BackupPurchase, AmountJson, Amounts, BackupDenomSel, WalletBackupContentV1, getTimestampNow, BackupCoinSourceType, BackupProposalStatus, codecForContractTerms, BackupRefundState, RefreshReason, BackupRefreshReason } from "@gnu-taler/taler-util";
+import { Stores, WalletContractData, DenomSelectionState, ExchangeWireInfo, ExchangeUpdateStatus, DenominationStatus, CoinSource, CoinSourceType, CoinStatus, ReserveBankInfo, ReserveRecordStatus, ProposalDownload, ProposalStatus, WalletRefundItem, RefundState, AbortStatus, RefreshSessionRecord } from "../../db.js";
+import { TransactionHandle } from "../../index.js";
import { PayCoinSelection } from "../../util/coinSelection";
import { j2s } from "../../util/helpers";
import { checkDbInvariant, checkLogicInvariant } from "../../util/invariants";
diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts
index edc5acc1..77a3219a 100644
--- a/packages/taler-wallet-core/src/operations/backup/index.ts
+++ b/packages/taler-wallet-core/src/operations/backup/index.ts
@@ -25,15 +25,14 @@
* Imports.
*/
import { InternalWalletState } from "../state";
-import { WalletBackupContentV1 } from "../../types/backupTypes";
+import { AmountString, BackupRecovery, codecForAmountString, WalletBackupContentV1 } from "@gnu-taler/taler-util";
import { TransactionHandle } from "../../util/query";
import {
BackupProviderRecord,
ConfigRecord,
Stores,
-} from "../../types/dbTypes";
+} from "../../db.js";
import { checkDbInvariant, checkLogicInvariant } from "../../util/invariants";
-import { codecForAmountString } from "../../util/amounts";
import {
bytesToString,
decodeCrock,
@@ -51,9 +50,8 @@ import {
getTimestampNow,
Timestamp,
timestampAddDuration,
-} from "../../util/time";
+} from "@gnu-taler/taler-util";
import { URL } from "../../util/url";
-import { AmountString } from "../../types/talerTypes";
import {
buildCodecForObject,
Codec,
@@ -61,7 +59,7 @@ import {
codecForNumber,
codecForString,
codecOptional,
-} from "../../util/codec";
+} from "@gnu-taler/taler-util";
import {
HttpResponseStatus,
readSuccessResponseJsonOrThrow,
@@ -77,7 +75,7 @@ import {
RecoveryLoadRequest,
RecoveryMergeStrategy,
TalerErrorDetails,
-} from "../../types/walletTypes";
+} from "@gnu-taler/taler-util";
import { CryptoApi } from "../../crypto/workers/cryptoApi";
import { secretbox, secretbox_open } from "../../crypto/primitives/nacl-fast";
import { checkPaymentByProposalId, confirmPay, preparePayForUri } from "../pay";
@@ -89,7 +87,6 @@ import {
getWalletBackupState,
WalletBackupConfState,
} from "./state";
-import { PaymentStatus } from "../../types/transactionsTypes";
const logger = new Logger("operations/backup.ts");
@@ -639,13 +636,6 @@ export async function getBackupInfo(
};
}
-export interface BackupRecovery {
- walletRootPriv: string;
- providers: {
- url: string;
- }[];
-}
-
/**
* Get information about the current state of wallet backups.
*/
diff --git a/packages/taler-wallet-core/src/operations/backup/state.ts b/packages/taler-wallet-core/src/operations/backup/state.ts
index 29c9402c..686c307a 100644
--- a/packages/taler-wallet-core/src/operations/backup/state.ts
+++ b/packages/taler-wallet-core/src/operations/backup/state.ts
@@ -14,14 +14,9 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import {
- ConfigRecord,
- encodeCrock,
- getRandomBytes,
- Stores,
- Timestamp,
- TransactionHandle,
-} from "../..";
+import { Timestamp } from "@gnu-taler/taler-util";
+import { ConfigRecord, Stores } from "../../db.js";
+import { getRandomBytes, encodeCrock, TransactionHandle } from "../../index.js";
import { checkDbInvariant } from "../../util/invariants";
import { InternalWalletState } from "../state";
diff --git a/packages/taler-wallet-core/src/operations/balance.ts b/packages/taler-wallet-core/src/operations/balance.ts
index b82e4c9d..741c46eb 100644
--- a/packages/taler-wallet-core/src/operations/balance.ts
+++ b/packages/taler-wallet-core/src/operations/balance.ts
@@ -17,13 +17,11 @@
/**
* Imports.
*/
-import { BalancesResponse } from "../types/walletTypes";
-import { TransactionHandle } from "../util/query";
-import { InternalWalletState } from "./state";
-import { Stores, CoinStatus } from "../types/dbTypes";
-import * as Amounts from "../util/amounts";
-import { AmountJson } from "../util/amounts";
+import { AmountJson, BalancesResponse, Amounts } from "@gnu-taler/taler-util";
+import { Stores, CoinStatus } from "../db.js";
+import { TransactionHandle } from "../index.js";
import { Logger } from "../util/logging";
+import { InternalWalletState } from "./state.js";
const logger = new Logger("withdraw.ts");
diff --git a/packages/taler-wallet-core/src/operations/deposits.ts b/packages/taler-wallet-core/src/operations/deposits.ts
index 53f2529b..6bb4f3d5 100644
--- a/packages/taler-wallet-core/src/operations/deposits.ts
+++ b/packages/taler-wallet-core/src/operations/deposits.ts
@@ -14,42 +14,37 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import {
- Amounts,
- CreateDepositGroupRequest,
- guardOperationException,
- Logger,
- NotificationType,
- TalerErrorDetails,
-} from "..";
import { kdf } from "../crypto/primitives/kdf";
import {
encodeCrock,
getRandomBytes,
stringToBytes,
} from "../crypto/talerCrypto";
-import { DepositGroupRecord, Stores } from "../types/dbTypes";
-import { ContractTerms } from "../types/talerTypes";
-import { CreateDepositGroupResponse, TrackDepositGroupRequest, TrackDepositGroupResponse } from "../types/walletTypes";
-import {
- buildCodecForObject,
- Codec,
- codecForString,
- codecOptional,
-} from "../util/codec";
import { selectPayCoins } from "../util/coinSelection";
import { canonicalJson } from "../util/helpers";
import { readSuccessResponseJsonOrThrow } from "../util/http";
-import { parsePaytoUri } from "../util/payto";
import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries";
import {
+ Amounts,
+ buildCodecForObject,
+ Codec,
+ codecForString,
codecForTimestamp,
+ codecOptional,
+ ContractTerms,
+ CreateDepositGroupRequest,
+ CreateDepositGroupResponse,
durationFromSpec,
getTimestampNow,
+ NotificationType,
+ parsePaytoUri,
+ TalerErrorDetails,
Timestamp,
timestampAddDuration,
timestampTruncateToSecond,
-} from "../util/time";
+ TrackDepositGroupRequest,
+ TrackDepositGroupResponse,
+} from "@gnu-taler/taler-util";
import { URL } from "../util/url";
import {
applyCoinSpend,
@@ -60,6 +55,9 @@ import {
getTotalPaymentCost,
} from "./pay";
import { InternalWalletState } from "./state";
+import { Logger } from "../util/logging.js";
+import { DepositGroupRecord, Stores } from "../db.js";
+import { guardOperationException } from "./errors.js";
/**
* Logger.
@@ -242,7 +240,6 @@ async function processDepositGroupImpl(
});
}
-
export async function trackDepositGroup(
ws: InternalWalletState,
req: TrackDepositGroupRequest,
@@ -384,7 +381,6 @@ export async function createDepositGroup(
prevPayCoins: [],
});
-
if (!payCoinSel) {
throw Error("insufficient funds");
}
@@ -437,4 +433,4 @@ export async function createDepositGroup(
await ws.db.put(Stores.depositGroups, depositGroup);
return { depositGroupId };
-}
+} \ No newline at end of file
diff --git a/packages/taler-wallet-core/src/operations/errors.ts b/packages/taler-wallet-core/src/operations/errors.ts
index 8ec8468a..61e8c575 100644
--- a/packages/taler-wallet-core/src/operations/errors.ts
+++ b/packages/taler-wallet-core/src/operations/errors.ts
@@ -23,8 +23,7 @@
/**
* Imports.
*/
-import { TalerErrorDetails } from "../types/walletTypes";
-import { TalerErrorCode } from "../TalerErrorCode";
+import { TalerErrorCode, TalerErrorDetails } from "@gnu-taler/taler-util";
/**
* This exception is there to let the caller know that an error happened,
diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts
index 1125645f..08c55416 100644
--- a/packages/taler-wallet-core/src/operations/exchanges.ts
+++ b/packages/taler-wallet-core/src/operations/exchanges.ts
@@ -14,54 +14,54 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { InternalWalletState } from "./state";
+/**
+ * Imports.
+ */
import {
- Denomination,
+ Amounts,
codecForExchangeKeysJson,
codecForExchangeWireJson,
-} from "../types/talerTypes";
-import { TalerErrorDetails } from "../types/walletTypes";
+ compare,
+ Denomination,
+ Duration,
+ durationFromSpec,
+ getTimestampNow,
+ isTimestampExpired,
+ NotificationType,
+ parsePaytoUri,
+ TalerErrorCode,
+ TalerErrorDetails,
+} from "@gnu-taler/taler-util";
import {
- ExchangeRecord,
- ExchangeUpdateStatus,
- Stores,
DenominationRecord,
DenominationStatus,
+ Stores,
+ ExchangeRecord,
+ ExchangeUpdateStatus,
WireFee,
ExchangeUpdateReason,
- MetaStores,
-} from "../types/dbTypes";
-import { canonicalizeBaseUrl, j2s } from "../util/helpers";
-import * as Amounts from "../util/amounts";
-import { parsePaytoUri } from "../util/payto";
+} from "../db.js";
import {
+ Logger,
+ URL,
+ readSuccessResponseJsonOrThrow,
+ getExpiryTimestamp,
+ readSuccessResponseTextOrThrow,
+} from "../index.js";
+import { j2s, canonicalizeBaseUrl } from "../util/helpers.js";
+import { checkDbInvariant } from "../util/invariants.js";
+import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries.js";
+import {
+ makeErrorDetails,
OperationFailedAndReportedError,
guardOperationException,
- makeErrorDetails,
-} from "./errors";
+} from "./errors.js";
+import { createRecoupGroup, processRecoupGroup } from "./recoup.js";
+import { InternalWalletState } from "./state.js";
import {
WALLET_CACHE_BREAKER_CLIENT_VERSION,
WALLET_EXCHANGE_PROTOCOL_VERSION,
-} from "./versions";
-import {
- getTimestampNow,
- Duration,
- isTimestampExpired,
- durationFromSpec,
-} from "../util/time";
-import { compare } from "../util/libtoolVersion";
-import { createRecoupGroup, processRecoupGroup } from "./recoup";
-import { TalerErrorCode } from "../TalerErrorCode";
-import {
- readSuccessResponseJsonOrThrow,
- readSuccessResponseTextOrThrow,
- getExpiryTimestamp,
-} from "../util/http";
-import { Logger } from "../util/logging";
-import { URL } from "../util/url";
-import { checkDbInvariant } from "../util/invariants";
-import { NotificationType } from "../types/notifications";
-import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries";
+} from "./versions.js";
const logger = new Logger("exchanges.ts");
diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts
index 1f8c4eb8..168a0f96 100644
--- a/packages/taler-wallet-core/src/operations/pay.ts
+++ b/packages/taler-wallet-core/src/operations/pay.ts
@@ -24,77 +24,14 @@
/**
* Imports.
*/
+import { AmountJson, Amounts, timestampIsBetween, getTimestampNow, isTimestampExpired, Timestamp, RefreshReason, CoinDepositPermission, NotificationType, TalerErrorDetails, Duration, durationMax, durationMin, durationMul, ContractTerms, codecForProposal, TalerErrorCode, codecForContractTerms, timestampAddDuration, ConfirmPayResult, ConfirmPayResultType, codecForMerchantPayResponse, PreparePayResult, PreparePayResultType, parsePayUri } from "@gnu-taler/taler-util";
import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto";
-import {
- CoinStatus,
- ProposalRecord,
- ProposalStatus,
- PurchaseRecord,
- Stores,
- WalletContractData,
- CoinRecord,
- DenominationRecord,
- AbortStatus,
- AllowedExchangeInfo,
- AllowedAuditorInfo,
-} from "../types/dbTypes";
-import { NotificationType } from "../types/notifications";
-import {
- codecForProposal,
- codecForContractTerms,
- CoinDepositPermission,
- codecForMerchantPayResponse,
- ContractTerms,
-} from "../types/talerTypes";
-import {
- ConfirmPayResult,
- TalerErrorDetails,
- PreparePayResult,
- RefreshReason,
- PreparePayResultType,
- ConfirmPayResultType,
-} from "../types/walletTypes";
-import { Amounts } from "../util/amounts";
-import { AmountJson } from "../util/amounts";
-import { Logger } from "../util/logging";
-import { parsePayUri } from "../util/taleruri";
-import {
- guardOperationException,
- makeErrorDetails,
- OperationFailedAndReportedError,
- OperationFailedError,
-} from "./errors";
-import { createRefreshGroup, getTotalRefreshCost } from "./refresh";
-import { InternalWalletState, EXCHANGE_COINS_LOCK } from "./state";
-import {
- getTimestampNow,
- timestampAddDuration,
- Duration,
- durationMax,
- durationMin,
- isTimestampExpired,
- durationMul,
- Timestamp,
- timestampIsBetween,
-} from "../util/time";
-import { strcmp, canonicalJson } from "../util/helpers";
-import {
- readSuccessResponseJsonOrThrow,
- throwUnexpectedRequestError,
- getHttpResponseErrorDetails,
- readSuccessResponseJsonOrErrorCode,
- HttpResponseStatus,
- readTalerErrorResponse,
-} from "../util/http";
-import { TalerErrorCode } from "../TalerErrorCode";
-import { URL } from "../util/url";
-import {
- initRetryInfo,
- updateRetryInfoTimeout,
- getRetryDuration,
-} from "../util/retries";
-import { TransactionHandle } from "../util/query";
-import { PayCoinSelection, CoinCandidateSelection, AvailableCoinInfo, selectPayCoins } from "../util/coinSelection";
+import { AbortStatus, AllowedAuditorInfo, AllowedExchangeInfo, CoinRecord, CoinStatus, DenominationRecord, getHttpResponseErrorDetails, guardOperationException, HttpResponseStatus, Logger, makeErrorDetails, OperationFailedAndReportedError, OperationFailedError, ProposalRecord, ProposalStatus, PurchaseRecord, readSuccessResponseJsonOrErrorCode, readSuccessResponseJsonOrThrow, readTalerErrorResponse, Stores, throwUnexpectedRequestError, TransactionHandle, URL, WalletContractData } from "../index.js";
+import { PayCoinSelection, CoinCandidateSelection, AvailableCoinInfo, selectPayCoins } from "../util/coinSelection.js";
+import { canonicalJson } from "../util/helpers.js";
+import { initRetryInfo, updateRetryInfoTimeout, getRetryDuration } from "../util/retries.js";
+import { getTotalRefreshCost, createRefreshGroup } from "./refresh.js";
+import { InternalWalletState, EXCHANGE_COINS_LOCK } from "./state.js";
/**
* Logger.
diff --git a/packages/taler-wallet-core/src/operations/pending.ts b/packages/taler-wallet-core/src/operations/pending.ts
index bae28193..01920a85 100644
--- a/packages/taler-wallet-core/src/operations/pending.ts
+++ b/packages/taler-wallet-core/src/operations/pending.ts
@@ -23,20 +23,20 @@ import {
ReserveRecordStatus,
Stores,
AbortStatus,
-} from "../types/dbTypes";
+} from "../db.js";
import {
PendingOperationsResponse,
PendingOperationType,
ExchangeUpdateOperationStage,
ReserveType,
-} from "../types/pendingTypes";
+} from "../pending-types";
import {
Duration,
getTimestampNow,
Timestamp,
getDurationRemaining,
durationMin,
-} from "../util/time";
+} from "@gnu-taler/taler-util";
import { Store, TransactionHandle } from "../util/query";
import { InternalWalletState } from "./state";
import { getBalancesInsideTransaction } from "./balance";
diff --git a/packages/taler-wallet-core/src/operations/recoup.ts b/packages/taler-wallet-core/src/operations/recoup.ts
index a2c7cb6f..337892f7 100644
--- a/packages/taler-wallet-core/src/operations/recoup.ts
+++ b/packages/taler-wallet-core/src/operations/recoup.ts
@@ -24,26 +24,14 @@
/**
* Imports.
*/
+import { Amounts, codecForRecoupConfirmation, getTimestampNow, NotificationType, RefreshReason, TalerErrorDetails } from "@gnu-taler/taler-util";
import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto";
-import {
- CoinRecord,
- CoinSourceType,
- CoinStatus,
- RecoupGroupRecord,
- RefreshCoinSource,
- ReserveRecordStatus,
- Stores,
- WithdrawCoinSource,
-} from "../types/dbTypes";
-import { NotificationType } from "../types/notifications";
-import { codecForRecoupConfirmation } from "../types/talerTypes";
-import { RefreshReason, TalerErrorDetails } from "../types/walletTypes";
-import { Amounts } from "../util/amounts";
+import { CoinRecord, CoinSourceType, CoinStatus, RecoupGroupRecord, RefreshCoinSource, ReserveRecordStatus, Stores, WithdrawCoinSource } from "../db.js";
+
import { readSuccessResponseJsonOrThrow } from "../util/http";
import { Logger } from "../util/logging";
import { TransactionHandle } from "../util/query";
import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries";
-import { getTimestampNow } from "../util/time";
import { URL } from "../util/url";
import { guardOperationException } from "./errors";
import { createRefreshGroup, processRefreshGroup } from "./refresh";
diff --git a/packages/taler-wallet-core/src/operations/refresh.ts b/packages/taler-wallet-core/src/operations/refresh.ts
index 621e9a10..d82ff946 100644
--- a/packages/taler-wallet-core/src/operations/refresh.ts
+++ b/packages/taler-wallet-core/src/operations/refresh.ts
@@ -15,7 +15,6 @@
*/
import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto";
-import { RefreshNewDenomInfo } from "../types/cryptoTypes";
import {
CoinRecord,
CoinSourceType,
@@ -24,19 +23,17 @@ import {
RefreshGroupRecord,
RefreshPlanchet,
Stores,
-} from "../types/dbTypes";
-import { NotificationType } from "../types/notifications";
+} from "../db.js";
import {
codecForExchangeMeltResponse,
codecForExchangeRevealResponse,
-} from "../types/talerTypes";
-import {
CoinPublicKey,
+ NotificationType,
RefreshGroupId,
RefreshReason,
TalerErrorDetails,
-} from "../types/walletTypes";
-import { AmountJson, Amounts } from "../util/amounts";
+} from "@gnu-taler/taler-util";
+import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import { amountToPretty } from "../util/helpers";
import { readSuccessResponseJsonOrThrow } from "../util/http";
import { checkDbInvariant } from "../util/invariants";
@@ -53,12 +50,13 @@ import {
timestampAddDuration,
timestampDifference,
timestampMin,
-} from "../util/time";
+} from "@gnu-taler/taler-util";
import { URL } from "../util/url";
import { guardOperationException } from "./errors";
import { updateExchangeFromUrl } from "./exchanges";
import { EXCHANGE_COINS_LOCK, InternalWalletState } from "./state";
import { isWithdrawableDenom, selectWithdrawalDenominations } from "./withdraw";
+import { RefreshNewDenomInfo } from "../crypto/cryptoTypes.js";
const logger = new Logger("refresh.ts");
diff --git a/packages/taler-wallet-core/src/operations/refund.ts b/packages/taler-wallet-core/src/operations/refund.ts
index 28d48d5b..b9341e57 100644
--- a/packages/taler-wallet-core/src/operations/refund.ts
+++ b/packages/taler-wallet-core/src/operations/refund.ts
@@ -24,48 +24,37 @@
* Imports.
*/
import { InternalWalletState } from "./state";
-import {
- TalerErrorDetails,
- RefreshReason,
- CoinPublicKey,
- ApplyRefundResponse,
-} from "../types/walletTypes";
-import {
- Stores,
- CoinStatus,
- RefundReason,
- RefundState,
- PurchaseRecord,
- AbortStatus,
-} from "../types/dbTypes";
-import { NotificationType } from "../types/notifications";
-import { parseRefundUri } from "../util/taleruri";
-import { createRefreshGroup, getTotalRefreshCost } from "./refresh";
-import { Amounts, AmountJson } from "../util/amounts";
-import {
- MerchantCoinRefundStatus,
- MerchantCoinRefundSuccessStatus,
- MerchantCoinRefundFailureStatus,
- codecForMerchantOrderRefundPickupResponse,
- AbortRequest,
- AbortingCoin,
- codecForMerchantAbortPayRefundStatus,
- codecForAbortResponse,
-} from "../types/talerTypes";
import { guardOperationException } from "./errors";
import {
getTimestampNow,
Timestamp,
durationAdd,
timestampAddDuration,
-} from "../util/time";
+ TalerErrorDetails,
+ AbortingCoin,
+ AbortRequest,
+ AmountJson,
+ Amounts,
+ ApplyRefundResponse,
+ codecForAbortResponse,
+ codecForMerchantOrderRefundPickupResponse,
+ CoinPublicKey,
+ MerchantCoinRefundFailureStatus,
+ MerchantCoinRefundStatus,
+ MerchantCoinRefundSuccessStatus,
+ NotificationType,
+ parseRefundUri,
+ RefreshReason,
+} from "@gnu-taler/taler-util";
import { Logger } from "../util/logging";
import { readSuccessResponseJsonOrThrow } from "../util/http";
import { TransactionHandle } from "../util/query";
import { URL } from "../util/url";
import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries";
import { checkDbInvariant } from "../util/invariants";
-import { TalerErrorCode } from "../TalerErrorCode";
+import { TalerErrorCode } from "@gnu-taler/taler-util";
+import { Stores, PurchaseRecord, CoinStatus, RefundState, AbortStatus, RefundReason } from "../db.js";
+import { getTotalRefreshCost, createRefreshGroup } from "./refresh.js";
const logger = new Logger("refund.ts");
diff --git a/packages/taler-wallet-core/src/operations/reserves.ts b/packages/taler-wallet-core/src/operations/reserves.ts
index 2be992bf..fe6f323c 100644
--- a/packages/taler-wallet-core/src/operations/reserves.ts
+++ b/packages/taler-wallet-core/src/operations/reserves.ts
@@ -19,69 +19,29 @@ import {
CreateReserveResponse,
TalerErrorDetails,
AcceptWithdrawalResponse,
-} from "../types/walletTypes";
-import { canonicalizeBaseUrl } from "../util/helpers";
-import { InternalWalletState } from "./state";
-import {
- ReserveRecordStatus,
- ReserveRecord,
- CurrencyRecord,
- Stores,
- WithdrawalGroupRecord,
- ReserveBankInfo,
-} from "../types/dbTypes";
-import { Logger } from "../util/logging";
-import { Amounts } from "../util/amounts";
-import {
- updateExchangeFromUrl,
- getExchangeTrust,
- getExchangePaytoUri,
-} from "./exchanges";
-import {
- codecForWithdrawOperationStatusResponse,
+ Amounts,
codecForBankWithdrawalOperationPostResponse,
-} from "../types/talerTypes";
-import { assertUnreachable } from "../util/assertUnreachable";
-import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto";
-import { randomBytes } from "../crypto/primitives/nacl-fast";
-import {
- processWithdrawGroup,
- getBankWithdrawalInfo,
- denomSelectionInfoToState,
- updateWithdrawalDenoms,
- selectWithdrawalDenominations,
- getCandidateWithdrawalDenoms,
-} from "./withdraw";
-import {
- guardOperationException,
- OperationFailedAndReportedError,
- makeErrorDetails,
- OperationFailedError,
-} from "./errors";
-import { NotificationType } from "../types/notifications";
-import { codecForReserveStatus } from "../types/ReserveStatus";
-import {
- getTimestampNow,
+ codecForReserveStatus,
+ codecForWithdrawOperationStatusResponse,
Duration,
- durationMin,
durationMax,
-} from "../util/time";
-import { TransactionHandle } from "../util/query";
-import { addPaytoQueryParams } from "../util/payto";
-import { TalerErrorCode } from "../TalerErrorCode";
-import {
- readSuccessResponseJsonOrErrorCode,
- throwUnexpectedRequestError,
- readSuccessResponseJsonOrThrow,
-} from "../util/http";
-import { codecForAny } from "../util/codec";
-import { URL } from "../util/url";
-import {
- initRetryInfo,
- getRetryDuration,
- updateRetryInfoTimeout,
-} from "../util/retries";
-import { ReserveTransactionType } from "../types/ReserveTransaction";
+ durationMin,
+ getTimestampNow,
+ NotificationType,
+ ReserveTransactionType,
+ TalerErrorCode,
+ addPaytoQueryParams,
+} from "@gnu-taler/taler-util";
+import { randomBytes } from "../crypto/primitives/nacl-fast.js";
+import { Stores, ReserveRecordStatus, ReserveBankInfo, ReserveRecord, CurrencyRecord, WithdrawalGroupRecord } from "../db.js";
+import { Logger, encodeCrock, getRandomBytes, readSuccessResponseJsonOrThrow, URL, readSuccessResponseJsonOrErrorCode, throwUnexpectedRequestError, TransactionHandle } from "../index.js";
+import { assertUnreachable } from "../util/assertUnreachable.js";
+import { canonicalizeBaseUrl } from "../util/helpers.js";
+import { initRetryInfo, getRetryDuration, updateRetryInfoTimeout } from "../util/retries.js";
+import { guardOperationException, OperationFailedError } from "./errors.js";
+import { updateExchangeFromUrl, getExchangeTrust, getExchangePaytoUri } from "./exchanges.js";
+import { InternalWalletState } from "./state.js";
+import { updateWithdrawalDenoms, getCandidateWithdrawalDenoms, selectWithdrawalDenominations, denomSelectionInfoToState, processWithdrawGroup, getBankWithdrawalInfo } from "./withdraw.js";
const logger = new Logger("reserves.ts");
diff --git a/packages/taler-wallet-core/src/operations/state.ts b/packages/taler-wallet-core/src/operations/state.ts
index ce52affe..752a57ff 100644
--- a/packages/taler-wallet-core/src/operations/state.ts
+++ b/packages/taler-wallet-core/src/operations/state.ts
@@ -14,16 +14,15 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
+/**
+ * Imports.
+ */
+import { WalletNotification, BalancesResponse } from "@gnu-taler/taler-util";
+import { Stores } from "../db.js";
+import { Logger, CryptoApi, OpenedPromise, Database, CryptoWorkerFactory, openPromise } from "../index.js";
+import { PendingOperationsResponse } from "../pending-types.js";
+import { AsyncOpMemoMap, AsyncOpMemoSingle } from "../util/asyncMemo.js";
import { HttpRequestLibrary } from "../util/http";
-import { BalancesResponse } from "../types/walletTypes";
-import { CryptoApi, CryptoWorkerFactory } from "../crypto/workers/cryptoApi";
-import { AsyncOpMemoMap, AsyncOpMemoSingle } from "../util/asyncMemo";
-import { Logger } from "../util/logging";
-import { PendingOperationsResponse } from "../types/pendingTypes";
-import { WalletNotification } from "../types/notifications";
-import { Database } from "../util/query";
-import { openPromise, OpenedPromise } from "../util/promiseUtils";
-import { Stores } from "../types/dbTypes";
type NotificationListener = (n: WalletNotification) => void;
diff --git a/packages/taler-wallet-core/src/operations/testing.ts b/packages/taler-wallet-core/src/operations/testing.ts
index 162e23b3..aa9afc50 100644
--- a/packages/taler-wallet-core/src/operations/testing.ts
+++ b/packages/taler-wallet-core/src/operations/testing.ts
@@ -14,28 +14,20 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
+/**
+ * Imports.
+ */
import { Logger } from "../util/logging";
import {
HttpRequestLibrary,
readSuccessResponseJsonOrThrow,
checkSuccessResponseOrThrow,
} from "../util/http";
-import { codecForAny } from "../util/codec";
-import {
- AmountString,
- CheckPaymentResponse,
- codecForCheckPaymentResponse,
-} from "../types/talerTypes";
-import { InternalWalletState } from "./state";
-import { createTalerWithdrawReserve } from "./reserves";
-import { URL } from "../util/url";
-import { Wallet } from "../wallet";
-import { Amounts } from "../util/amounts";
-import {
- TestPayArgs,
- PreparePayResultType,
- IntegrationTestArgs,
-} from "../types/walletTypes";
+import { AmountString, codecForAny, CheckPaymentResponse, codecForCheckPaymentResponse, IntegrationTestArgs, Amounts, TestPayArgs, PreparePayResultType } from "@gnu-taler/taler-util";
+import { URL } from "../index.js";
+import { Wallet } from "../wallet.js";
+import { createTalerWithdrawReserve } from "./reserves.js";
+import { InternalWalletState } from "./state.js";
const logger = new Logger("operations/testing.ts");
diff --git a/packages/taler-wallet-core/src/operations/tip.ts b/packages/taler-wallet-core/src/operations/tip.ts
index 9242d70d..5ea92912 100644
--- a/packages/taler-wallet-core/src/operations/tip.ts
+++ b/packages/taler-wallet-core/src/operations/tip.ts
@@ -14,45 +14,50 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { InternalWalletState } from "./state";
-import { parseTipUri } from "../util/taleruri";
-import { PrepareTipResult, TalerErrorDetails } from "../types/walletTypes";
+/**
+ * Imports.
+ */
import {
- TipPlanchetDetail,
+ PrepareTipResult,
+ parseTipUri,
codecForTipPickupGetResponse,
+ Amounts,
+ getTimestampNow,
+ TalerErrorDetails,
+ NotificationType,
+ TipPlanchetDetail,
+ TalerErrorCode,
codecForTipResponse,
-} from "../types/talerTypes";
-import * as Amounts from "../util/amounts";
+} from "@gnu-taler/taler-util";
+import { DerivedTipPlanchet } from "../crypto/cryptoTypes.js";
import {
Stores,
+ DenominationRecord,
CoinRecord,
CoinSourceType,
CoinStatus,
- DenominationRecord,
-} from "../types/dbTypes";
+} from "../db.js";
+import {
+ Logger,
+ URL,
+ readSuccessResponseJsonOrThrow,
+ encodeCrock,
+ getRandomBytes,
+ getHttpResponseErrorDetails,
+} from "../index.js";
+import { j2s } from "../util/helpers.js";
+import { checkDbInvariant, checkLogicInvariant } from "../util/invariants.js";
+import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries.js";
+import { guardOperationException, makeErrorDetails } from "./errors.js";
+import { updateExchangeFromUrl } from "./exchanges.js";
+import { InternalWalletState } from "./state";
import {
getExchangeWithdrawalInfo,
- denomSelectionInfoToState,
updateWithdrawalDenoms,
getCandidateWithdrawalDenoms,
selectWithdrawalDenominations,
-} from "./withdraw";
-import { updateExchangeFromUrl } from "./exchanges";
-import { getRandomBytes, encodeCrock } from "../crypto/talerCrypto";
-import { guardOperationException, makeErrorDetails } from "./errors";
-import { NotificationType } from "../types/notifications";
-import { getTimestampNow } from "../util/time";
-import {
- getHttpResponseErrorDetails,
- readSuccessResponseJsonOrThrow,
-} from "../util/http";
-import { URL } from "../util/url";
-import { Logger } from "../util/logging";
-import { checkDbInvariant, checkLogicInvariant } from "../util/invariants";
-import { TalerErrorCode } from "../TalerErrorCode";
-import { initRetryInfo, updateRetryInfoTimeout } from "../util/retries";
-import { j2s } from "../util/helpers";
-import { DerivedTipPlanchet } from "../types/cryptoTypes";
+ denomSelectionInfoToState,
+} from "./withdraw.js";
const logger = new Logger("operations/tip.ts");
diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts
index d4903155..94925da1 100644
--- a/packages/taler-wallet-core/src/operations/transactions.ts
+++ b/packages/taler-wallet-core/src/operations/transactions.ts
@@ -24,9 +24,8 @@ import {
RefundState,
ReserveRecordStatus,
AbortStatus,
-} from "../types/dbTypes";
-import { Amounts, AmountJson } from "../util/amounts";
-import { timestampCmp } from "../util/time";
+} from "../db.js";
+import { AmountJson, Amounts, timestampCmp } from "@gnu-taler/taler-util";
import {
TransactionsRequest,
TransactionsResponse,
@@ -36,9 +35,8 @@ import {
WithdrawalType,
WithdrawalDetails,
OrderShortInfo,
-} from "../types/transactionsTypes";
+} from "@gnu-taler/taler-util";
import { getFundingPaytoUris } from "./reserves";
-import { TipResponse } from "../types/talerTypes";
/**
* Create an event ID from the type and the primary key for the event.
diff --git a/packages/taler-wallet-core/src/operations/withdraw-test.ts b/packages/taler-wallet-core/src/operations/withdraw-test.ts
index 806d8e82..ad52a5f0 100644
--- a/packages/taler-wallet-core/src/operations/withdraw-test.ts
+++ b/packages/taler-wallet-core/src/operations/withdraw-test.ts
@@ -14,10 +14,10 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
+import { Amounts } from "@gnu-taler/taler-util";
import test from "ava";
+import { DenominationRecord, DenominationStatus } from "../db.js";
import { selectWithdrawalDenominations } from "./withdraw";
-import { Amounts } from "../util/amounts";
-import { DenominationRecord, DenominationStatus } from "../types/dbTypes";
test("withdrawal selection bug repro", (t) => {
const amount = {
diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts
index f8748142..0c1acf8e 100644
--- a/packages/taler-wallet-core/src/operations/withdraw.ts
+++ b/packages/taler-wallet-core/src/operations/withdraw.ts
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
-import { AmountJson, Amounts } from "../util/amounts";
+import { AmountJson, Amounts, parseWithdrawUri, Timestamp } from "@gnu-taler/taler-util";
import {
DenominationRecord,
Stores,
@@ -25,22 +25,22 @@ import {
DenominationSelectionInfo,
PlanchetRecord,
DenomSelectionState,
-} from "../types/dbTypes";
+ ExchangeRecord,
+ ExchangeWireInfo,
+} from "../db";
import {
BankWithdrawDetails,
- ExchangeWithdrawDetails,
TalerErrorDetails,
ExchangeListItem,
WithdrawUriInfoResponse,
-} from "../types/walletTypes";
+} from "@gnu-taler/taler-util";
import {
codecForWithdrawOperationStatusResponse,
codecForWithdrawResponse,
WithdrawResponse,
codecForTalerConfigResponse,
-} from "../types/talerTypes";
+} from "@gnu-taler/taler-util";
import { InternalWalletState } from "./state";
-import { parseWithdrawUri } from "../util/taleruri";
import { Logger } from "../util/logging";
import { updateExchangeFromUrl, getExchangeTrust } from "./exchanges";
import {
@@ -48,29 +48,115 @@ import {
WALLET_BANK_INTEGRATION_PROTOCOL_VERSION,
} from "./versions";
-import * as LibtoolVersion from "../util/libtoolVersion";
+import * as LibtoolVersion from "@gnu-taler/taler-util";
import {
guardOperationException,
makeErrorDetails,
OperationFailedError,
} from "./errors";
-import { NotificationType } from "../types/notifications";
+import { NotificationType } from "@gnu-taler/taler-util";
import {
getTimestampNow,
getDurationRemaining,
timestampCmp,
timestampSubtractDuraction,
-} from "../util/time";
+} from "@gnu-taler/taler-util";
import { readSuccessResponseJsonOrThrow } from "../util/http";
import { URL } from "../util/url";
-import { TalerErrorCode } from "../TalerErrorCode";
-import { encodeCrock } from "../crypto/talerCrypto";
+import { TalerErrorCode } from "@gnu-taler/taler-util";
import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries";
-import { compare } from "../util/libtoolVersion";
-import { j2s } from "../util/helpers";
+import { compare } from "@gnu-taler/taler-util";
const logger = new Logger("withdraw.ts");
+
+/**
+ * Information about what will happen when creating a reserve.
+ *
+ * Sent to the wallet frontend to be rendered and shown to the user.
+ */
+ interface ExchangeWithdrawDetails {
+ /**
+ * Exchange that the reserve will be created at.
+ */
+ exchangeInfo: ExchangeRecord;
+
+ /**
+ * Filtered wire info to send to the bank.
+ */
+ exchangeWireAccounts: string[];
+
+ /**
+ * Selected denominations for withdraw.
+ */
+ selectedDenoms: DenominationSelectionInfo;
+
+ /**
+ * Fees for withdraw.
+ */
+ withdrawFee: AmountJson;
+
+ /**
+ * Remaining balance that is too small to be withdrawn.
+ */
+ overhead: AmountJson;
+
+ /**
+ * Wire fees from the exchange.
+ */
+ wireFees: ExchangeWireInfo;
+
+ /**
+ * Does the wallet know about an auditor for
+ * the exchange that the reserve.
+ */
+ isAudited: boolean;
+
+ /**
+ * Did the user already accept the current terms of service for the exchange?
+ */
+ termsOfServiceAccepted: boolean;
+
+ /**
+ * The exchange is trusted directly.
+ */
+ isTrusted: boolean;
+
+ /**
+ * The earliest deposit expiration of the selected coins.
+ */
+ earliestDepositExpiration: Timestamp;
+
+ /**
+ * Number of currently offered denominations.
+ */
+ numOfferedDenoms: number;
+
+ /**
+ * Public keys of trusted auditors for the currency we're withdrawing.
+ */
+ trustedAuditorPubs: string[];
+
+ /**
+ * Result of checking the wallet's version
+ * against the exchange's version.
+ *
+ * Older exchanges don't return version information.
+ */
+ versionMatch: LibtoolVersion.VersionMatchResult | undefined;
+
+ /**
+ * Libtool-style version string for the exchange or "unknown"
+ * for older exchanges.
+ */
+ exchangeVersion: string;
+
+ /**
+ * Libtool-style version string for the wallet.
+ */
+ walletVersion: string;
+}
+
/**
* Check if a denom is withdrawable based on the expiration time
* and revocation state.
diff --git a/packages/taler-wallet-core/src/types/pendingTypes.ts b/packages/taler-wallet-core/src/pending-types.ts
index d41d2a97..cefaa23e 100644
--- a/packages/taler-wallet-core/src/types/pendingTypes.ts
+++ b/packages/taler-wallet-core/src/pending-types.ts
@@ -16,15 +16,17 @@
/**
* Type and schema definitions for pending operations in the wallet.
+ *
+ * These are only used internally, and are not part of the public
+ * interface to the wallet.
*/
/**
* Imports.
*/
-import { TalerErrorDetails, BalancesResponse } from "./walletTypes";
-import { ReserveRecordStatus } from "./dbTypes";
-import { Timestamp, Duration } from "../util/time";
-import { RetryInfo } from "../util/retries";
+import { TalerErrorDetails, BalancesResponse, Duration, Timestamp } from "@gnu-taler/taler-util";
+import { ReserveRecordStatus } from "./db.js";
+import { RetryInfo } from "./util/retries.js";
export enum PendingOperationType {
Bug = "bug",
diff --git a/packages/taler-wallet-core/src/types/dbTypes.ts b/packages/taler-wallet-core/src/types/dbTypes.ts
deleted file mode 100644
index 689055df..00000000
--- a/packages/taler-wallet-core/src/types/dbTypes.ts
+++ /dev/null
@@ -1,1775 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2018-2020 Taler Systems S.A.
-
- GNU Taler is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-/**
- * Types for records stored in the wallet's database.
- *
- * Types for the objects in the database should end in "-Record".
- */
-
-/**
- * Imports.
- */
-import { AmountJson } from "../util/amounts";
-import {
- Auditor,
- CoinDepositPermission,
- ExchangeSignKeyJson,
- MerchantInfo,
- Product,
- InternationalizedString,
- AmountString,
- ContractTerms,
-} from "./talerTypes";
-
-import { Index, Store } from "../util/query";
-import { TalerErrorDetails, RefreshReason } from "./walletTypes";
-import { ReserveTransaction } from "./ReserveTransaction";
-import { Timestamp, Duration } from "../util/time";
-import { IDBKeyPath } from "@gnu-taler/idb-bridge";
-import { RetryInfo } from "../util/retries";
-import { PayCoinSelection } from "../util/coinSelection";
-
-export enum ReserveRecordStatus {
- /**
- * Reserve must be registered with the bank.
- */
- REGISTERING_BANK = "registering-bank",
-
- /**
- * We've registered reserve's information with the bank
- * and are now waiting for the user to confirm the withdraw
- * with the bank (typically 2nd factor auth).
- */
- WAIT_CONFIRM_BANK = "wait-confirm-bank",
-
- /**
- * Querying reserve status with the exchange.
- */
- QUERYING_STATUS = "querying-status",
-
- /**
- * The corresponding withdraw record has been created.
- * No further processing is done, unless explicitly requested
- * by the user.
- */
- DORMANT = "dormant",
-
- /**
- * The bank aborted the withdrawal.
- */
- BANK_ABORTED = "bank-aborted",
-}
-
-export interface ReserveBankInfo {
- /**
- * Status URL that the wallet will use to query the status
- * of the Taler withdrawal operation on the bank's side.
- */
- statusUrl: string;
-
- confirmUrl?: string;
-
- /**
- * Exchange payto URI that the bank will use to fund the reserve.
- */
- exchangePaytoUri: string;
-}
-
-/**
- * A reserve record as stored in the wallet's database.
- */
-export interface ReserveRecord {
- /**
- * The reserve public key.
- */
- reservePub: string;
-
- /**
- * The reserve private key.
- */
- reservePriv: string;
-
- /**
- * The exchange base URL.
- */
- exchangeBaseUrl: string;
-
- /**
- * Currency of the reserve.
- */
- currency: string;
-
- /**
- * Time when the reserve was created.
- */
- timestampCreated: Timestamp;
-
- /**
- * Time when the information about this reserve was posted to the bank.
- *
- * Only applies if bankWithdrawStatusUrl is defined.
- *
- * Set to 0 if that hasn't happened yet.
- */
- timestampReserveInfoPosted: Timestamp | undefined;
-
- /**
- * Time when the reserve was confirmed by the bank.
- *
- * Set to undefined if not confirmed yet.
- */
- timestampBankConfirmed: Timestamp | undefined;
-
- /**
- * Wire information (as payto URI) for the bank account that
- * transfered funds for this reserve.
- */
- senderWire?: string;
-
- /**
- * Amount that was sent by the user to fund the reserve.
- */
- instructedAmount: AmountJson;
-
- /**
- * Extra state for when this is a withdrawal involving
- * a Taler-integrated bank.
- */
- bankInfo?: ReserveBankInfo;
-
- initialWithdrawalGroupId: string;
-
- /**
- * Did we start the first withdrawal for this reserve?
- *
- * We only report a pending withdrawal for the reserve before
- * the first withdrawal has started.
- */
- initialWithdrawalStarted: boolean;
-
- /**
- * Initial denomination selection, stored here so that
- * we can show this information in the transactions/balances
- * before we have a withdrawal group.
- */
- initialDenomSel: DenomSelectionState;
-
- reserveStatus: ReserveRecordStatus;
-
- /**
- * Was a reserve query requested? If so, query again instead
- * of going into dormant status.
- */
- requestedQuery: boolean;
-
- /**
- * Time of the last successful status query.
- */
- lastSuccessfulStatusQuery: Timestamp | undefined;
-
- /**
- * Retry info. This field is present even if no retry is scheduled,
- * because we need it to be present for the index on the object store
- * to work.
- */
- retryInfo: RetryInfo;
-
- /**
- * Last error that happened in a reserve operation
- * (either talking to the bank or the exchange).
- */
- lastError: TalerErrorDetails | undefined;
-}
-
-/**
- * Auditor record as stored with currencies in the exchange database.
- */
-export interface AuditorRecord {
- /**
- * Base url of the auditor.
- */
- baseUrl: string;
-
- /**
- * Public signing key of the auditor.
- */
- auditorPub: string;
-
- /**
- * Time when the auditing expires.
- */
- expirationStamp: number;
-}
-
-/**
- * Exchange for currencies as stored in the wallet's currency
- * information database.
- */
-export interface ExchangeForCurrencyRecord {
- /**
- * FIXME: unused?
- */
- exchangeMasterPub: string;
-
- /**
- * Base URL of the exchange.
- */
- exchangeBaseUrl: string;
-}
-
-/**
- * Information about a currency as displayed in the wallet's database.
- */
-export interface CurrencyRecord {
- /**
- * Name of the currency.
- */
- name: string;
-
- /**
- * Number of fractional digits to show when rendering the currency.
- */
- fractionalDigits: number;
-
- /**
- * Auditors that the wallet trusts for this currency.
- */
- auditors: AuditorRecord[];
-
- /**
- * Exchanges that the wallet trusts for this currency.
- */
- exchanges: ExchangeForCurrencyRecord[];
-}
-
-/**
- * Status of a denomination.
- */
-export enum DenominationStatus {
- /**
- * Verification was delayed.
- */
- Unverified = "unverified",
- /**
- * Verified as valid.
- */
- VerifiedGood = "verified-good",
- /**
- * Verified as invalid.
- */
- VerifiedBad = "verified-bad",
-}
-
-/**
- * Denomination record as stored in the wallet's database.
- */
-export interface DenominationRecord {
- /**
- * Value of one coin of the denomination.
- */
- value: AmountJson;
-
- /**
- * The denomination public key.
- */
- denomPub: string;
-
- /**
- * Hash of the denomination public key.
- * Stored in the database for faster lookups.
- */
- denomPubHash: string;
-
- /**
- * Fee for withdrawing.
- */
- feeWithdraw: AmountJson;
-
- /**
- * Fee for depositing.
- */
- feeDeposit: AmountJson;
-
- /**
- * Fee for refreshing.
- */
- feeRefresh: AmountJson;
-
- /**
- * Fee for refunding.
- */
- feeRefund: AmountJson;
-
- /**
- * Validity start date of the denomination.
- */
- stampStart: Timestamp;
-
- /**
- * Date after which the currency can't be withdrawn anymore.
- */
- stampExpireWithdraw: Timestamp;
-
- /**
- * Date after the denomination officially doesn't exist anymore.
- */
- stampExpireLegal: Timestamp;
-
- /**
- * Data after which coins of this denomination can't be deposited anymore.
- */
- stampExpireDeposit: Timestamp;
-
- /**
- * Signature by the exchange's master key over the denomination
- * information.
- */
- masterSig: string;
-
- /**
- * Did we verify the signature on the denomination?
- *
- * FIXME: Rename to "verificationStatus"?
- */
- status: DenominationStatus;
-
- /**
- * Was this denomination still offered by the exchange the last time
- * we checked?
- * Only false when the exchange redacts a previously published denomination.
- */
- isOffered: boolean;
-
- /**
- * Did the exchange revoke the denomination?
- * When this field is set to true in the database, the same transaction
- * should also mark all affected coins as revoked.
- */
- isRevoked: boolean;
-
- /**
- * Base URL of the exchange.
- */
- exchangeBaseUrl: string;
-}
-
-/**
- * Details about the exchange that we only know after
- * querying /keys and /wire.
- */
-export interface ExchangeDetails {
- /**
- * Master public key of the exchange.
- */
- masterPublicKey: string;
-
- /**
- * Auditors (partially) auditing the exchange.
- */
- auditors: Auditor[];
-
- /**
- * Currency that the exchange offers.
- */
- currency: string;
-
- /**
- * Last observed protocol version.
- */
- protocolVersion: string;
-
- reserveClosingDelay: Duration;
-
- /**
- * Signing keys we got from the exchange, can also contain
- * older signing keys that are not returned by /keys anymore.
- */
- signingKeys: ExchangeSignKeyJson[];
-
- /**
- * Timestamp for last update.
- */
- lastUpdateTime: Timestamp;
-
- /**
- * When should we next update the information about the exchange?
- */
- nextUpdateTime: Timestamp;
-}
-
-export enum ExchangeUpdateStatus {
- FetchKeys = "fetch-keys",
- FetchWire = "fetch-wire",
- FetchTerms = "fetch-terms",
- FinalizeUpdate = "finalize-update",
- Finished = "finished",
-}
-
-export interface ExchangeBankAccount {
- payto_uri: string;
- master_sig: string;
-}
-
-export interface ExchangeWireInfo {
- feesForType: { [wireMethod: string]: WireFee[] };
- accounts: ExchangeBankAccount[];
-}
-
-export enum ExchangeUpdateReason {
- Initial = "initial",
- Forced = "forced",
- Scheduled = "scheduled",
-}
-
-/**
- * Exchange record as stored in the wallet's database.
- */
-export interface ExchangeRecord {
- /**
- * Base url of the exchange.
- */
- baseUrl: string;
-
- /**
- * Did we finish adding the exchange?
- */
- addComplete: boolean;
-
- /**
- * Is this a permanent or temporary exchange record?
- */
- permanent: boolean;
-
- /**
- * Was the exchange added as a built-in exchange?
- */
- builtIn: boolean;
-
- /**
- * Details, once known.
- */
- details: ExchangeDetails | undefined;
-
- /**
- * Mapping from wire method type to the wire fee.
- */
- wireInfo: ExchangeWireInfo | undefined;
-
- /**
- * Terms of service text or undefined if not downloaded yet.
- *
- * This is just used as a cache of the last downloaded ToS.
- */
- termsOfServiceText: string | undefined;
-
- /**
- * ETag for last terms of service download.
- */
- termsOfServiceLastEtag: string | undefined;
-
- /**
- * ETag for last terms of service download.
- */
- termsOfServiceAcceptedEtag: string | undefined;
-
- /**
- * Time when the update to the exchange has been started or
- * undefined if no update is in progress.
- */
- updateStarted: Timestamp | undefined;
-
- /**
- * Status of updating the info about the exchange.
- */
- updateStatus: ExchangeUpdateStatus;
-
- updateReason?: ExchangeUpdateReason;
-
- lastError?: TalerErrorDetails;
-
- /**
- * Retry status for fetching updated information about the exchange.
- */
- retryInfo: RetryInfo;
-
- /**
- * Next time that we should check if coins need to be refreshed.
- *
- * Updated whenever the exchange's denominations are updated or when
- * the refresh check has been done.
- */
- nextRefreshCheck?: Timestamp;
-}
-
-/**
- * A coin that isn't yet signed by an exchange.
- */
-export interface PlanchetRecord {
- /**
- * Public key of the coin.
- */
- coinPub: string;
-
- /**
- * Private key of the coin.
- */
- coinPriv: string;
-
- /**
- * Withdrawal group that this planchet belongs to
- * (or the empty string).
- */
- withdrawalGroupId: string;
-
- /**
- * Index within the withdrawal group (or -1).
- */
- coinIdx: number;
-
- withdrawalDone: boolean;
-
- lastError: TalerErrorDetails | undefined;
-
- /**
- * Public key of the reserve that this planchet
- * is being withdrawn from.
- *
- * Can be the empty string (non-null/undefined for DB indexing)
- * if this is a tipping reserve.
- */
- reservePub: string;
-
- denomPubHash: string;
-
- denomPub: string;
-
- blindingKey: string;
-
- withdrawSig: string;
-
- coinEv: string;
-
- coinEvHash: string;
-
- coinValue: AmountJson;
-
- isFromTip: boolean;
-}
-
-/**
- * Planchet for a coin during refrehs.
- */
-export interface RefreshPlanchet {
- /**
- * Public key for the coin.
- */
- publicKey: string;
-
- /**
- * Private key for the coin.
- */
- privateKey: string;
-
- /**
- * Blinded public key.
- */
- coinEv: string;
-
- coinEvHash: string;
-
- /**
- * Blinding key used.
- */
- blindingKey: string;
-}
-
-/**
- * Status of a coin.
- */
-export enum CoinStatus {
- /**
- * Withdrawn and never shown to anybody.
- */
- Fresh = "fresh",
- /**
- * A coin that has been spent and refreshed.
- */
- Dormant = "dormant",
-}
-
-export enum CoinSourceType {
- Withdraw = "withdraw",
- Refresh = "refresh",
- Tip = "tip",
-}
-
-export interface WithdrawCoinSource {
- type: CoinSourceType.Withdraw;
-
- /**
- * Can be the empty string for orphaned coins.
- */
- withdrawalGroupId: string;
-
- /**
- * Index of the coin in the withdrawal session.
- */
- coinIndex: number;
-
- /**
- * Reserve public key for the reserve we got this coin from.
- */
- reservePub: string;
-}
-
-export interface RefreshCoinSource {
- type: CoinSourceType.Refresh;
- oldCoinPub: string;
-}
-
-export interface TipCoinSource {
- type: CoinSourceType.Tip;
- walletTipId: string;
- coinIndex: number;
-}
-
-export type CoinSource = WithdrawCoinSource | RefreshCoinSource | TipCoinSource;
-
-/**
- * CoinRecord as stored in the "coins" data store
- * of the wallet database.
- */
-export interface CoinRecord {
- /**
- * Where did the coin come from? Used for recouping coins.
- */
- coinSource: CoinSource;
-
- /**
- * Public key of the coin.
- */
- coinPub: string;
-
- /**
- * Private key to authorize operations on the coin.
- */
- coinPriv: string;
-
- /**
- * Key used by the exchange used to sign the coin.
- */
- denomPub: string;
-
- /**
- * Hash of the public key that signs the coin.
- */
- denomPubHash: string;
-
- /**
- * Unblinded signature by the exchange.
- */
- denomSig: string;
-
- /**
- * Amount that's left on the coin.
- */
- currentAmount: AmountJson;
-
- /**
- * Base URL that identifies the exchange from which we got the
- * coin.
- */
- exchangeBaseUrl: string;
-
- /**
- * The coin is currently suspended, and will not be used for payments.
- */
- suspended: boolean;
-
- /**
- * Blinding key used when withdrawing the coin.
- * Potentionally used again during payback.
- */
- blindingKey: string;
-
- /**
- * Hash of the coin envelope.
- *
- * Stored here for indexing purposes, so that when looking at a
- * reserve history, we can quickly find the coin for a withdrawal transaction.
- */
- coinEvHash: string;
-
- /**
- * Status of the coin.
- */
- status: CoinStatus;
-}
-
-export enum ProposalStatus {
- /**
- * Not downloaded yet.
- */
- DOWNLOADING = "downloading",
- /**
- * Proposal downloaded, but the user needs to accept/reject it.
- */
- PROPOSED = "proposed",
- /**
- * The user has accepted the proposal.
- */
- ACCEPTED = "accepted",
- /**
- * The user has rejected the proposal.
- */
- REFUSED = "refused",
- /**
- * Downloading or processing the proposal has failed permanently.
- */
- PERMANENTLY_FAILED = "permanently-failed",
- /**
- * Downloaded proposal was detected as a re-purchase.
- */
- REPURCHASE = "repurchase",
-}
-
-export interface ProposalDownload {
- /**
- * The contract that was offered by the merchant.
- */
- contractTermsRaw: any;
-
- contractData: WalletContractData;
-}
-
-/**
- * Record for a downloaded order, stored in the wallet's database.
- */
-export interface ProposalRecord {
- orderId: string;
-
- merchantBaseUrl: string;
-
- /**
- * Downloaded data from the merchant.
- */
- download: ProposalDownload | undefined;
-
- /**
- * Unique ID when the order is stored in the wallet DB.
- */
- proposalId: string;
-
- /**
- * Timestamp (in ms) of when the record
- * was created.
- */
- timestamp: Timestamp;
-
- /**
- * Private key for the nonce.
- */
- noncePriv: string;
-
- /**
- * Public key for the nonce.
- */
- noncePub: string;
-
- claimToken: string | undefined;
-
- proposalStatus: ProposalStatus;
-
- repurchaseProposalId: string | undefined;
-
- /**
- * Session ID we got when downloading the contract.
- */
- downloadSessionId?: string;
-
- /**
- * Retry info, even present when the operation isn't active to allow indexing
- * on the next retry timestamp.
- */
- retryInfo: RetryInfo;
-
- lastError: TalerErrorDetails | undefined;
-}
-
-/**
- * Status of a tip we got from a merchant.
- */
-export interface TipRecord {
- lastError: TalerErrorDetails | undefined;
-
- /**
- * Has the user accepted the tip? Only after the tip has been accepted coins
- * withdrawn from the tip may be used.
- */
- acceptedTimestamp: Timestamp | undefined;
-
- /**
- * The tipped amount.
- */
- tipAmountRaw: AmountJson;
-
- tipAmountEffective: AmountJson;
-
- /**
- * Timestamp, the tip can't be picked up anymore after this deadline.
- */
- tipExpiration: Timestamp;
-
- /**
- * The exchange that will sign our coins, chosen by the merchant.
- */
- exchangeBaseUrl: string;
-
- /**
- * Base URL of the merchant that is giving us the tip.
- */
- merchantBaseUrl: string;
-
- /**
- * Denomination selection made by the wallet for picking up
- * this tip.
- */
- denomsSel: DenomSelectionState;
-
- /**
- * Tip ID chosen by the wallet.
- */
- walletTipId: string;
-
- /**
- * Secret seed used to derive planchets for this tip.
- */
- secretSeed: string;
-
- /**
- * The merchant's identifier for this tip.
- */
- merchantTipId: string;
-
- createdTimestamp: Timestamp;
-
- /**
- * Timestamp for when the wallet finished picking up the tip
- * from the merchant.
- */
- pickedUpTimestamp: Timestamp | undefined;
-
- /**
- * Retry info, even present when the operation isn't active to allow indexing
- * on the next retry timestamp.
- */
- retryInfo: RetryInfo;
-}
-
-export interface RefreshGroupRecord {
- /**
- * Retry info, even present when the operation isn't active to allow indexing
- * on the next retry timestamp.
- */
- retryInfo: RetryInfo;
-
- lastError: TalerErrorDetails | undefined;
-
- lastErrorPerCoin: { [coinIndex: number]: TalerErrorDetails };
-
- refreshGroupId: string;
-
- reason: RefreshReason;
-
- oldCoinPubs: string[];
-
- refreshSessionPerCoin: (RefreshSessionRecord | undefined)[];
-
- inputPerCoin: AmountJson[];
-
- estimatedOutputPerCoin: AmountJson[];
-
- /**
- * Flag for each coin whether refreshing finished.
- * If a coin can't be refreshed (remaining value too small),
- * it will be marked as finished, but no refresh session will
- * be created.
- */
- finishedPerCoin: boolean[];
-
- timestampCreated: Timestamp;
-
- /**
- * Timestamp when the refresh session finished.
- */
- timestampFinished: Timestamp | undefined;
-}
-
-/**
- * Ongoing refresh
- */
-export interface RefreshSessionRecord {
- /**
- * 512-bit secret that can be used to derive
- * the other cryptographic material for the refresh session.
- *
- * FIXME: We currently store the derived material, but
- * should always derive it.
- */
- sessionSecretSeed: string;
-
- /**
- * Sum of the value of denominations we want
- * to withdraw in this session, without fees.
- */
- amountRefreshOutput: AmountJson;
-
- /**
- * Hashed denominations of the newly requested coins.
- */
- newDenoms: {
- denomPubHash: string;
- count: number;
- }[];
-
- /**
- * The no-reveal-index after we've done the melting.
- */
- norevealIndex?: number;
-}
-
-/**
- * Wire fee for one wire method as stored in the
- * wallet's database.
- */
-export interface WireFee {
- /**
- * Fee for wire transfers.
- */
- wireFee: AmountJson;
-
- /**
- * Fees to close and refund a reserve.
- */
- closingFee: AmountJson;
-
- /**
- * Start date of the fee.
- */
- startStamp: Timestamp;
-
- /**
- * End date of the fee.
- */
- endStamp: Timestamp;
-
- /**
- * Signature made by the exchange master key.
- */
- sig: string;
-}
-
-/**
- * Record to store information about a refund event.
- *
- * All information about a refund is stored with the purchase,
- * this event is just for the history.
- *
- * The event is only present for completed refunds.
- */
-export interface RefundEventRecord {
- timestamp: Timestamp;
- merchantExecutionTimestamp: Timestamp;
- refundGroupId: string;
- proposalId: string;
-}
-
-export enum RefundState {
- Failed = "failed",
- Applied = "applied",
- Pending = "pending",
-}
-
-/**
- * State of one refund from the merchant, maintained by the wallet.
- */
-export type WalletRefundItem =
- | WalletRefundFailedItem
- | WalletRefundPendingItem
- | WalletRefundAppliedItem;
-
-export interface WalletRefundItemCommon {
- // Execution time as claimed by the merchant
- executionTime: Timestamp;
-
- /**
- * Time when the wallet became aware of the refund.
- */
- obtainedTime: Timestamp;
-
- refundAmount: AmountJson;
-
- refundFee: AmountJson;
-
- /**
- * Upper bound on the refresh cost incurred by
- * applying this refund.
- *
- * Might be lower in practice when two refunds on the same
- * coin are refreshed in the same refresh operation.
- */
- totalRefreshCostBound: AmountJson;
-
- coinPub: string;
-
- rtransactionId: number;
-}
-
-/**
- * Failed refund, either because the merchant did
- * something wrong or it expired.
- */
-export interface WalletRefundFailedItem extends WalletRefundItemCommon {
- type: RefundState.Failed;
-}
-
-export interface WalletRefundPendingItem extends WalletRefundItemCommon {
- type: RefundState.Pending;
-}
-
-export interface WalletRefundAppliedItem extends WalletRefundItemCommon {
- type: RefundState.Applied;
-}
-
-export enum RefundReason {
- /**
- * Normal refund given by the merchant.
- */
- NormalRefund = "normal-refund",
- /**
- * Refund from an aborted payment.
- */
- AbortRefund = "abort-pay-refund",
-}
-
-/**
- * Record stored for every time we successfully submitted
- * a payment to the merchant (both first time and re-play).
- */
-export interface PayEventRecord {
- proposalId: string;
- sessionId: string | undefined;
- isReplay: boolean;
- timestamp: Timestamp;
-}
-
-export interface ExchangeUpdatedEventRecord {
- exchangeBaseUrl: string;
- timestamp: Timestamp;
-}
-
-export interface ReserveUpdatedEventRecord {
- amountReserveBalance: string;
- amountExpected: string;
- reservePub: string;
- timestamp: Timestamp;
- reserveUpdateId: string;
- newHistoryTransactions: ReserveTransaction[];
-}
-
-export interface AllowedAuditorInfo {
- auditorBaseUrl: string;
- auditorPub: string;
-}
-
-export interface AllowedExchangeInfo {
- exchangeBaseUrl: string;
- exchangePub: string;
-}
-
-/**
- * Data extracted from the contract terms that is relevant for payment
- * processing in the wallet.
- */
-export interface WalletContractData {
- products?: Product[];
- summaryI18n: { [lang_tag: string]: string } | undefined;
-
- /**
- * Fulfillment URL, or the empty string if the order has no fulfillment URL.
- *
- * Stored as a non-nullable string as we use this field for IndexedDB indexing.
- */
- fulfillmentUrl: string;
-
- contractTermsHash: string;
- fulfillmentMessage?: string;
- fulfillmentMessageI18n?: InternationalizedString;
- merchantSig: string;
- merchantPub: string;
- merchant: MerchantInfo;
- amount: AmountJson;
- orderId: string;
- merchantBaseUrl: string;
- summary: string;
- autoRefund: Duration | undefined;
- maxWireFee: AmountJson;
- wireFeeAmortization: number;
- payDeadline: Timestamp;
- refundDeadline: Timestamp;
- allowedAuditors: AllowedAuditorInfo[];
- allowedExchanges: AllowedExchangeInfo[];
- timestamp: Timestamp;
- wireMethod: string;
- wireInfoHash: string;
- maxDepositFee: AmountJson;
-}
-
-
-export enum AbortStatus {
- None = "none",
- AbortRefund = "abort-refund",
- AbortFinished = "abort-finished",
-}
-
-/**
- * Record that stores status information about one purchase, starting from when
- * the customer accepts a proposal. Includes refund status if applicable.
- */
-export interface PurchaseRecord {
- /**
- * Proposal ID for this purchase. Uniquely identifies the
- * purchase and the proposal.
- */
- proposalId: string;
-
- /**
- * Private key for the nonce.
- */
- noncePriv: string;
-
- /**
- * Public key for the nonce.
- */
- noncePub: string;
-
- /**
- * Downloaded and parsed proposal data.
- */
- download: ProposalDownload;
-
- /**
- * Deposit permissions, available once the user has accepted the payment.
- *
- * This value is cached and derived from payCoinSelection.
- */
- coinDepositPermissions: CoinDepositPermission[] | undefined;
-
- payCoinSelection: PayCoinSelection;
-
- /**
- * Pending removals from pay coin selection.
- *
- * Used when a the pay coin selection needs to be changed
- * because a coin became known as double-spent or invalid,
- * but a new coin selection can't immediately be done, as
- * there is not enough balance (e.g. when waiting for a refresh).
- */
- pendingRemovedCoinPubs?: string[];
-
- totalPayCost: AmountJson;
-
- /**
- * Timestamp of the first time that sending a payment to the merchant
- * for this purchase was successful.
- */
- timestampFirstSuccessfulPay: Timestamp | undefined;
-
- merchantPaySig: string | undefined;
-
- /**
- * When was the purchase made?
- * Refers to the time that the user accepted.
- */
- timestampAccept: Timestamp;
-
- /**
- * Pending refunds for the purchase. A refund is pending
- * when the merchant reports a transient error from the exchange.
- */
- refunds: { [refundKey: string]: WalletRefundItem };
-
- /**
- * When was the last refund made?
- * Set to 0 if no refund was made on the purchase.
- */
- timestampLastRefundStatus: Timestamp | undefined;
-
- /**
- * Last session signature that we submitted to /pay (if any).
- */
- lastSessionId: string | undefined;
-
- /**
- * Set for the first payment, or on re-plays.
- */
- paymentSubmitPending: boolean;
-
- /**
- * Do we need to query the merchant for the refund status
- * of the payment?
- */
- refundQueryRequested: boolean;
-
- abortStatus: AbortStatus;
-
- payRetryInfo: RetryInfo;
-
- lastPayError: TalerErrorDetails | undefined;
-
- /**
- * Retry information for querying the refund status with the merchant.
- */
- refundStatusRetryInfo: RetryInfo;
-
- /**
- * Last error (or undefined) for querying the refund status with the merchant.
- */
- lastRefundStatusError: TalerErrorDetails | undefined;
-
- /**
- * Continue querying the refund status until this deadline has expired.
- */
- autoRefundDeadline: Timestamp | undefined;
-}
-
-/**
- * Configuration key/value entries to configure
- * the wallet.
- */
-export interface ConfigRecord<T> {
- key: string;
- value: T;
-}
-
-/**
- * FIXME: Eliminate this in favor of DenomSelectionState.
- */
-export interface DenominationSelectionInfo {
- totalCoinValue: AmountJson;
- totalWithdrawCost: AmountJson;
- selectedDenoms: {
- /**
- * How many times do we withdraw this denomination?
- */
- count: number;
- denom: DenominationRecord;
- }[];
-}
-
-/**
- * Selected denominations withn some extra info.
- */
-export interface DenomSelectionState {
- totalCoinValue: AmountJson;
- totalWithdrawCost: AmountJson;
- selectedDenoms: {
- denomPubHash: string;
- count: number;
- }[];
-}
-
-/**
- * Group of withdrawal operations that need to be executed.
- * (Either for a normal withdrawal or from a tip.)
- *
- * The withdrawal group record is only created after we know
- * the coin selection we want to withdraw.
- */
-export interface WithdrawalGroupRecord {
- withdrawalGroupId: string;
-
- /**
- * Secret seed used to derive planchets.
- */
- secretSeed: string;
-
- reservePub: string;
-
- exchangeBaseUrl: string;
-
- /**
- * When was the withdrawal operation started started?
- * Timestamp in milliseconds.
- */
- timestampStart: Timestamp;
-
- /**
- * When was the withdrawal operation completed?
- */
- timestampFinish?: Timestamp;
-
- /**
- * Amount including fees (i.e. the amount subtracted from the
- * reserve to withdraw all coins in this withdrawal session).
- */
- rawWithdrawalAmount: AmountJson;
-
- denomsSel: DenomSelectionState;
-
- /**
- * Retry info, always present even on completed operations so that indexing works.
- */
- retryInfo: RetryInfo;
-
- lastError: TalerErrorDetails | undefined;
-}
-
-export interface BankWithdrawUriRecord {
- /**
- * The withdraw URI we got from the bank.
- */
- talerWithdrawUri: string;
-
- /**
- * Reserve that was created for the withdraw URI.
- */
- reservePub: string;
-}
-
-/**
- * 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.
- */
-export interface RecoupGroupRecord {
- /**
- * Unique identifier for the recoup group record.
- */
- recoupGroupId: string;
-
- timestampStarted: Timestamp;
-
- timestampFinished: Timestamp | undefined;
-
- /**
- * Public keys that identify the coins being recouped
- * as part of this session.
- *
- * (Structured like this to enable multiEntry indexing in IndexedDB.)
- */
- coinPubs: string[];
-
- /**
- * Array of flags to indicate whether the recoup finished on each individual coin.
- */
- recoupFinishedPerCoin: boolean[];
-
- /**
- * We store old amount (i.e. before recoup) of recouped coins here,
- * as the balance of a recouped coin is set to zero when the
- * recoup group is created.
- */
- oldAmountPerCoin: AmountJson[];
-
- /**
- * Public keys of coins that should be scheduled for refreshing
- * after all individual recoups are done.
- */
- scheduleRefreshCoins: string[];
-
- /**
- * Retry info.
- */
- retryInfo: RetryInfo;
-
- /**
- * Last error that occured, if any.
- */
- lastError: TalerErrorDetails | undefined;
-}
-
-export enum ImportPayloadType {
- CoreSchema = "core-schema",
-}
-
-export enum BackupProviderStatus {
- PaymentRequired = "payment-required",
- Ready = "ready",
-}
-
-export interface BackupProviderRecord {
- baseUrl: string;
-
- /**
- * Terms of service of the provider.
- * Might be unavailable in the DB in certain situations
- * (such as loading a recovery document).
- */
- terms?: {
- supportedProtocolVersion: string;
- annualFee: AmountString;
- storageLimitInMegabytes: number;
- };
-
- active: boolean;
-
- /**
- * Hash of the last encrypted backup that we already merged
- * or successfully uploaded ourselves.
- */
- lastBackupHash?: string;
-
- /**
- * Clock of the last backup that we already
- * merged.
- */
- lastBackupClock?: number;
-
- lastBackupTimestamp?: Timestamp;
-
- /**
- * Proposal that we're currently trying to pay for.
- *
- * (Also included in paymentProposalIds.)
- */
- currentPaymentProposalId?: string;
-
- /**
- * Proposals that were used to pay (or attempt to pay) the provider.
- *
- * Stored to display a history of payments to the provider, and
- * to make sure that the wallet isn't overpaying.
- */
- paymentProposalIds: string[];
-
- /**
- * Next scheduled backup.
- */
- nextBackupTimestamp?: Timestamp;
-
- /**
- * Retry info.
- */
- retryInfo: RetryInfo;
-
- /**
- * Last error that occured, if any.
- */
- lastError: TalerErrorDetails | undefined;
-}
-
-/**
- * Group of deposits made by the wallet.
- */
-export interface DepositGroupRecord {
- depositGroupId: string;
-
- merchantPub: string;
- merchantPriv: string;
-
- noncePriv: string;
- noncePub: string;
-
- /**
- * Wire information used by all deposits in this
- * deposit group.
- */
- wire: {
- payto_uri: string;
- salt: string;
- };
-
- /**
- * Verbatim contract terms.
- */
- contractTermsRaw: ContractTerms;
-
- contractTermsHash: string;
-
- payCoinSelection: PayCoinSelection;
-
- totalPayCost: AmountJson;
-
- effectiveDepositAmount: AmountJson;
-
- depositedPerCoin: boolean[];
-
- timestampCreated: Timestamp;
-
- timestampFinished: Timestamp | undefined;
-
- lastError: TalerErrorDetails | undefined;
-
- /**
- * Retry info.
- */
- retryInfo: RetryInfo;
-}
-
-/**
- * Record for a deposits that the wallet observed
- * as a result of double spending, but which is not
- * present in the wallet's own database otherwise.
- */
-export interface GhostDepositGroupRecord {
- /**
- * When multiple deposits for the same contract terms hash
- * have a different timestamp, we choose the earliest one.
- */
- timestamp: Timestamp;
-
- contractTermsHash: string;
-
- deposits: {
- coinPub: string;
- amount: AmountString;
- timestamp: Timestamp;
- depositFee: AmountString;
- merchantPub: string;
- coinSig: string;
- wireHash: string;
- }[];
-}
-
-class ExchangesStore extends Store<"exchanges", ExchangeRecord> {
- constructor() {
- super("exchanges", { keyPath: "baseUrl" });
- }
-}
-
-class CoinsStore extends Store<"coins", CoinRecord> {
- constructor() {
- super("coins", { keyPath: "coinPub" });
- }
-
- exchangeBaseUrlIndex = new Index<
- "coins",
- "exchangeBaseUrl",
- string,
- CoinRecord
- >(this, "exchangeBaseUrl", "exchangeBaseUrl");
-
- denomPubHashIndex = new Index<
- "coins",
- "denomPubHashIndex",
- string,
- CoinRecord
- >(this, "denomPubHashIndex", "denomPubHash");
-
- coinEvHashIndex = new Index<"coins", "coinEvHashIndex", string, CoinRecord>(
- this,
- "coinEvHashIndex",
- "coinEvHash",
- );
-}
-
-class ProposalsStore extends Store<"proposals", ProposalRecord> {
- constructor() {
- super("proposals", { keyPath: "proposalId" });
- }
- urlAndOrderIdIndex = new Index<
- "proposals",
- "urlIndex",
- string,
- ProposalRecord
- >(this, "urlIndex", ["merchantBaseUrl", "orderId"]);
-}
-
-class PurchasesStore extends Store<"purchases", PurchaseRecord> {
- constructor() {
- super("purchases", { keyPath: "proposalId" });
- }
-
- fulfillmentUrlIndex = new Index<
- "purchases",
- "fulfillmentUrlIndex",
- string,
- PurchaseRecord
- >(this, "fulfillmentUrlIndex", "download.contractData.fulfillmentUrl");
-
- orderIdIndex = new Index<"purchases", "orderIdIndex", string, PurchaseRecord>(
- this,
- "orderIdIndex",
- ["download.contractData.merchantBaseUrl", "download.contractData.orderId"],
- );
-}
-
-class DenominationsStore extends Store<"denominations", DenominationRecord> {
- constructor() {
- // cast needed because of bug in type annotations
- super("denominations", {
- keyPath: (["exchangeBaseUrl", "denomPubHash"] as any) as IDBKeyPath,
- });
- }
- exchangeBaseUrlIndex = new Index<
- "denominations",
- "exchangeBaseUrlIndex",
- string,
- DenominationRecord
- >(this, "exchangeBaseUrlIndex", "exchangeBaseUrl");
-}
-
-class CurrenciesStore extends Store<"currencies", CurrencyRecord> {
- constructor() {
- super("currencies", { keyPath: "name" });
- }
-}
-
-class ConfigStore extends Store<"config", ConfigRecord<any>> {
- constructor() {
- super("config", { keyPath: "key" });
- }
-}
-
-class ReservesStore extends Store<"reserves", ReserveRecord> {
- constructor() {
- super("reserves", { keyPath: "reservePub" });
- }
-}
-
-class TipsStore extends Store<"tips", TipRecord> {
- constructor() {
- super("tips", { keyPath: "walletTipId" });
- }
- // Added in version 2
- byMerchantTipIdAndBaseUrl = new Index<
- "tips",
- "tipsByMerchantTipIdAndOriginIndex",
- [string, string],
- TipRecord
- >(this, "tipsByMerchantTipIdAndOriginIndex", [
- "merchantTipId",
- "merchantBaseUrl",
- ]);
-}
-
-class WithdrawalGroupsStore extends Store<
- "withdrawals",
- WithdrawalGroupRecord
-> {
- constructor() {
- super("withdrawals", { keyPath: "withdrawalGroupId" });
- }
- byReservePub = new Index<
- "withdrawals",
- "withdrawalsByReserveIndex",
- string,
- WithdrawalGroupRecord
- >(this, "withdrawalsByReserveIndex", "reservePub");
-}
-
-class PlanchetsStore extends Store<"planchets", PlanchetRecord> {
- constructor() {
- super("planchets", { keyPath: "coinPub" });
- }
- byGroupAndIndex = new Index<
- "planchets",
- "withdrawalGroupAndCoinIdxIndex",
- string,
- PlanchetRecord
- >(this, "withdrawalGroupAndCoinIdxIndex", ["withdrawalGroupId", "coinIdx"]);
- byGroup = new Index<
- "planchets",
- "withdrawalGroupIndex",
- string,
- PlanchetRecord
- >(this, "withdrawalGroupIndex", "withdrawalGroupId");
-
- coinEvHashIndex = new Index<
- "planchets",
- "coinEvHashIndex",
- string,
- PlanchetRecord
- >(this, "coinEvHashIndex", "coinEvHash");
-}
-
-/**
- * This store is effectively a materialized index for
- * reserve records that are for a bank-integrated withdrawal.
- */
-class BankWithdrawUrisStore extends Store<
- "bankWithdrawUris",
- BankWithdrawUriRecord
-> {
- constructor() {
- super("bankWithdrawUris", { keyPath: "talerWithdrawUri" });
- }
-}
-
-/**
- */
-class BackupProvidersStore extends Store<
- "backupProviders",
- BackupProviderRecord
-> {
- constructor() {
- super("backupProviders", { keyPath: "baseUrl" });
- }
-}
-
-class DepositGroupsStore extends Store<"depositGroups", DepositGroupRecord> {
- constructor() {
- super("depositGroups", { keyPath: "depositGroupId" });
- }
-}
-
-/**
- * The stores and indices for the wallet database.
- */
-export const Stores = {
- coins: new CoinsStore(),
- config: new ConfigStore(),
- currencies: new CurrenciesStore(),
- denominations: new DenominationsStore(),
- exchanges: new ExchangesStore(),
- proposals: new ProposalsStore(),
- refreshGroups: new Store<"refreshGroups", RefreshGroupRecord>(
- "refreshGroups",
- {
- keyPath: "refreshGroupId",
- },
- ),
- recoupGroups: new Store<"recoupGroups", RecoupGroupRecord>("recoupGroups", {
- keyPath: "recoupGroupId",
- }),
- reserves: new ReservesStore(),
- purchases: new PurchasesStore(),
- tips: new TipsStore(),
- withdrawalGroups: new WithdrawalGroupsStore(),
- planchets: new PlanchetsStore(),
- bankWithdrawUris: new BankWithdrawUrisStore(),
- backupProviders: new BackupProvidersStore(),
- depositGroups: new DepositGroupsStore(),
- ghostDepositGroups: new Store<"ghostDepositGroups", GhostDepositGroupRecord>(
- "ghostDepositGroups",
- {
- keyPath: "contractTermsHash",
- },
- ),
-};
-
-export class MetaConfigStore extends Store<"metaConfig", ConfigRecord<any>> {
- constructor() {
- super("metaConfig", { keyPath: "key" });
- }
-}
-
-export const MetaStores = {
- metaConfig: new MetaConfigStore(),
-};
diff --git a/packages/taler-wallet-core/src/util/RequestThrottler.ts b/packages/taler-wallet-core/src/util/RequestThrottler.ts
index 0bdd7cab..b38e948f 100644
--- a/packages/taler-wallet-core/src/util/RequestThrottler.ts
+++ b/packages/taler-wallet-core/src/util/RequestThrottler.ts
@@ -25,7 +25,7 @@ import {
getTimestampNow,
timestampDifference,
timestampCmp,
-} from "../util/time";
+} from "@gnu-taler/taler-util";
import { URL } from "./url";
import { Logger } from "./logging";
diff --git a/packages/taler-wallet-core/src/util/coinSelection-test.ts b/packages/taler-wallet-core/src/util/coinSelection-test.ts
index 3ac718aa..962a1483 100644
--- a/packages/taler-wallet-core/src/util/coinSelection-test.ts
+++ b/packages/taler-wallet-core/src/util/coinSelection-test.ts
@@ -17,8 +17,8 @@
/**
* Imports.
*/
+import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import test from "ava";
-import { AmountJson, Amounts } from "..";
import { AvailableCoinInfo, selectPayCoins } from "./coinSelection";
function a(x: string): AmountJson {
diff --git a/packages/taler-wallet-core/src/util/coinSelection.ts b/packages/taler-wallet-core/src/util/coinSelection.ts
index d32ab6f3..e9cec614 100644
--- a/packages/taler-wallet-core/src/util/coinSelection.ts
+++ b/packages/taler-wallet-core/src/util/coinSelection.ts
@@ -23,7 +23,7 @@
/**
* Imports.
*/
-import { AmountJson, Amounts } from "./amounts";
+import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import { strcmp } from "./helpers";
/**
diff --git a/packages/taler-wallet-core/src/util/helpers.ts b/packages/taler-wallet-core/src/util/helpers.ts
index f5c20431..36ecc83f 100644
--- a/packages/taler-wallet-core/src/util/helpers.ts
+++ b/packages/taler-wallet-core/src/util/helpers.ts
@@ -21,8 +21,7 @@
/**
* Imports.
*/
-import { AmountJson } from "./amounts";
-import * as Amounts from "./amounts";
+import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import { URL } from "./url";
/**
diff --git a/packages/taler-wallet-core/src/util/http.ts b/packages/taler-wallet-core/src/util/http.ts
index 73f08d40..ee6ff80a 100644
--- a/packages/taler-wallet-core/src/util/http.ts
+++ b/packages/taler-wallet-core/src/util/http.ts
@@ -24,19 +24,18 @@
/**
* Imports
*/
-import { Codec } from "./codec";
import { OperationFailedError, makeErrorDetails } from "../operations/errors";
-import { TalerErrorCode } from "../TalerErrorCode";
import { Logger } from "./logging";
import {
Duration,
Timestamp,
getTimestampNow,
timestampAddDuration,
- timestampMin,
timestampMax,
-} from "./time";
-import { TalerErrorDetails } from "..";
+ TalerErrorDetails,
+ Codec,
+} from "@gnu-taler/taler-util";
+import { TalerErrorCode } from "@gnu-taler/taler-util";
const logger = new Logger("http.ts");
diff --git a/packages/taler-wallet-core/src/util/retries.ts b/packages/taler-wallet-core/src/util/retries.ts
index 8be78cfc..54bb0b2e 100644
--- a/packages/taler-wallet-core/src/util/retries.ts
+++ b/packages/taler-wallet-core/src/util/retries.ts
@@ -21,7 +21,7 @@
/**
* Imports.
*/
-import { Timestamp, Duration, getTimestampNow } from "./time";
+import { Timestamp, Duration, getTimestampNow } from "@gnu-taler/taler-util";
export interface RetryInfo {
firstTry: Timestamp;
diff --git a/packages/taler-wallet-core/src/util/testvectors.ts b/packages/taler-wallet-core/src/util/testvectors.ts
deleted file mode 100644
index 57ac6e99..00000000
--- a/packages/taler-wallet-core/src/util/testvectors.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2020 Taler Systems S.A.
-
- GNU Taler is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-/**
- * Imports
- */
-import {
- setupRefreshPlanchet,
- encodeCrock,
- getRandomBytes,
-} from "../crypto/talerCrypto";
-
-export function printTestVectors() {
- const secretSeed = getRandomBytes(64);
- const coinIndex = Math.ceil(Math.random() * 100);
- const p = setupRefreshPlanchet(secretSeed, coinIndex);
- console.log("setupRefreshPlanchet");
- console.log(` (in) secret seed: ${encodeCrock(secretSeed)}`);
- console.log(` (in) coin index: ${coinIndex}`);
- console.log(` (out) blinding secret: ${encodeCrock(p.bks)}`);
- console.log(` (out) coin priv: ${encodeCrock(p.coinPriv)}`);
- console.log(` (out) coin pub: ${encodeCrock(p.coinPub)}`);
-}
diff --git a/packages/taler-wallet-core/src/util/timer.ts b/packages/taler-wallet-core/src/util/timer.ts
index 75fb5c9c..9133bd57 100644
--- a/packages/taler-wallet-core/src/util/timer.ts
+++ b/packages/taler-wallet-core/src/util/timer.ts
@@ -24,7 +24,7 @@
/**
* Imports.
*/
-import { Duration } from "./time";
+import { Duration } from "@gnu-taler/taler-util";
import { Logger } from "./logging";
const logger = new Logger("timer.ts");
diff --git a/packages/taler-wallet-core/src/util/wire.ts b/packages/taler-wallet-core/src/util/wire.ts
deleted file mode 100644
index 95e324f3..00000000
--- a/packages/taler-wallet-core/src/util/wire.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- This file is part of TALER
- (C) 2017 GNUnet e.V.
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-/**
- * Display and manipulate wire information.
- *
- * Right now, all types are hard-coded. In the future, there might be plugins / configurable
- * methods or support for the "payto://" URI scheme.
- */
-
-/**
- * Imports.
- */
-import * as i18n from "../i18n";
-
-/**
- * Short summary of the wire information.
- *
- * Might abbreviate and return the same summary for different
- * wire details.
- */
-export function summarizeWire(w: any): string {
- if (!w.type) {
- return i18n.str`Invalid Wire`;
- }
- switch (w.type.toLowerCase()) {
- case "test":
- if (!w.account_number && w.account_number !== 0) {
- return i18n.str`Invalid Test Wire Detail`;
- }
- if (!w.bank_uri) {
- return i18n.str`Invalid Test Wire Detail`;
- }
- return i18n.str`Test Wire Acct #${w.account_number} on ${w.bank_uri}`;
- default:
- return i18n.str`Unknown Wire Detail`;
- }
-}
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
index 26f10600..3e34efe9 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -22,13 +22,12 @@
/**
* Imports.
*/
-import { codecForAny, TalerErrorCode } from ".";
+import { BackupRecovery, codecForAny, TalerErrorCode } from "@gnu-taler/taler-util";
import { CryptoWorkerFactory } from "./crypto/workers/cryptoApi";
import {
addBackupProvider,
AddBackupProviderRequest,
BackupInfo,
- BackupRecovery,
codecForAddBackupProviderRequest,
exportBackupEncrypted,
getBackupInfo,
@@ -106,19 +105,19 @@ import {
ReserveRecord,
ReserveRecordStatus,
Stores,
-} from "./types/dbTypes";
-import { NotificationType, WalletNotification } from "./types/notifications";
+} from "./db.js";
+import { NotificationType, WalletNotification } from "@gnu-taler/taler-util";
import {
PendingOperationInfo,
PendingOperationsResponse,
PendingOperationType,
-} from "./types/pendingTypes";
-import { CoinDumpJson } from "./types/talerTypes";
+} from "./pending-types.js";
+import { CoinDumpJson } from "@gnu-taler/taler-util";
import {
codecForTransactionsRequest,
TransactionsRequest,
TransactionsResponse,
-} from "./types/transactionsTypes";
+} from "@gnu-taler/taler-util";
import {
AcceptManualWithdrawalResult,
AcceptWithdrawalResponse,
@@ -166,15 +165,15 @@ import {
TrackDepositGroupResponse,
WithdrawTestBalanceRequest,
WithdrawUriInfoResponse,
-} from "./types/walletTypes";
-import { AmountJson, Amounts } from "./util/amounts";
+} from "@gnu-taler/taler-util";
+import { AmountJson, Amounts } from "@gnu-taler/taler-util";
import { assertUnreachable } from "./util/assertUnreachable";
import { AsyncOpMemoSingle } from "./util/asyncMemo";
import { HttpRequestLibrary } from "./util/http";
import { Logger } from "./util/logging";
import { AsyncCondition } from "./util/promiseUtils";
import { Database } from "./util/query";
-import { Duration, durationMin } from "./util/time";
+import { Duration, durationMin } from "@gnu-taler/taler-util";
import { TimerGroup } from "./util/timer";
const builtinCurrencies: CurrencyRecord[] = [
diff --git a/packages/taler-wallet-core/tsconfig.json b/packages/taler-wallet-core/tsconfig.json
index e3bfd31a..c8f5c23b 100644
--- a/packages/taler-wallet-core/tsconfig.json
+++ b/packages/taler-wallet-core/tsconfig.json
@@ -26,7 +26,10 @@
"references": [
{
"path": "../idb-bridge/"
+ },
+ {
+ "path": "../taler-util/"
}
],
- "include": ["src/**/*"],
+ "include": ["src/**/*"]
}