diff --git a/crates/aiken-lang/src/builtins.rs b/crates/aiken-lang/src/builtins.rs index 06a2f859..5c841b71 100644 --- a/crates/aiken-lang/src/builtins.rs +++ b/crates/aiken-lang/src/builtins.rs @@ -505,10 +505,13 @@ pub fn plutus(id_gen: &IdGenerator) -> TypeInfo { annotations: HashMap::new(), }; - for builtin in DefaultFunction::iter().take(75) { - let value = from_default_function(builtin, id_gen); - - plutus.values.insert(builtin.aiken_name(), value); + for builtin in DefaultFunction::iter() { + // FIXME: Disabling WriteBits for now, since its signature requires the ability to create + // list of raw integers, which isn't possible through Aiken at the moment. + if !matches!(builtin, DefaultFunction::WriteBits) { + let value = from_default_function(builtin, id_gen); + plutus.values.insert(builtin.aiken_name(), value); + } } plutus diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index e03e6407..c38fa805 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -44,7 +44,6 @@ use builder::{ introduce_name, introduce_pattern, pop_pattern, softcast_data_to_type_otherwise, unknown_data_to_type, DISCARDED, }; - use decision_tree::{get_tipo_by_path, Assigned, CaseTest, DecisionTree, TreeGen}; use indexmap::IndexMap; use interner::AirInterner; diff --git a/crates/uplc/src/machine/error.rs b/crates/uplc/src/machine/error.rs index 5c132bb5..3df2e519 100644 --- a/crates/uplc/src/machine/error.rs +++ b/crates/uplc/src/machine/error.rs @@ -136,6 +136,8 @@ pub enum Error { ReadBitOutOfBounds, #[error("writeBits: index out of bounds")] WriteBitsOutOfBounds, + #[error("illegal operation on empty ByteArray")] + EmptyByteArray, #[error("blst error {0:?}")] Blst(blst::BLST_ERROR), #[error("blst::hashToGroup")] diff --git a/crates/uplc/src/machine/runtime.rs b/crates/uplc/src/machine/runtime.rs index 8b101a09..faeef8d4 100644 --- a/crates/uplc/src/machine/runtime.rs +++ b/crates/uplc/src/machine/runtime.rs @@ -1592,6 +1592,10 @@ impl DefaultFunction { let bytes = args[0].unwrap_byte_string()?; let bit_index = args[1].unwrap_integer()?; + if bytes.is_empty() { + return Err(Error::EmptyByteArray); + } + // This ensures there is at least one byte in bytes if *bit_index < 0.into() || *bit_index >= (bytes.len() * 8).into() { return Err(Error::ReadBitOutOfBounds);