moved cost_mdls language determination into eval_redeemer
This commit is contained in:
parent
472cea6c41
commit
6619a0e431
|
@ -1,5 +1,5 @@
|
||||||
use pallas_primitives::{
|
use pallas_primitives::{
|
||||||
babbage::{CostMdls, Language, MintedTx, Redeemer, TransactionInput, TransactionOutput},
|
babbage::{CostMdls, MintedTx, Redeemer, TransactionInput, TransactionOutput},
|
||||||
Fragment,
|
Fragment,
|
||||||
};
|
};
|
||||||
use pallas_traverse::{Era, MultiEraTx};
|
use pallas_traverse::{Era, MultiEraTx};
|
||||||
|
@ -16,42 +16,28 @@ pub fn eval_tx(
|
||||||
tx: &MintedTx,
|
tx: &MintedTx,
|
||||||
utxos: &[ResolvedInput],
|
utxos: &[ResolvedInput],
|
||||||
cost_mdls: &CostMdls,
|
cost_mdls: &CostMdls,
|
||||||
version: &Language,
|
|
||||||
slot_config: &SlotConfig,
|
slot_config: &SlotConfig,
|
||||||
) -> anyhow::Result<Vec<Redeemer>> {
|
) -> anyhow::Result<Vec<Redeemer>> {
|
||||||
let redeemers = tx.transaction_witness_set.redeemer.as_ref();
|
let redeemers = tx.transaction_witness_set.redeemer.as_ref();
|
||||||
|
|
||||||
let lookup_table = eval::get_script_and_datum_lookup_table(tx, utxos);
|
let lookup_table = eval::get_script_and_datum_lookup_table(tx, utxos);
|
||||||
|
|
||||||
let costs_maybe = match version {
|
match redeemers {
|
||||||
Language::PlutusV1 => cost_mdls.plutus_v1.as_ref(),
|
Some(rs) => {
|
||||||
Language::PlutusV2 => cost_mdls.plutus_v2.as_ref(),
|
let mut collected_redeemers = vec![];
|
||||||
};
|
for redeemer in rs.iter() {
|
||||||
|
collected_redeemers.push(eval::eval_redeemer(
|
||||||
if let Some(costs) = costs_maybe {
|
tx,
|
||||||
match redeemers {
|
utxos,
|
||||||
Some(rs) => {
|
slot_config,
|
||||||
let mut collected_redeemers = vec![];
|
redeemer,
|
||||||
for redeemer in rs.iter() {
|
&lookup_table,
|
||||||
collected_redeemers.push(eval::eval_redeemer(
|
cost_mdls,
|
||||||
tx,
|
)?)
|
||||||
utxos,
|
|
||||||
slot_config,
|
|
||||||
redeemer,
|
|
||||||
&lookup_table,
|
|
||||||
version,
|
|
||||||
costs,
|
|
||||||
)?)
|
|
||||||
}
|
|
||||||
Ok(collected_redeemers)
|
|
||||||
}
|
}
|
||||||
None => Ok(vec![]),
|
Ok(collected_redeemers)
|
||||||
}
|
}
|
||||||
} else {
|
None => Ok(vec![]),
|
||||||
Err(anyhow::Error::msg(format!(
|
|
||||||
"Missing cost model for version: {:?}",
|
|
||||||
version
|
|
||||||
)))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +45,6 @@ pub fn eval_tx_raw(
|
||||||
tx_bytes: &[u8],
|
tx_bytes: &[u8],
|
||||||
utxos_bytes: &[(Vec<u8>, Vec<u8>)],
|
utxos_bytes: &[(Vec<u8>, Vec<u8>)],
|
||||||
cost_mdls_bytes: &[u8],
|
cost_mdls_bytes: &[u8],
|
||||||
version_bytes: u32,
|
|
||||||
slot_config: (u64, u64),
|
slot_config: (u64, u64),
|
||||||
) -> Result<Vec<Vec<u8>>, Error> {
|
) -> Result<Vec<Vec<u8>>, Error> {
|
||||||
let multi_era_tx = MultiEraTx::decode(Era::Babbage, tx_bytes)
|
let multi_era_tx = MultiEraTx::decode(Era::Babbage, tx_bytes)
|
||||||
|
@ -82,14 +67,8 @@ pub fn eval_tx_raw(
|
||||||
slot_length: slot_config.1,
|
slot_length: slot_config.1,
|
||||||
};
|
};
|
||||||
|
|
||||||
let version = match version_bytes {
|
|
||||||
1 => Language::PlutusV1,
|
|
||||||
2 => Language::PlutusV2,
|
|
||||||
_ => unreachable!(),
|
|
||||||
};
|
|
||||||
|
|
||||||
match multi_era_tx {
|
match multi_era_tx {
|
||||||
MultiEraTx::Babbage(tx) => match eval_tx(&tx, &utxos, &cost_mdls, &version, &sc) {
|
MultiEraTx::Babbage(tx) => match eval_tx(&tx, &utxos, &cost_mdls, &sc) {
|
||||||
Ok(redeemers) => Ok(redeemers
|
Ok(redeemers) => Ok(redeemers
|
||||||
.iter()
|
.iter()
|
||||||
.map(|r| r.encode_fragment().unwrap())
|
.map(|r| r.encode_fragment().unwrap())
|
||||||
|
@ -112,7 +91,7 @@ pub fn eval_tx_raw(
|
||||||
mod tests {
|
mod tests {
|
||||||
use pallas_codec::utils::MaybeIndefArray;
|
use pallas_codec::utils::MaybeIndefArray;
|
||||||
use pallas_primitives::{
|
use pallas_primitives::{
|
||||||
babbage::{CostMdls, Language, TransactionInput, TransactionOutput},
|
babbage::{CostMdls, TransactionInput, TransactionOutput},
|
||||||
Fragment,
|
Fragment,
|
||||||
};
|
};
|
||||||
use pallas_traverse::{Era, MultiEraTx};
|
use pallas_traverse::{Era, MultiEraTx};
|
||||||
|
@ -343,8 +322,7 @@ mod tests {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
match multi_era_tx {
|
match multi_era_tx {
|
||||||
MultiEraTx::Babbage(tx) => {
|
MultiEraTx::Babbage(tx) => {
|
||||||
let redeemers =
|
let redeemers = eval_tx(&tx, &utxos, &cost_mdl, &slot_config).unwrap();
|
||||||
eval_tx(&tx, &utxos, &cost_mdl, &Language::PlutusV2, &slot_config).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(redeemers.len(), 1)
|
assert_eq!(redeemers.len(), 1)
|
||||||
}
|
}
|
||||||
|
@ -578,8 +556,7 @@ mod tests {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
match multi_era_tx {
|
match multi_era_tx {
|
||||||
MultiEraTx::Babbage(tx) => {
|
MultiEraTx::Babbage(tx) => {
|
||||||
let redeemers =
|
let redeemers = eval_tx(&tx, &utxos, &cost_mdl, &slot_config).unwrap();
|
||||||
eval_tx(&tx, &utxos, &cost_mdl, &Language::PlutusV2, &slot_config).unwrap();
|
|
||||||
|
|
||||||
println!("{:?}", redeemers.len());
|
println!("{:?}", redeemers.len());
|
||||||
}
|
}
|
||||||
|
@ -649,8 +626,7 @@ mod tests {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
match multi_era_tx {
|
match multi_era_tx {
|
||||||
MultiEraTx::Babbage(tx) => {
|
MultiEraTx::Babbage(tx) => {
|
||||||
let redeemers =
|
let redeemers = eval_tx(&tx, &utxos, &cost_mdl, &slot_config).unwrap();
|
||||||
eval_tx(&tx, &utxos, &cost_mdl, &Language::PlutusV1, &slot_config).unwrap();
|
|
||||||
|
|
||||||
println!("{:?}", redeemers.len());
|
println!("{:?}", redeemers.len());
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,9 +7,9 @@ use pallas_addresses::{Address, ScriptHash, StakePayload};
|
||||||
use pallas_codec::utils::{KeyValuePairs, MaybeIndefArray};
|
use pallas_codec::utils::{KeyValuePairs, MaybeIndefArray};
|
||||||
use pallas_crypto::hash::Hash;
|
use pallas_crypto::hash::Hash;
|
||||||
use pallas_primitives::babbage::{
|
use pallas_primitives::babbage::{
|
||||||
Certificate, DatumHash, DatumOption, ExUnits, Language, Mint, MintedTx, PlutusV1Script,
|
Certificate, CostMdls, DatumHash, DatumOption, ExUnits, Language, Mint, MintedTx,
|
||||||
PlutusV2Script, PolicyId, Redeemer, RedeemerTag, RewardAccount, Script, StakeCredential,
|
PlutusV1Script, PlutusV2Script, PolicyId, Redeemer, RedeemerTag, RewardAccount, Script,
|
||||||
TransactionInput, TransactionOutput, Value, Withdrawals,
|
StakeCredential, TransactionInput, TransactionOutput, Value, Withdrawals,
|
||||||
};
|
};
|
||||||
use pallas_traverse::{ComputeHash, OriginalHash};
|
use pallas_traverse::{ComputeHash, OriginalHash};
|
||||||
use std::{collections::HashMap, convert::TryInto, ops::Deref, vec};
|
use std::{collections::HashMap, convert::TryInto, ops::Deref, vec};
|
||||||
|
@ -556,8 +556,7 @@ pub fn eval_redeemer(
|
||||||
slot_config: &SlotConfig,
|
slot_config: &SlotConfig,
|
||||||
redeemer: &Redeemer,
|
redeemer: &Redeemer,
|
||||||
lookup_table: &DataLookupTable,
|
lookup_table: &DataLookupTable,
|
||||||
version: &Language,
|
cost_mdls: &CostMdls,
|
||||||
costs: &[i64],
|
|
||||||
) -> anyhow::Result<Redeemer> {
|
) -> anyhow::Result<Redeemer> {
|
||||||
let purpose = get_script_purpose(
|
let purpose = get_script_purpose(
|
||||||
redeemer,
|
redeemer,
|
||||||
|
@ -583,11 +582,17 @@ pub fn eval_redeemer(
|
||||||
prog.into()
|
prog.into()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
|
||||||
|
costs
|
||||||
|
} else {
|
||||||
|
return Err(anyhow::Error::msg("PlutusV1 cost model not found."));
|
||||||
|
};
|
||||||
|
|
||||||
let result = program
|
let result = program
|
||||||
.apply_data(datum)
|
.apply_data(datum)
|
||||||
.apply_data(redeemer.data.clone())
|
.apply_data(redeemer.data.clone())
|
||||||
.apply_data(script_context.to_plutus_data())
|
.apply_data(script_context.to_plutus_data())
|
||||||
.eval_with_params(version, costs);
|
.eval_with_params(&Language::PlutusV1, &costs);
|
||||||
|
|
||||||
match result.0 {
|
match result.0 {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
@ -618,11 +623,17 @@ pub fn eval_redeemer(
|
||||||
prog.into()
|
prog.into()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let costs = if let Some(costs) = &cost_mdls.plutus_v2 {
|
||||||
|
costs
|
||||||
|
} else {
|
||||||
|
return Err(anyhow::Error::msg("PlutusV2 cost model not found."));
|
||||||
|
};
|
||||||
|
|
||||||
let result = program
|
let result = program
|
||||||
.apply_data(datum)
|
.apply_data(datum)
|
||||||
.apply_data(redeemer.data.clone())
|
.apply_data(redeemer.data.clone())
|
||||||
.apply_data(script_context.to_plutus_data())
|
.apply_data(script_context.to_plutus_data())
|
||||||
.eval();
|
.eval_with_params(&Language::PlutusV2, &costs);
|
||||||
|
|
||||||
match result.0 {
|
match result.0 {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
@ -655,10 +666,16 @@ pub fn eval_redeemer(
|
||||||
prog.into()
|
prog.into()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
|
||||||
|
costs
|
||||||
|
} else {
|
||||||
|
return Err(anyhow::Error::msg("PlutusV1 cost model not found."));
|
||||||
|
};
|
||||||
|
|
||||||
let result = program
|
let result = program
|
||||||
.apply_data(redeemer.data.clone())
|
.apply_data(redeemer.data.clone())
|
||||||
.apply_data(script_context.to_plutus_data())
|
.apply_data(script_context.to_plutus_data())
|
||||||
.eval();
|
.eval_with_params(&Language::PlutusV1, &costs);
|
||||||
|
|
||||||
match result.0 {
|
match result.0 {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
@ -689,10 +706,16 @@ pub fn eval_redeemer(
|
||||||
prog.into()
|
prog.into()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let costs = if let Some(costs) = &cost_mdls.plutus_v2 {
|
||||||
|
costs
|
||||||
|
} else {
|
||||||
|
return Err(anyhow::Error::msg("PlutusV2 cost model not found."));
|
||||||
|
};
|
||||||
|
|
||||||
let result = program
|
let result = program
|
||||||
.apply_data(redeemer.data.clone())
|
.apply_data(redeemer.data.clone())
|
||||||
.apply_data(script_context.to_plutus_data())
|
.apply_data(script_context.to_plutus_data())
|
||||||
.eval();
|
.eval_with_params(&Language::PlutusV2, &costs);
|
||||||
|
|
||||||
match result.0 {
|
match result.0 {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
|
Loading…
Reference in New Issue