Skip to content

[feature] Create DatabaseCommitExt trait with reusable utility functions #3194

@0xForerunner

Description

@0xForerunner

It would be nice for some utility functions like State::increment_balances to be implemented for all types that are DatabaseCommit.

POC

impl<T: Database + DatabaseCommit> DatabaseCommitExt for T {
    // default implementation
}

/// EVM database commit interface.
pub trait DatabaseCommitExt: Database + DatabaseCommit {
    /// Iterates over received balances and increment all account balances.
    ///
    /// Update will create transitions for all accounts that are updated.
    fn increment_balances(
        &mut self,
        balances: impl IntoIterator<Item = (Address, u128)>,
    ) -> Result<(), Self::Error> {
        // Make transition and update cache state
        let balances = balances.into_iter();
        let mut transitions = HashMap::with_capacity(balances.size_hint().0);
        for (address, balance) in balances {
            if balance == 0 {
                continue;
            }
            let mut original_account = match self.basic(address)? {
                Some(acc_info) => Account::from(acc_info),
                None => Account::new_not_existing(0),
            };
            original_account.info.balance = original_account
                .info
                .balance
                .saturating_add(U256::from(balance));
            original_account.mark_touch();
            transitions.insert(address, original_account);
        }
        self.commit(transitions);
        Ok(())
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions