diff --git a/crates/flat/src/encoder.rs b/crates/flat/src/encoder.rs index 436b7c42..84f094c0 100644 --- a/crates/flat/src/encoder.rs +++ b/crates/flat/src/encoder.rs @@ -137,10 +137,14 @@ impl Encoder { } } - pub fn encode_list_with(&mut self, list: Vec) -> Result<(), String> { + pub fn encode_list_with( + &mut self, + encoder_func: for<'r> fn(u8, &'r mut Encoder) -> Result<(), String>, + list: Vec, + ) -> Result<(), String> { for item in list { self.one(); - self.encode(item)?; + encoder_func(item, self)?; } self.zero(); Ok(()) diff --git a/crates/uplc/src/ast.rs b/crates/uplc/src/ast.rs index 07f0318e..33a44e1b 100644 --- a/crates/uplc/src/ast.rs +++ b/crates/uplc/src/ast.rs @@ -3,6 +3,7 @@ use flat::en::{Encode, Encoder}; use crate::builtins::DefaultFunction; const TERM_TAG_WIDTH: u32 = 4; +const CONST_TAG_WIDTH: u32 = 4; #[derive(Debug)] pub struct Program { @@ -70,7 +71,11 @@ pub enum Constant { } pub fn encode_constant(tag: u8, e: &mut Encoder) -> Result<(), String> { - e.encode_list_with([tag].to_vec()) + e.encode_list_with(encode_constant_tag, [tag].to_vec()) +} + +pub fn encode_constant_tag(tag: u8, e: &mut Encoder) -> Result<(), String> { + safe_encode_bits(CONST_TAG_WIDTH, tag, e) } impl Encode for Program {