@@ -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} ;
99use 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} ;
1515use foundry_common:: NON_ARCHIVE_NODE_WARNING ;
@@ -21,7 +21,7 @@ use futures::{
2121} ;
2222use 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} ;
2626use std:: {
2727 collections:: { hash_map:: Entry , HashMap , VecDeque } ,
@@ -37,20 +37,20 @@ use std::{
3737type AccountFuture < Err > =
3838 Pin < Box < dyn Future < Output = ( Result < ( U256 , U256 , Bytes ) , Err > , Address ) > + Send > > ;
3939type 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 > > ;
4141type FullBlockFuture < Err > = Pin <
4242 Box <
4343 dyn Future < Output = ( FullBlockSender , Result < Option < Block < Transaction > > , Err > , BlockId ) >
4444 + Send ,
4545 > ,
4646> ;
4747type 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
5151type AccountInfoSender = OneshotSender < DatabaseResult < AccountInfo > > ;
5252type StorageSender = OneshotSender < DatabaseResult < U256 > > ;
53- type BlockHashSender = OneshotSender < DatabaseResult < H256 > > ;
53+ type BlockHashSender = OneshotSender < DatabaseResult < B256 > > ;
5454type FullBlockSender = OneshotSender < DatabaseResult < Block < Transaction > > > ;
5555type 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 {
650646impl 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
0 commit comments