taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 3db5ec833d76284bbc7526c1a6941885198d048d
parent 5483f4eab6a928b142ffb7150f8a5b4082638589
Author: Florian Dold <florian@dold.me>
Date:   Tue, 10 Sep 2024 13:19:21 +0200

harness: test getMaxDepositAmount

Diffstat:
Mpackages/taler-harness/src/integrationtests/test-deposit.ts | 19++++++++++++++++++-
Mpackages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts | 2+-
Mpackages/taler-harness/src/integrationtests/test-wallet-insufficient-balance.ts | 2+-
Mpackages/taler-util/src/types-taler-wallet.ts | 2+-
Mpackages/taler-wallet-core/src/coinSelection.ts | 22+++++++++++++++++-----
Mpackages/taler-wallet-webextension/src/cta/Deposit/state.ts | 2+-
Mpackages/taler-wallet-webextension/src/cta/Deposit/test.ts | 2+-
7 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/packages/taler-harness/src/integrationtests/test-deposit.ts b/packages/taler-harness/src/integrationtests/test-deposit.ts @@ -51,6 +51,23 @@ export async function runDepositTest(t: GlobalTestState) { await withdrawalResult.withdrawalFinishedCond; + const depositPaytoUri = generateRandomPayto("foo"); + + const bal = await walletClient.call(WalletApiOperation.GetBalances, {}); + + t.assertAmountEquals(bal.balances[0].available, "TESTKUDOS:19.53"); + + const maxDepositResp = await walletClient.call( + WalletApiOperation.GetMaxDepositAmount, + { + currency: "TESTKUDOS", + depositPaytoUri, + }, + ); + + t.assertAmountEquals(maxDepositResp.rawAmount, "TESTKUDOS:19.09"); + t.assertAmountEquals(maxDepositResp.effectiveAmount, "TESTKUDOS:19.53"); + const dgIdResp = await walletClient.client.call( WalletApiOperation.GenerateDepositGroupTxId, {}, @@ -77,7 +94,7 @@ export async function runDepositTest(t: GlobalTestState) { WalletApiOperation.CreateDepositGroup, { amount: "TESTKUDOS:10" as AmountString, - depositPaytoUri: generateRandomPayto("foo"), + depositPaytoUri, transactionId: depositTxId, }, ); diff --git a/packages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts b/packages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts @@ -114,7 +114,7 @@ export async function runWalletBlockedDepositTest(t: GlobalTestState) { }); console.log(`balance details: ${j2s(balDet)}`); - const depositCheckResp = await w1.call(WalletApiOperation.PrepareDeposit, { + const depositCheckResp = await w1.call(WalletApiOperation.CheckDeposit, { amount: "TESTKUDOS:18" as AmountString, depositPaytoUri: userPayto, }); diff --git a/packages/taler-harness/src/integrationtests/test-wallet-insufficient-balance.ts b/packages/taler-harness/src/integrationtests/test-wallet-insufficient-balance.ts @@ -84,7 +84,7 @@ export async function runWalletInsufficientBalanceTest(t: GlobalTestState) { await wres.withdrawalFinishedCond; const exc = await t.assertThrowsTalerErrorAsync(async () => { - await walletClient.call(WalletApiOperation.PrepareDeposit, { + await walletClient.call(WalletApiOperation.CheckDeposit, { amount: "TESTKUDOS:5" as AmountString, depositPaytoUri: "payto://x-taler-bank/localhost/foobar", }); diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -2327,7 +2327,7 @@ export const codecForCheckDepositRequest = (): Codec<CheckDepositRequest> => .property("amount", codecForAmountString()) .property("depositPaytoUri", codecForString()) .property("clientCancellationId", codecOptional(codecForString())) - .build("PrepareDepositRequest"); + .build("CheckDepositRequest"); export interface CheckDepositResponse { totalDepositCost: AmountString; diff --git a/packages/taler-wallet-core/src/coinSelection.ts b/packages/taler-wallet-core/src/coinSelection.ts @@ -1279,10 +1279,13 @@ function getMaxDepositAmountForAvailableCoins( for (const cc of candidateRes.coinAvailability) { if (!wireFeeCoveredForExchange.has(cc.exchangeBaseUrl)) { - fees = Amounts.add( - fees, - candidateRes.currentWireFeePerExchange[cc.exchangeBaseUrl], - ).amount; + const wireFee = + candidateRes.currentWireFeePerExchange[cc.exchangeBaseUrl]; + // Wire fee can be null if max deposit amount is computed + // without restricting the wire method. + if (wireFee != null) { + fees = Amounts.add(fees, wireFee).amount; + } wireFeeCoveredForExchange.add(cc.exchangeBaseUrl); } @@ -1313,6 +1316,7 @@ export async function getMaxDepositAmount( wex: WalletExecutionContext, req: GetMaxDepositAmountRequest, ): Promise<GetMaxDepositAmountResponse> { + logger.trace(`getting max deposit amount for: ${j2s(req)}`); return await wex.db.runReadOnlyTx( { storeNames: [ @@ -1323,10 +1327,18 @@ export async function getMaxDepositAmount( ], }, async (tx): Promise<GetMaxDepositAmountResponse> => { + let restrictWireMethod: string | undefined = undefined; + if (req.depositPaytoUri) { + const p = parsePaytoUri(req.depositPaytoUri); + if (!p) { + throw Error("invalid payto URI"); + } + restrictWireMethod = p.targetType; + } const candidateRes = await selectPayCandidates(wex, tx, { currency: req.currency, restrictExchanges: undefined, - restrictWireMethod: undefined, + restrictWireMethod, depositPaytoUri: req.depositPaytoUri, requiredMinimumAge: undefined, includePendingCoins: true, diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/state.ts b/packages/taler-wallet-webextension/src/cta/Deposit/state.ts @@ -35,7 +35,7 @@ export function useComponentState({ const amountStr = Amounts.stringify(amount); const hook = useAsyncAsHook(async () => { - const deposit = await api.wallet.call(WalletApiOperation.PrepareDeposit, { + const deposit = await api.wallet.call(WalletApiOperation.CheckDeposit, { amount: amountStr, depositPaytoUri: stringifyPaytoUri(account), }); diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/test.ts b/packages/taler-wallet-webextension/src/cta/Deposit/test.ts @@ -33,7 +33,7 @@ describe("Deposit CTA states", () => { const { handler, TestingContext } = createWalletApiMock(); handler.addWalletCallResponse( - WalletApiOperation.PrepareDeposit, + WalletApiOperation.CheckDeposit, undefined, { effectiveDepositAmount: "EUR:0" as AmountString,