fix: date on silent payments transactions (#2740)

* fix: date on silent payments transactions * fix: clear outdated Silent Payment Addresses during initialization * fix: streamline Silent Payments address handling by using the first record only

Konstantin Ullrich committed Dec 20, 2025 at 00:58 UTC c208e8b5ef64f7999b19242912e50554661daa75
2 files changed +17 -19
cw_bitcoin/lib/electrum_wallet.dart
+5 -11
@@ -40,6 +40,7 @@ import 'package:cw_core/unspent_coins_info.dart';
40 import 'package:cw_core/utils/print_verbose.dart';
41 import 'package:cw_core/utils/proxy_wrapper.dart';
42 import 'package:cw_core/utils/socket_health_logger.dart';
43 +import 'package:cw_core/utils/tor/abstract.dart';
44 import 'package:cw_core/wallet_base.dart';
45 import 'package:cw_core/wallet_info.dart';
46 import 'package:cw_core/wallet_keys_file.dart';
@@ -3009,6 +3010,7 @@ class SyncResponse {
3010 Future<void> _handleScanSilentPayments(ScanData scanData) async {
3011 final shouldUpdateSyncStatus = scanData.rescanHeights == null || scanData.rescanHeights!.isEmpty;
3012 final hasForcedRescanHeights = !shouldUpdateSyncStatus;
3013 + CakeTor.instance = await CakeTorInstance.getInstance();
3014
3015 var node = Uri.parse("tcp://electrs.cakewallet.com:50001");
3016
@@ -3204,19 +3206,12 @@ Future<void> _handleScanSilentPayments(ScanData scanData) async {
3206 // So, if blockDate exists, reuse
3207 if (isDateNow) {
3208 try {
3209 + final rootURL = "https://cake.mempool.space";
3210 final tweakBlockHash = await ProxyWrapper()
3208 - .get(
3209 - clearnetUri: Uri.parse(
3210 - "https://mempool.cakewallet.com/api/v1/block-height/$tweakHeight",
3211 - ),
3212 - )
3211 + .get(clearnetUri: Uri.parse("$rootURL/api/block-height/$tweakHeight"))
3212 .timeout(Duration(seconds: 15));
3213 final blockResponse = await ProxyWrapper()
3215 - .get(
3216 - clearnetUri: Uri.parse(
3217 - "https://mempool.cakewallet.com/api/v1/block/${tweakBlockHash.body}",
3218 - ),
3219 - )
3214 + .get(clearnetUri: Uri.parse("$rootURL/api/block/${tweakBlockHash.body}"))
3215 .timeout(Duration(seconds: 15));
3216
3217 if (blockResponse.statusCode == 200 &&
@@ -3242,7 +3237,6 @@ Future<void> _handleScanSilentPayments(ScanData scanData) async {
3237 fee: 0,
3238 direction: TransactionDirection.incoming,
3239 isReplaced: false,
3245 - // TODO: fetch block data and get the date from it
3240 date: scanData.network == BitcoinNetwork.mainnet
3241 ? (isDateNow ? getDateByBitcoinHeight(tweakHeight) : blockDate)
3242 : DateTime.now(),
cw_bitcoin/lib/electrum_wallet_addresses.dart
+12 -8
@@ -83,6 +83,12 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
83 network: network,
84 );
85
86 + // Clean the Silent Payment Addresses if the initial addresses are the old SP Addresses
87 + if (!silentAddresses
88 + .any((addr) => addr.index == 0 && addr.address == silentAddress.toString())) {
89 + silentAddresses.clear();
90 + }
91 +
92 if (!silentAddresses.any((addr) => addr.index == 0 && addr.isHidden == false))
93 silentAddresses.add(BitcoinSilentPaymentAddressRecord(
94 silentAddress.toString(),
@@ -457,19 +463,17 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
463 addressesMap[address] = 'Active - P2WSH';
464 }
465
460 - silentAddresses.forEach((addressRecord) {
461 - if (addressRecord.type != SilentPaymentsAddresType.p2sp || addressRecord.isHidden) {
462 - return;
463 - }
466 + final firstSilentAddressRecord = silentAddresses.firstOrNull;
467 + if (firstSilentAddressRecord != null) {
468
465 - if (addressRecord.address != address) {
466 - addressesMap[addressRecord.address] = addressRecord.name.isEmpty
469 + if (firstSilentAddressRecord.address != address) {
470 + addressesMap[firstSilentAddressRecord.address] = firstSilentAddressRecord.name.isEmpty
471 ? "Silent Payments"
468 - : "Silent Payments - " + addressRecord.name;
472 + : "Silent Payments - ${firstSilentAddressRecord.name}";
473 } else {
474 addressesMap[address] = 'Active - Silent Payments';
475 }
472 - });
476 + }
477 }
478
479 void addLitecoinAddressTypes() {