summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2022-04-14 21:00:03 +0200
committerFlorian Dold <florian@dold.me>2022-04-14 21:00:03 +0200
commit3957f529bf4afd96b9bee802e20693fc076968c9 (patch)
tree6286ae0b28f48e232322b05462195dc86a2f9a7f
parentbc05050524e3ade854ef36194fad4cdd4b5e15e5 (diff)
downloadwallet-core-3957f529bf4afd96b9bee802e20693fc076968c9.tar.gz
wallet-core-3957f529bf4afd96b9bee802e20693fc076968c9.tar.bz2
wallet-core-3957f529bf4afd96b9bee802e20693fc076968c9.zip
anastasis: no more currencies per country
-rw-r--r--packages/anastasis-core/src/anastasis-data.ts238
-rw-r--r--packages/anastasis-core/src/index.ts85
-rw-r--r--packages/anastasis-core/src/reducer-types.ts6
-rw-r--r--packages/anastasis-webui/src/utils/index.tsx3
-rw-r--r--packages/taler-util/src/taler-error-codes.ts131
5 files changed, 302 insertions, 161 deletions
diff --git a/packages/anastasis-core/src/anastasis-data.ts b/packages/anastasis-core/src/anastasis-data.ts
index 924f4103d..cac4dc6c6 100644
--- a/packages/anastasis-core/src/anastasis-data.ts
+++ b/packages/anastasis-core/src/anastasis-data.ts
@@ -1,7 +1,6 @@
// This file is auto-generated, do not modify.
-// Generated from v0.2.0-4-g61ea83c on Tue, 05 Oct 2021 10:40:32 +0200
+// Generated from v0.2.0-151-g2ae958d on Thu, 14 Apr 2022 20:38:58 +0200
// To re-generate, run contrib/gen-ts.sh from the main anastasis code base.
-// XXX: Modified for demo, allowing demo providers for EUR
export const anastasisData = {
providersList: {
@@ -9,44 +8,36 @@ export const anastasisData = {
"SPDX-License-Identifier": "GPL3.0-or-later",
anastasis_provider: [
{
- url: "https://anastasis.demo.taler.net/",
- currency: "KUDOS",
+ url: "https://v1.anastasis.taler.net/",
+ name: "Bern University of Applied Sciences, Switzerland",
},
{
- url: "https://kudos.demo.anastasis.lu/",
- currency: "KUDOS",
+ url: "https://v1.anastasis.codeblau.de/",
+ name: "Codeblau GmbH, Germany",
},
{
- url: "https://anastasis.demo.taler.net/",
- currency: "EUR",
+ url: "https://v1.anastasis.openw3b.org/",
+ name: "Openw3b Foundation, India",
},
{
- url: "https://kudos.demo.anastasis.lu/",
- currency: "EUR",
- },
- {
- url: "https://anastasis.demo.taler.net/",
- currency: "CHF",
- },
- {
- url: "https://kudos.demo.anastasis.lu/",
- currency: "CHF",
+ url: "https://v1.anastasis.lu/",
+ name: "Anastasis SARL, Luxembourg",
},
{
url: "http://localhost:8086/",
- currency: "TESTKUDOS",
+ restricted: "xx",
},
{
url: "http://localhost:8087/",
- currency: "TESTKUDOS",
+ restricted: "xx",
},
{
url: "http://localhost:8088/",
- currency: "TESTKUDOS",
+ restricted: "xx",
},
{
url: "http://localhost:8089/",
- currency: "TESTKUDOS",
+ restricted: "xx",
},
],
},
@@ -62,7 +53,6 @@ export const anastasisData = {
de_DE: "Albanien",
en_UK: "Albania",
},
- currency: "ALL",
call_code: "+355",
},
{
@@ -73,7 +63,6 @@ export const anastasisData = {
de_DE: "Belgien",
en_UK: "Belgium",
},
- currency: "EUR",
call_code: "+32",
},
{
@@ -86,7 +75,6 @@ export const anastasisData = {
fr_FR: "Suisse",
en_UK: "Swiss",
},
- currency: "CHF",
call_code: "+41",
},
{
@@ -96,7 +84,6 @@ export const anastasisData = {
name_i18n: {
en_UK: "Czech Republic",
},
- currency: "CZK",
call_code: "+420",
},
{
@@ -110,7 +97,6 @@ export const anastasisData = {
fr_FR: "Allemagne",
en_UK: "Germany",
},
- currency: "EUR",
call_code: "+49",
},
{
@@ -121,7 +107,6 @@ export const anastasisData = {
name_i18n: {
en_UK: "Denmark",
},
- currency: "DKK",
call_code: "+45",
},
{
@@ -132,10 +117,19 @@ export const anastasisData = {
name_i18n: {
es_ES: "España",
},
- currency: "EUR",
call_code: "+44",
},
{
+ code: "fr",
+ name: "France",
+ continent: "Europe",
+ name_i18n: {
+ de_DE: "Frankreich",
+ fr_FR: "La France",
+ },
+ call_code: "+33",
+ },
+ {
code: "in",
name: "India",
continent: "India",
@@ -146,7 +140,6 @@ export const anastasisData = {
fr_FR: "l'Inde",
en_UK: "India",
},
- currency: "INR",
call_code: "+91",
},
{
@@ -157,7 +150,6 @@ export const anastasisData = {
de_DE: "Italien",
en_UK: "Italy",
},
- currency: "EUR",
call_code: "+39",
},
{
@@ -170,17 +162,26 @@ export const anastasisData = {
de_CH: "Japan",
en_UK: "Japan",
},
- currency: "JPY",
call_code: "+81",
},
{
- code: "sl",
+ code: "nl",
+ name: "Netherlands",
+ continent: "Europe",
+ name_i18n: {
+ de_DE: "Niederlande",
+ nl_NL: "Nederland",
+ en_UK: "Netherlands",
+ },
+ call_code: "+31",
+ },
+ {
+ code: "sk",
name: "Slovakia",
continent: "Europe",
name_i18n: {
en_UK: "Slovakia",
},
- currency: "EUR",
call_code: "+421",
},
{
@@ -194,37 +195,20 @@ export const anastasisData = {
fr_FR: "États-Unis d'Amérique (USA)",
en_UK: "United States of America (USA)",
},
- currency: "USD",
call_code: "+1",
},
{
code: "xx",
name: "Testland",
- continent: "Testcontinent",
- continent_i18n: { de_DE: "Testkontinent" },
+ continent: "Demoworld",
name_i18n: {
de_DE: "Testlandt",
de_CH: "Testlandi",
fr_FR: "Testpais",
en_UK: "Testland",
},
- currency: "TESTKUDOS",
call_code: "+00",
},
- {
- code: "xy",
- name: "Demoland",
- continent: "Testcontinent",
- continent_i18n: { de_DE: "Testkontinent" },
- name_i18n: {
- de_DE: "Demolandt",
- de_CH: "Demolandi",
- fr_FR: "Demopais",
- en_UK: "Demoland",
- },
- currency: "KUDOS",
- call_code: "+01",
- },
],
},
countryDetails: {
@@ -337,9 +321,9 @@ export const anastasisData = {
widget: "anastasis_gtk_ia_ahv",
uuid: "1da87570-ba16-4f62-8a7e-cbda92f51591",
"validation-regex":
- "^(756).[0-9]{4}.[0-9]{4}.[0-9]{2}|(756)[0-9]{10}$",
+ "^(756)\\.[0-9]{4}\\.[0-9]{4}\\.[0-9]{2}|(756)[0-9]{10}$",
"validation-logic": "CH_AHV_check",
- autocomplete: "???.????.????.??"
+ autocomplete: "???.????.????.??",
},
],
},
@@ -404,19 +388,6 @@ export const anastasisData = {
},
{
type: "string",
- name: "tax_number",
- label: "Taxpayer identification number",
- label_i18n: {
- de_DE: "Steuerliche Identifikationsnummer",
- en: "German taxpayer identification number",
- },
- widget: "anastasis_gtk_ia_tax_de",
- uuid: "dae48f85-e3ff-47a4-a4a3-ed981ed8c3c6",
- "validation-regex": "^[0-9]{11}$",
- "validation-logic": "DE_TIN_check",
- },
- {
- type: "string",
name: "social_security_number",
label: "Social security number",
label_i18n: {
@@ -429,6 +400,19 @@ export const anastasisData = {
"validation-logic": "DE_SVN_check",
optional: true,
},
+ {
+ type: "string",
+ name: "tax_number",
+ label: "Taxpayer identification number",
+ label_i18n: {
+ de_DE: "Steuerliche Identifikationsnummer",
+ en: "German taxpayer identification number",
+ },
+ widget: "anastasis_gtk_ia_tin_de",
+ uuid: "dae48f85-e3ff-47a4-a4a3-ed981ed8c3c6",
+ "validation-regex": "^[0-9]{11}$",
+ "validation-logic": "DE_TIN_check",
+ },
],
},
dk: {
@@ -514,6 +498,46 @@ export const anastasisData = {
},
],
},
+ fr: {
+ license: "GPLv3+",
+ "SPDX-License-Identifier": "GPL3.0-or-later",
+ required_attributes: [
+ {
+ type: "string",
+ name: "full_name",
+ label: "Full name",
+ widget: "anastasis_gtk_ia_full_name",
+ uuid: "9e8f463f-575f-42cb-85f3-759559997331",
+ },
+ {
+ type: "date",
+ name: "birthdate",
+ label: "Birthdate",
+ widget: "anastasis_gtk_ia_birthdate",
+ uuid: "83d655c7-bdb6-484d-904e-80c1058c8854",
+ },
+ {
+ type: "string",
+ name: "birthplace",
+ label: "Birthplace",
+ widget: "anastasis_gtk_ia_birthplace",
+ uuid: "4c822e8e-89c6-11eb-95c4-8b077ad8489f",
+ },
+ {
+ type: "string",
+ name: "social_security_number",
+ label: "Code Insee",
+ label_i18n: {
+ fr_FR: "Code Insee",
+ en: "INSEE code",
+ },
+ widget: "anastasis_gtk_ia_insee_fr",
+ uuid: "2f36a81c-3f6d-41f3-97ee-9c885bc41873",
+ "validation-regex": "^[0-9]{15}$",
+ "validation-logic": "FR_INSEE_check",
+ },
+ ],
+ },
in: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
@@ -626,6 +650,46 @@ export const anastasisData = {
},
],
},
+ nl: {
+ license: "GPLv3+",
+ "SPDX-License-Identifier": "GPL3.0-or-later",
+ required_attributes: [
+ {
+ type: "string",
+ name: "full_name",
+ label: "Full name",
+ widget: "anastasis_gtk_ia_full_name",
+ uuid: "9e8f463f-575f-42cb-85f3-759559997331",
+ },
+ {
+ type: "date",
+ name: "birthdate",
+ label: "Birthdate",
+ widget: "anastasis_gtk_ia_birthdate",
+ uuid: "83d655c7-bdb6-484d-904e-80c1058c8854",
+ },
+ {
+ type: "string",
+ name: "birthplace",
+ label: "Birthplace",
+ widget: "anastasis_gtk_ia_birthplace",
+ uuid: "4c822e8e-89c6-11eb-95c4-8b077ad8489f",
+ },
+ {
+ type: "string",
+ name: "social_security_number",
+ label: "Citizen Service Number",
+ label_i18n: {
+ nl_NL: "Burgerservicenummer (BSN)",
+ en: "Citizen Service Number",
+ },
+ widget: "anastasis_gtk_ia_ssn_nl",
+ uuid: "b6bf1f14-1f85-4afb-af21-f54b88490bdc",
+ "validation-regex": "^[1-9][0-9]{8}$",
+ "validation-logic": "NL_BSN_check",
+ },
+ ],
+ },
sk: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
@@ -702,35 +766,7 @@ export const anastasisData = {
xx: {
license: "GPLv3+",
"SPDX-License-Identifier": "GPL3.0-or-later",
- required_attributes: [
- {
- type: "string",
- name: "full_name",
- label: "Full name",
- widget: "anastasis_gtk_ia_full_name",
- uuid: "9e8f463f-575f-42cb-85f3-759559997331",
- },
- {
- type: "date",
- name: "birthdate",
- label: "Birthdate",
- widget: "anastasis_gtk_ia_birthdate",
- uuid: "83d655c7-bdb6-484d-904e-80c1058c8854",
- },
- {
- type: "string",
- name: "sq_number",
- label: "Square number",
- widget: "anastasis_gtk_xx_square",
- uuid: "ed790bca-89bf-11eb-96f2-233996cf644e",
- "validation-regex": "^[0-9]+$",
- "validation-logic": "XX_SQUARE_check",
- },
- ],
- },
- xy: {
- license: "GPLv3+",
- "SPDX-License-Identifier": "GPL3.0-or-later",
+ restricted: "xx",
required_attributes: [
{
type: "string",
@@ -754,6 +790,16 @@ export const anastasisData = {
uuid: "39190a95-cacb-4412-8bae-1f7da3f980b4",
"validation-regex": "^[0-9]+$",
"validation-logic": "XY_PRIME_check",
+ optional: true,
+ },
+ {
+ type: "string",
+ name: "sq_number",
+ label: "Square number",
+ widget: "anastasis_gtk_xx_square",
+ uuid: "ed790bca-89bf-11eb-96f2-233996cf644e",
+ "validation-regex": "^[0-9]+$",
+ "validation-logic": "XX_SQUARE_check",
},
],
},
diff --git a/packages/anastasis-core/src/index.ts b/packages/anastasis-core/src/index.ts
index 012667879..5dd560a2c 100644
--- a/packages/anastasis-core/src/index.ts
+++ b/packages/anastasis-core/src/index.ts
@@ -142,23 +142,13 @@ const logger = new Logger("anastasis-core:index.ts");
const ANASTASIS_HTTP_HEADER_POLICY_META_DATA = "Anastasis-Policy-Meta-Data";
-function getContinents(
- opts: { requireProvider?: boolean } = {},
-): ContinentInfo[] {
- const currenciesWithProvider = new Set<string>();
- anastasisData.providersList.anastasis_provider.forEach((x) => {
- currenciesWithProvider.add(x.currency);
- });
+function getContinents(): ContinentInfo[] {
const continentSet = new Set<string>();
const continents: ContinentInfo[] = [];
for (const country of anastasisData.countriesList.countries) {
if (continentSet.has(country.continent)) {
continue;
}
- if (opts.requireProvider && !currenciesWithProvider.has(country.currency)) {
- // Country's currency doesn't have any providers => skip
- continue;
- }
continentSet.add(country.continent);
continents.push({
...{ name_i18n: country.continent_i18n },
@@ -191,23 +181,14 @@ export class ReducerError extends Error {
* Get countries for a continent, abort with ReducerError
* exception when continent doesn't exist.
*/
-function getCountries(
- continent: string,
- opts: { requireProvider?: boolean } = {},
-): CountryInfo[] {
- const currenciesWithProvider = new Set<string>();
- anastasisData.providersList.anastasis_provider.forEach((x) => {
- currenciesWithProvider.add(x.currency);
- });
+function getCountries(continent: string): CountryInfo[] {
const countries = anastasisData.countriesList.countries.filter(
- (x) =>
- x.continent === continent &&
- (!opts.requireProvider || currenciesWithProvider.has(x.currency)),
+ (x) => x.continent === continent,
);
if (countries.length <= 0) {
throw new ReducerError({
code: TalerErrorCode.ANASTASIS_REDUCER_INPUT_INVALID,
- hint: "continent not found",
+ hint: `continent ${continent} not found`,
});
}
return countries;
@@ -217,9 +198,7 @@ export async function getBackupStartState(): Promise<ReducerStateBackup> {
return {
reducer_type: "backup",
backup_state: BackupStates.ContinentSelecting,
- continents: getContinents({
- requireProvider: true,
- }),
+ continents: getContinents(),
};
}
@@ -227,9 +206,7 @@ export async function getRecoveryStartState(): Promise<ReducerStateRecovery> {
return {
reducer_type: "recovery",
recovery_state: RecoveryStates.ContinentSelecting,
- continents: getContinents({
- requireProvider: true,
- }),
+ continents: getContinents(),
};
}
@@ -238,7 +215,6 @@ async function selectCountry(
args: ActionArgsSelectCountry,
): Promise<Partial<ReducerStateBackup> & Partial<ReducerStateRecovery>> {
const countryCode = args.country_code;
- const currencies = args.currencies;
const country = anastasisData.countriesList.countries.find(
(x) => x.code === countryCode,
);
@@ -258,7 +234,10 @@ async function selectCountry(
const providers: { [x: string]: AuthenticationProviderStatus } = {};
for (const prov of anastasisData.providersList.anastasis_provider) {
- if (currencies.includes(prov.currency)) {
+ let shouldAdd =
+ country.code === prov.restricted ||
+ (country.code !== "xx" && !prov.restricted);
+ if (shouldAdd) {
providers[prov.url] = {
status: "not-contacted",
};
@@ -270,7 +249,6 @@ async function selectCountry(
return {
selected_country: countryCode,
- currencies,
required_attributes: ra,
authentication_providers: providers,
};
@@ -1223,9 +1201,7 @@ async function backupSelectContinent(
state: ReducerStateBackup,
args: ActionArgsSelectContinent,
): Promise<ReducerStateBackup | ReducerStateError> {
- const countries = getCountries(args.continent, {
- requireProvider: true,
- });
+ const countries = getCountries(args.continent);
if (countries.length <= 0) {
return {
reducer_type: "error",
@@ -1245,9 +1221,7 @@ async function recoverySelectContinent(
state: ReducerStateRecovery,
args: ActionArgsSelectContinent,
): Promise<ReducerStateRecovery | ReducerStateError> {
- const countries = getCountries(args.continent, {
- requireProvider: true,
- });
+ const countries = getCountries(args.continent);
return {
...state,
recovery_state: RecoveryStates.CountrySelecting,
@@ -1540,6 +1514,40 @@ async function nextFromChallengeSelecting(
};
}
+async function syncProviders(
+ state: ReducerStateRecovery,
+ args: void,
+): Promise<ReducerStateRecovery | ReducerStateError> {
+ const escrowMethods = state.verbatim_recovery_document?.escrow_methods ?? [];
+ if (escrowMethods.length === 0) {
+ return {
+ reducer_type: "error",
+ code: TalerErrorCode.ANASTASIS_REDUCER_ACTION_INVALID,
+ hint: "Can't sync, no escrow methods in recovery doc.",
+ };
+ }
+ for (const x of escrowMethods) {
+ const pi = state.authentication_providers?.[x.url];
+ if (pi?.status === "ok") {
+ logger.info(`provider ${x.url} is synced`);
+ continue;
+ }
+ const newPi = await getProviderInfo(x.url);
+ return {
+ ...state,
+ authentication_providers: {
+ ...state.authentication_providers,
+ [x.url]: newPi,
+ },
+ };
+ }
+ return {
+ reducer_type: "error",
+ code: TalerErrorCode.ANASTASIS_REDUCER_PROVIDERS_ALREADY_SYNCED,
+ hint: "all providers are already synced",
+ };
+}
+
async function enterSecretName(
state: ReducerStateBackup,
args: ActionArgsEnterSecretName,
@@ -1714,6 +1722,7 @@ const recoveryTransitions: Record<
),
...transition("poll", codecForAny(), pollChallenges),
...transition("next", codecForAny(), nextFromChallengeSelecting),
+ ...transition("sync_providers", codecForAny(), syncProviders),
},
[RecoveryStates.ChallengeSolving]: {
...transitionRecoveryJump("back", RecoveryStates.ChallengeSelecting),
diff --git a/packages/anastasis-core/src/reducer-types.ts b/packages/anastasis-core/src/reducer-types.ts
index bb06ea7c3..a0af2f86e 100644
--- a/packages/anastasis-core/src/reducer-types.ts
+++ b/packages/anastasis-core/src/reducer-types.ts
@@ -41,7 +41,6 @@ export interface CountryInfo {
code: string;
name: string;
continent: string;
- currency: string;
}
export interface Policy {
@@ -77,8 +76,6 @@ export interface ReducerStateBackup {
backup_state: BackupStates;
- currencies?: string[];
-
continents?: ContinentInfo[];
countries?: CountryInfo[];
@@ -201,7 +198,6 @@ export interface ReducerStateRecovery {
selected_continent?: string;
selected_country?: string;
- currencies?: string[];
required_attributes?: UserAttributeSpec[];
@@ -406,7 +402,6 @@ export const codecForActionArgSelectContinent = () =>
export interface ActionArgsSelectCountry {
country_code: string;
- currencies: string[];
}
export interface ActionArgsSelectChallenge {
@@ -551,5 +546,4 @@ export const codecForActionArgsSelectChallenge = () =>
export const codecForActionArgSelectCountry = () =>
buildCodecForObject<ActionArgsSelectCountry>()
.property("country_code", codecForString())
- .property("currencies", codecForList(codecForString()))
.build("ActionArgSelectCountry");
diff --git a/packages/anastasis-webui/src/utils/index.tsx b/packages/anastasis-webui/src/utils/index.tsx
index 51a074fe9..d2b64e31e 100644
--- a/packages/anastasis-webui/src/utils/index.tsx
+++ b/packages/anastasis-webui/src/utils/index.tsx
@@ -3,6 +3,7 @@ import {
BackupStates,
RecoveryStates,
ReducerState,
+ ReducerStateRecovery,
} from "@gnu-taler/anastasis-core";
import { FunctionalComponent, h, VNode } from "preact";
import { AnastasisProvider } from "../context/anastasis";
@@ -222,7 +223,7 @@ export const reducerStatesExample = {
challengeSolving: {
...base,
recovery_state: RecoveryStates.ChallengeSolving,
- } as ReducerState,
+ } as ReducerStateRecovery,
challengePaying: {
...base,
recovery_state: RecoveryStates.ChallengePaying,
diff --git a/packages/taler-util/src/taler-error-codes.ts b/packages/taler-util/src/taler-error-codes.ts
index 539289862..83ac7c1bd 100644
--- a/packages/taler-util/src/taler-error-codes.ts
+++ b/packages/taler-util/src/taler-error-codes.ts
@@ -417,6 +417,13 @@ export enum TalerErrorCode {
EXCHANGE_GENERIC_GLOBAL_FEES_MISSING = 1022,
/**
+ * The exchange was not properly configured with wire fees.
+ * Returned with an HTTP status code of #MHD_HTTP_INTERNAL_SERVER_ERROR (500).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_GENERIC_WIRE_FEES_MISSING = 1023,
+
+ /**
* The exchange did not find information about the specified transaction in the database.
* Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
* (A value of 0 indicates that the error is generated client-side).
@@ -1180,6 +1187,55 @@ export enum TalerErrorCode {
EXCHANGE_CREATE_PURSE_NEGATIVE_VALUE_AFTER_FEE = 1860,
/**
+ * The purse to be merged is not known.
+ * Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_MERGE_PURSE_NOT_FOUND = 1875,
+
+ /**
+ * The signature using the merge key is invalid.
+ * Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_PURSE_MERGE_INVALID_MERGE_SIGNATURE = 1876,
+
+ /**
+ * The signature using the reserve key is invalid.
+ * Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_PURSE_MERGE_INVALID_RESERVE_SIGNATURE = 1877,
+
+ /**
+ * The targeted purse is not yet full and thus cannot be merged. Retrying the request later may succeed.
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_PURSE_NOT_FULL = 1878,
+
+ /**
+ * The signature from the exchange over the confirmation is invalid.
+ * Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_PURSE_MERGE_EXCHANGE_SIGNATURE_INVALID = 1879,
+
+ /**
+ * The exchange of the target account is not a partner of this exchange.
+ * Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_MERGE_PURSE_PARTNER_UNKNOWN = 1880,
+
+ /**
+ * The amount in the purse is lower than the wad fee. So the request was accepted, but no transfer is expected to take place. FIXME-DOLD: good HTTP status. Suggestion: no error, make variant of 200 OK.
+ * Returned with an HTTP status code of #MHD_HTTP_ACCEPTED (202).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_PURSE_MERGE_WAD_FEE_EXCEEDS_PURSE_VALUE = 1881,
+
+ /**
* The auditor signature over the denomination meta data is invalid.
* Returned with an HTTP status code of #MHD_HTTP_FORBIDDEN (403).
* (A value of 0 indicates that the error is generated client-side).
@@ -1236,6 +1292,41 @@ export enum TalerErrorCode {
EXCHANGE_KYC_CHECK_AUTHORIZATION_FAILED = 1930,
/**
+ * The exchange does not know a contract under the given contract public key.
+ * Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_CONTRACTS_UNKNOWN = 1950,
+
+ /**
+ * The URL does not encode a valid exchange public key in its path.
+ * Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_CONTRACTS_INVALID_CONTRACT_PUB = 1951,
+
+ /**
+ * The returned encrypted contract did not decrypt.
+ * Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_CONTRACTS_DECRYPTION_FAILED = 1952,
+
+ /**
+ * The signature on the encrypted contract did not validate.
+ * Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_CONTRACTS_SIGNATURE_INVALID = 1953,
+
+ /**
+ * The decrypted contract was malformed.
+ * Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ EXCHANGE_CONTRACTS_DECODING_FAILED = 1954,
+
+ /**
* The backend could not find the merchant instance specified in the request.
* Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND (404).
* (A value of 0 indicates that the error is generated client-side).
@@ -2419,13 +2510,6 @@ export enum TalerErrorCode {
ANASTASIS_TRUTH_CHALLENGE_UNKNOWN = 8112,
/**
- * A challenge is already active, the service is thus not issuing a new one.
- * Returned with an HTTP status code of #MHD_HTTP_ALREADY_REPORTED (208).
- * (A value of 0 indicates that the error is generated client-side).
- */
- ANASTASIS_TRUTH_CHALLENGE_ACTIVE = 8113,
-
- /**
* The backend failed to initiate the authorization process.
* Returned with an HTTP status code of #MHD_HTTP_INTERNAL_SERVER_ERROR (500).
* (A value of 0 indicates that the error is generated client-side).
@@ -2482,13 +2566,6 @@ export enum TalerErrorCode {
ANASTASIS_TRUTH_RATE_LIMITED = 8121,
/**
- * The authentication process did not yet complete. The user should try again later.
- * Returned with an HTTP status code of #MHD_HTTP_FORBIDDEN (403).
- * (A value of 0 indicates that the error is generated client-side).
- */
- ANASTASIS_TRUTH_AUTH_TIMEOUT = 8122,
-
- /**
* A request to issue a challenge is not valid for this authentication method.
* Returned with an HTTP status code of #MHD_HTTP_BAD_REQUEST (400).
* (A value of 0 indicates that the error is generated client-side).
@@ -2511,7 +2588,7 @@ export enum TalerErrorCode {
/**
* The provided phone number is not an acceptable number.
- * Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_SMS_PHONE_INVALID = 8200,
@@ -2532,7 +2609,7 @@ export enum TalerErrorCode {
/**
* The provided email address is not an acceptable address.
- * Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_EMAIL_INVALID = 8210,
@@ -2553,7 +2630,7 @@ export enum TalerErrorCode {
/**
* The provided postal address is not an acceptable address.
- * Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_POST_INVALID = 8220,
@@ -2574,21 +2651,28 @@ export enum TalerErrorCode {
/**
* The provided IBAN address is not an acceptable IBAN.
- * Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_IBAN_INVALID = 8230,
/**
+ * The provider has not yet received the IBAN wire transfer authorizing the disclosure of the key share.
+ * Returned with an HTTP status code of #MHD_HTTP_FORBIDDEN (403).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ ANASTASIS_IBAN_MISSING_TRANSFER = 8231,
+
+ /**
* The backend did not find a TOTP key in the data provided.
- * Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_TOTP_KEY_MISSING = 8240,
/**
* The key provided does not satisfy the format restrictions for an Anastasis TOTP key.
- * Returned with an HTTP status code of #MHD_HTTP_EXPECTATION_FAILED (417).
+ * Returned with an HTTP status code of #MHD_HTTP_CONFLICT (409).
* (A value of 0 indicates that the error is generated client-side).
*/
ANASTASIS_TOTP_KEY_INVALID = 8241,
@@ -2776,6 +2860,13 @@ export enum TalerErrorCode {
ANASTASIS_REDUCER_INTERNAL_ERROR = 8419,
/**
+ * The reducer already synchronized with all providers.
+ * Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
+ * (A value of 0 indicates that the error is generated client-side).
+ */
+ ANASTASIS_REDUCER_PROVIDERS_ALREADY_SYNCED = 8420,
+
+ /**
* A generic error happened in the LibEuFin nexus. See the enclose details JSON for more information.
* Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
* (A value of 0 indicates that the error is generated client-side).