fix: compare prev value against new value (#4347)

This commit is contained in:
Matthias Seitz
2023-08-24 17:31:39 +02:00
committed by GitHub
parent b65e808ebf
commit fea753beb2

View File

@ -310,31 +310,51 @@ impl CallTraceNode {
// iterate over all storage diffs
for change in self.trace.steps.iter().filter_map(|s| s.storage_change) {
let StorageChange { key, value, had_value } = change;
let value = H256::from(value);
let h256_value = H256::from(value);
match acc.storage.entry(key.into()) {
Entry::Vacant(entry) => {
if let Some(had_value) = had_value {
entry.insert(Delta::Changed(ChangedType {
from: had_value.into(),
to: value,
}));
if value != had_value {
entry.insert(Delta::Changed(ChangedType {
from: had_value.into(),
to: h256_value,
}));
}
} else {
entry.insert(Delta::Added(value));
entry.insert(Delta::Added(h256_value));
}
}
Entry::Occupied(mut entry) => {
let value = match entry.get() {
Delta::Unchanged => Delta::Added(value),
Delta::Added(added) => {
if added == &value {
Delta::Added(*added)
Delta::Unchanged => {
if let Some(had_value) = had_value {
if value != had_value {
Delta::Changed(ChangedType {
from: had_value.into(),
to: h256_value,
})
} else {
Delta::Unchanged
}
} else {
Delta::Changed(ChangedType { from: *added, to: value })
Delta::Added(h256_value)
}
}
Delta::Removed(_) => Delta::Added(value),
Delta::Added(added) => {
if added == &h256_value {
Delta::Added(*added)
} else {
Delta::Changed(ChangedType { from: *added, to: h256_value })
}
}
Delta::Removed(_) => Delta::Added(h256_value),
Delta::Changed(c) => {
Delta::Changed(ChangedType { from: c.from, to: value })
if c.from == h256_value {
// remains unchanged if the value is the same
Delta::Unchanged
} else {
Delta::Changed(ChangedType { from: c.from, to: h256_value })
}
}
};
entry.insert(value);