Summary:
When attempting to add a non-ranged descriptor with a start/end range of [0,0] via AddWalletDescriptor, an error may appear:
0UpdateWalletDescriptor: 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:
- Multiple calls to
AddWalletDescriptorfor the same descriptor. - Internal handling of descriptor ranges (the wallet expects a valid range for ranged descriptors, but still enforces checks on
start/endeven if the descriptor is meant to be non-ranged). - A possible bug in
UpdateWalletDescriptorwhen 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.
AddWalletDescriptorshould 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
AddWalletDescriptorandUpdateWalletDescriptorlogic 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.