Skip to content

Commit 3851d59

Browse files
committed
fix send panel: reload coins
When going back to send panel, coins are fetched again and passed to DefineSpendStep. A redraft is triggered because some coins may have been removed from the list and new coins were deposited.
1 parent a39f5dd commit 3851d59

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

gui/src/app/state/spend/step.rs

+36-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use std::collections::HashMap;
1+
use std::collections::{HashMap, HashSet};
2+
use std::iter::FromIterator;
23
use std::str::FromStr;
34
use std::sync::Arc;
45

@@ -140,6 +141,11 @@ impl DefineSpend {
140141
}
141142

142143
pub fn with_coins_sorted(mut self, blockheight: u32) -> Self {
144+
self.sort_coins(blockheight);
145+
self
146+
}
147+
148+
fn sort_coins(&mut self, blockheight: u32) {
143149
let timelock = self.timelock;
144150
self.coins.sort_by(|(a, a_selected), (b, b_selected)| {
145151
if *a_selected && !b_selected || !a_selected && *b_selected {
@@ -154,7 +160,6 @@ impl DefineSpend {
154160
a.block_height.cmp(&b.block_height)
155161
}
156162
});
157-
self
158163
}
159164

160165
pub fn self_send(mut self) -> Self {
@@ -406,6 +411,35 @@ impl Step for DefineSpend {
406411
}
407412
Err(e) => self.warning = Some(e),
408413
},
414+
Message::Coins(res) => match res {
415+
Ok(coins) => {
416+
let selected: HashSet<OutPoint> =
417+
HashSet::from_iter(self.coins.iter().filter_map(|(c, selected)| {
418+
if *selected {
419+
Some(c.outpoint)
420+
} else {
421+
None
422+
}
423+
}));
424+
self.coins = coins
425+
.into_iter()
426+
.filter_map(|coin| {
427+
if coin.spend_info.is_none() && !coin.is_immature {
428+
let selected = selected.contains(&coin.outpoint);
429+
Some((coin, selected))
430+
} else {
431+
None
432+
}
433+
})
434+
.collect();
435+
self.sort_coins(cache.blockheight as u32);
436+
// In case some selected coins are not spendable anymore and
437+
// new coins make more sense to be selected. A redraft is triggered
438+
// if all forms are valid (checked in the redraft method)
439+
self.redraft(daemon);
440+
}
441+
Err(e) => self.warning = Some(e),
442+
},
409443
_ => {}
410444
};
411445
Command::none()

0 commit comments

Comments
 (0)