From d5a76ea1c7f204f6a5a2e438b6682956bdcedee2 Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:30:38 +0530 Subject: [PATCH 1/3] fix(`provider`): return `Subscription` --- crates/provider/src/provider/trait.rs | 60 +++++++++++---------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/crates/provider/src/provider/trait.rs b/crates/provider/src/provider/trait.rs index f12a15c643a..97eb171717f 100644 --- a/crates/provider/src/provider/trait.rs +++ b/crates/provider/src/provider/trait.rs @@ -8,11 +8,12 @@ use crate::{ EthCall, Identity, PendingTransaction, PendingTransactionBuilder, PendingTransactionConfig, ProviderBuilder, ProviderCall, RootProvider, RpcWithBlock, SendableTx, }; -use alloy_consensus::BlockHeader; use alloy_eips::eip2718::Encodable2718; use alloy_json_rpc::{RpcError, RpcParam, RpcReturn}; use alloy_network::{Ethereum, Network}; -use alloy_network_primitives::{BlockResponse, BlockTransactionsKind, ReceiptResponse}; +use alloy_network_primitives::{ + BlockResponse, BlockTransactionsKind, HeaderResponse, ReceiptResponse, +}; use alloy_primitives::{ hex, Address, BlockHash, BlockNumber, Bytes, StorageKey, StorageValue, TxHash, B256, U128, U256, U64, @@ -225,11 +226,10 @@ pub trait Provider: Some(base_fee) if base_fee != 0 => base_fee, _ => { // empty response, fetch basefee from latest block directly - self.get_block_by_number(BlockNumberOrTag::Latest, BlockTransactionsKind::Hashes) + self.get_block_by_number(BlockNumberOrTag::Latest, false) .await? .ok_or(RpcError::NullResp)? .header() - .as_ref() .base_fee_per_gas() .ok_or(RpcError::UnsupportedFeature("eip1559"))? .into() @@ -285,7 +285,10 @@ pub trait Provider: ) -> TransportResult> { match block { BlockId::Hash(hash) => self.get_block_by_hash(hash.into(), kind).await, - BlockId::Number(number) => self.get_block_by_number(number, kind).await, + BlockId::Number(number) => { + let full = matches!(kind, BlockTransactionsKind::Full); + self.get_block_by_number(number, full).await + } } } @@ -321,19 +324,14 @@ pub trait Provider: async fn get_block_by_number( &self, number: BlockNumberOrTag, - kind: BlockTransactionsKind, + hydrate: bool, ) -> TransportResult> { - let full = match kind { - BlockTransactionsKind::Full => true, - BlockTransactionsKind::Hashes => false, - }; - let block = self .client() - .request::<_, Option>("eth_getBlockByNumber", (number, full)) + .request::<_, Option>("eth_getBlockByNumber", (number, hydrate)) .await? .map(|mut block| { - if !full { + if !hydrate { // this ensures an empty response for `Hashes` has the expected form // this is required because deserializing [] is ambiguous block.transactions_mut().convert_to_hashes(); @@ -801,7 +799,7 @@ pub trait Provider: #[cfg(feature = "pubsub")] async fn subscribe_blocks( &self, - ) -> TransportResult> { + ) -> TransportResult> { self.root().pubsub_frontend()?; let id = self.client().request("eth_subscribe", ("newHeads",)).await?; self.root().get_subscription(id).await @@ -1351,9 +1349,8 @@ mod tests { let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(2); let mut n = 1; - while let Some(block) = stream.next().await { - assert_eq!(block.header.number, n); - assert_eq!(block.transactions.hashes().len(), 0); + while let Some(header) = stream.next().await { + assert_eq!(header.number, n); n += 1; } } @@ -1372,9 +1369,8 @@ mod tests { let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(2); let mut n = 1; - while let Some(block) = stream.next().await { - assert_eq!(block.header.number, n); - assert_eq!(block.transactions.hashes().len(), 0); + while let Some(header) = stream.next().await { + assert_eq!(header.number, n); n += 1; } } @@ -1390,9 +1386,9 @@ mod tests { let provider = RootProvider::<_, Ethereum>::new(client); let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(1); - while let Some(block) = stream.next().await { - println!("New block {:?}", block); - assert!(block.header.number > 0); + while let Some(header) = stream.next().await { + println!("New block {:?}", header); + assert!(header.number > 0); } } @@ -1517,8 +1513,7 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = - provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); + let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); let hash = block.header.hash; let block = provider.get_block_by_hash(hash, BlockTransactionsKind::Full).await.unwrap().unwrap(); @@ -1530,8 +1525,7 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = - provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); + let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); let hash = block.header.hash; let block: Block = provider .raw_request::<(B256, bool), Block>("eth_getBlockByHash".into(), (hash, true)) @@ -1545,8 +1539,7 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = - provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); + let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); assert_eq!(block.header.number, num); } @@ -1555,8 +1548,7 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = - provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); + let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); assert_eq!(block.header.number, num); } @@ -1780,11 +1772,7 @@ mod tests { async fn test_empty_transactions() { let provider = ProviderBuilder::new().on_anvil(); - let block = provider - .get_block_by_number(0.into(), BlockTransactionsKind::Hashes) - .await - .unwrap() - .unwrap(); + let block = provider.get_block_by_number(0.into(), false).await.unwrap().unwrap(); assert!(block.transactions.is_hashes()); } } From e35b836da56426cfad4c80452b8d9073f21fc80a Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:41:01 +0530 Subject: [PATCH 2/3] Revert "fix(`provider`): return `Subscription`" This reverts commit d5a76ea1c7f204f6a5a2e438b6682956bdcedee2. --- crates/provider/src/provider/trait.rs | 60 ++++++++++++++++----------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/crates/provider/src/provider/trait.rs b/crates/provider/src/provider/trait.rs index 97eb171717f..f12a15c643a 100644 --- a/crates/provider/src/provider/trait.rs +++ b/crates/provider/src/provider/trait.rs @@ -8,12 +8,11 @@ use crate::{ EthCall, Identity, PendingTransaction, PendingTransactionBuilder, PendingTransactionConfig, ProviderBuilder, ProviderCall, RootProvider, RpcWithBlock, SendableTx, }; +use alloy_consensus::BlockHeader; use alloy_eips::eip2718::Encodable2718; use alloy_json_rpc::{RpcError, RpcParam, RpcReturn}; use alloy_network::{Ethereum, Network}; -use alloy_network_primitives::{ - BlockResponse, BlockTransactionsKind, HeaderResponse, ReceiptResponse, -}; +use alloy_network_primitives::{BlockResponse, BlockTransactionsKind, ReceiptResponse}; use alloy_primitives::{ hex, Address, BlockHash, BlockNumber, Bytes, StorageKey, StorageValue, TxHash, B256, U128, U256, U64, @@ -226,10 +225,11 @@ pub trait Provider: Some(base_fee) if base_fee != 0 => base_fee, _ => { // empty response, fetch basefee from latest block directly - self.get_block_by_number(BlockNumberOrTag::Latest, false) + self.get_block_by_number(BlockNumberOrTag::Latest, BlockTransactionsKind::Hashes) .await? .ok_or(RpcError::NullResp)? .header() + .as_ref() .base_fee_per_gas() .ok_or(RpcError::UnsupportedFeature("eip1559"))? .into() @@ -285,10 +285,7 @@ pub trait Provider: ) -> TransportResult> { match block { BlockId::Hash(hash) => self.get_block_by_hash(hash.into(), kind).await, - BlockId::Number(number) => { - let full = matches!(kind, BlockTransactionsKind::Full); - self.get_block_by_number(number, full).await - } + BlockId::Number(number) => self.get_block_by_number(number, kind).await, } } @@ -324,14 +321,19 @@ pub trait Provider: async fn get_block_by_number( &self, number: BlockNumberOrTag, - hydrate: bool, + kind: BlockTransactionsKind, ) -> TransportResult> { + let full = match kind { + BlockTransactionsKind::Full => true, + BlockTransactionsKind::Hashes => false, + }; + let block = self .client() - .request::<_, Option>("eth_getBlockByNumber", (number, hydrate)) + .request::<_, Option>("eth_getBlockByNumber", (number, full)) .await? .map(|mut block| { - if !hydrate { + if !full { // this ensures an empty response for `Hashes` has the expected form // this is required because deserializing [] is ambiguous block.transactions_mut().convert_to_hashes(); @@ -799,7 +801,7 @@ pub trait Provider: #[cfg(feature = "pubsub")] async fn subscribe_blocks( &self, - ) -> TransportResult> { + ) -> TransportResult> { self.root().pubsub_frontend()?; let id = self.client().request("eth_subscribe", ("newHeads",)).await?; self.root().get_subscription(id).await @@ -1349,8 +1351,9 @@ mod tests { let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(2); let mut n = 1; - while let Some(header) = stream.next().await { - assert_eq!(header.number, n); + while let Some(block) = stream.next().await { + assert_eq!(block.header.number, n); + assert_eq!(block.transactions.hashes().len(), 0); n += 1; } } @@ -1369,8 +1372,9 @@ mod tests { let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(2); let mut n = 1; - while let Some(header) = stream.next().await { - assert_eq!(header.number, n); + while let Some(block) = stream.next().await { + assert_eq!(block.header.number, n); + assert_eq!(block.transactions.hashes().len(), 0); n += 1; } } @@ -1386,9 +1390,9 @@ mod tests { let provider = RootProvider::<_, Ethereum>::new(client); let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(1); - while let Some(header) = stream.next().await { - println!("New block {:?}", header); - assert!(header.number > 0); + while let Some(block) = stream.next().await { + println!("New block {:?}", block); + assert!(block.header.number > 0); } } @@ -1513,7 +1517,8 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); + let block = + provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); let hash = block.header.hash; let block = provider.get_block_by_hash(hash, BlockTransactionsKind::Full).await.unwrap().unwrap(); @@ -1525,7 +1530,8 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); + let block = + provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); let hash = block.header.hash; let block: Block = provider .raw_request::<(B256, bool), Block>("eth_getBlockByHash".into(), (hash, true)) @@ -1539,7 +1545,8 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); + let block = + provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); assert_eq!(block.header.number, num); } @@ -1548,7 +1555,8 @@ mod tests { let provider = ProviderBuilder::new().on_anvil(); let num = 0; let tag: BlockNumberOrTag = num.into(); - let block = provider.get_block_by_number(tag, true).await.unwrap().unwrap(); + let block = + provider.get_block_by_number(tag, BlockTransactionsKind::Full).await.unwrap().unwrap(); assert_eq!(block.header.number, num); } @@ -1772,7 +1780,11 @@ mod tests { async fn test_empty_transactions() { let provider = ProviderBuilder::new().on_anvil(); - let block = provider.get_block_by_number(0.into(), false).await.unwrap().unwrap(); + let block = provider + .get_block_by_number(0.into(), BlockTransactionsKind::Hashes) + .await + .unwrap() + .unwrap(); assert!(block.transactions.is_hashes()); } } From b3c3a19b03b4d67466b43169a5a65cb311b02e6d Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Wed, 30 Oct 2024 18:44:30 +0530 Subject: [PATCH 3/3] fix --- crates/provider/src/provider/trait.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/crates/provider/src/provider/trait.rs b/crates/provider/src/provider/trait.rs index f12a15c643a..61d7c2080dc 100644 --- a/crates/provider/src/provider/trait.rs +++ b/crates/provider/src/provider/trait.rs @@ -801,7 +801,7 @@ pub trait Provider: #[cfg(feature = "pubsub")] async fn subscribe_blocks( &self, - ) -> TransportResult> { + ) -> TransportResult> { self.root().pubsub_frontend()?; let id = self.client().request("eth_subscribe", ("newHeads",)).await?; self.root().get_subscription(id).await @@ -1351,9 +1351,8 @@ mod tests { let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(2); let mut n = 1; - while let Some(block) = stream.next().await { - assert_eq!(block.header.number, n); - assert_eq!(block.transactions.hashes().len(), 0); + while let Some(header) = stream.next().await { + assert_eq!(header.number, n); n += 1; } } @@ -1372,9 +1371,8 @@ mod tests { let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(2); let mut n = 1; - while let Some(block) = stream.next().await { - assert_eq!(block.header.number, n); - assert_eq!(block.transactions.hashes().len(), 0); + while let Some(header) = stream.next().await { + assert_eq!(header.number, n); n += 1; } } @@ -1390,9 +1388,9 @@ mod tests { let provider = RootProvider::<_, Ethereum>::new(client); let sub = provider.subscribe_blocks().await.unwrap(); let mut stream = sub.into_stream().take(1); - while let Some(block) = stream.next().await { - println!("New block {:?}", block); - assert!(block.header.number > 0); + while let Some(header) = stream.next().await { + println!("New block {:?}", header); + assert!(header.number > 0); } }