You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
key-wallet-manager never sets Utxo::is_instantlocked = true, causing CoinSelector to reject all mempool UTXOs as unspendable — even those with InstantSend locks.
Details
The UTXO spendability check (key-wallet/src/utxo.rs)
pubfnis_spendable(&self,current_height:u32) -> bool{ifself.is_locked{returnfalse;}if !self.is_coinbase{self.is_confirmed || self.is_instantlocked// ← requires one of these}else{
current_height >= self.height + 100}}
When the wallet manager processes an InstantSend lock for a transaction, it should set is_instantlocked = true on the corresponding UTXOs, making them immediately spendable per the is_spendable() logic.
Workaround
In dash-evo-tool, we work around this by patching cloned UTXOs before passing them to CoinSelector:
// Workaround: infer spendability from block inclusionif utxo.height > 0{
utxo.is_confirmed = true;// mined in a block}else{
utxo.is_instantlocked = true;// assume IS-locked for mempool txs}
This is imprecise — it assumes all mempool transactions are IS-locked — but is the only option until the upstream properly tracks IS-lock status.
Versions affected
key-wallet 0.42.0 at 0bc6592 — both flags broken
key-wallet 0.42.0 at 2bd764f — is_confirmed fixed, is_instantlocked still broken
Summary
key-wallet-managernever setsUtxo::is_instantlocked = true, causingCoinSelectorto reject all mempool UTXOs as unspendable — even those with InstantSend locks.Details
The UTXO spendability check (
key-wallet/src/utxo.rs)What's set
0bc6592)2bd764f, PR #411)is_confirmedcontext.confirmed()for block-included txsis_instantlockedSearching the entire codebase for
is_instantlocked = truereturns zero matches.Impact
is_instantlocked = trueCoinSelectorfilters them out → "No UTXOs available for selection"is_confirmedwasn't set eitherExpected behavior
When the wallet manager processes an InstantSend lock for a transaction, it should set
is_instantlocked = trueon the corresponding UTXOs, making them immediately spendable per theis_spendable()logic.Workaround
In dash-evo-tool, we work around this by patching cloned UTXOs before passing them to
CoinSelector:This is imprecise — it assumes all mempool transactions are IS-locked — but is the only option until the upstream properly tracks IS-lock status.
Versions affected
key-wallet0.42.0 at0bc6592— both flags brokenkey-wallet0.42.0 at2bd764f—is_confirmedfixed,is_instantlockedstill broken🤖 Co-authored by Claudius the Magnificent AI Agent