use starknet_types_core::felt::Felt;
use starknet_types_core::hash::StarkHash as CoreStarkHash;
use super::block_hash_calculator::TransactionHashingData;
use crate::core::TransactionCommitment;
use crate::crypto::patricia_hash::calculate_root;
use crate::crypto::utils::HashChain;
use crate::transaction::fields::TransactionSignature;
use crate::transaction::TransactionHash;
#[cfg(test)]
#[path = "transaction_commitment_test.rs"]
mod transaction_commitment_test;
#[derive(Clone)]
pub struct TransactionLeafElement {
pub(crate) transaction_hash: TransactionHash,
pub(crate) transaction_signature: TransactionSignature,
}
impl From<&TransactionHashingData> for TransactionLeafElement {
fn from(transaction_data: &TransactionHashingData) -> Self {
Self {
transaction_hash: transaction_data.transaction_hash,
transaction_signature: transaction_data.transaction_signature.clone(),
}
}
}
pub fn calculate_transaction_commitment<H: CoreStarkHash>(
transaction_leaf_elements: &[TransactionLeafElement],
) -> TransactionCommitment {
let transaction_leaves =
transaction_leaf_elements.iter().map(calculate_transaction_leaf).collect();
TransactionCommitment(calculate_root::<H>(transaction_leaves))
}
fn calculate_transaction_leaf(transaction_leaf_elements: &TransactionLeafElement) -> Felt {
HashChain::new()
.chain(&transaction_leaf_elements.transaction_hash.0)
.chain_iter(transaction_leaf_elements.transaction_signature.0.iter())
.get_poseidon_hash()
}