Environment: Vault v1.4.10, KeepKey firmware v7.14.1, macOS
Summary
When a paired app requests POST /eth/sign-typed-data, Vault shows an excellent
clear-signing dialog: decoded EIP-712 fields, "Known Pattern" badge, requesting-app
attribution. But clicking Approve immediately dismisses the dialog — and then
the device asks the user to confirm two hash digests ("TYPED DATA DOMAIN — confirm
hash digest" and "TYPED DATA MESSAGE — confirm hash digest").
At the exact moment the user is asked to verify those digests, the host screen shows
nothing to verify them against. The device confirmation degrades into a blind
"press OK to continue," which defeats the purpose of the firmware displaying digests
at all.
Steps to reproduce
- Pair any app via
/auth/pair.
- Send an
eth_signTypedData request for any typed struct.
- Vault shows the decoded clear-signing dialog → click Approve.
- Dialog closes. Device now shows the domain digest and message digest and asks
for confirmation.
- There is no longer anything on the host screen to compare the digests with.
Why this matters
The firmware's typed-data path (EthereumSignTypedHash) has the host compute
domainSeparator and hashStruct and the device sign the EIP-712 digest. The
device screens exist so a user (or an auditor) can check that what the device is
about to sign corresponds to the request they reviewed. That check requires the
reference values to be visible during the device-confirm phase — which is
precisely when Vault currently hides them.
(During development of a pendant-display dapp we recomputed the digests
independently and confirmed they match what the device shows — the comparison is
entirely feasible; the UI just doesn't support it.)
Expected behavior
- On Approve, the dialog should not unmount. It should transition to a
"Waiting for device confirmation…" state with all decoded fields still
visible.
- That state should additionally display the two host-computed digests, labeled
to match the device's wording:
- TYPED DATA DOMAIN —
<domainSeparator hex>
- TYPED DATA MESSAGE —
<hashStruct(primaryType, message) hex>
so the user can compare character-for-character with the device screen.
- The dialog dismisses only when the device confirms or rejects (or the request
times out), and shows the outcome.
Notes
- Both digests are already computed host-side to build the
EthereumSignTypedHash message, so this is purely a presentation change — no
protocol or firmware work.
- Same applies to the address-verification step (
VERIFY ADDRESS screen): keep
the expected address visible on the host while the device shows it.
- Nice-to-have: a copy button on each digest for out-of-band verification.
Environment: Vault v1.4.10, KeepKey firmware v7.14.1, macOS
Summary
When a paired app requests
POST /eth/sign-typed-data, Vault shows an excellentclear-signing dialog: decoded EIP-712 fields, "Known Pattern" badge, requesting-app
attribution. But clicking Approve immediately dismisses the dialog — and then
the device asks the user to confirm two hash digests ("TYPED DATA DOMAIN — confirm
hash digest" and "TYPED DATA MESSAGE — confirm hash digest").
At the exact moment the user is asked to verify those digests, the host screen shows
nothing to verify them against. The device confirmation degrades into a blind
"press OK to continue," which defeats the purpose of the firmware displaying digests
at all.
Steps to reproduce
/auth/pair.eth_signTypedDatarequest for any typed struct.for confirmation.
Why this matters
The firmware's typed-data path (
EthereumSignTypedHash) has the host computedomainSeparatorandhashStructand the device sign the EIP-712 digest. Thedevice screens exist so a user (or an auditor) can check that what the device is
about to sign corresponds to the request they reviewed. That check requires the
reference values to be visible during the device-confirm phase — which is
precisely when Vault currently hides them.
(During development of a pendant-display dapp we recomputed the digests
independently and confirmed they match what the device shows — the comparison is
entirely feasible; the UI just doesn't support it.)
Expected behavior
"Waiting for device confirmation…" state with all decoded fields still
visible.
to match the device's wording:
<domainSeparator hex><hashStruct(primaryType, message) hex>so the user can compare character-for-character with the device screen.
times out), and shows the outcome.
Notes
EthereumSignTypedHashmessage, so this is purely a presentation change — noprotocol or firmware work.
VERIFY ADDRESSscreen): keepthe expected address visible on the host while the device shows it.