diem_types/transaction/
helpers.rs1use crate::{
9 account_address::AccountAddress,
10 chain_id::ChainId,
11 transaction::{RawTransaction, SignedTransaction, TransactionPayload},
12 validator_config::{ConsensusPrivateKey, ConsensusPublicKey},
13};
14use anyhow::Result;
15use chrono::Utc;
16use diem_crypto::{test_utils::KeyPair, traits::SigningKey};
17
18pub fn create_unsigned_txn(
19 payload: TransactionPayload, sender_address: AccountAddress,
20 txn_expiration_duration_secs: i64, chain_id: ChainId,
23) -> RawTransaction {
24 RawTransaction::new(
25 sender_address,
26 payload,
27 (Utc::now().timestamp() + txn_expiration_duration_secs) as u64,
28 chain_id,
29 )
30}
31
32pub trait TransactionSigner {
33 fn sign_txn(&self, raw_txn: RawTransaction) -> Result<SignedTransaction>;
34}
35
36pub fn create_user_txn<T: TransactionSigner + ?Sized>(
38 signer: &T, payload: TransactionPayload, sender_address: AccountAddress,
39 txn_expiration_duration_secs: i64, chain_id: ChainId,
42) -> Result<SignedTransaction> {
43 let raw_txn = create_unsigned_txn(
44 payload,
45 sender_address,
46 txn_expiration_duration_secs,
47 chain_id,
48 );
49 signer.sign_txn(raw_txn)
50}
51
52impl TransactionSigner for KeyPair<ConsensusPrivateKey, ConsensusPublicKey> {
53 fn sign_txn(&self, raw_txn: RawTransaction) -> Result<SignedTransaction> {
54 let signature = self.private_key.sign(&raw_txn);
55 Ok(SignedTransaction::new(
56 raw_txn,
57 self.public_key.clone(),
58 signature,
59 ))
60 }
61}