# Descriptor export from Sparrow and Specter (desktop)


**Draft, not yet verified on hardware.**

Sparrow 2.5.5 and Specter Desktop 2.1.11 hold the descriptor of every wallet they coordinate, including multisig wallets whose signers have no NFC. The exports below reach the SH II (stock firmware v1.4.3) through a phone running NFC Tools.

<p class="alert alert-warning">Seed words are typed on the machine only and never pass through a phone, a computer or a chat assistant. A descriptor is not a secret, but it reveals every address of the wallet.</p>

## What you need {#requirements}

- The SH II on stock firmware v1.4.3, showing "Backup Wallet", and a phone with NFC Tools ([write steps](/doc/manual/nfc-tools-transfer#write)).
- Sparrow 2.5.5 or Specter Desktop 2.1.11 with the wallet open: single-sig, or a sorted multisig (`sortedmulti`) as P2WSH, P2SH-P2WSH or P2SH ([scripts](/doc/manual/capability-sheet#scripts)).

## Export from Sparrow {#sparrow}

- Open the wallet and click **Settings** in the left column.
- Right-click the **Descriptor:** field.
- Click **Copy Output Descriptor**. The text goes to the clipboard; no dialog opens.

![Sparrow Settings tab: right-click menu on the Descriptor field with Copy Value and Copy Output Descriptor](/static/img/sparrow-14-2of3-script-policy-context-menu.png)
<!-- capture: lab/sparrow/shots/sparrow-14-2of3-script-policy-context-menu.png, Sparrow 2.5.5 (Linux build), wallet "Demo 2of3", Settings tab, right-click menu on the "Descriptor:" field: "Copy Value", "Copy Output Descriptor"; "Edit...", "Export...", "Advanced..." in view -->

### Remove `?bh=` or `?gl=` {#annotations}

- Sparrow 2.5 and later write a BIP393 annotation before the `#`: `?bh=<height>` once the wallet has a confirmed payment, `?gl=<limit>` once the gap limit was changed under **Advanced...**. In a plain-text editor on the computer, delete from `?` to the end of a one-line descriptor, checksum included; the machine engraves its own. Never retype a key character.
- In Sparrow's **Specter Desktop** file, delete from `?` up to the closing `"` of the descriptor, and keep that `"` and the `}`.

### Export a multisig setup file {#sparrow-file}

- Click **Export...** at the bottom left of **Settings**.
- In the **Coldcard Multisig** pane, click **Export File...**. **Keystone Multisig**, **Passport Multisig** and **BlueWallet Vault Multisig** write the same text.
- Click **Save**. The file is `<wallet name>-coldcard.txt`, for example `Demo 2of3-coldcard.txt`.

![Sparrow export dialog: BSMS, BlueWallet Vault Multisig, Coldcard Multisig and Electrum panes with Show... and Export File...](/static/img/sparrow-28-2of3-export-coldcard-multisig.png)
<!-- capture: lab/sparrow/shots/sparrow-28-2of3-export-coldcard-multisig.png, Sparrow 2.5.5 (Linux build), wallet "Demo 2of3", Settings > "Export...", untitled dialog with the "Coldcard Multisig" pane: "Show...", "Export File...", "Cancel" -->

| Sparrow export | "Title" on the machine | Machine reads it | Child path on the plate |
| --- | --- | --- | --- |
| **Copy Output Descriptor** | none | yes, once `?bh=` or `?gl=` is removed | `/<0;1>/*`, receive and change |
| **Coldcard Multisig** file | wallet name | yes, if all cosigners share one derivation path | none; a Coldcard refuses the plate on import |

## Export from Specter Desktop {#specter}

- Click the wallet under **Wallets** in the sidebar.
- Click the wallet's **Settings** tab, beside **Send**.
- Click **Export**.
- Click **Go to export details**. The dialog "Export Wallet" opens.
- Click **Save Wallet File**. Specter saves `<wallet name>.json`, for example `Demo 2of3.json`.
- Or click into the **Wallet JSON Data** box, select all and copy. **Copy Wallet Data** copies nothing.

![Specter Desktop Export Wallet dialog: QR code, Wallet JSON Data, Copy Wallet Data and Save Wallet File](/static/img/specter-22-2of3-export-details.png)
<!-- capture: lab/specter/shots/specter-22-2of3-export-details.png, Specter Desktop v2.1.11, "Export Wallet" dialog for "Demo 2of3": static QR with "Click to animate", "Wallet JSON Data" box starting {"label": "Demo 2of3", buttons "Copy Wallet Data" and "Save Wallet File", "Download Electrum File" -->

| Specter export | "Title" on the machine | Machine reads it | Child path on the plate |
| --- | --- | --- | --- |
| **Save Wallet File** or **Wallet JSON Data** | wallet name | yes | `/0/*`, receive only ([change addresses](/doc/manual/recovery-from-plates#troubleshooting)) |
| **Download Specter JSON file**, also named `Demo 2of3.json` | none | no, "Unknown format" | none |

## Move the text to the phone {#to-phone}

- Mac and iPhone: copy on the Mac, paste in NFC Tools (Universal Clipboard: same Apple Account, Bluetooth, Wi-Fi and Handoff on).
- File: send the `.txt` or `.json` to the phone (AirDrop, or a USB cable to Android), open it, select all and copy.
- QR code: read Sparrow's **Specter Desktop** or **BlueWallet Vault Multisig** code (**Show...**), or Specter's "Export Wallet" code before you click it, with the phone camera (unverified). Other codes in both apps are UR, BBQr or text the machine refuses. Never use Live Text on the screen: Coldcard-format text has no checksum.
- Write the text as one **Text** record ([NFC Tools](/doc/manual/nfc-tools-transfer#write)); setup text keeps its inner line breaks. "Engrave Descriptor" shows the "Title" of a titled export, and the title is not engraved.

## If it does not work {#troubleshooting}

| Symptom | Cause | Fix |
| --- | --- | --- |
| "Unknown format", Sparrow text holds `?bh=` or `?gl=` | BIP393 annotation, written after a confirmed payment or a gap-limit change | Delete it as [above](#annotations). A QR code carries it too: take the file. |
| "Unknown format", one-line descriptor | A line break or space after the text | Delete it. A setup file may end in one line break. |
| "Unknown format", Sparrow **Output Descriptor** file | The whole file: three descriptors and comment lines | Send only the line under `# Receive and change descriptor:`, without its line break, or use **Copy Output Descriptor**. |
| "Unknown format", text like `wsh(sortedmulti(2,DemoA,DemoB,DemoC))` | **Copy Value** copies the policy with keystore names | Click **Copy Output Descriptor** in the same menu. |
| "Singlesig" "Legacy (P2PKH)" for a segwit wallet | **Copy xpub** on a keystore: a bare key with no fingerprint or path | Use **Copy Output Descriptor** ([bare keys](/doc/manual/capability-sheet#formats)). |
| Nothing to paste after Specter's **Copy Wallet Data** | The button copies nothing, although "Copied wallet data" appears | Click **Save Wallet File**, or select all in **Wallet JSON Data** and copy. |
| Checksum differs between exports, or from the plate | Key order: **Copy Output Descriptor** sorts the keys, the **Specter Desktop** file keeps keystore order; the checksum covers every character | Compare the first receive address ([why](/doc/manual/multisig-and-fit#differences)). |

<!--
bench-checks:
  - [ ] Sparrow on the machine: Copy Output Descriptor (2-of-3 and Demo A; plate text identical to the export, `#j47gn95a`), Edit... text, the four setup files and the Specter Desktop file (Title "Demo 2of3") as in lab/sparrow/run/shcheck.md; refusals ("Unknown format"): Output Descriptor file whole, BSMS, Specter DIY, Electrum, Unchained Caravan Multisig, Copy Value; Unchained-style 2-of-3 fits TEXT ONLY or QR ONLY; macOS app labels match the Linux build (Settings, "Descriptor:" menu, Edit... "Edit wallet output descriptor" with "Cancel" and "OK", Export..., panes, save panel); keystore "Copy xpub" and "Copy zpub" labels on screen (not opened in lab/sparrow) and results on P2WPKH: "Legacy (P2PKH)" and "Segwit (P2WPKH)"; Taproot single-sig `tr()`: "Taproot (P2TR)"
  - [ ] Sparrow ?bh= after one confirmed testnet payment and ?gl= after a gap-limit change under Settings > "Advanced...": present in Copy Output Descriptor, the Output Descriptor file line, the Specter Desktop file and its QR; as is "Unknown format"; one-line text deleted from ? to the end accepted with the machine's checksum; Specter Desktop file deleted to the closing quote accepted with Title, deleted to the end "Unknown format"; setup file after history accepted with Title; name of 20 or more characters (Sparrow shortens it to 20); mixed-path cosigners (one Derivation: line per key) "Unknown format"
  - [ ] Specter on the machine: Save Wallet File and Wallet JSON Data (lab/specter/exports/specter-2of3-wallet-file.json, specter-demoa-wallet-file.json): Title "Demo 2of3" / "Demo A", layouts, plate text ending /0/* and #6uevghm3; refusals: Download Specter JSON file, Download Electrum File, Show <device> QR Code payloads, Address descriptor with raw keys; Address descriptor with xpubs (keys end /0/0) accepted as "2-of-3 multisig" with no warning (one address only); Save <device> file with a ColdCard signer accepted with Title, legacy P2SH (Format: BIP45) refused; Specter desktop app (Electron) on macOS, Windows, Linux: Save Wallet File and Download Specter JSON file save dialogs and names; Copy Wallet Data leaves the clipboard empty
  - [ ] computer to phone: Universal Clipboard from Sparrow and from Specter's select-all copy; iPhone and Pixel camera copy of the Sparrow Specter Desktop and BlueWallet Vault Multisig QR and the Specter "Export Wallet" QR before and after "Click to animate"; AirDrop and USB of .txt and .json, where they land, text selectable; NFC Tools keeps inner line breaks
  - [ ] restore in Sparrow (Edit... or scan button) and Coldcard import from a plate without child path and from a /0/* plate: change found; Coldcard "Invalid subderivation path - only 0/* or <0;1>/* allowed"; title shown, not engraved (from source, SYNTHESIS F11); no freeze after the checkmark on v1.4.3; capture wanted: machine screen "Engrave Descriptor" after specter-2of3-wallet-file.json ("Title" "Demo 2of3", "Type" "2-of-3 multisig", "Script" "Segwit (P2WSH)"), Go capture per research/device-screen-map.md 4.2 row 27
sources: lab/sparrow (README.md, NOTES.md, run/shcheck.md, shots 14 and 28, exports), lab/specter (README.md, NOTES.md, shot 22, exports), lab/check/RESULTS.md (firmware ea4b65b), research/desktop-wallets.md (1.3, bare-key fallback), research/BRIEF.md (annotations, trailing newline, bare xpub), research/device-screen-map.md (1.2, 1.4, 1.5, 4.2), research/hardware-signers.md (Coldcard subderivation), manuals/REVIEW-wave2.md, harvest Q18 Q19 Q20 Q26, SYNTHESIS D, F 6 9 11
-->
