mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-17 05:41:29 +02:00
Drives the real app through real flows on a device while recording the screen,
then cuts ONE recording into both deliverables — store screenshots and
marketing video — so a listing can't drift out of sync with its own trailer.
integration_test/demo/
DemoSession adds what a passing test lacks: pacing (beat/hold/typeSlowly, so
footage is watchable rather than a strobe), timing marks reported through
binding.reportData, and seed guards. Scenarios reuse the existing 25 page
robots rather than reimplementing navigation:
core_store_set dashboard, receive, send (composed, NEVER broadcast),
wallets, security — the store screenshot set
onboarding_create welcome -> PIN -> seed -> dashboard
restore_from_seed restore -> syncing
swap_and_buy Trocador quote, stopping BEFORE creating a trade; Buy
skipped when no provider key, matching what reviewers see
tools/demo/
capture.sh orchestrates boot/record/cut/shots/reel
marks.py maps timing marks onto the recording; cuts, extracts frames,
builds manifests
reel.py branded master; reuses such_graphics video_transitions/video_qa
when ~/src/such-graphics is present, degrades cleanly when not
(this repo is public and must build without it)
build-apk.sh local APK via the CI container image
Seed safety — the demo wallet is a real wallet with real funds:
- seed comes from Vaultwarden at capture time, never the repo
- guardNoSeedOnScreen() fails the run on a visible mnemonic, catching both
the known seed and the generic shape of one (so freshly generated seeds
are caught too)
- unavoidable seed screens are wrapped in blindfold(); those spans are
excised from the video with 0.6s padding, and screenshots honour the same
padding
- marks.py refuses to build a publishable master if any clip was cut without
marks, since blindfold spans could not have been excised
Apple App Preview gets no touch indicators, captions, cards or music, and
reel.py enforces the 15-30s window rather than emitting an out-of-spec file.
Everything else keeps taps on, drawn by SurfaceFlinger via show_touches rather
than composited, so they look real.
Play sizing: the harness builds its own 1080x1920 AVD. The stock Medium Phone
AVD is 1080x2400 = 2.22:1 and Play rejects phone screenshots above 2:1.
Also gitignores android/app/upload-keystore.jks (and *.jks/*.keystore): the
Android workflow decodes ANDROID_KEYSTORE_BASE64 to exactly that path, so the
Play upload signing key was one `git add -A` away from being committed.
247 lines
5.9 KiB
Plaintext
247 lines
5.9 KiB
Plaintext
# Miscellaneous
|
|
*.class
|
|
*.log
|
|
*.pyc
|
|
*.swp
|
|
.DS_Store
|
|
.atom/
|
|
.buildlog/
|
|
.history
|
|
.svn/
|
|
.fvm/
|
|
.fvmrc
|
|
|
|
# IntelliJ related
|
|
*.iml
|
|
*.ipr
|
|
*.iws
|
|
.idea/
|
|
|
|
# The .vscode folder contains launch configuration and tasks you configure in
|
|
# VS Code which you may wish to be included in version control, so this line
|
|
# is commented out by default.
|
|
.vscode/
|
|
|
|
# Flutter/Dart/Pub related
|
|
**/doc/api/
|
|
.dart_tool/
|
|
.flutter-plugins
|
|
.packages
|
|
.pub-cache/
|
|
.pub/
|
|
/build/
|
|
.flutter-plugins-dependencies
|
|
|
|
# Android related
|
|
**/android/**/gradle-wrapper.jar
|
|
**/android/.gradle
|
|
**/android/captures/
|
|
**/android/gradlew
|
|
**/android/gradlew.bat
|
|
**/android/local.properties
|
|
**/android/**/GeneratedPluginRegistrant.java
|
|
|
|
# iOS/XCode related
|
|
**/ios/**/*.mode1v3
|
|
**/ios/**/*.mode2v3
|
|
**/ios/**/*.moved-aside
|
|
**/ios/**/*.pbxuser
|
|
**/ios/**/*.perspectivev3
|
|
**/ios/**/*sync/
|
|
**/ios/**/.sconsign.dblite
|
|
**/ios/**/.tags*
|
|
**/ios/**/.vagrant/
|
|
**/ios/**/DerivedData/
|
|
**/ios/**/Icon?
|
|
**/ios/**/Pods/
|
|
**/ios/**/.symlinks/
|
|
**/ios/**/profile
|
|
**/ios/**/xcuserdata
|
|
**/ios/.generated/
|
|
**/ios/Flutter/App.framework
|
|
**/ios/Flutter/Flutter.framework
|
|
**/ios/Flutter/Generated.xcconfig
|
|
**/ios/Flutter/app.flx
|
|
**/ios/Flutter/app.zip
|
|
**/ios/Flutter/flutter_assets/
|
|
**/ios/ServiceDefinitions.json
|
|
**/ios/Runner/GeneratedPluginRegistrant.*
|
|
**/ios/Flutter/flutter_export_environment.sh
|
|
|
|
# Exceptions to above rules.
|
|
!**/ios/**/default.mode1v3
|
|
!**/ios/**/default.mode2v3
|
|
!**/ios/**/default.pbxuser
|
|
!**/ios/**/default.perspectivev3
|
|
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
|
|
|
|
|
# External libs
|
|
monero_android/
|
|
android/app/.externalNativeBuild/
|
|
cw_monero/ios/External/
|
|
cw_monero/cw_monero/android/.externalNativeBuild/
|
|
cw_monero/cw_monero/android/.cxx/
|
|
|
|
# Generated dart files
|
|
**/*.g.dart
|
|
|
|
android/key.properties
|
|
android/app/key.jks
|
|
# The Android CI workflow decodes ANDROID_KEYSTORE_BASE64 to this exact path.
|
|
# That is the Play upload signing key — it must never be committable.
|
|
android/app/upload-keystore.jks
|
|
android/app/*.jks
|
|
android/app/*.keystore
|
|
|
|
**/tool/.secrets-prod.json
|
|
**/tool/.secrets-test.json
|
|
**/tool/.secrets-config.json
|
|
**/tool/.evm-secrets-config.json
|
|
**/tool/.ethereum-secrets-config.json
|
|
**/tool/.solana-secrets-config.json
|
|
**/tool/.nano-secrets-config.json
|
|
**/tool/.tron-secrets-config.json
|
|
**/tool/.bitcoin-secrets-config.json
|
|
**/lib/.secrets.g.dart
|
|
**/cw_evm/lib/.secrets.g.dart
|
|
**/cw_solana/lib/.secrets.g.dart
|
|
**/cw_tron/lib/.secrets.g.dart
|
|
|
|
vendor/
|
|
|
|
android/app/.cxx/**
|
|
ios/Flutter/.last_build_id
|
|
/lib/generated/**
|
|
#**#
|
|
/**/#**#
|
|
|
|
**/google-services.json
|
|
**/GoogleService-Info.plist
|
|
|
|
|
|
\#*\#
|
|
.\#*
|
|
|
|
ios/build
|
|
*.sublime-workspace
|
|
*.sublime-project
|
|
|
|
shared_external/**
|
|
cw_shared_external/ios/External/
|
|
# cw_haven/**
|
|
cw_haven/ios/External/
|
|
cw_haven/android/.externalNativeBuild/
|
|
cw_haven/android/.cxx/
|
|
cw_zano/ios/External/
|
|
lib/bitcoin/bitcoin.dart
|
|
lib/monero/monero.dart
|
|
lib/haven/haven.dart
|
|
lib/ethereum/ethereum.dart
|
|
lib/bitcoin_cash/bitcoin_cash.dart
|
|
lib/nano/nano.dart
|
|
lib/polygon/polygon.dart
|
|
lib/solana/solana.dart
|
|
lib/tron/tron.dart
|
|
lib/wownero/wownero.dart
|
|
lib/zano/zano.dart
|
|
lib/decred/decred.dart
|
|
lib/dogecoin/dogecoin.dart
|
|
lib/base/base.dart
|
|
lib/arbitrum/arbitrum.dart
|
|
lib/evm/evm.dart
|
|
lib/zcash/zcash.dart
|
|
|
|
# Hash Wallet: keep the AppIcon Contents.json committed so a fresh clone
|
|
# can run `dart run flutter_launcher_icons` without needing the directory
|
|
# scaffold first. PNGs remain build artifacts.
|
|
# ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
|
|
ios/Runner/Assets.xcassets/AppIcon.appiconset/*.png
|
|
|
|
ios/Runner/Info.plist
|
|
android/app/src/main/res/mipmap-*
|
|
android/app/src/main/res/drawable/ic_launcher.png
|
|
!android/app/src/main/res/drawable/launch_background.xml
|
|
!android/app/src/main/res/values/styles.xml
|
|
# Hash Wallet: keeping app_logo.png committed as the canonical brand master.
|
|
# Cake gitignored it because their build symlinks per-product variants into
|
|
# place via scripts/*/app_icon.sh; we have a single product so no swap needed.
|
|
# assets/images/app_logo.png
|
|
assets/new-ui/**/*.svg.vec
|
|
|
|
/pubspec.yaml
|
|
/pubspec.lock
|
|
/android/app.properties
|
|
/android/app/src/main/AndroidManifest.xml
|
|
|
|
|
|
macos/Runner/Info.plist
|
|
macos/Runner/DebugProfile.entitlements
|
|
macos/Runner/Release.entitlements
|
|
macos/Runner/Runner.entitlements
|
|
lib/core/secure_storage.dart
|
|
|
|
lib/core/secure_storage.dart
|
|
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
|
|
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
|
|
macos/Runner/Configs/AppInfo.xcconfig
|
|
macos/Runner.xcodeproj/project.pbxproj
|
|
|
|
|
|
integration_test/playground.dart
|
|
|
|
# Monero.dart (Monero_C)
|
|
scripts/monero_c
|
|
# iOS generated framework bin
|
|
ios/MoneroWallet.framework/MoneroWallet
|
|
ios/WowneroWallet.framework/WowneroWallet
|
|
ios/ZanoWallet.framework/ZanoWallet
|
|
*_libwallet2_api_c.dylib
|
|
libuniffi_yttrium.so
|
|
|
|
.flatpak-builder
|
|
cake_wallet.flatpak
|
|
flatpak-build/
|
|
|
|
# macOS
|
|
**/Flutter/ephemeral/
|
|
**/Pods/
|
|
**/macos/Flutter/GeneratedPluginRegistrant.swift
|
|
**/macos/Flutter/ephemeral
|
|
**/xcuserdata/
|
|
|
|
# Windows
|
|
**/windows/flutter/ephemeral/
|
|
**/windows/flutter/generated_plugin_registrant.cc
|
|
**/windows/flutter/generated_plugin_registrant.h
|
|
**/windows/flutter/generated_plugins.cmake
|
|
|
|
# Linux
|
|
**/linux/flutter/ephemeral/
|
|
**/linux/flutter/generated_plugin_registrant.cc
|
|
**/linux/flutter/generated_plugin_registrant.h
|
|
**/linux/flutter/generated_plugins.cmake
|
|
|
|
scripts/torch_dart/
|
|
fiat-check-output.txt
|
|
scripts/zcash_lib
|
|
scripts/android/yttrium
|
|
scripts/bitbox_flutter
|
|
scripts/reown_flutter
|
|
|
|
# Hash Wallet: untracked notes / internal playbooks
|
|
docs/links.md
|
|
docs/UPSTREAM_SYNC.md
|
|
scripts/windows/setup-windows-runner.ps1
|
|
|
|
# Capture harness: local config (Vaultwarden host, demo addresses). The
|
|
# committed template is tools/demo/demo.env.example.
|
|
tools/demo/demo.env
|
|
__pycache__/
|