diff --git a/crates/cli/src/args.rs b/crates/cli/src/args.rs index c861c25b..cd886739 100644 --- a/crates/cli/src/args.rs +++ b/crates/cli/src/args.rs @@ -29,6 +29,8 @@ pub enum TxCommand { slot_length: u64, #[clap(short, long)] zero_time: u64, + #[clap(short, long)] + zero_slot: u64, }, } diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 39e4cc51..23915c87 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -30,6 +30,7 @@ fn main() -> anyhow::Result<()> { resolved_inputs, slot_length, zero_time, + zero_slot, } => { let tx_bytes = if cbor { fs::read(input)? @@ -51,6 +52,7 @@ fn main() -> anyhow::Result<()> { let slot_config = SlotConfig { zero_time, + zero_slot, slot_length, }; diff --git a/crates/uplc/src/tx.rs b/crates/uplc/src/tx.rs index 35c8de7e..8996efd0 100644 --- a/crates/uplc/src/tx.rs +++ b/crates/uplc/src/tx.rs @@ -68,12 +68,13 @@ pub fn eval_phase_two( /// This function is the same as [`eval_phase_two`] /// but the inputs are raw bytes. /// initial_budget expects (cpu, mem). +/// slot_config (zero_time, zero_slot, slot_length) pub fn eval_phase_two_raw( tx_bytes: &[u8], utxos_bytes: &[(Vec, Vec)], cost_mdls_bytes: &[u8], initial_budget: (u64, u64), - slot_config: (u64, u64), + slot_config: (u64, u64, u64), run_phase_one: bool, ) -> Result>, Error> { let multi_era_tx = MultiEraTx::decode(Era::Babbage, tx_bytes) @@ -97,7 +98,8 @@ pub fn eval_phase_two_raw( let sc = SlotConfig { zero_time: slot_config.0, - slot_length: slot_config.1, + zero_slot: slot_config.1, + slot_length: slot_config.2, }; match multi_era_tx { diff --git a/crates/uplc/src/tx/eval.rs b/crates/uplc/src/tx/eval.rs index 9d7750bb..19212bd6 100644 --- a/crates/uplc/src/tx/eval.rs +++ b/crates/uplc/src/tx/eval.rs @@ -24,7 +24,7 @@ use super::{ }; fn slot_to_begin_posix_time(slot: u64, sc: &SlotConfig) -> u64 { - let ms_after_begin = slot * sc.slot_length; + let ms_after_begin = (slot - sc.zero_slot) * sc.slot_length; sc.zero_time + ms_after_begin } diff --git a/crates/uplc/src/tx/script_context.rs b/crates/uplc/src/tx/script_context.rs index f762e441..65497dec 100644 --- a/crates/uplc/src/tx/script_context.rs +++ b/crates/uplc/src/tx/script_context.rs @@ -84,6 +84,7 @@ pub struct TimeRange { pub struct SlotConfig { pub slot_length: u64, + pub zero_slot: u64, pub zero_time: u64, } @@ -91,7 +92,8 @@ impl Default for SlotConfig { fn default() -> Self { Self { slot_length: 1000, - zero_time: 1596491091, + zero_slot: 4492800, + zero_time: 1596059091000, } } } diff --git a/crates/uplc/src/tx/tests.rs b/crates/uplc/src/tx/tests.rs index 9fd84405..d37e1c48 100644 --- a/crates/uplc/src/tx/tests.rs +++ b/crates/uplc/src/tx/tests.rs @@ -42,6 +42,7 @@ fn test_eval() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -292,6 +293,7 @@ fn test_eval_1() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -561,6 +563,7 @@ fn test_eval_2() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -659,6 +662,7 @@ fn test_eval_3() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -925,6 +929,7 @@ fn test_eval_4() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -1006,6 +1011,7 @@ fn test_eval_5() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -1108,6 +1114,7 @@ fn test_eval_6() { let slot_config = SlotConfig { zero_time: 1596059091000, // Mainnet network + zero_slot: 4492800, slot_length: 1000, }; @@ -1211,6 +1218,7 @@ fn test_eval_7() { let slot_config = SlotConfig { zero_time: 1596059091000, // Mainnet network + zero_slot: 4492800, slot_length: 1000, }; @@ -1301,6 +1309,7 @@ fn test_eval_8() { let slot_config = SlotConfig { zero_time: 1596059091000, // Mainnet network + zero_slot: 4492800, slot_length: 1000, }; @@ -1564,6 +1573,7 @@ fn eval_missing_redeemer() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, }; @@ -1642,6 +1652,7 @@ fn eval_extraneous_redeemer() { let slot_config = SlotConfig { zero_time: 1660003200000, // Preview network + zero_slot: 0, slot_length: 1000, };