Deep Cake scrub: gut user-visible refs, swap SVG asset contents

URL replacements throughout lib/:
- support_view_model.dart: removed Cake's own support channels (email,
  website, forum, Telegram, Telegram bot). Only GitHub Issues + Releases
  remain. Third-party provider support links (ChangeNow, SideShift,
  SimpleSwap, Exolix, Trocador, Onramper, DFX, MoonPay, Robinhood,
  Kryptonim) kept — genuinely useful when a swap goes sideways.
- transaction_details_view_model.dart + payjoin_details_view_model.dart:
  mempool.cakewallet.com -> mempool.space (canonical free public mempool,
  no affiliate).
- services_updates_widget.dart: status.cakewallet.com -> our GH issues.
- 8 widget/screen files: docs.cakewallet.com / blog / cakewallet.com help
  URLs repointed to github.com/Such-Software/hash-wallet (placeholder
  until we have our own docs; better than dead-linking to Cake's docs).

User-facing text changes:
- walletkit_service.dart: WalletKit metadata (name/description/url/icon/
  redirect) all -> Hash Wallet / Such Software repo / hashwallet:// scheme.
- di.dart: TrezorConnect callback URL + appName -> Hash Wallet.
- vulnerable_seeds_popup.dart + haven_wallet_removal_popup.dart: copy
  rewritten to say 'Hash Wallet' instead of 'Cake Wallet', and point to
  GH issues instead of Cake's support email.
- swap_provider_initial_preference_modal.dart: trailing 'Cake Wallet.'
  -> 'Hash Wallet.'

Deep-link URL scheme cakewallet:// -> hashwallet:// in:
- lib/main.dart, lib/src/screens/root/root.dart, lib/view_model/link_view_model.dart
  Means any cakewallet:// link from a payment QR / Trezor callback /
  shortcut now routes via hashwallet://. No existing user base so no
  migration needed.

SVG asset swaps (content replaced, filenames kept so call-sites compile
without rewriting):
- assets/new-ui/cake_squircle_icon.svg -> hash_wallet/02_app_icon.svg
- assets/new-ui/cakewallet-wordmark-light.svg -> hash_wallet/03_lockup_horizontal.svg
  (dark text for light backgrounds)
- assets/new-ui/cakewallet-wordmark.svg -> hash_wallet/03_lockup_horizontal_dark.svg
  (light text for dark backgrounds)
- apps_widget.dart: the conditional cakelabs-icon render became a SizedBox()
  no-op. The Apps tab is gutted anyway (placeholder content); this widget
  is also used elsewhere where the Cake Labs attribution badge is unwanted.
This commit is contained in:
jwinterm
2026-05-16 11:54:49 -04:00
parent 04203654f1
commit 04ed46aca3
23 changed files with 68 additions and 63 deletions
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<title>Hash Wallet app icon</title>
<desc>Hash Wallet app icon: brand-green rounded square with a centered white hash.</desc>
<rect width="512" height="512" rx="112" fill="#1a5c38"/>
<text x="256" y="390" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="380" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
</svg>

After

Width:  |  Height:  |  Size: 489 B

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 100" width="360" height="100">
<title>Hash Wallet horizontal lockup</title>
<desc>Hash Wallet logo with green-boxed hash mark on the left and Hash Wallet wordmark to the right.</desc>
<rect x="10" y="18" width="64" height="64" rx="14" fill="#1a5c38"/>
<text x="42" y="68" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="48" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
<text x="90" y="63" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="32" font-weight="500" fill="#1a1a1a">Hash Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 682 B

+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 100" width="360" height="100">
<title>Hash Wallet horizontal lockup (dark theme)</title>
<desc>Hash Wallet logo with green-boxed hash mark on the left and a white wordmark to the right, intended for dark-theme backgrounds.</desc>
<rect x="10" y="18" width="64" height="64" rx="14" fill="#1a5c38"/>
<text x="42" y="68" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="48" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
<text x="90" y="63" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="32" font-weight="500" fill="#ffffff">Hash Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 728 B

+2 -2
View File
@@ -435,8 +435,8 @@ Future<void> setup({
getIt.registerLazySingleton(() => BitboxViewModel());
getIt.registerLazySingleton(() => TrezorConnect("cakewallet://trezor_connect",
appName: "Cake Wallet"));
getIt.registerLazySingleton(() => TrezorConnect("hashwallet://trezor_connect",
appName: "Hash Wallet"));
getIt.registerLazySingleton(() => TrezorViewModel(getIt<TrezorConnect>()));
+1 -1
View File
@@ -97,7 +97,7 @@ Future<void> runAppWithZone({Key? topLevelKey}) async {
}
// Convert the shortcut type to a URI and add it to the stream
final uri = Uri.parse('cakewallet://quickaction/$shortcutType');
final uri = Uri.parse('hashwallet://quickaction/$shortcutType');
quickActionsStream.sink.add(uri);
});
+1 -1
View File
@@ -94,7 +94,7 @@ class AppsWidget extends StatelessWidget {
),
softWrap: true,
),
isCake == true ? CakeImageWidget(imageUrl: "assets/new-ui/cakelabs-icon.svg", color: Theme.of(context).colorScheme.onSurfaceVariant) : SizedBox(),
SizedBox(),
],
),
SizedBox(height: 5),
@@ -26,7 +26,7 @@ class SwapProviderInitialPreferenceModal extends StatelessWidget {
children: [
CakeImageWidget(imageUrl:"assets/new-ui/exchange_providers.svg"),
Text(
"${S.of(context).swap_provider_initial_desc} Cake Wallet.",
"${S.of(context).swap_provider_initial_desc} Hash Wallet.",
textAlign: TextAlign.center,
style: TextStyle(
color: Theme.of(context).colorScheme.onSurfaceVariant, fontSize: 16),
@@ -670,9 +670,9 @@ class BalanceRowWidget extends StatelessWidget {
}
void onPressedHelp() {
var helpUri = Uri.parse("https://docs.cakewallet.com/cryptos/bitcoin#lightning");
var helpUri = Uri.parse("https://github.com/Such-Software/hash-wallet");
if (dashboardViewModel.type == WalletType.litecoin) {
helpUri = Uri.parse("https://docs.cakewallet.com/cryptos/litecoin#mweb");
helpUri = Uri.parse("https://github.com/Such-Software/hash-wallet");
}
launchUrl(helpUri, mode: LaunchMode.externalApplication);
@@ -263,7 +263,7 @@ class CryptoBalanceWidget extends StatelessWidget {
behavior: HitTestBehavior.opaque,
onTap: () => launchUrl(
Uri.parse(
"https://docs.cakewallet.com/cryptos/bitcoin#silent-payments"),
"https://github.com/Such-Software/hash-wallet"),
mode: LaunchMode.externalApplication,
),
child: Row(
@@ -319,7 +319,7 @@ class CryptoBalanceWidget extends StatelessWidget {
hintWidget: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => launchUrl(
Uri.parse("https://docs.cakewallet.com/cryptos/litecoin/#mweb"),
Uri.parse("https://github.com/Such-Software/hash-wallet"),
mode: LaunchMode.externalApplication,
),
child: Text(
@@ -349,7 +349,7 @@ class CryptoBalanceWidget extends StatelessWidget {
hintWidget: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => launchUrl(
Uri.parse("https://docs.cakewallet.com/tutorials/zashi/#creating-a-new-zcash-wallet-on-cake"),
Uri.parse("https://github.com/Such-Software/hash-wallet"),
mode: LaunchMode.externalApplication,
),
child: Text(
@@ -376,7 +376,7 @@ class CryptoBalanceWidget extends StatelessWidget {
rightButtonTitle: S.of(context).learn_more,
leftButtonAction: () => dashboardViewModel.dismissDecredInfoCard(),
rightButtonAction: () => launchUrl(
Uri.parse("https://docs.cakewallet.com/cryptos/decred/#spv-sync")),
Uri.parse("https://github.com/Such-Software/hash-wallet")),
),
),
],
@@ -390,7 +390,7 @@ class CryptoBalanceWidget extends StatelessWidget {
hintWidget: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => launchUrl(
Uri.parse("https://docs.cakewallet.com/cryptos/bitcoin/#payjoin"),
Uri.parse("https://github.com/Such-Software/hash-wallet"),
mode: LaunchMode.externalApplication,
),
child: Row(
@@ -52,7 +52,7 @@ class TransactionsPage extends StatelessWidget {
key: ValueKey('transactions_page_syncing_alert_card_key'),
onTap: () {
try {
final uri = Uri.parse("https://docs.cakewallet.com/faq/funds-not-appearing");
final uri = Uri.parse("https://github.com/Such-Software/hash-wallet");
launchUrl(uri, mode: LaunchMode.externalApplication);
} catch (_) {}
},
@@ -311,7 +311,7 @@ class QRWidget extends StatelessWidget {
footerType: FooterType.doubleActionButton,
doubleActionLeftButtonText: S.of(context).learn_more,
onLeftActionButtonPressed: () => launchUrl(
Uri.parse("https://docs.cakewallet.com/cryptos/bitcoin/#payjoin"),
Uri.parse("https://github.com/Such-Software/hash-wallet"),
mode: LaunchMode.externalApplication),
doubleActionRightButtonText: S.of(context).ok,
onRightActionButtonPressed: () => Navigator.of(context).pop(),
+1 -1
View File
@@ -115,7 +115,7 @@ class RootState extends State<Root> with WidgetsBindingObserver {
handleDeepLinking(await getInitialUri());
if (widget.initialQuickAction != null) {
final uri = Uri.parse('cakewallet://quickaction/${widget.initialQuickAction}');
final uri = Uri.parse('hashwallet://quickaction/${widget.initialQuickAction}');
handleDeepLinking(uri);
}
+1 -1
View File
@@ -21,7 +21,7 @@ class Setup2FAPage extends BasePage {
Widget body(BuildContext context) {
final cake2FAGuideTitle = 'Cake 2FA Guide';
final cake2FAGuideUri =
Uri.parse('https://docs.cakewallet.com/features/advanced/authentication/');
Uri.parse('https://github.com/Such-Software/hash-wallet');
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
@@ -26,7 +26,7 @@ class Setup2FAQRPage extends BasePage {
final copyImage = Image.asset('assets/images/copy_content.png',
height: 16, width: 16, color: Theme.of(context).colorScheme.onSurface);
final cake2FAHowToUseUrl = Uri.parse(
'https://docs.cakewallet.com/features/advanced/authentication/#enabling-cake-2fa');
'https://github.com/Such-Software/hash-wallet');
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: Column(
@@ -74,11 +74,11 @@ abstract class WalletKitServiceBase with Store {
projectId: secrets.walletConnectProjectId,
),
metadata: const PairingMetadata(
name: 'Cake Wallet',
description: 'Cake Wallet',
url: 'https://cakewallet.com',
icons: ['https://cakewallet.com/assets/image/cake_logo.png'],
redirect: Redirect(native: 'cakewallet://'),
name: 'Hash Wallet',
description: 'Hash Wallet',
url: 'https://github.com/Such-Software/hash-wallet',
icons: ['https://github.com/Such-Software/hash-wallet/raw/dev/assets/images/app_logo.png'],
redirect: Redirect(native: 'hashwallet://'),
),
);
+1 -1
View File
@@ -30,7 +30,7 @@ class WelcomePage extends BasePage {
@override
Widget trailing(BuildContext context) {
final Uri _url =
Uri.parse('https://docs.cakewallet.com/get-started/setup/');
Uri.parse('https://github.com/Such-Software/hash-wallet');
return IconButton(
icon: Icon(Icons.info_outline, size: 26,),
onPressed: () async {
@@ -59,7 +59,7 @@ class HavenWalletRemovalPopup extends StatelessWidget {
maxHeight: MediaQuery.of(context).size.height * 0.7,
),
child: Text(
"It looks like you have Haven wallets in your list. Haven is getting removed in next release of Cake Wallet, and you currently have Haven in the following wallets:\n\n[${affectedWalletNames.join(", ")}]\n\nPlease move your funds to other wallet, as you will lose access to your Haven funds in next update.\n\nFor assistance, please use the in-app support or email support@cakewallet.com",
"It looks like you have Haven wallets in your list. Haven is getting removed in the Hash Wallet fork, and you currently have Haven in the following wallets:\n\n[${affectedWalletNames.join(", ")}]\n\nPlease move your funds to other wallet, as you will lose access to your Haven funds in next update.\n\nFor assistance, please use the in-app support or open an issue at github.com/Such-Software/hash-wallet",
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
decoration: TextDecoration.none,
fontSize: 16.0,
+1 -1
View File
@@ -113,7 +113,7 @@ class _ServicesUpdatesWidgetState extends State<ServicesUpdatesWidget> {
try {
launchUrl(
Uri.parse(
"https://status.cakewallet.com/",
"https://github.com/Such-Software/hash-wallet/issues",
),
mode: LaunchMode.externalApplication);
} catch (_) {}
+1 -1
View File
@@ -59,7 +59,7 @@ class VulnerableSeedsPopup extends StatelessWidget {
maxHeight: MediaQuery.of(context).size.height * 0.7,
),
child: Text(
"Your Bitcoin wallet(s) below use a legacy seed format that is vulnerable, which MAY result in you losing money from these wallet(s) if no action is taken.\nWe recommend that you IMMEDIATELY create wallet(s) in Cake Wallet and immediately transfer the funds to these wallet(s).\nVulnerable wallet name(s):\n\n[${affectedWalletNames.join(", ")}]\n\nFor assistance, please use the in-app support or email support@cakewallet.com",
"Your Bitcoin wallet(s) below use a legacy seed format that is vulnerable, which MAY result in you losing money from these wallet(s) if no action is taken.\nWe recommend that you IMMEDIATELY create wallet(s) in Hash Wallet and immediately transfer the funds to these wallet(s).\nVulnerable wallet name(s):\n\n[${affectedWalletNames.join(", ")}]\n\nFor assistance, please use the in-app support or open an issue at github.com/Such-Software/hash-wallet",
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
decoration: TextDecoration.none,
fontSize: 16.0,
+1 -1
View File
@@ -29,7 +29,7 @@ class LinkViewModel {
bool get isWalletConnectLink => currentLink?.authority == 'wc';
bool get isNanoGptLink => currentLink?.scheme == 'nano-gpt';
bool get isQuickActionLink =>
currentLink?.scheme == 'cakewallet' && currentLink?.host == 'quickaction';
currentLink?.scheme == 'hashwallet' && currentLink?.host == 'quickaction';
String? getRouteToGo() {
if (isWalletConnectLink) {
@@ -83,7 +83,7 @@ abstract class PayjoinDetailsViewModelBase with Store {
value: '${S.current.view_transaction_on}mempool.space',
onTap: () async {
try {
final uri = Uri.parse('https://mempool.cakewallet.com/tx/${payjoinSession.txId!}');
final uri = Uri.parse('https://mempool.space/tx/${payjoinSession.txId!}');
if (await canLaunchUrl(uri))
await launchUrl(uri, mode: LaunchMode.externalApplication);
} catch (e) {}
+16 -34
View File
@@ -15,42 +15,24 @@ abstract class SupportViewModelBase with Store {
SupportViewModelBase(this._appStore)
: items = [
// Hash Wallet: Cake's own support channels (email, website, forum,
// Discord, Telegram, Telegram bot) gutted — those are Cake Labs
// properties, not ours. Replaced with the only channel we have right
// now: GitHub Issues. The third-party provider support links below
// are kept because they're genuinely useful when a user has trouble
// with a swap/buy via that provider.
LinkListItem(
title: 'Email',
icon: 'assets/images/support_icon.png',
linkTitle: 'support@cakewallet.com',
link: 'mailto:support@cakewallet.com'),
title: 'GitHub Issues',
icon: 'assets/images/github.png',
hasIconColor: true,
linkTitle: 'github.com/Such-Software/hash-wallet/issues',
link: 'https://github.com/Such-Software/hash-wallet/issues'),
LinkListItem(
title: 'Website',
icon: 'assets/images/global.png',
linkTitle: 'cakewallet.com',
link: 'https://cakewallet.com'),
LinkListItem(
title: 'Forum',
icon: 'assets/images/discourse.png',
linkTitle: 'forum.cakewallet.com',
link: 'https://forum.cakewallet.com'),
LinkListItem(
title: 'GitHub',
title: 'GitHub Releases',
icon: 'assets/images/github.png',
hasIconColor: true,
linkTitle: S.current.apk_update,
link: 'https://github.com/cake-tech/cake_wallet/releases'),
LinkListItem(
title: 'Discord',
icon: 'assets/images/discord.png',
linkTitle: 'discord.gg/pwmWa6aFpX',
link: 'https://discord.gg/pwmWa6aFpX'),
LinkListItem(
title: 'Telegram',
icon: 'assets/images/Telegram.png',
linkTitle: 't.me/cakewallet',
link: 'https://t.me/cakewalletannouncements'),
LinkListItem(
title: 'Telegram Support Bot',
icon: 'assets/images/Telegram.png',
linkTitle: '@cakewallet_bot',
link: 'https://t.me/cakewallet_bot'),
link: 'https://github.com/Such-Software/hash-wallet/releases'),
LinkListItem(
title: 'ChangeNow',
icon: 'assets/images/change_now.png',
@@ -86,7 +68,7 @@ abstract class SupportViewModelBase with Store {
icon: 'assets/images/onramper_dark.png',
lightIcon: 'assets/images/onramper_light.png',
linkTitle: 'View exchanges',
link: 'https://docs.cakewallet.com/support/buy/#onramper'),
link: 'https://onramper.com/'),
LinkListItem(
title: 'DFX',
icon: 'assets/images/dfx_dark.png',
@@ -114,7 +96,7 @@ abstract class SupportViewModelBase with Store {
link: 'mailto:contact@support.kryptonim.com'),
];
final docsUrl = 'https://docs.cakewallet.com';
final docsUrl = 'https://github.com/Such-Software/hash-wallet';
String fetchUrl({String locale = "en", String authToken = ""}) {
var supportUrl =
@@ -126,7 +108,7 @@ abstract class SupportViewModelBase with Store {
}
String get appVersion =>
"${isMoneroOnly ? "Monero.com" : "Cake Wallet"} - ${_appStore.settingsStore.appVersion}";
"${isMoneroOnly ? "Monero.com" : "Hash Wallet"} - ${_appStore.settingsStore.appVersion}";
String get fiatApiMode => _appStore.settingsStore.fiatApiMode.title;
@@ -416,7 +416,7 @@ abstract class TransactionDetailsViewModelBase with Store {
case WalletType.monero:
return 'https://monero.com/tx/${txId}';
case WalletType.bitcoin:
return 'https://mempool.cakewallet.com/${wallet.isTestnet ? "testnet/" : ""}tx/${txId}';
return 'https://mempool.space/${wallet.isTestnet ? "testnet/" : ""}tx/${txId}';
case WalletType.litecoin:
return bitcoin!.txIsMweb(transactionInfo)
? "https://www.mwebexplorer.com/blocks/block/${transactionInfo.height}"