Problem
After NIP-46 register_wallet completes, keep knows the signer Nostr pubkey and an opaque HMAC token but has no over-the-wire way to learn the device kind, firmware version, or master key fingerprint. Any UI that wants to display "Coldcard Mk4" instead of a raw 32-byte pubkey has to ask the user to type it.
Solution
Extend keep-nip46 to support a get_device_info method that returns structured metadata from the signer.
{
"kind": "Coldcard" | "Ledger" | "BitBox02" | "Jade" | "Trezor" | "Other",
"firmware_version": "1.2.3",
"fingerprint": "deadbeef",
"capabilities": ["miniscript", "tapminiscript", "multisig"]
}
Reference
- keep#333: parent feature (
register_wallet protocol, CLI, desktop UI)
- liana: HWI integration calls
device.device_kind() and device.get_version() for the same purpose
Scope
- NIP-46
get_device_info request/response (typed, with deny_unknown_fields and size cap)
- CLI: call after
connect(), populate new fields on DeviceRegistration (see companion issue)
- Desktop: populate the device kind input automatically if the signer responds
- Integration test stub in
keep-nip46/tests/
Non-goals
- Implementing the server side; hardware signers implement this, we are the client
- Making
get_device_info required for register_wallet to succeed (must remain best-effort)
Problem
After NIP-46
register_walletcompletes, keep knows the signer Nostr pubkey and an opaque HMAC token but has no over-the-wire way to learn the device kind, firmware version, or master key fingerprint. Any UI that wants to display "Coldcard Mk4" instead of a raw 32-byte pubkey has to ask the user to type it.Solution
Extend keep-nip46 to support a
get_device_infomethod that returns structured metadata from the signer.{ "kind": "Coldcard" | "Ledger" | "BitBox02" | "Jade" | "Trezor" | "Other", "firmware_version": "1.2.3", "fingerprint": "deadbeef", "capabilities": ["miniscript", "tapminiscript", "multisig"] }Reference
register_walletprotocol, CLI, desktop UI)device.device_kind()anddevice.get_version()for the same purposeScope
get_device_inforequest/response (typed, withdeny_unknown_fieldsand size cap)connect(), populate new fields onDeviceRegistration(see companion issue)keep-nip46/tests/Non-goals
get_device_inforequired forregister_walletto succeed (must remain best-effort)