commit d4d4b29a5706174fbb1a872f3c57f6dbd7bf9167
parent f0ce9c0f6abecb19bdd2b70f112efc9a2766423d
Author: Sebastian <sebasjm@gmail.com>
Date: Tue, 22 Apr 2025 17:49:05 -0300
change payto://taler/ to payto://taler-reserve/ and payto://taler-reserve-http/
Diffstat:
12 files changed, 101 insertions(+), 43 deletions(-)
diff --git a/packages/aml-backoffice-ui/src/pages/Search.tsx b/packages/aml-backoffice-ui/src/pages/Search.tsx
@@ -52,7 +52,10 @@ import { privatePages } from "../Routing.js";
import { Pagination, ToInvestigateIcon } from "./Cases.js";
import { HandleAccountNotReady } from "./HandleAccountNotReady.js";
import { Officer } from "./Officer.js";
-import { DECISION_REQUEST_EMPTY, DecisionRequest } from "../hooks/decision-request.js";
+import {
+ DECISION_REQUEST_EMPTY,
+ DecisionRequest,
+} from "../hooks/decision-request.js";
export function Search({
onNewDecision,
@@ -298,7 +301,11 @@ function ShowResult({
// payto: encodeCrockForURI(paytoStr),
// })}
onClick={async () => {
- onNewDecision(DECISION_REQUEST_EMPTY, account, encodeCrockForURI(paytoStr));
+ onNewDecision(
+ DECISION_REQUEST_EMPTY,
+ account,
+ encodeCrockForURI(paytoStr),
+ );
}}
class="text-indigo-600 hover:text-indigo-900"
>
@@ -422,7 +429,7 @@ function WalletForm({
form.status.status === "fail"
? undefined
: buildPayto(
- "taler",
+ "taler-reserve",
form.status.result.exchange,
form.status.result.reservePub,
);
diff --git a/packages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx b/packages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx
@@ -364,7 +364,9 @@ function Header({
? undefined
: (newPaytoParsed = parsePaytoUri(newPayto)) === undefined
? undefined
- : newPaytoParsed.isKnown && newPaytoParsed.targetType === "taler";
+ : newPaytoParsed.isKnown &&
+ (newPaytoParsed.targetType === "taler-reserve" ||
+ newPaytoParsed.targetType === "taler-reserve-http");
const activeDecision = useAccountActiveDecision(
isNewAccount ? undefined : account,
diff --git a/packages/aml-backoffice-ui/src/pages/decision/Rules.tsx b/packages/aml-backoffice-ui/src/pages/decision/Rules.tsx
@@ -137,7 +137,9 @@ export function Rules({
? undefined
: (newPaytoParsed = parsePaytoUri(newPayto)) === undefined
? undefined
- : newPaytoParsed.isKnown && newPaytoParsed.targetType === "taler";
+ : newPaytoParsed.isKnown &&
+ (newPaytoParsed.targetType === "taler-reserve" ||
+ newPaytoParsed.targetType === "taler-reserve-http");
// const [request, updateRequestField, updateRequest] =
// useCurrentDecisionRequest();
diff --git a/packages/bank-ui/src/pages/OperationState/views.tsx b/packages/bank-ui/src/pages/OperationState/views.tsx
@@ -212,7 +212,10 @@ export function NeedConfirmationView({
<i18n.Translate>Confirm the withdrawal operation</i18n.Translate>
</h3>
<div class="mt-3 text-sm leading-6">
- <ShouldBeSameUser username={account} onAuthorizationRequired={onAuthorizationRequired}>
+ <ShouldBeSameUser
+ username={account}
+ onAuthorizationRequired={onAuthorizationRequired}
+ >
<form
class="bg-white shadow-sm ring-1 ring-gray-900/5 sm:rounded-xl md:col-span-2"
autoCapitalize="none"
@@ -240,7 +243,8 @@ export function NeedConfirmationView({
);
}
switch (details.account.targetType) {
- case "taler": {
+ case "taler-reserve-http":
+ case "taler-reserve": {
// FIXME: support wire transfer to wallet
return <div>not yet supported</div>;
}
diff --git a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx
@@ -167,7 +167,8 @@ export function PaytoWireTransferForm({
? undefined
: p.targetType === "iban"
? p.iban
- : p.targetType === "taler"
+ : p.targetType === "taler-reserve" ||
+ p.targetType === "taler-reserve-http"
? undefined // FIXME: unsupported payto://
: p.targetType === "bitcoin"
? p.address
@@ -322,7 +323,10 @@ export function PaytoWireTransferForm({
onChange={() => {
if (parsed && parsed.isKnown) {
switch (parsed.targetType) {
- case "taler": {
+ case "ethereum":
+ case "bitcoin":
+ case "taler-reserve":
+ case "taler-reserve-http": {
// FIXME: unsupported payto
break;
}
@@ -334,14 +338,6 @@ export function PaytoWireTransferForm({
setAccount(parsed.account);
break;
}
- case "bitcoin": {
- // FIXME: unsupported payto
- break;
- }
- case "ethereum": {
- // FIXME: unsupported payto
- break;
- }
default: {
assertUnreachable(parsed);
}
diff --git a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx
@@ -275,7 +275,8 @@ export function WithdrawalConfirmationQuestion({
);
}
switch (details.account.targetType) {
- case "taler": {
+ case "taler-reserve-http":
+ case "taler-reserve": {
// FIXME: support wire transfer to wallet
return <div>not yet supported</div>;
}
diff --git a/packages/merchant-backoffice-ui/src/components/modal/index.tsx b/packages/merchant-backoffice-ui/src/components/modal/index.tsx
@@ -465,7 +465,8 @@ export function ValidBankAccount({
? origin.targetPath
: origin.targetType === "iban"
? origin.iban
- : origin.targetType === "taler"
+ : origin.targetType === "taler-reserve" ||
+ origin.targetType === "taler-reserve-http"
? origin.reservePub
: origin.targetType === "bitcoin"
? `${origin.address.substring(0, 8)}...`
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx
@@ -23,8 +23,7 @@ import {
parsePaytoUri,
PaytoType,
PaytoUri,
- PaytoUriBitcoin,
- TalerMerchantApi
+ TalerMerchantApi,
} from "@gnu-taler/taler-util";
import { useTranslationContext } from "@gnu-taler/web-util/browser";
import { Fragment, h, VNode } from "preact";
@@ -105,14 +104,23 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode {
const emptyList: Record<
PaytoType | "unknown",
{ parsed: PaytoUri; acc: Entity }[]
- > = { bitcoin: [], "x-taler-bank": [], iban: [], taler: [], unknown: [], ethereum: [] };
+ > = {
+ bitcoin: [],
+ "x-taler-bank": [],
+ iban: [],
+ "taler-reserve": [],
+ "taler-reserve-http": [],
+ unknown: [],
+ ethereum: [],
+ };
const accountsByType = accounts.reduce((prev, acc) => {
const parsed = parsePaytoUri(acc.payto_uri);
if (!parsed) return prev; //skip
if (
parsed.targetType !== "bitcoin" &&
- parsed.targetType !== "taler" &&
+ parsed.targetType !== "taler-reserve" &&
+ parsed.targetType !== "taler-reserve-http" &&
parsed.targetType !== "x-taler-bank" &&
parsed.targetType !== "iban"
) {
@@ -127,7 +135,8 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode {
const talerbankAccounts = accountsByType["x-taler-bank"];
const ibanAccounts = accountsByType["iban"];
const unknownAccounts = accountsByType["unknown"];
-
+ //FIXME: add support for payto://taler-reserve and payto://taler-reserve-http
+ //FIXME: this code doesn't addapt well on new payto definitions
return (
<Fragment>
<div class="table-container">
@@ -290,7 +299,6 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode {
</tbody>
</table>
</div>
-
</Fragment>
);
}
diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx
@@ -464,8 +464,11 @@ export function paytoDisplayAccountName(account: PaytoString): string {
case "iban": {
return p.iban;
}
- case "taler": {
- return p.reservePub;
+ case "taler-reserve": {
+ return `${p.reservePub}@${p.exchange}`;
+ }
+ case "taler-reserve-http": {
+ return `${p.reservePub}@${p.exchange}`;
}
case "x-taler-bank": {
return `${p.account}@${p.host}`;
diff --git a/packages/taler-util/src/payto.ts b/packages/taler-util/src/payto.ts
@@ -25,7 +25,6 @@ import {
} from "./codec.js";
import {
AccessToken,
- assertUnreachable,
codecForAccessToken,
codecOptional,
hashTruncate32,
@@ -37,6 +36,7 @@ export type PaytoUri =
| PaytoUriUnknown
| PaytoUriIBAN
| PaytoUriTaler
+ | PaytoUriTalerHttp
| PaytoUriTalerBank
| PaytoUriEthereum
| PaytoUriBitcoin;
@@ -82,7 +82,14 @@ export interface PaytoUriIBAN extends PaytoUriGeneric {
export interface PaytoUriTaler extends PaytoUriGeneric {
isKnown: true;
- targetType: "taler";
+ targetType: "taler-reserve";
+ exchange: string;
+ reservePub: string;
+}
+
+export interface PaytoUriTalerHttp extends PaytoUriGeneric {
+ isKnown: true;
+ targetType: "taler-reserve-http";
exchange: string;
reservePub: string;
}
@@ -113,7 +120,8 @@ export type PaytoType =
| "iban"
| "bitcoin"
| "x-taler-bank"
- | "taler"
+ | "taler-reserve"
+ | "taler-reserve-http"
| "ethereum";
export function buildPayto(
@@ -123,7 +131,13 @@ export function buildPayto(
params?: Record<string, string>,
): PaytoUriIBAN;
export function buildPayto(
- type: "taler",
+ type: "taler-reserve",
+ exchange: string,
+ reservePub: string,
+ params?: Record<string, string>,
+): PaytoUriIBAN;
+export function buildPayto(
+ type: "taler-reserve-http",
exchange: string,
reservePub: string,
params?: Record<string, string>,
@@ -182,7 +196,7 @@ export function buildPayto(
return result;
}
case "x-taler-bank": {
- if (!second) throw Error("missing account for payto://x-taler-bank");
+ if (!second) throw Error("missing account for payto://x-taler-bank/");
const result: PaytoUriTalerBank = {
isKnown: true,
targetType: "x-taler-bank",
@@ -193,11 +207,24 @@ export function buildPayto(
};
return result;
}
- case "taler": {
- if (!second) throw Error("missing reservePub for payto://taler");
+ case "taler-reserve-http": {
+ if (!second)
+ throw Error("missing reservePub for payto://taler-reserve-http/");
+ const result: PaytoUriTalerHttp = {
+ isKnown: true,
+ targetType: "taler-reserve-http",
+ exchange: first,
+ reservePub: second,
+ params,
+ targetPath: `${first}/${second}`,
+ };
+ return result;
+ }
+ case "taler-reserve": {
+ if (!second) throw Error("missing reservePub for payto://taler-reserve/");
const result: PaytoUriTaler = {
isKnown: true,
- targetType: "taler",
+ targetType: "taler-reserve",
exchange: first,
reservePub: second,
params,
@@ -308,8 +335,11 @@ export function hashNormalizedPaytoUri(p: PaytoUri | string): Uint8Array {
case "ethereum":
paytoStr = `payto://ethereum/${p.address}`;
break;
- case "taler":
- paytoStr = `payto://taler/${p.exchange}/${p.reservePub}`;
+ case "taler-reserve":
+ paytoStr = `payto://taler-reserve/${p.exchange}/${p.reservePub}`;
+ break;
+ case "taler-reserve-http":
+ paytoStr = `payto://taler-reserve-http/${p.exchange}/${p.reservePub}`;
break;
}
}
@@ -431,7 +461,7 @@ export function parsePaytoUri(s: string): PaytoUri | undefined {
account,
};
}
- case "taler": {
+ case "taler-reserve": {
const parts = targetPath.split("/");
const exchange = parts[0];
const reservePub = parts[1];
diff --git a/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx b/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx
@@ -22,6 +22,7 @@ import {
PaytoUriIBAN,
PaytoUriTaler,
PaytoUriTalerBank,
+ PaytoUriTalerHttp,
PaytoUriUnknown,
segwitMinAmount,
stringifyPaytoUri,
@@ -191,7 +192,7 @@ function IBANAccountInfoTable({
subject,
}: {
subject: string;
- payto: PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank | PaytoUriTaler;
+ payto: PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank | PaytoUriTalerHttp | PaytoUriTaler;
}) {
const { i18n } = useTranslationContext();
const api = useBackendContext();
@@ -230,7 +231,7 @@ function IBANAccountInfoTable({
) : undefined}
<Row name={i18n.str`IBAN`} value={payto.iban} />
</Fragment>
- ) : payto.targetType === "taler" ? (
+ ) : (payto.targetType === "taler-reserve" || payto.targetType === "taler-reserve-http") ? (
<Fragment>
<Row name={i18n.str`Exchange`} value={payto.exchange} />
<Row name={i18n.str`Reserve Pub`} value={payto.reservePub} />
diff --git a/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx b/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx
@@ -400,11 +400,14 @@ function describeAccount(paytoUri: string): string {
case "iban": {
return p.iban;
}
- case "taler": {
- return p.reservePub;
+ case "taler-reserve-http": {
+ return `${p.reservePub}@${p.exchange}`;
+ }
+ case "taler-reserve": {
+ return `${p.reservePub}@${p.exchange}`;
}
case "x-taler-bank": {
- return `${p.host}/${p.account}`;
+ return `${p.account}@${p.host}`;
}
case "bitcoin": {
return `${p.address}`;