Skip to content

chore: align trezor dev tooling with ios - #1170

Draft
jvsena42 wants to merge 2 commits into
masterfrom
chore/1008-trezor-dev-tooling
Draft

chore: align trezor dev tooling with ios#1170
jvsena42 wants to merge 2 commits into
masterfrom
chore/1008-trezor-dev-tooling

Conversation

@jvsena42

Copy link
Copy Markdown
Member

Closes #1008

This PR:

  1. Adds a TREZOR_ELECTRUM_URL build config so Trezor and hardware wallet flows can be pointed at the local regtest Electrum from bitkit-docker, matching the iOS override of the same name.
  2. Adds an Android Trezor emulator doc under docs/, replacing setup instructions that until now only existed in the bodies of feat: trezor hardware support #792 and chore: improve trezor dashboard #939.

Description

Android Trezor Bridge support landed before bitkit-docker shipped its Trezor User Env, so two pieces stayed behind while iOS builds on bitkit-docker end to end. The Bridge runtime path already worked; this closes the tooling gap that #1038 depends on.

Every Trezor Electrum lookup previously resolved to the staging regtest server unless the build was an E2E local-backend build. A plain installDevDebug used for emulator work therefore watched staging, not the local node the emulator's coins live on, so a freshly funded emulator wallet showed unrelated chain state.

TREZOR_ELECTRUM_URL follows the existing TREZOR_BRIDGE and TREZOR_BRIDGE_URL pattern: environment variable, then Gradle property, then local.properties, mirrored in .env.example. It applies only to debug and E2E builds and only on regtest, and is scoped to Trezor. The app-wide Electrum server under Settings, and the default behind it, are untouched.

The issue describes the Android watcher as resolving Electrum through Env, which holds only for the Dev Settings watcher. The production watchers and the Trezor calls behind account info, compose and broadcast read the Electrum setting instead, so the override is applied at all three points. Restarting a watcher when its server changes was already handled.

The doc covers starting the emulator helper, the three build flags and how each resolves, install commands for an emulator and a physical phone, funding the emulator wallet on regtest, and a smoke checklist. The README section and the hardware wallet journeys README now point at it.

No changelog fragment: this is dev tooling with no user-facing change.

Preview

Same paired emulator device, same app data, one rebuild apart.

QA Notes

Requires the bitkit-docker stack and ./scripts/trezor-emulator start.

Manual Tests

  • 1. Build with TREZOR_BRIDGE=true TREZOR_BRIDGE_URL=http://10.0.2.2:21325 TREZOR_ELECTRUM_URL=tcp://10.0.2.2:60001 → fresh wallet → Settings → Hardware Wallets → Add Hardware Wallet → Continue → Connect: paired screen reports the funds held on the local regtest chain.
  • 2. Home: hardware tile shows that same balance with a green indicator, and its activity is the local regtest history.
  • 3. Rebuild without TREZOR_ELECTRUM_URL, keeping the app data → relaunch → Home: the tile switches to the staging regtest balance and history, confirming the fallback.
  • 4. Rebuild with the override again → relaunch → Home: the tile returns to the local regtest state.
  • 5. regression: Settings → Advanced → Electrum Server: still the staging server in both builds, so the override stays scoped to Trezor.
  • 6. Physical phone → trezor-emulator adb and adb reverse tcp:60001 tcp:60001 → build with the 127.0.0.1 form: same result as the emulator run.

Automated Checks

  • No coverage changed. The override is a build-time constant that is empty in unit test builds, so the resolution helper is an identity function there and existing Trezor and hardware wallet tests are unaffected, matching how the E2E local-backend switch is already handled.
  • Local just compile, just test and just lint pass.
  • Verified BuildConfig.TREZOR_ELECTRUM_URL is emitted from the generated source, both set and empty.

@jvsena42 jvsena42 self-assigned this Aug 19, 2026
@greptile-apps

greptile-apps Bot commented Aug 19, 2026

Copy link
Copy Markdown

Greptile Summary

The PR adds a debug/E2E Trezor Electrum override, applies it across Trezor operations and hardware-wallet watchers, and documents the emulator workflow. The network-aware follow-up remains incomplete, and mutable screen state can also select the wrong broadcast network.

  • Adds TREZOR_ELECTRUM_URL to Gradle-generated BuildConfig and environment documentation.
  • Routes Trezor lookups, composition, broadcast, and production watchers through the override.
  • Adds Android Trezor emulator setup, funding, installation, and smoke-test instructions.

Confidence Score: 3/5

The PR is not yet safe to merge because Trezor operations and signed-transaction broadcast can still select an Electrum endpoint for the wrong network.

The reply from an unspecified author claims the earlier operation-network issue was fixed, but non-regtest operations still fall back to the app-wide regtest endpoint; additionally, changing the screen’s network after signing makes broadcast use a network that is not bound to the signed transaction.

Files Needing Attention: app/src/main/java/to/bitkit/repositories/TrezorRepo.kt, app/src/main/java/to/bitkit/ui/screens/trezor/TrezorViewModel.kt, app/src/main/java/to/bitkit/env/Env.kt

Important Files Changed

Filename Overview
app/src/main/java/to/bitkit/repositories/TrezorRepo.kt Makes Trezor operations network-aware, but non-regtest operations still fall back to a potentially regtest app-wide endpoint.
app/src/main/java/to/bitkit/ui/screens/trezor/TrezorViewModel.kt Passes the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.kt Adds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.kt Applies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.kts Emits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.md Documents emulator startup, build flags, installation, funding, and smoke checks.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Trezor operation] --> B[Operation network]
  B --> C[currentElectrumUrl]
  C --> D{Regtest override applies?}
  D -->|Yes| E[TREZOR_ELECTRUM_URL]
  D -->|No| F[SettingsStore electrumServer]
  E --> G[TrezorService]
  F --> G
  H[Signed transaction] --> I[Mutable selectedNetwork]
  I --> J[broadcastRawTx]
  J --> C
Loading

Reviews (2): Last reviewed commit: "fix: scope trezor electrum override per ..." | Re-trigger Greptile

Comment thread app/src/main/java/to/bitkit/repositories/TrezorRepo.kt Outdated
@jvsena42
jvsena42 marked this pull request as draft August 20, 2026 11:40
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jvsena42
jvsena42 marked this pull request as ready for review August 20, 2026 16:21
Comment on lines +1244 to +1248
private suspend fun currentElectrumUrl(network: BitkitCoreNetwork): String =
Env.trezorElectrumUrlOrDefault(
configured = settingsStore.data.first().electrumServer,
network = network,
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Fallback still selects wrong network

When a dev-regtest build selects Bitcoin or testnet in Trezor Dev Settings, trezorElectrumUrlOrDefault rejects the regtest override but returns the app-wide regtest Electrum setting unchanged. Account lookups, composition, and broadcast therefore use an endpoint for the wrong chain, producing unrelated state or failed operations.

Knowledge Base Used: Repositories overview (non-core domains)

val rawTx = signedStep.signedTx.serializedTx
_uiState.update { it.copy(send = it.send.copy(isBroadcasting = true)) }
trezorRepo.broadcastRawTx(serializedTx = rawTx)
trezorRepo.broadcastRawTx(serializedTx = rawTx, network = state.selectedNetwork)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Broadcast loses signed transaction network

When a user changes the network selector after composing and signing a transaction, broadcastSignedTx passes the current selectedNetwork instead of the network used to create the signed transaction. The transaction is then submitted to another network's Electrum server and broadcast is rejected.

Knowledge Base Used: UI Screens: Navigation, Screens, and Components

@jvsena42
jvsena42 marked this pull request as draft August 20, 2026 17:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: align trezor dev tooling with ios

1 participant