diff --git a/remote-wallet/src/ledger.rs b/remote-wallet/src/ledger.rs index db7a3f8127..06d7cb1211 100644 --- a/remote-wallet/src/ledger.rs +++ b/remote-wallet/src/ledger.rs @@ -339,6 +339,7 @@ impl RemoteWallet for LedgerWallet { .clone() .unwrap_or("Unknown") .to_string(); + let host_device_path = dev_info.path().to_string_lossy().to_string(); let version = self.get_firmware_version()?; self.version = version; let pubkey_result = self.get_pubkey(&DerivationPath::default(), false); @@ -350,6 +351,7 @@ impl RemoteWallet for LedgerWallet { model, manufacturer, serial, + host_device_path, pubkey, error, }) @@ -521,17 +523,17 @@ pub fn get_ledger_from_info( return Err(device.error.clone().unwrap()); } } - let mut matches: Vec<(Pubkey, String)> = matches + let mut matches: Vec<(String, String)> = matches .filter(|&device_info| device_info.error.is_none()) - .map(|device_info| (device_info.pubkey, device_info.get_pretty_path())) + .map(|device_info| (device_info.host_device_path.clone(), device_info.get_pretty_path())) .collect(); if matches.is_empty() { return Err(RemoteWalletError::NoDeviceFound); } matches.sort_by(|a, b| a.1.cmp(&b.1)); - let (pubkeys, device_paths): (Vec, Vec) = matches.into_iter().unzip(); + let (host_device_paths, device_paths): (Vec, Vec) = matches.into_iter().unzip(); - let wallet_base_pubkey = if pubkeys.len() > 1 { + let wallet_host_device_path = if host_device_paths.len() > 1 { let selection = Select::with_theme(&ColorfulTheme::default()) .with_prompt(&format!( "Multiple hardware wallets found. Please select a device for {:?}", @@ -541,11 +543,11 @@ pub fn get_ledger_from_info( .items(&device_paths[..]) .interact() .unwrap(); - pubkeys[selection] + &host_device_paths[selection] } else { - pubkeys[0] + &host_device_paths[0] }; - wallet_manager.get_ledger(&wallet_base_pubkey) + wallet_manager.get_ledger(wallet_host_device_path) } // diff --git a/remote-wallet/src/remote_wallet.rs b/remote-wallet/src/remote_wallet.rs index 59d1fd4156..cb66c2b6c8 100644 --- a/remote-wallet/src/remote_wallet.rs +++ b/remote-wallet/src/remote_wallet.rs @@ -152,11 +152,14 @@ impl RemoteWalletManager { /// Get a particular wallet #[allow(unreachable_patterns)] - pub fn get_ledger(&self, pubkey: &Pubkey) -> Result, RemoteWalletError> { + pub fn get_ledger( + &self, + host_device_path: &str, + ) -> Result, RemoteWalletError> { self.devices .read() .iter() - .find(|device| &device.info.pubkey == pubkey) + .find(|device| device.info.host_device_path == host_device_path) .ok_or(RemoteWalletError::PubkeyNotFound) .and_then(|device| match &device.wallet_type { RemoteWalletType::Ledger(ledger) => Ok(ledger.clone()), @@ -237,6 +240,8 @@ pub struct RemoteWalletInfo { pub manufacturer: String, /// RemoteWallet device serial number pub serial: String, + /// RemoteWallet host device path + pub host_device_path: String, /// Base pubkey of device at Solana derivation path pub pubkey: Pubkey, /// Initial read error @@ -449,6 +454,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, })); @@ -465,6 +471,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, })); @@ -481,6 +488,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, })); @@ -497,6 +505,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, })); @@ -513,6 +522,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, })); @@ -531,6 +541,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey: Pubkey::default(), error: None, })); @@ -547,6 +558,7 @@ mod tests { model: "".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey: Pubkey::default(), error: None, })); @@ -581,6 +593,7 @@ mod tests { manufacturer: "Ledger".to_string(), model: "Nano S".to_string(), serial: "0001".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, }; @@ -593,6 +606,8 @@ mod tests { assert!(info.matches(&test_info)); test_info.model = "Nano S".to_string(); assert!(info.matches(&test_info)); + test_info.host_device_path = "/host/device/path".to_string(); + assert!(info.matches(&test_info)); let another_pubkey = Pubkey::new_rand(); test_info.pubkey = another_pubkey; assert!(!info.matches(&test_info)); @@ -608,6 +623,7 @@ mod tests { model: "nano-s".to_string(), manufacturer: "ledger".to_string(), serial: "".to_string(), + host_device_path: "/host/device/path".to_string(), pubkey, error: None, };