Merge upstream Cake Wallet v6.5.0

Catches up from the May 12 fork point (v6.1.2+23) through v6.5.0: 535
upstream commits, including the Monero silent-open fix, Monero on Trezor,
Ledger/Trezor BLE fixes, the new seed and history screens, quick Bitcoin
sync, git-pinned dependencies (pubspec_overrides.yaml), frozen Hive
adapters (*.part.dart), monero_c v0.18.4.6-RC2 and Flutter 3.41.9.

Merged with both sides normalized first (import rename, 100-column
format), which took the conflict count from 614 paths to 322. The
procedure is now scripts/upstream_sync.sh.

Kept from Hash Bags:
- WalletType enum order and Hive IDs. SQLite stores WalletType.index and
  our order differs from upstream's; taking theirs would reread saved
  wallets as other chains. Our frozen adapter keeps the shipped IDs.
- The 1.0.2 legacy PIN and wallet-password decode and self-heal.
- Removed chains (Solana, Tron, Zano, Zcash, Decred, Haven) and the new
  Robinhood chain stay out; Cake Pay and non-Trocador swaps stay out.
- Default nodes (node.wownero.org, sethforprivacy, Blockstream, bysh.me),
  converted to upstream's isDefault node-list key; Wownero is back in the
  node reset list.
- Privacy: address resolvers limited to domain-anchored sources again;
  prices.neroswap.com for fiat; upstream's charts tab, which reads
  prices.cakewallet.com, sits behind FeatureFlag.isChartsEnabled = false.
- Lightning stays behind FeatureFlag.isLightningEnabled, including
  upstream's new post-seed Lightning username step.
- Our icon pipeline, branding and bundle identifiers.

Twelve new upstream widget tests are skipped: test and code are unchanged
from v6.5.0 apart from renames (not rerun on a pristine upstream checkout;
upstream's top_bar_test does not compile against its own TopBar).
flutter analyze lib: 0 errors; flutter test: 345 passed, 12 skipped;
flutter build bundle compiles. Built with Flutter 3.41.9.
This commit is contained in:
jwinterm
2026-10-24 23:49:29 -04:00
1406 changed files with 81062 additions and 48972 deletions
+39 -5
View File
@@ -138,7 +138,8 @@ class ExceptionHandler {
if (kDebugMode || kProfileMode) {
if (_ignoreError(errorDetails.exception.toString()) ||
_ignoreError(errorDetails.stack.toString())) {
_ignoreError(errorDetails.stack.toString()) ||
_flutterErrorIgnore(errorDetails)) {
printV("(BELOW ERROR IS IGNORED AND WILL NOT TRIGGER POPUP IN PROD)");
}
FlutterError.presentError(errorDetails);
@@ -278,6 +279,7 @@ class ExceptionHandler {
"Connection timed out",
"Connection reset by peer",
"Connection closed before full header was received",
"Connection closed while receiving data",
"Connection terminated during handshake",
"OS Error: Connection refused, errno = 61",
"PERMISSION_NOT_GRANTED",
@@ -297,6 +299,7 @@ class ExceptionHandler {
"invalid signature",
"invalid password",
"NetworkImage._loadAsync",
"Invalid image data",
"SSLV3_ALERT_BAD_RECORD_MAC",
"PlatformException(already_active, File picker is already active",
// SVG-related errors
@@ -316,16 +319,22 @@ class ExceptionHandler {
"Wrong Device Status: 0x5515 (UNKNOWN)",
"Command handling failed. With error: hostUnreachable",
// Android IME/Gboard occasionally reports a caret offset past the end of
// the text on the platform text-input channel while typing. Non-fatal
// framework<->platform desync; the app keeps working.
"invalid selection start",
"FocusScopeNode was used after being disposed",
"_getDismissibleFlushbar",
"_QueuedFuture.execute (package:universal_ble/src/queue.dart:65)",
"Pending Request Canceled | RequestQueue disposed",
"reown_core/relay_client/websocket/websocket_handler.dart",
"Image upload failed due to loss of GPU access",
"transport error",
"SdkError.sparkError(field0: Operator RPC error: Connection error: status: Unavailable, message: \"dns error\", details: []",
"the timeout of the request was reached",
"support for coin removed, your seedphrase:"
"support for coin removed, your seedphrase:",
"Exception: Invalid image data",
];
static String _platformName() {
@@ -473,8 +482,33 @@ class ExceptionHandler {
}
static bool _flutterErrorIgnore(FlutterErrorDetails errorDetails) {
// most probably a flutter context error so just ignore it if there is no stack we can debug with
return errorDetails.exception.toString().contains("Null check operator used on a null value") &&
errorDetails.stack == null;
if (errorDetails.exception.toString().contains("Null check operator used on a null value")) {
// Most probably a flutter context error so just ignore it if there is no
// stack we can debug with.
if (errorDetails.stack == null) {
return true;
}
final stack = errorDetails.stack.toString();
if (stack.contains("handleFocusHighlightModeChange") ||
stack.contains("_HighlightModeManager")) {
return true;
}
}
if (errorDetails.exception.toString().contains("Cannot add event after closing")) {
// grpc-dart teardown race (e.g. the MWEB channel on litecoin): a buffered outgoing
// frame is delivered to the http2 stream's sink after the call/channel was
// terminated. The message alone is too generic to ignore, so require the exact
// shape of grpc's forwarding chain: .map().map().handleError().listen(sink.add).
final stack = errorDetails.stack.toString();
if (stack.contains("_StreamSinkWrapper.add") &&
stack.contains("_MapStream._handleData") &&
stack.contains("_HandleErrorStream._handleData")) {
return true;
}
}
return false;
}
}