Skip to content

Commit b5a8ad5

Browse files
committed
chore: migrate from alloy 0.6.4 to 1.0.9
This migration updates the codebase to use alloy 1.0.9, which includes several breaking API changes: - Provider architecture changes: BoxTransport replaced with DynProvider - Transaction field access: tx.from replaced with tx.inner.signer() - Trace API methods now use builder pattern with .trace_types() - Updated deprecated methods (on_http -> connect_http, etc.) - Removed boolean parameters from log decoding methods - Fixed type parameters and imports throughout the codebase All tests pass after migration.
1 parent 559b654 commit b5a8ad5

File tree

10 files changed

+842
-315
lines changed

10 files changed

+842
-315
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ cryo_cli = { version = "0.3.2", path = "./crates/cli" }
1919
cryo_freeze = { version = "0.3.2", path = "./crates/freeze" }
2020
cryo_to_df = { version = "0.3.2", path = "./crates/to_df" }
2121

22-
alloy = { version = "0.6.4", features = [
22+
alloy = { version = "1.0.9", features = [
2323
"full",
2424
"rpc-types-trace",
2525
"provider-ws",

crates/cli/src/parse/blocks.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -395,8 +395,8 @@ mod tests {
395395
use std::path::PathBuf;
396396

397397
use alloy::{
398-
providers::{IpcConnect, ProviderBuilder},
399-
transports::ipc::MockIpcServer,
398+
providers::{Provider, ProviderBuilder},
399+
transports::ipc::{IpcConnect, MockIpcServer},
400400
};
401401

402402
use super::*;
@@ -412,7 +412,7 @@ mod tests {
412412
mock_ipc_path: PathBuf,
413413
) {
414414
let ipc = IpcConnect::new(mock_ipc_path);
415-
let provider = ProviderBuilder::new().on_ipc(ipc).await.unwrap().boxed();
415+
let provider = ProviderBuilder::new().connect_ipc(ipc).await.unwrap().erased();
416416
let source = Source {
417417
provider,
418418
semaphore: Arc::new(None),
@@ -478,7 +478,7 @@ mod tests {
478478
mock_ipc_path: PathBuf,
479479
) {
480480
let ipc = IpcConnect::new(mock_ipc_path);
481-
let provider = ProviderBuilder::new().on_ipc(ipc).await.unwrap().boxed();
481+
let provider = ProviderBuilder::new().connect_ipc(ipc).await.unwrap().erased();
482482
let source = Arc::new(Source {
483483
provider,
484484
chain_id: 1,
@@ -554,8 +554,11 @@ mod tests {
554554
tests: Vec<(BlockNumberTest<'_>, bool)>,
555555
mock_ipc_path: PathBuf,
556556
) {
557-
let provider =
558-
ProviderBuilder::new().on_ipc(IpcConnect::new(mock_ipc_path)).await.unwrap().boxed();
557+
let provider = ProviderBuilder::new()
558+
.connect_ipc(IpcConnect::new(mock_ipc_path))
559+
.await
560+
.unwrap()
561+
.erased();
559562
let source = Source {
560563
provider,
561564
semaphore: Arc::new(None),

crates/cli/src/parse/source.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
use std::env;
1+
use std::{env, sync::Arc};
22

33
use crate::args::Args;
44
use alloy::{
5-
providers::{Provider, ProviderBuilder, RootProvider},
6-
rpc::client::{BuiltInConnectionString, ClientBuilder, RpcClient},
7-
transports::{layers::RetryBackoffLayer, BoxTransport},
5+
providers::{Provider, ProviderBuilder},
6+
rpc::client::ClientBuilder,
7+
transports::layers::RetryBackoffLayer,
88
};
99
use cryo_freeze::{ParseError, Source, SourceLabels};
1010
use governor::{Quota, RateLimiter};
11-
use polars::prelude::*;
1211
use std::num::NonZeroU32;
1312

1413
pub(crate) async fn parse_source(args: &Args) -> Result<Source, ParseError> {
@@ -19,14 +18,12 @@ pub(crate) async fn parse_source(args: &Args) -> Result<Source, ParseError> {
1918
args.initial_backoff,
2019
args.compute_units_per_second,
2120
);
22-
let connect: BuiltInConnectionString = rpc_url.parse().map_err(ParseError::ProviderError)?;
23-
let client: RpcClient<BoxTransport> = ClientBuilder::default()
21+
let client = ClientBuilder::default()
2422
.layer(retry_layer)
25-
.connect_boxed(connect)
23+
.connect(&rpc_url)
2624
.await
27-
.map_err(ParseError::ProviderError)?
28-
.boxed();
29-
let provider: RootProvider<BoxTransport> = ProviderBuilder::default().on_client(client);
25+
.map_err(ParseError::ProviderError)?;
26+
let provider = ProviderBuilder::default().connect_client(client).erased();
3027
let chain_id = provider.get_chain_id().await.map_err(ParseError::ProviderError)?;
3128
let rate_limiter = match args.requests_per_second {
3229
Some(rate_limit) => match (NonZeroU32::new(1), NonZeroU32::new(rate_limit)) {

crates/cli/src/parse/timestamps.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,9 @@ mod tests {
325325
use std::num::NonZeroU32;
326326

327327
use alloy::{
328-
providers::ProviderBuilder,
329-
rpc::client::{BuiltInConnectionString, ClientBuilder, RpcClient},
330-
transports::{layers::RetryBackoffLayer, BoxTransport},
328+
providers::{Provider, ProviderBuilder},
329+
rpc::client::ClientBuilder,
330+
transports::layers::RetryBackoffLayer,
331331
};
332332
use governor::{Quota, RateLimiter};
333333

@@ -345,16 +345,13 @@ mod tests {
345345
let max_concurrent_requests = 100;
346346
let retry_layer =
347347
RetryBackoffLayer::new(max_retry, initial_backoff, compute_units_per_second);
348-
let connect: BuiltInConnectionString =
349-
rpc_url.parse().map_err(ParseError::ProviderError).unwrap();
350-
let client: RpcClient<BoxTransport> = ClientBuilder::default()
348+
let client = ClientBuilder::default()
351349
.layer(retry_layer)
352-
.connect_boxed(connect)
350+
.connect(&rpc_url)
353351
.await
354352
.map_err(ParseError::ProviderError)
355-
.unwrap()
356-
.boxed();
357-
let provider = ProviderBuilder::default().on_client(client);
353+
.unwrap();
354+
let provider = ProviderBuilder::default().connect_client(client).erased();
358355
let quota = Quota::per_second(NonZeroU32::new(15).unwrap())
359356
.allow_burst(NonZeroU32::new(1).unwrap());
360357
let rate_limiter = Some(RateLimiter::direct(quota));

crates/freeze/src/datasets/logs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ fn process_logs(logs: Vec<Log>, columns: &mut Logs, schema: &Table) -> R<()> {
136136
if let (Some(decoder), Some(indexed_keys), Some(body_keys)) =
137137
(&schema.log_decoder, &indexed_keys, &body_keys)
138138
{
139-
match decoder.event.decode_log(&log.inner.data, true) {
139+
match decoder.event.decode_log(&log.inner.data) {
140140
Ok(log) => {
141141
// for param in log.indexed {
142142
// if decode_keys.contains(param.name.as_str()) {

crates/freeze/src/datasets/transactions.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ impl CollectByBlock for Transactions {
9393
// filter by from_address
9494
let from_filter: Box<dyn Fn(&Transaction) -> bool + Send> =
9595
if let Some(from_address) = &request.from_address {
96-
Box::new(move |tx| tx.from == Address::from_slice(from_address))
96+
Box::new(move |tx| tx.inner.signer() == Address::from_slice(from_address))
9797
} else {
9898
Box::new(|_| true)
9999
};
@@ -228,7 +228,7 @@ pub(crate) fn process_transaction(
228228
store!(schema, columns, block_number, tx.block_number.map(|x| x as u32));
229229
store!(schema, columns, transaction_index, tx.transaction_index);
230230
store!(schema, columns, transaction_hash, tx.inner.tx_hash().to_vec());
231-
store!(schema, columns, from_address, tx.from.to_vec());
231+
store!(schema, columns, from_address, tx.inner.signer().to_vec());
232232
store!(
233233
schema,
234234
columns,
@@ -277,15 +277,15 @@ pub(crate) fn process_transaction(
277277
}
278278

279279
fn get_max_fee_per_gas(tx: &Transaction) -> Option<u64> {
280-
match &tx.inner {
280+
match tx.inner.as_ref() {
281281
alloy::consensus::TxEnvelope::Legacy(_) => None,
282282
alloy::consensus::TxEnvelope::Eip2930(_) => None,
283283
_ => Some(tx.inner.max_fee_per_gas() as u64),
284284
}
285285
}
286286

287287
pub(crate) fn get_gas_price(block: &Block, tx: &Transaction) -> Option<u64> {
288-
match &tx.inner {
288+
match tx.inner.as_ref() {
289289
alloy::consensus::TxEnvelope::Legacy(_) => tx.gas_price().map(|gas_price| gas_price as u64),
290290
alloy::consensus::TxEnvelope::Eip2930(_) => {
291291
tx.gas_price().map(|gas_price| gas_price as u64)

crates/freeze/src/types/decoders/log_decoder.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ impl LogDecoder {
6262
.collect();
6363

6464
for log in logs {
65-
match self.event.decode_log_parts(log.topics().to_vec(), log.data().data.as_ref(), true)
66-
{
65+
match self.event.decode_log_parts(log.topics().to_vec(), log.data().data.as_ref()) {
6766
Ok(decoded) => {
6867
for (idx, param) in decoded.indexed.into_iter().enumerate() {
6968
map.entry(indexed_keys[idx].clone()).or_default().push(param);

crates/freeze/src/types/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub use datatypes::*;
5959
pub use files::{ColumnEncoding, FileFormat, FileOutput, SubDir};
6060
pub use queries::{Query, QueryLabels, TimeDimension};
6161
pub use schemas::{ColumnType, SchemaFunctions, Schemas, Table, U256Type};
62-
pub use sources::{Fetcher, RateLimiter, Source, SourceLabels};
62+
pub use sources::{RateLimiter, Source, SourceLabels};
6363
// pub(crate) use summaries::FreezeSummaryAgg;
6464
// pub use summaries::{FreezeChunkSummary, FreezeSummary};
6565
pub use summaries::{print_all_datasets, print_dataset_info, FreezeSummary};

crates/freeze/src/types/sources.rs

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use alloy::{
55
primitives::{Address, BlockNumber, Bytes, TxHash, B256, U256},
66
providers::{
77
ext::{DebugApi, TraceApi},
8-
Provider, ProviderBuilder, RootProvider,
8+
DynProvider, Provider, ProviderBuilder,
99
},
1010
rpc::types::{
1111
trace::{
@@ -22,7 +22,7 @@ use alloy::{
2222
Block, BlockTransactions, BlockTransactionsKind, Filter, Log, Transaction,
2323
TransactionInput, TransactionReceipt, TransactionRequest,
2424
},
25-
transports::{http::reqwest::Url, BoxTransport, RpcError, TransportErrorKind},
25+
transports::{http::reqwest::Url, RpcError, TransportErrorKind},
2626
};
2727
use governor::{
2828
clock::DefaultClock,
@@ -43,7 +43,7 @@ pub type RateLimiter = governor::RateLimiter<NotKeyed, InMemoryState, DefaultClo
4343
#[derive(Clone, Debug)]
4444
pub struct Source {
4545
/// provider
46-
pub provider: RootProvider<BoxTransport>,
46+
pub provider: DynProvider,
4747
/// chain_id of network
4848
pub chain_id: u64,
4949
/// number of blocks per log request
@@ -119,7 +119,7 @@ impl Source {
119119
pub async fn init(rpc_url: Option<String>) -> Result<Source> {
120120
let rpc_url: String = parse_rpc_url(rpc_url);
121121
let parsed_rpc_url: Url = rpc_url.parse().expect("rpc url is not valid");
122-
let provider = ProviderBuilder::new().on_http(parsed_rpc_url.clone());
122+
let provider = ProviderBuilder::new().connect_http(parsed_rpc_url.clone());
123123
let chain_id = provider
124124
.get_chain_id()
125125
.await
@@ -128,10 +128,10 @@ impl Source {
128128
let rate_limiter = None;
129129
let semaphore = None;
130130

131-
let provider = ProviderBuilder::new().on_http(parsed_rpc_url);
131+
let provider = ProviderBuilder::new().connect_http(parsed_rpc_url);
132132

133133
let source = Source {
134-
provider: provider.boxed(),
134+
provider: provider.erased(),
135135
chain_id,
136136
inner_request_size: DEFAULT_INNER_REQUEST_SIZE,
137137
max_concurrent_chunks: Some(DEFAULT_MAX_CONCURRENT_CHUNKS),
@@ -210,17 +210,6 @@ pub struct SourceLabels {
210210
pub initial_backoff: Option<u64>,
211211
}
212212

213-
/// Wrapper over `Provider<P>` that adds concurrency and rate limiting controls
214-
#[derive(Debug)]
215-
pub struct Fetcher<P> {
216-
/// provider data source
217-
pub provider: RootProvider<P>,
218-
/// semaphore for controlling concurrency
219-
pub semaphore: Option<Semaphore>,
220-
/// rate limiter for controlling request rate
221-
pub rate_limiter: Option<RateLimiter>,
222-
}
223-
224213
type Result<T> = ::core::result::Result<T, CollectError>;
225214

226215
// impl<P: JsonRpcClient> Fetcher<P> {
@@ -238,9 +227,12 @@ impl Source {
238227
trace_types: Vec<TraceType>,
239228
) -> Result<Vec<TraceResultsWithTransactionHash>> {
240229
let _permit = self.permit_request().await;
241-
Self::map_err(
242-
self.provider.trace_replay_block_transactions(block.into(), &trace_types).await,
243-
)
230+
let trace_result = self
231+
.provider
232+
.trace_replay_block_transactions(block.into())
233+
.trace_types(trace_types)
234+
.await;
235+
Self::map_err(trace_result)
244236
}
245237

246238
/// Get state diff traces of block
@@ -298,7 +290,9 @@ impl Source {
298290
trace_types: Vec<TraceType>,
299291
) -> Result<TraceResults> {
300292
let _permit = self.permit_request().await;
301-
Self::map_err(self.provider.trace_replay_transaction(tx_hash, &trace_types).await)
293+
let trace_result =
294+
self.provider.trace_replay_transaction(tx_hash).trace_types(trace_types).await;
295+
Self::map_err(trace_result)
302296
}
303297

304298
/// Get state diff traces of transaction
@@ -348,7 +342,11 @@ impl Source {
348342
kind: BlockTransactionsKind,
349343
) -> Result<Option<Block>> {
350344
let _permit = self.permit_request().await;
351-
Self::map_err(self.provider.get_block(block_num.into(), kind).await)
345+
let block_result = match kind {
346+
BlockTransactionsKind::Full => self.provider.get_block(block_num.into()).await,
347+
BlockTransactionsKind::Hashes => self.provider.get_block(block_num.into()).await,
348+
};
349+
Self::map_err(block_result)
352350
}
353351

354352
/// Gets the block with `block_hash` (transaction hashes only)
@@ -358,7 +356,11 @@ impl Source {
358356
kind: BlockTransactionsKind,
359357
) -> Result<Option<Block>> {
360358
let _permit = self.permit_request().await;
361-
Self::map_err(self.provider.get_block(block_hash.into(), kind).await)
359+
let block_result = match kind {
360+
BlockTransactionsKind::Full => self.provider.get_block(block_hash.into()).await,
361+
BlockTransactionsKind::Hashes => self.provider.get_block(block_hash.into()).await,
362+
};
363+
Self::map_err(block_result)
362364
}
363365

364366
/// Returns all receipts for a block.
@@ -398,7 +400,7 @@ impl Source {
398400
block_number: BlockNumber,
399401
) -> Result<Bytes> {
400402
let _permit = self.permit_request().await;
401-
Self::map_err(self.provider.call(&transaction).block(block_number.into()).await)
403+
Self::map_err(self.provider.call(transaction).block(block_number.into()).await)
402404
}
403405

404406
/// Returns traces for given call data
@@ -411,10 +413,14 @@ impl Source {
411413
let _permit = self.permit_request().await;
412414
if let Some(bn) = block_number {
413415
return Self::map_err(
414-
self.provider.trace_call(&transaction, &trace_type).block_id(bn.into()).await,
416+
self.provider
417+
.trace_call(&transaction)
418+
.trace_types(trace_type.clone())
419+
.block_id(bn.into())
420+
.await,
415421
);
416422
}
417-
Self::map_err(self.provider.trace_call(&transaction, &trace_type).await)
423+
Self::map_err(self.provider.trace_call(&transaction).trace_types(trace_type.clone()).await)
418424
}
419425

420426
/// Get nonce of address
@@ -495,7 +501,7 @@ impl Source {
495501
..Default::default()
496502
};
497503
let _permit = self.permit_request().await;
498-
Self::map_err(self.provider.call(&transaction).block(block_number.into()).await)
504+
Self::map_err(self.provider.call(transaction).block(block_number.into()).await)
499505
}
500506

501507
/// Return output data of a contract call
@@ -515,12 +521,15 @@ impl Source {
515521
if block_number.is_some() {
516522
Self::map_err(
517523
self.provider
518-
.trace_call(&transaction, &trace_type)
524+
.trace_call(&transaction)
525+
.trace_types(trace_type.clone())
519526
.block_id(block_number.unwrap().into())
520527
.await,
521528
)
522529
} else {
523-
Self::map_err(self.provider.trace_call(&transaction, &trace_type).await)
530+
Self::map_err(
531+
self.provider.trace_call(&transaction).trace_types(trace_type.clone()).await,
532+
)
524533
}
525534
}
526535

0 commit comments

Comments
 (0)