wallet-core: skeleton support for regional currency scopes

This commit is contained in:
Florian Dold 2023-02-12 21:13:30 +01:00
parent 13f0442736
commit 79b77a0c3c
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 59 additions and 11 deletions

View File

@ -27,11 +27,7 @@
/**
* Imports.
*/
import {
AmountJson,
codecForAmountJson,
codecForAmountString,
} from "./amounts.js";
import { AmountJson, codecForAmountString } from "./amounts.js";
import { BackupRecovery } from "./backup-types.js";
import {
buildCodecForObject,
@ -116,6 +112,7 @@ export const codecForGetBalanceDetailRequest =
.build("GetBalanceDetailRequest");
export interface Balance {
scopeInfo: ScopeInfo;
available: AmountString;
pendingIncoming: AmountString;
pendingOutgoing: AmountString;
@ -137,12 +134,24 @@ export interface InitResponse {
versionInfo: WalletCoreVersion;
}
export enum ScopeType {
Global = "global",
Exchange = "exchange",
Auditor = "auditor",
}
export type ScopeInfo =
| { type: ScopeType.Global; currency: string }
| { type: ScopeType.Exchange; currency: string; url: string }
| { type: ScopeType.Auditor; currency: string; url: string };
export interface BalancesResponse {
balances: Balance[];
}
export const codecForBalance = (): Codec<Balance> =>
buildCodecForObject<Balance>()
.property("scopeInfo", codecForAny()) // FIXME
.property("available", codecForString())
.property("hasPendingTransactions", codecForBoolean())
.property("pendingIncoming", codecForString())
@ -1423,11 +1432,12 @@ export interface PreparePayTemplateRequest {
templateParams: Record<string, string>;
}
export const codecForPreparePayTemplateRequest = (): Codec<PreparePayTemplateRequest> =>
buildCodecForObject<PreparePayTemplateRequest>()
.property("talerPayTemplateUri", codecForString())
.property("templateParams", codecForAny())
.build("PreparePayTemplate");
export const codecForPreparePayTemplateRequest =
(): Codec<PreparePayTemplateRequest> =>
buildCodecForObject<PreparePayTemplateRequest>()
.property("talerPayTemplateUri", codecForString())
.property("templateParams", codecForAny())
.build("PreparePayTemplate");
export interface ConfirmPayRequest {
proposalId: string;

View File

@ -121,7 +121,7 @@ export const CURRENT_DB_CONFIG_KEY = "currentMainDbName";
* backwards-compatible way or object stores and indices
* are added.
*/
export const WALLET_DB_MINOR_VERSION = 2;
export const WALLET_DB_MINOR_VERSION = 3;
/**
* Ranges for operation status fields.
@ -1956,11 +1956,44 @@ export interface UserAttentionRecord {
read: TalerProtocolTimestamp | undefined;
}
export interface DbExchangeHandle {
url: string;
exchangeMasterPub: string;
}
export interface DbAuditorHandle {
url: string;
auditorPub: string;
}
// Work in progress for regional currencies
export interface CurrencySettingsRecord {
currency: string;
globalScopeExchanges: DbExchangeHandle[];
globalScopeAuditors: DbAuditorHandle[];
// Used to decide which auditor to show the currency under
// when multiple auditors apply.
auditorPriority: string[];
// Later, we might add stuff related to how the currency is rendered.
}
/**
* Schema definition for the IndexedDB
* wallet database.
*/
export const WalletStoresV1 = {
currencySettings: describeStore(
"currencySettings",
describeContents<CurrencySettingsRecord>({
keyPath: ["currency"],
versionAdded: 3,
}),
{},
),
coinAvailability: describeStore(
"coinAvailability",
describeContents<CoinAvailabilityRecord>({

View File

@ -54,6 +54,7 @@ import {
GetBalanceDetailRequest,
Logger,
parsePaytoUri,
ScopeType,
} from "@gnu-taler/taler-util";
import {
AllowedAuditorInfo,
@ -170,6 +171,10 @@ export async function getBalancesInsideTransaction(
.forEach((c) => {
const v = balanceStore[c];
balancesResponse.balances.push({
scopeInfo: {
type: ScopeType.Global,
currency: Amounts.currencyOf(v.available),
},
available: Amounts.stringify(v.available),
pendingIncoming: Amounts.stringify(v.pendingIncoming),
pendingOutgoing: Amounts.stringify(v.pendingOutgoing),