use alloy::{
consensus::{Receipt as ConsensusReceipt, TxType},
primitives::{Address, B256, BlockNumber},
};
use signet_storage_types::{IndexedReceipt, SealedHeader};
use crate::RpcLog;
#[derive(Debug, Clone)]
pub struct ColdReceipt {
pub receipt: ConsensusReceipt<RpcLog>,
pub tx_type: TxType,
pub tx_hash: B256,
pub gas_used: u64,
pub block_number: BlockNumber,
pub block_hash: B256,
pub block_timestamp: u64,
pub transaction_index: u64,
pub from: Address,
}
impl ColdReceipt {
pub fn new(ir: IndexedReceipt, header: &SealedHeader, transaction_index: u64) -> Self {
let block_number = header.number;
let block_hash = header.hash();
let block_timestamp = header.timestamp;
let IndexedReceipt { receipt: typed_receipt, tx_hash, first_log_index, gas_used, sender } =
ir;
let tx_type = typed_receipt.tx_type;
let status = typed_receipt.inner.status;
let cumulative_gas_used = typed_receipt.inner.cumulative_gas_used;
let rpc_logs: Vec<RpcLog> = typed_receipt
.inner
.logs
.into_iter()
.enumerate()
.map(|(log_idx, log)| RpcLog {
inner: log,
block_hash: Some(block_hash),
block_number: Some(block_number),
block_timestamp: Some(block_timestamp),
transaction_hash: Some(tx_hash),
transaction_index: Some(transaction_index),
log_index: Some(first_log_index + log_idx as u64),
removed: false,
})
.collect();
let receipt = ConsensusReceipt { status, cumulative_gas_used, logs: rpc_logs };
Self {
receipt,
tx_type,
tx_hash,
gas_used,
block_number,
block_hash,
block_timestamp,
transaction_index,
from: sender,
}
}
}