aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/taler-util/src/taler-crypto.ts17
-rw-r--r--packages/taler-util/src/wallet-types.ts2
-rw-r--r--packages/taler-wallet-core/src/db.ts5
-rw-r--r--packages/taler-wallet-core/src/operations/common.ts5
-rw-r--r--packages/taler-wallet-core/src/operations/exchanges.ts10
5 files changed, 39 insertions, 0 deletions
diff --git a/packages/taler-util/src/taler-crypto.ts b/packages/taler-util/src/taler-crypto.ts
index d7e9a0c06..b4b96afbc 100644
--- a/packages/taler-util/src/taler-crypto.ts
+++ b/packages/taler-util/src/taler-crypto.ts
@@ -1025,6 +1025,23 @@ export namespace AgeRestriction {
return count;
}
+ /**
+ * Get the starting points for age groups in the mask.
+ */
+ export function getAgeGroupsFromMask(mask: number): number[] {
+ const groups: number[] = [];
+ let age = 1;
+ let m = mask >> 1;
+ while (m > 0) {
+ if (m & 1) {
+ groups.push(age);
+ }
+ m = m >> 1;
+ age++;
+ }
+ return groups;
+ }
+
export function getAgeGroupIndex(mask: number, age: number): number {
invariant((mask & 1) === 1);
let i = 0;
diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts
index f6bc13d65..3eafe7522 100644
--- a/packages/taler-util/src/wallet-types.ts
+++ b/packages/taler-util/src/wallet-types.ts
@@ -919,6 +919,7 @@ export interface ExchangeListItem {
paytoUris: string[];
tosStatus: ExchangeTosStatus;
exchangeStatus: ExchangeEntryStatus;
+ supportedAgeGroups: number[];
/**
* Permanently added to the wallet, as opposed to just
* temporarily queried.
@@ -998,6 +999,7 @@ export const codecForExchangeListItem = (): Codec<ExchangeListItem> =>
.property("tosStatus", codecForAny())
.property("exchangeStatus", codecForAny())
.property("permanent", codecForBoolean())
+ .property("supportedAgeGroups", codecForList(codecForNumber()))
.build("ExchangeListItem");
export const codecForExchangesListResponse = (): Codec<ExchangesListResponse> =>
diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts
index ce0070e69..b68da8333 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -473,6 +473,11 @@ export interface ExchangeDetailsRecord {
| undefined;
wireInfo: WireInfo;
+
+ /**
+ * Age restrictions supported by the exchange (bitmask).
+ */
+ ageMask?: number;
}
export interface ExchangeTosRecord {
diff --git a/packages/taler-wallet-core/src/operations/common.ts b/packages/taler-wallet-core/src/operations/common.ts
index 59d2b8ec3..3ac003da3 100644
--- a/packages/taler-wallet-core/src/operations/common.ts
+++ b/packages/taler-wallet-core/src/operations/common.ts
@@ -18,6 +18,7 @@
* Imports.
*/
import {
+ AgeRestriction,
AmountJson,
Amounts,
CoinRefreshRequest,
@@ -365,6 +366,7 @@ export function makeExchangeListItem(
paytoUris: [],
exchangeStatus: ExchangeEntryStatus.Unknown,
permanent: r.permanent,
+ supportedAgeGroups: [],
};
}
let exchangeStatus;
@@ -376,5 +378,8 @@ export function makeExchangeListItem(
paytoUris: exchangeDetails.wireInfo.accounts.map((x) => x.payto_uri),
exchangeStatus,
permanent: r.permanent,
+ supportedAgeGroups: exchangeDetails.ageMask
+ ? AgeRestriction.getAgeGroupsFromMask(exchangeDetails.ageMask)
+ : [],
};
}
diff --git a/packages/taler-wallet-core/src/operations/exchanges.ts b/packages/taler-wallet-core/src/operations/exchanges.ts
index a8c4fec10..63e71c36c 100644
--- a/packages/taler-wallet-core/src/operations/exchanges.ts
+++ b/packages/taler-wallet-core/src/operations/exchanges.ts
@@ -76,6 +76,7 @@ import {
runOperationHandlerForResult,
} from "../util/retries.js";
import { WALLET_EXCHANGE_PROTOCOL_VERSION } from "../versions.js";
+import { isWithdrawableDenom } from "./withdraw.js";
const logger = new Logger("exchanges.ts");
@@ -657,6 +658,14 @@ export async function updateExchangeFromUrlHandler(
let detailsPointerChanged = false;
+ let ageMask = 0;
+ for (const x of keysInfo.currentDenominations) {
+ if (isWithdrawableDenom(x) && x.denomPub.age_mask != 0) {
+ ageMask = x.denomPub.age_mask;
+ break;
+ }
+ }
+
const updated = await ws.db
.mktx((x) => [
x.exchanges,
@@ -699,6 +708,7 @@ export async function updateExchangeFromUrlHandler(
wireInfo,
tosCurrentEtag: tosDownload.tosEtag,
tosAccepted: existingTosAccepted,
+ ageMask,
};
if (existingDetails?.rowId) {
newDetails.rowId = existingDetails.rowId;