Merge #250: fix various bugs with hws and spend signing process

73eb1d38e3612110ad467fd608863519838aa988 fix state: add new hws in list without dropping the old ones (edouard)
d9336c11ea7d3ad4dcb68fbe322d9247cf9ad52e spend detail: add a refresh button for hws (edouard)
5a7eaff17ba895418b368deaa74f8ed1b4ac26e7 fix hws: ledger dongle must load wallet (edouard)

Pull request description:

  Fixes #246
  Fixes #238

ACKs for top commit:
  edouardparis:
    ACK 73eb1d38e3612110ad467fd608863519838aa988

Tree-SHA512: 969824ba2ac28a5726b8b0e87cc9a0e216ae54e2ec1fde6c5cb73d9a9326071d3b1ede9dcde1e06eb1946a38627b4ed3be2efa23955b88b11db66f36f94de14a
This commit is contained in:
edouard 2022-12-18 10:59:53 +01:00
commit 805c8e192b
No known key found for this signature in database
GPG Key ID: E65F7A089C20DC8F
4 changed files with 43 additions and 6 deletions

View File

@ -118,8 +118,13 @@ impl State for RecoveryPanel {
}
}
},
// We add the new hws without dropping the reference of the previous ones.
Message::ConnectedHardwareWallets(hws) => {
self.hws = hws;
for h in hws {
if !self.hws.iter().any(|hw| hw.fingerprint == h.fingerprint) {
self.hws.push(h);
}
}
}
Message::Psbt(res) => match res {
Ok(psbt) => self.generated = Some(psbt),

View File

@ -330,8 +330,13 @@ impl Action for SignAction {
Ok(()) => self.updated = true,
Err(e) => self.error = Some(e),
},
// We add the new hws without dropping the reference of the previous ones.
Message::ConnectedHardwareWallets(hws) => {
self.hws = hws;
for h in hws {
if !self.hws.iter().any(|hw| hw.fingerprint == h.fingerprint) {
self.hws.push(h);
}
}
}
Message::View(view::Message::Reload) => {
return self.load(daemon);

View File

@ -480,7 +480,16 @@ pub fn sign_action<'a>(
Column::new()
.push(if !hws.is_empty() {
Column::new()
.push(text("Select hardware wallet to sign with:").bold())
.push(
Row::new()
.push(
text("Select hardware wallet to sign with:")
.bold()
.width(Length::Fill),
)
.push(button::border(None, "Refresh").on_press(Message::Reload))
.align_items(Alignment::Center),
)
.spacing(10)
.push(
hws.iter()
@ -503,7 +512,7 @@ pub fn sign_action<'a>(
.spacing(20)
.width(Length::Fill)
.push("Please connect a hardware wallet")
.push(button::primary(None, "Refresh").on_press(Message::Reload))
.push(button::border(None, "Refresh").on_press(Message::Reload))
.align_items(Alignment::Center),
)
.width(Length::Fill)

View File

@ -110,8 +110,26 @@ pub async fn list_hardware_wallets(
}
}
match ledger::Ledger::try_connect_hid() {
Ok(device) => match HardwareWallet::new(Arc::new(device)).await {
Ok(hw) => hws.push(hw),
Ok(mut device) => match device.get_master_fingerprint().await {
Ok(fingerprint) => {
if let Some((name, descriptor)) = wallet {
device
.load_wallet(
name,
descriptor,
cfg.iter()
.find(|cfg| cfg.fingerprint == fingerprint.to_string())
.map(|cfg| cfg.token()),
)
.expect("Configuration must be correct");
}
hws.push(HardwareWallet {
kind: device.device_kind(),
fingerprint,
device: Arc::new(device),
});
}
Err(e) => {
debug!("{}", e);
}