Skip to content

Commit d48d589

Browse files
authored
(#3) Alloy Migration: migrate fork-adjacent files to alloy primitives (#5771)
1 parent 9cd47f3 commit d48d589

File tree

5 files changed

+71
-77
lines changed

5 files changed

+71
-77
lines changed

crates/evm/src/executor/backend/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ impl Backend {
803803
transaction: B256,
804804
) -> eyre::Result<(U64, Block<Transaction>)> {
805805
let fork = self.inner.get_fork_by_id(id)?;
806-
let tx = fork.db.db.get_transaction(b256_to_h256(transaction))?;
806+
let tx = fork.db.db.get_transaction(transaction)?;
807807

808808
// get the block number we need to fork
809809
if let Some(tx_block) = tx.block_number {
@@ -1171,7 +1171,7 @@ impl DatabaseExt for Backend {
11711171
};
11721172

11731173
let fork = self.inner.get_fork_by_id_mut(id)?;
1174-
let tx = fork.db.db.get_transaction(b256_to_h256(transaction))?;
1174+
let tx = fork.db.db.get_transaction(transaction)?;
11751175

11761176
commit_transaction(tx, env, journaled_state, fork, &fork_id, cheatcodes_inspector)?;
11771177

crates/evm/src/executor/fork/backend.rs

Lines changed: 62 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ use crate::{
44
backend::error::{DatabaseError, DatabaseResult},
55
fork::{cache::FlushJsonBlockCacheDB, BlockchainDb},
66
},
7-
utils::{b160_to_h160, b256_to_h256, h160_to_b160, h256_to_b256, ru256_to_u256, u256_to_ru256},
7+
utils::{b160_to_h160, b256_to_h256, h256_to_b256, u256_to_ru256},
88
};
99
use ethers::{
1010
core::abi::ethereum_types::BigEndianHash,
1111
providers::Middleware,
12-
types::{Address, Block, BlockId, Bytes, Transaction, H256, U256},
12+
types::{Block, BlockId, NameOrAddress, Transaction},
1313
utils::keccak256,
1414
};
1515
use foundry_common::NON_ARCHIVE_NODE_WARNING;
@@ -21,7 +21,7 @@ use futures::{
2121
};
2222
use revm::{
2323
db::DatabaseRef,
24-
primitives::{AccountInfo, Address as aB160, Bytecode, B256, KECCAK_EMPTY, U256 as rU256},
24+
primitives::{AccountInfo, Address, Bytecode, Bytes, B256, KECCAK_EMPTY, U256},
2525
};
2626
use std::{
2727
collections::{hash_map::Entry, HashMap, VecDeque},
@@ -37,20 +37,20 @@ use std::{
3737
type AccountFuture<Err> =
3838
Pin<Box<dyn Future<Output = (Result<(U256, U256, Bytes), Err>, Address)> + Send>>;
3939
type StorageFuture<Err> = Pin<Box<dyn Future<Output = (Result<U256, Err>, Address, U256)> + Send>>;
40-
type BlockHashFuture<Err> = Pin<Box<dyn Future<Output = (Result<H256, Err>, u64)> + Send>>;
40+
type BlockHashFuture<Err> = Pin<Box<dyn Future<Output = (Result<B256, Err>, u64)> + Send>>;
4141
type FullBlockFuture<Err> = Pin<
4242
Box<
4343
dyn Future<Output = (FullBlockSender, Result<Option<Block<Transaction>>, Err>, BlockId)>
4444
+ Send,
4545
>,
4646
>;
4747
type TransactionFuture<Err> = Pin<
48-
Box<dyn Future<Output = (TransactionSender, Result<Option<Transaction>, Err>, H256)> + Send>,
48+
Box<dyn Future<Output = (TransactionSender, Result<Option<Transaction>, Err>, B256)> + Send>,
4949
>;
5050

5151
type AccountInfoSender = OneshotSender<DatabaseResult<AccountInfo>>;
5252
type StorageSender = OneshotSender<DatabaseResult<U256>>;
53-
type BlockHashSender = OneshotSender<DatabaseResult<H256>>;
53+
type BlockHashSender = OneshotSender<DatabaseResult<B256>>;
5454
type FullBlockSender = OneshotSender<DatabaseResult<Block<Transaction>>>;
5555
type TransactionSender = OneshotSender<DatabaseResult<Transaction>>;
5656

@@ -75,7 +75,7 @@ enum BackendRequest {
7575
/// Fetch an entire block with transactions
7676
FullBlock(BlockId, FullBlockSender),
7777
/// Fetch a transaction
78-
Transaction(H256, TransactionSender),
78+
Transaction(B256, TransactionSender),
7979
/// Sets the pinned block to fetch data from
8080
SetPinnedBlock(BlockId),
8181
}
@@ -139,17 +139,17 @@ where
139139
match req {
140140
BackendRequest::Basic(addr, sender) => {
141141
trace!(target: "backendhandler", "received request basic address={:?}", addr);
142-
let acc = self.db.accounts().read().get(&h160_to_b160(addr)).cloned();
142+
let acc = self.db.accounts().read().get(&addr).cloned();
143143
if let Some(basic) = acc {
144144
let _ = sender.send(Ok(basic));
145145
} else {
146146
self.request_account(addr, sender);
147147
}
148148
}
149149
BackendRequest::BlockHash(number, sender) => {
150-
let hash = self.db.block_hashes().read().get(&rU256::from(number)).cloned();
150+
let hash = self.db.block_hashes().read().get(&U256::from(number)).cloned();
151151
if let Some(hash) = hash {
152-
let _ = sender.send(Ok(b256_to_h256(hash)));
152+
let _ = sender.send(Ok(hash));
153153
} else {
154154
self.request_hash(number, sender);
155155
}
@@ -162,14 +162,10 @@ where
162162
}
163163
BackendRequest::Storage(addr, idx, sender) => {
164164
// account is already stored in the cache
165-
let value = self
166-
.db
167-
.storage()
168-
.read()
169-
.get(&h160_to_b160(addr))
170-
.and_then(|acc| acc.get(&u256_to_ru256(idx)).copied());
165+
let value =
166+
self.db.storage().read().get(&addr).and_then(|acc| acc.get(&idx).copied());
171167
if let Some(value) = value {
172-
let _ = sender.send(Ok(ru256_to_u256(value)));
168+
let _ = sender.send(Ok(value));
173169
} else {
174170
// account present but not storage -> fetch storage
175171
self.request_account_storage(addr, idx, sender);
@@ -194,9 +190,15 @@ where
194190
let block_id = self.block_id;
195191
let fut = Box::pin(async move {
196192
// serialize & deserialize back to U256
197-
let idx_req = H256::from_uint(&idx);
198-
let storage = provider.get_storage_at(address, idx_req, block_id).await;
199-
let storage = storage.map(|storage| storage.into_uint());
193+
let idx_req = B256::from(idx);
194+
let storage = provider
195+
.get_storage_at(
196+
NameOrAddress::Address(b160_to_h160(address)),
197+
b256_to_h256(idx_req),
198+
block_id,
199+
)
200+
.await;
201+
let storage = storage.map(|storage| storage.into_uint()).map(u256_to_ru256);
200202
(storage, address, idx)
201203
});
202204
self.pending_requests.push(ProviderRequest::Storage(fut));
@@ -210,10 +212,14 @@ where
210212
let provider = self.provider.clone();
211213
let block_id = self.block_id;
212214
let fut = Box::pin(async move {
213-
let balance = provider.get_balance(address, block_id);
214-
let nonce = provider.get_transaction_count(address, block_id);
215-
let code = provider.get_code(address, block_id);
216-
let resp = tokio::try_join!(balance, nonce, code);
215+
let balance =
216+
provider.get_balance(NameOrAddress::Address(b160_to_h160(address)), block_id);
217+
let nonce = provider
218+
.get_transaction_count(NameOrAddress::Address(b160_to_h160(address)), block_id);
219+
let code = provider.get_code(NameOrAddress::Address(b160_to_h160(address)), block_id);
220+
let resp = tokio::try_join!(balance, nonce, code).map(|(balance, nonce, code)| {
221+
(u256_to_ru256(balance), u256_to_ru256(nonce), Bytes::from(code.0))
222+
});
217223
(resp, address)
218224
});
219225
ProviderRequest::Account(fut)
@@ -244,10 +250,10 @@ where
244250
}
245251

246252
/// process a request for a transactions
247-
fn request_transaction(&mut self, tx: H256, sender: TransactionSender) {
253+
fn request_transaction(&mut self, tx: B256, sender: TransactionSender) {
248254
let provider = self.provider.clone();
249255
let fut = Box::pin(async move {
250-
let block = provider.get_transaction(tx).await;
256+
let block = provider.get_transaction(b256_to_h256(tx)).await;
251257
(sender, block, tx)
252258
});
253259

@@ -282,7 +288,7 @@ where
282288
Err(err)
283289
}
284290
};
285-
(block_hash, number)
291+
(block_hash.map(h256_to_b256), number)
286292
});
287293
self.pending_requests.push(ProviderRequest::BlockHash(fut));
288294
}
@@ -332,7 +338,7 @@ where
332338
if let Some(listeners) = pin.account_requests.remove(&addr) {
333339
listeners.into_iter().for_each(|l| {
334340
let _ = l.send(Err(DatabaseError::GetAccount(
335-
h160_to_b160(addr),
341+
addr,
336342
Arc::clone(&err),
337343
)));
338344
})
@@ -350,14 +356,14 @@ where
350356

351357
// update the cache
352358
let acc = AccountInfo {
353-
nonce: nonce.as_u64(),
354-
balance: u256_to_ru256(balance),
359+
nonce: nonce.to(),
360+
balance,
355361
code: code.map(|bytes| {
356362
Bytecode::new_raw(alloy_primitives::Bytes(bytes)).to_checked()
357363
}),
358364
code_hash,
359365
};
360-
pin.db.accounts().write().insert(h160_to_b160(addr), acc.clone());
366+
pin.db.accounts().write().insert(addr, acc.clone());
361367

362368
// notify all listeners
363369
if let Some(listeners) = pin.account_requests.remove(&addr) {
@@ -380,8 +386,8 @@ where
380386
{
381387
listeners.into_iter().for_each(|l| {
382388
let _ = l.send(Err(DatabaseError::GetStorage(
383-
h160_to_b160(addr),
384-
u256_to_ru256(idx),
389+
addr,
390+
idx,
385391
Arc::clone(&err),
386392
)));
387393
})
@@ -391,12 +397,7 @@ where
391397
};
392398

393399
// update the cache
394-
pin.db
395-
.storage()
396-
.write()
397-
.entry(h160_to_b160(addr))
398-
.or_default()
399-
.insert(u256_to_ru256(idx), u256_to_ru256(value));
400+
pin.db.storage().write().entry(addr).or_default().insert(idx, value);
400401

401402
// notify all listeners
402403
if let Some(listeners) = pin.storage_requests.remove(&(addr, idx)) {
@@ -427,10 +428,7 @@ where
427428
};
428429

429430
// update the cache
430-
pin.db
431-
.block_hashes()
432-
.write()
433-
.insert(rU256::from(number), h256_to_b256(value));
431+
pin.db.block_hashes().write().insert(U256::from(number), value);
434432

435433
// notify all listeners
436434
if let Some(listeners) = pin.block_requests.remove(&number) {
@@ -459,12 +457,10 @@ where
459457
if let Poll::Ready((sender, tx, tx_hash)) = fut.poll_unpin(cx) {
460458
let msg = match tx {
461459
Ok(Some(tx)) => Ok(tx),
462-
Ok(None) => {
463-
Err(DatabaseError::TransactionNotFound(h256_to_b256(tx_hash)))
464-
}
460+
Ok(None) => Err(DatabaseError::TransactionNotFound(tx_hash)),
465461
Err(err) => {
466462
let err = Arc::new(eyre::Error::new(err));
467-
Err(DatabaseError::GetTransaction(h256_to_b256(tx_hash), err))
463+
Err(DatabaseError::GetTransaction(tx_hash, err))
468464
}
469465
};
470466
let _ = sender.send(msg);
@@ -605,7 +601,7 @@ impl SharedBackend {
605601
}
606602

607603
/// Returns the transaction for the hash
608-
pub fn get_transaction(&self, tx: H256) -> DatabaseResult<Transaction> {
604+
pub fn get_transaction(&self, tx: B256) -> DatabaseResult<Transaction> {
609605
tokio::task::block_in_place(|| {
610606
let (sender, rx) = oneshot_channel();
611607
let req = BackendRequest::Transaction(tx, sender);
@@ -632,7 +628,7 @@ impl SharedBackend {
632628
})
633629
}
634630

635-
fn do_get_block_hash(&self, number: u64) -> DatabaseResult<H256> {
631+
fn do_get_block_hash(&self, number: u64) -> DatabaseResult<B256> {
636632
tokio::task::block_in_place(|| {
637633
let (sender, rx) = oneshot_channel();
638634
let req = BackendRequest::BlockHash(number, sender);
@@ -650,9 +646,9 @@ impl SharedBackend {
650646
impl DatabaseRef for SharedBackend {
651647
type Error = DatabaseError;
652648

653-
fn basic(&self, address: aB160) -> Result<Option<AccountInfo>, Self::Error> {
649+
fn basic(&self, address: Address) -> Result<Option<AccountInfo>, Self::Error> {
654650
trace!( target: "sharedbackend", "request basic {:?}", address);
655-
self.do_get_basic(b160_to_h160(address)).map_err(|err| {
651+
self.do_get_basic(address).map_err(|err| {
656652
error!(target: "sharedbackend", ?err, ?address, "Failed to send/recv `basic`");
657653
if err.is_possibly_non_archive_node_error() {
658654
error!(target: "sharedbackend", "{NON_ARCHIVE_NODE_WARNING}");
@@ -665,26 +661,26 @@ impl DatabaseRef for SharedBackend {
665661
Err(DatabaseError::MissingCode(hash))
666662
}
667663

668-
fn storage(&self, address: aB160, index: rU256) -> Result<rU256, Self::Error> {
664+
fn storage(&self, address: Address, index: U256) -> Result<U256, Self::Error> {
669665
trace!( target: "sharedbackend", "request storage {:?} at {:?}", address, index);
670-
match self.do_get_storage(b160_to_h160(address), ru256_to_u256(index)).map_err(|err| {
666+
match self.do_get_storage(address, index).map_err(|err| {
671667
error!( target: "sharedbackend", ?err, ?address, ?index, "Failed to send/recv `storage`");
672668
if err.is_possibly_non_archive_node_error() {
673669
error!(target: "sharedbackend", "{NON_ARCHIVE_NODE_WARNING}");
674670
}
675671
err
676672
}) {
677-
Ok(val) => Ok(u256_to_ru256(val)),
673+
Ok(val) => Ok(val),
678674
Err(err) => Err(err),
679675
}
680676
}
681677

682-
fn block_hash(&self, number: rU256) -> Result<B256, Self::Error> {
683-
if number > rU256::from(u64::MAX) {
678+
fn block_hash(&self, number: U256) -> Result<B256, Self::Error> {
679+
if number > U256::from(u64::MAX) {
684680
return Ok(KECCAK_EMPTY)
685681
}
686-
let number: U256 = ru256_to_u256(number);
687-
let number = number.as_u64();
682+
let number: U256 = number;
683+
let number = number.to();
688684
trace!( target: "sharedbackend", "request block hash for number {:?}", number);
689685
match self.do_get_block_hash(number).map_err(|err| {
690686
error!(target: "sharedbackend",?err, ?number, "Failed to send/recv `block_hash`");
@@ -693,7 +689,7 @@ impl DatabaseRef for SharedBackend {
693689
}
694690
err
695691
}) {
696-
Ok(val) => Ok(h256_to_b256(val)),
692+
Ok(val) => Ok(val),
697693
Err(err) => Err(err),
698694
}
699695
}
@@ -726,9 +722,9 @@ mod tests {
726722
let backend = SharedBackend::spawn_backend(Arc::new(provider), db.clone(), None).await;
727723

728724
// some rng contract from etherscan
729-
let address: aB160 = "63091244180ae240c87d1f528f5f269134cb07b3".parse().unwrap();
725+
let address: Address = "63091244180ae240c87d1f528f5f269134cb07b3".parse().unwrap();
730726

731-
let idx = rU256::from(0u64);
727+
let idx = U256::from(0u64);
732728
let value = backend.storage(address, idx).unwrap();
733729
let account = backend.basic(address).unwrap().unwrap();
734730

@@ -739,15 +735,15 @@ mod tests {
739735
assert_eq!(slots.len(), 1);
740736
assert_eq!(slots.get(&idx).copied().unwrap(), value);
741737

742-
let num = rU256::from(10u64);
738+
let num = U256::from(10u64);
743739
let hash = backend.block_hash(num).unwrap();
744740
let mem_hash = *db.block_hashes().read().get(&num).unwrap();
745741
assert_eq!(hash, mem_hash);
746742

747743
let max_slots = 5;
748744
let handle = std::thread::spawn(move || {
749745
for i in 1..max_slots {
750-
let idx = rU256::from(i);
746+
let idx = U256::from(i);
751747
let _ = backend.storage(address, idx);
752748
}
753749
});
@@ -785,16 +781,16 @@ mod tests {
785781
let backend = Backend::spawn(Some(fork)).await;
786782

787783
// some rng contract from etherscan
788-
let address: aB160 = "63091244180ae240c87d1f528f5f269134cb07b3".parse().unwrap();
784+
let address: Address = "63091244180ae240c87d1f528f5f269134cb07b3".parse().unwrap();
789785

790-
let idx = rU256::from(0u64);
786+
let idx = U256::from(0u64);
791787
let _value = backend.storage(address, idx);
792788
let _account = backend.basic(address);
793789

794790
// fill some slots
795791
let num_slots = 10u64;
796792
for idx in 1..num_slots {
797-
let _ = backend.storage(address, rU256::from(idx));
793+
let _ = backend.storage(address, U256::from(idx));
798794
}
799795
drop(backend);
800796

crates/evm/src/executor/fork/init.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::utils::{
22
apply_chain_and_block_specific_env_changes, h160_to_b160, h256_to_b256, u256_to_ru256,
33
};
4+
use alloy_primitives::{Address, U256};
45
use ethers::{
56
providers::Middleware,
6-
types::{Address, Block, TxHash, U256},
7+
types::{Block, TxHash},
78
};
89
use eyre::WrapErr;
910
use foundry_common::NON_ARCHIVE_NODE_WARNING;
@@ -79,8 +80,8 @@ where
7980
gas_limit: u256_to_ru256(block.gas_limit),
8081
},
8182
tx: TxEnv {
82-
caller: h160_to_b160(origin),
83-
gas_price: u256_to_ru256(gas_price.map(U256::from).unwrap_or(fork_gas_price)),
83+
caller: origin,
84+
gas_price: gas_price.map(U256::from).unwrap_or(u256_to_ru256(fork_gas_price)),
8485
chain_id: Some(override_chain_id.unwrap_or(rpc_chain_id.as_u64())),
8586
gas_limit: block.gas_limit.as_u64(),
8687
..Default::default()

0 commit comments

Comments
 (0)