fix(primitives): Force CBOR null primitive for missing aux data (#159)

This commit is contained in:
Santiago Carmuega 2022-08-05 07:26:06 -03:00 committed by GitHub
parent 737b0eee21
commit 60a6e99189
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 82 additions and 9 deletions

View file

@ -574,3 +574,67 @@ impl<C, T> minicbor::Encode<C> for KeepRaw<'_, T> {
.map_err(minicbor::encode::Error::write)
}
}
#[derive(Clone, Debug)]
pub enum Nullable<T> {
Some(T),
Null,
Undefined,
}
impl<'b, C, T> minicbor::Decode<'b, C> for Nullable<T>
where
T: minicbor::Decode<'b, C>,
{
fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
match d.datatype()? {
minicbor::data::Type::Null => {
d.null()?;
Ok(Self::Null)
}
minicbor::data::Type::Undefined => {
d.undefined()?;
Ok(Self::Undefined)
}
_ => {
let x = d.decode_with(ctx)?;
Ok(Self::Some(x))
}
}
}
}
impl<C, T> minicbor::Encode<C> for Nullable<T>
where
T: minicbor::Encode<C>,
{
fn encode<W: minicbor::encode::Write>(
&self,
e: &mut minicbor::Encoder<W>,
ctx: &mut C,
) -> Result<(), minicbor::encode::Error<W::Error>> {
match self {
Nullable::Some(x) => {
e.encode_with(x, ctx)?;
Ok(())
}
Nullable::Null => {
e.null()?;
Ok(())
}
Nullable::Undefined => {
e.undefined()?;
Ok(())
}
}
}
}
impl<T> From<Option<T>> for Nullable<T> {
fn from(x: Option<T>) -> Self {
match x {
Some(x) => Nullable::Some(x),
None => Nullable::Null,
}
}
}

View file

@ -5,7 +5,7 @@
use pallas_codec::minicbor::{bytes::ByteVec, data::Int, data::Tag, Decode, Encode};
use pallas_crypto::hash::Hash;
use pallas_codec::utils::{AnyUInt, KeepRaw, KeyValuePairs, MaybeIndefArray};
use pallas_codec::utils::{AnyUInt, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable};
// required for derive attrs to work
use pallas_codec::minicbor;
@ -1373,7 +1373,7 @@ pub struct Tx {
pub success: bool,
#[n(3)]
pub auxiliary_data: Option<AuxiliaryData>,
pub auxiliary_data: Nullable<AuxiliaryData>,
}
#[derive(Encode, Decode, Debug, Clone)]
@ -1388,7 +1388,7 @@ pub struct MintedTx<'b> {
pub success: bool,
#[n(3)]
pub auxiliary_data: Option<KeepRaw<'b, AuxiliaryData>>,
pub auxiliary_data: Nullable<KeepRaw<'b, AuxiliaryData>>,
}
#[cfg(test)]

View file

@ -5,7 +5,7 @@
use pallas_codec::minicbor::{bytes::ByteVec, Decode, Encode};
use pallas_crypto::hash::Hash;
use pallas_codec::utils::{CborWrap, KeepRaw, KeyValuePairs, MaybeIndefArray};
use pallas_codec::utils::{CborWrap, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable};
// required for derive attrs to work
use pallas_codec::minicbor;
@ -561,7 +561,7 @@ pub struct Tx {
pub success: bool,
#[n(3)]
pub auxiliary_data: Option<AuxiliaryData>,
pub auxiliary_data: Nullable<AuxiliaryData>,
}
#[derive(Encode, Decode, Debug, Clone)]
@ -576,7 +576,7 @@ pub struct MintedTx<'b> {
pub success: bool,
#[n(3)]
pub auxiliary_data: Option<KeepRaw<'b, AuxiliaryData>>,
pub auxiliary_data: Nullable<KeepRaw<'b, AuxiliaryData>>,
}
#[cfg(test)]

View file

@ -25,7 +25,8 @@ macro_rules! clone_tx_fn {
None
}
})
.cloned();
.cloned()
.into();
let x = $era::MintedTx {
transaction_body,

View file

@ -219,8 +219,16 @@ impl<'b> MultiEraTx<'b> {
fn aux_data(&self) -> Option<&KeepRaw<'_, AuxiliaryData>> {
match self {
MultiEraTx::AlonzoCompatible(x, _) => x.auxiliary_data.as_ref(),
MultiEraTx::Babbage(x) => x.auxiliary_data.as_ref(),
MultiEraTx::AlonzoCompatible(x, _) => match &x.auxiliary_data {
pallas_codec::utils::Nullable::Some(x) => Some(x),
pallas_codec::utils::Nullable::Null => None,
pallas_codec::utils::Nullable::Undefined => None,
},
MultiEraTx::Babbage(x) => match &x.auxiliary_data {
pallas_codec::utils::Nullable::Some(x) => Some(x),
pallas_codec::utils::Nullable::Null => None,
pallas_codec::utils::Nullable::Undefined => None,
},
MultiEraTx::Byron(_) => None,
}
}