diff --git a/cli/src/offline.rs b/cli/src/offline.rs index 33d1bf1f8..ade5d8b49 100644 --- a/cli/src/offline.rs +++ b/cli/src/offline.rs @@ -1,11 +1,13 @@ use clap::{App, Arg, ArgMatches}; +use serde_json::Value; use solana_clap_utils::{ input_parsers::value_of, input_validators::{is_hash, is_pubkey_sig}, ArgConstant, }; use solana_client::rpc_client::RpcClient; -use solana_sdk::{fee_calculator::FeeCalculator, hash::Hash}; +use solana_sdk::{fee_calculator::FeeCalculator, hash::Hash, pubkey::Pubkey, signature::Signature}; +use std::str::FromStr; pub const BLOCKHASH_ARG: ArgConstant<'static> = ArgConstant { name: "blockhash", @@ -112,6 +114,23 @@ impl OfflineArgs for App<'_, '_> { } } +pub fn parse_sign_only_reply_string(reply: &str) -> (Hash, Vec<(Pubkey, Signature)>) { + let object: Value = serde_json::from_str(&reply).unwrap(); + let blockhash_str = object.get("blockhash").unwrap().as_str().unwrap(); + let blockhash = blockhash_str.parse::().unwrap(); + let signer_strings = object.get("signers").unwrap().as_array().unwrap(); + let signers = signer_strings + .iter() + .map(|signer_string| { + let mut signer = signer_string.as_str().unwrap().split('='); + let key = Pubkey::from_str(signer.next().unwrap()).unwrap(); + let sig = Signature::from_str(signer.next().unwrap()).unwrap(); + (key, sig) + }) + .collect(); + (blockhash, signers) +} + #[cfg(test)] mod tests { use super::*; diff --git a/cli/tests/pay.rs b/cli/tests/pay.rs index 156735154..eda6a073a 100644 --- a/cli/tests/pay.rs +++ b/cli/tests/pay.rs @@ -2,20 +2,18 @@ use chrono::prelude::*; use serde_json::Value; use solana_cli::{ cli::{process_command, request_and_confirm_airdrop, CliCommand, CliConfig, PayCommand}, - offline::BlockhashQuery, + offline::{parse_sign_only_reply_string, BlockhashQuery}, }; use solana_client::rpc_client::RpcClient; use solana_faucet::faucet::run_local_faucet; use solana_sdk::{ account_utils::StateMut, fee_calculator::FeeCalculator, - hash::Hash, nonce_state::NonceState, pubkey::Pubkey, - signature::{read_keypair_file, write_keypair, Keypair, KeypairUtil, Signature}, + signature::{read_keypair_file, write_keypair, Keypair, KeypairUtil}, }; use std::fs::remove_dir_all; -use std::str::FromStr; use std::sync::mpsc::channel; #[cfg(test)] @@ -305,24 +303,12 @@ fn test_offline_pay_tx() { check_balance(50, &rpc_client, &config_online.keypair.pubkey()); check_balance(0, &rpc_client, &bob_pubkey); - let object: Value = serde_json::from_str(&sig_response).unwrap(); - let blockhash_str = object.get("blockhash").unwrap().as_str().unwrap(); - let signer_strings = object.get("signers").unwrap().as_array().unwrap(); - let signers: Vec<_> = signer_strings - .iter() - .map(|signer_string| { - let mut signer = signer_string.as_str().unwrap().split('='); - let key = Pubkey::from_str(signer.next().unwrap()).unwrap(); - let sig = Signature::from_str(signer.next().unwrap()).unwrap(); - (key, sig) - }) - .collect(); - + let (blockhash, signers) = parse_sign_only_reply_string(&sig_response); config_online.command = CliCommand::Pay(PayCommand { lamports: 10, to: bob_pubkey, signers: Some(signers), - blockhash_query: BlockhashQuery::FeeCalculator(blockhash_str.parse::().unwrap()), + blockhash_query: BlockhashQuery::FeeCalculator(blockhash), ..PayCommand::default() }); process_command(&config_online).unwrap(); diff --git a/cli/tests/stake.rs b/cli/tests/stake.rs index 249337d1b..d9d047764 100644 --- a/cli/tests/stake.rs +++ b/cli/tests/stake.rs @@ -1,22 +1,19 @@ -use serde_json::Value; use solana_cli::{ cli::{process_command, request_and_confirm_airdrop, CliCommand, CliConfig}, - offline::BlockhashQuery, + offline::{parse_sign_only_reply_string, BlockhashQuery}, }; use solana_client::rpc_client::RpcClient; use solana_faucet::faucet::run_local_faucet; use solana_sdk::{ account_utils::StateMut, fee_calculator::FeeCalculator, - hash::Hash, nonce_state::NonceState, pubkey::Pubkey, - signature::{read_keypair_file, write_keypair, Keypair, KeypairUtil, Signature}, + signature::{read_keypair_file, write_keypair, Keypair, KeypairUtil}, system_instruction::create_address_with_seed, }; use solana_stake_program::stake_state::{Lockup, StakeAuthorize, StakeState}; use std::fs::remove_dir_all; -use std::str::FromStr; use std::sync::mpsc::channel; #[cfg(test)] @@ -44,23 +41,6 @@ fn check_balance(expected_balance: u64, client: &RpcClient, pubkey: &Pubkey) { }); } -fn parse_sign_only_reply_string(reply: &str) -> (Hash, Vec<(Pubkey, Signature)>) { - let object: Value = serde_json::from_str(&reply).unwrap(); - let blockhash_str = object.get("blockhash").unwrap().as_str().unwrap(); - let blockhash = blockhash_str.parse::().unwrap(); - let signer_strings = object.get("signers").unwrap().as_array().unwrap(); - let signers = signer_strings - .iter() - .map(|signer_string| { - let mut signer = signer_string.as_str().unwrap().split('='); - let key = Pubkey::from_str(signer.next().unwrap()).unwrap(); - let sig = Signature::from_str(signer.next().unwrap()).unwrap(); - (key, sig) - }) - .collect(); - (blockhash, signers) -} - #[test] fn test_seed_stake_delegation_and_deactivation() { solana_logger::setup();