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:
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,