diem_types/transaction/
helpers.rs

1// Copyright (c) The Diem Core Contributors
2// SPDX-License-Identifier: Apache-2.0
3
4// Copyright 2021 Conflux Foundation. All rights reserved.
5// Conflux is free software and distributed under GNU General Public License.
6// See http://www.gnu.org/licenses/
7
8use 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, /* for compatibility with UTC's
21                                        * timestamp. */
22    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
36/// Craft a transaction request.
37pub fn create_user_txn<T: TransactionSigner + ?Sized>(
38    signer: &T, payload: TransactionPayload, sender_address: AccountAddress,
39    txn_expiration_duration_secs: i64, /* for compatibility with UTC's
40                                        * timestamp. */
41    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}