taler-typescript-core

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

commit f7e1c77bb45ecb98f4008bdbe508e8d4a8b545b7
parent 61c8480180a97c2af1701fe26078084eedf9527e
Author: Florian Dold <dold@taler.net>
Date:   Wed, 22 Jul 2026 11:03:49 +0200

wallet: test the maximum push debit amount against unspendable coins

Exposes getMaxPeerPushDebitAmountForAvailableCoins for the test, mirroring
what is already done for the deposit counterpart.

Diffstat:
Mpackages/taler-wallet-core/src/coinSelection.test.ts | 33+++++++++++++++++++++++++++++++++
Mpackages/taler-wallet-core/src/coinSelection.ts | 6++++++
2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/packages/taler-wallet-core/src/coinSelection.test.ts b/packages/taler-wallet-core/src/coinSelection.test.ts @@ -31,6 +31,7 @@ import { CoinSelectionTally, emptyTallyForPeerPayment, testing_getMaxDepositAmountForAvailableCoins, + testing_getMaxPeerPushDebitAmountForAvailableCoins, testing_selectGreedy, } from "./coinSelection.js"; @@ -610,3 +611,35 @@ test("deposit max is zero when only unspendable coins are available", (t) => { assert.strictEqual(Amounts.stringifyValue(result.rawAmount), "0"); assert.strictEqual(Amounts.stringifyValue(result.effectiveAmount), "0"); }); + +test("peer push debit max ignores coins that cost more to deposit than they are worth", (t) => { + const withoutDust = testing_getMaxPeerPushDebitAmountForAvailableCoins( + { currency: "KUDOS" }, + "2", + { + coinAvailability: [defaultFeeConfig(kudos`5`, 1)], + currentWireFeePerExchange: { + "2": kudos`0`, + }, + }, + ); + const withDust = testing_getMaxPeerPushDebitAmountForAvailableCoins( + { currency: "KUDOS" }, + "2", + { + coinAvailability: [ + defaultFeeConfig(kudos`5`, 1), + defaultFeeConfig(kudos`0.005`, 10), + ], + currentWireFeePerExchange: { + "2": kudos`0`, + }, + }, + ); + + assert.strictEqual(Amounts.stringifyValue(withoutDust.rawAmount), "4.99"); + assert.strictEqual( + Amounts.stringifyValue(withDust.rawAmount), + Amounts.stringifyValue(withoutDust.rawAmount), + ); +}); diff --git a/packages/taler-wallet-core/src/coinSelection.ts b/packages/taler-wallet-core/src/coinSelection.ts @@ -1479,6 +1479,12 @@ export async function getExchangesForDeposit( export const testing_getMaxDepositAmountForAvailableCoins = getMaxDepositAmountForAvailableCoins; +/** + * Only used for unit testing getMaxPeerPushDebitAmountForAvailableCoins. + */ +export const testing_getMaxPeerPushDebitAmountForAvailableCoins = + getMaxPeerPushDebitAmountForAvailableCoins; + export async function getMaxDepositAmount( wex: WalletExecutionContext, req: GetMaxDepositAmountRequest,