Guard spending plans, not just payments

This commit is contained in:
Greg Fitzgerald
2018-03-17 14:41:25 -06:00
parent e054238af6
commit 367c32dabe

View File

@ -35,7 +35,7 @@ pub struct Payment<T> {
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
pub enum Plan<T> { pub enum Plan<T> {
Action(Action<T>), Action(Action<T>),
After(Condition, Action<T>), After(Condition, Box<Plan<T>>),
Race(Box<Plan<T>>, Box<Plan<T>>), Race(Box<Plan<T>>, Box<Plan<T>>),
} }
@ -46,7 +46,7 @@ impl<T: Clone + Eq> Plan<T> {
Plan::Race(ref plan_a, ref plan_b) => { Plan::Race(ref plan_a, ref plan_b) => {
plan_a.verify(spendable_assets) && plan_b.verify(spendable_assets) plan_a.verify(spendable_assets) && plan_b.verify(spendable_assets)
} }
Plan::After(_, ref action) => action.spendable() == *spendable_assets, Plan::After(_, ref plan) => plan.verify(spendable_assets),
} }
} }
@ -79,9 +79,9 @@ impl<T: Clone + Eq> Plan<T> {
plan_a.process_verified_sig(from); plan_a.process_verified_sig(from);
plan_b.process_verified_sig(from); plan_b.process_verified_sig(from);
} }
Plan::After(Condition::Signature(pubkey), ref action) => { Plan::After(Condition::Signature(pubkey), ref plan) => {
if from == pubkey { if from == pubkey {
new_plan = Some(Plan::Action(action.clone())); new_plan = Some((**plan).clone());
} }
} }
_ => (), _ => (),
@ -106,9 +106,9 @@ impl<T: Clone + Eq> Plan<T> {
plan_a.process_verified_timestamp(last_time); plan_a.process_verified_timestamp(last_time);
plan_b.process_verified_timestamp(last_time); plan_b.process_verified_timestamp(last_time);
} }
Plan::After(Condition::Timestamp(dt), ref action) => { Plan::After(Condition::Timestamp(dt), ref plan) => {
if dt <= last_time { if dt <= last_time {
new_plan = Some(Plan::Action(action.clone())); new_plan = Some((**plan).clone());
} }
} }
_ => (), _ => (),
@ -164,17 +164,17 @@ impl<T: Serialize + Clone + Eq> Transaction<T> {
let plan = Plan::Race( let plan = Plan::Race(
Box::new(Plan::After( Box::new(Plan::After(
Condition::Timestamp(dt), Condition::Timestamp(dt),
Action::Pay(Payment { Box::new(Plan::Action(Action::Pay(Payment {
asset: asset.clone(), asset: asset.clone(),
to, to,
}), }))),
)), )),
Box::new(Plan::After( Box::new(Plan::After(
Condition::Signature(from), Condition::Signature(from),
Action::Pay(Payment { Box::new(Plan::Action(Action::Pay(Payment {
asset: asset.clone(), asset: asset.clone(),
to: from, to: from,
}), }))),
)), )),
); );
let mut tr = Transaction { let mut tr = Transaction {