wallet-core: report supportedAgeGroups

This commit is contained in:
Florian Dold 2022-11-01 15:31:48 +01:00
parent a0305884eb
commit d63a773bf5
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
5 changed files with 39 additions and 0 deletions

View File

@ -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;

View File

@ -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> =>

View File

@ -473,6 +473,11 @@ export interface ExchangeDetailsRecord {
| undefined;
wireInfo: WireInfo;
/**
* Age restrictions supported by the exchange (bitmask).
*/
ageMask?: number;
}
export interface ExchangeTosRecord {

View File

@ -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)
: [],
};
}

View File

@ -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;