commit 8b06874f42715b0397a6735ff330e5f75eb0cb86
parent d98f048fd65c46cd774eabdef8599efb75153ac3
Author: Florian Dold <florian@dold.me>
Date: Thu, 6 Jul 2023 20:17:59 +0200
wallet-core: support passing transactionId to confirmPay
Diffstat:
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts
@@ -1751,14 +1751,19 @@ export const codecForPreparePayTemplateRequest =
.build("PreparePayTemplate");
export interface ConfirmPayRequest {
- proposalId: string;
+ /**
+ * @deprecated use transactionId instead
+ */
+ proposalId?: string;
+ transactionId?: string;
sessionId?: string;
forcedCoinSel?: ForcedCoinSel;
}
export const codecForConfirmPayRequest = (): Codec<ConfirmPayRequest> =>
buildCodecForObject<ConfirmPayRequest>()
- .property("proposalId", codecForString())
+ .property("proposalId", codecOptional(codecForString()))
+ .property("transactionId", codecOptional(codecForString()))
.property("sessionId", codecOptional(codecForString()))
.property("forcedCoinSel", codecForAny())
.build("ConfirmPay");
diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts b/packages/taler-wallet-core/src/operations/withdraw.ts
@@ -972,6 +972,10 @@ async function processPlanchetExchangeBatchRequest(
responses.ev_sigs.push(r);
responseCoinIdxs.push(requestCoinIdxs[i]);
} catch (e) {
+ if (e instanceof TalerError) {
+ logger.warn(`withdrawing planchet failed: ${j2s(e.errorDetail)}`);
+ logger.warn(`planchet denom pub hash: ${batchReq.planchets[i].denom_pub_hash}`);
+ }
await storeCoinError(e, requestCoinIdxs[i]);
}
}
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
@@ -1260,7 +1260,20 @@ async function dispatchRequestInternal<Op extends WalletApiOperation>(
}
case WalletApiOperation.ConfirmPay: {
const req = codecForConfirmPayRequest().decode(payload);
- return await confirmPay(ws, req.proposalId, req.sessionId);
+ let proposalId;
+ if (req.proposalId) {
+ // legacy client support
+ proposalId = req.proposalId;
+ } else if (req.transactionId) {
+ const txIdParsed = parseTransactionIdentifier(req.transactionId);
+ if (txIdParsed?.tag != TransactionType.Payment) {
+ throw Error("payment transaction ID required");
+ }
+ proposalId = txIdParsed.proposalId;
+ } else {
+ throw Error("transactionId or (deprecated) proposalId required");
+ }
+ return await confirmPay(ws, proposalId, req.sessionId);
}
case WalletApiOperation.AbortTransaction: {
const req = codecForAbortTransaction().decode(payload);