Commit Graph
3901 Commits
Author SHA1 Message Date
jwinterm 20ad49a403 Icon: redraw # as vector path for true centering
User flagged the Windows .exe icon as having the hash sign visually
biased toward the top. Root cause: the previous icon source SVG used
<text> with dominant-baseline="central" — the rasterizer fell back to
whatever monospaced font it found, and that font's # glyph isn't
positioned at the geometric center of its em-box (most monospaced
fonts have the # mark biased upward in their em-square).

Replace the text-rendered # with 4 vector <line> elements forming a
mathematically symmetric # centered at (512, 512) of the 1024 canvas.
No font dependency, deterministic across rasterizers.

Re-rendered:
  - assets/images/app_logo.png — master 1024x1024 PNG
  - windows/runner/resources/app_icon.ico — 7-size .ico (16..256)
  - assets/images/cakewallet_android_icon/mipmap-*/ic_launcher.png
    (5 densities, the legacy launcher PNG; CI symlinks from here)

NOT regenerated in this commit (follow-up):
  - assets/images/cakewallet_android_icon/mipmap-*/ic_launcher_{foreground,background,monochrome}.png
    (adaptive icons used on Android 8+ — need separate foreground/
    background composition logic)
  - assets/images/ios_icons/cakewallet_ios_icons/* (70 files)
  - assets/images/macos_icons/cakewallet_macos_icons/* (7 files)
2026-05-22 12:16:07 -04:00
jwinterm a2a9c1b0aa Pre-release rebrand: core platform branding + versions + node lists
Cake Wallet → Hash Bags / Such Software LLC across the user-facing
platform configs:
  - macos/Runner/InfoBase.plist: CFBundleDisplayName + CFBundleName
  - windows/runner/main.cpp: top-level window title
  - ios/Runner/InfoBase.plist: URL scheme cakewallet → hashbags,
    CFBundleURLName y.at → com.suchsoftware.hashwallet
  - android/app/src/main/AndroidManifestBase.xml: URL scheme
  - scripts/windows/build_exe_installer.iss: full rebrand (name,
    publisher, URL, exe name, AppId, DefaultDirName, output filename)
  - assets/text/disclaimer_deuro.txt: legal disclaimer text

Version unification → 1.0.0 build 1 across all platforms:
  - pubspec_description.yaml (was 0.0.0, description was "Cake Wallet.")
  - scripts/android/app_env.sh (was 6.1.2 build 4410)
  - scripts/ios/app_env.sh (was 6.1.2 build 418)
  - scripts/macos/app_env.sh (was 6.1.0 build 147)
  - scripts/windows/build_exe_installer.iss (was 6.1.0)
  env.json (Windows) was already 1.0.0.

FAQ contact info → support@such.software / @such_software across all
13 locale faq_*.json files (was support@cakewallet.com /
@CakeWalletXMR / @cakewallet_bot).

Node lists:
  - Delete assets/zano_node_list.yml — Zano not enabled in any
    configure flag; file was dead code.
  - Remove zcashDefaultNodeUri const from
    lib/entities/default_settings_migration.dart — Zcash not in
    product, const was unreferenced anywhere.

Note on BTC + LTC defaults: audit suggested these were Cake-by-default
but they were already non-Cake (blockstream and electrum-ltc.bysh.me).
Cake stays in the auto-switch pool — flagged for separate decision on
whether to disable auto-switching to Cake nodes for privacy.
2026-05-22 11:26:18 -04:00
jwinterm bba8a975cf CI: add Hash Bags Windows build workflow (manual trigger)
Self-hosted Windows runner builds an unsigned Windows Release zip with
the Flutter .exe + bundled monero/wownero DLLs + MinGW runtime DLLs +
MSVC runtime DLLs. workflow_dispatch only — triggered from the Gitea
Actions UI.

Major design points hammered out during initial bring-up:

  - Use explicit Git Bash path for `shell:` rather than `shell: bash`,
    since act_runner under LocalSystem resolves bare `bash` to
    C:\Windows\System32\bash.exe (WSL) which refuses to run as
    LocalSystem.
  - Configure git identity + safe.directory before any submodule ops,
    since LocalSystem has no global git config and scripts/monero_c/
    apply_patches.sh does git-commit-equivalents.
  - Clone torch_dart + reown_flutter from git instead of tarball — the
    upstream-published .tar.gz tarballs contain example-app
    .plugin_symlinks with absolute /home/runner paths that Windows tar
    refuses to extract.
  - Fetch monero_c prebuilt release-bundle.zip (same one Android/iOS
    use) and re-stage its x86_64-w64-mingw32 wallet DLLs into the
    layout that windows/CMakeLists.txt expects:
      scripts/monero_c/release/<coin>/x86_64-w64-mingw32_libwallet2_api_c.dll
    CMake's install() rules RENAME them to <coin>_libwallet2_api_c.dll
    in the Release dir.
  - Mirror those wallet DLLs under their lib<coin>_wallet2_api_c.dll
    Dart-FFI-expected names — package:monero's DynamicLibrary.open()
    uses a different naming convention than windows/CMakeLists.txt's
    RENAME rules.
  - Source MinGW runtime DLLs (libssp-0.dll, libwinpthread-1.dll) from
    Git for Windows' bundled mingw64/bin — has modern symbols including
    pthread_cond_timedwait64 that monero_c requires. Flutter's bundled
    mingit is too old (2017-vintage libwinpthread).

setup-windows-runner.ps1 (the one-shot toolchain installer for the
runner host) is gitignored — it's runner-side infra, not part of the
app.
2026-05-22 10:48:38 -04:00
jwinterm a6bb3c595d Branding: Hash Wallet → Hash Bags for Windows + Linux app name
Final public name is Hash Bags (Such Software). iOS CFBundleDisplayName
and Android app.properties (generated by scripts/android/app_env.sh) were
already on Hash Bags; this catches the two remaining user-facing places:

  - env.json CW_WIN_APP_NAME (Windows launcher label)
  - linux/com.suchsoftware.HashWallet.desktop Name= (Linux app menu label)

Bundle IDs, Dart package name, and the .desktop file's app-id all stay
on hashwallet — those are internal identifiers that nobody sees.
2026-05-19 17:58:22 -04:00
jwinterm 52b8cd090d Wownero: fix missing icon in wallet picker
The wow CryptoCurrency had iconPath pointing at assets/images/crypto/wownero.svg,
which doesn't exist — so the row in Create New Wallet rendered with no logo.
The actual asset lives at assets/new-ui/crypto_full_icons/wownero.svg (same
location every other coin uses). Point iconPath there and add flatIconPath
for the balance-card-flat icon, mirroring the Monero definition.
2026-05-19 17:58:22 -04:00
jwinterm c506679086 iOS sim: drop sudo /etc/hosts rewrite, add upload diagnostic
The runtime sudo rewrite step hung 51m waiting for a password the runner
can't enter. The Mac mini's /etc/hosts already points git.such.software
at 127.0.0.1, and the host-mode act_runner inherits it directly, so no
runtime modification is needed. Replace the rewrite with a passive grep
assertion that fails fast with instructions if the entry is missing.

Add a diagnostic step before the upload that prints ACTIONS_RUNTIME_URL,
ACTIONS_RESULTS_URL, GITHUB_SERVER_URL + probes each with curl -kIv. The
last run never reached the upload step, so we still don't know whether
upload-artifact targets git.such.software (uses our hosts override) or
a different address injected by act_runner.
2026-05-19 17:37:00 -04:00
jwinterm 6c765a6e0e iOS sim: write /etc/hosts at job runtime so upload-artifact can reach Gitea
The Mac runner doesn't honor changes to the host's /etc/hosts (whether
because of act_runner sandboxing, container isolation, or DNS caching).
Instead of fighting that, override /etc/hosts INSIDE the runner's job
environment, right before the upload step.

Resolution priority:
  1. host.docker.internal — magic name in Docker Desktop containers
     that resolves to the Mac host. Use this if available.
  2. 127.0.0.1 — works for host-mode runners (runs natively on Mac).

NODE_TLS_REJECT_UNAUTHORIZED=0 (already set) bypasses the self-signed
cert Gitea presents on its internal listener.

Brought back actions/upload-artifact so the .app lands in Gitea's
Actions UI like APK + AAB.
2026-05-19 15:30:13 -04:00
jwinterm ee4ccacab0 iOS sim: skip artifact upload, just copy .app to workspace/dist
Mac runner spawns each job in a Docker container (via Docker Desktop).
The container has its own /etc/hosts and DNS — the host's hosts entries
don't propagate. DNS for git.such.software resolves to the public IP,
the container can't NAT-hairpin back to its own WAN IP, ECONNREFUSED.

actions/upload-artifact is doubly silly when the runner IS the Gitea
server. Copy the .zip to $GITHUB_WORKSPACE/dist/ instead. That dir
is mounted from the host, so it persists at:
  /Users/such-git/.cache/act/<runner-id>/hostexecutor/dist/

Find latest:
  find /Users/such-git/.cache/act -name 'hash_wallet_ios_sim_*.zip'     -exec ls -lt {} + 2>/dev/null | head

Step also echoes the exact path + a find command in the build log.
2026-05-19 15:01:59 -04:00
jwinterm 0aa9f03f77 Android: bump gradle JVM heap to 10G + cap workers to fix AAB OOM
Verbose log of yesterday's AAB build revealed:
  java.lang.OutOfMemoryError: Java heap space
    at java.util.zip.DeflaterOutputStream.write
    at com.android.zipflinger.StreamSource.<init>
    at com.android.builder.internal.packaging.AabFlinger$writeZip$1.call

AAB packaging streams compressed native libs through ByteArrayOutputStream
buffers. With universal-bundle (all 3 ABIs in one AAB) and parallel
ForkJoinPool workers all drawing from the same 6G heap, the peak exceeds
budget mid-zip. APK build doesn't hit this because per-ABI APKs are
packaged separately, much smaller per-file working set.

Two changes:
  1) org.gradle.jvmargs: -Xmx6144M → -Xmx10240M, + MaxMetaspaceSize=1024M
     (the daemon-side metaspace also creeps up over a long build).
  2) org.gradle.workers.max=2 — fewer parallel workers = lower simultaneous
     buffer footprint. Build still parallel, just gentler peak.
2026-05-19 14:38:57 -04:00
jwinterm ba5c81e78b CI: clarify NODE_TLS_REJECT_UNAUTHORIZED is a fallback now
Gitea is on the same Mac mini as the runner, behind NPM in a separate
container. The proper fix is a hosts entry on the Mac that points
git.such.software at NPM's LAN IP so the runner reaches Gitea via
NPM's Let's Encrypt cert.

The env var stays in the workflow as a belt-and-suspenders fallback —
no harm if certs already validate cleanly, saves the workflow from
breaking again if the hosts entry ever gets blown away (system reset,
container migration, etc).
2026-05-19 12:52:29 -04:00
jwinterm 9f832633b9 CI: skip TLS verify on iOS artifact upload + verbose AAB build
iOS:
- Build itself succeeds (Runner.app sits in build/ios/iphonesimulator/).
- actions/upload-artifact's Node.js HTTP client hits git.such.software
  via LAN (NAT hairpin), bypassing the public NPM/Let's Encrypt cert
  and landing on Gitea's internal self-signed cert. Node refuses with
  DEPTH_ZERO_SELF_SIGNED_CERT.
- Setting NODE_TLS_REJECT_UNAUTHORIZED=0 at job env disables verification
  for all Node-based actions in the job. Acceptable here because we're
  talking to our own server on our own LAN — no external MITM surface.
- Long-term cleaner fix: install Gitea's CA cert into the runner's
  system trust store, or have the runner reach Gitea via the public
  hostname so NPM's Let's Encrypt cert is presented.

Android AAB:
- APK built + signed + uploaded fine (~14 min). AAB build then failed
  at FinalizeBundleTask$BundleToolRunnable / :app:signReleaseBundle
  with no visible error.
- Added --verbose to 'flutter build appbundle' so the next run prints
  the actual gradle stacktrace. Once we see WHY signReleaseBundle is
  failing, we can target the real fix.
2026-05-19 12:29:53 -04:00
jwinterm 1c844c58cf CI: pre-install Rust + iOS targets to fix rustup-during-podbuild race
Build was failing with:
  component download failed for rust-std-aarch64-apple-ios-sim:
  could not rename downloaded file from '.../9362b66...partial' to
  '.../9362b66...': No such file or directory

One of the iOS pods (likely reown_walletkit's yttrium FFI or similar)
invokes rustup mid-build to fetch iOS targets. When the pod build runs
multiple targets in parallel, multiple rustup processes race on the
same .partial download file — one finishes/renames, the next looks
for the .partial that's no longer there.

Fix: add a workflow step that runs before pod install + flutter build:
  - Install rustup if missing (idempotent — self-hosted runner persists).
  - Wipe any stale *.partial files (debris from previous racing).
  - rustup target add the three iOS triples serially.

That way the pod's mid-build rustup invocation finds everything already
installed and just no-ops.
2026-05-19 11:11:14 -04:00
jwinterm 8f583b14ea iOS: strip Zano/Zcash xcframework refs + generate Monero/Wownero XCFrameworks in CI
Two fixes that together address the 'There is no XCFramework found at...'
build failure:

1) ios/Runner.xcodeproj/project.pbxproj: remove 10 lines referencing
   ZanoWallet.xcframework + WarpApiFFI.xcframework (zcash). Those were
   stale — both chains were removed in commit 4eb7db0b7 weeks ago, but
   the Xcode project still listed them in BuildFile, CopyFiles, FileReference,
   and Group sections. xcode error referenced them as missing.

2) Both iOS workflows now run scripts/ios/gen_framework.sh after staging
   the monero_c bundle. The script reads
   aarch64-apple-ios/lib<wallet>_wallet2_api_c.dylib and
   aarch64-apple-ios-simulator/lib<wallet>_wallet2_api_c.dylib from the
   bundle, wraps each as a .framework with an Info.plist, then bundles
   device + simulator into ios/MoneroWallet.xcframework +
   ios/WowneroWallet.xcframework via xcodebuild -create-xcframework.
   These are exactly the paths project.pbxproj's CopyFiles phase
   references.

   The 'Inspect iOS targets' debug step was expanded to print bundle
   subdirs + sample target contents, so if the monero_c bundle doesn't
   actually ship those exact dirs we'll see it in the log.
2026-05-19 10:54:48 -04:00
jwinterm e277d1ba33 CI: run compile_graphics.sh to generate .svg.vec icon assets
Empty action-row buttons (Send/Receive/Swap/Scan) and empty bottom
navbar tabs are the same root cause on Linux + Android (+ likely iOS):
the workflows weren't running Cake's compile_graphics.sh, which is
what converts res/pictures/*.svg sources → assets/new-ui/*.svg.vec
precompiled vector assets that CakeImageWidget loads via
AssetBytesLoader.

History: commit 89e07fbba (Cake upstream, March 2026) moved to
precompiled SVGs, added compile_graphics.sh, and added a 'Compile
graphics' workflow step. Then 980c0278b added \*.svg.vec to .gitignore
(so the artifacts are no longer tracked). End result: CI MUST run
compile_graphics.sh to produce the .vec files, or every CakeImageWidget
silently renders nothing.

Fix:
- Add vector_graphics_compiler: ^1.1.16 to dev_dependencies (the script
  invokes 'dart run vector_graphics_compiler ...' which needs the
  package in the project's deps for 'dart run' to find it).
- Add a 'Compile SVG assets' step to all four workflows, between
  generate_localization and the build/pod-install step.

This will populate assets/new-ui/ with ~82 .svg.vec files at build
time, so every CakeImageWidget reference (action row, navbar, top bar,
settings rows, etc.) resolves to its actual icon.
2026-05-19 10:50:44 -04:00
jwinterm a19d0615c8 App icon: regenerate Android assets from Hash Bags # mark
Sideloaded APK was showing Cake Wallet's original icon (white envelope
with rainbow stripes) because scripts/android/app_icon.sh copies from
assets/images/cakewallet_android_icon/ — which still held Cake's PNGs.

Regenerated all five density variants (mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi)
from assets/images/hash_wallet/02_app_icon.svg:
  - ic_launcher.png (legacy non-adaptive, 48/72/96/144/192 px)
  - ic_launcher_foreground.png (adaptive icon # mark layer, 108→432 px)
  - ic_launcher_background.png (solid brand-green #1A5C38)
  - ic_launcher_monochrome.png (themed icons API — # only on transparent)
Also overwrote assets/images/app_logo.png, cakewallet_logo.png, and
cakewallet_android_icon.png (500x500) so any consumer of those gets
the Hash Bags mark too.

File names with 'cakewallet' prefix kept on purpose — they're internal
to Cake's app_icon.sh script and renaming them would touch the script
without benefit. End users see only the rendered icon, not the path.

Next APK build from the workflow should sideload with the proper #
mark icon.
2026-05-19 09:48:30 -04:00
jwinterm e21430e1d6 CI: force LANG/LC_ALL to UTF-8 in iOS workflows (CocoaPods needs it)
pod install fails with Encoding::CompatibilityError 'Unicode
Normalization not appropriate for ASCII-8BIT' when the shell locale
isn't UTF-8. CocoaPods' own warning tells you: 'CocoaPods requires
your terminal to be using UTF-8 encoding'.

Gitea Actions runner on macOS launches subprocesses with LANG unset,
which Ruby treats as ASCII-8BIT. Setting env-level LANG=en_US.UTF-8
and LC_ALL=en_US.UTF-8 fixes it for all steps in the job.
2026-05-19 08:20:17 -04:00
jwinterm bf2a35893d CI: iOS workflows clone BitBox without running Android bindings build
build_bindings.sh in bitbox_flutter unconditionally runs
'gomobile bind -target=android -androidapi 24' which produces an
api.aar — needed only for Android. The Mac runner has no Android SDK,
so gomobile fails with 'could not locate Android SDK'.

iOS doesn't need the .aar. BitBox's iOS support is a separate native
plugin under bitbox_flutter/ios/Classes/ + bitbox_flutter.podspec,
linked via flutter pub get + pod install. We just need the directory
present so the path-dep resolves.

Replace the wrapper invocation in iOS workflows with the clone steps
only; skip build_bindings.sh entirely. Android workflow keeps using
the wrapper as-is.
2026-05-19 08:02:33 -04:00
jwinterm d21c944f3f CI: manual-trigger only for all build workflows
Auto-triggers on push were noisy — every merged PR kicked off the
linux + android + ios-sim builds. Switching to workflow_dispatch only.
Trigger via Gitea Actions UI when you want a build. workflow_dispatch
runs as the authenticated user, so secrets are always present.

Adds the push trigger back when we want pre-merge gating or CI on every
commit (e.g., release-tag automation).
2026-05-19 07:57:22 -04:00
jwinterm 1e4af3dbde CI: drop pull_request triggers (Gitea strips secrets from fork PRs)
The Android workflow's 'ANDROID_KEYSTORE_BASE64 not set' failure is
secrets-not-reaching-runner, not a missing secret. The secret IS set
in Builds/hash-wallet's repo secrets. The issue: workflows are being
triggered by 'pull_request' events when github-such-software/hash-wallet
is mirrored into Builds/hash-wallet via PR. Gitea (and GitHub) Actions
deliberately strip secrets from workflows triggered by PRs from forks
to prevent rogue PRs from exfiltrating secrets.

Fix: drop the pull_request trigger from all auto-build workflows. Each
workflow now runs exactly once, on push to dev/main (post-merge), in
the destination repo's context, with secrets intact.

Also added a debug step in the Android keystore decode that prints
secret LENGTHS (never values) so future failures of this shape are
diagnosable immediately.
2026-05-19 07:54:09 -04:00
jwinterm 71da372d83 CI: install Go + gomobile if missing (for BitBox Flutter iOS bindings)
scripts/build_bitbox_flutter.sh invokes build_bindings.sh which calls
gomobile to generate iOS bindings for the Go BitBox client. Without
Go + gomobile on the Mac runner, that step fails with 'gomobile:
command not found'.

Adds an idempotent step: install Go via brew if missing, then 'go
install golang.org/x/mobile/cmd/{gomobile,gobind}@latest' if missing.
Self-hosted runner persists $GOPATH/bin between runs, so steady-state
is zero-cost after the first install.

Same conditional-install pattern as Flutter + CocoaPods.
2026-05-19 07:50:02 -04:00
jwinterm 53919f73c5 CI: tolerate missing Android i686 ABI; brew-first CocoaPods install
Android:
- monero_c prebuilt bundle doesn't ship i686-linux-android (32-bit x86
  Android — essentially extinct, sim/emulators use x86_64). Was failing
  loud on the missing target. Now: missing target = skip + log; only
  the truly-modern ABIs (arm64-v8a, x86_64) are REQUIRED. armeabi-v7a
  (32-bit ARM) is shipped if available but not required. The resulting
  APK is universal across whichever ABIs got staged.

iOS:
- 'sudo gem install cocoapods' was hitting a password prompt because
  the Gitea runner user has no passwordless sudo configured (rightly).
  Switched to brew-first install (Homebrew lives in its own prefix,
  no sudo needed on Mac). Falls back to 'gem install --user-install'
  (no sudo) if brew is somehow unavailable. The whole step is still
  no-op if 'pod' is already on PATH.
2026-05-19 07:30:13 -04:00
jwinterm e8f766dfe6 Rebrand: 'Hash Wallet' → 'Hash Bags' (visible name only)
Avoids any confusion / potential trademark friction with HashWallet
(Spanish hardware-wallet company). Hash Bags is a more distinctive
name, harder to collide with, and we can still rank for 'hash wallet'
search via App Store / Play Store subtitle ('Hash Bags - A Wallet
for your Coins').

What changed (all user-visible strings):
- Launcher labels: android/app.properties, scripts/android/app_env.sh,
  scripts/ios/app_env.sh, linux window title (CMakeLists +
  my_application.cc)
- In-app text: lib/generated/i18n.dart + ARB sources under res/values/
- Brand docs: README.md, CONTRIBUTING.md, PRIVACY.md,
  assets/text/Terms_of_Use.txt, assets/text/Release_Notes.txt
- hash.boats website: index.html, og-image.svg + regen og-image.png,
  site.webmanifest, styles.css comment, splash/confirm/pulse/mark/
  lockup svg titles, report/index.html, server/server.js
- CI workflow display names ("Hash Bags Linux build", etc.)

What did NOT change (deliberate):
- Bundle ID / Package: com.suchsoftware.hashwallet (immutable app
  identity on App Store + Play Store — changing == orphaning the app)
- Binary name: hash_wallet (Linux executable)
- Dart import paths: package:hash_wallet/...
- Git repo: hash-wallet (Such-Software/hash-wallet)
- URL scheme: hashwallet:// (internal deep links)
- support@such.software (no domain change yet)
- App Store / Play Store listing names (whatever was registered there
  stays; we updated launcher label only)
- hash.boats domain (still the wallet site)

Also kept the '#ash Wallet' wordplay in the nav but updated to
'#ash Bags' so the # mark still serves as the H. Nav reads:
[# mark] #ash Bags

Website hero tagline now matches the App Store sub-title concept:
'A wallet for your coins. Open-source, non-custodial, multi-chain.
Privacy-leaning by default.'

108 files modified, ~674 string replacements.
2026-05-19 07:26:45 -04:00
jwinterm 93744af5ba CI: conditional Flutter install + concurrency + wget→curl for Mac runner
iOS workflows were broken on the Mac mini runner because Flutter
wasn't installed. Three fixes:

1) Conditional Flutter setup. Check 'flutter --version' first; only
   pull subosito/flutter-action@v2 if missing or wrong version. Self-
   hosted Mac runner persists SDKs between runs, so steady-state is
   zero-cost. First run on the runner triggers a full SDK download
   via subosito (with cache: true so subsequent fresh installs are
   still fast).

2) wget → curl across all iOS workflow steps. macOS doesn't ship
   wget by default; curl is always present and respects -fsSL +
   redirect properly.

3) Concurrency groups on all four workflows. A burst of commits no
   longer queues N copies of the same build — newer pushes cancel
   in-flight runs on the same branch. Groups:
     linux-<ref>, android-<ref>, ios-sim-<ref>, ios-testflight-<ref>

   This addresses the '6 runs from one merge' issue: each commit in
   the merge triggered all 3 push-listening workflows. Concurrency
   cancels the earlier 3 the moment the newer commit's runs start.

4) CocoaPods install is also conditional (was already 'if ! command -v
   pod' under the hood; just tightened the step name).
2026-05-18 21:29:59 -04:00
jwinterm c7f64f8273 CI: iOS TestFlight build workflow (signed + upload via altool)
Phase 2 of iOS CI. Full signed pipeline that:

1) Decodes secrets:
   - APPLE_DIST_CERT_P12_BASE64 + password → temp keychain
   - APPLE_PROVISIONING_PROFILE_BASE64 → ~/Library/MobileDevice/...
   - APPLE_API_KEY_P8_BASE64 → ~/.appstoreconnect/private_keys/
2) Parses the .mobileprovision for its UUID + Name (used in ExportOptions).
3) Generates ios/ExportOptions.plist dynamically with the right Team ID +
   profile name + 'app-store' method.
4) Runs flutter build ipa --release --export-options-plist=...
5) Uploads the .ipa to TestFlight via xcrun altool with the API key.
6) Always cleans up keychain + temp credentials, even on failure.

Trigger: workflow_dispatch ONLY (manual). TestFlight uploads consume a
build number with every push — we don't want auto-trigger spamming
TestFlight. Bump the build number in scripts/ios/app_env.sh before
each TestFlight push (or wire a workflow_dispatch input later).

All Apple secrets (and the Trocador ones reused from Linux/Android) are
already configured in Gitea Actions.

If signing fails on first run: most likely the profile name extracted
from the .mobileprovision doesn't match what Xcode expects, OR the
distribution cert in the .p12 doesn't match what the profile pins. The
keychain identity sanity-check + ExportOptions.plist echo in the logs
will tell us which.
2026-05-18 21:23:54 -04:00
jwinterm 6304521e92 CI: iOS Simulator build workflow (no signing)
Phase 1 of iOS CI. Validates the Mac runner end-to-end with the
simplest possible target: an unsigned simulator .app.

Runs on the mac-mini-m2 self-hosted runner (label: macos-latest).
Mirrors the Linux/Android workflows for the shared prep steps
(torch_dart, reown_flutter, bitbox_flutter, monero_c prebuilt bundle,
configure, codegen, Trocador secrets), then does flutter build ios
--simulator --no-codesign and zips Runner.app.

Artifact: hash-wallet-ios-sim-<sha>. Unzip on any Apple Silicon Mac,
drag Runner.app into Simulator to run.

Phase 2 (TestFlight, separate file) follows after Phase 1 is green —
adds keychain setup, .p12 + provisioning profile install, ipa build,
xcrun altool upload using the App Store Connect API key. All Apple
secrets are already configured in Gitea.

The 'Inspect iOS targets in monero_c bundle' debug step will reveal
which Apple targets the prebuilt bundle ships — we'll need
aarch64-apple-ios-sim (or similar) for arm64 simulator builds on
M-series Macs. If missing, follow-up will either fetch from a different
source or build the iOS .a archives from source via Cake's scripts/ios/
build_*.sh chain (slow but reliable).
2026-05-18 21:22:07 -04:00
jwinterm 083f8b7f2a CI: add Android build workflow (signed APK + AAB)
Mirrors the Linux workflow's approach — uses the Cake-Labs prebuilt
Docker image (Flutter 3.32.0 + NDK r28 + Go + Android SDK + JDK17 +
all native build deps) and the prebuilt monero_c .so bundle, so we
skip the multi-hour native cross-compile.

Stages monero + wownero .so files into android/app/src/main/jniLibs/
for all 4 Android ABIs (arm64-v8a, armeabi-v7a, x86, x86_64). Zano
libs in the bundle are ignored.

Decodes the upload keystore from secret ANDROID_KEYSTORE_BASE64,
writes android/key.properties (which build.gradle's signingConfigs
already reads), builds a universal release APK for sideload + an
AAB for Play Console. Both signed with the upload key; Play App
Signing re-signs the AAB server-side with the production key on
upload.

Required Gitea Actions secrets:
  ANDROID_KEYSTORE_BASE64
  ANDROID_KEYSTORE_PASSWORD
  ANDROID_KEY_ALIAS
  ANDROID_KEY_PASSWORD
  TROCADOR_API_KEY (already set, reused from Linux)
  TROCADOR_MONERO_API_KEY (same)
  TROCADOR_EXCHANGE_MARKUP (same)

mwebd (Litecoin MWEB privacy) is NOT built. LTC works without it,
just no MWEB feature. Add the build step + go build pipeline if we
want MWEB on Android — separate effort.

Artifacts:
  - hash-wallet-android-apk-<sha>  (single universal APK, 14-day retention)
  - hash-wallet-android-aab-<sha>  (Play Console upload, 30-day retention)
2026-05-18 20:48:44 -04:00
jwinterm 360556b8f7 Top-bar: use onSurfaceVariant for the gear icon (same fix as navbar)
Same root cause as the bottom navbar invisibility: iconColor was set to
theme.colorScheme.primary, which on the light theme is our dark forest
green (#1A5C38) and goes invisible on dark surfaces. onSurfaceVariant
is Material's de-emphasized-foreground token and has guaranteed contrast
against the surface across all our themes.
2026-05-18 14:12:36 -04:00
jwinterm 1098a1a017 Skip Lightning username onboarding + restore navbar inactive icon contrast
Two fixes:

1) lib/src/screens/seed/seed_verification/seed_verification_success_view.dart
   After verifying a BTC wallet's seed, the original flow pushed the user to
   the lightning_username_page which suggests an @cake.cash Lightning
   address. We disabled Lightning entirely (no Greenlight infra) and the
   page is meaningless without it. Collapse the conditional so the button
   always pops back to the wallet list. Restore the conditional if/when
   Hash Wallet ever runs its own Lightning backend.

2) lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart
   inactiveColor was set to theme.colorScheme.primary, which is our brand
   dark forest green (#1A5C38) post-retheme. That renders nearly invisible
   against the navbar's semi-transparent dark surface backdrop, so the
   three non-active tab icons (Wallets / Contacts / Apps) disappear and
   the user just sees three blob shapes. Material's onSurfaceVariant is
   the standard token for de-emphasized icons and is visible across our
   light/dark/black themes.
2026-05-18 13:58:25 -04:00
jwinterm 0b9c67f0e5 Drop flutter_mailer dependency from pubspec_base.yaml
The source-of-truth pubspec template — gitignored pubspec.yaml is
regenerated from this on each configure.dart run, so the dep would have
reappeared on next build. Follow-up to a8e071a05/4c09950e0.
2026-05-17 20:13:01 -04:00
jwinterm 4c09950e0b Replace broken flutter_mailer error-report send with GitHub issue launcher
flutter_mailer has no Linux implementation (throws MissingPluginException)
and on other platforms required users to have a configured mail client.
Vanishingly few error reports ever reached anyone. The 'Send' button on
the error popup was effectively a no-op.

Replaced with a url_launcher call that opens a prefilled GitHub issue at
github.com/Such-Software/hash-wallet/issues/new with the error trace
inlined into the body (truncated to ~6.5KB to stay under GitHub's URL
length cap; full log path is shown in the body for users who want to
attach it manually). Adds a 'bug,from-app' label and a short prompt
asking the user to describe what they were doing.

Downsides: people without a GitHub account will get nothing useful when
they hit 'Send' — they'll see GitHub's sign-up page. Net still better
than the silent no-op we had. Adding a real reporting endpoint
(Cloudflare Worker) is the obvious follow-up if low report volume
turns out to matter.

Also removed flutter_mailer from pubspec.yaml — was only used here.
2026-05-17 20:12:38 -04:00
jwinterm 3faa89d49d Wownero: route MoneroAccountListViewModel.selected to wownero API
The .selected computed getter always called monero!.getCurrentAccount(_wallet),
which does an internal 'wallet as MoneroWallet' cast and threw
'WowneroWallet is not a subtype of MoneroWallet' whenever the dashboard
CardsView Observer rebuilt for a Wownero wallet. The .accounts getter
above already dispatched correctly by wallet.type; .selected didn't.

Now matches the same monero/wownero dispatch pattern.
2026-05-17 20:03:07 -04:00
jwinterm f1fffddf90 Fix orphan references after shitcoin nuke (build round 2)
Stragglers that weren't in any agent's batch but referenced the removed
identifiers:

- tool/configure.dart: stripped 'backupSeeds(Box<HavenSeedStore>)'
  abstract method from generateWownero's emitted template + the
  haven_seed_store.dart import. CI regenerates lib/wownero/wownero.dart
  from this template each build, so the previous lib/wownero/wownero.dart
  cleanup got reverted on rebuild. This is the actual fix.
- lib/core/trade_monitor.dart + lib/view_model/trade_details_view_model.dart:
  removed JupiterExchangeProvider import + ExchangeProviderDescription.jupiter
  switch cases (provider + URL builder).
- lib/src/screens/dashboard/dashboard_page.dart: deleted _showHavenPopup
  helper + its call site + the haven_wallet_removal_popup import.
- lib/src/widgets/haven_wallet_removal_popup.dart: deleted (no callers).
- lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart:
  removed the zcash 'missing funds' InfoCard and the decred 'syncing'
  InfoCard widgets, plus their _dismissZcash and _rescanInternalChangeZcash
  handlers.
- lib/src/screens/settings/connection_sync_page.dart: removed the TronGrid
  history toggle row.
- lib/src/widgets/bottom_sheet/payment_confirmation_bottom_sheet.dart:
  _isTokenSelectionFlow now only checks evmNetworkSelection (was also
  branching on solana/tronTokenSelection enum values that no longer exist).

Generated .g.dart files for dashboard_view_model and connection_sync_view_model
still reference removed methods (rescanInternalChangeZcash, dismissZcash,
canUseTronGrid, setUseTronGrid). Those will be regenerated by build_runner
on next CI run and the methods will fall out — no manual fix needed.
2026-05-17 19:18:19 -04:00
jwinterm b57ab7cc06 Nuke Solana/Tron/Zano/Decred/Zcash/Haven from the codebase entirely
94 files changed, -5926 net lines. No stubs, no generators, no dead enum
values, no orphan switch branches. Removed for principled reasons (we
do not ship these chains) and to make the codebase smaller and friendlier
to contribute to.

What's gone:
- lib/{solana,tron,zano,decred,zcash,haven}/ directories
- lib/exchange/provider/jupiter_exchange_provider.dart (Solana-only)
- lib/entities/haven_seed_store.dart
- WalletType.{solana,tron,zano,decred,zcash,haven} enum values
  (HiveField IDs are pinned: Wownero stays at 12, all surviving types
  keep their IDs, so existing user-saved wallets deserialize unchanged)
- All ~70 lib/ files that imported the removed chain stubs or branched
  on the removed WalletType values
- backupSeeds(Box<HavenSeedStore>) abstract method + Wownero implementation
- Jupiter exchange branches in send/exchange view models
- TronGrid usage settings, Zano alias lookups, Zcash transparent address
  handling, Decred default-spv-nodes branches, Haven seed migration

What stays (intentional):
- CryptoCurrency.{xhv,sol,trx,dcr,zano,zec} enum entries in cw_core —
  they're still used as exchange/swap currency identifiers in
  address_validator.dart and elsewhere. The wallet types are gone but
  the *currencies* are still tradeable through Trocador.
- cw_core/spl_token.dart and cw_core/tron_token.dart Hive adapters in
  main.dart — the tokens still register as Hive types for backwards-
  compat with any old box data.
- lib/buy/{moonpay,robinhood,onramper,dfx,kryptonim,meld}/ provider
  source files (just stripped of solana/tron/etc references; providers
  themselves remain dormant per provider_types.dart).

Pinned-ID note: WalletType enum now has gaps in @HiveField IDs (4, 10,
11, 13, 14, 18 removed). This is deliberate — re-using a freed ID later
would mis-deserialize old hive boxes. Don't renumber.

Bundled config / CI hasn't changed; configure.dart was already free of
these chains in commit 4eb7db0b7.
2026-05-17 12:30:25 -04:00
jwinterm ac7830e181 Add CONTRIBUTING.md; fix README prep-script ref
CONTRIBUTING.md explains the fork relationship, branch model, generated-
code workflow, and what changes we will and won't accept (no re-enabling
Solana/Tron/Zano/Decred/Zcash, no Cake-domain endpoints, no Lightning
yet, no telemetry).

README.md: removed the stale ./scripts/prepare_zcash.sh reference (file
doesn't exist) and added a link to CONTRIBUTING.

.gitignore: untrack docs/UPSTREAM_SYNC.md (internal merge-strategy
playbook, kept locally alongside docs/links.md).
2026-05-17 10:50:18 -04:00
jwinterm ef895994ae Remove Wyre buy-provider integration (shut down 2023)
Delete the WyreBuyProvider + WyreOrderProviderAdapter source files,
strip imports and call sites from buy/order view models and the
buy webview, force isBitcoinBuyEnabled = false in di.dart, and drop
the three wyreSecretKey/wyreApiKey/wyreAccountId entries from
tool/utils/secret_key.dart.

BuyProviderDescription.wyre (raw: 0) is kept as a no-op legacy entry
so any old Hive-persisted order with that raw value still deserializes
without throwing. Don't wire it back to UI/services.
2026-05-17 08:22:08 -04:00
jwinterm 4eb7db0b72 Delete cw_zano / cw_tron / cw_solana / cw_decred packages + all references
These chains were already disabled in availableWalletTypes (none of them
were getting created), but the source dirs and the codegen scaffolding
for them still lived in tree (~20K lines of dead Dart).

Surgery:
- Delete cw_decred/ cw_solana/ cw_tron/ cw_zano/ source trees
- Strip 5 generate*() function bodies from tool/configure.dart
  (generateSolana, generateTron, generateZano, generateDecred,
  generateZcash) plus their top-level imports, args, calls,
  signatures, and conditional pubspec/walletTypes injection blocks.
  configure.dart shrinks from 2134 to 1561 lines and dart analyze
  is clean.
- Strip solana/tron secrets config + output paths from
  tool/import_secrets_config.dart
- Delete scripts/{android,ios,macos}/build_decred.sh,
  scripts/ios/build_zano{,_all}.sh
- Patch scripts/{android,ios,macos}/build_all.sh,
  scripts/android/copy_monero_deps.sh, scripts/ios/setup.sh,
  scripts/ios/gen_framework.sh to drop decred/zano steps
- Patch scripts/android/docker/build.sh + Dockerfile.final to drop the
  decred Docker stage; delete scripts/android/docker/Dockerfile.decred
- Update .github/workflows/build-linux.yml comments to reflect the
  remaining cw_* module list (evm, nano, bitcoin)

Note: WalletType.{solana,tron,zano,decred,zcash} enum values still live
in cw_core/lib/wallet_type.dart and there are dead switch cases in
lib/di.dart and lib/new-ui/pages/*.dart that reference them. Those
paths are unreachable (the enum values never get assigned to any wallet)
but cleaning them up is a separate hygiene pass.
2026-05-17 08:01:29 -04:00
jwinterm 8ba790b318 Flip Cake nodes out of the default slot in node YAMLs
Cake's nodes are kept in the available list (their public infra is fine,
and users may want to opt in) but no longer the freshest-install default
for XMR, BTC, or LTC.

XMR: node.sethforprivacy.com:443 (matches newCakeWalletMoneroUri migration
target, so existing users and fresh installs converge on the same node).
BTC: electrum.blockstream.info:50002 (matches newCakeWalletBitcoinUri).
LTC: electrum-ltc.bysh.me:50002 (matches cakeWalletLitecoinElectrumUri).
2026-05-16 20:07:15 -04:00
jwinterm 9296e071f5 Strip remaining cakewallet.com endpoints + delete Monerocom assets
- Stub dashboard bulletin (was polling service-api.cakewallet.com); returns
  empty ServicesResponse until we stand up our own notice service.
- Repoint changelog 'View more info' link to hash.boats (modal trigger
  remains disabled; this is just for when we re-enable it).
- Replace exchange-helper.cakewallet.com with exchange-helper.such.software
  in moonpay/robinhood/onramper providers. Buy providers are still dormant
  (empty getAvailable*ProviderTypes); URL change is a fail-loudly placeholder
  to ensure we stand up our own proxy before re-enabling any of them.
- Delete Monerocom_Terms_of_Use.txt and Monerocom_Release_Notes.txt — these
  were Cake's Monero.com brand variant, never used by Hash Wallet. Collapse
  the isMoneroOnly branch in disclaimer_page.dart to always load
  Terms_of_Use.txt.
- Add docs/links.md (gitignored) inventorying all public-facing URLs and
  emails shipped in the binary.
2026-05-16 19:55:53 -04:00
jwinterm 9e5593011a Route error reports + tx-failed support contact to support@such.software
Cake's email was hardcoded as the recipient for the 'Send error report'
flow in ExceptionHandler and as the contact in the TransactionCommitFailed
user-facing message. Anyone tapping Send would have mailed their wallet
metadata to Cake's support team. Repointed both to support@such.software.
2026-05-16 19:41:56 -04:00
jwinterm 4506b82e30 Actually disable changelog modal (prior commit Edit raced the Read) 2026-05-16 19:05:13 -04:00
jwinterm 16c4d3b128 Hardcoded appName cake_wallet -> hash_wallet + nuke changelog modal + Wownero up top
Three semi-independent fixes flagged from a user-facing testing pass:

1. cw_core/lib/root_dir.dart had a hardcoded 'cake_wallet' for the
   Linux app data dir, bypassing the binary name entirely. That's why
   ~/.config/cake_wallet/ kept being created even after the project
   rename. Changed appName const to hash_wallet. Also:
   - CAKE_WALLET_DIR env-var override -> HASH_WALLET_DIR (with the
     old name kept as a fallback so users migrating from a Cake
     install via env-var don't lose their path).
   - linuxSymlinkSharedPreferences kept the legacy
     ['com.example.cake_wallet','cake_wallet'] paths in the migration
     array so existing Cake users get auto-migrated into hash_wallet's
     new home on first launch of the fork.

2. lib/new-ui/new_dashboard.dart: commented out the
   Future.delayed(300ms).then(_showChangelog) trigger. The changelog
   content lives under assets/new-ui/changelog/text and describes
   Cake's v6.1.0 release notes — not ours. The 'View more info' button
   inside the modal launched blog.cakewallet.com. Re-enable once we
   write our own changelog content.

3. tool/configure.dart: WalletType.wownero hoisted to the top of the
   generated availableWalletTypes list. It's the reason this fork
   exists, so it should be the first choice in create / restore
   pickers. Monero stays as #2.
2026-05-16 19:04:45 -04:00
jwinterm 33319c67c7 Land real Privacy Policy + Terms of Use (Such Software LLC, May 16 2026)
Replaces both placeholders with the legal-reviewed Hash Wallet documents
authored by the user.

Per user direction: stripped the Tor/I2P recommendation from the Privacy
Policy section 2 (network-level privacy guidance). New text recommends
running your own node and pointing the Software at it via custom node
settings — same intent, framed around the recommendation the user
actually wants to make for Hash Wallet rather than naming specific
overlay networks we don't currently integrate or document well.
2026-05-16 18:15:16 -04:00
jwinterm 27862c10ba Add ToS placeholder (forgot in prior commit due to Read race) 2026-05-16 18:07:20 -04:00
jwinterm 6e617f7a42 Welcome page polish + ToS placeholder + made_fun text fix
- res/values/strings_en.arb: made_easy value 'made easy' -> 'made fun'.
  This is what AnimatedTypingText actually feeds (line 183 of
  create_pin_welcome_page.dart), not payment_made_easy which is unused
  in this rendering path.
- assets/images/cake_logo_{light,dark}.svg replaced with mark-only
  (hash_wallet/01_mark.svg — just the # in green box, no embedded
  wordmark). Welcome screen layout already renders 'Hash Wallet' text
  next to this image; the previous wordmark-embedded SVG caused the
  duplicate 'Hash Wallet [...] Hash Wallet' you screenshot'd. Mark
  alone is theme-agnostic (green box with white # works on both light
  and dark backgrounds), so light + dark use the same file.
- assets/images/welcome_{dark,light}_theme.svg: gradient bottom stop
  faded to transparent. Eliminates the hard cutoff edge where the
  sky-rect ended and flat surface color began — the SVG now blends
  smoothly into the page background.
- assets/text/Terms_of_Use.txt: replaced 188-line Cake Labs LLC legal
  document with a Hash Wallet placeholder (same pattern as PRIVACY.md).
  Real ToS pending legal review.
2026-05-16 18:06:42 -04:00
jwinterm d03fd909ef Fix dangling 'if (!isMoneroOnly) ...[' in support_view_model.dart
Python regex strip from 6ec755ec2 removed the MoonPay + Robinhood
LinkListItem entries that lived inside an 'if (!isMoneroOnly) ...[ ]'
conditional list-spread, but left the opening '...['  dangling at
line 66 with no matching close bracket. mobx_codegen and hive_generator
both threw 'Expected to find ]' at line 67.

Remove the dead conditional. Build moves past secrets-generation +
mobx-codegen + hive-generator now.
2026-05-16 12:23:37 -04:00
jwinterm 6ec755ec2c Nuke buy providers + flip node defaults from Cake to community
Buy providers (Robinhood Connect, DFX, Onramper, MoonPay, Kryptonim, Meld):
- lib/entities/provider_types.dart: getAvailable{Buy,Sell}ProviderTypes()
  both return [] now. Each provider requires a formal partner contract
  with revenue-share — no free integrations exist. Re-add to the list
  once Such Software has registered the partner relationship per provider.
  Buy/Sell UI surfaces (cards_view.dart's onramp button -> Routes.buySellPage)
  still render but the provider list is empty, so the screen shows nothing.
- lib/view_model/support_view_model.dart: removed the third-party support
  LinkListItem entries for the dead buy providers. Kept the swap-provider
  support links (ChangeNow, SideShift, SimpleSwap, Exolix, SwapTrade,
  Trocador) — Trocador is still active and the others are useful for
  legacy users who created swaps before the trim.

Default node flip (per user request — 'someone else top choice, Cake nodes
stay in the list of others'):
- xmr-node.cakewallet.com:18081  -> node.sethforprivacy.com:443
- electrum.cakewallet.com:50002  -> electrum.blockstream.info:50002
- ltc-electrum.cakewallet.com:50002 -> electrum-ltc.bysh.me:50002
- btc-electrum.cakewallet.com:50002 -> electrum.blockstream.info:50002
Cake's nodes remain in the augmented lists (see asset/*_node_list.yml).
Silent-payments Electrs (electrs.cakewallet.com) + zcash default URI
unchanged — no good free alternative for silent payments, and zcash is
removed anyway.
2026-05-16 12:08:02 -04:00
jwinterm 04ed46aca3 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.
2026-05-16 11:54:49 -04:00
jwinterm 04203654f1 Rename Flutter project + binary: cake_wallet -> hash_wallet
The big one. Touches 760+ files. Locks in the user's decision to break
import-line compatibility with upstream cake-tech/cake_wallet in exchange
for a binary named hash_wallet on every platform.

Changes:
- pubspec_description.yaml: project name cake_wallet -> hash_wallet
- 762 Dart files: every 'package:cake_wallet/...' import rewritten to
  'package:hash_wallet/...' (lib/, cw_*/lib/, tool/, test/, integration_test/)
- linux/CMakeLists.txt: BINARY_NAME cake_wallet -> hash_wallet
- windows/CMakeLists.txt: project + BINARY_NAME (CakeWallet -> HashWallet)
- windows/runner/Runner.rc: company / file / product strings to Hash Wallet
  + Such Software LLC copyright
- macos/Runner.xcodeproj/project_base.pbxproj: cake_wallet_new.app refs
  -> hash_wallet.app (macOS output bundle name)
- com.suchsoftware.HashWallet.yml (Flatpak): all binary path refs
  cake_wallet -> hash_wallet (e.g. /app/hash_wallet/hash_wallet)
- linux/com.suchsoftware.HashWallet.desktop: Exec=hash_wallet
- scripts/android/copy_monero_deps.sh: CW_DIR target path
- configure_hash_wallet.sh: error message typo (old filename)

INTENTIONALLY UNCHANGED:
- cw_* subpackage names (cw_core, cw_bitcoin, cw_wownero, etc.) — they
  remain as the historical 'cake wallet' naming; renaming them would
  cascade through every sub-package's internal structure
- Method channel name 'com.cake_wallet/native_utils' in iOS/macOS/Android
  AppDelegates and MainActivity — it's a string identifier that has to
  match the Dart side exactly. Renaming requires both-sides change; it's
  internal-only and not user-visible.
- ghcr.io/cake-tech/cake_wallet:debian13-... docker image references in
  build scripts — that's Cake Labs' published image we use as the build
  environment, not ours.

User data directory now follows the new binary name:
  ~/.local/share/hash_wallet/  (was ~/.local/share/cake_wallet/)
  ~/.config/hash_wallet/       (was ~/.config/cake_wallet/)
Existing users on the old name will need migration if any exist.
2026-05-16 11:33:25 -04:00
jwinterm 2216320b35 Linux APPLICATION_ID: com.example.cake_wallet -> com.suchsoftware.hashwallet
GTK app identifier missed in last commit (Edit failed because Read wasn't
run first; the rest of the welcome-screen batch landed cleanly). Now the
Linux GDBus name + dock entry uses our own reverse-DNS, not the default
'com.example.*' GTK template value.
2026-05-16 11:16:07 -04:00
jwinterm 7a65bdae0b Welcome screen overhaul + APPLICATION_ID fix
- assets/images/cake_logo_{light,dark}.svg replaced with the Hash Wallet
  horizontal lockup variants (03_lockup_horizontal.svg + ..._dark.svg).
  Welcome screen now shows our wordmark instead of the Cake mark.

- assets/images/welcome_dark_theme.svg rewritten as a cyberpunk starry
  night: deep green gradient sky, mint/pink/blue nebula glows, sharp
  4-point stars, and a subtle '#'-shaped constellation made of dots
  connected by mint lines — keeps the night-sky feel but in our palette
  and ties back to the brand mark.

- assets/images/welcome_light_theme.svg rewritten as a sunny morning:
  minty sky gradient, warm yellow sun, soft pink lower-left halo, white
  clouds, plus subtle brand-green sparkles for continuity with the dark
  variant.

- linux/CMakeLists.txt: APPLICATION_ID changed from the default
  com.example.cake_wallet to com.suchsoftware.hashwallet. (BINARY_NAME
  stays cake_wallet — renaming it requires touching every
  package:cake_wallet/... import in the codebase; explicitly deferred.)

- res/values/strings_en.arb: 'payment_made_easy' string changed from
  'Payments made easy' to 'Payments · Privacy · Security · made fun'.
2026-05-16 11:15:43 -04:00