Add a way to build unsigned transactions

This commit is contained in:
Greg Fitzgerald 2019-03-04 16:24:25 -07:00
parent 97274030b9
commit 4f6d7702c5
1 changed files with 21 additions and 12 deletions

View File

@ -90,25 +90,34 @@ impl TransactionBuilder {
.collect()
}
/// Return a signed transaction.
pub fn sign<T: KeypairUtil>(&self, keypairs: &[&T], recent_blockhash: Hash) -> Transaction {
/// Return an unsigned transaction that requires signatures. To more safely return an unsigned
/// transaction that *doesn't* require signatures, pass `sign()` zero keypairs.
pub fn unsigned(&self, recent_blockhash: Hash) -> Transaction {
let program_ids = self.program_ids();
let (mut signed_keys, unsigned_keys) = self.keys();
signed_keys.extend(&unsigned_keys);
let instructions = self.instructions(&signed_keys, &program_ids);
Transaction {
signatures: vec![],
account_keys: signed_keys,
recent_blockhash,
fee: self.fee,
program_ids,
instructions,
}
}
/// Return a signed transaction.
pub fn sign<T: KeypairUtil>(&self, keypairs: &[&T], recent_blockhash: Hash) -> Transaction {
let signed_keys = self.keys().0;
for (i, keypair) in keypairs.iter().enumerate() {
assert_eq!(keypair.pubkey(), signed_keys[i], "keypair-pubkey mismatch");
}
assert_eq!(keypairs.len(), signed_keys.len(), "not enough keypairs");
signed_keys.extend(&unsigned_keys);
let instructions = self.instructions(&signed_keys, &program_ids);
Transaction::new_with_instructions(
keypairs,
&unsigned_keys,
recent_blockhash,
self.fee,
program_ids,
instructions,
)
let mut tx = self.unsigned(Hash::default());
tx.sign(keypairs, recent_blockhash);
tx
}
}