gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-core] branch master updated: use the new wallet core API i


From: gnunet
Subject: [taler-wallet-core] branch master updated: use the new wallet core API interface in all tests
Date: Thu, 17 Jun 2021 13:35:11 +0200

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

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

The following commit(s) were added to refs/heads/master by this push:
     new 5df7ddba use the new wallet core API interface in all tests
5df7ddba is described below

commit 5df7ddba97aa4482c781bfe8e87f60c3bc195ae4
Author: Florian Dold <florian@dold.me>
AuthorDate: Thu Jun 17 13:34:59 2021 +0200

    use the new wallet core API interface in all tests
---
 .../src/integrationtests/harness.ts                | 256 +++------------------
 .../src/integrationtests/helpers.ts                |  21 +-
 .../src/integrationtests/test-claim-loop.ts        |   3 +-
 .../src/integrationtests/test-deposit.ts           |  19 +-
 .../integrationtests/test-exchange-management.ts   |  49 ++--
 .../src/integrationtests/test-fee-regression.ts    |   5 +-
 .../src/integrationtests/test-libeufin-basic.ts    |  26 +--
 .../test-merchant-exchange-confusion.ts            |  19 +-
 .../integrationtests/test-merchant-longpolling.ts  |  20 +-
 .../integrationtests/test-merchant-refund-api.ts   |  44 ++--
 .../src/integrationtests/test-pay-abort.ts         |  19 +-
 .../src/integrationtests/test-pay-paid.ts          |  29 ++-
 .../src/integrationtests/test-payment-claim.ts     |  18 +-
 .../src/integrationtests/test-payment-fault.ts     |  23 +-
 .../integrationtests/test-payment-forgettable.ts   |   2 +-
 .../integrationtests/test-payment-idempotency.ts   |  31 ++-
 .../src/integrationtests/test-payment-multiple.ts  |  10 +-
 .../src/integrationtests/test-payment-transient.ts |  29 ++-
 .../src/integrationtests/test-paywall-flow.ts      |  37 ++-
 .../src/integrationtests/test-refund-auto.ts       |  14 +-
 .../src/integrationtests/test-refund-gone.ts       |  18 +-
 .../integrationtests/test-refund-incremental.ts    |  26 ++-
 .../src/integrationtests/test-refund.ts            |  26 +--
 .../src/integrationtests/test-revocation.ts        |  21 +-
 .../test-timetravel-autorefresh.ts                 |  11 +-
 .../integrationtests/test-timetravel-withdraw.ts   |   6 +-
 .../src/integrationtests/test-tipping.ts           |  12 +-
 .../integrationtests/test-wallet-backup-basic.ts   |  40 ++--
 .../test-wallet-backup-doublespend.ts              |  46 ++--
 .../src/integrationtests/test-wallettesting.ts     |  11 +-
 .../integrationtests/test-withdrawal-abort-bank.ts |  22 +-
 .../test-withdrawal-bank-integrated.ts             |  11 +-
 .../src/integrationtests/test-withdrawal-manual.ts |  14 +-
 packages/taler-wallet-core/src/wallet-api-types.ts |  26 ++-
 packages/taler-wallet-core/src/wallet.ts           |   2 +
 35 files changed, 462 insertions(+), 504 deletions(-)

diff --git a/packages/taler-wallet-cli/src/integrationtests/harness.ts 
b/packages/taler-wallet-cli/src/integrationtests/harness.ts
index b0a538a7..ffaffca1 100644
--- a/packages/taler-wallet-cli/src/integrationtests/harness.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/harness.ts
@@ -51,6 +51,8 @@ import {
   getRandomBytes,
   openPromise,
   OperationFailedError,
+  WalletApiOperation,
+  WalletCoreApiClient,
 } from "@gnu-taler/taler-wallet-core";
 import {
   AmountJson,
@@ -1624,6 +1626,7 @@ function shellWrap(s: string) {
 
 export class WalletCli {
   private currentTimetravel: Duration | undefined;
+  private _client: WalletCoreApiClient;
 
   setTimetravel(d: Duration | undefined) {
     this.currentTimetravel = d;
@@ -1640,7 +1643,29 @@ export class WalletCli {
   constructor(
     private globalTestState: GlobalTestState,
     private name: string = "default",
-  ) {}
+  ) {
+    const self = this;
+    this._client = {
+      async call(op: any, payload: any): Promise<any> {
+        const resp = await sh(
+          self.globalTestState,
+          `wallet-${self.name}`,
+          `taler-wallet-cli ${
+            self.timetravelArg ?? ""
+          } --no-throttle --wallet-db '${self.dbfile}' api '${op}' ${shellWrap(
+            JSON.stringify(payload),
+          )}`,
+        );
+        console.log(resp);
+        const ar = JSON.parse(resp) as CoreApiResponse;
+        if (ar.type === "error") {
+          throw new OperationFailedError(ar.error);
+        } else {
+          return ar.result;
+        }
+      },
+    };
+  }
 
   get dbfile(): string {
     return this.globalTestState.testDir + `/walletdb-${this.name}.json`;
@@ -1658,21 +1683,8 @@ export class WalletCli {
     return [];
   }
 
-  async apiRequest(
-    request: string,
-    payload: unknown,
-  ): Promise<CoreApiResponse> {
-    const resp = await sh(
-      this.globalTestState,
-      `wallet-${this.name}`,
-      `taler-wallet-cli ${
-        this.timetravelArg ?? ""
-      } --no-throttle --wallet-db '${this.dbfile}' api '${request}' 
${shellWrap(
-        JSON.stringify(payload),
-      )}`,
-    );
-    console.log(resp);
-    return JSON.parse(resp) as CoreApiResponse;
+  get client(): WalletCoreApiClient {
+    return this._client;
   }
 
   async runUntilDone(args: { maxRetries?: number } = {}): Promise<void> {
@@ -1705,216 +1717,4 @@ export class WalletCli {
       ],
     );
   }
-
-  async applyRefund(req: ApplyRefundRequest): Promise<ApplyRefundResponse> {
-    const resp = await this.apiRequest("applyRefund", req);
-    if (resp.type === "response") {
-      return codecForApplyRefundResponse().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async preparePay(req: PreparePayRequest): Promise<PreparePayResult> {
-    const resp = await this.apiRequest("preparePay", req);
-    if (resp.type === "response") {
-      return codecForPreparePayResult().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async createDepositGroup(
-    req: CreateDepositGroupRequest,
-  ): Promise<CreateDepositGroupResponse> {
-    const resp = await this.apiRequest("createDepositGroup", req);
-    if (resp.type === "response") {
-      return resp.result as CreateDepositGroupResponse;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async abortFailedPayWithRefund(
-    req: AbortPayWithRefundRequest,
-  ): Promise<void> {
-    const resp = await this.apiRequest("abortFailedPayWithRefund", req);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async confirmPay(req: ConfirmPayRequest): Promise<ConfirmPayResult> {
-    const resp = await this.apiRequest("confirmPay", req);
-    if (resp.type === "response") {
-      return codecForConfirmPayResult().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async prepareTip(req: PrepareTipRequest): Promise<PrepareTipResult> {
-    const resp = await this.apiRequest("prepareTip", req);
-    if (resp.type === "response") {
-      return codecForPrepareTipResult().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async acceptTip(req: AcceptTipRequest): Promise<void> {
-    const resp = await this.apiRequest("acceptTip", req);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async dumpCoins(): Promise<CoinDumpJson> {
-    const resp = await this.apiRequest("dumpCoins", {});
-    if (resp.type === "response") {
-      return codecForAny().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async addExchange(req: AddExchangeRequest): Promise<void> {
-    const resp = await this.apiRequest("addExchange", req);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async forceUpdateExchange(req: ForceExchangeUpdateRequest): Promise<void> {
-    const resp = await this.apiRequest("addExchange", {
-      exchangeBaseUrl: req.exchangeBaseUrl,
-      forceUpdate: true,
-    });
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async forceRefresh(req: ForceRefreshRequest): Promise<void> {
-    const resp = await this.apiRequest("forceRefresh", req);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async listExchanges(): Promise<ExchangesListRespose> {
-    const resp = await this.apiRequest("listExchanges", {});
-    if (resp.type === "response") {
-      return codecForExchangesListResponse().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async getBalances(): Promise<BalancesResponse> {
-    const resp = await this.apiRequest("getBalances", {});
-    if (resp.type === "response") {
-      return codecForBalancesResponse().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async getPendingOperations(): Promise<PendingOperationsResponse> {
-    const resp = await this.apiRequest("getPendingOperations", {});
-    if (resp.type === "response") {
-      // FIXME: validate properly!
-      return codecForAny().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async getTransactions(): Promise<TransactionsResponse> {
-    const resp = await this.apiRequest("getTransactions", {});
-    if (resp.type === "response") {
-      return codecForTransactionsResponse().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async trackDepositGroup(
-    req: TrackDepositGroupRequest,
-  ): Promise<TrackDepositGroupResponse> {
-    const resp = await this.apiRequest("trackDepositGroup", req);
-    if (resp.type === "response") {
-      return resp.result as TrackDepositGroupResponse;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async runIntegrationTest(args: IntegrationTestArgs): Promise<void> {
-    const resp = await this.apiRequest("runIntegrationTest", args);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async testPay(args: TestPayArgs): Promise<void> {
-    const resp = await this.apiRequest("testPay", args);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async withdrawTestBalance(args: WithdrawTestBalanceRequest): Promise<void> {
-    const resp = await this.apiRequest("withdrawTestBalance", args);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async getWithdrawalDetailsForUri(
-    req: GetWithdrawalDetailsForUriRequest,
-  ): Promise<WithdrawUriInfoResponse> {
-    const resp = await this.apiRequest("getWithdrawalDetailsForUri", req);
-    if (resp.type === "response") {
-      return codecForWithdrawUriInfoResponse().decode(resp.result);
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async addBackupProvider(req: AddBackupProviderRequest): Promise<void> {
-    const resp = await this.apiRequest("addBackupProvider", req);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async getBackupInfo(): Promise<BackupInfo> {
-    const resp = await this.apiRequest("getBackupInfo", {});
-    if (resp.type === "response") {
-      return resp.result as BackupInfo;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async exportBackupRecovery(): Promise<BackupRecovery> {
-    const resp = await this.apiRequest("exportBackupRecovery", {});
-    if (resp.type === "response") {
-      return resp.result as BackupRecovery;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async importBackupRecovery(req: RecoveryLoadRequest): Promise<void> {
-    const resp = await this.apiRequest("importBackupRecovery", req);
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
-
-  async runBackupCycle(): Promise<void> {
-    const resp = await this.apiRequest("runBackupCycle", {});
-    if (resp.type === "response") {
-      return;
-    }
-    throw new OperationFailedError(resp.error);
-  }
 }
diff --git a/packages/taler-wallet-cli/src/integrationtests/helpers.ts 
b/packages/taler-wallet-cli/src/integrationtests/helpers.ts
index ab8939ee..aa9164c1 100644
--- a/packages/taler-wallet-cli/src/integrationtests/helpers.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/helpers.ts
@@ -50,6 +50,7 @@ import {
   MerchantPrivateApi,
   HarnessExchangeBankAccount,
 } from "./harness.js";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 export interface SimpleTestEnvironment {
   commonDb: DbInfo;
@@ -265,10 +266,9 @@ export async function startWithdrawViaBank(
 
   // Hand it to the wallet
 
-  const r1 = await wallet.apiRequest("getWithdrawalDetailsForUri", {
+  await wallet.client.call(WalletApiOperation.GetWithdrawalDetailsForUri, {
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r1.type === "response");
 
   await wallet.runPending();
 
@@ -278,11 +278,10 @@ export async function startWithdrawViaBank(
 
   // Withdraw
 
-  const r2 = await wallet.apiRequest("acceptBankIntegratedWithdrawal", {
+  await wallet.client.call(WalletApiOperation.AcceptBankIntegratedWithdrawal, {
     exchangeBaseUrl: exchange.baseUrl,
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r2.type === "response");
 }
 
 /**
@@ -305,8 +304,7 @@ export async function withdrawViaBank(
 
   // Check balance
 
-  const balApiResp = await wallet.apiRequest("getBalances", {});
-  t.assertTrue(balApiResp.type === "response");
+  await wallet.client.call(WalletApiOperation.GetBalances, {});
 }
 
 export async function applyTimeTravel(
@@ -365,15 +363,18 @@ export async function makeTestPayment(
 
   // Make wallet pay for the order
 
-  const preparePayResult = await wallet.preparePay({
-    talerPayUri: orderStatus.taler_pay_uri,
-  });
+  const preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.PaymentPossible,
   );
 
-  const r2 = await wallet.confirmPay({
+  const r2 = await wallet.client.call(WalletApiOperation.ConfirmPay, {
     proposalId: preparePayResult.proposalId,
   });
 
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts
index 4a4cd555..46882d5c 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-claim-loop.ts
@@ -20,6 +20,7 @@
 import { GlobalTestState, MerchantPrivateApi } from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 import { URL } from "url";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for the merchant's order lifecycle.
@@ -61,7 +62,7 @@ export async function runClaimLoopTest(t: GlobalTestState) {
   // Make wallet claim the unpaid order.
   t.assertTrue(orderStatusBefore.order_status === "unpaid");
   const talerPayUri = orderStatusBefore.taler_pay_uri;
-  const y = await wallet.preparePay({
+  await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri,
   });
 
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-deposit.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-deposit.ts
index 905cf8af..585ca999 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-deposit.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-deposit.ts
@@ -17,6 +17,7 @@
 /**
  * Imports.
  */
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { GlobalTestState } from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 
@@ -39,14 +40,20 @@ export async function runDepositTest(t: GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  const { depositGroupId } = await wallet.createDepositGroup({
-    amount: "TESTKUDOS:10",
-    depositPaytoUri: "payto://x-taler-bank/localhost/foo",
-  });
+  const { depositGroupId } = await wallet.client.call(
+    WalletApiOperation.CreateDepositGroup,
+    {
+      amount: "TESTKUDOS:10",
+      depositPaytoUri: "payto://x-taler-bank/localhost/foo",
+    },
+  );
 
   await wallet.runUntilDone();
 
-  const transactions = await wallet.getTransactions();
+  const transactions = await wallet.client.call(
+    WalletApiOperation.GetTransactions,
+    {},
+  );
   console.log("transactions", JSON.stringify(transactions, undefined, 2));
   t.assertDeepEqual(transactions.transactions[0].type, "withdrawal");
   t.assertDeepEqual(transactions.transactions[1].type, "deposit");
@@ -54,7 +61,7 @@ export async function runDepositTest(t: GlobalTestState) {
   // deposit and wire fees.
   t.assertDeepEqual(transactions.transactions[1].amountRaw, "TESTKUDOS:9.79");
 
-  const trackResult = wallet.trackDepositGroup({
+  const trackResult = wallet.client.call(WalletApiOperation.TrackDepositGroup, 
{
     depositGroupId,
   });
 
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 c2494be9..4f3446f7 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-exchange-management.ts
@@ -27,7 +27,7 @@ import {
   BankApi,
   BankAccessApi,
 } from "./harness";
-import { URL } from "@gnu-taler/taler-wallet-core";
+import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { ExchangesListRespose, TalerErrorCode } from "@gnu-taler/taler-util";
 import {
   FaultInjectedExchangeService,
@@ -116,24 +116,33 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
 
   let exchangesList: ExchangesListRespose;
 
-  exchangesList = await wallet.listExchanges();
+  exchangesList = await wallet.client.call(
+    WalletApiOperation.ListExchanges,
+    {},
+  );
   t.assertTrue(exchangesList.exchanges.length === 0);
 
   // Try before fault is injected
-  await wallet.addExchange({
+  await wallet.client.call(WalletApiOperation.AddExchange, {
     exchangeBaseUrl: faultyExchange.baseUrl,
   });
 
-  exchangesList = await wallet.listExchanges();
+  exchangesList = await wallet.client.call(
+    WalletApiOperation.ListExchanges,
+    {},
+  );
   t.assertTrue(exchangesList.exchanges.length === 1);
 
-  await wallet.addExchange({
+  await wallet.client.call(WalletApiOperation.ListExchanges, {
     exchangeBaseUrl: faultyExchange.baseUrl,
   });
 
   console.log("listing exchanges");
 
-  exchangesList = await wallet.listExchanges();
+  exchangesList = await wallet.client.call(
+    WalletApiOperation.ListExchanges,
+    {},
+  );
   t.assertTrue(exchangesList.exchanges.length === 1);
 
   console.log("got list", exchangesList);
@@ -147,7 +156,10 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
 
   wallet.deleteDatabase();
 
-  exchangesList = await wallet.listExchanges();
+  exchangesList = await wallet.client.call(
+    WalletApiOperation.ListExchanges,
+    {},
+  );
   t.assertTrue(exchangesList.exchanges.length === 0);
 
   faultyExchange.faultProxy.addFault({
@@ -163,7 +175,7 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
   });
 
   const err1 = await t.assertThrowsOperationErrorAsync(async () => {
-    await wallet.addExchange({
+    await wallet.client.call(WalletApiOperation.AddExchange, {
       exchangeBaseUrl: faultyExchange.baseUrl,
     });
   });
@@ -175,7 +187,10 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
       TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE,
   );
 
-  exchangesList = await wallet.listExchanges();
+  exchangesList = await wallet.client.call(
+    WalletApiOperation.ListExchanges,
+    {},
+  );
   t.assertTrue(exchangesList.exchanges.length === 0);
 
   /*
@@ -202,7 +217,7 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
   });
 
   const err2 = await t.assertThrowsOperationErrorAsync(async () => {
-    await wallet.addExchange({
+    await wallet.client.call(WalletApiOperation.AddExchange, {
       exchangeBaseUrl: faultyExchange.baseUrl,
     });
   });
@@ -212,7 +227,10 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
       TalerErrorCode.WALLET_EXCHANGE_PROTOCOL_VERSION_INCOMPATIBLE,
   );
 
-  exchangesList = await wallet.listExchanges();
+  exchangesList = await wallet.client.call(
+    WalletApiOperation.ListExchanges,
+    {},
+  );
   t.assertTrue(exchangesList.exchanges.length === 0);
 
   /*
@@ -236,9 +254,12 @@ export async function runExchangeManagementTest(t: 
GlobalTestState) {
 
   // Hand it to the wallet
 
-  const wd = await wallet.getWithdrawalDetailsForUri({
-    talerWithdrawUri: wop.taler_withdraw_uri,
-  });
+  const wd = await wallet.client.call(
+    WalletApiOperation.GetWithdrawalDetailsForUri,
+    {
+      talerWithdrawUri: wop.taler_withdraw_uri,
+    },
+  );
 
   // Make sure the faulty exchange isn't used for the suggestion.
   t.assertTrue(wd.possibleExchanges.length === 0);
diff --git 
a/packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts
index c56fe7ab..e977c178 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-fee-regression.ts
@@ -17,6 +17,7 @@
 /**
  * Imports.
  */
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import {
   GlobalTestState,
   BankService,
@@ -183,7 +184,7 @@ export async function runFeeRegressionTest(t: 
GlobalTestState) {
     amount: "TESTKUDOS:1.92",
   });
 
-  const coins = await wallet.dumpCoins();
+  const coins = await wallet.client.call(WalletApiOperation.DumpCoins, {});
 
   // Make sure we really withdraw one 0.64 and one 1.28 coin.
   t.assertTrue(coins.coins.length === 2);
@@ -198,7 +199,7 @@ export async function runFeeRegressionTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  const txs = await wallet.getTransactions();
+  const txs = await wallet.client.call(WalletApiOperation.GetTransactions, {});
   t.assertAmountEquals(txs.transactions[1].amountEffective, "TESTKUDOS:1.30");
   console.log(txs);
 }
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 03d9fa35..34525844 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts
@@ -18,6 +18,7 @@
  * Imports.
  */
 import { CoreApiResponse } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { CoinConfig, defaultCoinConfig } from "./denomStructures";
 import {
   DbInfo,
@@ -237,24 +238,19 @@ export async function runLibeufinBasicTest(t: 
GlobalTestState) {
     libeufinNexus,
   } = await createLibeufinTestEnvironment(t);
 
-  let wresp: CoreApiResponse;
-
-  // FIXME: add nicer api in the harness wallet for this.
-  wresp = await wallet.apiRequest("addExchange", {
-    exchangeBaseUrl: exchange.baseUrl,
-  });
-
-  t.assertTrue(wresp.type === "response");
-
-  // FIXME: add nicer api in the harness wallet for this.
-  wresp = await wallet.apiRequest("acceptManualWithdrawal", {
+  await wallet.client.call(WalletApiOperation.AddExchange, {
     exchangeBaseUrl: exchange.baseUrl,
-    amount: "EUR:10",
   });
 
-  t.assertTrue(wresp.type === "response");
+  const wr = await wallet.client.call(
+    WalletApiOperation.AcceptManualWithdrawal,
+    {
+      exchangeBaseUrl: exchange.baseUrl,
+      amount: "EUR:10",
+    },
+  );
 
-  const reservePub: string = (wresp.result as any).reservePub;
+  const reservePub: string = wr.reservePub;
 
   await LibeufinSandboxApi.simulateIncomingTransaction(
     libeufinSandbox,
@@ -275,7 +271,7 @@ export async function runLibeufinBasicTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  const bal = await wallet.getBalances();
+  const bal = await wallet.client.call(WalletApiOperation.GetBalances, {});
   console.log("balances", JSON.stringify(bal, undefined, 2));
   t.assertAmountEquals(bal.balances[0].available, "EUR:14.7");
 
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 3336f0c5..a29e72af 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
@@ -43,6 +43,7 @@ import {
   FaultInjectionRequestContext,
 } from "./faultInjection";
 import { defaultCoinConfig } from "./denomStructures";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run a test case with a simple TESTKUDOS Taler environment, consisting
@@ -199,9 +200,12 @@ export async function runMerchantExchangeConfusionTest(t: 
GlobalTestState) {
 
   console.log(pubUnpaidStatus);
 
-  let preparePayResp = await wallet.preparePay({
-    talerPayUri: pubUnpaidStatus.taler_pay_uri,
-  });
+  let preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: pubUnpaidStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === PreparePayResultType.PaymentPossible);
 
@@ -221,9 +225,12 @@ export async function runMerchantExchangeConfusionTest(t: 
GlobalTestState) {
     publicOrderStatusResp.data,
   );
 
-  const confirmPayRes = await wallet.confirmPay({
-    proposalId: proposalId,
-  });
+  const confirmPayRes = await wallet.client.call(
+    WalletApiOperation.ConfirmPay,
+    {
+      proposalId: proposalId,
+    },
+  );
 
   t.assertTrue(confirmPayRes.type === ConfirmPayResultType.Done);
 }
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 0f6ba654..04888ecc 100644
--- 
a/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts
+++ 
b/packages/taler-wallet-cli/src/integrationtests/test-merchant-longpolling.ts
@@ -25,7 +25,7 @@ import {
   ConfirmPayResultType,
 } from "@gnu-taler/taler-util";
 import axios from "axios";
-import { URL } from "@gnu-taler/taler-wallet-core";
+import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -104,9 +104,12 @@ export async function runMerchantLongpollingTest(t: 
GlobalTestState) {
     validateStatus: () => true,
   });
 
-  let preparePayResp = await wallet.preparePay({
-    talerPayUri: pubUnpaidStatus.taler_pay_uri,
-  });
+  let preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: pubUnpaidStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === PreparePayResultType.PaymentPossible);
 
@@ -124,9 +127,12 @@ export async function runMerchantLongpollingTest(t: 
GlobalTestState) {
     publicOrderStatusResp.data,
   );
 
-  const confirmPayRes = await wallet.confirmPay({
-    proposalId: proposalId,
-  });
+  const confirmPayRes = await wallet.client.call(
+    WalletApiOperation.ConfirmPay,
+    {
+      proposalId: proposalId,
+    },
+  );
 
   t.assertTrue(confirmPayRes.type === ConfirmPayResultType.Done);
 }
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 32bc310d..4d431099 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
@@ -32,7 +32,7 @@ import {
 } from "./helpers";
 import { durationFromSpec, PreparePayResultType } from "@gnu-taler/taler-util";
 import axios from "axios";
-import { URL } from "@gnu-taler/taler-wallet-core";
+import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 async function testRefundApiWithFulfillmentUrl(
   t: GlobalTestState,
@@ -66,18 +66,20 @@ async function testRefundApiWithFulfillmentUrl(
 
   // Make wallet pay for the order
 
-  let preparePayResult = await wallet.preparePay({
-    talerPayUri,
-  });
+  let preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.PaymentPossible,
   );
 
-  const r2 = await wallet.apiRequest("confirmPay", {
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     proposalId: preparePayResult.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -87,9 +89,12 @@ async function testRefundApiWithFulfillmentUrl(
 
   t.assertTrue(orderStatus.order_status === "paid");
 
-  preparePayResult = await wallet.preparePay({
-    talerPayUri,
-  });
+  preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.AlreadyConfirmed,
@@ -176,18 +181,20 @@ async function testRefundApiWithFulfillmentMessage(
 
   // Make wallet pay for the order
 
-  let preparePayResult = await wallet.preparePay({
-    talerPayUri,
-  });
+  let preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.PaymentPossible,
   );
 
-  const r2 = await wallet.apiRequest("confirmPay", {
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     proposalId: preparePayResult.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -197,9 +204,12 @@ async function testRefundApiWithFulfillmentMessage(
 
   t.assertTrue(orderStatus.order_status === "paid");
 
-  preparePayResult = await wallet.preparePay({
-    talerPayUri,
-  });
+  preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.AlreadyConfirmed,
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 10f9904f..29e0fd0a 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-abort.ts
@@ -23,7 +23,7 @@
  * Imports.
  */
 import { PreparePayResultType, TalerErrorCode } from "@gnu-taler/taler-util";
-import { URL } from "@gnu-taler/taler-wallet-core";
+import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import {
   FaultInjectionRequestContext,
   FaultInjectionResponseContext,
@@ -76,9 +76,12 @@ export async function runPayAbortTest(t: GlobalTestState) {
 
   // Make wallet pay for the order
 
-  const preparePayResult = await wallet.preparePay({
-    talerPayUri: orderStatus.taler_pay_uri,
-  });
+  const preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.PaymentPossible,
@@ -121,12 +124,12 @@ export async function runPayAbortTest(t: GlobalTestState) 
{
   });
 
   await t.assertThrowsOperationErrorAsync(async () => {
-    await wallet.confirmPay({
+    await wallet.client.call(WalletApiOperation.ConfirmPay, {
       proposalId: preparePayResult.proposalId,
     });
   });
 
-  let txr = await wallet.getTransactions();
+  let txr = await wallet.client.call(WalletApiOperation.GetTransactions, {});
   console.log(JSON.stringify(txr, undefined, 2));
 
   t.assertDeepEqual(txr.transactions[1].type, "payment");
@@ -136,13 +139,13 @@ export async function runPayAbortTest(t: GlobalTestState) 
{
     TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE,
   );
 
-  await wallet.abortFailedPayWithRefund({
+  await wallet.client.call(WalletApiOperation.AbortFailedPayWithRefund, {
     proposalId: preparePayResult.proposalId,
   });
 
   await wallet.runUntilDone();
 
-  txr = await wallet.getTransactions();
+  txr = await wallet.client.call(WalletApiOperation.GetTransactions, {});
   console.log(JSON.stringify(txr, undefined, 2));
 
   const txTypes = txr.transactions.map((x) => x.type);
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 a4f09855..3155898a 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-pay-paid.ts
@@ -29,7 +29,7 @@ import {
 } from "@gnu-taler/taler-util";
 import axios from "axios";
 import { FaultInjectionRequestContext } from "./faultInjection";
-import { URL } from "@gnu-taler/taler-wallet-core";
+import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for the wallets repurchase detection mechanism
@@ -103,9 +103,12 @@ export async function runPayPaidTest(t: GlobalTestState) {
 
   console.log(pubUnpaidStatus);
 
-  let preparePayResp = await wallet.preparePay({
-    talerPayUri: pubUnpaidStatus.taler_pay_uri,
-  });
+  let preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: pubUnpaidStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === PreparePayResultType.PaymentPossible);
 
@@ -125,9 +128,12 @@ export async function runPayPaidTest(t: GlobalTestState) {
     publicOrderStatusResp.data,
   );
 
-  const confirmPayRes = await wallet.confirmPay({
-    proposalId: proposalId,
-  });
+  const confirmPayRes = await wallet.client.call(
+    WalletApiOperation.ConfirmPay,
+    {
+      proposalId: proposalId,
+    },
+  );
 
   t.assertTrue(confirmPayRes.type === ConfirmPayResultType.Done);
 
@@ -198,9 +204,12 @@ export async function runPayPaidTest(t: GlobalTestState) {
   // Pay with new taler://pay URI, which should
   // have the new session ID!
   // Wallet should now automatically re-play payment.
-  preparePayResp = await wallet.preparePay({
-    talerPayUri: orderStatusTwo.taler_pay_uri,
-  });
+  preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatusTwo.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === 
PreparePayResultType.AlreadyConfirmed);
   t.assertTrue(preparePayResp.paid);
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 5a8adc96..9620db6d 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-claim.ts
@@ -21,6 +21,7 @@ import { GlobalTestState, MerchantPrivateApi, WalletCli } 
from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 import { PreparePayResultType } from "@gnu-taler/taler-util";
 import { TalerErrorCode } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -61,25 +62,26 @@ export async function runPaymentClaimTest(t: 
GlobalTestState) {
 
   // Make wallet pay for the order
 
-  const preparePayResult = await wallet.preparePay({
-    talerPayUri,
-  });
+  const preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.PaymentPossible,
   );
 
   t.assertThrowsOperationErrorAsync(async () => {
-    await walletTwo.preparePay({
+    await walletTwo.client.call(WalletApiOperation.PreparePayForUri, {
       talerPayUri,
     });
   });
 
-  const r2 = await wallet.apiRequest("confirmPay", {
-    // FIXME: should be validated, don't cast!
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     proposalId: preparePayResult.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -92,7 +94,7 @@ export async function runPaymentClaimTest(t: GlobalTestState) 
{
   walletTwo.deleteDatabase();
 
   const err = await t.assertThrowsOperationErrorAsync(async () => {
-    await walletTwo.preparePay({
+    await walletTwo.client.call(WalletApiOperation.PreparePayForUri, {
       talerPayUri,
     });
   });
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 37ae0739..57ad6a4f 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-fault.ts
@@ -39,6 +39,7 @@ import {
 } from "./faultInjection";
 import { CoreApiResponse } from "@gnu-taler/taler-util";
 import { defaultCoinConfig } from "./denomStructures";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -124,10 +125,9 @@ export async function runPaymentFaultTest(t: 
GlobalTestState) {
 
   // Hand it to the wallet
 
-  const r1 = await wallet.apiRequest("getWithdrawalDetailsForUri", {
+  await wallet.client.call(WalletApiOperation.GetWithdrawalDetailsForUri, {
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r1.type === "response");
 
   await wallet.runPending();
 
@@ -137,16 +137,15 @@ export async function runPaymentFaultTest(t: 
GlobalTestState) {
 
   // Withdraw
 
-  const r2 = await wallet.apiRequest("acceptBankIntegratedWithdrawal", {
+  await wallet.client.call(WalletApiOperation.AcceptBankIntegratedWithdrawal, {
     exchangeBaseUrl: faultyExchange.baseUrl,
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r2.type === "response");
   await wallet.runUntilDone();
 
   // Check balance
 
-  await wallet.getBalances();
+  await wallet.client.call(WalletApiOperation.GetBalances, {});
 
   // Set up order.
 
@@ -168,12 +167,14 @@ export async function runPaymentFaultTest(t: 
GlobalTestState) {
 
   let apiResp: CoreApiResponse;
 
-  apiResp = await wallet.apiRequest("preparePay", {
-    talerPayUri: orderStatus.taler_pay_uri,
-  });
-  t.assertTrue(apiResp.type === "response");
+  const prepResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
 
-  const proposalId = (apiResp.result as any).proposalId;
+  const proposalId = prepResp.proposalId;
 
   await wallet.runPending();
 
@@ -196,7 +197,7 @@ export async function runPaymentFaultTest(t: 
GlobalTestState) {
 
   // confirmPay won't work, as the exchange is unreachable
 
-  apiResp = await wallet.apiRequest("confirmPay", {
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     // FIXME: should be validated, don't cast!
     proposalId: proposalId,
   });
diff --git 
a/packages/taler-wallet-cli/src/integrationtests/test-payment-forgettable.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-payment-forgettable.ts
index 9c34bee8..49ffadc9 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-forgettable.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-forgettable.ts
@@ -78,4 +78,4 @@ export async function runPaymentForgettableTest(t: 
GlobalTestState) {
   await wallet.runUntilDone();
 }
 
-runPaymentForgettableTest.suites = ["wallet"];
+runPaymentForgettableTest.suites = ["wallet", "merchant"];
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 061fe511..58c951b6 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-idempotency.ts
@@ -20,6 +20,7 @@
 import { GlobalTestState, MerchantPrivateApi } from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 import { PreparePayResultType } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Test the wallet-core payment API, especially that repeated operations
@@ -59,13 +60,19 @@ export async function runPaymentIdempotencyTest(t: 
GlobalTestState) {
 
   // Make wallet pay for the order
 
-  const preparePayResult = await wallet.preparePay({
-    talerPayUri: orderStatus.taler_pay_uri,
-  });
+  const preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
 
-  const preparePayResultRep = await wallet.preparePay({
-    talerPayUri: orderStatus.taler_pay_uri,
-  });
+  const preparePayResultRep = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(
     preparePayResult.status === PreparePayResultType.PaymentPossible,
@@ -76,11 +83,10 @@ export async function runPaymentIdempotencyTest(t: 
GlobalTestState) {
 
   const proposalId = preparePayResult.proposalId;
 
-  const r2 = await wallet.apiRequest("confirmPay", {
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     // FIXME: should be validated, don't cast!
     proposalId: proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -90,9 +96,12 @@ export async function runPaymentIdempotencyTest(t: 
GlobalTestState) {
 
   t.assertTrue(orderStatus.order_status === "paid");
 
-  const preparePayResultAfter = await wallet.preparePay({
-    talerPayUri,
-  });
+  const preparePayResultAfter = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri,
+    },
+  );
 
   t.assertTrue(
     preparePayResultAfter.status === PreparePayResultType.AlreadyConfirmed,
diff --git 
a/packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts
index 5197967b..f545d586 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-multiple.ts
@@ -28,6 +28,7 @@ import {
 } from "./harness";
 import { withdrawViaBank } from "./helpers";
 import { coin_ct10, coin_u1 } from "./denomStructures";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 async function setupTest(
   t: GlobalTestState,
@@ -137,16 +138,14 @@ export async function runPaymentMultipleTest(t: 
GlobalTestState) {
 
   // Make wallet pay for the order
 
-  const r1 = await wallet.apiRequest("preparePay", {
+  const r1 = await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri: orderStatus.taler_pay_uri,
   });
-  t.assertTrue(r1.type === "response");
 
-  const r2 = await wallet.apiRequest("confirmPay", {
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     // FIXME: should be validated, don't cast!
-    proposalId: (r1.result as any).proposalId,
+    proposalId: r1.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -160,3 +159,4 @@ export async function runPaymentMultipleTest(t: 
GlobalTestState) {
 }
 
 runPaymentMultipleTest.suites = ["wallet"];
+runPaymentMultipleTest.timeoutMs = 120000;
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 0733cd03..102c3c59 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-payment-transient.ts
@@ -34,7 +34,7 @@ import {
   TalerErrorCode,
   TalerErrorDetails,
 } from "@gnu-taler/taler-util";
-import { URL } from "@gnu-taler/taler-wallet-core";
+import { URL, WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for a payment where the merchant has a transient
@@ -90,9 +90,12 @@ export async function runPaymentTransientTest(t: 
GlobalTestState) {
 
   console.log(pubUnpaidStatus);
 
-  let preparePayResp = await wallet.preparePay({
-    talerPayUri: pubUnpaidStatus.taler_pay_uri,
-  });
+  let preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: pubUnpaidStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === PreparePayResultType.PaymentPossible);
 
@@ -139,18 +142,24 @@ export async function runPaymentTransientTest(t: 
GlobalTestState) {
     },
   });
 
-  const confirmPayResp = await wallet.confirmPay({
-    proposalId,
-  });
+  const confirmPayResp = await wallet.client.call(
+    WalletApiOperation.ConfirmPay,
+    {
+      proposalId,
+    },
+  );
 
   console.log(confirmPayResp);
 
   t.assertTrue(confirmPayResp.type === ConfirmPayResultType.Pending);
   t.assertTrue(faultInjected);
 
-  const confirmPayRespTwo = await wallet.confirmPay({
-    proposalId,
-  });
+  const confirmPayRespTwo = await wallet.client.call(
+    WalletApiOperation.ConfirmPay,
+    {
+      proposalId,
+    },
+  );
 
   t.assertTrue(confirmPayRespTwo.type === ConfirmPayResultType.Done);
 
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 865fd77d..77e32262 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-paywall-flow.ts
@@ -25,6 +25,7 @@ import {
   ConfirmPayResultType,
 } from "@gnu-taler/taler-util";
 import axios from "axios";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -90,9 +91,12 @@ export async function runPaywallFlowTest(t: GlobalTestState) 
{
 
   console.log(pubUnpaidStatus);
 
-  let preparePayResp = await wallet.preparePay({
-    talerPayUri: pubUnpaidStatus.taler_pay_uri,
-  });
+  let preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: pubUnpaidStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === PreparePayResultType.PaymentPossible);
 
@@ -112,9 +116,12 @@ export async function runPaywallFlowTest(t: 
GlobalTestState) {
     publicOrderStatusResp.data,
   );
 
-  const confirmPayRes = await wallet.confirmPay({
-    proposalId: proposalId,
-  });
+  const confirmPayRes = await wallet.client.call(
+    WalletApiOperation.ConfirmPay,
+    {
+      proposalId: proposalId,
+    },
+  );
 
   t.assertTrue(confirmPayRes.type === ConfirmPayResultType.Done);
 
@@ -148,9 +155,12 @@ export async function runPaywallFlowTest(t: 
GlobalTestState) {
   // Pay with new taler://pay URI, which should
   // have the new session ID!
   // Wallet should now automatically re-play payment.
-  preparePayResp = await wallet.preparePay({
-    talerPayUri: talerPayUriOne,
-  });
+  preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: talerPayUriOne,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === 
PreparePayResultType.AlreadyConfirmed);
   t.assertTrue(preparePayResp.paid);
@@ -185,9 +195,12 @@ export async function runPaywallFlowTest(t: 
GlobalTestState) {
   // Here the re-purchase detection should kick in,
   // and the wallet should re-pay for the old order
   // under the new session ID (mysession-three).
-  preparePayResp = await wallet.preparePay({
-    talerPayUri: orderStatus.taler_pay_uri,
-  });
+  preparePayResp = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
 
   t.assertTrue(preparePayResp.status === 
PreparePayResultType.AlreadyConfirmed);
   t.assertTrue(preparePayResp.paid);
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 a78b0ecc..f1e79f4b 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-auto.ts
@@ -20,6 +20,7 @@
 import { GlobalTestState, MerchantPrivateApi } from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 import { durationFromSpec } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -59,16 +60,14 @@ export async function runRefundAutoTest(t: GlobalTestState) 
{
 
   // Make wallet pay for the order
 
-  const r1 = await wallet.apiRequest("preparePay", {
+  const r1 = await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri: orderStatus.taler_pay_uri,
   });
-  t.assertTrue(r1.type === "response");
 
-  const r2 = await wallet.apiRequest("confirmPay", {
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
     // FIXME: should be validated, don't cast!
-    proposalId: (r1.result as any).proposalId,
+    proposalId: r1.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -90,7 +89,10 @@ export async function runRefundAutoTest(t: GlobalTestState) {
   // The wallet should now automatically pick up the refund.
   await wallet.runUntilDone();
 
-  const transactions = await wallet.getTransactions();
+  const transactions = await wallet.client.call(
+    WalletApiOperation.GetTransactions,
+    {},
+  );
   console.log(JSON.stringify(transactions, undefined, 2));
 
   const transactionTypes = transactions.transactions.map((x) => x.type);
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 c2640bb2..b4276248 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-gone.ts
@@ -29,6 +29,7 @@ import {
   getTimestampNow,
   timestampTruncateToSecond,
 } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -74,16 +75,13 @@ export async function runRefundGoneTest(t: GlobalTestState) 
{
 
   // Make wallet pay for the order
 
-  const r1 = await wallet.apiRequest("preparePay", {
+  const r1 = await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri: orderStatus.taler_pay_uri,
   });
-  t.assertTrue(r1.type === "response");
 
-  const r2 = await wallet.apiRequest("confirmPay", {
-    // FIXME: should be validated, don't cast!
-    proposalId: (r1.result as any).proposalId,
+  const r2 = await wallet.client.call(WalletApiOperation.ConfirmPay, {
+    proposalId: r1.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -108,7 +106,7 @@ export async function runRefundGoneTest(t: GlobalTestState) 
{
 
   console.log(ref);
 
-  let rr = await wallet.applyRefund({
+  let rr = await wallet.client.call(WalletApiOperation.ApplyRefund, {
     talerRefundUri: ref.talerRefundUri,
   });
 
@@ -117,11 +115,11 @@ export async function runRefundGoneTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  let r = await wallet.apiRequest("getBalances", {});
+  let r = await wallet.client.call(WalletApiOperation.GetBalances, {});
   console.log(JSON.stringify(r, undefined, 2));
 
-  r = await wallet.apiRequest("getTransactions", {});
-  console.log(JSON.stringify(r, undefined, 2));
+  const r3 = await wallet.client.call(WalletApiOperation.GetTransactions, {});
+  console.log(JSON.stringify(r3, undefined, 2));
 
   await t.shutdown();
 }
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 55f8ad6c..11e1226d 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund-incremental.ts
@@ -24,6 +24,7 @@ import {
   Amounts,
   durationFromSpec,
 } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -61,16 +62,13 @@ export async function runRefundIncrementalTest(t: 
GlobalTestState) {
 
   // Make wallet pay for the order
 
-  const r1 = await wallet.apiRequest("preparePay", {
+  const r1 = await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri: orderStatus.taler_pay_uri,
   });
-  t.assertTrue(r1.type === "response");
 
-  const r2 = await wallet.apiRequest("confirmPay", {
-    // FIXME: should be validated, don't cast!
-    proposalId: (r1.result as any).proposalId,
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
+    proposalId: r1.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -90,11 +88,14 @@ export async function runRefundIncrementalTest(t: 
GlobalTestState) {
   console.log("first refund increase response", ref);
 
   {
-    let wr = await wallet.applyRefund({
+    let wr = await wallet.client.call(WalletApiOperation.ApplyRefund, {
       talerRefundUri: ref.talerRefundUri,
     });
     console.log(wr);
-    const txs = await wallet.getTransactions();
+    const txs = await wallet.client.call(
+      WalletApiOperation.GetTransactions,
+      {},
+    );
     console.log(
       "transactions after applying first refund:",
       JSON.stringify(txs, undefined, 2),
@@ -128,7 +129,7 @@ export async function runRefundIncrementalTest(t: 
GlobalTestState) {
   console.log("third refund increase response", ref);
 
   {
-    let wr = await wallet.applyRefund({
+    let wr = await wallet.client.call(WalletApiOperation.ApplyRefund, {
       talerRefundUri: ref.talerRefundUri,
     });
     console.log(wr);
@@ -146,11 +147,14 @@ export async function runRefundIncrementalTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  const bal = await wallet.getBalances();
+  const bal = await wallet.client.call(WalletApiOperation.GetBalances, {});
   console.log(JSON.stringify(bal, undefined, 2));
 
   {
-    const txs = await wallet.getTransactions();
+    const txs = await wallet.client.call(
+      WalletApiOperation.GetTransactions,
+      {},
+    );
     console.log(JSON.stringify(txs, undefined, 2));
 
     const txTypes = txs.transactions.map((x) => x.type);
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-refund.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-refund.ts
index 4c7d478b..1808f7d7 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-refund.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-refund.ts
@@ -18,6 +18,7 @@
  * Imports.
  */
 import { durationFromSpec } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { GlobalTestState, MerchantPrivateApi } from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 
@@ -57,16 +58,13 @@ export async function runRefundTest(t: GlobalTestState) {
 
   // Make wallet pay for the order
 
-  const r1 = await wallet.apiRequest("preparePay", {
+  const r1 = await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri: orderStatus.taler_pay_uri,
   });
-  t.assertTrue(r1.type === "response");
 
-  const r2 = await wallet.apiRequest("confirmPay", {
-    // FIXME: should be validated, don't cast!
-    proposalId: (r1.result as any).proposalId,
+  await wallet.client.call(WalletApiOperation.ConfirmPay, {
+    proposalId: r1.proposalId,
   });
-  t.assertTrue(r2.type === "response");
 
   // Check if payment was successful.
 
@@ -85,19 +83,21 @@ export async function runRefundTest(t: GlobalTestState) {
 
   console.log(ref);
 
-  let r = await wallet.apiRequest("applyRefund", {
+  let r = await wallet.client.call(WalletApiOperation.ApplyRefund, {
     talerRefundUri: ref.talerRefundUri,
   });
-  t.assertTrue(r.type === "response");
   console.log(r);
 
   await wallet.runUntilDone();
 
-  r = await wallet.apiRequest("getBalances", {});
-  console.log(JSON.stringify(r, undefined, 2));
-
-  r = await wallet.apiRequest("getTransactions", {});
-  console.log(JSON.stringify(r, undefined, 2));
+  {
+    const r2 = await wallet.client.call(WalletApiOperation.GetBalances, {});
+    console.log(JSON.stringify(r2, undefined, 2));
+  }
+  {
+    const r2 = await wallet.client.call(WalletApiOperation.GetTransactions, 
{});
+    console.log(JSON.stringify(r2, undefined, 2));
+  }
 
   await t.shutdown();
 }
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts
index cf1eded1..fc1ffb26 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts
@@ -17,6 +17,7 @@
 /**
  * Imports.
  */
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { CoinConfig } from "./denomStructures";
 import {
   GlobalTestState,
@@ -39,7 +40,7 @@ async function revokeAllWalletCoins(req: {
   merchant: MerchantService;
 }): Promise<void> {
   const { wallet, exchange, merchant } = req;
-  const coinDump = await wallet.dumpCoins();
+  const coinDump = await wallet.client.call(WalletApiOperation.DumpCoins, {});
   console.log(coinDump);
   const usedDenomHashes = new Set<string>();
   for (const coin of coinDump.coins) {
@@ -160,10 +161,13 @@ export async function runRevocationTest(t: 
GlobalTestState) {
 
   // FIXME: this shouldn't be necessary once https://bugs.taler.net/n/6565
   // is implemented.
-  await wallet.forceUpdateExchange({ exchangeBaseUrl: exchange.baseUrl });
+  await wallet.client.call(WalletApiOperation.AddExchange, {
+    exchangeBaseUrl: exchange.baseUrl,
+    forceUpdate: true,
+  });
   await wallet.runUntilDone();
   await wallet.runUntilDone();
-  const bal = await wallet.getBalances();
+  const bal = await wallet.client.call(WalletApiOperation.GetBalances, {});
   console.log("wallet balance", bal);
 
   const order = {
@@ -177,10 +181,10 @@ export async function runRevocationTest(t: 
GlobalTestState) {
   wallet.deleteDatabase();
   await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:15" });
 
-  const coinDump = await wallet.dumpCoins();
+  const coinDump = await wallet.client.call(WalletApiOperation.DumpCoins, {});
   console.log(coinDump);
   const coinPubList = coinDump.coins.map((x) => x.coin_pub);
-  await wallet.forceRefresh({
+  await wallet.client.call(WalletApiOperation.ForceRefresh, {
     coinPubList,
   });
   await wallet.runUntilDone();
@@ -190,11 +194,14 @@ export async function runRevocationTest(t: 
GlobalTestState) {
 
   // FIXME: this shouldn't be necessary once https://bugs.taler.net/n/6565
   // is implemented.
-  await wallet.forceUpdateExchange({ exchangeBaseUrl: exchange.baseUrl });
+  await wallet.client.call(WalletApiOperation.AddExchange, {
+    exchangeBaseUrl: exchange.baseUrl,
+    forceUpdate: true,
+  });
   await wallet.runUntilDone();
   await wallet.runUntilDone();
   {
-    const bal = await wallet.getBalances();
+    const bal = await wallet.client.call(WalletApiOperation.GetBalances, {});
     console.log("wallet balance", bal);
   }
 
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 8146eafc..bee7581b 100644
--- 
a/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts
+++ 
b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-autorefresh.ts
@@ -23,7 +23,10 @@ import {
   durationFromSpec,
   PreparePayResultType,
 } from "@gnu-taler/taler-util";
-import { PendingOperationsResponse } from "@gnu-taler/taler-wallet-core";
+import {
+  PendingOperationsResponse,
+  WalletApiOperation,
+} from "@gnu-taler/taler-wallet-core";
 import { makeNoFeeCoinConfig } from "./denomStructures";
 import {
   BankService,
@@ -145,7 +148,7 @@ export async function runTimetravelAutorefreshTest(t: 
GlobalTestState) {
   await wallet.runUntilDone();
 
   let p: PendingOperationsResponse;
-  p = await wallet.getPendingOperations();
+  p = await wallet.client.call(WalletApiOperation.GetPendingOperations, {});
 
   console.log("pending operations after first time travel");
   console.log(JSON.stringify(p, undefined, 2));
@@ -191,7 +194,7 @@ export async function runTimetravelAutorefreshTest(t: 
GlobalTestState) {
 
   t.assertTrue(orderStatus.order_status === "unpaid");
 
-  const r = await wallet.preparePay({
+  const r = await wallet.client.call(WalletApiOperation.PreparePayForUri, {
     talerPayUri: orderStatus.taler_pay_uri,
   });
 
@@ -199,7 +202,7 @@ export async function runTimetravelAutorefreshTest(t: 
GlobalTestState) {
 
   t.assertTrue(r.status === PreparePayResultType.PaymentPossible);
 
-  const cpr = await wallet.confirmPay({
+  const cpr = await wallet.client.call(WalletApiOperation.ConfirmPay, {
     proposalId: r.proposalId,
   });
 
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 0ddc6ab0..b9e45c86 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-timetravel-withdraw.ts
@@ -24,6 +24,7 @@ import {
   startWithdrawViaBank,
 } from "./helpers";
 import { Duration, TransactionType } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Basic time travel test.
@@ -71,7 +72,10 @@ export async function runTimetravelWithdrawTest(t: 
GlobalTestState) {
   // Check that transactions are correct for the failed withdrawal
   {
     await wallet.runUntilDone({ maxRetries: 5 });
-    const transactions = await wallet.getTransactions();
+    const transactions = await wallet.client.call(
+      WalletApiOperation.GetTransactions,
+      {},
+    );
     console.log(transactions);
     const types = transactions.transactions.map((x) => x.type);
     t.assertDeepEqual(types, ["withdrawal", "withdrawal"]);
diff --git a/packages/taler-wallet-cli/src/integrationtests/test-tipping.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-tipping.ts
index fbd7709e..02439616 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-tipping.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-tipping.ts
@@ -17,6 +17,7 @@
 /**
  * Imports.
  */
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { GlobalTestState, MerchantPrivateApi, BankApi } from "./harness";
 import { createSimpleTestkudosEnvironment } from "./helpers";
 
@@ -83,7 +84,7 @@ export async function runTippingTest(t: GlobalTestState) {
   console.log("created tip", tip);
 
   const doTip = async (): Promise<void> => {
-    const ptr = await wallet.prepareTip({
+    const ptr = await wallet.client.call(WalletApiOperation.PrepareTip, {
       talerTipUri: tip.taler_tip_uri,
     });
 
@@ -92,19 +93,22 @@ export async function runTippingTest(t: GlobalTestState) {
     t.assertAmountEquals(ptr.tipAmountRaw, "TESTKUDOS:5");
     t.assertAmountEquals(ptr.tipAmountEffective, "TESTKUDOS:4.85");
 
-    await wallet.acceptTip({
+    await wallet.client.call(WalletApiOperation.AcceptTip, {
       walletTipId: ptr.walletTipId,
     });
 
     await wallet.runUntilDone();
 
-    const bal = await wallet.getBalances();
+    const bal = await wallet.client.call(WalletApiOperation.GetBalances, {});
 
     console.log(bal);
 
     t.assertAmountEquals(bal.balances[0].available, "TESTKUDOS:4.85");
 
-    const txns = await wallet.getTransactions();
+    const txns = await wallet.client.call(
+      WalletApiOperation.GetTransactions,
+      {},
+    );
 
     console.log("Transactions:", JSON.stringify(txns, undefined, 2));
 
diff --git 
a/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-basic.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-basic.ts
index 3793a5d1..3342a560 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-basic.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-wallet-backup-basic.ts
@@ -17,6 +17,7 @@
 /**
  * Imports.
  */
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { GlobalTestState, WalletCli } from "./harness";
 import { createSimpleTestkudosEnvironment, withdrawViaBank } from "./helpers";
 import { SyncService } from "./sync";
@@ -49,30 +50,30 @@ export async function runWalletBackupBasicTest(t: 
GlobalTestState) {
   await sync.start();
   await sync.pingUntilAvailable();
 
-  await wallet.addBackupProvider({
+  await wallet.client.call(WalletApiOperation.AddBackupProvider, {
     backupProviderBaseUrl: sync.baseUrl,
     activate: false,
   });
 
   {
-    const bi = await wallet.getBackupInfo();
+    const bi = await wallet.client.call(WalletApiOperation.GetBackupInfo, {});
     t.assertDeepEqual(bi.providers[0].active, false);
   }
 
-  await wallet.addBackupProvider({
+  await wallet.client.call(WalletApiOperation.AddBackupProvider, {
     backupProviderBaseUrl: sync.baseUrl,
     activate: true,
   });
 
   {
-    const bi = await wallet.getBackupInfo();
+    const bi = await wallet.client.call(WalletApiOperation.GetBackupInfo, {});
     t.assertDeepEqual(bi.providers[0].active, true);
   }
 
-  await wallet.runBackupCycle();
+  await wallet.client.call(WalletApiOperation.RunBackupCycle, {});
 
   {
-    const bi = await wallet.getBackupInfo();
+    const bi = await wallet.client.call(WalletApiOperation.GetBackupInfo, {});
     console.log(bi);
     t.assertDeepEqual(
       bi.providers[0].paymentStatus.type,
@@ -82,46 +83,51 @@ export async function runWalletBackupBasicTest(t: 
GlobalTestState) {
 
   await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:10" });
 
-  await wallet.runBackupCycle();
+  await wallet.client.call(WalletApiOperation.RunBackupCycle, {});
 
   {
-    const bi = await wallet.getBackupInfo();
+    const bi = await wallet.client.call(WalletApiOperation.GetBackupInfo, {});
     console.log(bi);
   }
 
   await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:5" });
 
-  await wallet.runBackupCycle();
+  await wallet.client.call(WalletApiOperation.RunBackupCycle, {});
 
   {
-    const bi = await wallet.getBackupInfo();
+    const bi = await wallet.client.call(WalletApiOperation.GetBackupInfo, {});
     console.log(bi);
   }
 
-  const backupRecovery = await wallet.exportBackupRecovery();
+  const backupRecovery = await wallet.client.call(
+    WalletApiOperation.ExportBackupRecovery,
+    {},
+  );
 
   const wallet2 = new WalletCli(t, "wallet2");
 
   // Check that the second wallet is a fresh wallet.
   {
-    const bal = await wallet2.getBalances();
+    const bal = await wallet2.client.call(WalletApiOperation.GetBalances, {});
     t.assertTrue(bal.balances.length === 0);
   }
 
-  await wallet2.importBackupRecovery({ recovery: backupRecovery });
+  await wallet2.client.call(WalletApiOperation.ImportBackupRecovery, {
+    recovery: backupRecovery,
+  });
 
-  await wallet2.runBackupCycle();
+  await wallet2.client.call(WalletApiOperation.RunBackupCycle, {});
 
   // Check that now the old balance is available!
   {
-    const bal = await wallet2.getBalances();
+    const bal = await wallet2.client.call(WalletApiOperation.GetBalances, {});
     t.assertTrue(bal.balances.length === 1);
     console.log(bal);
   }
 
   // Now do some basic checks that the restored wallet is still functional
   {
-    const bal1 = await wallet2.getBalances();
+    const bal1 = await wallet2.client.call(WalletApiOperation.GetBalances, {});
 
     t.assertAmountEquals(bal1.balances[0].available, "TESTKUDOS:14.1");
 
@@ -134,7 +140,7 @@ export async function runWalletBackupBasicTest(t: 
GlobalTestState) {
 
     await wallet2.runUntilDone();
 
-    const bal2 = await wallet2.getBalances();
+    const bal2 = await wallet2.client.call(WalletApiOperation.GetBalances, {});
 
     t.assertAmountEquals(bal2.balances[0].available, "TESTKUDOS:23.82");
   }
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 c5d59077..7d3c5f6d 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
@@ -18,6 +18,7 @@
  * Imports.
  */
 import { PreparePayResultType } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { GlobalTestState, WalletCli, MerchantPrivateApi } from "./harness";
 import {
   createSimpleTestkudosEnvironment,
@@ -54,26 +55,34 @@ export async function runWalletBackupDoublespendTest(t: 
GlobalTestState) {
   await sync.start();
   await sync.pingUntilAvailable();
 
-  await wallet.addBackupProvider({
+  await wallet.client.call(WalletApiOperation.AddBackupProvider, {
     backupProviderBaseUrl: sync.baseUrl,
     activate: true,
   });
 
   await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:10" });
 
-  await wallet.runBackupCycle();
+  await wallet.client.call(WalletApiOperation.RunBackupCycle, {});
   await wallet.runUntilDone();
-  await wallet.runBackupCycle();
+  await wallet.client.call(WalletApiOperation.RunBackupCycle, {});
 
-  const backupRecovery = await wallet.exportBackupRecovery();
+  const backupRecovery = await wallet.client.call(
+    WalletApiOperation.ExportBackupRecovery,
+    {},
+  );
 
   const wallet2 = new WalletCli(t, "wallet2");
 
-  await wallet2.importBackupRecovery({ recovery: backupRecovery });
+  await wallet2.client.call(WalletApiOperation.ImportBackupRecovery, {
+    recovery: backupRecovery,
+  });
 
-  await wallet2.runBackupCycle();
+  await wallet2.client.call(WalletApiOperation.RunBackupCycle, {});
 
-  console.log("wallet1 balance before spend:", await wallet.getBalances());
+  console.log(
+    "wallet1 balance before spend:",
+    await wallet.client.call(WalletApiOperation.GetBalances, {}),
+  );
 
   await makeTestPayment(t, {
     merchant,
@@ -86,10 +95,16 @@ export async function runWalletBackupDoublespendTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  console.log("wallet1 balance after spend:", await wallet.getBalances());
+  console.log(
+    "wallet1 balance after spend:",
+    await wallet.client.call(WalletApiOperation.GetBalances, {}),
+  );
 
   {
-    console.log("wallet2 balance:", await wallet2.getBalances());
+    console.log(
+      "wallet2 balance:",
+      await wallet2.client.call(WalletApiOperation.GetBalances, {}),
+    );
   }
 
   // Now we double-spend with the second wallet
@@ -116,15 +131,18 @@ export async function runWalletBackupDoublespendTest(t: 
GlobalTestState) {
 
     // Make wallet pay for the order
 
-    const preparePayResult = await wallet2.preparePay({
-      talerPayUri: orderStatus.taler_pay_uri,
-    });
+    const preparePayResult = await wallet2.client.call(
+      WalletApiOperation.PreparePayForUri,
+      {
+        talerPayUri: orderStatus.taler_pay_uri,
+      },
+    );
 
     t.assertTrue(
       preparePayResult.status === PreparePayResultType.PaymentPossible,
     );
 
-    const res = await wallet2.confirmPay({
+    const res = await wallet2.client.call(WalletApiOperation.ConfirmPay, {
       proposalId: preparePayResult.proposalId,
     });
 
@@ -139,7 +157,7 @@ export async function runWalletBackupDoublespendTest(t: 
GlobalTestState) {
       amount: "TESTKUDOS:50",
     });
 
-    const bal = await wallet2.getBalances();
+    const bal = await wallet2.client.call(WalletApiOperation.GetBalances, {});
     console.log("bal", bal);
 
     await wallet2.runUntilDone();
diff --git 
a/packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts
index 68d2c726..5fb017ed 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-wallettesting.ts
@@ -22,6 +22,7 @@
 /**
  * Imports.
  */
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { CoinConfig, defaultCoinConfig } from "./denomStructures";
 import {
   BankService,
@@ -114,7 +115,7 @@ export async function createMyEnvironment(
 export async function runWallettestingTest(t: GlobalTestState) {
   const { wallet, bank, exchange, merchant } = await createMyEnvironment(t);
 
-  await wallet.runIntegrationTest({
+  await wallet.client.call(WalletApiOperation.RunIntegrationTest, {
     amountToSpend: "TESTKUDOS:5",
     amountToWithdraw: "TESTKUDOS:10",
     bankBaseUrl: bank.baseUrl,
@@ -123,7 +124,7 @@ export async function runWallettestingTest(t: 
GlobalTestState) {
     merchantBaseUrl: merchant.makeInstanceBaseUrl(),
   });
 
-  let txns = await wallet.getTransactions();
+  let txns = await wallet.client.call(WalletApiOperation.GetTransactions, {});
   console.log(JSON.stringify(txns, undefined, 2));
   let txTypes = txns.transactions.map((x) => x.type);
 
@@ -138,7 +139,7 @@ export async function runWallettestingTest(t: 
GlobalTestState) {
 
   wallet.deleteDatabase();
 
-  await wallet.withdrawTestBalance({
+  await wallet.client.call(WalletApiOperation.WithdrawTestBalance, {
     amount: "TESTKUDOS:10",
     bankBaseUrl: bank.baseUrl,
     exchangeBaseUrl: exchange.baseUrl,
@@ -146,7 +147,7 @@ export async function runWallettestingTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  await wallet.testPay({
+  await wallet.client.call(WalletApiOperation.TestPay, {
     amount: "TESTKUDOS:5",
     merchantAuthToken: merchantAuthToken,
     merchantBaseUrl: merchant.makeInstanceBaseUrl(),
@@ -155,7 +156,7 @@ export async function runWallettestingTest(t: 
GlobalTestState) {
 
   await wallet.runUntilDone();
 
-  txns = await wallet.getTransactions();
+  txns = await wallet.client.call(WalletApiOperation.GetTransactions, {});
   console.log(JSON.stringify(txns, undefined, 2));
   txTypes = txns.transactions.map((x) => x.type);
 
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 bfffa23b..896b1e87 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
@@ -18,6 +18,7 @@
  * Imports.
  */
 import { TalerErrorCode } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 import { GlobalTestState, BankApi, BankAccessApi } from "./harness";
 import { createSimpleTestkudosEnvironment } from "./helpers";
 
@@ -40,10 +41,9 @@ export async function runWithdrawalAbortBankTest(t: 
GlobalTestState) {
 
   // Hand it to the wallet
 
-  const r1 = await wallet.apiRequest("getWithdrawalDetailsForUri", {
+  await wallet.client.call(WalletApiOperation.GetWithdrawalDetailsForUri, {
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r1.type === "response");
 
   await wallet.runPending();
 
@@ -53,14 +53,18 @@ export async function runWithdrawalAbortBankTest(t: 
GlobalTestState) {
 
   // Withdraw
 
-  const r2 = await wallet.apiRequest("acceptBankIntegratedWithdrawal", {
-    exchangeBaseUrl: exchange.baseUrl,
-    talerWithdrawUri: wop.taler_withdraw_uri,
+  const e = await t.assertThrowsOperationErrorAsync(async () => {
+    await wallet.client.call(
+      WalletApiOperation.AcceptBankIntegratedWithdrawal,
+      {
+        exchangeBaseUrl: exchange.baseUrl,
+        talerWithdrawUri: wop.taler_withdraw_uri,
+      },
+    );
   });
-  t.assertTrue(r2.type === "error");
-  t.assertTrue(
-    r2.error.code ===
-      TalerErrorCode.WALLET_WITHDRAWAL_OPERATION_ABORTED_BY_BANK,
+  t.assertDeepEqual(
+    e.operationError.code,
+    TalerErrorCode.WALLET_WITHDRAWAL_OPERATION_ABORTED_BY_BANK,
   );
 
   await t.shutdown();
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 12e594c4..4a02b270 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
@@ -20,6 +20,7 @@
 import { GlobalTestState, BankApi, BankAccessApi } from "./harness";
 import { createSimpleTestkudosEnvironment } from "./helpers";
 import { codecForBalancesResponse } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -40,10 +41,9 @@ export async function runWithdrawalBankIntegratedTest(t: 
GlobalTestState) {
 
   // Hand it to the wallet
 
-  const r1 = await wallet.apiRequest("getWithdrawalDetailsForUri", {
+  const r1 = await 
wallet.client.call(WalletApiOperation.GetWithdrawalDetailsForUri, {
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r1.type === "response");
 
   await wallet.runPending();
 
@@ -53,18 +53,15 @@ export async function runWithdrawalBankIntegratedTest(t: 
GlobalTestState) {
 
   // Withdraw
 
-  const r2 = await wallet.apiRequest("acceptBankIntegratedWithdrawal", {
+  const r2 = await 
wallet.client.call(WalletApiOperation.AcceptBankIntegratedWithdrawal, {
     exchangeBaseUrl: exchange.baseUrl,
     talerWithdrawUri: wop.taler_withdraw_uri,
   });
-  t.assertTrue(r2.type === "response");
   await wallet.runUntilDone();
 
   // Check balance
 
-  const balApiResp = await wallet.apiRequest("getBalances", {});
-  t.assertTrue(balApiResp.type === "response");
-  const balResp = codecForBalancesResponse().decode(balApiResp.result);
+  const balResp = await wallet.client.call(WalletApiOperation.GetBalances, {});
   t.assertAmountEquals("TESTKUDOS:9.72", balResp.balances[0].available);
 
   await t.shutdown();
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 97ea6892..61361807 100644
--- a/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/test-withdrawal-manual.ts
@@ -21,6 +21,7 @@ import { GlobalTestState, BankApi } from "./harness";
 import { createSimpleTestkudosEnvironment } from "./helpers";
 import { CoreApiResponse } from "@gnu-taler/taler-util";
 import { codecForBalancesResponse } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
 
 /**
  * Run test for basic, bank-integrated withdrawal.
@@ -41,20 +42,17 @@ export async function runTestWithdrawalManualTest(t: 
GlobalTestState) {
 
   let wresp: CoreApiResponse;
 
-  wresp = await wallet.apiRequest("addExchange", {
+  await wallet.client.call(WalletApiOperation.AddExchange, {
     exchangeBaseUrl: exchange.baseUrl,
   });
 
-  t.assertTrue(wresp.type === "response");
 
-  wresp = await wallet.apiRequest("acceptManualWithdrawal", {
+  const wres = await 
wallet.client.call(WalletApiOperation.AcceptManualWithdrawal, {
     exchangeBaseUrl: exchange.baseUrl,
     amount: "TESTKUDOS:10",
   });
 
-  t.assertTrue(wresp.type === "response");
-
-  const reservePub: string = (wresp.result as any).reservePub;
+  const reservePub: string = wres.reservePub;
 
   await BankApi.adminAddIncoming(bank, {
     exchangeBankAccount,
@@ -69,9 +67,7 @@ export async function runTestWithdrawalManualTest(t: 
GlobalTestState) {
 
   // Check balance
 
-  const balApiResp = await wallet.apiRequest("getBalances", {});
-  t.assertTrue(balApiResp.type === "response");
-  const balResp = codecForBalancesResponse().decode(balApiResp.result);
+  const balResp = await wallet.client.call(WalletApiOperation.GetBalances, {});
   t.assertAmountEquals("TESTKUDOS:9.72", balResp.balances[0].available);
 
   await t.shutdown();
diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts 
b/packages/taler-wallet-core/src/wallet-api-types.ts
index 39d63b04..d1c8914d 100644
--- a/packages/taler-wallet-core/src/wallet-api-types.ts
+++ b/packages/taler-wallet-core/src/wallet-api-types.ts
@@ -22,6 +22,7 @@
  * Imports.
  */
 import {
+  AbortPayWithRefundRequest,
   AcceptBankIntegratedWithdrawalRequest,
   AcceptExchangeTosRequest,
   AcceptManualWithdrawalRequest,
@@ -45,6 +46,7 @@ import {
   GetExchangeTosResult,
   GetWithdrawalDetailsForAmountRequest,
   GetWithdrawalDetailsForUriRequest,
+  IntegrationTestArgs,
   ManualWithdrawalDetails,
   PreparePayRequest,
   PreparePayResult,
@@ -54,12 +56,14 @@ import {
   RetryTransactionRequest,
   SetCoinSuspendedRequest,
   SetWalletDeviceIdRequest,
+  TestPayArgs,
   TrackDepositGroupRequest,
   TrackDepositGroupResponse,
   TransactionsRequest,
   TransactionsResponse,
   WalletBackupContentV1,
   WalletCurrencyInfo,
+  WithdrawTestBalanceRequest,
   WithdrawUriInfoResponse,
 } from "@gnu-taler/taler-util";
 import { AddBackupProviderRequest, BackupInfo } from "./operations/backup";
@@ -85,7 +89,7 @@ export enum WalletApiOperation {
   AcceptBankIntegratedWithdrawal = "acceptBankIntegratedWithdrawal",
   GetExchangeTos = "getExchangeTos",
   RetryPendingNow = "retryPendingNow",
-  PreparePay = "preparePay",
+  AbortFailedPayWithRefund = "abortFailedPayWithRefund",
   ConfirmPay = "confirmPay",
   DumpCoins = "dumpCoins",
   SetCoinSuspended = "setCoinSuspended",
@@ -117,14 +121,14 @@ export type WalletOperations = {
     request: {};
     response: {};
   };
-  [WalletApiOperation.PreparePay]: {
-    request: PreparePayRequest;
-    response: PreparePayResult;
-  };
   [WalletApiOperation.ConfirmPay]: {
     request: ConfirmPayRequest;
     response: ConfirmPayResult;
   };
+  [WalletApiOperation.AbortFailedPayWithRefund]: {
+    request: AbortPayWithRefundRequest;
+    response: {};
+  };
   [WalletApiOperation.GetBalances]: {
     request: {};
     response: BalancesResponse;
@@ -241,6 +245,18 @@ export type WalletOperations = {
     request: {};
     response: BackupInfo;
   };
+  [WalletApiOperation.RunIntegrationTest]: {
+    request: IntegrationTestArgs;
+    response: {};
+  };
+  [WalletApiOperation.WithdrawTestBalance]: {
+    request: WithdrawTestBalanceRequest;
+    response: {};
+  };
+  [WalletApiOperation.TestPay]: {
+    request: TestPayArgs;
+    response: {};
+  }
 };
 
 export type RequestType<
diff --git a/packages/taler-wallet-core/src/wallet.ts 
b/packages/taler-wallet-core/src/wallet.ts
index 85b5ae65..920cd2cc 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -791,6 +791,8 @@ async function dispatchRequestInternal(
       await runPending(ws, true);
       return {};
     }
+    // FIXME: Deprecate one of the aliases!
+    case "preparePayForUri":
     case "preparePay": {
       const req = codecForPreparePayRequest().decode(payload);
       return await preparePayForUri(ws, req.talerPayUri);

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



reply via email to

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