diff --git a/src/accountant.rs b/src/accountant.rs index a6685924e0..2c00ea124e 100644 --- a/src/accountant.rs +++ b/src/accountant.rs @@ -113,18 +113,7 @@ impl Accountant { /// Commit funds to the 'to' party. fn complete_transaction(self: &mut Self, plan: &Plan) { - let payment = match *plan { - Plan::Action(Action::Pay(ref payment)) => Some(payment), - Plan::After(_, Action::Pay(ref payment)) => Some(payment), - Plan::Race(ref plan_a, _) => { - if let Plan::After(_, Action::Pay(ref payment)) = **plan_a { - Some(payment) - } else { - None - } - } - }; - if let Some(payment) = payment { + if let Plan::Action(Action::Pay(ref payment)) = *plan { if self.balances.contains_key(&payment.to) { if let Some(x) = self.balances.get_mut(&payment.to) { *x += payment.asset; @@ -135,18 +124,6 @@ impl Accountant { } } - // TODO: Move this to transaction.rs - fn all_satisfied(&self, plan: &Plan) -> bool { - match *plan { - Plan::Action(_) => true, - Plan::After(Condition::Timestamp(dt), _) => dt <= self.last_time, - Plan::After(Condition::Signature(_), _) => false, - Plan::Race(ref plan_a, ref plan_b) => { - self.all_satisfied(plan_a) || self.all_satisfied(plan_b) - } - } - } - fn process_verified_transaction( self: &mut Self, tr: &Transaction, @@ -162,12 +139,15 @@ impl Accountant { } } - if !self.all_satisfied(&tr.plan) { - self.pending.insert(tr.sig, tr.plan.clone()); + let mut plan = tr.plan.clone(); + let actionable = plan.process_verified_timestamp(self.last_time); + + if !actionable { + self.pending.insert(tr.sig, plan); return Ok(()); } - self.complete_transaction(&tr.plan); + self.complete_transaction(&plan); Ok(()) } @@ -204,17 +184,9 @@ impl Accountant { // Check to see if any timelocked transactions can be completed. let mut completed = vec![]; - for (key, plan) in &self.pending { - if let Plan::After(Condition::Timestamp(dt), _) = *plan { - if self.last_time >= dt { - completed.push(*key); - } - } else if let Plan::Race(ref plan_a, _) = *plan { - if let Plan::After(Condition::Timestamp(dt), _) = **plan_a { - if self.last_time >= dt { - completed.push(*key); - } - } + for (key, plan) in &mut self.pending { + if plan.process_verified_timestamp(self.last_time) { + completed.push(key.clone()); } } diff --git a/src/transaction.rs b/src/transaction.rs index 8593991382..68a1dcd66a 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -56,6 +56,7 @@ impl Plan { pub fn process_verified_sig(&mut self, from: PublicKey) -> bool { let mut new_plan = None; match *self { + Plan::Action(_) => return true, Plan::Race(ref mut plan_a, ref mut plan_b) => { plan_a.process_verified_sig(from); plan_b.process_verified_sig(from); @@ -78,6 +79,33 @@ impl Plan { false } } + + pub fn process_verified_timestamp(&mut self, last_time: DateTime) -> bool { + let mut new_plan = None; + match *self { + Plan::Action(_) => return true, + Plan::Race(ref mut plan_a, ref mut plan_b) => { + plan_a.process_verified_timestamp(last_time); + plan_b.process_verified_timestamp(last_time); + } + Plan::After(Condition::Timestamp(dt), ref action) => { + if dt <= last_time { + new_plan = Some(Plan::Action(action.clone())); + } + } + _ => (), + } + if self.run_race() { + return true; + } + + if let Some(plan) = new_plan { + mem::replace(self, plan); + true + } else { + false + } + } } #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]