1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
mod legacy_transaction;
mod segwit_transaction;
mod types;

use legacy_transaction::get_legacy_unsigned_transaction_hex;
use segwit_transaction::{
    get_unsigned_segwit_transaction, sign_segwit_transaction, SegwitTransaction,
};

use crate::legacy_transaction::{sign_p2pkh_transaction_with_one_input, P2PKHTransaction};

pub use crate::types::PayFrom;
pub use crate::types::PayTo;
pub use crate::types::Wifs;

pub fn get_unsigned_transaction_hex(inputs: &Vec<PayFrom>, outputs: &Vec<PayTo>) -> String {
    let is_legacy_transaction = inputs
        .iter()
        .find(|input| !bitcoin_address::is_legacy(&input.address))
        .is_none();
    if is_legacy_transaction {
        let transaction = P2PKHTransaction::new(inputs.clone(), outputs.clone());
        let unsigned_transaction_hex = get_legacy_unsigned_transaction_hex(&transaction);
        unsigned_transaction_hex
    } else {
        let transaction = SegwitTransaction::new(inputs.clone(), outputs.clone());

        let unsigned_transaction_hex = get_unsigned_segwit_transaction(&transaction);
        unsigned_transaction_hex
    }
}

pub fn get_signed_transaction_hex(
    inputs: &Vec<PayFrom>,
    outputs: &Vec<PayTo>,
    wifs: &Wifs,
) -> String {
    let is_legacy_transaction = inputs
        .iter()
        .find(|input| !bitcoin_address::is_legacy(&input.address))
        .is_none();
    if is_legacy_transaction {
        let transaction = P2PKHTransaction::new(inputs.clone(), outputs.clone());
        let signed_transaction_hex = sign_p2pkh_transaction_with_one_input(&transaction, wifs);
        signed_transaction_hex
    } else {
        let transaction = SegwitTransaction::new(inputs.clone(), outputs.clone());

        let signed_transaction_hex = sign_segwit_transaction(&transaction, wifs);
        signed_transaction_hex
    }
}