Issue Details
- Number
- 31728
- Title
- Bug: Non-Ranged Descriptors with Range [0,0] Trigger Unexpected Wallet Errors in `AddWalletDescriptor`
- Description
- **Summary:**
When attempting to add a **non-ranged** descriptor with a start/end range of `[0,0]` via `AddWalletDescriptor`, an error may appear:
```
UpdateWalletDescriptor: new range must include current range = [0,0].
```
This is unexpected for a non-ranged descriptor, as `[0,0]` should effectively mean “no range.” In some cases, changing the end to `1` (i.e. `[0,1]`) circumvents the issue, but that implies a single-index range rather than a truly non-ranged descriptor.
Further debugging revealed this seems tied to:
1. **Multiple calls** to `AddWalletDescriptor` for the same descriptor.
2. **Internal handling of descriptor ranges** (the wallet expects a valid range for ranged descriptors, but still enforces checks on `start/end` even if the descriptor is meant to be non-ranged).
3. A possible **bug in `UpdateWalletDescriptor`** when it encounters repeated or zero-width ranges.
**What was expected:**
- Specifying `[0,0]` for a non-ranged descriptor (or not specifying a range at all) should *not* fail.
- A truly non-ranged descriptor should not require these range checks.
- `AddWalletDescriptor` should be idempotent
**What actually happens:**
- Repeatedly adding a descriptor (or calling it in a way that triggers `UpdateWalletDescriptor`) with `[0,0]` can cause the wallet to complain that the “new range must include current range = [0,0]”.
**Why this matters:**
- Non-ranged descriptor workflows should be consistent and should not require a dummy range.
- The wallet code should either cleanly ignore range parameters for non-ranged descriptors or handle a `[0,0]` range gracefully.
**Proposed fix or investigation:**
- Review `AddWalletDescriptor` and `UpdateWalletDescriptor` logic to ensure zero-width (`[0,0]`) or absent ranges are handled properly for non-ranged descriptors.
- Confirm if the internal code should treat `[0,0]` as a valid non-ranged descriptor or if that scenario should simply be disallowed/ignored in favor of no range parameters at all.
- Add tests to cover repeatedly adding the same descriptor and verifying correct behavior for non-ranged descriptors.
- Change the wallet::WalletDescriptor to have `std::optional<std::pair<start,end>>` to differentiate unranged v.s. empty ranged descriptors.
This appears to be a minor bug, but it can lead to confusion and error messages when using or experimenting with non-ranged descriptors in custom wallet workflows.
- URL
-
https://github.com/bitcoin/bitcoin/issue/31728
- Closed by
-
Back to List