diff --git a/pallas-primitives/src/byron/mod.rs b/pallas-primitives/src/byron/mod.rs index a6a8551..8e5f65b 100644 --- a/pallas-primitives/src/byron/mod.rs +++ b/pallas-primitives/src/byron/mod.rs @@ -2,6 +2,5 @@ mod fees; mod model; -mod time; pub use model::*; diff --git a/pallas-traverse/src/header.rs b/pallas-traverse/src/header.rs index 3ad6c90..b58a8e0 100644 --- a/pallas-traverse/src/header.rs +++ b/pallas-traverse/src/header.rs @@ -6,6 +6,7 @@ use pallas_crypto::hash::{Hash, Hasher}; use pallas_primitives::{alonzo, babbage, byron}; use crate::hashes::ToHash; +use crate::time; use crate::{Era, Error, MultiEraHeader}; impl<'b> MultiEraHeader<'b> { @@ -57,10 +58,15 @@ impl<'b> MultiEraHeader<'b> { pub fn slot(&self) -> u64 { match self { - MultiEraHeader::EpochBoundary(x) => x.to_abs_slot(), + MultiEraHeader::EpochBoundary(x) => { + time::byron_epoch_slot_to_absolute(x.consensus_data.epoch_id, 0) + } MultiEraHeader::AlonzoCompatible(x) => x.header_body.slot, MultiEraHeader::Babbage(x) => x.header_body.slot, - MultiEraHeader::Byron(x) => x.consensus_data.0.to_abs_slot(), + MultiEraHeader::Byron(x) => time::byron_epoch_slot_to_absolute( + x.consensus_data.0.epoch, + x.consensus_data.0.slot, + ), } } diff --git a/pallas-traverse/src/lib.rs b/pallas-traverse/src/lib.rs index 91bc56d..86188ef 100644 --- a/pallas-traverse/src/lib.rs +++ b/pallas-traverse/src/lib.rs @@ -21,6 +21,7 @@ pub mod output; pub mod probe; pub mod signers; mod support; +pub mod time; pub mod tx; pub mod withdrawals; pub mod witnesses; diff --git a/pallas-primitives/src/byron/time.rs b/pallas-traverse/src/time.rs similarity index 60% rename from pallas-primitives/src/byron/time.rs rename to pallas-traverse/src/time.rs index 1f1f21b..e781fcf 100644 --- a/pallas-primitives/src/byron/time.rs +++ b/pallas-traverse/src/time.rs @@ -1,30 +1,16 @@ -use super::{EbbHead, SlotId}; - // TODO: is it safe to hardcode these values? const WELLKNOWN_SLOT_LENGTH: u64 = 20; // 20 secs const WELLKNOWN_EPOCH_LENGTH: u64 = 5 * 24 * 60 * 60; // 5 days -fn epoch_slot_to_absolute(epoch: u64, sub_epoch_slot: u64) -> u64 { +pub fn byron_epoch_slot_to_absolute(epoch: u64, sub_epoch_slot: u64) -> u64 { ((epoch * WELLKNOWN_EPOCH_LENGTH) / WELLKNOWN_SLOT_LENGTH) + sub_epoch_slot } -impl SlotId { - pub fn to_abs_slot(&self) -> u64 { - epoch_slot_to_absolute(self.epoch, self.slot) - } -} - -impl EbbHead { - pub fn to_abs_slot(&self) -> u64 { - epoch_slot_to_absolute(self.consensus_data.epoch_id, 0) - } -} - #[cfg(test)] mod tests { use pallas_codec::minicbor; - use crate::byron::Block; + use crate::{byron::Block, time::byron_epoch_slot_to_absolute}; type BlockWrapper = (u16, Block); @@ -32,13 +18,16 @@ mod tests { fn knwon_slot_matches() { // TODO: expand this test to include more test blocks let block_idx = 1; - let block_str = include_str!("../../../test_data/byron1.block"); + let block_str = include_str!("../../test_data/byron1.block"); let block_bytes = hex::decode(block_str).expect(&format!("bad block file {}", block_idx)); let (_, block): BlockWrapper = minicbor::decode(&block_bytes[..]) .expect(&format!("error decoding cbor for file {}", block_idx)); - let computed_slot = block.header.consensus_data.0.to_abs_slot(); + let computed_slot = byron_epoch_slot_to_absolute( + block.header.consensus_data.0.epoch, + block.header.consensus_data.0.slot, + ); assert_eq!(computed_slot, 4492794); }