From e3f2fb53930d22cd3ecb9bab875a0ba63f7d0cea Mon Sep 17 00:00:00 2001 From: rvcas Date: Mon, 17 Apr 2023 10:50:40 -0400 Subject: [PATCH] fix: need to return deserialization error here --- CHANGELOG.md | 1 + crates/uplc/src/machine/runtime.rs | 45 +++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ba8be9..899e8872 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - **aiken-lang**: needed to assert_no_assignment in when and if blocks +- **uplc**: need to return deserialization error in some cases for the machine builtins ## v1.0.1-alpha - 2023-04-16 diff --git a/crates/uplc/src/machine/runtime.rs b/crates/uplc/src/machine/runtime.rs index 91b9594e..51e4644f 100644 --- a/crates/uplc/src/machine/runtime.rs +++ b/crates/uplc/src/machine/runtime.rs @@ -833,8 +833,13 @@ impl DefaultFunction { Ok(value) } DefaultFunction::UnConstrData => match &args[0] { - Value::Con(inner) => { - let Constant::Data(PlutusData::Constr(c)) = inner.as_ref() else {unreachable!()}; + v @ Value::Con(inner) => { + let Constant::Data(PlutusData::Constr(c)) = inner.as_ref() else { + return Err(Error::DeserialisationError( + "UnConstrData".to_string(), + v.clone(), + )) + }; let constant = Constant::ProtoPair( Type::Integer, @@ -866,8 +871,13 @@ impl DefaultFunction { )), }, DefaultFunction::UnMapData => match &args[0] { - Value::Con(inner) => { - let Constant::Data(PlutusData::Map(m)) = inner.as_ref() else {unreachable!()}; + v @ Value::Con(inner) => { + let Constant::Data(PlutusData::Map(m)) = inner.as_ref() else { + return Err(Error::DeserialisationError( + "UnMapData".to_string(), + v.clone(), + )) + }; let constant = Constant::ProtoList( Type::Pair(Type::Data.into(), Type::Data.into()), @@ -894,8 +904,13 @@ impl DefaultFunction { )), }, DefaultFunction::UnListData => match &args[0] { - Value::Con(inner) => { - let Constant::Data(PlutusData::Array(l)) = inner.as_ref() else {unreachable!()}; + v @ Value::Con(inner) => { + let Constant::Data(PlutusData::Array(l)) = inner.as_ref() else { + return Err(Error::DeserialisationError( + "UnListData".to_string(), + v.clone(), + )) + }; let value = Value::list( Type::Data, @@ -913,8 +928,13 @@ impl DefaultFunction { )), }, DefaultFunction::UnIData => match &args[0] { - Value::Con(inner) => { - let Constant::Data(PlutusData::BigInt(b)) = inner.as_ref() else {unreachable!()}; + v @ Value::Con(inner) => { + let Constant::Data(PlutusData::BigInt(b)) = inner.as_ref() else { + return Err(Error::DeserialisationError( + "UnIData".to_string(), + v.clone(), + )) + }; let value = Value::integer(from_pallas_bigint(b)); @@ -926,8 +946,13 @@ impl DefaultFunction { )), }, DefaultFunction::UnBData => match &args[0] { - Value::Con(inner) => { - let Constant::Data(PlutusData::BoundedBytes(b)) = inner.as_ref() else {unreachable!()}; + v @ Value::Con(inner) => { + let Constant::Data(PlutusData::BoundedBytes(b)) = inner.as_ref() else { + return Err(Error::DeserialisationError( + "UnBData".to_string(), + v.clone(), + )) + }; let value = Value::byte_string(b.to_vec());