Add unique_signers() to SDK (#10105)

automerge
This commit is contained in:
Greg Fitzgerald
2020-05-18 19:31:45 -06:00
committed by GitHub
parent 759c0e0b03
commit 300b33a20e
6 changed files with 24 additions and 20 deletions

View File

@ -3,6 +3,7 @@
use crate::{pubkey::Pubkey, transaction::TransactionError};
use generic_array::{typenum::U64, GenericArray};
use hmac::Hmac;
use itertools::Itertools;
use rand::{rngs::OsRng, CryptoRng, RngCore};
use std::{
borrow::{Borrow, Cow},
@ -155,6 +156,11 @@ impl std::fmt::Debug for dyn Signer {
}
}
/// Remove duplicates signers while preserving order. O(n²)
pub fn unique_signers(signers: Vec<&dyn Signer>) -> Vec<&dyn Signer> {
signers.into_iter().unique_by(|s| s.pubkey()).collect()
}
impl Signer for Keypair {
/// Return the public key for the given keypair
fn pubkey(&self) -> Pubkey {
@ -553,4 +559,18 @@ mod tests {
let presigner2 = Presigner::new(&pubkey, &sig);
assert_eq!(presigner, presigner2);
}
fn pubkeys(signers: &[&dyn Signer]) -> Vec<Pubkey> {
signers.into_iter().map(|x| x.pubkey()).collect()
}
#[test]
fn test_unique_signers() {
let alice = Keypair::new();
let bob = Keypair::new();
assert_eq!(
pubkeys(&unique_signers(vec![&alice, &bob, &alice])),
pubkeys(&[&alice, &bob])
);
}
}