diff --git a/.github/workflows/build-ios-sim.yml b/.github/workflows/build-ios-sim.yml index 12a9538f1..d2ee3a16f 100644 --- a/.github/workflows/build-ios-sim.yml +++ b/.github/workflows/build-ios-sim.yml @@ -32,11 +32,10 @@ jobs: # Gitea runner shell). Force UTF-8 globally so `pod install` succeeds. LANG: en_US.UTF-8 LC_ALL: en_US.UTF-8 - # If you added an /etc/hosts entry on the Mac mini that points - # git.such.software at NPM's LAN IP (so the runner hits NPM's - # Let's Encrypt cert instead of Gitea's internal self-signed), - # this env var can be removed. Left in as a belt-and-suspenders - # fallback — has no effect if certs already verify. + # Belt-and-suspenders fallback for when the self-hosted runner's internal + # git host presents a self-signed cert. Preferred fix is to trust the + # internal CA on the runner, after which this can be removed. (Runner + # host and network specifics live in the internal CI docs, not this repo.) NODE_TLS_REJECT_UNAUTHORIZED: '0' steps: diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 5b51548a7..66e2fe9dd 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -36,8 +36,9 @@ jobs: runs-on: windows env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} - # Belt-and-suspenders: bypass Node TLS verification for actions/* that - # talk back to git.such.software. Same fallback as build-ios-sim.yml. + # Belt-and-suspenders fallback that bypasses Node TLS verification for + # actions/* against the self-hosted runner's internal git host. Same + # fallback as build-ios-sim.yml. NODE_TLS_REJECT_UNAUTHORIZED: '0' steps: diff --git a/PRIVACY.md b/PRIVACY.md index 0ad9a16a4..863280939 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,49 +1,96 @@ -PRIVACY POLICY -============== +# Privacy Policy -Last Updated: May 16, 2026 +**Effective: July 2, 2026** -Such Software LLC ("we", "us", or "our") respects your privacy. Hash Bags is engineered to be a strictly non-custodial software application. Our privacy philosophy is simple: we cannot leak or misuse data that we do not collect. +The canonical, always-current version of this policy is published at +**https://hash.boats/privacy**. This file mirrors it for the source repository; +if the two ever differ, the hosted version at hash.boats/privacy controls. -1. INFORMATION WE DO NOT COLLECT --------------------------------- +Such Software LLC ("we", "us", or "our") publishes Hash Bags, a non-custodial +multi-chain wallet. Our privacy philosophy is simple: we cannot leak or misuse +data that we do not collect. -Hash Bags operates entirely on your device. We do not collect, transmit, store, or have access to: +## The short version -- Your private keys, public keys, or mnemonic seed phrases. -- Your wallet passwords or PINs. -- Your transaction history, balances, or recipient addresses. -- Your personal identifying information (e.g., name, address, email, phone number). -- Your IP address or device identifiers (unless explicitly provided by you via direct support communications). +Hash Bags is a non-custodial wallet. Your seed phrase and private keys live on +your device and never touch us. We don't run servers that store user data, and +we don't operate analytics, crash reporting, or telemetry SDKs. There are no +accounts, emails, passwords, or logins. -2. HOW THE SOFTWARE CONNECTS TO BLOCKCHAINS -------------------------------------------- +Where data *does* leave your device, it goes to (a) the blockchain nodes you +query, and (b) third-party services you explicitly opt in to — Trocador for +swaps and, where available, MoonPay for buying and selling with fiat. Those +providers have their own privacy policies. -To fetch balances and broadcast transactions, Hash Bags must connect to remote blockchain nodes. +## What Hash Bags itself collects -By default, the Software may connect to nodes hosted by third parties or by us. +**Nothing.** Hash Bags has no backend. There are no accounts, no servers we run +that your wallet contacts for tracking, and no analytics SDK embedded in the +app (no Sentry, Firebase Analytics, Crashlytics, Amplitude, Mixpanel, Google +Analytics, or equivalent). -When your device connects to a node, your IP address and the transaction data you are broadcasting are visible to that node. +The one exception is outside our control: if you install Hash Bags from the +Apple App Store or Google Play, those stores may give us aggregate, anonymized +statistics (download counts, crash rates, OS versions) based on your device's +settings. That data comes from Apple and Google, is not individually +identifying, and is not something Hash Bags collects or transmits. -We highly recommend running your own node and configuring the Software to connect to it via the custom node settings, to ensure maximum network-level privacy. +## What stays on your device -3. THIRD-PARTY SERVICES (TROCADOR) ----------------------------------- +Your seed phrase/mnemonic, derived private keys and addresses, local transaction +history, wallet labels and contacts, app preferences, and your PIN/biometric +state. These are stored in your device's secure storage (Keychain on iOS/macOS, +Keystore on Android, encrypted file storage on Windows/Linux). They are not +transmitted anywhere by Hash Bags. Uninstalling the app deletes them; your seed +phrase still restores the wallet elsewhere. -Hash Bags integrates with a third-party swap aggregator, Trocador, to allow you to exchange digital assets natively within the interface. +## What goes over the network when you use the app -When you initiate a swap, the necessary transaction details (such as the sending address, receiving address, and amount) are transmitted directly to Trocador's API. +- **Blockchain node queries.** To show balances and broadcast transactions, the + app connects to nodes. The operator of whichever node you use can see your IP + address and the queries you make. You can switch to a node you trust or run + your own. For maximum privacy we recommend running your own node. +- **Price data.** The app fetches exchange rates from `prices.neroswap.com`, a + service we operate that aggregates public sources. It sees your IP and the + currencies you display — not your addresses or balances. +- **Trocador (swaps).** When you start a swap, order details (input/output coin, + amount, receiving address) are sent to Trocador's API. Trocador is an + independent controller with its own policy at + https://trocador.app/en/privacypolicy/. +- **MoonPay (buying/selling with fiat, where available).** Optional; may not be + offered in every region or version. The flow opens in your external browser + and the transaction is with MoonPay. MoonPay independently performs KYC/AML and + collects your identity and payment data directly (name, date of birth, address, + government ID, payment details, possibly a selfie, and your IP). **That data is + held by MoonPay, not us.** To build the MoonPay link, the app calls a signing + endpoint we operate at `exchange-helper.such.software`, which sees your IP and + the order parameters (currencies, amount, wallet address) — not your ID or + payment details. MoonPay's policy: https://www.moonpay.com/legal/privacy_policy +- **WalletConnect (dApps, EVM chains).** If you connect to a third-party dApp, + your wallet address and the requests you approve are shared with that dApp and + the WalletConnect relay; those endpoints may see your IP. -Trocador acts as an independent data controller. Trocador or the underlying exchanges it routes to may log your IP address and transaction details. We strongly advise reviewing Trocador's Privacy Policy before utilizing the swap feature. +## Children -Such Software LLC does not intercept, log, or store the data you transmit to Trocador. +Hash Bags is not directed to people under 18 and we do not knowingly collect +data from minors. Uninstalling the app removes all local data. -4. APP STORES AND CRASH REPORTS -------------------------------- +## Your rights -If you download Hash Bags through the Apple App Store or Google Play Store, those platforms may independently collect analytics or crash reports based on your device's operating system settings. We only view anonymized, aggregated metrics provided by these storefronts. +Because we don't run accounts or store personal data about you on our servers, +there is generally nothing for us to delete or export. To the extent we ever act +as a controller of any personal data (e.g. a support email you send us), EU/UK +and California residents may contact support@such.software to exercise applicable +rights. For data held by third parties you used through the app (Trocador, +MoonPay, node operators), contact those providers directly. -5. CONTACT US -------------- +## Changes -If you have any questions or concerns regarding this Privacy Policy or your data, please contact us through our official repositories or support channels associated with Such Software LLC. +We'll post any update to this policy with a new effective date at +https://hash.boats/privacy and mirror it here. + +## Contact + +Privacy questions: **support@such.software** + +Hash Bags is developed and maintained by Such Software LLC. diff --git a/README.md b/README.md index bfe24ed7a..59081b3f1 100644 --- a/README.md +++ b/README.md @@ -40,11 +40,11 @@ Hardware wallet support: Ledger, Trezor, BitBox. The build system is unchanged from upstream Cake Wallet. See `docs/` for per-platform instructions: -* Android: `docs/build_android.md` -* iOS: `docs/build_ios.md` -* macOS: `docs/build_macos.md` -* Linux: `docs/build_linux.md` -* Windows: `docs/build_windows.md` +* Android: `docs/builds/ANDROID.md` +* iOS: `docs/builds/IOS.md` +* macOS: `docs/builds/MACOS.md` +* Linux: `docs/builds/LINUX.md` +* Windows: `docs/builds/WINDOWS.md` Required Flutter version is pinned in `Dockerfile` (currently 3.32.0) and `.tool-versions`. Newer Flutter SDKs (3.5+) drop the `_macros` pseudo-package that Cake's pinned `hive_generator` + `build_resolvers` transitively require — `flutter pub get` will fail until you switch to 3.32.0. If using `asdf` or `mise`, the version will be picked up automatically; otherwise: @@ -75,10 +75,10 @@ Issues and PRs welcome at https://github.com/Such-Software/hash-wallet. See [`CO ## License -Hash Bags is distributed under the [MIT License](LICENSE), inheriting from Cake Wallet. +Hash Bags' own application code is distributed under the [MIT License](LICENSE.md), inherited from Cake Wallet. It also bundles third-party open-source components under their own licenses — including the Monero and Wownero wallet cores (BSD-3-Clause) and additional components under Apache-2.0 and LGPL-3.0 — so the app as a whole is not solely MIT-licensed. See the `LICENSE` files in the repository. ``` -Copyright (C) 2018–2023 Cake Labs LLC +Copyright (C) 2018–2025 Cake Labs LLC Copyright (C) 2026 Such Software LLC ``` diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md new file mode 100644 index 000000000..49d0bff35 --- /dev/null +++ b/THIRD_PARTY_LICENSES.md @@ -0,0 +1,41 @@ +# Third-Party Licenses + +Hash Bags' own application code is licensed under the **MIT License** (see +[`LICENSE.md`](LICENSE.md)), inherited from its upstream project, +[Cake Wallet](https://github.com/cake-tech/cake_wallet). + +The Hash Bags app, however, **bundles and links third-party open-source +software under other licenses**. The app as a whole is therefore *not* solely +MIT-licensed. The most significant non-MIT components are listed below. All of +these licenses permit commercial redistribution; several (BSD-3-Clause, +Apache-2.0, LGPL-3.0) carry attribution/notice obligations that this file, the +per-package `LICENSE` files in the repository, and the in-app "Open-source +licenses" screen are intended to satisfy. + +This list is representative, not exhaustive. For a complete, generated +inventory of every transitive dependency, run a tool such as +[`flutter_oss_licenses`](https://pub.dev/packages/flutter_oss_licenses) and/or +consult the in-app licenses screen (Flutter's `showLicensePage`). + +| Component | Role | License | +|---|---|---| +| Monero wallet core (via [`monero_c`](https://github.com/mrcyjanek/monero_c)) | XMR wallet/crypto core compiled into the app | BSD-3-Clause (The Monero Project) | +| Wownero wallet core (via `monero_c`) | WOW wallet/crypto core compiled into the app | BSD-3-Clause (The Wownero Project) | +| `torch_dart` (`scripts/torch_dart/`) | Tor integration | LGPL-3.0 | +| `reown_walletkit` / reown Flutter (`scripts/reown_flutter/`) | WalletConnect connectivity | Apache-2.0 (Copyright 2024 Reown, Inc.) | +| Assorted Dart/Flutter packages (e.g. `bitcoin_base`, `blockchain_utils`, `on_chain`) | Chain support libraries | Apache-2.0 | +| `cw_*` fork modules (`cw_core`, `cw_bitcoin`, `cw_evm`, …) | First-party fork packages | MIT (Cake Technologies LLC; Such Software LLC) | + +## Notices + +- **The Monero / Wownero cores (BSD-3-Clause)** require that the copyright + notice and disclaimer be reproduced in binary distributions. Their license + texts are carried in the `monero_c` submodules fetched by + `scripts/prepare_moneroc.sh`. +- **`torch_dart` (LGPL-3.0)** is used as a library; its full license is at + `scripts/torch_dart/LICENSE`. +- **`reown_walletkit` (Apache-2.0)** — see `scripts/reown_flutter/LICENSE`. + +Hash Bags and Such Software LLC names, branding, and logos are **not** covered +by any of these open-source licenses and remain the property of Such Software +LLC. diff --git a/assets/text/Terms_of_Use.txt b/assets/text/Terms_of_Use.txt index 3d7772647..773555b64 100644 --- a/assets/text/Terms_of_Use.txt +++ b/assets/text/Terms_of_Use.txt @@ -1,47 +1,92 @@ TERMS OF SERVICE -Last Updated: May 16, 2026 +Effective: July 2, 2026 -1. ACCEPTANCE OF TERMS -These Terms of Service ("Terms") are entered into by and between You and Such Software LLC, a limited liability company organized under the laws of the Commonwealth of Pennsylvania ("Company", "we", "our", or "us"). These Terms govern your access to and use of the Hash Bags mobile application, source code, and any associated software (collectively, the "Software"). +The current version of these Terms is always available at https://hash.boats/terms -By downloading, accessing, or using the Software, you agree to be bound by these Terms. If you do not agree to these Terms, do not use the Software. +1. WHO WE ARE AND ACCEPTANCE +These Terms of Service ("Terms") are a binding agreement between you ("you") and Such Software LLC, a limited liability company organized under the laws of the Commonwealth of Pennsylvania, United States ("Such Software", "we", "us", or "our"). They govern your access to and use of the Hash Bags mobile and desktop applications, the source code, our website, and any related software and services (together, the "Software"). -2. NATURE OF THE SOFTWARE -Hash Bags is a non-custodial, peer-to-peer cryptocurrency wallet software. +By downloading, installing, accessing, or using the Software, you agree to these Terms and to our Privacy Policy (https://hash.boats/privacy). If you do not agree, do not use the Software. -Non-Custodial: We do not own, control, or take custody of any cryptocurrency assets held in your Hash Bags. You hold the private keys and are solely responsible for their management. +2. ELIGIBILITY +You may use the Software only if you are at least 18 years old (or the age of majority in your jurisdiction, whichever is greater) and are able to form a binding contract with us. By using the Software you represent that you meet these requirements and that your use complies with all laws that apply to you. -No Fiat Operations: The Software does not natively support or facilitate the purchase or sale of cryptocurrency with fiat currency (e.g., USD, EUR). +3. THE SOFTWARE IS NON-CUSTODIAL +Hash Bags is self-custodial wallet software. It does not store, transmit, hold, or take custody of your cryptocurrency, and it does not hold your seed phrase, private keys, or PIN. Your seed phrase and keys are generated and stored on your own device and remain under your sole control. Cryptocurrencies exist on their respective blockchains, not inside the Software; any transfer of value happens on a decentralized network, not with us. -No Embedded Applications: The Software does not include built-in decentralized applications (dApps) or a proprietary web3 browser. +WE CANNOT RECOVER YOUR FUNDS, SEED PHRASE, KEYS, OR PIN UNDER ANY CIRCUMSTANCES. If you lose your seed phrase, or if it is stolen or shared, your funds may be permanently and irretrievably lost, and we will be unable to help. You are solely responsible for securely backing up your seed phrase and for the security of your devices. -3. YOUR RESPONSIBILITIES +Such Software is not a bank, custodian, money services business, money transmitter, broker, dealer, exchange, or investment adviser, and it does not provide investment, financial, legal, accounting, or tax advice. The Software is a tool you operate yourself. -Seed Phrases and Private Keys: You are solely responsible for securely storing your seed phrase, private keys, and PINs. If you lose your seed phrase, your funds will be permanently lost. Such Software LLC has no ability to recover your seed phrase, private keys, or funds. +4. YOUR RESPONSIBILITIES +- Keys and backups: Record your seed phrase and keep it private and secure. Never share your seed phrase or private keys with anyone, including us — we will never ask for them. +- Accuracy: Blockchain transactions are generally irreversible. You are responsible for verifying recipient addresses, networks, and amounts before you send. Funds sent to the wrong address or network cannot be recovered. +- Compliance and taxes: You are responsible for complying with the laws that apply to you and for determining and paying any taxes that arise from your activity. -Compliance with Law: You represent and warrant that your use of the Software complies with all applicable local, state, national, and international laws and regulations. +5. RESTRICTED PERSONS AND LOCATIONS (SANCTIONS) +You represent and warrant that you are not, and are not acting on behalf of, a person who is: (a) located in, ordinarily resident in, or organized under the laws of any jurisdiction subject to comprehensive United States sanctions (currently including Cuba, Iran, North Korea, Syria, and the Crimea, Donetsk, and Luhansk regions of Ukraine); or (b) listed on any sanctions or restricted-party list maintained by the U.S. government (including the U.S. Treasury Department's Office of Foreign Assets Control (OFAC) Specially Designated Nationals and Blocked Persons List and the U.S. Commerce Department's Entity List), the United Nations, the European Union or its member states, or the United Kingdom. You agree not to use the Software if applicable law prohibits you from doing so. -4. THIRD-PARTY SERVICES & SWAPS -The Software includes integrated API access to third-party cryptocurrency swap aggregators, specifically Trocador. +6. ACCEPTABLE USE +You agree not to use the Software: (a) for money laundering, terrorist financing, fraud, or any other illegal activity, or to evade sanctions; (b) on behalf of any person barred under Section 5; or (c) to infringe others' rights, or to interfere with, attack, or circumvent the security of the Software or any network it connects to. -Independent Relationship: Your use of Trocador is governed entirely by Trocador's own Terms of Service and Privacy Policy. Such Software LLC is not a party to any transaction you execute via Trocador. +We may suspend, restrict, or terminate your access to the Software (or to particular features) if we reasonably believe you have violated these Terms or applicable law. Because the Software is non-custodial, ending your license does not affect your ability to access your funds with your seed phrase in other compatible wallet software. -No Liability for Third Parties: We are not responsible for any delayed, failed, or halted transactions, nor for any "Know Your Customer" (KYC) or "Anti-Money Laundering" (AML) holds placed on your funds by the exchange partners utilized by Trocador. Any disputes regarding swapped funds must be resolved directly with Trocador or its respective exchange partners. +7. THIRD-PARTY SERVICES +The Software lets you connect to independent third parties. Those services are operated by others, not by us. When you use one, you may be subject to and required to accept that provider's own terms and privacy policy, and you may be entering into a separate contract directly with that provider. We are not a party to those transactions, do not control those providers, and are not responsible for their acts, omissions, pricing, availability, verification decisions, or performance. See our Privacy Policy for what data flows where. -5. ASSUMPTION OF RISK -By using the Software, you acknowledge and accept the inherent risks associated with cryptographic systems, blockchain technology, and digital assets. This includes, but is not limited to, the risk of extreme price volatility, smart contract vulnerabilities, regulatory changes, and hardware or software failure. You agree that Such Software LLC is not responsible for any losses arising from these risks. +7.1 Swaps (Trocador). In-app swaps between coins are executed by Trocador, a third-party non-custodial exchange aggregator, and the underlying exchange providers it routes to — not by Such Software. When you start a swap, order details (input and output coin, amount, and your receiving address) are sent to Trocador's API. Such Software does not exchange your assets, does not take custody of funds during a swap, and is not the counterparty to your trade. Your use of Trocador is governed by Trocador's terms and privacy policy (https://trocador.app/en/privacypolicy/). -6. INTELLECTUAL PROPERTY & OPEN SOURCE -Hash Bags is built on open-source technologies. The Software's proprietary code is licensed under the terms specified in the Software's respective open-source license (e.g., MIT, GPL, etc., as found in the repository). To the extent any branding, logos, or trademarks (including "Hash Bags" and "Such Software LLC") are not covered by the open-source license, they remain the exclusive property of Such Software LLC. +Swap fee: Such Software receives a commission (currently around 1% of the swap amount) from Trocador for swaps initiated in the Software. This commission is already reflected in the exchange rate shown to you before you confirm a swap; there is no separate charge. Because the fee is a referral commission paid by Trocador and we are never in custody of or in the settlement path for the swapped funds, we act as a referrer, not as a money transmitter or exchanger. -7. DISCLAIMER OF WARRANTIES -THE SOFTWARE IS PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS. SUCH SOFTWARE LLC EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE SOFTWARE WILL BE UNINTERRUPTED, ERROR-FREE, OR ENTIRELY SECURE. +7.2 Buying and selling with fiat (MoonPay). Where available, the Software may offer the option to buy or sell cryptocurrency for government-issued (fiat) currency through MoonPay, an independent third-party provider. This feature is optional and may not be available in all regions or in all versions of the Software. If you use it, MoonPay — not Such Software — is the provider and merchant of record, buys from or sells to you directly, and independently performs its own identity verification (KYC) and anti-money-laundering (AML) checks. MoonPay collects your personal and payment information directly; Such Software does not collect, receive, or control that information. The transaction takes place with MoonPay under MoonPay's Terms of Use (https://www.moonpay.com/legal/terms_of_use_usa) and Privacy Policy (https://www.moonpay.com/legal/privacy_policy), which you must accept with MoonPay. Such Software is not a party to the transaction and is not responsible for MoonPay's pricing, verification decisions, holds, refunds, chargebacks, or availability. -8. LIMITATION OF LIABILITY -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL SUCH SOFTWARE LLC, ITS FOUNDERS, MEMBERS, EMPLOYEES, OR AGENTS BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS OR REVENUES, WHETHER INCURRED DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA, USE, GOODWILL, OR OTHER INTANGIBLE LOSSES, RESULTING FROM (A) YOUR ACCESS TO OR USE OF OR INABILITY TO ACCESS OR USE THE SOFTWARE; OR (B) ANY UNAUTHORIZED ACCESS, USE, OR ALTERATION OF YOUR TRANSMISSIONS OR DATA. +7.3 Connecting to dApps (WalletConnect). For supported EVM networks (such as Ethereum, Polygon, Base, Arbitrum, and BNB Smart Chain), the Software can connect to independent third-party decentralized applications ("dApps") using WalletConnect, so you can review and approve transaction or signature requests those dApps send to your wallet. The Software does not include any built-in dApp and does not provide an in-app web browser. Third-party dApps are operated by others, are not part of the Software, and are not endorsed by us; you interact with them at your own risk and are responsible for what you approve. -9. GOVERNING LAW AND DISPUTE RESOLUTION -These Terms shall be governed by and construed in accordance with the laws of the Commonwealth of Pennsylvania, without regard to its conflict of law principles. Any legal action or proceeding arising under these Terms will be brought exclusively in the federal or state courts located in or serving Chester County, Pennsylvania, and the parties hereby irrevocably consent to the personal jurisdiction and venue therein. +7.4 Nodes and other endpoints. To read balances and broadcast transactions, the Software connects to blockchain nodes. You may use the default nodes shipped with the Software or configure your own. Node operators and any other endpoints you connect to (including hardware wallets and services you paste links from) see the information your interaction with them entails. We neither operate nor monitor those third-party connections. -10. CHANGES TO THESE TERMS -We reserve the right to modify these Terms at any time. We will provide notice of any material changes by updating the "Last Updated" date. Your continued use of the Software following any changes constitutes your acceptance of the new Terms. +8. FEES +The Software is free to download and use. Network (miner/validator) fees are charged by the relevant blockchain, not by us. Fees, spreads, and limits for third-party services (such as Trocador and MoonPay) are set by those providers. The swap commission described in Section 7.1 is the only fee Such Software receives, and it is reflected in the quoted rate. + +9. ASSUMPTION OF RISK +You understand and accept the risks of cryptocurrencies and blockchain technology, including: extreme price volatility; the irreversibility of on-chain transactions and losses from sending to a wrong address or network; bugs or vulnerabilities in protocols, smart contracts, or cryptographic libraries; forks and network changes; regulatory changes; and hardware, software, or third-party service failures. You agree that Such Software is not responsible for losses arising from these risks. + +10. INTELLECTUAL PROPERTY AND OPEN SOURCE +Hash Bags' own application code is open source, licensed under the MIT License and inherited from its upstream project, Cake Wallet (Copyright Cake Labs LLC / Cake Technologies LLC; Copyright 2026 Such Software LLC). The Software also incorporates third-party open-source components under their own licenses, including the Monero and Wownero wallet cores (BSD-3-Clause), and additional components under Apache-2.0 and LGPL-3.0. The applicable license texts are available in the Software's source repository. To the extent any names, branding, or logos — including "Hash Bags" and "Such Software LLC" — are not covered by those open-source licenses, they remain the exclusive property of Such Software LLC, and nothing here grants you a license to use them. + +11. DISCLAIMER OF WARRANTIES +THE SOFTWARE IS PROVIDED "AS IS" AND "AS AVAILABLE", WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND. TO THE MAXIMUM EXTENT PERMITTED BY LAW, SUCH SOFTWARE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE SOFTWARE WILL BE UNINTERRUPTED, TIMELY, SECURE, ERROR-FREE, OR THAT ANY DATA (INCLUDING RATES OR BALANCES) IS ACCURATE. + +12. LIMITATION OF LIABILITY +TO THE MAXIMUM EXTENT PERMITTED BY LAW, SUCH SOFTWARE AND ITS MEMBERS, MANAGERS, EMPLOYEES, AND AGENTS WILL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR ANY LOSS OF PROFITS, REVENUE, DATA, OR CRYPTOCURRENCY, ARISING FROM OR RELATED TO YOUR USE OF (OR INABILITY TO USE) THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY. TO THE MAXIMUM EXTENT PERMITTED BY LAW, OUR TOTAL AGGREGATE LIABILITY FOR ALL CLAIMS RELATING TO THE SOFTWARE WILL NOT EXCEED ONE HUNDRED U.S. DOLLARS (US$100). SOME JURISDICTIONS DO NOT ALLOW CERTAIN EXCLUSIONS OR LIMITATIONS, SO SOME OF THE ABOVE MAY NOT APPLY TO YOU. + +13. INDEMNIFICATION +You agree to indemnify and hold harmless Such Software and its members, managers, employees, and agents from any claims, losses, liabilities, and expenses (including reasonable legal fees) arising from your use of the Software, your violation of these Terms or applicable law (including sanctions, AML, or tax obligations), or your infringement of any third party's rights. + +14. APPLE APP STORE AND GOOGLE PLAY +If you obtained the Software from the Apple App Store, the following additional terms apply. These Terms are between you and Such Software only, not with Apple, and Apple is not responsible for the Software or its content. Apple has no obligation to provide maintenance or support for the Software. In the event of any failure of the Software to conform to any applicable warranty, you may notify Apple, and Apple will refund the purchase price (if any); to the maximum extent permitted by law, Apple has no other warranty obligation with respect to the Software. Such Software, not Apple, is responsible for addressing any claims relating to the Software, including product-liability, legal-compliance, and intellectual-property claims. You represent that you are not located in a country subject to a U.S. Government embargo or designated as a "terrorist supporting" country and that you are not on any U.S. Government list of prohibited or restricted parties. Apple and its subsidiaries are third-party beneficiaries of these Terms and may enforce them against you. If you obtained the Software from Google Play, your use is also subject to the Google Play Terms of Service. + +15. GOVERNING LAW AND DISPUTES +These Terms are governed by the laws of the Commonwealth of Pennsylvania, without regard to its conflict-of-laws rules. + +Courts. Except as provided below, any dispute arising out of or relating to these Terms or the Software will be brought exclusively in the state or federal courts located in or serving Chester County, Pennsylvania, and you consent to the personal jurisdiction and venue of those courts. Either party may bring an individual claim in small-claims court, and either party may seek injunctive or equitable relief in any court of competent jurisdiction to protect its intellectual property or security. + +Jury-trial and class-action waiver. To the maximum extent permitted by law, you and Such Software each waive any right to a jury trial and agree that disputes will be brought only on an individual basis, and not as a plaintiff or class member in any class, collective, or representative proceeding. + +Optional arbitration. At our option, we may elect to resolve a given dispute through final and binding individual arbitration administered by the American Arbitration Association under its rules, applying Pennsylvania law. This does not change the individual-basis and jury/class-waiver terms above. + +30-day opt-out. You may opt out of the class-action waiver and the optional-arbitration provision by emailing support@such.software with the subject line "Legal Opt-Out" within 30 days of first accepting these Terms. Opting out will not affect any other part of these Terms. + +Time limit. Any claim relating to the Software must be brought within one (1) year after it arises, or it is permanently barred, except where a longer period is required by law. + +Nothing in these Terms limits any mandatory consumer-protection rights you have under the law of your country of residence that cannot be waived by agreement. + +16. CHANGES TO THESE TERMS +We may update these Terms from time to time. When we do, we will revise the effective date above and post the updated Terms at https://hash.boats/terms; material changes may also be noted in the app's release notes. Your continued use of the Software after an update means you accept the revised Terms. + +17. GENERAL +If any provision of these Terms is held unenforceable, the rest remain in effect and the unenforceable provision will be limited or removed to the minimum extent necessary. These Terms (with the Privacy Policy) are the entire agreement between you and Such Software regarding the Software. You may not assign these Terms without our consent; we may assign them to an affiliate or successor. Our failure to enforce a provision is not a waiver. We are not liable for delays or failures caused by events beyond our reasonable control. + +18. CONTACT +Questions about these Terms: support@such.software + +Hash Bags is developed and maintained by Such Software LLC. diff --git a/lib/di.dart b/lib/di.dart index 2b8870516..a0503b12b 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -427,7 +427,7 @@ Future setup({ getIt.registerLazySingleton(() => BitboxViewModel()); - getIt.registerLazySingleton(() => TrezorConnect("hashwallet://trezor_connect", + getIt.registerLazySingleton(() => TrezorConnect("hashbags://trezor_connect", appName: "Hash Bags")); getIt.registerLazySingleton(() => TrezorViewModel(getIt())); diff --git a/lib/main.dart b/lib/main.dart index 38e198526..383317c76 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -95,7 +95,7 @@ Future 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); }); diff --git a/lib/new-ui/widgets/coins_page/cards/cards_view.dart b/lib/new-ui/widgets/coins_page/cards/cards_view.dart index acce52fdb..ff485ee28 100644 --- a/lib/new-ui/widgets/coins_page/cards/cards_view.dart +++ b/lib/new-ui/widgets/coins_page/cards/cards_view.dart @@ -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 { onTap: withdrawFromL2, ) ] - : widget.dashboardViewModel.isEnabledTradeAction + : (widget.dashboardViewModel.isEnabledTradeAction && + ProvidersHelper.getAvailableBuyProviderTypes().isNotEmpty) ? [ BalanceCardAction( label: S.current.buy, diff --git a/lib/src/screens/disclaimer/disclaimer_page.dart b/lib/src/screens/disclaimer/disclaimer_page.dart index e09e3c4ee..a172ed296 100644 --- a/lib/src/screens/disclaimer/disclaimer_page.dart +++ b/lib/src/screens/disclaimer/disclaimer_page.dart @@ -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 { children: [ 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 { children: [ 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 { : 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, ), diff --git a/lib/src/screens/root/root.dart b/lib/src/screens/root/root.dart index 144efd427..85189ee4a 100644 --- a/lib/src/screens/root/root.dart +++ b/lib/src/screens/root/root.dart @@ -115,7 +115,7 @@ class RootState extends State 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); } diff --git a/lib/src/screens/wallet_connect/services/walletkit_service.dart b/lib/src/screens/wallet_connect/services/walletkit_service.dart index a76eb57ec..efa828ac6 100644 --- a/lib/src/screens/wallet_connect/services/walletkit_service.dart +++ b/lib/src/screens/wallet_connect/services/walletkit_service.dart @@ -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://'), ), ); diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 982f60c6e..2151c66f0 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -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 get trades => tradesStore.trades.where((trade) { diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 46165adbf..1e151ff17 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -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(); diff --git a/lib/view_model/support_view_model.dart b/lib/view_model/support_view_model.dart index 279748b08..1436e7f9a 100644 --- a/lib/view_model/support_view_model.dart +++ b/lib/view_model/support_view_model.dart @@ -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', diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 6474af82d..873396893 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -452,7 +452,7 @@ CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = 32J6BB6VUS; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Cake Wallet"; + INFOPLIST_KEY_CFBundleDisplayName = "Hash Bags"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -587,7 +587,7 @@ CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = 32J6BB6VUS; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Cake Wallet"; + INFOPLIST_KEY_CFBundleDisplayName = "Hash Bags"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -616,7 +616,7 @@ CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = 32J6BB6VUS; INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Cake Wallet"; + INFOPLIST_KEY_CFBundleDisplayName = "Hash Bags"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index a927c3a84..cccf7fc54 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "Such Software LLC" "\0" - VALUE "FileDescription", "Hash Wallet" "\0" + VALUE "FileDescription", "Hash Bags" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "Hash Wallet" "\0" + VALUE "InternalName", "Hash Bags" "\0" VALUE "LegalCopyright", "Copyright (C) 2026 Such Software LLC. All rights reserved." "\0" - VALUE "OriginalFilename", "Hash Wallet.exe" "\0" - VALUE "ProductName", "Hash Wallet" "\0" + VALUE "OriginalFilename", "Hash Bags.exe" "\0" + VALUE "ProductName", "Hash Bags" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END