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
AddWalletDescriptor
for the same descriptor. - 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). - 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
andUpdateWalletDescriptor
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.