fix: contemplate legacy tx outputs in utxo by address query (#386)

This commit is contained in:
Alexsander Falcucci 2024-01-29 14:19:47 +01:00 committed by GitHub
parent 5cf77c1c7b
commit 1798946e3f
3 changed files with 75 additions and 17 deletions

View file

@ -332,3 +332,34 @@ impl<C> minicbor::encode::Encode<C> for RationalNumber {
Ok(()) Ok(())
} }
} }
impl<'b, C> minicbor::decode::Decode<'b, C> for TransactionOutput {
fn decode(d: &mut minicbor::Decoder<'b>, ctx: &mut C) -> Result<Self, minicbor::decode::Error> {
match d.datatype()? {
minicbor::data::Type::Map => Ok(TransactionOutput::Current(d.decode_with(ctx)?)),
minicbor::data::Type::Array => Ok(TransactionOutput::Legacy(d.decode_with(ctx)?)),
_ => Err(minicbor::decode::Error::message(
"unknown cbor data type for TransactionOutput enum",
)),
}
}
}
impl<C> minicbor::encode::Encode<C> for TransactionOutput {
fn encode<W: minicbor::encode::Write>(
&self,
e: &mut minicbor::Encoder<W>,
ctx: &mut C,
) -> Result<(), minicbor::encode::Error<W::Error>> {
match self {
TransactionOutput::Current(map) => {
e.encode_with(map, ctx)?;
}
TransactionOutput::Legacy(array) => {
e.encode_with(array, ctx)?;
}
};
Ok(())
}
}

View file

@ -221,15 +221,21 @@ pub type Multiasset<A> = KeyValuePairs<PolicyId, KeyValuePairs<AssetName, A>>;
#[derive(Debug, Encode, Decode, PartialEq, Clone)] #[derive(Debug, Encode, Decode, PartialEq, Clone)]
pub struct UTxOByAddress { pub struct UTxOByAddress {
#[n(0)] #[n(0)]
pub utxo: KeyValuePairs<UTxO, Values>, pub utxo: KeyValuePairs<UTxO, TransactionOutput>,
} }
// Bytes CDDL -> #6.121([ * #6.121([ *datum ]) ]) // Bytes CDDL -> #6.121([ * #6.121([ *datum ]) ])
pub type Datum = (Era, TagWrap<Bytes, 24>); pub type Datum = (Era, TagWrap<Bytes, 24>);
#[derive(Debug, Encode, Decode, PartialEq, Clone)] #[derive(Debug, PartialEq, Eq, Clone)]
pub enum TransactionOutput {
Current(PostAlonsoTransactionOutput),
Legacy(LegacyTransactionOutput),
}
#[derive(Debug, Encode, Decode, PartialEq, Eq, Clone)]
#[cbor(map)] #[cbor(map)]
pub struct Values { pub struct PostAlonsoTransactionOutput {
#[n(0)] #[n(0)]
pub address: Bytes, pub address: Bytes,
@ -238,6 +244,21 @@ pub struct Values {
#[n(2)] #[n(2)]
pub inline_datum: Option<Datum>, pub inline_datum: Option<Datum>,
#[n(3)]
pub script_ref: Option<TagWrap<Bytes, 24>>,
}
#[derive(Debug, Encode, Decode, PartialEq, Eq, Clone)]
pub struct LegacyTransactionOutput {
#[n(0)]
pub address: Bytes,
#[n(1)]
pub amount: Value,
#[n(2)]
pub datum_hash: Option<Hash<32>>,
} }
#[derive(Debug, Encode, Decode, PartialEq, Clone, StdHash, Eq)] #[derive(Debug, Encode, Decode, PartialEq, Clone, StdHash, Eq)]

View file

@ -580,13 +580,16 @@ pub async fn local_state_query_server_and_client_happy_path() {
let datum = hex::decode(hex_datum).unwrap().into(); let datum = hex::decode(hex_datum).unwrap().into();
let tag = TagWrap::<_, 24>::new(datum); let tag = TagWrap::<_, 24>::new(datum);
let inline_datum = Some((1_u16, tag)); let inline_datum = Some((1_u16, tag));
let values = localstate::queries_v16::Values { let values = localstate::queries_v16::TransactionOutput::Current(
address: b"addr_test1vr80076l3x5uw6n94nwhgmv7ssgy6muzf47ugn6z0l92rhg2mgtu0" localstate::queries_v16::PostAlonsoTransactionOutput {
.to_vec() address: b"addr_test1vr80076l3x5uw6n94nwhgmv7ssgy6muzf47ugn6z0l92rhg2mgtu0"
.into(), .to_vec()
amount: Value::Coin(lovelace), .into(),
inline_datum, amount: Value::Coin(lovelace),
}; inline_datum,
script_ref: None,
},
);
let utxo = KeyValuePairs::from(vec![( let utxo = KeyValuePairs::from(vec![(
localstate::queries_v16::UTxO { localstate::queries_v16::UTxO {
@ -795,13 +798,16 @@ pub async fn local_state_query_server_and_client_happy_path() {
let datum = hex::decode(hex_datum).unwrap().into(); let datum = hex::decode(hex_datum).unwrap().into();
let tag = TagWrap::<_, 24>::new(datum); let tag = TagWrap::<_, 24>::new(datum);
let inline_datum = Some((1_u16, tag)); let inline_datum = Some((1_u16, tag));
let values = localstate::queries_v16::Values { let values = localstate::queries_v16::TransactionOutput::Current(
address: b"addr_test1vr80076l3x5uw6n94nwhgmv7ssgy6muzf47ugn6z0l92rhg2mgtu0" localstate::queries_v16::PostAlonsoTransactionOutput {
.to_vec() address: b"addr_test1vr80076l3x5uw6n94nwhgmv7ssgy6muzf47ugn6z0l92rhg2mgtu0"
.into(), .to_vec()
amount: Value::Coin(lovelace), .into(),
inline_datum, amount: Value::Coin(lovelace),
}; inline_datum,
script_ref: None,
},
);
let utxo = KeyValuePairs::from(vec![( let utxo = KeyValuePairs::from(vec![(
localstate::queries_v16::UTxO { localstate::queries_v16::UTxO {