feat(traverse): track original era for tx outputs (#447)

This commit is contained in:
Santiago Carmuega 2024-04-18 22:36:19 -03:00 committed by GitHub
parent 33fcec215d
commit 0b82bb702a
6 changed files with 35 additions and 24 deletions

View file

@ -284,7 +284,7 @@ fn check_collaterals_assets(
fn val_from_multi_era_output(multi_era_output: &MultiEraOutput) -> Value { fn val_from_multi_era_output(multi_era_output: &MultiEraOutput) -> Value {
match multi_era_output { match multi_era_output {
MultiEraOutput::Byron(output) => Value::Coin(output.amount), MultiEraOutput::Byron(output) => Value::Coin(output.amount),
MultiEraOutput::AlonzoCompatible(output) => output.amount.clone(), MultiEraOutput::AlonzoCompatible(output, _) => output.amount.clone(),
babbage_output => match babbage_output.as_babbage() { babbage_output => match babbage_output.as_babbage() {
Some(PseudoTransactionOutput::Legacy(output)) => output.amount.clone(), Some(PseudoTransactionOutput::Legacy(output)) => output.amount.clone(),
Some(PseudoTransactionOutput::PostAlonzo(output)) => output.value.clone(), Some(PseudoTransactionOutput::PostAlonzo(output)) => output.value.clone(),

View file

@ -686,12 +686,14 @@ mod alonzo_tests {
.unwrap(); .unwrap();
let multi_era_in: MultiEraInput = let multi_era_in: MultiEraInput =
MultiEraInput::AlonzoCompatible(Box::new(Cow::Owned(tx_in.clone()))); MultiEraInput::AlonzoCompatible(Box::new(Cow::Owned(tx_in.clone())));
let multi_era_out: MultiEraOutput = let multi_era_out: MultiEraOutput = MultiEraOutput::AlonzoCompatible(
MultiEraOutput::AlonzoCompatible(Box::new(Cow::Owned(TransactionOutput { Box::new(Cow::Owned(TransactionOutput {
address: Bytes::try_from(altered_address.to_hex()).unwrap(), address: Bytes::try_from(altered_address.to_hex()).unwrap(),
amount: Value::Coin(5000000), amount: Value::Coin(5000000),
datum_hash: None, datum_hash: None,
}))); })),
Era::Alonzo,
);
utxos.insert(multi_era_in, multi_era_out); utxos.insert(multi_era_in, multi_era_out);
let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo); let metx: MultiEraTx = MultiEraTx::from_alonzo_compatible(&mtx, Era::Alonzo);
let env: Environment = Environment { let env: Environment = Environment {

View file

@ -9,7 +9,7 @@ use pallas_primitives::{
}, },
byron::{Address, MintedTxPayload, Tx, TxOut}, byron::{Address, MintedTxPayload, Tx, TxOut},
}; };
use pallas_traverse::{MultiEraInput, MultiEraOutput}; use pallas_traverse::{Era, MultiEraInput, MultiEraOutput};
use std::{borrow::Cow, iter::zip, vec::Vec}; use std::{borrow::Cow, iter::zip, vec::Vec};
use pallas_codec::utils::{Bytes, CborWrap}; use pallas_codec::utils::{Bytes, CborWrap};
@ -74,7 +74,7 @@ pub fn mk_utxo_for_alonzo_compatible_tx<'a>(
datum_hash: *datum_hash, datum_hash: *datum_hash,
}; };
let multi_era_out: MultiEraOutput = let multi_era_out: MultiEraOutput =
MultiEraOutput::AlonzoCompatible(Box::new(Cow::Owned(tx_out))); MultiEraOutput::AlonzoCompatible(Box::new(Cow::Owned(tx_out)), Era::Alonzo);
utxos.insert(multi_era_in, multi_era_out); utxos.insert(multi_era_in, multi_era_out);
} }
utxos utxos
@ -134,7 +134,7 @@ pub fn add_collateral_alonzo<'a>(
let multi_era_in: MultiEraInput = let multi_era_in: MultiEraInput =
MultiEraInput::AlonzoCompatible(Box::new(Cow::Owned(tx_in.clone()))); MultiEraInput::AlonzoCompatible(Box::new(Cow::Owned(tx_in.clone())));
let multi_era_out: MultiEraOutput = let multi_era_out: MultiEraOutput =
MultiEraOutput::AlonzoCompatible(Box::new(Cow::Owned(tx_out))); MultiEraOutput::AlonzoCompatible(Box::new(Cow::Owned(tx_out)), Era::Alonzo);
utxos.insert(multi_era_in, multi_era_out); utxos.insert(multi_era_in, multi_era_out);
} }
} }

View file

@ -86,10 +86,10 @@ pub enum MultiEraTx<'b> {
Conway(Box<Cow<'b, conway::MintedTx<'b>>>), Conway(Box<Cow<'b, conway::MintedTx<'b>>>),
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive] #[non_exhaustive]
pub enum MultiEraOutput<'b> { pub enum MultiEraOutput<'b> {
AlonzoCompatible(Box<Cow<'b, alonzo::TransactionOutput>>), AlonzoCompatible(Box<Cow<'b, alonzo::TransactionOutput>>, Era),
Babbage(Box<Cow<'b, babbage::MintedTransactionOutput<'b>>>), Babbage(Box<Cow<'b, babbage::MintedTransactionOutput<'b>>>),
Conway(Box<Cow<'b, conway::MintedTransactionOutput<'b>>>), Conway(Box<Cow<'b, conway::MintedTransactionOutput<'b>>>),
Byron(Box<Cow<'b, byron::TxOut>>), Byron(Box<Cow<'b, byron::TxOut>>),

View file

@ -11,8 +11,8 @@ impl<'b> MultiEraOutput<'b> {
Self::Byron(Box::new(Cow::Borrowed(output))) Self::Byron(Box::new(Cow::Borrowed(output)))
} }
pub fn from_alonzo_compatible(output: &'b alonzo::TransactionOutput) -> Self { pub fn from_alonzo_compatible(output: &'b alonzo::TransactionOutput, era: Era) -> Self {
Self::AlonzoCompatible(Box::new(Cow::Borrowed(output))) Self::AlonzoCompatible(Box::new(Cow::Borrowed(output)), era)
} }
pub fn from_babbage(output: &'b babbage::MintedTransactionOutput<'b>) -> Self { pub fn from_babbage(output: &'b babbage::MintedTransactionOutput<'b>) -> Self {
@ -25,7 +25,7 @@ impl<'b> MultiEraOutput<'b> {
pub fn datum(&self) -> Option<babbage::MintedDatumOption> { pub fn datum(&self) -> Option<babbage::MintedDatumOption> {
match self { match self {
MultiEraOutput::AlonzoCompatible(x) => { MultiEraOutput::AlonzoCompatible(x, _) => {
x.datum_hash.map(babbage::MintedDatumOption::Hash) x.datum_hash.map(babbage::MintedDatumOption::Hash)
} }
MultiEraOutput::Babbage(x) => match x.deref().deref() { MultiEraOutput::Babbage(x) => match x.deref().deref() {
@ -46,7 +46,7 @@ impl<'b> MultiEraOutput<'b> {
pub fn script_ref(&self) -> Option<conway::MintedScriptRef> { pub fn script_ref(&self) -> Option<conway::MintedScriptRef> {
match &self { match &self {
MultiEraOutput::AlonzoCompatible(_) => None, MultiEraOutput::AlonzoCompatible(..) => None,
MultiEraOutput::Babbage(x) => match x.deref().deref() { MultiEraOutput::Babbage(x) => match x.deref().deref() {
babbage::MintedTransactionOutput::Legacy(_) => None, babbage::MintedTransactionOutput::Legacy(_) => None,
babbage::MintedTransactionOutput::PostAlonzo(x) => { babbage::MintedTransactionOutput::PostAlonzo(x) => {
@ -65,7 +65,7 @@ impl<'b> MultiEraOutput<'b> {
pub fn address(&self) -> Result<Address, AddressError> { pub fn address(&self) -> Result<Address, AddressError> {
match self { match self {
MultiEraOutput::AlonzoCompatible(x) => Address::from_bytes(&x.address), MultiEraOutput::AlonzoCompatible(x, _) => Address::from_bytes(&x.address),
MultiEraOutput::Babbage(x) => match x.deref().deref() { MultiEraOutput::Babbage(x) => match x.deref().deref() {
babbage::MintedTransactionOutput::Legacy(x) => Address::from_bytes(&x.address), babbage::MintedTransactionOutput::Legacy(x) => Address::from_bytes(&x.address),
babbage::MintedTransactionOutput::PostAlonzo(x) => Address::from_bytes(&x.address), babbage::MintedTransactionOutput::PostAlonzo(x) => Address::from_bytes(&x.address),
@ -82,7 +82,7 @@ impl<'b> MultiEraOutput<'b> {
pub fn as_alonzo(&self) -> Option<&alonzo::TransactionOutput> { pub fn as_alonzo(&self) -> Option<&alonzo::TransactionOutput> {
match self { match self {
MultiEraOutput::AlonzoCompatible(x) => Some(x), MultiEraOutput::AlonzoCompatible(x, _) => Some(x),
MultiEraOutput::Babbage(_) => None, MultiEraOutput::Babbage(_) => None,
MultiEraOutput::Byron(_) => None, MultiEraOutput::Byron(_) => None,
MultiEraOutput::Conway(_) => None, MultiEraOutput::Conway(_) => None,
@ -91,7 +91,7 @@ impl<'b> MultiEraOutput<'b> {
pub fn as_babbage(&self) -> Option<&babbage::MintedTransactionOutput> { pub fn as_babbage(&self) -> Option<&babbage::MintedTransactionOutput> {
match self { match self {
MultiEraOutput::AlonzoCompatible(_) => None, MultiEraOutput::AlonzoCompatible(..) => None,
MultiEraOutput::Babbage(x) => Some(x), MultiEraOutput::Babbage(x) => Some(x),
MultiEraOutput::Byron(_) => None, MultiEraOutput::Byron(_) => None,
MultiEraOutput::Conway(_) => None, MultiEraOutput::Conway(_) => None,
@ -100,7 +100,7 @@ impl<'b> MultiEraOutput<'b> {
pub fn as_byron(&self) -> Option<&byron::TxOut> { pub fn as_byron(&self) -> Option<&byron::TxOut> {
match self { match self {
MultiEraOutput::AlonzoCompatible(_) => None, MultiEraOutput::AlonzoCompatible(..) => None,
MultiEraOutput::Babbage(_) => None, MultiEraOutput::Babbage(_) => None,
MultiEraOutput::Byron(x) => Some(x), MultiEraOutput::Byron(x) => Some(x),
MultiEraOutput::Conway(_) => None, MultiEraOutput::Conway(_) => None,
@ -109,17 +109,26 @@ impl<'b> MultiEraOutput<'b> {
pub fn as_conway(&self) -> Option<&conway::MintedTransactionOutput> { pub fn as_conway(&self) -> Option<&conway::MintedTransactionOutput> {
match self { match self {
MultiEraOutput::AlonzoCompatible(_) => None, MultiEraOutput::AlonzoCompatible(..) => None,
MultiEraOutput::Babbage(_) => None, MultiEraOutput::Babbage(_) => None,
MultiEraOutput::Byron(_) => None, MultiEraOutput::Byron(_) => None,
MultiEraOutput::Conway(x) => Some(x), MultiEraOutput::Conway(x) => Some(x),
} }
} }
pub fn era(&self) -> Era {
match self {
MultiEraOutput::AlonzoCompatible(_, x) => *x,
MultiEraOutput::Babbage(_) => Era::Babbage,
MultiEraOutput::Conway(_) => Era::Conway,
MultiEraOutput::Byron(_) => Era::Byron,
}
}
pub fn encode(&self) -> Vec<u8> { pub fn encode(&self) -> Vec<u8> {
// to_vec is infallible // to_vec is infallible
match self { match self {
Self::AlonzoCompatible(x) => minicbor::to_vec(x).unwrap(), Self::AlonzoCompatible(x, _) => minicbor::to_vec(x).unwrap(),
Self::Babbage(x) => minicbor::to_vec(x).unwrap(), Self::Babbage(x) => minicbor::to_vec(x).unwrap(),
Self::Byron(x) => minicbor::to_vec(x).unwrap(), Self::Byron(x) => minicbor::to_vec(x).unwrap(),
Self::Conway(x) => minicbor::to_vec(x).unwrap(), Self::Conway(x) => minicbor::to_vec(x).unwrap(),
@ -136,7 +145,7 @@ impl<'b> MultiEraOutput<'b> {
Era::Shelley | Era::Allegra | Era::Mary | Era::Alonzo => { Era::Shelley | Era::Allegra | Era::Mary | Era::Alonzo => {
let tx = minicbor::decode(cbor)?; let tx = minicbor::decode(cbor)?;
let tx = Box::new(Cow::Owned(tx)); let tx = Box::new(Cow::Owned(tx));
Ok(Self::AlonzoCompatible(tx)) Ok(Self::AlonzoCompatible(tx, era))
} }
Era::Babbage => { Era::Babbage => {
let tx = minicbor::decode(cbor)?; let tx = minicbor::decode(cbor)?;
@ -158,7 +167,7 @@ impl<'b> MultiEraOutput<'b> {
/// lovelace). /// lovelace).
pub fn lovelace_amount(&self) -> u64 { pub fn lovelace_amount(&self) -> u64 {
match self { match self {
MultiEraOutput::AlonzoCompatible(x) => match x.amount { MultiEraOutput::AlonzoCompatible(x, _) => match x.amount {
alonzo::Value::Coin(c) => c, alonzo::Value::Coin(c) => c,
alonzo::Value::Multiasset(c, _) => c, alonzo::Value::Multiasset(c, _) => c,
}, },
@ -193,7 +202,7 @@ impl<'b> MultiEraOutput<'b> {
/// list. /// list.
pub fn non_ada_assets(&self) -> Vec<MultiEraPolicyAssets> { pub fn non_ada_assets(&self) -> Vec<MultiEraPolicyAssets> {
match self { match self {
MultiEraOutput::AlonzoCompatible(x) => match &x.amount { MultiEraOutput::AlonzoCompatible(x, _) => match &x.amount {
alonzo::Value::Coin(_) => vec![], alonzo::Value::Coin(_) => vec![],
alonzo::Value::Multiasset(_, x) => x alonzo::Value::Multiasset(_, x) => x
.iter() .iter()

View file

@ -116,7 +116,7 @@ impl<'b> MultiEraTx<'b> {
.transaction_body .transaction_body
.outputs .outputs
.iter() .iter()
.map(MultiEraOutput::from_alonzo_compatible) .map(|x| MultiEraOutput::from_alonzo_compatible(x, self.era()))
.collect(), .collect(),
MultiEraTx::Babbage(x) => x MultiEraTx::Babbage(x) => x
.transaction_body .transaction_body
@ -145,7 +145,7 @@ impl<'b> MultiEraTx<'b> {
.transaction_body .transaction_body
.outputs .outputs
.get(index) .get(index)
.map(MultiEraOutput::from_alonzo_compatible), .map(|x| MultiEraOutput::from_alonzo_compatible(x, self.era())),
MultiEraTx::Babbage(x) => x MultiEraTx::Babbage(x) => x
.transaction_body .transaction_body
.outputs .outputs