Skip to content

Commit

Permalink
fix: return witness objects for conway era multieratx (#346)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmhrpr authored Jan 2, 2024
1 parent 35e0d54 commit afa397f
Show file tree
Hide file tree
Showing 8 changed files with 171 additions and 103 deletions.
6 changes: 4 additions & 2 deletions pallas-primitives/src/alonzo/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1293,7 +1293,7 @@ pub struct MintedWitnessSet<'b> {
pub vkeywitness: Option<Vec<VKeyWitness>>,

#[n(1)]
pub native_script: Option<Vec<NativeScript>>,
pub native_script: Option<Vec<KeepRaw<'b, NativeScript>>>,

#[n(2)]
pub bootstrap_witness: Option<Vec<BootstrapWitness>>,
Expand All @@ -1312,7 +1312,9 @@ impl<'b> From<MintedWitnessSet<'b>> for WitnessSet {
fn from(x: MintedWitnessSet<'b>) -> Self {
WitnessSet {
vkeywitness: x.vkeywitness,
native_script: x.native_script,
native_script: x
.native_script
.map(|x| x.into_iter().map(|x| x.unwrap()).collect()),
bootstrap_witness: x.bootstrap_witness,
plutus_script: x.plutus_script,
plutus_data: x
Expand Down
50 changes: 35 additions & 15 deletions pallas-primitives/src/babbage/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ impl<'b> From<MintedTransactionOutput<'b>> for TransactionOutput {

#[derive(Encode, Decode, Debug, PartialEq, Clone)]
#[cbor(map)]
pub struct PseudoPostAlonzoTransactionOutput<T1> {
pub struct PseudoPostAlonzoTransactionOutput<T1, T2> {
#[n(0)]
pub address: Bytes,

Expand All @@ -381,21 +381,21 @@ pub struct PseudoPostAlonzoTransactionOutput<T1> {
pub datum_option: Option<T1>,

#[n(3)]
pub script_ref: Option<ScriptRef>,
pub script_ref: Option<CborWrap<T2>>,
}

pub type PostAlonzoTransactionOutput = PseudoPostAlonzoTransactionOutput<DatumOption>;
pub type PostAlonzoTransactionOutput = PseudoPostAlonzoTransactionOutput<DatumOption, ScriptRef>;

pub type MintedPostAlonzoTransactionOutput<'b> =
PseudoPostAlonzoTransactionOutput<MintedDatumOption<'b>>;
PseudoPostAlonzoTransactionOutput<MintedDatumOption<'b>, MintedScriptRef<'b>>;

impl<'b> From<MintedPostAlonzoTransactionOutput<'b>> for PostAlonzoTransactionOutput {
fn from(value: MintedPostAlonzoTransactionOutput<'b>) -> Self {
Self {
address: value.address,
value: value.value,
datum_option: value.datum_option.map(|x| x.into()),
script_ref: value.script_ref,
script_ref: value.script_ref.map(|x| CborWrap(x.unwrap().into())),
}
}
}
Expand Down Expand Up @@ -464,7 +464,7 @@ pub struct MintedWitnessSet<'b> {
pub vkeywitness: Option<Vec<VKeyWitness>>,

#[n(1)]
pub native_script: Option<Vec<NativeScript>>,
pub native_script: Option<Vec<KeepRaw<'b, NativeScript>>>,

#[n(2)]
pub bootstrap_witness: Option<Vec<BootstrapWitness>>,
Expand All @@ -486,7 +486,9 @@ impl<'b> From<MintedWitnessSet<'b>> for WitnessSet {
fn from(x: MintedWitnessSet<'b>) -> Self {
WitnessSet {
vkeywitness: x.vkeywitness,
native_script: x.native_script,
native_script: x
.native_script
.map(|x| x.into_iter().map(|x| x.unwrap()).collect()),
bootstrap_witness: x.bootstrap_witness,
plutus_v1_script: x.plutus_v1_script,
plutus_data: x
Expand Down Expand Up @@ -573,18 +575,33 @@ impl<'b> From<MintedDatumOption<'b>> for DatumOption {
}
}

// script_ref = #6.24(bytes .cbor script)
pub type ScriptRef = CborWrap<Script>;

// script = [ 0, native_script // 1, plutus_v1_script // 2, plutus_v2_script ]
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub enum Script {
NativeScript(NativeScript),
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum PseudoScript<T1> {
NativeScript(T1),
PlutusV1Script(PlutusV1Script),
PlutusV2Script(PlutusV2Script),
}

impl<'b, C> minicbor::Decode<'b, C> for Script {
// script_ref = #6.24(bytes .cbor script)
pub type ScriptRef = PseudoScript<NativeScript>;

pub type MintedScriptRef<'b> = PseudoScript<KeepRaw<'b, NativeScript>>;

impl<'b> From<MintedScriptRef<'b>> for ScriptRef {
fn from(value: MintedScriptRef<'b>) -> Self {
match value {
PseudoScript::NativeScript(x) => Self::NativeScript(x.unwrap()),
PseudoScript::PlutusV1Script(x) => Self::PlutusV1Script(x),
PseudoScript::PlutusV2Script(x) => Self::PlutusV2Script(x),
}
}
}

impl<'b, C, T> minicbor::Decode<'b, C> for PseudoScript<T>
where
T: minicbor::Decode<'b, ()>,
{
fn decode(
d: &mut minicbor::Decoder<'b>,
_ctx: &mut C,
Expand All @@ -602,7 +619,10 @@ impl<'b, C> minicbor::Decode<'b, C> for Script {
}
}

impl<C> minicbor::Encode<C> for Script {
impl<C, T> minicbor::Encode<C> for PseudoScript<T>
where
T: minicbor::Encode<C>,
{
fn encode<W: minicbor::encode::Write>(
&self,
e: &mut minicbor::Encoder<W>,
Expand Down
100 changes: 35 additions & 65 deletions pallas-primitives/src/conway/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize};
use pallas_codec::minicbor::{Decode, Encode};
use pallas_crypto::hash::Hash;

use pallas_codec::utils::{Bytes, CborWrap, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable};
use pallas_codec::utils::{Bytes, KeepRaw, KeyValuePairs, MaybeIndefArray, Nullable};

// required for derive attrs to work
use pallas_codec::minicbor;
Expand Down Expand Up @@ -1250,7 +1250,7 @@ pub struct WitnessSet {
pub plutus_v2_script: Option<Vec<PlutusV2Script>>,

#[n(7)]
pub plutus_v3_script: Option<Vec<PlutusV2Script>>,
pub plutus_v3_script: Option<Vec<PlutusV3Script>>,
}

#[derive(Encode, Decode, Debug, PartialEq, Clone)]
Expand All @@ -1260,7 +1260,7 @@ pub struct MintedWitnessSet<'b> {
pub vkeywitness: Option<Vec<VKeyWitness>>,

#[n(1)]
pub native_script: Option<Vec<NativeScript>>,
pub native_script: Option<Vec<KeepRaw<'b, NativeScript>>>,

#[n(2)]
pub bootstrap_witness: Option<Vec<BootstrapWitness>>,
Expand All @@ -1278,14 +1278,16 @@ pub struct MintedWitnessSet<'b> {
pub plutus_v2_script: Option<Vec<PlutusV2Script>>,

#[n(7)]
pub plutus_v3_script: Option<Vec<PlutusV2Script>>,
pub plutus_v3_script: Option<Vec<PlutusV3Script>>,
}

impl<'b> From<MintedWitnessSet<'b>> for WitnessSet {
fn from(x: MintedWitnessSet<'b>) -> Self {
WitnessSet {
vkeywitness: x.vkeywitness,
native_script: x.native_script,
native_script: x
.native_script
.map(|x| x.into_iter().map(|x| x.unwrap()).collect()),
bootstrap_witness: x.bootstrap_witness,
plutus_v1_script: x.plutus_v1_script,
plutus_data: x
Expand Down Expand Up @@ -1317,78 +1319,43 @@ pub struct PostAlonzoAuxiliaryData {
pub plutus_v3_scripts: Option<Vec<PlutusV3Script>>,
}

pub type DatumHash = Hash<32>;

//pub type Data = CborWrap<PlutusData>;

// datum_option = [ 0, $hash32 // 1, data ]
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum PseudoDatumOption<T1> {
Hash(Hash<32>),
Data(CborWrap<T1>),
}
pub use crate::babbage::DatumHash;

impl<'b, C, T> minicbor::Decode<'b, C> for PseudoDatumOption<T>
where
T: minicbor::Decode<'b, C>,
{
fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
d.array()?;
pub use crate::babbage::PseudoDatumOption;

match d.u8()? {
0 => Ok(Self::Hash(d.decode_with(ctx)?)),
1 => Ok(Self::Data(d.decode_with(ctx)?)),
_ => Err(minicbor::decode::Error::message(
"invalid variant for datum option enum",
)),
}
}
}
pub use crate::babbage::DatumOption;

impl<C, T> minicbor::Encode<C> for PseudoDatumOption<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 {
Self::Hash(x) => e.encode_with((0, x), ctx)?,
Self::Data(x) => e.encode_with((1, x), ctx)?,
};
pub use crate::babbage::MintedDatumOption;

Ok(())
}
// script = [ 0, native_script // 1, plutus_v1_script // 2, plutus_v2_script ]
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum PseudoScript<T1> {
NativeScript(T1),
PlutusV1Script(PlutusV1Script),
PlutusV2Script(PlutusV2Script),
PlutusV3Script(PlutusV3Script),
}

pub type DatumOption = PseudoDatumOption<PlutusData>;
// script_ref = #6.24(bytes .cbor script)
pub type ScriptRef = PseudoScript<NativeScript>;

pub type MintedDatumOption<'b> = PseudoDatumOption<KeepRaw<'b, PlutusData>>;
pub type MintedScriptRef<'b> = PseudoScript<KeepRaw<'b, NativeScript>>;

impl<'b> From<MintedDatumOption<'b>> for DatumOption {
fn from(value: MintedDatumOption<'b>) -> Self {
impl<'b> From<MintedScriptRef<'b>> for ScriptRef {
fn from(value: MintedScriptRef<'b>) -> Self {
match value {
PseudoDatumOption::Hash(x) => Self::Hash(x),
PseudoDatumOption::Data(x) => Self::Data(CborWrap(x.unwrap().unwrap())),
PseudoScript::NativeScript(x) => Self::NativeScript(x.unwrap()),
PseudoScript::PlutusV1Script(x) => Self::PlutusV1Script(x),
PseudoScript::PlutusV2Script(x) => Self::PlutusV2Script(x),
PseudoScript::PlutusV3Script(x) => Self::PlutusV3Script(x),
}
}
}

// script_ref = #6.24(bytes .cbor script)
pub type ScriptRef = CborWrap<Script>;

// script = [ 0, native_script // 1, plutus_v1_script // 2, plutus_v2_script ]
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub enum Script {
NativeScript(NativeScript),
PlutusV1Script(PlutusV1Script),
PlutusV2Script(PlutusV2Script),
PlutusV3Script(PlutusV3Script),
}

impl<'b, C> minicbor::Decode<'b, C> for Script {
impl<'b, C, T> minicbor::Decode<'b, C> for PseudoScript<T>
where
T: minicbor::Decode<'b, ()>,
{
fn decode(
d: &mut minicbor::Decoder<'b>,
_ctx: &mut C,
Expand All @@ -1407,7 +1374,10 @@ impl<'b, C> minicbor::Decode<'b, C> for Script {
}
}

impl<C> minicbor::Encode<C> for Script {
impl<C, T> minicbor::Encode<C> for PseudoScript<T>
where
T: minicbor::Encode<C>,
{
fn encode<W: minicbor::encode::Write>(
&self,
e: &mut minicbor::Encoder<W>,
Expand Down
6 changes: 6 additions & 0 deletions pallas-traverse/src/hashes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ impl ComputeHash<28> for alonzo::NativeScript {
}
}

impl OriginalHash<28> for KeepRaw<'_, alonzo::NativeScript> {
fn original_hash(&self) -> Hash<28> {
Hasher::<224>::hash_tagged(self.raw_cbor(), 0)
}
}

impl ComputeHash<28> for alonzo::PlutusScript {
fn compute_hash(&self) -> Hash<28> {
Hasher::<224>::hash_tagged(&self.0, 1)
Expand Down
6 changes: 4 additions & 2 deletions pallas-traverse/src/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@ impl<'b> MultiEraOutput<'b> {
}
}

pub fn script_ref(&self) -> Option<&babbage::ScriptRef> {
pub fn script_ref(&self) -> Option<babbage::MintedScriptRef> {
match &self {
MultiEraOutput::Babbage(x) => match x.deref().deref() {
babbage::MintedTransactionOutput::Legacy(_) => None,
babbage::MintedTransactionOutput::PostAlonzo(x) => x.script_ref.as_ref(),
babbage::MintedTransactionOutput::PostAlonzo(x) => {
x.script_ref.clone().map(|x| x.unwrap())
}
},
_ => None,
}
Expand Down
Loading

0 comments on commit afa397f

Please sign in to comment.