fix exchange-timetravel test case with latest exchange version
This commit is contained in:
parent
1374b37d26
commit
26ee8e3c71
@ -47,6 +47,7 @@ import {
|
|||||||
codecForDuration,
|
codecForDuration,
|
||||||
} from "./time.js";
|
} from "./time.js";
|
||||||
import { Amounts, codecForAmountString } from "./amounts.js";
|
import { Amounts, codecForAmountString } from "./amounts.js";
|
||||||
|
import { strcmp } from "./helpers.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Denomination as found in the /keys response from the exchange.
|
* Denomination as found in the /keys response from the exchange.
|
||||||
@ -1125,6 +1126,47 @@ export interface CsDenominationPubKey {
|
|||||||
// FIXME: finish definition
|
// FIXME: finish definition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export namespace DenominationPubKey {
|
||||||
|
export function cmp(
|
||||||
|
p1: DenominationPubKey,
|
||||||
|
p2: DenominationPubKey,
|
||||||
|
): -1 | 0 | 1 {
|
||||||
|
if (p1.cipher < p2.cipher) {
|
||||||
|
return -1;
|
||||||
|
} else if (p1.cipher > p2.cipher) {
|
||||||
|
return +1;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
p1.cipher === DenomKeyType.LegacyRsa &&
|
||||||
|
p2.cipher === DenomKeyType.LegacyRsa
|
||||||
|
) {
|
||||||
|
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
|
||||||
|
} else if (
|
||||||
|
p1.cipher === DenomKeyType.Rsa &&
|
||||||
|
p2.cipher === DenomKeyType.Rsa
|
||||||
|
) {
|
||||||
|
if ((p1.age_mask ?? 0) < (p2.age_mask ?? 0)) {
|
||||||
|
return -1;
|
||||||
|
} else if ((p1.age_mask ?? 0) > (p2.age_mask ?? 0)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
|
||||||
|
} else {
|
||||||
|
throw Error("unsupported cipher");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function lift(p1: DenominationPubKey | string): DenominationPubKey {
|
||||||
|
if (typeof p1 === "string") {
|
||||||
|
return {
|
||||||
|
cipher: DenomKeyType.LegacyRsa,
|
||||||
|
rsa_public_key: p1,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return p1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const codecForDenominationPubKey = () =>
|
export const codecForDenominationPubKey = () =>
|
||||||
buildCodecForUnion<DenominationPubKey>()
|
buildCodecForUnion<DenominationPubKey>()
|
||||||
.discriminateOn("cipher")
|
.discriminateOn("cipher")
|
||||||
|
@ -19,17 +19,14 @@
|
|||||||
*/
|
*/
|
||||||
import {
|
import {
|
||||||
codecForExchangeKeysJson,
|
codecForExchangeKeysJson,
|
||||||
ConfirmPayResultType,
|
DenominationPubKey,
|
||||||
Duration,
|
Duration,
|
||||||
durationFromSpec,
|
durationFromSpec,
|
||||||
PreparePayResultType,
|
|
||||||
stringifyTimestamp,
|
stringifyTimestamp,
|
||||||
} from "@gnu-taler/taler-util";
|
} from "@gnu-taler/taler-util";
|
||||||
import {
|
import {
|
||||||
NodeHttpLib,
|
NodeHttpLib,
|
||||||
PendingOperationsResponse,
|
|
||||||
readSuccessResponseJsonOrThrow,
|
readSuccessResponseJsonOrThrow,
|
||||||
WalletApiOperation,
|
|
||||||
} from "@gnu-taler/taler-wallet-core";
|
} from "@gnu-taler/taler-wallet-core";
|
||||||
import { makeNoFeeCoinConfig } from "../harness/denomStructures";
|
import { makeNoFeeCoinConfig } from "../harness/denomStructures";
|
||||||
import {
|
import {
|
||||||
@ -40,7 +37,7 @@ import {
|
|||||||
MerchantService,
|
MerchantService,
|
||||||
setupDb,
|
setupDb,
|
||||||
WalletCli,
|
WalletCli,
|
||||||
getPayto
|
getPayto,
|
||||||
} from "../harness/harness.js";
|
} from "../harness/harness.js";
|
||||||
import { startWithdrawViaBank, withdrawViaBank } from "../harness/helpers.js";
|
import { startWithdrawViaBank, withdrawViaBank } from "../harness/helpers.js";
|
||||||
|
|
||||||
@ -192,19 +189,30 @@ export async function runExchangeTimetravelTest(t: GlobalTestState) {
|
|||||||
console.log("=== KEYS RESPONSE 1 ===");
|
console.log("=== KEYS RESPONSE 1 ===");
|
||||||
|
|
||||||
console.log("list issue date", stringifyTimestamp(keys1.list_issue_date));
|
console.log("list issue date", stringifyTimestamp(keys1.list_issue_date));
|
||||||
console.log("num denoms", keys1.denoms.length)
|
console.log("num denoms", keys1.denoms.length);
|
||||||
console.log("denoms", JSON.stringify(denomPubs1, undefined, 2));
|
console.log("denoms", JSON.stringify(denomPubs1, undefined, 2));
|
||||||
|
|
||||||
console.log("=== KEYS RESPONSE 2 ===");
|
console.log("=== KEYS RESPONSE 2 ===");
|
||||||
|
|
||||||
console.log("list issue date", stringifyTimestamp(keys2.list_issue_date));
|
console.log("list issue date", stringifyTimestamp(keys2.list_issue_date));
|
||||||
console.log("num denoms", keys2.denoms.length)
|
console.log("num denoms", keys2.denoms.length);
|
||||||
console.log("denoms", JSON.stringify(denomPubs2, undefined, 2));
|
console.log("denoms", JSON.stringify(denomPubs2, undefined, 2));
|
||||||
|
|
||||||
for (const da of denomPubs1) {
|
for (const da of denomPubs1) {
|
||||||
if (!dps2.has(da.denomPub)) {
|
let found = false;
|
||||||
|
for (const db of denomPubs2) {
|
||||||
|
const d1 = DenominationPubKey.lift(da.denomPub);
|
||||||
|
const d2 = DenominationPubKey.lift(db.denomPub);
|
||||||
|
if (DenominationPubKey.cmp(d1, d2) === 0) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
console.log("=== ERROR ===");
|
console.log("=== ERROR ===");
|
||||||
console.log(`denomination with public key ${da.denomPub} is not present in new /keys response`);
|
console.log(
|
||||||
|
`denomination with public key ${da.denomPub} is not present in new /keys response`,
|
||||||
|
);
|
||||||
console.log(
|
console.log(
|
||||||
`the new /keys response was issued ${stringifyTimestamp(
|
`the new /keys response was issued ${stringifyTimestamp(
|
||||||
keys2.list_issue_date,
|
keys2.list_issue_date,
|
||||||
|
@ -27,7 +27,9 @@ import {
|
|||||||
AmountJson,
|
AmountJson,
|
||||||
Amounts,
|
Amounts,
|
||||||
DenominationPubKey,
|
DenominationPubKey,
|
||||||
DenomKeyType, Logger, strcmp
|
DenomKeyType,
|
||||||
|
Logger,
|
||||||
|
strcmp,
|
||||||
} from "@gnu-taler/taler-util";
|
} from "@gnu-taler/taler-util";
|
||||||
|
|
||||||
const logger = new Logger("coinSelection.ts");
|
const logger = new Logger("coinSelection.ts");
|
||||||
@ -210,32 +212,6 @@ function tallyFees(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function denomPubCmp(
|
|
||||||
p1: DenominationPubKey,
|
|
||||||
p2: DenominationPubKey,
|
|
||||||
): -1 | 0 | 1 {
|
|
||||||
if (p1.cipher < p2.cipher) {
|
|
||||||
return -1;
|
|
||||||
} else if (p1.cipher > p2.cipher) {
|
|
||||||
return +1;
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
p1.cipher === DenomKeyType.LegacyRsa &&
|
|
||||||
p2.cipher === DenomKeyType.LegacyRsa
|
|
||||||
) {
|
|
||||||
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
|
|
||||||
} else if (p1.cipher === DenomKeyType.Rsa && p2.cipher === DenomKeyType.Rsa) {
|
|
||||||
if ((p1.age_mask ?? 0) < (p2.age_mask ?? 0)) {
|
|
||||||
return -1;
|
|
||||||
} else if ((p1.age_mask ?? 0) > (p2.age_mask ?? 0)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
|
|
||||||
} else {
|
|
||||||
throw Error("unsupported cipher");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a list of candidate coins, select coins to spend under the merchant's
|
* Given a list of candidate coins, select coins to spend under the merchant's
|
||||||
* constraints.
|
* constraints.
|
||||||
@ -302,7 +278,7 @@ export function selectPayCoins(
|
|||||||
(o1, o2) =>
|
(o1, o2) =>
|
||||||
-Amounts.cmp(o1.availableAmount, o2.availableAmount) ||
|
-Amounts.cmp(o1.availableAmount, o2.availableAmount) ||
|
||||||
Amounts.cmp(o1.feeDeposit, o2.feeDeposit) ||
|
Amounts.cmp(o1.feeDeposit, o2.feeDeposit) ||
|
||||||
denomPubCmp(o1.denomPub, o2.denomPub),
|
DenominationPubKey.cmp(o1.denomPub, o2.denomPub),
|
||||||
);
|
);
|
||||||
|
|
||||||
// FIXME: Here, we should select coins in a smarter way.
|
// FIXME: Here, we should select coins in a smarter way.
|
||||||
|
Loading…
Reference in New Issue
Block a user