commit 4da82257177c54b1fb834529007fc60bf21125b7
parent 2bafce290abf0804206cf557bea6733c9cb4ecd2
Author: Marc Stibane <marc@taler.net>
Date: Sat, 10 Oct 2026 21:15:41 +0200
AI: cache invalidation
Diffstat:
2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/TalerWallet1/Controllers/Controller.swift b/TalerWallet1/Controllers/Controller.swift
@@ -508,10 +508,15 @@ class Controller: ObservableObject {
func updateExchange(for baseUrl: String, state: ExchangeState) {
Task {
if let exchange = await exchange(for: baseUrl) {
- if exchange.tosStatus != state.tosStatus {
- logger.log(" ❗️updating exchange: \(baseUrl)")
- let model = WalletModel.shared
- if let exchange2 = try? await model.getExchangeByUrl(url: baseUrl) {
+ // The notification only carries tosStatus - a detected, confirmed or reverted
+ // master-key change ("update-from-response", "key-change-confirmed") leaves it
+ // unchanged, so always re-fetch and compare what the views depend on.
+ let model = WalletModel.shared
+ if let exchange2 = try? await model.getExchangeByUrl(url: baseUrl, viewHandles: true) {
+ if exchange.tosStatus != exchange2.tosStatus ||
+ exchange.masterPub != exchange2.masterPub ||
+ exchange.unconfirmedKeyChange != exchange2.unconfirmedKeyChange {
+ logger.log(" ❗️updating exchange: \(baseUrl)")
if let index = exchanges.firstIndex(where: {$0.exchangeBaseUrl == baseUrl}) {
exchanges[index] = exchange2
} else {
diff --git a/TalerWallet1/Views/Transactions/TransactionsEmptyView.swift b/TalerWallet1/Views/Transactions/TransactionsEmptyView.swift
@@ -60,7 +60,7 @@ struct UnconfirmedKeyChangeView: View {
}
func acceptAction() {
- if let exchange, let masterPub = exchange.masterPub {
+ if let exchange, let masterPub = exchange.unconfirmedKeyChange?.currentMasterPub ?? exchange.masterPub {
Task {
try? await model.confirmExchangeKeyChange(exchangeBaseUrl: baseURL,
currentMasterPub: masterPub)
@@ -110,7 +110,13 @@ struct UnconfirmedKeyChangeView: View {
@MainActor
private func viewDidLoad() async {
- exchange = await controller.exchange(for: baseURL)
+ // confirm and purge must send the master key wallet-core uses *now*
+ // (not the controller's cached entry) or they fail with KEY_CHANGE_MISMATCH / BAD_REQUEST
+ if let fresh = try? await model.getExchangeByUrl(url: baseURL, viewHandles: true) {
+ exchange = fresh
+ } else {
+ exchange = await controller.exchange(for: baseURL)
+ }
}
var body: some View {