Skip to content

Commit 1daf074

Browse files
Upgrade reth 1.11.3 -> 2.2.0 (#928)
## 📝 Summary Bumps reth version from 1.11.3 to 2.2.0, and alloy dependencies. ## 💡 Motivation and Context As part of adding support for epbs in rbuilder we were required to upgrade reth to 2.0. We initially added it via #855, but later decided to separate out the version bump in its own PR. ## ✅ I have completed the following steps: * [x] Run `make lint` * [x] Run `make test` * [ ] Added tests (if applicable) --------- Co-authored-by: Daniel Xifra <daniel@xifra.dev>
1 parent 4bb5f2e commit 1daf074

54 files changed

Lines changed: 1565 additions & 1203 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 1080 additions & 922 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[workspace.package]
22
version = "0.1.0"
33
edition = "2021"
4-
rust-version = "1.88"
4+
rust-version = "1.93"
55
license = "MIT OR Apache-2.0"
66
homepage = "https://github.com/flashbots/rbuilder"
77
repository = "https://github.com/flashbots/rbuilder"
@@ -70,62 +70,63 @@ codegen-units = 1
7070
incremental = false
7171

7272
[workspace.dependencies]
73-
reth = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
74-
reth-cli-util = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
75-
reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
76-
reth-db-common = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
77-
reth-errors = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
78-
reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
79-
reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
80-
reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
81-
reth-trie = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
82-
reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
83-
reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
84-
reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
85-
reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
86-
reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
87-
reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b", features = [
73+
reth = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
74+
reth-cli-util = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
75+
reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
76+
reth-db-common = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
77+
reth-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
78+
reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
79+
reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
80+
reth-trie = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
81+
reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
82+
reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
83+
reth-primitives = { package = "reth-ethereum-primitives", git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
84+
reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
85+
reth-primitives-traits = { version = "0.3.1", default-features = false }
86+
reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0", features = [
8887
"test-utils",
8988
] }
90-
reth-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
91-
reth-evm = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
92-
reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
93-
reth-revm = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
94-
reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
95-
reth-trie-db = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
96-
reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
97-
98-
# compatible with reth d6324d63e27ef6b7c49cdc9b1977c1b808234c7b dependencies
99-
revm = { version = "34.0.0", features = [
89+
reth-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
90+
reth-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
91+
reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
92+
reth-revm = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
93+
reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
94+
reth-trie-db = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
95+
reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
96+
reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
97+
98+
# compatible with reth v2.2.0 dependencies
99+
revm = { version = "=38.0.0", features = [
100100
"std",
101101
"secp256k1",
102102
"optional_balance_check",
103103
], default-features = false }
104-
revm-inspectors = { version = "0.34.2", default-features = false }
104+
revm-inspectors = { version = "=0.39.0", default-features = false }
105105

106-
ethereum_ssz_derive = "0.9.0"
107-
ethereum_ssz = "0.9.0"
106+
ethereum_ssz_derive = "0.10"
107+
ethereum_ssz = "0.10"
108108

109-
alloy-primitives = { version = "1.5.6", default-features = false, features = [
109+
alloy-primitives = { version = "=1.5.6", default-features = false, features = [
110110
"getrandom",
111+
"map-foldhash",
111112
] }
112-
alloy-rlp = "0.3.13"
113-
alloy-chains = "0.2.5"
114-
alloy-trie = { version = "0.9.4", default-features = false }
115-
alloy-evm = { version = "0.27.2", default-features = false }
116-
alloy-provider = { version = "1.6.3", features = ["ipc", "pubsub", "ws"] }
117-
alloy-eips = { version = "1.6.3" }
118-
alloy-rpc-types = { version = "1.6.3" }
119-
alloy-json-rpc = { version = "1.6.3" }
120-
alloy-network = { version = "1.6.3" }
121-
alloy-network-primitives = { version = "1.6.3" }
122-
alloy-node-bindings = { version = "1.6.3" }
123-
alloy-consensus = { version = "1.6.3", features = ["kzg"] }
124-
alloy-rpc-types-beacon = { version = "1.6.3", features = ["ssz"] }
125-
alloy-rpc-types-engine = { version = "1.6.3", features = ["ssz"] }
126-
alloy-rpc-types-eth = { version = "1.6.3" }
127-
alloy-signer = { version = "1.6.3" }
128-
alloy-signer-local = { version = "1.6.3" }
113+
alloy-rlp = { version = "=0.3.13", default-features = false, features = ["core-net"] }
114+
alloy-chains = { version = "=0.2.33", default-features = false }
115+
alloy-trie = { version = "=0.9.4", default-features = false }
116+
alloy-evm = { version = "=0.34.0", default-features = false }
117+
alloy-provider = { version = "=2.0.4", features = ["ipc", "pubsub", "ws"] }
118+
alloy-eips = { version = "=2.0.4" }
119+
alloy-rpc-types = { version = "=2.0.4" }
120+
alloy-json-rpc = { version = "=2.0.4" }
121+
alloy-network = { version = "=2.0.4" }
122+
alloy-network-primitives = { version = "=2.0.4" }
123+
alloy-node-bindings = { version = "=2.0.4" }
124+
alloy-consensus = { version = "=2.0.4", features = ["kzg"] }
125+
alloy-rpc-types-beacon = { version = "=2.0.4", features = ["ssz"] }
126+
alloy-rpc-types-engine = { version = "=2.0.4", features = ["ssz"] }
127+
alloy-rpc-types-eth = { version = "=2.0.4" }
128+
alloy-signer = { version = "=2.0.4" }
129+
alloy-signer-local = { version = "=2.0.4" }
129130

130131
# Version required by ethereum-consensus beacon-api-client
131132
mev-share-sse = { git = "https://github.com/paradigmxyz/mev-share-rs", rev = "9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8", default-features = false }
@@ -138,6 +139,7 @@ thiserror = { version = "1.0.64" }
138139
eyre = { version = "0.6.12" }
139140
jsonrpsee = { version = "0.24.4" }
140141
parking_lot = { version = "0.12.3" }
142+
notify = "8.2.0"
141143
tokio = { version = "1.40.0", default-features = false }
142144
futures = "0.3"
143145
futures-util = "0.3"

crates/eth-sparse-mpt/src/lib.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88

99
use crate::utils::{HashMap, HashSet};
1010
use alloy_primitives::{Address, Bytes, B256};
11-
use reth_provider::{providers::ConsistentDbView, BlockReader, DatabaseProviderFactory};
11+
use reth_provider::{
12+
providers::ConsistentDbView, BlockReader, DatabaseProviderFactory, StorageSettingsCache,
13+
};
1214
use revm::database::BundleState;
1315
use std::sync::Arc;
1416

@@ -107,6 +109,7 @@ pub fn prefetch_tries_for_accounts<'a, Provider>(
107109
) -> Result<SparseTrieMetrics, SparseTrieError>
108110
where
109111
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
112+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
110113
{
111114
match version {
112115
ETHSpareMPTVersion::V1 => {
@@ -166,6 +169,7 @@ pub fn calculate_account_proofs_with_sparse_trie<Provider>(
166169
)
167170
where
168171
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
172+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
169173
{
170174
let calculate = || match version {
171175
ETHSpareMPTVersion::V1 => (
@@ -221,6 +225,7 @@ pub fn calculate_root_hash_with_sparse_trie<Provider>(
221225
) -> (Result<B256, SparseTrieError>, SparseTrieMetrics)
222226
where
223227
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
228+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
224229
{
225230
if let Some(thread_pool) = thread_pool {
226231
thread_pool.rayon_pool.install(|| {
@@ -255,6 +260,7 @@ pub fn calculate_root_hash_with_sparse_trie_internal<Provider>(
255260
) -> (Result<B256, SparseTrieError>, SparseTrieMetrics)
256261
where
257262
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
263+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
258264
{
259265
match version {
260266
ETHSpareMPTVersion::V1 => {

crates/eth-sparse-mpt/src/v1/reth_sparse_trie/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use alloy_primitives::B256;
22
use change_set::{prepare_change_set, prepare_change_set_for_prefetch};
33
use hash::RootHashError;
4-
use reth_provider::{providers::ConsistentDbView, BlockReader, DatabaseProviderFactory};
4+
use reth_provider::{
5+
providers::ConsistentDbView, BlockReader, DatabaseProviderFactory, StorageSettingsCache,
6+
};
57
use revm::database::BundleState;
68
use std::time::{Duration, Instant};
79

@@ -63,6 +65,7 @@ pub fn prefetch_tries_for_accounts<'a, Provider>(
6365
) -> Result<SparseTrieMetrics, SparseTrieError>
6466
where
6567
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
68+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
6669
{
6770
let mut metrics = SparseTrieMetrics::default();
6871

@@ -108,6 +111,7 @@ pub fn calculate_root_hash_with_sparse_trie<Provider>(
108111
) -> (Result<B256, SparseTrieError>, SparseTrieMetrics)
109112
where
110113
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
114+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
111115
{
112116
let mut metrics = SparseTrieMetrics::default();
113117

crates/eth-sparse-mpt/src/v1/reth_sparse_trie/trie_fetcher/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use reth_errors::ProviderError;
1111
use reth_execution_errors::trie::StateProofError;
1212
use reth_provider::{
1313
providers::ConsistentDbView, BlockReader, DBProvider, DatabaseProviderFactory,
14+
StorageSettingsCache,
1415
};
1516
use reth_trie::{proof::Proof, MultiProof as RethMultiProof, MultiProofTargets, EMPTY_ROOT_HASH};
1617
use reth_trie_db::{DatabaseHashedCursorFactory, DatabaseTrieCursorFactory};
@@ -61,6 +62,7 @@ pub struct TrieFetcher<Provider> {
6162
impl<Provider> TrieFetcher<Provider>
6263
where
6364
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
65+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
6466
{
6567
pub fn new(consistent_db_view: ConsistentDbView<Provider>) -> Self {
6668
Self { consistent_db_view }
@@ -77,14 +79,16 @@ where
7779
.map(|targets| -> Result<MultiProof, FetchNodeError> {
7880
let start = Instant::now();
7981
let provider = self.consistent_db_view.provider_ro()?;
80-
let proof = Proof::new(
81-
DatabaseTrieCursorFactory::new(provider.tx_ref()),
82-
DatabaseHashedCursorFactory::new(provider.tx_ref()),
83-
);
8482
let targets_accounts = targets.len();
8583
let targets_slots = targets.values().map(|v| v.len()).sum::<usize>();
8684

87-
let reth_multiproof = proof.multiproof(targets)?;
85+
let reth_multiproof = reth_trie_db::with_adapter!(provider, |A| {
86+
Proof::new(
87+
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
88+
DatabaseHashedCursorFactory::new(provider.tx_ref()),
89+
)
90+
.multiproof(targets)
91+
})?;
8892
let result = convert_reth_multiproof(reth_multiproof, &all_requested_accounts);
8993
let time_ms = start.elapsed().as_micros() as f64 / 1000.0;
9094
trace!(

crates/eth-sparse-mpt/src/v2/fetch.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,28 @@ use alloy_primitives::B256;
99
use nybbles::Nibbles;
1010
use reth_provider::{
1111
providers::ConsistentDbView, BlockReader, DBProvider, DatabaseProviderFactory,
12+
StorageSettingsCache,
1213
};
1314
use reth_trie::{
1415
proof::{Proof, StorageProof},
1516
MultiProofTargets, StateRoot,
1617
};
17-
use reth_trie_db::{DatabaseHashedCursorFactory, DatabaseStateRoot, DatabaseTrieCursorFactory};
18+
use reth_trie_db::{DatabaseHashedCursorFactory, DatabaseTrieCursorFactory};
1819

1920
use super::SharedCacheV2;
2021

2122
pub fn check_state_root_in_db(
22-
provider: &impl DBProvider,
23+
provider: &(impl DBProvider + StorageSettingsCache),
2324
expected_state_root: B256,
2425
) -> Result<(), SparseTrieError> {
25-
let db_state_root = StateRoot::from_tx(provider.tx_ref())
26+
let db_state_root = reth_trie_db::with_adapter!(provider, |A| {
27+
StateRoot::new(
28+
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
29+
DatabaseHashedCursorFactory::new(provider.tx_ref()),
30+
)
2631
.root()
27-
.map_err(SparseTrieError::other)?;
32+
})
33+
.map_err(SparseTrieError::other)?;
2834
if db_state_root == expected_state_root {
2935
Ok(())
3036
} else {
@@ -66,6 +72,7 @@ impl MissingNodesFetcher {
6672
) -> Result<usize, SparseTrieError>
6773
where
6874
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
75+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
6976
{
7077
let fetched_nodes: Arc<Mutex<usize>> = Default::default();
7178

@@ -81,14 +88,15 @@ impl MissingNodesFetcher {
8188
check_state_root_in_db(&provider, parent_state_root)?;
8289
}
8390

84-
let proof = StorageProof::new_hashed(
85-
DatabaseTrieCursorFactory::new(provider.tx_ref()),
86-
DatabaseHashedCursorFactory::new(provider.tx_ref()),
87-
hashed_address,
88-
);
89-
let storge_multiproof = proof
91+
let storge_multiproof = reth_trie_db::with_adapter!(provider, |A| {
92+
StorageProof::new_hashed(
93+
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
94+
DatabaseHashedCursorFactory::new(provider.tx_ref()),
95+
hashed_address,
96+
)
9097
.storage_multiproof(targets)
91-
.map_err(SparseTrieError::other)?;
98+
})
99+
.map_err(SparseTrieError::other)?;
92100
*fetched_nodes.lock() += requested_proofs.len();
93101
for requested_proof in requested_proofs {
94102
let proof_for_node = storge_multiproof
@@ -112,12 +120,15 @@ impl MissingNodesFetcher {
112120
check_state_root_in_db(&provider, parent_state_root)?
113121
}
114122

115-
let proof = Proof::new(
116-
DatabaseTrieCursorFactory::new(provider.tx_ref()),
117-
DatabaseHashedCursorFactory::new(provider.tx_ref()),
118-
);
119123
let targets = MultiProofTargets::accounts(std::mem::take(&mut self.account_proof_targets));
120-
let multiproof = proof.multiproof(targets).map_err(SparseTrieError::other)?;
124+
let multiproof = reth_trie_db::with_adapter!(provider, |A| {
125+
Proof::new(
126+
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
127+
DatabaseHashedCursorFactory::new(provider.tx_ref()),
128+
)
129+
.multiproof(targets)
130+
})
131+
.map_err(SparseTrieError::other)?;
121132

122133
*fetched_nodes.lock() += self.account_proof_requested_nodes.len();
123134
for requested_node in self.account_proof_requested_nodes.drain(..) {

crates/eth-sparse-mpt/src/v2/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use fetch::MissingNodesFetcher;
44
use nybbles::Nibbles;
55
use parking_lot::{Mutex, RwLock};
66
use rayon::prelude::*;
7-
use reth_provider::{providers::ConsistentDbView, BlockReader, DatabaseProviderFactory};
7+
use reth_provider::{
8+
providers::ConsistentDbView, BlockReader, DatabaseProviderFactory, StorageSettingsCache,
9+
};
810
use reth_trie::TrieAccount;
911
use revm::{
1012
database::{BundleAccount, BundleState},
@@ -256,6 +258,7 @@ pub fn prefetch_proofs<'a, Provider>(
256258
) -> Result<SparseTrieMetrics, SparseTrieError>
257259
where
258260
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
261+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
259262
{
260263
let mut metrics = SparseTrieMetrics::default();
261264
let mut fetcher = MissingNodesFetcher::default();
@@ -427,6 +430,7 @@ impl RootHashCalculator {
427430
) -> Result<(), SparseTrieError>
428431
where
429432
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
433+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
430434
{
431435
stats.start();
432436

@@ -623,6 +627,7 @@ impl RootHashCalculator {
623627
) -> Result<(), SparseTrieError>
624628
where
625629
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
630+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
626631
{
627632
let fetcher = Arc::new(Mutex::new(MissingNodesFetcher::default()));
628633

@@ -910,6 +915,7 @@ impl RootHashCalculator {
910915
) -> Result<(), SparseTrieError>
911916
where
912917
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
918+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
913919
{
914920
let mut fetcher = MissingNodesFetcher::default();
915921

@@ -968,6 +974,7 @@ impl RootHashCalculator {
968974
) -> Result<(B256, HashMap<Address, Vec<Bytes>>, SparseTrieMetrics), SparseTrieError>
969975
where
970976
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
977+
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
971978
{
972979
if !incremental_change.is_empty() {
973980
self.incremental_account_change.extend(incremental_change);

0 commit comments

Comments
 (0)