From c350543b46b54e467f71533263a7c8b706e51a5c Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Fri, 14 Feb 2020 09:38:35 -0700 Subject: [PATCH] Make generate_remote_keypair more generic for potential other remote-wallets (#8274) --- keygen/src/keygen.rs | 17 +++++------------ remote-wallet/src/ledger.rs | 18 ++---------------- remote-wallet/src/remote_keypair.rs | 26 +++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/keygen/src/keygen.rs b/keygen/src/keygen.rs index 3d40f9a216..1c471dbcbb 100644 --- a/keygen/src/keygen.rs +++ b/keygen/src/keygen.rs @@ -14,10 +14,7 @@ use solana_clap_utils::{ }, }; use solana_cli_config::config::{Config, CONFIG_FILE}; -use solana_remote_wallet::{ - ledger::{generate_remote_keypair, get_ledger_from_info}, - remote_wallet::RemoteWalletInfo, -}; +use solana_remote_wallet::remote_keypair::generate_remote_keypair; use solana_sdk::{ pubkey::write_pubkey_file, signature::{ @@ -82,14 +79,10 @@ fn get_keypair_from_matches( let mut stdin = std::io::stdin(); Ok(Box::new(read_keypair(&mut stdin)?)) } - KeypairUrl::Usb(path) => { - let (remote_wallet_info, mut derivation_path) = RemoteWalletInfo::parse_path(path)?; - if let Some(derivation) = derivation_of(matches, "derivation_path") { - derivation_path = derivation; - } - let ledger = get_ledger_from_info(remote_wallet_info)?; - Ok(Box::new(generate_remote_keypair(ledger, derivation_path))) - } + KeypairUrl::Usb(path) => Ok(Box::new(generate_remote_keypair( + path, + derivation_of(matches, "derivation_path"), + )?)), } } diff --git a/remote-wallet/src/ledger.rs b/remote-wallet/src/ledger.rs index 5c064acab1..56da1a5f1b 100644 --- a/remote-wallet/src/ledger.rs +++ b/remote-wallet/src/ledger.rs @@ -1,9 +1,5 @@ -use crate::{ - remote_keypair::RemoteKeypair, - remote_wallet::{ - initialize_wallet_manager, DerivationPath, RemoteWallet, RemoteWalletError, - RemoteWalletInfo, RemoteWalletType, - }, +use crate::remote_wallet::{ + initialize_wallet_manager, DerivationPath, RemoteWallet, RemoteWalletError, RemoteWalletInfo, }; use dialoguer::{theme::ColorfulTheme, Select}; use log::*; @@ -369,13 +365,3 @@ pub fn get_ledger_from_info( }; wallet_manager.get_ledger(&wallet_base_pubkey) } - -pub fn generate_remote_keypair( - ledger: Arc, - derivation_path: DerivationPath, -) -> RemoteKeypair { - RemoteKeypair { - wallet_type: RemoteWalletType::Ledger(ledger), - derivation_path, - } -} diff --git a/remote-wallet/src/remote_keypair.rs b/remote-wallet/src/remote_keypair.rs index febe359284..6c71df18de 100644 --- a/remote-wallet/src/remote_keypair.rs +++ b/remote-wallet/src/remote_keypair.rs @@ -1,4 +1,9 @@ -use crate::remote_wallet::{DerivationPath, RemoteWallet, RemoteWalletType}; +use crate::{ + ledger::get_ledger_from_info, + remote_wallet::{ + DerivationPath, RemoteWallet, RemoteWalletError, RemoteWalletInfo, RemoteWalletType, + }, +}; use solana_sdk::{ pubkey::Pubkey, signature::{KeypairUtil, Signature}, @@ -36,3 +41,22 @@ impl KeypairUtil for RemoteKeypair { } } } + +pub fn generate_remote_keypair( + path: String, + explicit_derivation_path: Option, +) -> Result { + let (remote_wallet_info, mut derivation_path) = RemoteWalletInfo::parse_path(path)?; + if let Some(derivation) = explicit_derivation_path { + derivation_path = derivation; + } + if remote_wallet_info.manufacturer == "ledger" { + let ledger = get_ledger_from_info(remote_wallet_info)?; + Ok(RemoteKeypair { + wallet_type: RemoteWalletType::Ledger(ledger), + derivation_path, + }) + } else { + Err(RemoteWalletError::DeviceTypeMismatch) + } +}