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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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.

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

greptile-appsBot 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

FilenameOverview
app/src/main/java/to/bitkit/repositories/TrezorRepo.ktMakes 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.ktPasses the selected network into broadcast, but does not bind that network to the signed transaction.
app/src/main/java/to/bitkit/env/Env.ktAdds the build-time Trezor Electrum override and restricts it to debug/E2E regtest operations.
app/src/main/java/to/bitkit/repositories/HwWalletRepo.ktApplies the Trezor-specific endpoint resolution to production hardware-wallet watchers and funding broadcasts.
app/build.gradle.ktsEmits TREZOR_ELECTRUM_URL into BuildConfig using the existing provider pattern.
docs/trezor-emulator.mdDocuments 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 threadapp/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.

P1Fallback 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.

P1Broadcast 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 freeto 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

@jvsena42