feat: Add previous_value field to ContractSlot

This change is required by the DCI to properly detect potential address changes (retriggers) on packed storage slots.
This commit is contained in:
kayibal
2025-09-03 12:21:10 +01:00
committed by Alan Höng
parent ae6f5e0a12
commit 8b4611f9bb
4 changed files with 17 additions and 4 deletions

View File

@@ -123,6 +123,8 @@ message ContractSlot {
bytes slot = 2;
// The new value for this storage slot.
bytes value = 3;
// The old value of this storage slot
bytes previous_value = 4;
}
// A struct for following the token balance changes for a contract.

View File

@@ -56,7 +56,11 @@ pub fn get_block_storage_changes(block: &eth::v2::Block) -> Vec<TransactionStora
for change in changes {
latest_changes.insert(
change.key.clone(),
ContractSlot { slot: change.key, value: change.new_value },
ContractSlot {
slot: change.key,
value: change.new_value,
previous_value: change.old_value,
},
);
}

View File

@@ -72,7 +72,7 @@ impl TransactionChangesBuilder {
}
/// Unique contract/account addresses that have been changed so far.
pub fn changed_contracts(&self) -> impl Iterator<Item = &[u8]> {
pub fn changed_contracts(&self) -> impl Iterator<Item=&[u8]> {
self.contract_changes
.keys()
.map(|k| k.as_slice())
@@ -124,7 +124,7 @@ impl TransactionChangesBuilder {
.attributes
.clone()
.iter()
.filter(|&attr| (attr.change == i32::from(ChangeType::Creation)))
.filter(|&attr| attr.change == i32::from(ChangeType::Creation))
.map(|attr| attr.name.clone())
.collect(),
});
@@ -578,7 +578,11 @@ impl From<InterimContractChange> for Option<ContractChange> {
.slots
.into_iter()
.filter(|(_, value)| value.has_changed())
.map(|(slot, value)| ContractSlot { slot, value: value.new_value })
.map(|(slot, value)| ContractSlot {
slot,
value: value.new_value,
previous_value: value.start_value,
})
.collect(),
change: value.change.into(),
token_balances: value

View File

@@ -138,6 +138,9 @@ pub struct ContractSlot {
/// The new value for this storage slot.
#[prost(bytes="vec", tag="3")]
pub value: ::prost::alloc::vec::Vec<u8>,
/// The old value of this storage slot
#[prost(bytes="vec", tag="4")]
pub previous_value: ::prost::alloc::vec::Vec<u8>,
}
/// A struct for following the token balance changes for a contract.
#[allow(clippy::derive_partial_eq_without_eq)]