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
use crate::{csl, model::*, *};
use cryptoxide::blake2b::Blake2b;

pub(crate) fn blake2b256(data: &[u8]) -> [u8; 32] {
    let mut out = [0; 32];
    Blake2b::blake2b(&mut out, data, &[]);
    out
}

#[wasm_bindgen]
pub fn calculate_tx_hash(tx_hex: &str) -> String {
    let csl_tx = csl::FixedTransaction::from_hex(tx_hex).unwrap();
    csl::TransactionHash::from(blake2b256(&csl_tx.raw_body())).to_hex()
}

#[wasm_bindgen]
pub fn sign_transaction(tx_hex: String, signing_keys: JsVecString) -> String {
    let unsigned_transaction: csl::Transaction = csl::Transaction::from_hex(&tx_hex).unwrap();
    let tx_body = unsigned_transaction.body();
    let mut witness_set = unsigned_transaction.witness_set();
    let mut vkey_witnesses = witness_set
        .vkeys()
        .unwrap_or_else(csl::Vkeywitnesses::new)
        .clone();
    for key in signing_keys {
        let clean_hex = if &key[0..4] == "5820" {
            key[4..].to_string()
        } else {
            key.to_string()
        };
        let skey = csl::PrivateKey::from_hex(&clean_hex).unwrap();
        let vkey_witness = csl::make_vkey_witness(&csl::hash_transaction(&tx_body), &skey);
        vkey_witnesses.add(&vkey_witness);
    }
    witness_set.set_vkeys(&vkey_witnesses);
    let signed_transaction = csl::Transaction::new(
        &tx_body,
        &witness_set,
        unsigned_transaction.auxiliary_data(),
    );
    signed_transaction.to_hex()
}

pub fn remove_witness_set(tx_hex: String) -> String {
    let signed_transaction = csl::Transaction::from_hex(&tx_hex).unwrap();
    csl::Transaction::new(
        &signed_transaction.body(),
        &csl::TransactionWitnessSet::new(),
        signed_transaction.auxiliary_data().clone(),
    )
    .to_hex()
}