clap-utils: Add helper to CliSignerInfo for getting signers for a message

This commit is contained in:
Trent Nelson
2021-03-15 20:43:07 -06:00
committed by Trent Nelson
parent bf33ce8906
commit 4e99f1e634

View File

@ -12,6 +12,7 @@ use solana_remote_wallet::{
}; };
use solana_sdk::{ use solana_sdk::{
hash::Hash, hash::Hash,
message::Message,
pubkey::Pubkey, pubkey::Pubkey,
signature::{ signature::{
keypair_from_seed, keypair_from_seed_phrase_and_passphrase, read_keypair, keypair_from_seed, keypair_from_seed_phrase_and_passphrase, read_keypair,
@ -68,6 +69,18 @@ impl CliSignerInfo {
None None
} }
} }
pub fn signers_for_message(&self, message: &Message) -> Vec<&dyn Signer> {
self.signers
.iter()
.filter_map(|k| {
if message.signer_keys().contains(&&k.pubkey()) {
Some(k.as_ref())
} else {
None
}
})
.collect()
}
} }
pub struct DefaultSigner { pub struct DefaultSigner {
@ -356,6 +369,7 @@ fn sanitize_seed_phrase(seed_phrase: &str) -> String {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use solana_sdk::system_instruction;
#[test] #[test]
fn test_sanitize_seed_phrase() { fn test_sanitize_seed_phrase() {
@ -365,4 +379,35 @@ mod tests {
sanitize_seed_phrase(seed_phrase) sanitize_seed_phrase(seed_phrase)
); );
} }
#[test]
fn test_signer_info_signers_for_message() {
let source = Keypair::new();
let fee_payer = Keypair::new();
let nonsigner1 = Keypair::new();
let nonsigner2 = Keypair::new();
let recipient = Pubkey::new_unique();
let message = Message::new(
&[system_instruction::transfer(
&source.pubkey(),
&recipient,
42,
)],
Some(&fee_payer.pubkey()),
);
let signers = vec![
Box::new(fee_payer) as Box<dyn Signer>,
Box::new(source) as Box<dyn Signer>,
Box::new(nonsigner1) as Box<dyn Signer>,
Box::new(nonsigner2) as Box<dyn Signer>,
];
let signer_info = CliSignerInfo { signers };
let msg_signers = signer_info.signers_for_message(&message);
let signer_pubkeys = msg_signers.iter().map(|s| s.pubkey()).collect::<Vec<_>>();
let expect = vec![
signer_info.signers[0].pubkey(),
signer_info.signers[1].pubkey(),
];
assert_eq!(signer_pubkeys, expect);
}
} }