Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.

Commit 6e30af2

Browse files
sorpaasandresilva
authored andcommitted
Fix checkpointing when creating contract failed (#9514)
1 parent 8cb1874 commit 6e30af2

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

ethcore/src/state/mod.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -420,16 +420,7 @@ impl<B: Backend> State<B> {
420420
**prev = checkpoint;
421421
} else {
422422
for (k, v) in checkpoint.drain() {
423-
match prev.entry(k) {
424-
Entry::Occupied(mut e) => {
425-
if e.get().is_none() {
426-
e.insert(v);
427-
}
428-
},
429-
Entry::Vacant(e) => {
430-
e.insert(v);
431-
}
432-
}
423+
prev.entry(k).or_insert(v);
433424
}
434425
}
435426
}
@@ -2460,6 +2451,25 @@ mod tests {
24602451
assert_eq!(state.storage_at(&a, &k).unwrap(), H256::from(U256::from(1)));
24612452
}
24622453

2454+
#[test]
2455+
fn create_contract_fail() {
2456+
let mut state = get_temp_state();
2457+
let orig_root = state.root().clone();
2458+
let a: Address = 1000.into();
2459+
2460+
state.checkpoint(); // c1
2461+
state.new_contract(&a, U256::zero(), U256::zero()).unwrap();
2462+
state.add_balance(&a, &U256::from(1), CleanupMode::ForceCreate).unwrap();
2463+
state.checkpoint(); // c2
2464+
state.add_balance(&a, &U256::from(1), CleanupMode::ForceCreate).unwrap();
2465+
state.discard_checkpoint(); // discard c2
2466+
state.revert_to_checkpoint(); // revert to c1
2467+
assert_eq!(state.exists(&a).unwrap(), false);
2468+
2469+
state.commit().unwrap();
2470+
assert_eq!(orig_root, state.root().clone());
2471+
}
2472+
24632473
#[test]
24642474
fn create_empty() {
24652475
let mut state = get_temp_state();

0 commit comments

Comments
 (0)