diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index 6f0e5b874..97f8dd5a4 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -463,6 +463,7 @@ impl BlockChainClient for Client where V: Verifier { } let options = TransactOptions { tracing: false, vm_tracing: analytics.vm_tracing, check_nonce: false }; let mut ret = Executive::new(&mut state, &env_info, self.engine.deref().deref(), &self.vm_factory).transact(t, options); + // TODO gav move this into Executive. if analytics.state_diffing { if let Ok(ref mut x) = ret { diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index 18a253ea9..5dc3864c3 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -255,6 +255,8 @@ impl MinerService for Miner { match sealing_work.peek_last_ref() { Some(work) => { let block = work.block(); + + // TODO: merge this code with client.rs's fn call somwhow. let header = block.header(); let last_hashes = chain.last_hashes(); let env_info = EnvInfo { @@ -273,12 +275,14 @@ impl MinerService for Miner { ExecutionError::TransactionMalformed(message) })); let balance = state.balance(&sender); - // give the sender max balance - state.sub_balance(&sender, &balance); - state.add_balance(&sender, &U256::max_value()); + let needed_balance = t.value + t.gas * t.gas_price; + if balance < needed_balance { + // give the sender a sufficient balance + state.add_balance(&sender, &(needed_balance - balance)); + } let options = TransactOptions { tracing: false, vm_tracing: analytics.vm_tracing, check_nonce: false }; - let mut ret = Executive::new(&mut state, &env_info, self.engine(), chain.vm_factory()).transact(t, options); + // TODO gav move this into Executive. if analytics.state_diffing { if let Ok(ref mut x) = ret { diff --git a/ethcore/src/state.rs b/ethcore/src/state.rs index 32bb45704..06a365bdd 100644 --- a/ethcore/src/state.rs +++ b/ethcore/src/state.rs @@ -285,13 +285,13 @@ impl State { } fn query_pod(&mut self, query: &PodState) { - query.get().iter().foreach(|(ref address, ref pod_account)| { + for (ref address, ref pod_account) in query.get() { if self.get(address, true).is_some() { - pod_account.storage.iter().foreach(|(ref key, _)| { + for (ref key, _) in &pod_account.storage { self.storage_at(address, key); - }); + } } - }); + } } /// Returns a `StateDiff` describing the difference from `orig` to `self`.