Skip to content

Commit 2c9dbc1

Browse files
authored
chore(anvil): get rid of trait upcasting workaround (#11424)
1 parent befca98 commit 2c9dbc1

File tree

5 files changed

+15
-62
lines changed

5 files changed

+15
-62
lines changed

crates/anvil/src/eth/api.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2981,7 +2981,7 @@ impl EthApi {
29812981
if let Some(block_overrides) = overrides.block {
29822982
cache_db.apply_block_overrides(*block_overrides, &mut block);
29832983
}
2984-
this.do_estimate_gas_with_state(request, &cache_db as &dyn DatabaseRef, block)
2984+
this.do_estimate_gas_with_state(request, &cache_db, block)
29852985
})
29862986
.await?
29872987
})

crates/anvil/src/eth/backend/db.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ use crate::mem::storage::MinedTransaction;
3636

3737
/// Helper trait get access to the full state data of the database
3838
pub trait MaybeFullDatabase: DatabaseRef<Error = DatabaseError> + Debug {
39-
/// Returns a reference to the database as a `dyn DatabaseRef`.
40-
// TODO: Required until trait upcasting is stabilized: <https://github.com/rust-lang/rust/issues/65991>
41-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = DatabaseError>;
42-
4339
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
4440
None
4541
}
@@ -63,10 +59,6 @@ impl<'a, T: 'a + MaybeFullDatabase + ?Sized> MaybeFullDatabase for &'a T
6359
where
6460
&'a T: DatabaseRef<Error = DatabaseError>,
6561
{
66-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = DatabaseError> {
67-
T::as_dyn(self)
68-
}
69-
7062
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
7163
T::maybe_as_full_db(self)
7264
}
@@ -202,13 +194,6 @@ pub trait Db:
202194
fn current_state(&self) -> StateDb;
203195
}
204196

205-
impl dyn Db {
206-
// TODO: Required until trait upcasting is stabilized: <https://github.com/rust-lang/rust/issues/65991>
207-
pub fn as_dbref(&self) -> &dyn DatabaseRef<Error = DatabaseError> {
208-
self.as_dyn()
209-
}
210-
}
211-
212197
/// Convenience impl only used to use any `Db` on the fly as the db layer for revm's CacheDB
213198
/// This is useful to create blocks without actually writing to the `Db`, but rather in the cache of
214199
/// the `CacheDB` see also
@@ -251,10 +236,6 @@ impl<T: DatabaseRef<Error = DatabaseError> + Send + Sync + Clone + fmt::Debug> D
251236
}
252237

253238
impl<T: DatabaseRef<Error = DatabaseError> + Debug> MaybeFullDatabase for CacheDB<T> {
254-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = DatabaseError> {
255-
self
256-
}
257-
258239
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
259240
Some(&self.cache.accounts)
260241
}
@@ -364,10 +345,6 @@ impl DatabaseRef for StateDb {
364345
}
365346

366347
impl MaybeFullDatabase for StateDb {
367-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = DatabaseError> {
368-
self.0.as_dyn()
369-
}
370-
371348
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
372349
self.0.maybe_as_full_db()
373350
}

crates/anvil/src/eth/backend/mem/fork_db.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ use crate::eth::backend::db::{
55
use alloy_primitives::{Address, B256, U256, map::HashMap};
66
use alloy_rpc_types::BlockId;
77
use foundry_evm::{
8-
backend::{
9-
BlockchainDb, DatabaseError, DatabaseResult, RevertStateSnapshotAction, StateSnapshot,
10-
},
8+
backend::{BlockchainDb, DatabaseResult, RevertStateSnapshotAction, StateSnapshot},
119
fork::database::ForkDbStateSnapshot,
1210
};
1311
use revm::{
1412
context::BlockEnv,
15-
database::{Database, DatabaseRef, DbAccount},
13+
database::{Database, DbAccount},
1614
state::AccountInfo,
1715
};
1816

@@ -89,10 +87,6 @@ impl Db for ForkedDatabase {
8987
}
9088

9189
impl MaybeFullDatabase for ForkedDatabase {
92-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = DatabaseError> {
93-
self
94-
}
95-
9690
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
9791
Some(&self.database().cache.accounts)
9892
}
@@ -128,10 +122,6 @@ impl MaybeFullDatabase for ForkedDatabase {
128122
}
129123

130124
impl MaybeFullDatabase for ForkDbStateSnapshot {
131-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = DatabaseError> {
132-
self
133-
}
134-
135125
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
136126
Some(&self.local.cache.accounts)
137127
}

crates/anvil/src/eth/backend/mem/in_memory_db.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,6 @@ impl Db for MemDb {
106106
}
107107

108108
impl MaybeFullDatabase for MemDb {
109-
fn as_dyn(&self) -> &dyn DatabaseRef<Error = foundry_evm::backend::DatabaseError> {
110-
self
111-
}
112-
113109
fn maybe_as_full_db(&self) -> Option<&HashMap<Address, DbAccount>> {
114110
Some(&self.inner.cache.accounts)
115111
}

crates/anvil/src/eth/backend/mem/mod.rs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,9 @@ pub mod inspector;
137137
pub mod state;
138138
pub mod storage;
139139

140-
/// Helper trait that combines DatabaseRef with Debug.
140+
/// Helper trait that combines revm::DatabaseRef with Debug.
141141
/// This is needed because alloy-evm requires Debug on Database implementations.
142-
/// Specific implementation for dyn Db since trait object upcasting is not stable.
142+
/// With trait upcasting now stable, we can now upcast from this trait to revm::DatabaseRef.
143143
pub trait DatabaseRef: revm::DatabaseRef<Error = DatabaseError> + Debug {}
144144
impl<T> DatabaseRef for T where T: revm::DatabaseRef<Error = DatabaseError> + Debug {}
145145
impl DatabaseRef for dyn crate::eth::backend::db::Db {}
@@ -1503,7 +1503,7 @@ impl Backend {
15031503
if let Some(block_overrides) = overrides.block {
15041504
cache_db.apply_block_overrides(*block_overrides, &mut block);
15051505
}
1506-
self.call_with_state(&cache_db as &dyn DatabaseRef, request, fee_details, block)
1506+
self.call_with_state(&cache_db, request, fee_details, block)
15071507
}?;
15081508
trace!(target: "backend", "call return {:?} out: {:?} gas {} on block {}", exit, out, gas, block_number);
15091509
Ok((exit, out, gas, state))
@@ -1715,7 +1715,7 @@ impl Backend {
17151715
// recorded and included in logs
17161716
inspector = inspector.with_transfers();
17171717
let mut evm= self.new_evm_with_inspector_ref(
1718-
&cache_db as &dyn DatabaseRef,
1718+
&cache_db,
17191719
&env,
17201720
&mut inspector,
17211721
);
@@ -1724,7 +1724,7 @@ impl Backend {
17241724
evm.transact(env.tx)?
17251725
} else {
17261726
let mut evm = self.new_evm_with_inspector_ref(
1727-
&cache_db as &dyn DatabaseRef,
1727+
&cache_db,
17281728
&env,
17291729
&mut inspector,
17301730
);
@@ -1932,11 +1932,8 @@ impl Backend {
19321932
);
19331933

19341934
let env = self.build_call_env(request, fee_details, block);
1935-
let mut evm = self.new_evm_with_inspector_ref(
1936-
&cache_db as &dyn DatabaseRef,
1937-
&env,
1938-
&mut inspector,
1939-
);
1935+
let mut evm =
1936+
self.new_evm_with_inspector_ref(&cache_db, &env, &mut inspector);
19401937
let ResultAndState { result, state: _ } = evm.transact(env.tx)?;
19411938

19421939
drop(evm);
@@ -1968,11 +1965,8 @@ impl Backend {
19681965
.map_err(|err| BlockchainError::Message(err.to_string()))?;
19691966

19701967
let env = self.build_call_env(request, fee_details, block.clone());
1971-
let mut evm = self.new_evm_with_inspector_ref(
1972-
&cache_db as &dyn DatabaseRef,
1973-
&env,
1974-
&mut inspector,
1975-
);
1968+
let mut evm =
1969+
self.new_evm_with_inspector_ref(&cache_db, &env, &mut inspector);
19761970
let result = evm.transact(env.tx.clone())?;
19771971
let res = evm
19781972
.inspector_mut()
@@ -1990,11 +1984,7 @@ impl Backend {
19901984
.with_tracing_config(TracingInspectorConfig::from_geth_config(&config));
19911985

19921986
let env = self.build_call_env(request, fee_details, block);
1993-
let mut evm = self.new_evm_with_inspector_ref(
1994-
&cache_db as &dyn DatabaseRef,
1995-
&env,
1996-
&mut inspector,
1997-
);
1987+
let mut evm = self.new_evm_with_inspector_ref(&cache_db, &env, &mut inspector);
19981988
let ResultAndState { result, state: _ } = evm.transact(env.tx)?;
19991989

20001990
let (exit_reason, gas_used, out) = match result {
@@ -2502,7 +2492,7 @@ impl Backend {
25022492

25032493
pub fn get_code_with_state(
25042494
&self,
2505-
state: &dyn DatabaseRef<Error = DatabaseError>,
2495+
state: &dyn DatabaseRef,
25062496
address: Address,
25072497
) -> Result<Bytes, BlockchainError> {
25082498
trace!(target: "backend", "get code for {:?}", address);
@@ -2554,7 +2544,7 @@ impl Backend {
25542544
address: Address,
25552545
) -> Result<U256, BlockchainError>
25562546
where
2557-
D: DatabaseRef<Error = DatabaseError>,
2547+
D: DatabaseRef,
25582548
{
25592549
trace!(target: "backend", "get balance for {:?}", address);
25602550
Ok(state.basic_ref(address)?.unwrap_or_default().balance)

0 commit comments

Comments
 (0)