From 8b6bf8402b9dcd3ea25c6a06eb1f6354ec870c27 Mon Sep 17 00:00:00 2001 From: Jonathan Tzeng Date: Mon, 17 Aug 2026 17:11:06 -0700 Subject: [PATCH 1/3] Fix lint warnings in WalletListCreateRow Convert the component to the React.FC form the lint rule expects. --- src/components/themed/WalletListCreateRow.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/themed/WalletListCreateRow.tsx b/src/components/themed/WalletListCreateRow.tsx index a9245e1b8cc..99e386bea5f 100644 --- a/src/components/themed/WalletListCreateRow.tsx +++ b/src/components/themed/WalletListCreateRow.tsx @@ -32,9 +32,9 @@ export interface WalletListCreateRowProps { onPress?: (walletId: string, tokenId: EdgeTokenId) => Promise } -export const WalletListCreateRowComponent = ( - props: WalletListCreateRowProps -): React.ReactElement => { +export const WalletListCreateRowComponent: React.FC< + WalletListCreateRowProps +> = props => { const { createItem, createWalletId, From f485f80563942825e5a4c29aafcd2cfd914d99b9 Mon Sep 17 00:00:00 2001 From: Jonathan Tzeng Date: Mon, 17 Aug 2026 17:12:08 -0700 Subject: [PATCH 2/3] Add a testID to the wallet-list create row UI tests need a stable selector for the create-wallet row of a specific asset, which the row's text does not provide. --- src/components/themed/WalletListCreateRow.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/themed/WalletListCreateRow.tsx b/src/components/themed/WalletListCreateRow.tsx index 99e386bea5f..c4b3914e093 100644 --- a/src/components/themed/WalletListCreateRow.tsx +++ b/src/components/themed/WalletListCreateRow.tsx @@ -160,7 +160,11 @@ export const WalletListCreateRowComponent: React.FC< }) return ( - + Date: Mon, 17 Aug 2026 17:19:47 -0700 Subject: [PATCH 3/3] Add eCash.com (ECX) wallet metadata and guard missing currency entries ECX is the ecash.com hard fork of Bitcoin, shipped as the `ecashcom` plugin in edge-currency-plugins. It stays off in the core plugin list until the chain forks on 2026-08-22 and a Blockbook endpoint exists. Opening a wallet whose pluginId had no SPECIAL_CURRENCY_INFO entry threw in BuyCrypto, which the error boundary turned into the crash scene, so that lookup now falls back to an empty record. --- CHANGELOG.md | 2 ++ src/components/modals/WalletListMenuModal.tsx | 2 ++ src/components/themed/BuyCrypto.tsx | 2 +- src/components/themed/TransactionListRow.tsx | 3 +++ src/constants/WalletAndCurrencyConstants.ts | 7 +++++++ src/locales/en_US.ts | 1 + src/locales/strings/enUS.json | 1 + src/util/corePlugins.ts | 3 +++ 8 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfba92d8c57..a1d6a390c21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased (develop) +- added: eCash.com (ECX) wallet metadata, kept disabled until the chain forks from Bitcoin on 2026-08-22. - added: App/device attestation for gated info-server requests - added: "-m" tag on the version number in the Help scene for Maestro test builds - added: Sign Message option in the wallet list menu for Bitcoin-family wallets, letting users prove self-hosted wallet ownership to exchanges by signing an exchange-provided message. @@ -16,6 +17,7 @@ - changed: Use the UI4 warning card for the Reveal Raw Keys and Reveal Master Private Key password confirmation warnings. - changed: Tron resource staking now describes its claim action as reclaiming your own TRX, instead of claiming a reward. - changed: Deep links now wait only for the account state they actually use, so a link that just opens a scene, such as the buy/sell entry, follows immediately after login instead of waiting for every wallet to finish loading. +- fixed: Opening a wallet whose plugin has no entry in the GUI's currency table no longer crashes the app, and sharing a transaction from a chain with no block explorer no longer shares an empty link. - fixed: The buy/sell amount field no longer reads "Amount undefined" while the app is still working out which wallet to use. - fixed: Show the Monero Transaction Key of a send whose key never reached the transaction's saved metadata, by falling back to the key the wallet engine mirrors into `otherParams`. Covers sends made on 4.49.0 and later while the send path reported no key, on devices that still hold the original wallet cache. - fixed: Bitwave CSV exports now use ISO 8601 UTC timestamps, leave the fee columns blank so Bitwave does not double-count fees, and copy the description into the second custom metadata column. diff --git a/src/components/modals/WalletListMenuModal.tsx b/src/components/modals/WalletListMenuModal.tsx index 54cf80a1b53..06da7eecfd0 100644 --- a/src/components/modals/WalletListMenuModal.tsx +++ b/src/components/modals/WalletListMenuModal.tsx @@ -98,6 +98,7 @@ export const WALLET_LIST_MENU: Array<{ 'digibyte', 'dogecoin', 'eboost', + 'ecashcom', 'eos', 'zcoin', 'feathercoin', @@ -132,6 +133,7 @@ export const WALLET_LIST_MENU: Array<{ 'dogecoin', 'eboost', 'ecash', + 'ecashcom', 'feathercoin', 'groestlcoin', 'litecoin', diff --git a/src/components/themed/BuyCrypto.tsx b/src/components/themed/BuyCrypto.tsx index 87c78f2911a..45d912bd4f1 100644 --- a/src/components/themed/BuyCrypto.tsx +++ b/src/components/themed/BuyCrypto.tsx @@ -56,7 +56,7 @@ export const BuyCrypto: React.FC = (props: Props) => { const { displayName, pluginId } = wallet.currencyInfo const { highPrecisionSyncRatioDisplay = false } = - SPECIAL_CURRENCY_INFO[pluginId] + SPECIAL_CURRENCY_INFO[pluginId] ?? {} const syncRatioPrecisionOpts = highPrecisionSyncRatioDisplay ? { minPrecision: 5, diff --git a/src/components/themed/TransactionListRow.tsx b/src/components/themed/TransactionListRow.tsx index 9b4a9ca7678..e0de0823118 100644 --- a/src/components/themed/TransactionListRow.tsx +++ b/src/components/themed/TransactionListRow.tsx @@ -250,6 +250,9 @@ const TransactionViewInner: React.FC = props => { }) const handleLongPress = useHandler(() => { + // Chains with no block explorer publish an empty template, which would + // share an empty link: + if (currencyInfo.transactionExplorer === '') return const url = sprintf(currencyInfo.transactionExplorer, transaction.txid) const shareOptions = { failOnCancel: false, diff --git a/src/constants/WalletAndCurrencyConstants.ts b/src/constants/WalletAndCurrencyConstants.ts index 4e43c3d4191..d9037554206 100644 --- a/src/constants/WalletAndCurrencyConstants.ts +++ b/src/constants/WalletAndCurrencyConstants.ts @@ -58,6 +58,7 @@ export const CURRENCY_SETTINGS_KEYS = [ 'digibyte', 'dogecoin', 'eboost', + 'ecashcom', 'ethDev', 'ethereum', 'ethereumclassic', @@ -524,6 +525,12 @@ export const SPECIAL_CURRENCY_INFO: Record = { isStakingSupported: false, unstoppableDomainsTicker: 'ECASH' }, + ecashcom: { + hasSegwit: true, + maxSpendTargets: UTXO_MAX_SPEND_TARGETS, + initWalletName: lstrings.string_first_ecashcom_wallet_name, + isImportKeySupported: true + }, ethereum: { initWalletName: lstrings.string_first_ethereum_wallet_name, dummyPublicAddress: '0x0d73358506663d484945ba85d0cd435ad610b0a0', diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 51f82a5058b..da2c250703a 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -748,6 +748,7 @@ const strings = { string_first_dash_wallet_name: 'My Dash', string_first_digibyte_wallet_name: 'My DigiByte', string_first_ecash_wallet_name: 'My eCash', + string_first_ecashcom_wallet_name: 'My eCash.com', string_first_eos_wallet_name: 'My EOS', string_first_holesky_wallet_name: 'My Holesky', string_first_hyperevm_wallet_name: 'My HyperEVM', diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index ecfa739a196..e7d83b20478 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -570,6 +570,7 @@ "string_first_dash_wallet_name": "My Dash", "string_first_digibyte_wallet_name": "My DigiByte", "string_first_ecash_wallet_name": "My eCash", + "string_first_ecashcom_wallet_name": "My eCash.com", "string_first_eos_wallet_name": "My EOS", "string_first_holesky_wallet_name": "My Holesky", "string_first_hyperevm_wallet_name": "My HyperEVM", diff --git a/src/util/corePlugins.ts b/src/util/corePlugins.ts index 55c017dad00..09b414eddff 100644 --- a/src/util/corePlugins.ts +++ b/src/util/corePlugins.ts @@ -70,6 +70,9 @@ export const currencyPlugins: EdgeCorePluginsInit = { bitcoingold: true, bitcoingoldtestnet: false, bitcoinsv: true, + // eCash.com (ECX) forks from Bitcoin on 2026-08-22. Enable once a Blockbook + // endpoint for the chain exists: + ecashcom: false, bitcointestnet: true, bitcointestnet4: true, dash: ENV.DASH_INIT,