Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
be3ba04
Fix settings scroll (#93)
joshuakrueger-dfx May 7, 2026
ecc44fe
Rich TX rows: counterparty, fiat estimate, Send/Receive types (#95)
joshuakrueger-dfx May 7, 2026
911a5e8
fix: stop balance value row from jumping when hide-toggled (#96)
joshuakrueger-dfx May 7, 2026
8f56630
fix: push portfolio asset cards further down for mountain bg headroom…
joshuakrueger-dfx May 7, 2026
5799ed4
Bitcoin Mainnet network + always-on BTC + auth gate on reload (#98)
joshuakrueger-dfx May 7, 2026
f719f9a
feat: send/receive bank entry, auth gate, asset border on click only …
joshuakrueger-dfx May 7, 2026
4da6497
feat: integrate Bitcoin mainnet (wdk-wallet-btc) for native on-chain …
joshuakrueger-dfx May 7, 2026
7f2a5b1
Redesign Buy and Sell: asset tiles, full quote breakdown, USDT/USDC s…
joshuakrueger-dfx May 7, 2026
66014ff
feat: BTC variants everywhere, sell-balance filter, KYC 51 mock, auth…
joshuakrueger-dfx May 7, 2026
968412c
chore: clean up lint warnings and deduplicate format helpers (#104)
joshuakrueger-dfx May 7, 2026
1cae2d9
chore: drop all local mocks now that the live wallet is wired up (#105)
joshuakrueger-dfx May 7, 2026
66410ad
Increase timeouts and snapshot tolerance for CI runners (#99)
TaprootFreak May 7, 2026
0ba1fec
feat: Multi-Sig setup wizard, manage hub, settings entry (#106)
joshuakrueger-dfx May 7, 2026
bd9140a
Increase test and workflow timeouts for CI (#109)
TaprootFreak May 7, 2026
b77bb62
feat: sync settings to DFX profile, email verify screen, wallets mana…
joshuakrueger-dfx May 7, 2026
59f2d65
fix: align DFX API client with @dfx.swiss/react contract (#110)
joshuakrueger-dfx May 7, 2026
4f86eaa
feat: balance source coordinator with direct EVM JSON-RPC fetcher (#107)
Danswar May 7, 2026
af7476e
Increase WDK restoreWallet timeout in PIN unlock test (#112)
TaprootFreak May 7, 2026
277a02e
feat: Buy/Sell flow — auth gate, DFX integration fixes, LDS Lightning…
joshuakrueger-dfx May 7, 2026
b544140
fix: send-flow asset/decimal handling, balance refresh after send, an…
Danswar May 7, 2026
352a6c9
feat: show network fee in send confirm step (#117)
Danswar May 7, 2026
05b46b9
Merge PIN unlock tests into single test suite (#115)
TaprootFreak May 8, 2026
c4b1fe4
feat: instant buy/sell quote + auto-link all chains (#118)
joshuakrueger-dfx May 8, 2026
466c6d1
feat: realunit-aligned settings + audit hardening + buy/sell quote ca…
joshuakrueger-dfx May 8, 2026
799dfdb
fix: support ticket submit — send required type+name fields (#120)
joshuakrueger-dfx May 8, 2026
a4f7cd3
feat: linked-wallet portfolio + buy/sell target override + pricing on…
joshuakrueger-dfx May 11, 2026
a20b087
fix: silence WDK useMultiAddressLoader noise toast on dashboard (#132)
joshuakrueger-dfx May 11, 2026
7aec08f
fix: linked wallets visible by default + native EVM balances + buy pa…
joshuakrueger-dfx May 11, 2026
f92114d
feat: on-chain wallet discovery + TX feed + cross-device buy via /use…
joshuakrueger-dfx May 11, 2026
95561a7
feat: Face ID setting toggle + more Base tokens + visible reauth erro…
joshuakrueger-dfx May 11, 2026
214e325
fix: wallet-detail (fresh prices, no zero rows, BTC TXs, Face ID) + B…
joshuakrueger-dfx May 11, 2026
0fb02bb
fix: improve onboarding wallet setup flow (#139)
joshuakrueger-dfx May 11, 2026
4a54dfc
style: polish wallet screens (#140)
joshuakrueger-dfx May 11, 2026
7c472bc
Hide empty header action slot (#141)
joshuakrueger-dfx May 12, 2026
c904e78
feat: start kyc from user data (#142)
joshuakrueger-dfx May 12, 2026
2c2a628
Fix RealUnit-style KYC email registration (#143)
joshuakrueger-dfx May 13, 2026
925fb6e
Convert CLAUDE.md to CONTRIBUTING.md (#145)
TaprootFreak May 14, 2026
aa8c7f0
docs: add feature matrix to README (#146)
TaprootFreak May 14, 2026
40c5d3b
docs: triage features into MVP and deferred buckets
TaprootFreak May 14, 2026
5349ca2
ci: run Android emulator natively as arm64-v8a on macos-latest (#148)
TaprootFreak May 14, 2026
e845d29
feat(features): add build-time feature flag infrastructure (Pay PoC)
TaprootFreak May 14, 2026
711a383
feat(features): gate multi-sig behind EXPO_PUBLIC_ENABLE_MULTISIG
TaprootFreak May 14, 2026
0db3717
feat(features): gate tax report behind EXPO_PUBLIC_ENABLE_TAX_REPORT
TaprootFreak May 14, 2026
9633a07
feat(features): gate legal screens behind EXPO_PUBLIC_ENABLE_LEGAL
TaprootFreak May 14, 2026
741804d
feat(features): gate deep-link handler behind EXPO_PUBLIC_ENABLE_DEEP…
TaprootFreak May 14, 2026
b4beb48
feat(features): gate restore-wallet + verify-seed behind EXPO_PUBLIC_…
TaprootFreak May 14, 2026
c9bdcaa
feat(features): gate passkey flow behind EXPO_PUBLIC_ENABLE_PASSKEY
TaprootFreak May 14, 2026
41976cf
feat(features): gate in-app WebView behind EXPO_PUBLIC_ENABLE_WEBVIEW
TaprootFreak May 14, 2026
72e0d20
feat(features): gate biometric service behind EXPO_PUBLIC_ENABLE_BIOM…
TaprootFreak May 14, 2026
9cb8403
chore: remove accidentally committed test artifacts
TaprootFreak May 14, 2026
e7fac11
feat(features): gate hardware-wallet stack behind EXPO_PUBLIC_ENABLE_…
TaprootFreak May 14, 2026
c813d9e
feat(features): gate transaction history behind EXPO_PUBLIC_ENABLE_TX…
TaprootFreak May 14, 2026
c65e10e
feat(features): gate buy + sell behind EXPO_PUBLIC_ENABLE_BUY_SELL
TaprootFreak May 14, 2026
c38c252
feat(features): gate portfolio + linked wallets behind their flags
TaprootFreak May 14, 2026
95c01e0
feat(features): gate Settings hub + seed-export behind EXPO_PUBLIC_EN…
TaprootFreak May 14, 2026
e9ecdcf
feat(features): gate the DFX backend behind EXPO_PUBLIC_ENABLE_DFX_BA…
TaprootFreak May 14, 2026
f5db3f2
feat(features): gate PIN setup + unlock behind EXPO_PUBLIC_ENABLE_PIN
TaprootFreak May 14, 2026
7500a54
docs+feat(receive): finish the deferred-feature pass
TaprootFreak May 14, 2026
2d8013c
fix(pin): correct asset paths after move into src/features/pin/
TaprootFreak May 14, 2026
8a8f646
docs: document the 17 feature flags in .env.example, narrow the DCE c…
TaprootFreak May 14, 2026
5a0df64
ci: add MVP / full bundle-build matrix to catch flag-related regressions
TaprootFreak May 14, 2026
1ae25f6
test: add tests for useSendFlow + portfolio-presentation helpers
TaprootFreak May 14, 2026
7b1c8b0
test(portfolio): cover useTotalPortfolioFiatLocal, the MVP dashboard …
TaprootFreak May 14, 2026
112e572
test(receive): add 4 component tests + fix CH-locale flakiness on CI
TaprootFreak May 14, 2026
10b1bdd
test(send): add 4 component tests for the Send screen
TaprootFreak May 14, 2026
1827663
test(dashboard): add 8 component tests for the MVP dashboard screen
TaprootFreak May 14, 2026
0e89438
test: cover pin / storage / safe-url / platform helpers and feature w…
TaprootFreak May 14, 2026
bbe4d25
test: cover chains / tokens config + OfflineBanner + ErrorBoundary
TaprootFreak May 14, 2026
be96036
test: add evm-fetcher integration tests + shortcut / header components
TaprootFreak May 14, 2026
5f7bdb5
test: cover Welcome + CreateWallet onboarding screens
TaprootFreak May 14, 2026
c652874
test: cover every *Disabled stub redirect target
TaprootFreak May 14, 2026
5f1f45a
test: cover OnboardingStepIndicator + DfxBackgroundScreen
TaprootFreak May 14, 2026
74ffb03
ci: stop running visual regression on every PR push (#149)
TaprootFreak May 14, 2026
5da7e5d
test: cover useBalances coordinator + useRefreshBalances + initial ro…
TaprootFreak May 14, 2026
feb6ee1
test: cover all 5 expo-router layouts + the two balance source hooks
TaprootFreak May 14, 2026
c02560e
fix(test): name the Stack.Screen mock so react/display-name passes on CI
TaprootFreak May 14, 2026
a4f7d04
test: cover Icon + QrCode + QrScanner + ScreenContainer (final MVP-ac…
TaprootFreak May 14, 2026
4ec49b1
test: cover the Root layout — final MVP-active screen
TaprootFreak May 14, 2026
04dbe6e
test(mvp): raise coverage to 90.28% stmt / 80.19% branch
TaprootFreak May 14, 2026
bd6b903
test(mvp): raise MVP coverage further (stmt 91.68% / branch 81.29%)
TaprootFreak May 14, 2026
2ffdab2
test(send): add back-nav + success-step + QR-strip tests (19 total, +4)
TaprootFreak May 14, 2026
de7af4f
test(mvp): more coverage — receive back/copy, safe-url owned-host edges
TaprootFreak May 14, 2026
63d8539
test(mvp): cover coingecko-coins-list edges + blockscout error paths
TaprootFreak May 14, 2026
feaa375
test(mvp): cover etherscan abort + non-error throws + simple-price ma…
TaprootFreak May 14, 2026
06001ce
test(dashboard): cover formatter branches + currency fallback + eye t…
TaprootFreak May 14, 2026
a35cbe8
test(evm-balances): cover queryFn body (ok / error / missing entry); …
TaprootFreak May 14, 2026
f00d1c7
test(mvp): push every active MVP service + screen to 100% lines
TaprootFreak May 14, 2026
1a8ff3a
test(mvp): close remaining MVP coverage gaps — 100% lines across the …
TaprootFreak May 14, 2026
5c66fc1
test(send): drop unused getByPlaceholderText destructure in error-mes…
TaprootFreak May 14, 2026
5d8e05c
test(mvp): close every remaining coverage gap to 100% lines / stmts /…
TaprootFreak May 14, 2026
7632e5f
test: MVP E2E coverage + Android KVM runner + feature-gated test spli…
TaprootFreak May 15, 2026
b62468b
test: deepen MVP E2E coverage for Receive + Send flows (#152)
TaprootFreak May 15, 2026
027e5a4
docs: update maestro guide + add visual-regression guide (#154)
TaprootFreak May 16, 2026
cf18362
chore(ci)(deps): bump mikepenz/release-changelog-builder-action (#124)
dependabot[bot] May 16, 2026
ce61948
chore(deps)(deps): bump bare-crypto from 1.13.0 to 1.13.7 (#129)
dependabot[bot] May 16, 2026
594e47a
chore(deps)(deps): bump react-native-quick-crypto from 1.1.1 to 1.1.3…
dependabot[bot] May 16, 2026
e4e3472
docs: add user handbook (DE) backed by visual-regression baselines (#…
TaprootFreak May 16, 2026
4e9d3f4
ci: stabilise Maestro Android run + raise iOS/Android timeouts (#157)
TaprootFreak May 16, 2026
cd2952b
chore(deps)(deps): bump expo-localization from 17.0.8 to 55.0.14 (#130)
dependabot[bot] May 16, 2026
3d21f80
chore(deps)(deps): bump bare-tls from 2.1.6 to 3.1.4 (#127)
dependabot[bot] May 16, 2026
074e949
chore(ci)(deps): bump actions/upload-artifact from 4 to 7 (#125)
dependabot[bot] May 16, 2026
5bd9b25
chore(ci)(deps): bump webfactory/ssh-agent from 0.9.0 to 0.10.0 (#122)
dependabot[bot] May 16, 2026
e05cb89
chore(ci)(deps): bump softprops/action-gh-release from 2 to 3 (#121)
dependabot[bot] May 16, 2026
3f21578
chore(ci)(deps): bump actions/download-artifact from 4 to 8 (#123)
dependabot[bot] May 16, 2026
eecc828
chore(deps)(deps): bump bare-node-runtime from 1.1.4 to 1.3.1 (#128)
dependabot[bot] May 16, 2026
1fb83c5
chore(deps)(deps): bump expo-status-bar from 3.0.9 to 55.0.6 (#160)
dependabot[bot] May 19, 2026
db42a10
chore(ci)(deps): bump github/codeql-action from 4.35.3 to 4.35.5 (#161)
dependabot[bot] May 19, 2026
2396553
chore(ci)(deps): bump mikepenz/release-changelog-builder-action (#162)
dependabot[bot] May 19, 2026
2114995
chore(ci)(deps): bump actions/checkout from 4 to 6 (#164)
dependabot[bot] May 19, 2026
9cadfec
chore(deps)(deps): bump react-dom from 19.1.0 to 19.2.6 (#163)
dependabot[bot] May 19, 2026
893ee64
chore(deps)(deps): bump react-native-gesture-handler (#165)
dependabot[bot] May 19, 2026
96e5784
chore(deps)(deps): bump react-native-quick-crypto from 1.1.3 to 1.1.4…
dependabot[bot] May 19, 2026
703e197
chore(deps-dev)(deps-dev): bump @typescript-eslint/parser (#167)
dependabot[bot] May 19, 2026
fcc7d8f
ci: enforce test gates — coverage floor, feature matrix, supply chain…
joshuakrueger-dfx Jun 19, 2026
a5c1d14
fix(hardware-wallet): WASM-Bridge-Timer bei Antwort und destroy clear…
TaprootFreak Jun 19, 2026
3199a5e
fix(e2e): green the authenticated visual-regression suite (#189) (#190)
Danswar Jun 21, 2026
ffaec04
ci(visual-regression): quarantine the never-green full variant (#198)
joshuakrueger-dfx Jul 2, 2026
c25f63b
ci(dependabot): stop emitting double-scope PR titles (#197)
joshuakrueger-dfx Jul 2, 2026
a78a9be
chore(security): override tmp to >=0.2.6 to clear path-traversal advi…
joshuakrueger-dfx Jul 11, 2026
5104066
chore: pin Node 22 via .nvmrc + add strict jest script (#182)
joshuakrueger-dfx Jul 11, 2026
4973f4c
fix: tax-report userAddress + legal-docs in-app webview (scoped from …
joshuakrueger-dfx Jul 11, 2026
f13ab70
test(buy): cover payment-service/useBuyFlow/passkey + fix buy-confirm…
joshuakrueger-dfx Jul 11, 2026
d40d157
fix(security): harden PIN hashing and API URL handling (#155)
joshuakrueger-dfx Jul 11, 2026
8fc36c9
chore(deps): bump react-native-nitro-modules from 0.35.6 to 0.36.1 (#…
dependabot[bot] Jul 11, 2026
60378b2
chore(deps): bump i18next from 26.0.8 to 26.3.4 (#201)
dependabot[bot] Jul 11, 2026
f8a3121
chore(deps)(deps): bump react-dom from 19.2.6 to 19.2.7 (#194)
dependabot[bot] Jul 11, 2026
ec679c7
chore(ci)(deps): bump actions/checkout from 6 to 7 (#192)
dependabot[bot] Jul 11, 2026
1a9930c
chore(ci): bump mikepenz/release-changelog-builder-action from 6.2.2 …
dependabot[bot] Jul 12, 2026
1c9cc5b
chore(ci)(deps): bump github/codeql-action from 4.35.5 to 4.36.2 (#184)
dependabot[bot] Jul 12, 2026
b838599
chore(ci)(deps): bump actions/setup-node from 4 to 6 (#159)
dependabot[bot] Jul 12, 2026
f8d5b16
chore(deps-dev)(deps-dev): bump @eslint/compat from 2.0.5 to 2.1.0 (#…
dependabot[bot] Jul 12, 2026
07fcaaa
chore(ci)(deps): bump expo/expo-github-action from 8 to 9 (#185)
dependabot[bot] Jul 12, 2026
06b1367
chore(deps): bump bare-pipe from 4.1.2 to 4.2.2 (#196)
dependabot[bot] Jul 12, 2026
4b43ea0
feat: route Pay QR scans into the OpenCryptoPay flow (#138)
joshuakrueger-dfx Jul 12, 2026
b1beab6
feat(theme): add brand-navy dark theme with cinematic backdrop and to…
joshuakrueger-dfx Jul 12, 2026
2e31b7c
chore(ci): bump actions/setup-java from 5.2.0 to 5.5.0 (#206)
dependabot[bot] Jul 16, 2026
1737483
chore(ci): bump reactivecircus/android-emulator-runner (#208)
dependabot[bot] Jul 16, 2026
47c3662
chore(deps): bump react-native-quick-crypto from 1.1.4 to 1.1.6 (#207)
dependabot[bot] Jul 16, 2026
d3dc35a
chore(deps): bump bare-net from 2.2.0 to 2.3.2 (#209)
dependabot[bot] Jul 16, 2026
13bdd50
chore(deps): bump react-native-safe-area-context from 5.6.2 to 5.8.0 …
dependabot[bot] Jul 16, 2026
0bd9459
chore(deps-dev): bump @typescript-eslint/parser from 8.59.3 to 8.64.0…
dependabot[bot] Jul 21, 2026
4e4cff7
chore(deps): bump axios from 1.16.0 to 1.18.1 (#219)
dependabot[bot] Jul 21, 2026
3b4fb44
chore(deps): resolve high+ audit advisories via scoped overrides (#224)
joshuakrueger-dfx Jul 21, 2026
a34d430
chore(deps): bump protobufjs from 7.6.3 to 7.6.5 (#220)
dependabot[bot] Jul 21, 2026
e27fa55
chore(ci): bump actions/setup-node from 6 to 7 (#214)
dependabot[bot] Jul 21, 2026
735fe67
chore(ci): bump actions/setup-java from 5.5.0 to 5.6.0 (#212)
dependabot[bot] Jul 21, 2026
7b8b3bc
chore(ci): bump github/codeql-action to 4.37.1 (#213)
dependabot[bot] Jul 21, 2026
08833a3
ci(01a0397f): stop uploading Detox/Maestro dumps to Actions storage (…
TaprootFreakAI Aug 26, 2026
61b1a8b
ci: reclaim every artifact on workflow push (#254)
TaprootFreakAI Aug 26, 2026
958ea34
fix(deps): pin react to match react-native's peer requirement (#247)
joshuakrueger-dfx Aug 28, 2026
fb471e7
fix(theme): raw hex colors, i18n key sort, feature-flag isolation (#245)
joshuakrueger-dfx Aug 28, 2026
7b477fb
test(portfolio): full coverage for hooks and screens (#248)
joshuakrueger-dfx Aug 28, 2026
8a3e299
test(settings): full coverage for Settings and Seed Export screens (#…
joshuakrueger-dfx Aug 28, 2026
abb4e27
test(multi-sig): full coverage for store and screens (#250)
joshuakrueger-dfx Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .coverage-floor-lines
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
99
32 changes: 32 additions & 0 deletions .coverage-floors.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"_comment": [
"Per-file MINIMUM line coverage for Tier-A files: key derivation, wallet",
"seed/setup, signing, authentication, secure storage, biometric and the",
"hardware-wallet bridge and its BLE/USB transports. Enforced by",
"scripts/check-coverage-file-floors.mjs",
"(see ci.yml job `coverage-floor`).",
"",
"Why this exists on top of .coverage-floor-lines: the aggregate floor lets",
"a single security-critical file rot to 0% as long as the mean stays high.",
"These files are the ones where a regression loses funds or leaks keys, so",
"they are pinned individually at 100. Lowering any entry is a deliberate,",
"reviewable act — do not weaken a number to make a red build pass."
],
"files": {
"src/features/passkey/services/key-derivation.ts": 100,
"src/features/passkey/services/setup-wallet.ts": 100,
"src/features/passkey/services/passkey-service.ts": 100,
"src/features/dfx-backend/services/auth-service.ts": 100,
"src/features/dfx-backend/services/jwt.ts": 100,
"src/features/dfx-backend/services/kyc-service.ts": 100,
"src/features/biometric/biometric.ts": 100,
"src/features/hardware-wallet/services/bitbox.ts": 100,
"src/features/hardware-wallet/services/transport-ble.ts": 100,
"src/features/hardware-wallet/services/transport-usb.ts": 100,
"src/services/wallet/seed.ts": 100,
"src/services/pin.ts": 100,
"src/services/storage.ts": 100,
"src/services/evm/signature.ts": 100,
"src/services/evm/address.ts": 100
}
}
17 changes: 17 additions & 0 deletions .detoxrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,29 @@ module.exports = {
args: {
$0: 'jest',
config: 'e2e/jest.config.js',
// The app (WDK worklet thread + balance/pricing timers) keeps the Node
// event loop alive, so jest can hang after the suite passes instead of
// exiting — intermittently on CI, which then burns the whole job to the
// timeout. Force-exit once the run (and teardown) is done.
forceExit: true,
},
jest: {
setupTimeout: 120_000,
},
},

behavior: {
cleanup: {
// forceExit above only kills the jest child. The detox CLI parent then
// closes its ws server, but the app still running in the simulator holds
// its connection open, so the close callback never fires ("Detox server
// has been closed abruptly") and the leaked handle keeps the CLI alive
// until the CI job timeout. Shutting the device down drops the
// connection so the CLI can actually exit after a passing run.
shutdownDevice: true,
},
},

apps: {
'ios.debug': {
type: 'ios.app',
Expand Down
88 changes: 88 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,92 @@
# =============================================================================
# Feature flags
# =============================================================================
# Build-time gates for every deferred (non-MVP) function. Each variable
# is read in `src/config/features.ts` and compared against the literal
# 'true' — Metro's dead-code elimination drops the unused branch from
# the bundle when a flag is left off. Copy the lines you need into
# `.env.local` (which is gitignored) and set them to `true` to enable
# the feature in your local build.
#
# Default for every flag is OFF. The MVP build runs with none of these
# set: Welcome → Create wallet → Dashboard → Receive / Send only.
#
# See the "Feature flags" table in README.md for what each flag gates.

# Restore wallet from 12 / 24-word seed (incl. verify-seed quiz).
EXPO_PUBLIC_ENABLE_RESTORE=

# Create / restore wallet via WebAuthn Passkey (iOS 18+ / Android 14+).
EXPO_PUBLIC_ENABLE_PASSKEY=

# Legal disclaimer step in onboarding + Settings → Legal-documents launcher.
EXPO_PUBLIC_ENABLE_LEGAL=

# PIN setup + PIN unlock + auth gate around `(auth)/*` routes.
EXPO_PUBLIC_ENABLE_PIN=

# Biometric unlock (Face ID / Touch ID / fingerprint) + Settings toggle.
EXPO_PUBLIC_ENABLE_BIOMETRIC=

# Portfolio screen (local + linked wallets), asset detail, chain manage,
# Hide-balance toggle, Dashboard portfolio pill.
EXPO_PUBLIC_ENABLE_PORTFOLIO=

# Buy (fiat on-ramp) + Sell (fiat off-ramp) flows.
EXPO_PUBLIC_ENABLE_BUY_SELL=

# Linked-wallet detail screen (per-address holdings + tx feed).
EXPO_PUBLIC_ENABLE_LINKED_WALLETS=

# Transaction history (list + detail).
EXPO_PUBLIC_ENABLE_TX_HISTORY=

# Pay (QR scan). Currently a placeholder that returns a coming-soon alert.
EXPO_PUBLIC_ENABLE_PAY=

# DFX backend integration: silent sign-in, e-mail login, auto-link,
# linked-wallets management, KYC, user data, support, contact channels.
# Many of the deferred features above are non-functional without this on
# (e.g. Buy/Sell, Linked wallets), so flip this first when enabling them.
EXPO_PUBLIC_ENABLE_DFX_BACKEND=

# Tax report CSV export (CoinTracking et al.).
EXPO_PUBLIC_ENABLE_TAX_REPORT=

# Settings hub + screens it owns (language, currency, seed export,
# delete wallet, screen-capture protection on the seed screen).
EXPO_PUBLIC_ENABLE_SETTINGS=

# BitBox02 hardware wallet pairing (USB + BLE + WASM bridge).
EXPO_PUBLIC_ENABLE_HARDWARE_WALLET=

# Multi-sig vault setup (local cosigner list, no on-chain signing yet).
EXPO_PUBLIC_ENABLE_MULTISIG=

# `dfxwallet://` deep-link handler.
EXPO_PUBLIC_ENABLE_DEEPLINKS=

# In-app WebView (KYC iframe + payment hand-off, gated by safe-url allow-list).
EXPO_PUBLIC_ENABLE_WEBVIEW=

# =============================================================================
# Build-time configuration
# =============================================================================
# URLs / API keys / RPC overrides. Defaults are baked into
# `src/config/chains.ts` / `src/config/env.ts`, so the app runs with
# none of these set. Override only when pointing the build at a
# private RPC / custom backend.

EXPO_PUBLIC_DFX_API_URL=https://api.dfx.swiss/v1
EXPO_PUBLIC_LDS_URL=
EXPO_PUBLIC_ETHERSCAN_API_KEY=
EXPO_PUBLIC_ETH_RPC_URL=
EXPO_PUBLIC_ARBITRUM_RPC_URL=
EXPO_PUBLIC_POLYGON_RPC_URL=
EXPO_PUBLIC_BASE_RPC_URL=
EXPO_PUBLIC_PLASMA_RPC_URL=
EXPO_PUBLIC_SEPOLIA_RPC_URL=
EXPO_PUBLIC_BTC_ELECTRUM_HOST=
EXPO_PUBLIC_BTC_ELECTRUM_PORT=
EXPO_PUBLIC_WDK_INDEXER_URL=
EXPO_PUBLIC_WDK_INDEXER_API_KEY=
6 changes: 6 additions & 0 deletions .env.testnet
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ EXPO_PUBLIC_DFX_API_URL=https://api.dfx.swiss/v1
# TODO(testnet): replace with the real WDK testnet indexer once provisioned.
EXPO_PUBLIC_WDK_INDEXER_URL=https://wdk-api.tether.io

# Minimal WDK chain set for E2E. WDK inits every configured chain on first
# wallet setup; the full set blows past the visual-regression onboard timeout
# on a fresh CI simulator. The authenticated screens only need a wallet to
# exist, so init just one EVM testnet + bitcoin. Unset = all chains (prod).
EXPO_PUBLIC_WDK_CHAINS=sepolia,bitcoin

# Chain RPCs — leave blank to fall through to the public defaults baked into
# `src/config/chains.ts`. Override here if you want to point E2E at private
# testnet RPCs.
Expand Down
43 changes: 43 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Code owners for security-critical paths.
#
# Effective only once the develop/main rulesets enable
# "require review from Code Owners" — see docs/security/roadmap.md (P0.6).
# Until then this file still routes review requests automatically.
#
# Rationale (docs/security/roadmap.md, "Reviews"): any PR touching key
# handling, signing, secure storage, the DFX backend client, dependency
# manifests or CI itself needs a security-conscious review — enforced
# here instead of by convention.

# Key handling & signing
/src/services/wallet/ @Danswar @davidleomay @TaprootFreak
/src/services/security/ @Danswar @davidleomay @TaprootFreak
/src/services/evm/ @Danswar @davidleomay @TaprootFreak
/src/services/storage.ts @Danswar @davidleomay @TaprootFreak
/src/services/pin.ts @Danswar @davidleomay @TaprootFreak
/src/features/hardware-wallet/ @Danswar @davidleomay @TaprootFreak
/src/features/passkey/ @Danswar @davidleomay @TaprootFreak
/src/features/biometric/ @Danswar @davidleomay @TaprootFreak
/src/features/pin/ @Danswar @davidleomay @TaprootFreak

# Feature flags decide which security features are live
/src/config/features.ts @Danswar @davidleomay @TaprootFreak

# Security-critical screens (seed export, PIN entry, onboarding/key creation)
/app/(auth)/seed-export.tsx @Danswar @davidleomay @TaprootFreak
/app/(pin)/ @Danswar @davidleomay @TaprootFreak
/app/(onboarding)/ @Danswar @davidleomay @TaprootFreak

# Backend trust boundary
/src/features/dfx-backend/ @Danswar @davidleomay @TaprootFreak

# Supply chain & build integrity
/package.json @Danswar @davidleomay @TaprootFreak
/package-lock.json @Danswar @davidleomay @TaprootFreak
/plugins/ @Danswar @davidleomay @TaprootFreak

# CI and the gates themselves (a gate nobody guards is not a gate)
/.github/ @Danswar @davidleomay @TaprootFreak
/scripts/ @Danswar @davidleomay @TaprootFreak
/.coverage-floor-lines @Danswar @davidleomay @TaprootFreak
/.coverage-floors.json @Danswar @davidleomay @TaprootFreak
26 changes: 26 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
## What

<!-- One or two sentences: what does this PR change, and why? -->

## Feature matrix

<!-- The README feature matrix is the source of truth (CI enforces it). -->

- [ ] No user-facing function added/changed/removed — matrix untouched
- [ ] Matrix row(s) updated in this PR: <!-- which row(s)? -->
- [ ] New screen added → classified in `e2e/visual-coverage.json` (CI enforces it)

## Tests

- [ ] New/changed logic is covered (coverage floor must not drop — CI enforces it)
- [ ] Touched a deferred feature: its test status in the matrix is still accurate

## Security checklist (tick what applies)

- [ ] Touches key handling, signing, secure storage, or the DFX client → code-owner review requested
- [ ] No secret, seed, token, or PII is logged, persisted outside `expo-secure-store`, or sent to a third party
- [ ] New dependency added → justified here: <!-- why is it needed, why this package? -->

## How to verify

<!-- Commands or steps a reviewer can run. -->
6 changes: 4 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ updates:
open-pull-requests-limit: 5
labels:
- dependencies
# `prefix` already carries the conventional-commit scope, so `include: scope`
# must stay off — together they produce a double scope ("chore(deps)(deps): …")
# that fails the pr-policy conventional-commit gate.
commit-message:
prefix: chore(deps)
prefix-development: chore(deps-dev)
include: scope

- package-ecosystem: github-actions
directory: /
Expand All @@ -28,6 +30,6 @@ updates:
labels:
- dependencies
- github-actions
# See note above: `prefix` carries the scope; `include: scope` would double it.
commit-message:
prefix: chore(ci)
include: scope
2 changes: 1 addition & 1 deletion .github/workflows/auto-release-pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
fetch-depth: 0

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/auto-tag.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
fetch-depth: 0
fetch-tags: true

- name: Setup SSH for Deploy Key
uses: webfactory/ssh-agent@v0.9.0
uses: webfactory/ssh-agent@v0.10.0
with:
ssh-private-key: ${{ secrets.TAG_DEPLOY_KEY }}

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/beta-release-android.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
Expand All @@ -30,7 +30,7 @@ jobs:
run: npm ci

- name: Setup EAS
uses: expo/expo-github-action@v8
uses: expo/expo-github-action@v9
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/beta-release-ios.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
Expand All @@ -30,7 +30,7 @@ jobs:
run: npm ci

- name: Setup EAS
uses: expo/expo-github-action@v8
uses: expo/expo-github-action@v9
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
Expand Down
Loading
Loading