Legal + release-readiness pass for Hash Bags launch

Legal (aligned with the hosted hash.boats Terms & Privacy):
- Rewrite in-app Terms (assets/text/Terms_of_Use.txt): drop the false 'No Fiat
  Operations'/'No Embedded Applications' clauses; add MoonPay (optional, where
  available), Trocador swaps + ~1% fee disclosure, WalletConnect, sanctions/18+,
  Apple EULA rider, and PA + class/jury-waiver dispute terms.
- Reconcile PRIVACY.md with the canonical hosted policy.
- Add THIRD_PARTY_LICENSES.md; correct the blanket 'MIT' claim in README (app
  code MIT; bundles BSD-3/Apache-2.0/LGPL-3.0); fix README build-doc + LICENSE.md
  links and copyright year.
- Standardize in-app legal naming to 'Terms of Service'; add in-app links to
  hash.boats/terms and /privacy.

Release fixes:
- Align URL scheme hashwallet:// -> hashbags:// (matches registered scheme) so
  WalletConnect/Trezor/quick-action deep links work.
- Store-review gating: hide Buy action until a provider is available; hide the
  empty 'Apps' tab.
- Exclude removed chains (SOL/TRX/ZEC/DCR/ZANO + tokens) from swap pickers.
- Residual Cake branding: macOS CFBundleDisplayName and Windows Runner.rc
  (Hash Wallet -> Hash Bags); remove Android cakewallet://y.at leftover.
- Genericize internal-infra comments in CI workflows.
This commit is contained in:
jwinterm
2026-07-02 14:07:24 -04:00
parent 86b4040c9b
commit 784a082f15
17 changed files with 254 additions and 91 deletions
+1 -1
View File
@@ -427,7 +427,7 @@ Future<void> setup({
getIt.registerLazySingleton(() => BitboxViewModel());
getIt.registerLazySingleton(() => TrezorConnect("hashwallet://trezor_connect",
getIt.registerLazySingleton(() => TrezorConnect("hashbags://trezor_connect",
appName: "Hash Bags"));
getIt.registerLazySingleton(() => TrezorViewModel(getIt<TrezorConnect>()));
+1 -1
View File
@@ -95,7 +95,7 @@ Future<void> runAppWithZone({Key? topLevelKey}) async {
}
// Convert the shortcut type to a URI and add it to the stream
final uri = Uri.parse('hashwallet://quickaction/$shortcutType');
final uri = Uri.parse('hashbags://quickaction/$shortcutType');
quickActionsStream.sink.add(uri);
});
@@ -4,6 +4,7 @@ import 'package:hash_wallet/bitcoin/bitcoin.dart';
import 'package:hash_wallet/di.dart';
import 'package:hash_wallet/entities/balance_display_mode.dart';
import 'package:hash_wallet/entities/bitcoin_amount_display_mode.dart';
import 'package:hash_wallet/entities/provider_types.dart';
import 'package:hash_wallet/generated/i18n.dart';
import 'package:hash_wallet/new-ui/modal_navigator.dart';
import 'package:hash_wallet/new-ui/pages/send_page.dart';
@@ -173,7 +174,8 @@ class _CardsViewState extends State<CardsView> {
onTap: withdrawFromL2,
)
]
: widget.dashboardViewModel.isEnabledTradeAction
: (widget.dashboardViewModel.isEnabledTradeAction &&
ProvidersHelper.getAvailableBuyProviderTypes().isNotEmpty)
? [
BalanceCardAction(
label: S.current.buy,
@@ -12,7 +12,7 @@ class DisclaimerPage extends BasePage {
final bool isReadOnly;
@override
String get title => 'Terms of Use';
String get title => 'Terms of Service';
@override
Widget? leading(BuildContext context) => isReadOnly ? super.leading(context) : null;
@@ -67,7 +67,7 @@ class DisclaimerBodyState extends State<DisclaimerPageBody> {
children: <Widget>[
Expanded(
child: Text(
'Terms and conditions',
'Terms of Service',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
fontSize: 20.0,
@@ -84,7 +84,7 @@ class DisclaimerBodyState extends State<DisclaimerPageBody> {
children: <Widget>[
Expanded(
child: Text(
'Legal Disclaimer\nAnd\nTerms of Use',
'Legal Disclaimer\nand\nTerms of Service',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodySmall?.copyWith(
fontWeight: FontWeight.bold,
@@ -170,7 +170,7 @@ class DisclaimerBodyState extends State<DisclaimerPageBody> {
: null,
),
Text(
'I agree to Terms of Use',
'I agree to the Terms of Service',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.bold,
),
+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('hashwallet://quickaction/${widget.initialQuickAction}');
final uri = Uri.parse('hashbags://quickaction/${widget.initialQuickAction}');
handleDeepLinking(uri);
}
@@ -75,7 +75,7 @@ abstract class WalletKitServiceBase with Store {
description: 'Hash Bags',
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://'),
redirect: Redirect(native: 'hashbags://'),
),
);
@@ -637,7 +637,10 @@ abstract class DashboardViewModelBase with Store {
appStore.settingsStore.shouldShowMarketPlaceInDashboard;
@computed
bool get showApps => appStore.settingsStore.shouldShowMarketPlaceInDashboard;
// Hash Bags: no Apps/marketplace content yet — hide the empty tab so the
// dashboard doesn't ship a nav destination that only says "No apps available
// yet." Re-enable (return the setting) once there is real content to show.
bool get showApps => false;
@computed
List<TradeListItem> get trades => tradesStore.trades.where((trade) {
@@ -122,12 +122,25 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
super(appStore: _appStore) {
_useTorOnly = _settingsStore.exchangeStatus == ExchangeApiMode.torOnly;
_setProviders();
const excludeDepositCurrencies = [CryptoCurrency.btt];
// Hash Bags: chains removed from the wallet are not offered as swap targets.
const removedChainCurrencies = [
CryptoCurrency.sol,
CryptoCurrency.trx,
CryptoCurrency.zec,
CryptoCurrency.dcr,
CryptoCurrency.zano,
CryptoCurrency.usdcsol,
CryptoCurrency.usdtSol,
CryptoCurrency.usdcTrc20,
CryptoCurrency.usdttrc20,
];
const excludeDepositCurrencies = [CryptoCurrency.btt, ...removedChainCurrencies];
const excludeReceiveCurrencies = [
CryptoCurrency.xlm,
CryptoCurrency.xrp,
CryptoCurrency.bnb,
CryptoCurrency.btt
CryptoCurrency.btt,
...removedChainCurrencies,
];
_initialPairBasedOnWallet();
+12
View File
@@ -33,6 +33,18 @@ abstract class SupportViewModelBase with Store {
hasIconColor: true,
linkTitle: S.current.apk_update,
link: 'https://github.com/Such-Software/hash-wallet/releases'),
LinkListItem(
title: 'Privacy Policy',
icon: 'assets/images/privacy_menu.png',
hasIconColor: true,
linkTitle: 'hash.boats/privacy',
link: 'https://hash.boats/privacy'),
LinkListItem(
title: 'Terms of Service',
icon: 'assets/images/privacy_menu.png',
hasIconColor: true,
linkTitle: 'hash.boats/terms',
link: 'https://hash.boats/terms'),
LinkListItem(
title: 'ChangeNow',
icon: 'assets/images/change_now.png',