feat: new error for bad term
This commit is contained in:
@@ -1,17 +1,22 @@
|
||||
use crate::machine;
|
||||
use crate::{
|
||||
ast::{NamedDeBruijn, Term},
|
||||
machine::{self, cost_model::ExBudget},
|
||||
};
|
||||
|
||||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum Error {
|
||||
#[error("{0}")]
|
||||
Address(#[from] pallas_addresses::Error),
|
||||
#[error("{}\n\n{:#?}\n\n{}", .0, .1, .2.join("\n"))]
|
||||
BadTerm(Term<NamedDeBruijn>, ExBudget, Vec<String>),
|
||||
#[error("Only shelley reward addresses can be a part of withdrawals")]
|
||||
BadWithdrawalAddress,
|
||||
#[error("{0}")]
|
||||
FlatDecode(#[from] flat_rs::de::Error),
|
||||
#[error("{0}")]
|
||||
FragmentDecode(#[from] pallas_primitives::Error),
|
||||
#[error("{0}")]
|
||||
Machine(#[from] machine::Error),
|
||||
#[error("{}\n\n{:#?}\n\n{}", .0, .1, .2.join("\n"))]
|
||||
Machine(machine::Error, ExBudget, Vec<String>),
|
||||
#[error("Native script can't be executed in phase-two")]
|
||||
NativeScriptPhaseTwo,
|
||||
#[error("Can't eval without redeemers")]
|
||||
|
||||
@@ -168,12 +168,10 @@ fn get_script_purpose(
|
||||
policy_ids.sort();
|
||||
match policy_ids.get(index as usize) {
|
||||
Some(policy_id) => Ok(ScriptPurpose::Minting(*policy_id)),
|
||||
None => {
|
||||
return Err(Error::ExtraneousRedeemer {
|
||||
tag: "Mint".to_string(),
|
||||
index,
|
||||
})
|
||||
}
|
||||
None => Err(Error::ExtraneousRedeemer {
|
||||
tag: "Mint".to_string(),
|
||||
index,
|
||||
}),
|
||||
}
|
||||
}
|
||||
RedeemerTag::Spend => {
|
||||
@@ -182,12 +180,10 @@ fn get_script_purpose(
|
||||
inputs.sort();
|
||||
match inputs.get(index as usize) {
|
||||
Some(input) => Ok(ScriptPurpose::Spending(input.clone())),
|
||||
None => {
|
||||
return Err(Error::ExtraneousRedeemer {
|
||||
tag: "Spend".to_string(),
|
||||
index,
|
||||
})
|
||||
}
|
||||
None => Err(Error::ExtraneousRedeemer {
|
||||
tag: "Spend".to_string(),
|
||||
index,
|
||||
}),
|
||||
}
|
||||
}
|
||||
RedeemerTag::Reward => {
|
||||
@@ -228,12 +224,10 @@ fn get_script_purpose(
|
||||
.get(index as usize)
|
||||
{
|
||||
Some(cert) => Ok(ScriptPurpose::Certifying(cert.clone())),
|
||||
None => {
|
||||
return Err(Error::ExtraneousRedeemer {
|
||||
tag: "Cert".to_string(),
|
||||
index,
|
||||
})
|
||||
}
|
||||
None => Err(Error::ExtraneousRedeemer {
|
||||
tag: "Cert".to_string(),
|
||||
index,
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -436,7 +430,7 @@ fn get_execution_purpose(
|
||||
|
||||
Ok(ExecutionPurpose::WithDatum(script, datum))
|
||||
}
|
||||
_ => return Err(Error::ScriptKeyHash),
|
||||
_ => Err(Error::ScriptKeyHash),
|
||||
}
|
||||
}
|
||||
TransactionOutput::PostAlonzo(output) => {
|
||||
@@ -470,7 +464,7 @@ fn get_execution_purpose(
|
||||
|
||||
Ok(ExecutionPurpose::WithDatum(script, datum))
|
||||
}
|
||||
_ => return Err(Error::ScriptKeyHash),
|
||||
_ => Err(Error::ScriptKeyHash),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -527,7 +521,7 @@ fn get_execution_purpose(
|
||||
|
||||
Ok(ExecutionPurpose::NoDatum(script))
|
||||
}
|
||||
_ => return Err(Error::OnlyStakeDeregAndDelegAllowed),
|
||||
_ => Err(Error::OnlyStakeDeregAndDelegAllowed),
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -645,7 +639,7 @@ pub fn eval_redeemer(
|
||||
.apply_data(redeemer.data.clone())
|
||||
.apply_data(script_context.to_plutus_data());
|
||||
|
||||
let (result, budget, _) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
|
||||
costs
|
||||
} else {
|
||||
@@ -657,11 +651,17 @@ pub fn eval_redeemer(
|
||||
program.eval_v1()
|
||||
};
|
||||
|
||||
// TODO: do we want the logs in the error?
|
||||
result?;
|
||||
match result {
|
||||
Ok(term) => {
|
||||
if !term.is_valid_script_result() {
|
||||
return Err(Error::BadTerm(term, budget, logs));
|
||||
}
|
||||
}
|
||||
Err(err) => return Err(Error::Machine(err, budget, logs)),
|
||||
}
|
||||
|
||||
let initial_budget = match initial_budget {
|
||||
Some(b) => b.clone(),
|
||||
Some(b) => *b,
|
||||
None => ExBudget::default(),
|
||||
};
|
||||
|
||||
@@ -694,7 +694,7 @@ pub fn eval_redeemer(
|
||||
.apply_data(redeemer.data.clone())
|
||||
.apply_data(script_context.to_plutus_data());
|
||||
|
||||
let (result, budget, _) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let costs = if let Some(costs) = &cost_mdls.plutus_v2 {
|
||||
costs
|
||||
} else {
|
||||
@@ -706,11 +706,17 @@ pub fn eval_redeemer(
|
||||
program.eval()
|
||||
};
|
||||
|
||||
// TODO: do we want the logs in the error?
|
||||
result?;
|
||||
match result {
|
||||
Ok(term) => {
|
||||
if !term.is_valid_script_result() {
|
||||
return Err(Error::BadTerm(term, budget, logs));
|
||||
}
|
||||
}
|
||||
Err(err) => return Err(Error::Machine(err, budget, logs)),
|
||||
}
|
||||
|
||||
let initial_budget = match initial_budget {
|
||||
Some(b) => b.clone(),
|
||||
Some(b) => *b,
|
||||
None => ExBudget::default(),
|
||||
};
|
||||
|
||||
@@ -745,7 +751,7 @@ pub fn eval_redeemer(
|
||||
.apply_data(redeemer.data.clone())
|
||||
.apply_data(script_context.to_plutus_data());
|
||||
|
||||
let (result, budget, _) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
|
||||
costs
|
||||
} else {
|
||||
@@ -757,11 +763,17 @@ pub fn eval_redeemer(
|
||||
program.eval_v1()
|
||||
};
|
||||
|
||||
// TODO: do we want the logs in the error?
|
||||
result?;
|
||||
match result {
|
||||
Ok(term) => {
|
||||
if !term.is_valid_script_result() {
|
||||
return Err(Error::BadTerm(term, budget, logs));
|
||||
}
|
||||
}
|
||||
Err(err) => return Err(Error::Machine(err, budget, logs)),
|
||||
}
|
||||
|
||||
let initial_budget = match initial_budget {
|
||||
Some(b) => b.clone(),
|
||||
Some(b) => *b,
|
||||
None => ExBudget::default(),
|
||||
};
|
||||
|
||||
@@ -793,7 +805,7 @@ pub fn eval_redeemer(
|
||||
.apply_data(redeemer.data.clone())
|
||||
.apply_data(script_context.to_plutus_data());
|
||||
|
||||
let (result, budget, _) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
|
||||
let costs = if let Some(costs) = &cost_mdls.plutus_v2 {
|
||||
costs
|
||||
} else {
|
||||
@@ -805,11 +817,17 @@ pub fn eval_redeemer(
|
||||
program.eval()
|
||||
};
|
||||
|
||||
// TODO: do we want the logs in the error?
|
||||
result?;
|
||||
match result {
|
||||
Ok(term) => {
|
||||
if !term.is_valid_script_result() {
|
||||
return Err(Error::BadTerm(term, budget, logs));
|
||||
}
|
||||
}
|
||||
Err(err) => return Err(Error::Machine(err, budget, logs)),
|
||||
}
|
||||
|
||||
let initial_budget = match initial_budget {
|
||||
Some(b) => b.clone(),
|
||||
Some(b) => *b,
|
||||
None => ExBudget::default(),
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user