Simplify optional datum extraction by removing duplication

This commit is contained in:
KtorZ 2024-09-12 17:19:17 +02:00
parent defce9be4e
commit 8a3bbfc89a
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
1 changed files with 13 additions and 22 deletions

View File

@ -1,7 +1,4 @@
use super::{ use super::{to_plutus_data::MintValue, Error};
to_plutus_data::{MintValue, ToPlutusData},
Error,
};
use itertools::Itertools; use itertools::Itertools;
use pallas_addresses::{Address, Network, StakePayload}; use pallas_addresses::{Address, Network, StakePayload};
use pallas_codec::utils::{ use pallas_codec::utils::{
@ -834,23 +831,13 @@ pub fn find_script(
let lookup_datum = |datum: Option<DatumOption>| match datum { let lookup_datum = |datum: Option<DatumOption>| match datum {
Some(DatumOption::Hash(hash)) => match lookup_table.datum.get(&hash) { Some(DatumOption::Hash(hash)) => match lookup_table.datum.get(&hash) {
Some(d) => Ok(d.clone()), Some(d) => Ok(Some(d.clone())),
None => Err(Error::MissingRequiredDatum { None => Err(Error::MissingRequiredDatum {
hash: hash.to_string(), hash: hash.to_string(),
}), }),
}, },
Some(DatumOption::Data(data)) => Ok(data.0.clone()), Some(DatumOption::Data(data)) => Ok(Some(data.0.clone())),
_ => Err(Error::MissingRequiredInlineDatumOrHash), None => Ok(None),
};
let lookup_datum_v3 = |datum: Option<DatumOption>| match datum {
Some(DatumOption::Hash(hash)) => match lookup_table.datum.get(&hash) {
Some(d) => Ok(d.clone()),
None => Err(Error::MissingRequiredDatum {
hash: hash.to_string(),
}),
},
Some(DatumOption::Data(data)) => Ok(data.0.clone()),
_ => Ok(None::<PlutusData>.to_plutus_data()),
}; };
match redeemer.tag { match redeemer.tag {
@ -922,11 +909,15 @@ pub fn find_script(
Address::Shelley(shelley_address) => { Address::Shelley(shelley_address) => {
let hash = shelley_address.payment().as_hash(); let hash = shelley_address.payment().as_hash();
let (script, _) = lookup_script(hash)?; let (script, _) = lookup_script(hash)?;
let datum = match script { let datum = lookup_datum(output_datum(&input.resolved))?;
ScriptVersion::V3(_) => lookup_datum_v3(output_datum(&input.resolved)),
_ => lookup_datum(output_datum(&input.resolved)), if datum.is_none()
}?; && matches!(script, ScriptVersion::V1(..) | ScriptVersion::V2(..))
Ok((script, Some(datum))) {
return Err(Error::MissingRequiredInlineDatumOrHash);
}
Ok((script, datum))
} }
_ => Err(Error::NonScriptStakeCredential), _ => Err(Error::NonScriptStakeCredential),
}), }),