From be6bc1703918efaaadf446dbec00a348dfb8f3d7 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:52:00 +0200 Subject: [PATCH 01/53] revive/rpc: add database schema for ethereum-substrate block mapping --- .../0003_create_eth_substrate_block_mapping.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql diff --git a/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql b/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql new file mode 100644 index 0000000000000..d4c2370e1bbea --- /dev/null +++ b/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS eth_to_substrate_blocks ( + ethereum_block_hash BLOB NOT NULL PRIMARY KEY, + substrate_block_hash BLOB NOT NULL, + block_number INTEGER NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_substrate_block_hash ON eth_to_substrate_blocks ( + substrate_block_hash +); + +CREATE INDEX IF NOT EXISTS idx_block_number ON eth_to_substrate_blocks ( + block_number +); \ No newline at end of file From 322267c185e2d3a4cadb2a168024afc14866d37d Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:52:43 +0200 Subject: [PATCH 02/53] revive/rpc: add core ethereum-substrate block mapping infrastructure --- .../frame/revive/rpc/src/receipt_provider.rs | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index fd4c9e3854b43..416e2155d60ee 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -99,6 +99,91 @@ impl ReceiptProvider { Some((block_hash, transaction_index)) } + /// Insert a block mapping from Ethereum block hash to Substrate block hash. + pub async fn insert_block_mapping( + &self, + ethereum_block_hash: &H256, + substrate_block_hash: &H256, + block_number: u64, + ) -> Result<(), ClientError> { + let ethereum_hash = ethereum_block_hash.as_ref(); + let substrate_hash = substrate_block_hash.as_ref(); + let block_number = block_number as i64; + + query!( + r#" + INSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash, block_number) + VALUES ($1, $2, $3) + "#, + ethereum_hash, + substrate_hash, + block_number + ) + .execute(&self.pool) + .await?; + + Ok(()) + } + + /// Get the Substrate block hash for the given Ethereum block hash. + pub async fn get_substrate_hash(&self, ethereum_block_hash: &H256) -> Option { + let ethereum_hash = ethereum_block_hash.as_ref(); + let result = query!( + r#" + SELECT substrate_block_hash + FROM eth_to_substrate_blocks + WHERE ethereum_block_hash = $1 + "#, + ethereum_hash + ) + .fetch_optional(&self.pool) + .await + .ok()??; + + Some(H256::from_slice(&result.substrate_block_hash[..])) + } + + /// Get the Ethereum block hash for the given Substrate block hash. + pub async fn get_ethereum_hash(&self, substrate_block_hash: &H256) -> Option { + let substrate_hash = substrate_block_hash.as_ref(); + let result = query!( + r#" + SELECT ethereum_block_hash + FROM eth_to_substrate_blocks + WHERE substrate_block_hash = $1 + "#, + substrate_hash + ) + .fetch_optional(&self.pool) + .await + .ok()??; + + Some(H256::from_slice(&result.ethereum_block_hash[..])) + } + + /// Remove block mappings for the given Ethereum block hashes. + pub async fn remove_block_mappings( + &self, + ethereum_block_hashes: &[H256], + ) -> Result<(), ClientError> { + if ethereum_block_hashes.is_empty() { + return Ok(()); + } + + let placeholders = vec!["?"; ethereum_block_hashes.len()].join(", "); + let sql = format!( + "DELETE FROM eth_to_substrate_blocks WHERE ethereum_block_hash in ({placeholders})" + ); + let mut query = sqlx::query(&sql); + + for ethereum_hash in ethereum_block_hashes { + query = query.bind(ethereum_hash.as_ref()); + } + + query.execute(&self.pool).await?; + Ok(()) + } + /// Deletes older records from the database. pub async fn remove(&self, block_hashes: &[H256]) -> Result<(), ClientError> { if block_hashes.is_empty() { @@ -113,14 +198,21 @@ impl ReceiptProvider { let sql = format!("DELETE FROM logs WHERE block_hash in ({placeholders})"); let mut delete_logs_query = sqlx::query(&sql); + let sql = format!( + "DELETE FROM eth_to_substrate_blocks WHERE substrate_block_hash in ({placeholders})" + ); + let mut delete_mappings_query = sqlx::query(&sql); + for block_hash in block_hashes { delete_tx_query = delete_tx_query.bind(block_hash.as_ref()); delete_logs_query = delete_logs_query.bind(block_hash.as_ref()); + delete_mappings_query = delete_mappings_query.bind(block_hash.as_ref()); } let delete_transaction_hashes = delete_tx_query.execute(&self.pool); let delete_logs = delete_logs_query.execute(&self.pool); - tokio::try_join!(delete_transaction_hashes, delete_logs)?; + let delete_mappings = delete_mappings_query.execute(&self.pool); + tokio::try_join!(delete_transaction_hashes, delete_logs, delete_mappings)?; Ok(()) } From 38fa8a891bb3c527436e6a8bc0c7bfdb70e82be9 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:53:07 +0200 Subject: [PATCH 03/53] revive/rpc: add ethereum block hash resolution to receipt extractor --- substrate/frame/revive/rpc/src/receipt_extractor.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 159ce3248ebc0..8fe3b465afab3 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -376,4 +376,11 @@ impl ReceiptExtractor { ) .await } + + /// Get the Ethereum block hash for the given Substrate block. + pub async fn get_ethereum_block_hash(&self, block: &SubstrateBlock) -> Option { + let substrate_block_number = block.number() as u64; + let substrate_block_hash = block.hash(); + (self.fetch_eth_block_hash)(substrate_block_hash, substrate_block_number).await + } } From 10878e1a01c6be3e8d43eca7634f1ffeaf125ed6 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:53:46 +0200 Subject: [PATCH 04/53] revive/rpc: add automatic block mapping population functionality --- .../frame/revive/rpc/src/receipt_provider.rs | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index 416e2155d60ee..709010c4f68ce 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -184,6 +184,92 @@ impl ReceiptProvider { Ok(()) } + /// Populate missing block mappings for existing blocks. + /// This method can be used to backfill mappings for historical data. + pub async fn populate_missing_mappings( + &self, + substrate_block: &SubstrateBlock, + ) -> Result<(), ClientError> { + let substrate_hash = substrate_block.hash(); + let substrate_hash_ref = substrate_hash.as_ref(); + let block_number = substrate_block.number() as u64; + + // Check if mapping already exists + let existing = query!( + r#" + SELECT EXISTS(SELECT 1 FROM eth_to_substrate_blocks WHERE substrate_block_hash = $1) AS "exists!: bool" + "#, + substrate_hash_ref + ) + .fetch_one(&self.pool) + .await?; + + if existing.exists { + return Ok(()); + } + + // Get the Ethereum block hash and insert mapping + if let Some(ethereum_hash) = + self.receipt_extractor.get_ethereum_block_hash(substrate_block).await + { + self.insert_block_mapping(ðereum_hash, &substrate_hash, block_number).await?; + log::debug!( + target: LOG_TARGET, + "Populated mapping: ETH {:?} -> Substrate {:?} (block #{})", + ethereum_hash, + substrate_hash, + block_number + ); + } + + Ok(()) + } + + /// Batch populate missing mappings for a range of blocks. + /// This is useful for historical data population. + pub async fn batch_populate_mappings( + &self, + start_block: u32, + end_block: u32, + batch_size: usize, + ) -> Result { + let mut populated = 0u32; + let mut current = start_block; + + while current <= end_block { + let batch_end = std::cmp::min(current + batch_size as u32 - 1, end_block); + + for block_num in current..=batch_end { + if let Some(block) = self.block_provider.block_by_number(block_num).await? { + self.populate_missing_mappings(&block).await?; + populated += 1; + } + } + + current = batch_end + 1; + + // Log progress every 100 blocks + if populated % 100 == 0 { + log::info!( + target: LOG_TARGET, + "Block mapping population progress: {} blocks processed (current: {})", + populated, + batch_end + ); + } + } + + log::info!( + target: LOG_TARGET, + "Completed block mapping population: {} mappings created for blocks {}-{}", + populated, + start_block, + end_block + ); + + Ok(populated) + } + /// Deletes older records from the database. pub async fn remove(&self, block_hashes: &[H256]) -> Result<(), ClientError> { if block_hashes.is_empty() { @@ -240,6 +326,14 @@ impl ReceiptProvider { ) -> Result, ClientError> { let receipts = self.receipts_from_block(block).await?; self.insert(block, &receipts).await?; + + // Insert block mapping from Ethereum to Substrate hash + if let Some(ethereum_hash) = self.receipt_extractor.get_ethereum_block_hash(block).await { + let substrate_hash = block.hash(); + let block_number = block.number() as u64; + self.insert_block_mapping(ðereum_hash, &substrate_hash, block_number).await?; + } + Ok(receipts) } From b871ce5d87fa61c5853a947b1700cd8c349b194b Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:54:45 +0200 Subject: [PATCH 05/53] revive/rpc: add client abstraction layer for ethereum block hash mapping --- substrate/frame/revive/rpc/src/client.rs | 59 ++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 6d322ac42aac4..2a8b14f504b42 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -476,6 +476,44 @@ impl Client { self.receipt_provider.receipts_count_per_block(block_hash).await } + /// Get an EVM transaction receipt by Ethereum hash with automatic resolution. + pub async fn receipt_by_ethereum_hash_and_index( + &self, + ethereum_hash: &H256, + transaction_index: usize, + ) -> Option { + if let Some(substrate_hash) = self.resolve_substrate_hash(ethereum_hash).await { + return self.receipt_by_hash_and_index(&substrate_hash, transaction_index).await; + } + // Fallback: treat as Substrate hash + self.receipt_by_hash_and_index(ethereum_hash, transaction_index).await + } + + /// Get receipts count per block using Ethereum block hash with automatic resolution. + pub async fn receipts_count_per_ethereum_block(&self, ethereum_hash: &H256) -> Option { + if let Some(substrate_hash) = self.resolve_substrate_hash(ethereum_hash).await { + return self.receipts_count_per_block(&substrate_hash).await; + } + // Fallback: treat as Substrate hash + self.receipts_count_per_block(ethereum_hash).await + } + + /// Populate missing block mappings for existing blocks. + /// This can be used for historical data population. + pub async fn populate_missing_mappings(&self, substrate_block: &SubstrateBlock) -> Result<(), ClientError> { + self.receipt_provider.populate_missing_mappings(substrate_block).await + } + + /// Batch populate missing mappings for a range of blocks. + pub async fn batch_populate_mappings( + &self, + start_block: SubstrateBlockNumber, + end_block: SubstrateBlockNumber, + batch_size: usize, + ) -> Result { + self.receipt_provider.batch_populate_mappings(start_block, end_block, batch_size).await + } + /// Get the system health. pub async fn system_health(&self) -> Result { let health = self.rpc.system_health().await?; @@ -526,6 +564,27 @@ impl Client { self.block_provider.block_by_hash(hash).await } + /// Resolve Ethereum block hash to Substrate block hash, then get the block. + /// This method provides the abstraction layer needed by the RPC APIs. + pub async fn resolve_substrate_hash(&self, ethereum_hash: &H256) -> Option { + self.receipt_provider.get_substrate_hash(ethereum_hash).await + } + + /// Get a block by Ethereum hash with automatic resolution to Substrate hash. + /// Falls back to treating the hash as a Substrate hash if no mapping exists. + pub async fn block_by_ethereum_hash( + &self, + ethereum_hash: &H256, + ) -> Result>, ClientError> { + // First try to resolve the Ethereum hash to a Substrate hash + if let Some(substrate_hash) = self.resolve_substrate_hash(ethereum_hash).await { + return self.block_by_hash(&substrate_hash).await; + } + + // Fallback: treat the provided hash as a Substrate hash (backward compatibility) + self.block_by_hash(ethereum_hash).await + } + /// Get a block by number pub async fn block_by_number( &self, From 93220bc3adc98ce93bd2bdb2d9a458be6b17f0d2 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:55:27 +0200 Subject: [PATCH 06/53] revive/rpc: integrate ethereum block hash mapping in RPC endpoints --- substrate/frame/revive/rpc/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 3cdb55f6f081a..f3b55fb1d9779 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -214,7 +214,7 @@ impl EthRpcServer for EthRpcServerImpl { block_hash: H256, hydrated_transactions: bool, ) -> RpcResult> { - let Some(block) = self.client.block_by_hash(&block_hash).await? else { + let Some(block) = self.client.block_by_ethereum_hash(&block_hash).await? else { return Ok(None); }; let block = self.client.evm_block(block, hydrated_transactions).await; @@ -275,7 +275,7 @@ impl EthRpcServer for EthRpcServerImpl { } else { self.client.latest_block().await.hash() }; - Ok(self.client.receipts_count_per_block(&block_hash).await.map(U256::from)) + Ok(self.client.receipts_count_per_ethereum_block(&block_hash).await.map(U256::from)) } async fn get_block_transaction_count_by_number( @@ -316,7 +316,7 @@ impl EthRpcServer for EthRpcServerImpl { ) -> RpcResult> { let Some(receipt) = self .client - .receipt_by_hash_and_index( + .receipt_by_ethereum_hash_and_index( &block_hash, transaction_index.try_into().map_err(|_| EthRpcError::ConversionError)?, ) From a0c0c76a7b5ded3f1c3f3a2dd5afd954488cd9c3 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:55:51 +0200 Subject: [PATCH 07/53] revive/rpc: add ethereum block hash support to log filtering --- substrate/frame/revive/rpc/src/receipt_provider.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index 709010c4f68ce..cfe493ea7caa8 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -491,7 +491,14 @@ impl ReceiptProvider { qb.push(" AND block_number <= ").push_bind(to_block.as_u64() as i64); }, (None, None, Some(hash)) => { - qb.push(" AND block_hash = ").push_bind(hash.0.to_vec()); + // Try to resolve Ethereum hash to Substrate hash first + let substrate_hash = if let Some(resolved) = self.get_substrate_hash(&hash).await { + resolved + } else { + // Fallback: treat as Substrate hash for backward compatibility + hash + }; + qb.push(" AND block_hash = ").push_bind(substrate_hash.0.to_vec()); }, (None, None, None) => { qb.push(" AND block_number = ").push_bind(latest_block.as_u64() as i64); From 7a98998ed8309bfc82c8a5bda03755431f652b1c Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:56:45 +0200 Subject: [PATCH 08/53] revive/rpc: add comprehensive test suite for ethereum-substrate block mapping --- .../frame/revive/rpc/src/receipt_provider.rs | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index cfe493ea7caa8..c8122ada34bc6 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -974,4 +974,185 @@ mod tests { assert_eq!(logs, vec![log1.clone(), log2.clone()]); Ok(()) } + + #[sqlx::test] + async fn test_block_mapping_insert_get(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash = H256::from([2u8; 32]); + let block_number = 42u64; + + // Insert mapping + provider + .insert_block_mapping(ðereum_hash, &substrate_hash, block_number) + .await?; + + // Test forward lookup + let resolved = provider.get_substrate_hash(ðereum_hash).await; + assert_eq!(resolved, Some(substrate_hash)); + + // Test reverse lookup + let resolved = provider.get_ethereum_hash(&substrate_hash).await; + assert_eq!(resolved, Some(ethereum_hash)); + + Ok(()) + } + + #[sqlx::test] + async fn test_block_mapping_overwrite(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash1 = H256::from([2u8; 32]); + let substrate_hash2 = H256::from([3u8; 32]); + let block_number = 42u64; + + // Insert first mapping + provider + .insert_block_mapping(ðereum_hash, &substrate_hash1, block_number) + .await?; + assert_eq!(provider.get_substrate_hash(ðereum_hash).await, Some(substrate_hash1)); + + // Insert second mapping (should overwrite) + provider + .insert_block_mapping(ðereum_hash, &substrate_hash2, block_number) + .await?; + assert_eq!(provider.get_substrate_hash(ðereum_hash).await, Some(substrate_hash2)); + + // Old mapping should be gone + assert_eq!(provider.get_ethereum_hash(&substrate_hash1).await, None); + + Ok(()) + } + + #[sqlx::test] + async fn test_block_mapping_remove(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash1 = H256::from([1u8; 32]); + let ethereum_hash2 = H256::from([2u8; 32]); + let substrate_hash1 = H256::from([3u8; 32]); + let substrate_hash2 = H256::from([4u8; 32]); + let block_number = 42u64; + + // Insert mappings + provider + .insert_block_mapping(ðereum_hash1, &substrate_hash1, block_number) + .await?; + provider + .insert_block_mapping(ðereum_hash2, &substrate_hash2, block_number) + .await?; + + // Verify they exist + assert_eq!(provider.get_substrate_hash(ðereum_hash1).await, Some(substrate_hash1)); + assert_eq!(provider.get_substrate_hash(ðereum_hash2).await, Some(substrate_hash2)); + + // Remove one mapping + provider.remove_block_mappings(&[ethereum_hash1]).await?; + + // Verify removal + assert_eq!(provider.get_substrate_hash(ðereum_hash1).await, None); + assert_eq!(provider.get_substrate_hash(ðereum_hash2).await, Some(substrate_hash2)); + + Ok(()) + } + + #[sqlx::test] + async fn test_block_mapping_pruning_integration(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash = H256::from([2u8; 32]); + let block_number = 42u64; + + // Insert mapping + provider + .insert_block_mapping(ðereum_hash, &substrate_hash, block_number) + .await?; + assert_eq!(provider.get_substrate_hash(ðereum_hash).await, Some(substrate_hash)); + + // Remove substrate block (this should also remove the mapping) + provider.remove(&[substrate_hash]).await?; + + // Mapping should be gone + assert_eq!(provider.get_substrate_hash(ðereum_hash).await, None); + + Ok(()) + } + + #[sqlx::test] + async fn test_logs_with_ethereum_block_hash_mapping(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + let ethereum_hash = H256::from([1u8; 32]); + let substrate_hash = H256::from([2u8; 32]); + let block_number = 1u64; + + // Create a log with substrate hash + let log = Log { + block_hash: substrate_hash, + block_number: block_number.into(), + address: H160::from([1u8; 20]), + topics: vec![H256::from([1u8; 32])], + transaction_hash: H256::from([3u8; 32]), + transaction_index: U256::from(0), + log_index: U256::from(0), + data: Some(vec![0u8; 32].into()), + ..Default::default() + }; + + // Insert the log + let block = MockBlockInfo { hash: substrate_hash, number: block_number as u32 }; + let receipts = vec![( + TransactionSigned::default(), + ReceiptInfo { + logs: vec![log.clone()], + transaction_hash: log.transaction_hash, + transaction_index: log.transaction_index, + ..Default::default() + }, + )]; + provider.insert(&block, &receipts).await?; + + // Insert block mapping + provider + .insert_block_mapping(ðereum_hash, &substrate_hash, block_number) + .await?; + + // Query logs using Ethereum block hash (should resolve to substrate hash) + let logs = provider + .logs(Some(Filter { block_hash: Some(ethereum_hash), ..Default::default() })) + .await?; + assert_eq!(logs, vec![log]); + + Ok(()) + } + + async fn count_mappings(pool: &SqlitePool) -> usize { + let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM eth_to_substrate_blocks") + .fetch_one(pool) + .await + .unwrap(); + count as _ + } + + #[sqlx::test] + async fn test_mapping_count(pool: SqlitePool) -> anyhow::Result<()> { + let provider = setup_sqlite_provider(pool).await; + + // Initially no mappings + assert_eq!(count_mappings(&provider.pool).await, 0); + + // Insert some mappings + provider + .insert_block_mapping(&H256::from([1u8; 32]), &H256::from([2u8; 32]), 1) + .await?; + provider + .insert_block_mapping(&H256::from([3u8; 32]), &H256::from([4u8; 32]), 2) + .await?; + + assert_eq!(count_mappings(&provider.pool).await, 2); + + // Remove one + provider.remove_block_mappings(&[H256::from([1u8; 32])]).await?; + assert_eq!(count_mappings(&provider.pool).await, 1); + + Ok(()) + } } From f17a0fdf5bb88aeca0aa0ec987cdacd0c8047d91 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 28 Aug 2025 00:00:53 +0200 Subject: [PATCH 09/53] revive/rpc: update sqlx cache for ethereum-substrate block mapping --- ...69bf6b75295fcd3abfec26b2d6d7e2b28caeb.json | 12 +++++++++++ ...82baef86a7c3d3469873a205805ef342ba031.json | 20 +++++++++++++++++++ ...bd61d257d1ffad222317634327e12be403ab2.json | 20 +++++++++++++++++++ ...d25246c7b20ae8f5d7efa4aaaf915e92cf70f.json | 20 +++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json diff --git a/substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json b/substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json new file mode 100644 index 0000000000000..7079a77b31ea2 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tINSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash, block_number)\n\t\t\tVALUES ($1, $2, $3)\n\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json b/substrate/frame/revive/rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json new file mode 100644 index 0000000000000..bc7541d5297e2 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT substrate_block_hash\n\t\t\tFROM eth_to_substrate_blocks\n\t\t\tWHERE ethereum_block_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "substrate_block_hash", + "ordinal": 0, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "47b830cef6768ed5b119c74037482baef86a7c3d3469873a205805ef342ba031" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json b/substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json new file mode 100644 index 0000000000000..d012a83ef5a13 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT ethereum_block_hash\n\t\t\tFROM eth_to_substrate_blocks\n\t\t\tWHERE substrate_block_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "ethereum_block_hash", + "ordinal": 0, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json b/substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json new file mode 100644 index 0000000000000..f491fedaf5f93 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT EXISTS(SELECT 1 FROM eth_to_substrate_blocks WHERE substrate_block_hash = $1) AS \"exists!: bool\"\n\t\t\t", + "describe": { + "columns": [ + { + "name": "exists!: bool", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f" +} From 162684ef073bceae41ddb6f6faaf96881244d535 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 13:05:37 +0200 Subject: [PATCH 10/53] revive: temporary BlockHash with u64 --- substrate/frame/revive/src/lib.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index 93ba6c0bceb87..3b41355eb0c0a 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -586,7 +586,7 @@ pub mod pallet { /// /// The maximum number of elements stored is capped by the block hash count `BLOCK_HASH_COUNT`. #[pallet::storage] - pub type BlockHash = StorageMap<_, Twox64Concat, U256, H256, ValueQuery>; + pub type BlockHash = StorageMap<_, Twox64Concat, u64, H256, ValueQuery>; /// The details needed to reconstruct the receipt info offchain. /// @@ -699,7 +699,7 @@ pub mod pallet { // Note: This read should be accounted for. let eth_block_num: U256 = block_number.into(); let parent_hash = if eth_block_num > U256::zero() { - BlockHash::::get(eth_block_num - 1) + BlockHash::::get(eth_block_num.as_u64() - 1) } else { H256::default() }; @@ -720,16 +720,17 @@ pub mod pallet { // the method's documentation for computational details. let (block_hash, block, receipt_data) = block_builder.build(transactions); // Put the block hash into storage. - BlockHash::::insert(eth_block_num, block_hash); + BlockHash::::insert(eth_block_num.as_u64(), block_hash); // Prune older block hashes. let block_hash_count = BLOCK_HASH_COUNT; let to_remove = eth_block_num.saturating_sub(block_hash_count.into()).saturating_sub(One::one()); if !to_remove.is_zero() { - >::remove(U256::from( - UniqueSaturatedInto::::unique_saturated_into(to_remove), - )); + >::remove( + U256::from(UniqueSaturatedInto::::unique_saturated_into(to_remove)) + .as_u64(), + ); } // Store the ETH block into the last block. EthereumBlock::::put(block); @@ -1633,7 +1634,7 @@ where /// The Ethereum block number is identical to the Substrate block number. /// If the provided block number is outside of the pruning None is returned. pub fn eth_block_hash_from_number(number: U256) -> Option { - let hash = >::get(number); + let hash = >::get(number.as_u64()); if hash == H256::zero() { None } else { From de8524ec62efae9909255a3ea98eafe8e9ba1d1b Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:37:07 +0200 Subject: [PATCH 11/53] revive/rpc: workaround fetch_gas_price --- substrate/frame/revive/rpc/src/receipt_extractor.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 8fe3b465afab3..08e375c66c551 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -185,7 +185,14 @@ impl ReceiptExtractor { ClientError::RecoverEthAddressFailed })?; - let base_gas_price = (self.fetch_gas_price)(block_hash).await?; + // TODO below causes such errors: + // ``` + // 2025-08-27 23:34:42.026 WARN tokio-runtime-worker eth-rpc: Error extracting extrinsic: SubxtError(Rpc(ClientError(User(UserError { code: 4003, message: "Client error: UnknownBlock: Expect block number from id: BlockId::Hash(0x69a76a3ffb732205f70236a5ac95653680a193dee3c02f489ba88af4e9cc8978)", data: None })))) + // 2025-08-27 23:34:42.026 ERROR tokio-runtime-worker eth-rpc: Failed to process block 9: SubxtError(Rpc(ClientError(User(UserError { code: 4003, message: "Client error: UnknownBlock: Expect block number from id: BlockId::Hash(0x69a76a3ffb732205f70236a5ac95653680a193dee3c02f489ba88af4e9cc8978)", data: None })))) + // 2025-08-27 23:34:42.923 DEBUG tokio-runtime-worker eth-rpc: Processing block receipts for Substrate block 0x84fcafbf84a9cce7d0aa9a6c9ef219c6f4dc1b96697a864a95bb0effeea3d4d3 (block #7) + // ``` + // let base_gas_price = (self.fetch_gas_price)(block_hash).await?; + let base_gas_price = U256::zero(); let tx_info = GenericTransaction::from_signed(signed_tx.clone(), base_gas_price, Some(from)); From a11f36eabae789628c985cb42cf3b2870be485d8 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 27 Aug 2025 23:44:09 +0200 Subject: [PATCH 12/53] revive/rpc: cleanup get_ethereum_block_hash --- .../frame/revive/rpc/src/client/storage_api.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client/storage_api.rs b/substrate/frame/revive/rpc/src/client/storage_api.rs index fa57bc53d31a1..7504d19e4697e 100644 --- a/substrate/frame/revive/rpc/src/client/storage_api.rs +++ b/substrate/frame/revive/rpc/src/client/storage_api.rs @@ -17,7 +17,7 @@ use crate::{ subxt_client::{self, runtime_types::pallet_revive::storage::ContractInfo, SrcChainConfig}, - ClientError, H160, + ClientError, H160, LOG_TARGET, }; use sp_core::H256; use subxt::{storage::Storage, OnlineClient}; @@ -79,10 +79,21 @@ impl StorageApi { } pub async fn get_ethereum_block_hash(&self, number: u64) -> Result { - let key: subxt::dynamic::Value = number.into(); + // TODO revert BlockHash key type to U256 + let key = number.into(); let query = subxt::dynamic::storage("Revive", "BlockHash", vec![key]); - let Some(info) = self.0.fetch(&query).await? else { + let Some(info) = self.0.fetch(&query).await.inspect_err(|e| { + log::error!( + target: LOG_TARGET, + "get_ethereum_block_hash {number} error = {e:?}" + ) + })? + else { + log::error!( + target: LOG_TARGET, + "get_ethereum_block_hash {number} ERROR block not found" + ); return Err(ClientError::EthereumBlockNotFound); }; let bytes = info.into_encoded(); From c335bc84337909bb3086895d3301a6d6b3bd4032 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Mon, 1 Sep 2025 14:57:31 +0200 Subject: [PATCH 13/53] Revert "revive: temporary BlockHash with u64" This reverts commit 162684ef073bceae41ddb6f6faaf96881244d535. --- substrate/frame/revive/src/lib.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index 3b41355eb0c0a..93ba6c0bceb87 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -586,7 +586,7 @@ pub mod pallet { /// /// The maximum number of elements stored is capped by the block hash count `BLOCK_HASH_COUNT`. #[pallet::storage] - pub type BlockHash = StorageMap<_, Twox64Concat, u64, H256, ValueQuery>; + pub type BlockHash = StorageMap<_, Twox64Concat, U256, H256, ValueQuery>; /// The details needed to reconstruct the receipt info offchain. /// @@ -699,7 +699,7 @@ pub mod pallet { // Note: This read should be accounted for. let eth_block_num: U256 = block_number.into(); let parent_hash = if eth_block_num > U256::zero() { - BlockHash::::get(eth_block_num.as_u64() - 1) + BlockHash::::get(eth_block_num - 1) } else { H256::default() }; @@ -720,17 +720,16 @@ pub mod pallet { // the method's documentation for computational details. let (block_hash, block, receipt_data) = block_builder.build(transactions); // Put the block hash into storage. - BlockHash::::insert(eth_block_num.as_u64(), block_hash); + BlockHash::::insert(eth_block_num, block_hash); // Prune older block hashes. let block_hash_count = BLOCK_HASH_COUNT; let to_remove = eth_block_num.saturating_sub(block_hash_count.into()).saturating_sub(One::one()); if !to_remove.is_zero() { - >::remove( - U256::from(UniqueSaturatedInto::::unique_saturated_into(to_remove)) - .as_u64(), - ); + >::remove(U256::from( + UniqueSaturatedInto::::unique_saturated_into(to_remove), + )); } // Store the ETH block into the last block. EthereumBlock::::put(block); @@ -1634,7 +1633,7 @@ where /// The Ethereum block number is identical to the Substrate block number. /// If the provided block number is outside of the pruning None is returned. pub fn eth_block_hash_from_number(number: U256) -> Option { - let hash = >::get(number.as_u64()); + let hash = >::get(number); if hash == H256::zero() { None } else { From 3d93b0f626608080e5f74a20bd1a3a38df7305b7 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:53:13 +0200 Subject: [PATCH 14/53] revive/rpc: regenerate revive_chain.metadata subxt metadata --url ws://localhost:9944 --version 15 > revive_chain.metadata --- .../frame/revive/rpc/revive_chain.metadata | Bin 61568 -> 700215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/substrate/frame/revive/rpc/revive_chain.metadata b/substrate/frame/revive/rpc/revive_chain.metadata index 4c4148fa0b7cfecd729bd7365dfc7b84f44aae8e..c263f4237bc12e27bf527604e7616b0c4ae7f1f2 100644 GIT binary patch literal 700215 zcmeFa4QM3UbuWIere>yRSL@ZF)tX*sUv}5hO(Tp^f{+T&quk)Ykn6H#7;Q!R|V`{uGyVb3>!g911 z^}<&CZF{Rzn7rC)*Frtv9xhdTRXwRD^<ZZx6&>*3Z#g2&_C zZs&HRKKytl>Thi|YK^en8+?DF4gixn4Nj>Epm|(PjxX$1o6WFS-mEsO03J>D_IAT4 z{jN84!ThF+YC=zJb;Gcz-7}^AZWx8#+hINZu(;Ljd?swCA5CsGtJ~3(E-l~fb*q>7 z52cF0;-s1yfyKb9o+|2z{&UaID+NLyS895E&XTylyW8pZ{CXqWt@dg==hwpSlKuN) zvl>O7x1mdFTo>D&ZmZfXX>UX6na*z5t@aw7wtF(&sLK5oYEyMO=qhdH9q4WsTrkC%&J+Sd_v6?7IwRh zR-@Or9hQaA6D!ZZ@X-u6VUA-3wJ<^WU934EOl^nlu-m8=>y7O&>J^vdKloBlG&|eT zdA;z-u(n{Hu7cyvDRmyBEUBe^MkyulD?M3S>xS12w1QgEOBca?As8@PZf`f*;c8u} zc|Aoi{rPk1gqn_DIK=Conph93%|pBiuDsUU3Az~(o0v0P!D zTW$sW4|@=QUdF7~)Y{PgTfU9=uZP&q^@6voH^32d;E2iHooW>RQ$bIz@edFo+CjaQFvSzIq40Mbfa+jRs$>svNYPa+}g}K)cCE^&+6j3?0QeVs&~_3;Otq! zW5K?U0oBxvUZdIQ?Rn}AyEZ1ckN3J^C&aqapl|nir2rW zKRdL)Gw+{JD;wQvJF3>W7uKqKq^zfYsQ=J@iQVdcE$^D2GlQH|mBlCud*F!MkV_b7 z<8D0E-|KJNp|BSrY9Q6@OXc3(kwczRJIl?`AZ6v8kvQB&)^>a9k5+f!P{)Qrrt%^LD8*Q6sb};o`gy0Po~mm7c{^Rh#yC8N*XEp>6sd?UQ|p05jf4Tf^yX;> z%#)Ce{d&h!eXW}oLWBpI7vHb^)z-Ck6SCM-d&$s^R=FcjGhci_`Pa6#LZ0iM`VFmL zwZnJpL;HbxN|ja`5l%ibji-JqS=q=idU+@QIRoUEfL0wcLxk9GCv=5|A`dekOkq!T zpr=si{cdVcnP-{TpH|R)Y8{9Sy#GhZ_+9%j^TB^tIHaPUZ1Jxr;(sqp71hBMFX>*^Wh<3w$=s@qtvze*6_wGT7H{)(Dh z>vry9nt!eJu3algwYz(nS3jtHk%mzNa_sMtu|@RZVdjHr91Bz*8)SulNIuxK4>KP; zt0p!YyLkB@6SnN(LFUE(p^CCi@ajKl{loMg8Gbq5$g+d*YibjJNR`$)ou(V=U+#A( z$f=T=y4-=-Bg6b_!T?S4EHi-_HGZ`L?Eh2i9gBUtF^u{-bp~g3yYcBh33z-gJ~{g4 zS!UEgOCr3qMo76A)p;ss4PhY=U8LjF1^s(&TJewN+wyA$@>wh*W!i31FAS5Ij0ts?}mk9Q;1J;Sh4~ugU3s1;cBPVXbV43%3xc* zRM79(xwqrr%DenA^Zhvxz1qGN*4Lnw;oIdx%&DW6HRjaR3yxDEqW+gUZ$`Wr>v_;! zlI4Kv0&q~3M`(fPVBIZxOsAeuzquvc_j<;|?H4;YJ!t-+9 z{E+$Xf||Vor2yOc<$l=5hpmGCq9tU@{7{CF>}PlTMK!+GxeYz1pub_PqD`nKJLG(D zBMbp?MC^8MXJ9U=DcTeLh>B0L-eNuAVdnj1<*!$_z;ktc@aqYuMtE3m;c4cJOHcwR z8jSJth14hRY37rUt2H@-FEl%~Td}kOcl=Hv))ZqIljW%uRlLyc+@j9$yUDKKlt&p@ zt2i91^d~`B0>al52)ps)%tx0Y4R1AeFNLs>q9``UzE?=3A%2FGm)}PkVplS@T|8M& z{Y^61FvpcUIm*H{%DUUIYCQF~$*jBbC^LaIb$$uBZDU>PSRG@u{avz2>h8xfc^EvD z8R5E`l}&Ozyi@JgLAf6#%xduMnqM+suB$ouGP(qR*Jrp&|4`6RYs;kaZG z->F7^-}roj($(;eb;x>ps%l)bO3!YbJsbOJ;S$`@J0)W1r#Ba01uE^3XVX4z@|{R@wSdd_A#=gG-&j zeA^(A3?h@Q#v=u9Tn~Q@9)+;J+P+{1`}xLqX1yH2%|SL( zvPQ>mC1FZ&1Y?)LgN1z?hIKswi3k^TWt1B^=4boqc=4*ZkKweNxt92j;hvkm;vC0n z435fC0~&z3F#cKyxT|J{qtn3*_S~xx ze7lnyIGUiY?dp>JWyU+HN{ih_ZwGR!QS($!FC_moZxqyA%9}`M!d;#AFIJo8y;E={ z-QB^74t`XRs1i((Zhx05qIy)#+-O&CLljguo1q$4^Hg}Rc6!kHI(P8;W3Wu2z({QA zm#<#DwzRxdUSIv+%Lwl5rpHawLzm89>bL7r8ec3Gd^CHGz*wr;3n37{0_wN=Ev%MZ z%8Me0)G;-CqkXI0xzm>O2Fp{tB*7D`3df{?=-Ksd2kO$LEE;{~dNa zuI^DXD)m{3r*ut(VHSRk+f@5#i=~!P&!4yQ zN%S!;J%(9XZM%bs(XvhP)vL8nR-65Bv6uY#iExhuUV>`~voefvOwHI4MFe~Jxxd?l zr>ht8_2X(@B2w+J(~qv=GZ0!%yQ(}95TNtT!k={?f+ki3e4_yP2tkB*`R-Pu8})o1)s*B; z3-Gt0)U{{)YP50(ZUg*Rgt_dqU|s;h8*NkzrM++Gfp$w=H!%G>5H-NXH-l6L2YCfQ z3Y8)?=6z%T;Wqm{9I}xaC<^8nAWN`0<~^+!eFSv2aX`VqZ3$o;&s9WHK-(b#ai9d# zK^#jQ*=R`KD8hR@Hy;R`p~tM#x1hs7*DE3pi@3+h&^caR^x@ZSibCMl zi`vHO)^alnui#v;8Y2{lI{%sb`kHzD5=Ppr)^1&-xmNddiRVgLP|EPwN$>L;IMKK4 zC%MCVpXDnR(E%!c*zUJT?;ae^Rt5OH2a|zQDHp?4MZ_?;ab#)HaZyp0x8Iwdy&p!61Fg;0(a zqifmWf|86*!vXYhn=vzr_P#Yd3R!D24BI{pi#qfuztnF-j}a_S2asa`Z%&6~muCmg zo6VT_lYO8uSWl&_(F1SyyYOE1;t8%U1rVsaov6`UgHlk3T)8J|A<_23K)U!4^ zd2NdkRXqdseAJJ}h_n5W*x5`2ze=r>(kQ0aE)n}MBLc90Ao;=F2lCYyGg$`%i~?>` z-m21frK%oVW`>4o7KSc`q6n4g>{&ZY@X9xbtOsj<80i*uTG$`>+TS!u7Jg@xsSZ&d5KL|+|UZOreXsEOhH>pGS?nE&J;Zo|OqnV|&i>|}kMp)ilg%Wnj2JH$InVq1buLqS zP|J#Szho%P>6>*-__TgHDBWngH}3`FaqlM?i2Zn^0hn%h?hg{ zSJHMKWPS8XUHr=8K&7{(*N?u0Gza-ZohV$<8GKW8p;c$`G_oBmFG_^tRp8EdBJSV1 z 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 z

`Dut>(1lQ?wW?uzWzBCl>*9d=n;bJdy zC5d%37!a0|@?~1xvG9%9hxa^I_W8J8$529-8+mPsokAtPi;*pt+Z?BWV=4k^qvlcR z75|_v-`~#u7p=G5zFAtOQLC;UP(I%tn`eS+k!~vOb-VFgmfiZymH0tE+42Go4R$;R zE3%8Udpw^migg3?VcL*9;|09WSo^qJn{3zmV`9NaPdBJQTl`+5A5pkev>%*@S+)62LNm|{f*}BYyTis

iY9BmZmR?qTxrYD@ib`5Yy~`O%UZ%jKN(=B0|D`Fl}WZfwh|*_Y~Q*s8=$D- zJd$N`7@6lp5U^HO9Ia|H^|N)B5;}AQ2>95xEIY=k;hJ5>t!3#dY#>le#fC@tSQVPk zwU<|6wU8(~)&}s10EcqTDd8NoX{nvP5T81H%)lw}}lz$)U zy@QPxhNM~os5|ZqRz*;7mS6nh`SMdm&uX5n#njQ@|3ISdEOSR90A8Yl9KPz$Bu`0HmreI80^Xdy7o?#47Gz>JnG}0EWO^B1cfJ zz1_g*6j&VoBIN?q`e6T%K{w1Tz$-H%8yJK;N?9i#t!JD<|Pvn52tiMRiI=yMTHupCGsamqcbm9K&lLzzpIRrj3-QZKXqqTk`TJc|%0yx`s zWZ42GU|hydEwq8XEt5iwtpU_8zOtEUSa=tdnTpCl&s0kCh@74OI6AQqLZ5pFWN$ER^m5{2LiYk2C0KiVQ_LL zR;S}wy7ppCSwrxHdi=sF@JmsvBgzF3(r7vx@|?x9LI-MO_0S@}hY}$s;SJ1-Om~|4 zfhb-QQT-Itvl``g6C$C1`a6ze?lBhS$D;xEfG^^X8$u`{DW12m51@-d>>Pt>xMCvo zw!q*%qv-&VJ%EH;4p=@Mlxw$K#kRlUL!7%t@Ij4ohb_(n3-zOlp)eS&8oaUz|)N2G>s2)!0&9z>g@m>5J z?NcRf9f6KLBI5nuqZ2!;_$|7$D~rVdNoZ7cbA%+`+DpYV;wVdIC6G!!xuM#JJbN@Z zZ2og~ozV^*yrk;wUBD6hek7lk^jq3s@%dQ3aK)V+=UDkGeB}%zn>@8(`l5@cBKwLs zuXhXyE6>_USB%>pcOHZk{OSeviXh#9wVReiDIpWsL+X@nP++`7OU2RMjac0g4sl~= z=*sd*u0J|%&xY)z&E10*cg+Vcm-n^7%ZtYbF7VNuQ$D8hiT53P-=XaASXnX9>#UNW zL(AnoXVy9bEV|oSHub*zg8m|$xY|8#?U~K+s^5zs4Y@iHd;I*a(*qz+mdN7>09tpy zh27u(up8|2<|g8eGH5MX-QBJn62+JI!q29&F8F)SmYZm|x9OE>esUp%KF!TlZ$ySd zwKaHCO2X-C*D$@O1`mS5hsuBvsT+-0a}1Sy55aX9&--N*vj9oHKZ9yM0IH~D_K3yE zk&)f)wCRR+*BLH7-c4+n_A#MF> z%)UB>2O*ffGXTTBV+uabtGKhry3p)U$R83U^*O2ZiKqgWRs!iyWS=nj_u&tht7t6;w8-8$IDr{{^;6hPg2dWRHZo0a2M(kPj}ici?EP_7 zcU@fSVZ*;TaecmmcDlJSH)k|GNQ%Cv-Ci^6nY6KTiB+Vyyf+IBxsPYpAY@82yQqv} z?)t-Ekg$`bBK=?*_qw_6eRo#_qm~6DF#Ku5@$4pVu zJ{RH)qU_;tS|o@=n5l%6`DW{jcV+X4mRY>)hh^3InwAvdgWr>kaK!dPBG`-a z@V&Bo=SFv%bCLCRc=}|1m3x!aS1Ji22A4JzqX7(D6v0JgO*t!u3QO3lXK}~xrazCP z5-`Zy?^3+T{?b^iNVrcYL+$6jy=s&iv&#N5peGURIViz6Y_WrxRg))C?V5#=++y|%?Fa4)<&I-{~qG9+cgJjCC z*uk+00ewJs7KM+!Zw^;nJoixdLksuF*r?-<(j}9m%f3Dgd1BmwO7jqYRL36SLj~X( zx?UQr@WGPVUQGH%SHukt?!QgnC9iez18f!d*8pwxmCZm?pHR!D#~$4p+;#HBkg&uK zlB+kIkk0cwM9P&I#iH|>Z9nq&hTLPb$8(qtr)DzVkmy|@^-xCh^@M=?W1o9f-y5>L zTUPVjU_^PqfhCn_&w-sSk18?S_s+^5jq&*S*u?qdFto-krtfvR};D=fdJ6+&S-QHr7)NWRjB=+uxoNa@m;fHOK9@P4i+z5*j^G zDZg337`wN}P&#io+|={*s`nxG;0&xVSeaV%!*s;2pn4M&h+_+JE3iWe%JxlMEBEn+ zb%>9nyS|c~`-gL=O{ zX71da4Q=93ih+q|ycrVT?Q2^!+*#@J!nU+C_hS@qRuFg9F#tbNx-%zep^gf%rp3gM z?;p!wkHfgqxqGgD9{EfxVX3q8M4qq2V|z3WWwvs2`GAv?rlHQW`<&pt;OX=KZBYaOky=jN*2JHAMQNxwl7DswBa37~iKcD1p#H*?g_I>HT9 zASbx6uIZ)4_uJNLc*jDu*3LSxCuLcIhmu;{O|fScT;+6I1q;C9MsIUno?_?49ym}8 z+U0O#Q7p&pn4Dw>zb#(b6T!^cpk;m52LfkF=2Qr)>bQ;nZKb&AOWGt{+1aLY?8cp5 zc4+boFNtA$Mn?Q3G)~^tgp-6Ab)f*@4^px$P-U_;b#Z8oa=b`b+I93yDI#@x(jg|2 zdM8LqRbCdbN@$X<%@DJ9D2Tk-KFiQC?k+DwwZ&<>NN$O5O)VYCVHYZ#+uZ)ZSpJ2J z@%1^co&ZPer!$x2*IQd%>uv|zdF;q7J%eLN2+&UNapOgIr^uclVU?&ypj4R`BE}Rb zgNnVAkVpq4eWlE+b5-+tUJh$hRWxg6$KzwWp}E=lk>IVELo~vb_H~N@vJzWc zoiEX^l4WaFg(u-hTt;uduzDQPy86)l&X369{KQzjLCce4dm6MniEEKYBu|cw?-def zN>=B5W_-&3&7T^Zt#OrnG9RCsH^woNy>Bf4HUHb6J>&n(wrVdRI0bm{(-I$<`&$+2{2$CWOr-YY3|u;?ZS zGTR8-2QIQd85ASCLQhypSn1^|fh95K;qGRSKJFG#m25WXI}bd#=}xo7U4tbvlBK{@AjT*p5;Tc$s?!a zE-aA{sGP)Wn>g%*+nsG)HEw}z?dfxo0Vob>hrPEVqY+%?GS3C{`ZesTOXb zze*U%k8ANvlrPh-2;fR;XgvklIVIp`B&GnJWG+V4XJFf@{2=uV%_;+BV_W3|cQUY$BdJK zz6`9GId@wqH(Y}m<=c*pK2J?m42nc|sR#=CoaROir_foGQcD76Z#B8xJA=Ks?Vqvb0X+gzh8@1XFKz!N{xscn=@>{e^gNF!)mD>s0}e^>Z#b zjX8CImr_zXEzhflY3Ub_$im{pE##2i+`V}#TEN19aBvxaT@I_qR`;?cWHb)2;1=9= zZRt!nkAU%VgOpYT`%4_TIxqDaFOC@9j^vYqQxkDVkGwCxBC3Aymc@sabHFr%;x z7ECxlT7cMs@y6SpPnQ`gTE7+R>yID>J9{VnYTJoXsa4TNk4i%5S_y@UpR8O$Yq??{ z#IUE?{1PoTH8u|&yzO`RlAq_3xMgc?fEc0yRn&KTA8~9mo_(s zL+i-a8nx*S@isnnJ-^Cr#PVki1d^vYq06Z#QAup;lv~Oq_btGe^{P#-Vo7vgL}}fil>DO2Ce}7=IW{#mzZ(dpizIEq)c7UDI-r1 z&x-xl6JU#JV}Fv34?3CW!R>Pp$7O_V_IT^^0Z#@jg0&7j91D+n8kpP}B>SDjaU(5+ z<*?A+ZSqcH-IO{hC*M{ddX@7*NZEIZ{?&Z>2X?O3yWwExY7KsNK+tk&DB~O&C zOF5u5B~pJH1Ga7XX{4<~aVTa4bj>i}1kjERHO;>9(X9m&ptpBuRiA{Xd12vZuJg(= zNmU-kFhevQlQ_g)c*}Z8g5SdiV4RJ$EpSFk6DrWpa|yY!U?c6sc%ObG^GsJF9V_UP zv$;O}xJfc3D%LNn^1-M6lT(l93r48>@@5pKOR9*1yf+Bw_bLlw!OGBoKw|AZAcU>U z2~gk&4%?KdoUK)Zf!Wb`4EQTHO>CYb6cwVlkAr*lQaQ5lW42Z9zc^)=Qc!|y?+oX@ zr%A(IDs2<4?yT8=6RoH7bL-s2VH`b8Z@Iaa0SJGIYqLX7-}fvA_BZQOJBx2Wh}7iD zEpZS4NzfWh&D>~iCV-m~jjOVNYQG@?YLe0`zOfbY1F!YofQnKrLL(>Tg#T{D)}iHt zZhB!Uk-{9T)69b#yX5v%H*S(;g2b|Mi5InGc5rtU0xGc#{=Ui0V=;tFpSl*MdNu3p z#dQ-=OP1;ny1jYUYnBNPkkX_vNvPGC@1b4E7ES4wm!!i@c;y**Buy7*k`bb-g2`%E zovi8a{boo$OTx3=#Dl2K@|TIkcka)pE7#l-ePZgnrK#e>87AXYH|^p<Vm8 z?Z`+eEtn`SZx>$%!+ZmY_R8YtSP?);d*5u) zF^+L(h+2|`&gp-t#cNP`Iw_4IO4r5lC>po$eBR}`?#{7db_LfCWGq#Z1nu(d8n(bs zO@977kHIA{fw#-{YDV`(VLRlQ%3*^38f2MwyQ^lTRL|2)V z+YnO~=WU6$<28_dzlHuZEp_@=+GHA{Ww;p7i?KjsEG6vnRORNj@j-WDZIXs;#q!DH zo?RWm-nsW~_JnPg!{ey#W0@**tid!VCl4QFix+)__qe;Kgr5DoGbKIPhi$2Eu3?)B z1p(KfOw*>hJz%3x9{FbfQO-x@#uXXns21<-=)T3?w35I-{V9eOIy>i;a6J~zbXdGS zcM<7a;>D8NALwmk`_A*Na@g~Nii>-_JKQ^}HMy&&39g?3&#$=03ANR2+Qi>0F{HPV zW^YmKYCKEKH(bxMGUc{^c(>bOp+vQ=fI)N|s^zEqkiWaMw)y_1ai|>(vdKT%tW*aYdva4?2>a?`~-0OA1`W<3O5;!N@0-x#p`r zpCTHh>#q=P-cT~c`3QC`CP(WF*;BKhy@0Eb`_pI?Bv{i07Zq6LaVE$yY&zb`8ONwqmsag!;1^@_UDS zTPw6RX@wfn?Cm1^MxALVhn>mu{Z?sayha&HKgkd=T>((YIY5cE`}A;FCOxb89t+UJ ziJ)Y_Xt7R;cTs!%)^Ud~s8olp`6>1s7(-P`k%H>i8kMhvIBaV`2u23|vzsa?63A}+Q_ z7uOt*Ga!UK;l2nNnLc1CD+#+UMuuk%%ZISoCYJx}qn~RcuaC1Ad!KwH*qeRxU16Dd zc>A$zAZ`R0n#dvl@PROE;M=E|h=KyRsA?F-hsAdX$g_WQ;!9Wjt%O*PV+l`NwNTT; z^Wb^$;51YaP5Kx_Qz1XZKQss{)7p~R@U7HWWCmnE)Ely~<|?SBGCprXDMM3-Tf`uh z67`xW%8Z$mD74;PEe#V{GYVNz3{7JN`Ic8y7$joEJ!JgK7?@9OYNfe}?xF3%F^o*? zamq5i=cV2$11fQft}>Uf@6 z_0=#eI7t&k)-$A1_k{^M*<#k(p4ldec8;&D)D!~00loTS`4Lsmp6pM5IiedadnYhZ zsDE;0X5_4yf3@VNd@^h0r{jW&C22>?6tnMnEX&WjFEqZ+1zN{s`awP6;0pkE#d7~UFEeyrABoQ3b1f72}Izy zDNT%bXR9&DLfry1ml72=4bv!l?xFL*J~}pHiC`DTs!Xtt4mp&R&~u4gm5f`&CgtOA z#1-W}=I+86xmq6`%P#fL;Aj}Weu9C@ zaJzwzplON@)}{AACA&Oi_|gZTkIybt9%H5U*-xxGdu{N$iv#uk@jW!a&2>&aeh*BR6iTT}~TlhwH?kh@e-;$pAWq(hSkVNx)8`No+^2a;5NLeFmK({tM zqHNDM#>P`Zp6?X+Rf`{QCT*UMq{_>_xcvGU_;tckl$YEL?aOY=PsM6euGfjHzIx9V zp{;L%LwewJ37L3=CcOrU>(Ezo`YgNNzxcimvA2Mc7K_64fI8cjtvXxksj=2=W2Atu?J;%TFBZbQOIl& z)dB6AuAzjC-T&v#XX!que5L=pk%UwW>CB6e0;J zi~bSO!!M7GzkGX*r7O336}8<5>Q={r8D@xb2H1{X|vS zcy@m*uYZwc|M*y$*&BIY$`GD?@%~Qr(y!{J>WjfIvCR7qwan%^vg}tM^6mP9GT?a- z5aIKV6KDcyiX0a@=#6Lp33Bwmv+UQ$^6Pmxf~t)2Gm*kvj$~IEFW)}1d-5Zst-I`L z=CA+6th~^@oogR{_RPr>CtjE(dzx!LUp4Tb`r znCn>Ipq`QapB@qn`g}h4cHT>{2LF=>wYs7uivZjy5FoCla!EjR(HhU zKcOu4zs`>aK=Y}o%e23vWy>T|9fchqDNkhiv&L`E+=ASXg^c4!MVuUL+5k{rH8JBY8XZ3}obgH_n zU5A`=QBoJKOLt&P7(+wzMbhQId~MH9r_qKdP%8>)P_{>KbFwiV5wU zJd+p~wf=X<@`*L3;EyajJdypLWczQ9LF*64rz*xE)=;O=Kio^9f9MqYhYwAme-sq@ z$2AK5BL*88|E)uRoo9cn#q;@3$0pW;{bBqxZq8WR+!~-|yzVuVUG@FL)LRON_Iv1$ zoK0TOz0SxSE|tG!OTj)g0#8Luo^~4e5_l#mZaFX<*)2*a+&vc+7upATcWc|l$(&%g zoFBeuDA;nxRgTu{QI$$!_@H}=U|&{^q{;QRyS9q#O!BTv`6mZp{~o>nt+G0Zc&Nv{ z1G>73Q7F4X%96yS$5`lKF|FJcUu=ee!0F{mR>e;PWqWERJge= zu4%(g4!D1Mxba=>x5**Dib;?<<|6y+^f~|IjPPtL}R;d0x{9 zq2VOX+88aRX54TQ%vs=Qi%Po`H)$M^@ZfAK6*PGIOOZ`|$Vz~-*HC7Y*2*Y&UgT1$ z0dIxa`0~#B{g2_$!%M)09~fv%uz~}h$YOuNp4!lMS6<800cuaWoXKFVJQOhZ?l!y{ z6VMQ}b})^1J|PcgZ}$dpLn*dug*Wn4n+f1JIb53n)f}1~4hN1Ezt7EC-oV;2ozlFG zFvg6>w8$?(vV`9D z3FtR=FtYG?meYc;Ol(FP<@T;*8fkwAq>ady$8alGI)F-&Z}y8MVVc6J6)OWqc&WML zuxt&xl+hG_CXjJ50fx1WEfSUVg}+JF9V5i54T44XG;0oio0v7^MnMoQ7k7@AkdEIB z&E-E%?YYHxQqIfoSIsLyRC(d;Ow!NgQQ(O*h!2_;H;$!Um-FpE%mrUPWd~{T=J;0( zz#E(iaIp-wCGKH2i&=d_+nz;XBhfXnvi9tgxvJk9t0;Fs)=x^Ee8B!@2~aDCQI$?&7o0eFSy9pFSt4wAuO7JU<&Yjk!8M{Ot7?vO`C{ zAL%+;tB$@rbVEQ~3zCFnViG=H>29rW-bX;Zb*FWMblz?5!hFs-bn0_2VeMHsz+U*4 zYH4Z^SyK8M3tmy*C?(VBGp=Rf=6r5Ae_S!?eS z&!=oZY1))%(UxW4T7E$1M5uD5Tj!MzaX62yqYYJh9TQ_Gf68kjK`Osj|-N-BzwBy`eg?t%y%m44e9{@nAl*zg7sHPEU<_KPTG z_9A1-RTOFYmaPnT*9>dRYu5YYCh2U1^A;=~^i8Yz#0Nx^XDw%ClMaK>YMDiy=4&jZ zUxr*3M}Ak5L309Xa6S=zB8z{S(&FbM*1GbwRwe2VC^r5QAlX5BHBZ_oi~!~i1v^Qh z$e2!h1CLLy`2NF+8b+%m?`}3PK|Uca?tPZ(5&1p^!bz!`y_!IQBr6eXgReFf=M5rhu_^ zHJRgbisRNpqMSX*jDZrr@do4_horG(n}5Yg@5PLKj6X=uNO^v$hgQS*vO}XpMpk7iXlEwhGO4#gM#N zTA3}Rl%5hA*bK4vff|8enf4eF^>UV&x%jFN5QL~Vl2)eb%uq?h*FuOFO1988+78^d zsub-K6}?*?Pyj{fN`xROheou=%O!cLSFs|at;U)v36!}0U!XBxGvWE(G-E+=Uv59Z zVEl=r&*xXgZ(+2FuMJ#m`?_}{P!N(sGvGDNp=X{^cco{Z`3_cujLN0~3Knf!*{9B3 zzv-+%lN)O)(rJ<1Eqn8$`MKcsmfO(~4|abMeA~=AjpE@2Qk%wQW)8=3+Acs zW;^*?Yp9?)P&0QR$z`b7kN`Dagr^V>-hMO2HdvM9TaU(54}iwy+*<=Mqf0Gcgcl>1 ze5?W`6GRgsS!Pj5u6vGjlgk~tx~$P*{PUJwYB~uh)`3_QMiDQqFS%$5rS$F8V3X@n zAymIAHvoTra{QnA(MJpWpa)V0Fe`N8@6 z6;x^xvkxSnkzTCsxoYrJUWA=&(g$Bin#5(lu)L7Vbg1=sux4du_$6G7tQ%V+)!?oh zN!*BK^=O8gSW(RJ`%DY9mi)Z_NS{Ed{2sLW+PJThJ-JRQ0Kg)GIxv4-KgZ7UBLIbM z`)>PCIVHs%mB|YFY|)){SnDFj(p#J47#VQ`j@^(G8aUaq{Jl%F2K*`L`{K*^-h5)* zd-zp6XVV-zAI($a&)PCAN{A2T&YDHaS(@yu9onS?n8fV>oo+4nG*RCJqU{TbMu!;{bDk^LklWI&Sb%&JVHHe|M-=e|VaSP5m2QmTuL+Ug7W zybq((N!$13*v{=yiz{IR#p!TISvkTn6S4N<8bzJL$Q2o<(n{q2k=2{nSAl@m<;W{! zL-zT0_Sy634Apk%PVKp_416gLz4~V0b;(; zu)%yka^ndwwzP^mPUhwnvm`d8SOs=Y*5W!?ygu!(4)$TgwQOGd2Rv(KdR| z=cP1DKre@2^LQ85>9>GG(6mxPQ-v!!Oaq=w@aTUbt_xr;?vb0ttooaUev^$&&V!Ji zyW%V4J@NyR0;FrDn?xq3ry&PhDA#DING?FD4sxaumhjc~T|$f65Yh(AN(B9psZ5o0-)%YSC zpM2*U{fPDl1N)^^2-rh_tJ}0-)sBKFiwtfir@8jVDXElIdHi;@5BCrXA?+ke?058J z{bZFgm~c31!_$!7gqQJ*H~~2k2WL>4IC+^O|F*)6IG$oFDN9Q@*;iS>4FcNf+zD7} zP4^GwpVB3+XBMUJowK~d7s^bJb3E}v_V|(a=jT%f2di!CMVE*MfjCnIP1vrMrU!&V zY0`wjMb^nLSY1MUK2`30_}R9}6~iPLx}!4P4y`?rpi+$z3bYBg{%_}V0Hw*Rp+Ovz z+xE3J?K}A_98I33SZw>my$ct>E~7u*S5A=m;8dP)Ef3c>Ud~eI2j#I>#G(4;0enUj zNl`GZU&|+X3lz7FtZnyp9#LY-pO1~xkxh{jNM*^=M%~Fypz&`HMgHKk${+lT0Z*E7 z!IOVArYApg>SL`_Jo#6|^d1`_58*`i-^a>3qCBj(O~uvr%HDY1^sJjV#5*@}_@BYk zi2e%3Nl>hO45v*o&IsLUY*1peh-=saG7?NVxOO{pEcOfkoNl>0~zdM?LD&eQ9 zbI#OqWnZ#%J0?A1mv4P9Ur1#rLF1|wgKGD0wrt3M&9hJFzwKc_M8d?20}26Q5L1fPUAM{`gn>u8Pq@Kt(FYd@xFbZs=Y9^tD-rJxfSgdUjd-H5TXEmtE{^zwd4kcGLv}Qp$v# zY|gIu7GJG3ow8YE%#xz!R^)2SyL`@mx@99df0U#UAL8I(C$@{?h@k@Q|1}8oLpI0) ze<`h{OirC474JolXlD7uXRf+LT=6Tx%+GDB0-Nxc^Ky}WVctXx)&NsR-!FlXO$X}v zPIMcReKB$H1x(os+rud9(DeE>A2UHKdGdW_t_wTomKc=9GH7KDDpZ#)mpXH0`k*%B zq_&N-%atuV2|?Mea+G$Wt4LnuQETrjH<=j}YNl1tKp=qb1ZppXz5xeQ z#3daCDpb$onmz8&-HvAiHLFK_NQJxtJ^GMC@}xLJeIIuw?NEkf9C$Ep?0*Q4O?~R3 zkHT)OA|D*K{l%b7Cig=HZ*0$Dq2@Hcl_t#Ou?!xwNgqW6NTS!8Yt;iX6?GW^?@1Eb z$@*rOnlfb|JXa6`0r0-Zn<8lB$gRtpE4nb=Ni8u3O`+?-%38;YzZiQljVIY^i3zEH z;Hx;y3=8aZj3=0D2xbfn)F}gWE)ALDbh$Tsbl_gBk(d2Ub{eds6no?#Ei_l}Jm{fU zu~@Fc1+ok4fs2_DU=J>~M~{5^Djc#bi!`W&!fT`Kg|ZJG9k=TyvC9D{>f!en3VFf^ zr}csR8_1-`j{F@O0`3pRmdGW-#v$bhK9CIhrZ|Zt4eix?!*b;D4u8o4mC#q73A#!$ zZfAl4xvvDBqVCpCc`2F`O#EnWaO8s0q?nUAs?aCHM=;EzAn4@fs<8nHYS0bUEl>B; zxKT?Z9d9y-sTeCv%|VJ2%Y@K2cDY5A?I=Tue;RUaeCkYeD=x*=J=dNZtld@|`1u-b zV{A|WVM*1q(49rh8(r2+9_3wCowtVH|{uK=i%g6q9EU$*lGRCA4>Hiq}`?3Ey_77wKYwRD# z{x^A&hsU%3F*fmL9G?=LXi1>tCM&}PEpwGa=W$0+}6_$X(6 z6z&F%F;3eUi}#u%{NwNuPWcE*QtPcz8mTD!FZhR;{(ldD`Ha8J^}<{kOjOBdznnhW z03+EylbCy9yOZ(9(U(`jB_~ZpN0@_Vqng ze)jeK>+-X&@86W4eSK5qXJ6m@%Fn*Oe_MX`_5EMvXJ6mZ^0Tk+{ps_EeSQCT`PtX^ z@5;}C^1aSU zPP%U;)kF1=o~fQ!ys3VsKdqoD8mTWjxq&izwKg=w76 zywA)hL)YEsoW0lHd+oK?|Mgen?@5PmEd6%)4yNA@-(O3=9lpOa{dV}q({G3GQ2Oog zmFc&`_ww}H;hRXm9lnR+?}r_}SESz#-*2Sf4&P+@?eIOEemi`xOurqzzn*?Od{gPS z!}mz~?eHB=za75cjK5#$@Eu9N9llqk-wxlS>9@o8cctGB-_i8j;hRps9lpoXZ-?(# z`t9%?Prn_$6Y=+7claJpza73;r{50W$@JUdn@PVNzQ2)vJAAK6za73)>9@moI{kL| z&ZOTC-xKlol*2chemi_mrr!?V+4S4tJC}Ytd~@ly!*@RYcKDu3za74(({G3Gne^M? zdu{yvh{N|c({G3Gb?LXmcOm_D_?}I_9lpOi{dV{+rr!?VeERM1Eu`NL-=*~1;akiO zMEdLiHme4QuvIlUh?lDdhw)0);6Prj8XU@{s=>j0ebwM_UaJ}$(B-PZA-$d&9&$)m zss@L2wQ6uk*Qy4G^tY-8hjhJaa7f!#gG0JeH8`Z3Rf9wNT-D%^-bfAMQn^_*IHX%u zgG2h;Rf9wN_f!oI>GM^CL;8lQ!6E&7s|JVk@2eUd(l=HO4(XdxL%3f4{;I(t{RgTB zhxE-=gG2h3s=*=s2df5$^dG7k9MTu628Z;mRf9wN4_6Hi=|7Sh!bS78s=*9cc+GM<@}RXgG2gHRSgd5 zd#VP9^mnQThxDJW8XVGprfP6V-&-{}r0=U59MXTbYH&#ZxzrFYpZ8Y{4(SJ~28Z;Y zuNoZEf1zq{NIzILIHVt{8XVGpv1)Kg|D~$IA^mXG;E;YKHH2&EU#=P)(to9Da7aH| zH8`Xns~Q~Af3<3GNdL8}!6E&4)!>kRqH1tR|MjZDA^kT}L%5KBw`y=mKUp<6r2l5s z;E?`XRf9wNsj9&t{dCpfkpA0MgG2i7R1FU4XQ~E=^s}iUTuuLO)!>l+dsTx&`njsX zA^m*S;E?|NRf9wNA5;wv=@+U7hxCh8gG2fsRt*m6e-s;DG2xW|OI3qI`sJ#@A^nf5 z28Z-NsTv&8->VuN(yvqv4(WedH8`aIS=Hc>ezj_FNWYdE!X5RWR}Bv7e^E6!q`zM^ zIHX^%8XVI9vTATh|EsFOA^n4@!6E%d)!>l+*Hwc<`ro96a7X=N)!>l+QPtp({(DR^uMnf9Mb=xYH&!uRW&%I-%btTj`|;~28Z;2su~>9?^F#A z>36FJhxC808XVI9rD||UzgIOlq~EU^9Mb=_YH&#Zx6}~ss2@}f4(Si828Z;2uNoZE z|D$SfNPko{IHW(W8XVI9vubci|F5dSA^l0!;E?`FY6y4K|6MgWr2kLV;E?{bYH&z@ zRy8=J|8Ldckp6$D9U9x}g2r9m$fs|2tcoHuo?}sc%ID-w~4TdFwd_x1b>&V}u5?#`Op-4Glc{)uQc28rl zrh*wpi;Y7FX=m^%n7gqmpJ@K?-o_wdr_wOui?;F{x^R?&7b(DjHaBJr;PF;t|5KE1 zZRf-L=cqHZtUN|TxD~hYv$h8WC#@`O)qal12NLa2dLg^7kt)Y&8~t4Zv*H==z{BH+K6f|!vUq+@Mok-O9;Zd(aZTZ# z^sDzb22X``Q2pGC%vDR!2gKvY$#Q{H^K-2^-Z{qNpcBpIjDwXuYI89PCQAz{-7C16 z5sMbSlUsC9^D@5K*w7H)4#Jn+Vy8O5q$*=p%;2YSfMVpWE3)|yg5I45tKJ53K1`BB zzTH*=@bS?ZTsexD<Y3D{CB(O~o|y6`#*eqcm2rTB$s z$Is)}9zKuSjX~YsLXkWmCeC? z5HPxj%ZCK^=3V((FyIM;V`7UqdmLTH)(8}d>64Dn^20JG#W%8D#cbE|sNd$ex^rXv zFBpK`#f53#0)=;3K|D?tA;!%K!Ek5Sm?WZzx|%wkx~s$$qd=4EvWVsCux$`aeV(mc|p;itHe# z1!7A*`yzYDl;boFP6nfelh{Ocj%w5hi;Ye?mr0y8ur*%vf(M5hd90!OG+C3cZh+^C zKE|z)vcUP!EPrO%As}+^E>=As>nS-p#u3hdr%}6LnsH!YU0tuQK`|s)m>AF;z*Qe_ zHhv%ErZX7x{pQztHJ|M0A8yh9-9X+@3^4ZQ*r0g(yhoxA8 z7~LGoC;g)ZKh{}3nO@*H5q_JnDL;VodJALuGX0OAZe73BT0bUF7m^pw2tBHJk#b^)UuDdLi$urd)dU zbvrBuQ^yP@ei501i z@qzPCTr&?XLJi1ci8)?;M+mR6Lsd@sYW}I<*;5F~LoLzkhW(Hn`LZjv%{a!N1G3>` z%Q~=ww^*T_Ve4JRdBBTj*Gh;lTGw1biwig|nIm-C`cPwh0iK>)jr1FGl(bh!kK(=< zTJz1da`-j4$=?$3?k=9`8u^-iQl6X*wB{J(?lIe#TcJWfE~Qa?T;Z|Yxj0;rxXX_)9b5p*Uw?w~wV-6Ib+R>OXJmB`%`Xi0OBjH+y7T}4x*q?$= zj-6@UI7^XdoRn~=U+1rP-jxp?TOws@F+c6D#57iP6;G-1z%;32@Waz4O(>0w{#HDB z{5CJ%<=@sHR(<$F;-7IUcBGFJtI)U0UB!pt`ch(o{v8K4tUT$*uRXJZcR6-*JYI2j zx(pAydZYaTN+DR$^qMCb*YU6xsgfU&C~_UFgZ!}`hzJwCCF12fDuxX};VJ;ggTi26yaFlWF%kvGoc zw&LZ6ZwDbuq!-dw&l+=kPPyCF_pq;7_gdUl+$)0Yl<$g|Tc~a5L0)8JjgA~JGEwbW z;GOZqRR85hGg#?vm?F0J_P+vi~@VKxgUNGWbUbEza!FCXg zw2=)UkhdDXQT##2@V2ejtm9E-{V=~M#h^srywGPkha2k{#fFcg*C;n-#Fe_{Y6Oh|&k0XYrK3Nc!F zp?jQk`gaP>-h#Yf&e3fLP9O*7nQI)$EdV+Wx*MH@E4T!|q!T*jNBE+nARL@kc8BDF z@ZF6y5v)9OyDbH*$5uqemeD>tyGk=JvwMDDZCG{&sm)Be|UgY9;NJ z92{eKO-;FUVZ?()FbJXLcnGavG zZ+eQd4Zq&VabneVa|M#)<1Q+=)<0H!3v2-MEJtRkzx>4J200l0?e0zJGou_KYKtS< z4a2VDZLl-;s3N0QiUJb45TGeX&#yQX`|o7Pk&qLsdrV+adPg*eU8T_FD>jsm;!WoH zs&|jSr(;1j0~F~{fmF64meylF3}@LoL;}d81QA?g?S*zRL6>{o#sk1F2L>F){W5O1 zB3MFEDNcv`cBav-$SPVcOJfs5#OM9-eBI&nU;;F3;>f7OdqN>bK5l|GoX9SKbUui@ z-V7HfK$$eaTh(+gDg5zsobvYSGB-1r0>Hfs-~ehVY|T{7k@ZgF^S5veO$<2_^mSaY zD0#&BlO1iwoq!iEp|a&71R5js^ld=|@ZXlIClt}UuCxoHJ=QHsy#8OE&TqQ}z$eH$ zXTq&Rcqq=dRYEYmAbmxX+>Yeszk_phr$}84zqbR2bw%2!2{#fF zKakG>x9bb4rAT;EU3K-X77Ktlpgl+!QD(2r&k@~dWv|JNcRrjO)ZkKCD{{-$al8Ff zl*Q7jy7WA(S~=(O#^PE(RHACelU_N*`Z=cWDXv0SpjPQfahZho%L%xzjn*-XT^Dn# z_d49#y?#18)JE%*cjX6Wd2XL%ce!TGo(Mjth&BevbqMWlCWgzDqWwd$wxOCwql|Mg z%(k0A-Mzn)9vS=7anT0~ZOJahG6DoX{|cl4Kc8D&MuDVYdX_O_0rz>pXHKr^QmqKE zQkkT;ox?gvQXo=E1cj@SD^Ujz&q}Ixaubwv4|8z0&Xk`IGHL ziVZ+{G9O=vi!fhKoL%K;omZ{^lO1F&*;YUpxnvUA_7cSHg^WhyyqyGUbi%3BcRA^p z9hMN05s!>QPxVP@2}i;3kj5z8{KvHsE1UsB$_-n}aYHR15I;gXLG$EWdK>8wW_uZIp2iaa&WkKdd($63Z;k4e4^c}!A zC$NsKUJuzn0uJlu1iJf~%& zh_`UqrDi!VFitPr+!-WRHo5Ayp2K>u`293+%x_!0xjg{ScdmnzuCttnTdfE-WRWC` zf&2Ph`FktqtMB`TTi;XsUIMZP+JF2bZ z4c&V2ncI4T{3+I4{I0S&OK02Kct%E&*42e&YBpD~)aYv~cvshtT{XS&oj`nF@hMSu z0i;mDMekwMF8nHkNfe7$u9T-poNY5j}QsxBm+V zRHZ>cw5jYm9>~S!Z@dCUCdqMbM(sq;!`a$HOG}|XdfuA5VlY$K>n8pw@#If8Qdt#< znl6<`vtL0m>JvnQjg@&gfJ*sm_efj`w!^@M40Ul3W$}!8aTuFn;lZxCE~h)pp5E|-bgy1rTnxIjAl=S-M zuKZM}(IQiN8tjdRfYBHs8-)|SIE^wZ-blv$G_8vArwr@m9OWsjpvQ4n_s$XmE5`EY zSd~5&jpA(rF&<)kL1NAZ0UB7rvdRb1?F3T1**^Ew1R>i)uqlQkqOm`LUz4c7lXq!?w754I6ic4l|6Jl(q;Q3-t{?gz4@l=IX^ z`P=s#LNGYDTQd#wRGib_etQHqJs9dC0&bZ%l|UyoD2mVY9Az&6nlwy01EyVD-@ofEn}S?px`6263PB)HQ~?#d1XNW|scIS~C8@8dcNmobkm?_lZf zHhX>-8T3T2o}$Z^$xY9;bS945@-H;KE`a+SEG(BbcZfTmNdq~xXA|8T7d<9)WeBKb zVoqFKteZ_n%(E?3`290l&4J>hFlzDAN#Lyqm~`P)OHFzti4y3?|4ep%uS{eWG}Wb` zluLLY)NcDZnU=z#c4TYBoR+(MaabZi-6`O#YcAljgqCPB*|^PFJ~H!dFS)d&8#TnUgd1K z->%9*cc?B-%j^BXCAz&R*Z1T!XKXqS@ZQ+r4-Z%IlziQ?>~!V6-7`#I8DW2LGz`Y^ zJ}eZTF$l%MMmP_1TT=v?0lXYP%ZyyV#8&j{0#_SeL6R8Kt9ao5NLW|z6Z?%`sc2Ww zF?H%&=k?Bf<>6qg!H$O9RotI?+iXZeW=hX%5mS%RZQf-ne)cZFj zbm(mU_UGlvTb!4U6>JPnZy_63M<5$Kv#?cbKw>^$8Sp*Nr98|%4Nb?PFz4@KQ_u$^ zK90Vomgq6z7cXe~QRFkde=ygZbSl}uOjf4X;tPNVbC$-LCceD-RBtF%F95}QNao7I z0@|}~i-ISz4Z0nh1-@4cWRyZhbgA_teb$!g9uFP;?XSz{b?GuyYohthVf4XMd`Ov3 z2%4B_w#&3%EDPK?Q;P8g7<`JO%WD({B!A&hJ{6`otwfp3bK2&~6vGG0OZdl<^bl`Z zPs3=d7Oi_|fP~o=&l08w2~@r-T0vpy4fflZ7BIq<6>Iu=GNdrbyl>nr^TG6(B4BKk zFnQBJm{qczIu&6u`Zv<=P`d~d=btP*)okR)sg#bUnMG|v#cLvmHo5~sir=rVW1oJ) zs@zac;;Oi-Nw#&s<7qi&^s=px+ha}--b8&^wES$xZ& ztkNVh40TJDjmz_&s(bT(t~MqhZ0z|J+w}aM-k#f#K}3PucfCEDxw@cQgyl6yFJA~j z>T6l%MQlL+T>C8t+Y|OdDWHe(9-&eXxRri z?MMA`rJsO~ox5TDfj^1Z-4_e%eX&y!6GNx3=4b0xNEo)Xj)YTjV+lGTzUEo<`zWmO#aJ#j5>A<;q`W{-Ch*ee*n`A!2Z72`?~}{;p`L1snJe$MP(Y62>C;~8;Dt(uD}ijXuc@;dcZfH zsGQCv|4c7Z^u;v6L*Dx`9}69sXIq_eexbLg?a<3|6w}ub>hY@!1WN^L;VeIo%stxp zsk)-r4q=Zhhm*&dGl%r$Qgv{B?%=+Ny zp+`r@j<4d1Q%%4dAM0q^-FP^k7Ok&)x;n#Ttf$HssJ4i)l@^alp*H?II`6xWd%~RV zchV%8^sd0VcKQ_D5U&uKB?}w&EXg#N+B1e`TWH$`p$wR z{dQ4`)H~b6k-61PMXOZS!49^yI3=9yX8-yKLBX04E+~%{*pQJ^sJfvs$~|ZZ#i3OK zm$f^aT2*Y=T)r&iNa40nt`K7-r~3Bog^1S@%2+hM^{wn#f*Ct%e#`KD5oBAr(vGx} zSCJyj+n1>=brBbDv3$MK!+!i$?U9rc{6UmxcgVxG5n05Q zLygrh-sW7CVUT7yl1v=ib?L{V$F7Rd+tFim2$B&kcqwXUG^ImfG2Z(^}oQ{ZY8yNcADEtGo_ALO7{z_QBwxqqDvd%<^$7cs-ammYS2) zgeIGV+ac#KDZj%jF4ADypsVrL4t-e1;!~yN$F;ml-8juB&bjT zqrFK`0`bVY%2>{pSL5co^&6;tH5g%u6}2e@h*sClL#tvPC~hP%wYeFt#Qf;`^eNp(7DtZ^6J4uwpbqF@hg#sv? zC<*0Qu(fbnb#kx!`iNa~sXT-i48QR7)fO+f#Xh{{l)=CDojZfN%JUPOVz4{LuDqCw$YrQ(bdj|>`2<=k--{C~ zc77a7icmg=n#{lG^EtLA(h*Fo2WI(Udg;PWrk?ej=*h6}@gv2%pM!+E<-vOD`o`GY zaCX!sa?0D{dIa|fo~p)uz)M?-a!k;iZ7sm16ZCc~`tyv)NC*9~VUpFhHZOa%14w&y zcQI$ziGCRFfjE*5Zfghlt;SGiT7{4?C!V2pKe|V>=7Gl+nsC%m3KBJp93#wRb8Q1} zAX1)$6gcFj-j$727*b^EBxk#`{jXhWEjM9tj-T7Wm*dhCXV&gDa%fOKYx&{| zTFw0KeD*Ak?ASB)!Wo+ECShFM({x7c5RY4=^=Qy~F1linr;7IS%d(u%_vcsq*N%qB zi_h(Fh|SRL?Xlnul?zvU;d1Muax(R<#wdA~;0DYeL6etZp{G<5OJEuy^>ax57&^iq z>qCeppFx%g!BZ|FE*v9n&VZ0Vz$?MxG_igEx$7Fc`VU{;dVt{*Hwk}K#4E>x>S}Mo z`k^Kek6*BhAN3cEkX8eTJB9YT?s^eMRd1J*9j;qQDM5$O%U}0rhIdO>SLGQ}0D^*w zLu`Y_4D|$U?Zo1#$>tgPy#!*3Uk{A2W`dQ48}ZJ;DaiRyK_k4B*80|(Wq-TY+WKss z&xJSelM4@C)7s+A5t$8FTFbn0Bt{2#3lCvFm$=_Iwt75y#}MRD7p_sto!my7Q{0^X z>)l8cufv^wY4JBlPftH{aqfxPnPcak#hxx#@q>4#Q6$lBP7z~}y}iR9_nq|D<&XPL zv;%D1JNvH4ew#D>kDOb7#lsIj^a#698ta%``pj2~I(s8vC=h>DBT9e<*E=bz=- z)VbE;8e-YChfXXu+o%?+K_A`|26*Me)u1m+qyEOT@DC$TtQ=Ftcu#4@{W$G<9Mv-$ zvs=S*VDZ2%qLZfI7&nET^LGX(KB3d2Q|H%s z+H8TX?uIv3z3vkKkZH&(X}x;xw9;<3P45Mxz1KqVQlDTsenk@WOlpQJCpwUYhwg%| zSD=Du2jKD-O$!Z!31zw@?SYamnc~%I=7hW8_XxBIGdbp!<66ym^QfyHoV&Ipm2uP^ zl-VEwih+$m8(>qFzQ?jQWIvff$1%Xc?Su$AA6BI{4mVS5brF5OJlg#hX_($4 zJ~ujFt~>vf24;FHcqb9;Ww~)UOEi!Y#8(nFNo={i^lFQoK8m7|STv+qloI5=C?^9D z4pg>l@Iv==FPlc8%rFLOo@8ul5uA8Q*B?_iWpL2(jb0IlzakGcm#Y*<%3hR5)5?bh zu6#bFy(s4~gW^G@pc%e;y{ZNBY$Sy3Thv07p`zBkrGv z$=o$~sy>-`u1f8h|L%QNTG&hLn5WizS*y1lnB825?EqSiWv|auanlZIQ)Ec0#Smr{ zzF9Bx1FA<&W{{=k3}t#%qkDB_rs@7OI9hak=1+;Sft4XyRcBfXXTt0W1O#=sq!Wlh zJ9Jv+s2cqm9m2B+X0p9ZFFsOy5&;Y&Wr~0GzxCv?&E;#Os1e98gws%3&$YM$<$<&4 zoo}e-)e!Z)coFYCJlxlVzURGK3pER~aNfJIx_)hW6*3;~*mZpksn}+MW_9%mO2SDA zAhz%363dB`Q8n8^_oFiS`}c9fP*63Yuft43t8L2+u{AZ^+-(xN>EH$o;uAUWn^L9P4!J$P5Zx_}WnHXUeJ>nQlNfiJN(?!0CCt-bEso-aHmqfz!Jgq`lp>mw)zv%kI z0d%zPCUVAV2J+%NnEI)C4sEvp=3=-F;mQvPg;sAMA#IZZqA=8z9>U)0B7FJ&+keYC z^!;{s@zEzVaQo`gnz~(x6twT;RCk=K0je(sZ&G0QUo4w$$6{$a+Hl_+Wj+Nk)pzX= zH1gRoe|Lry$nmd(uILxw-Xx&`3gl}KQ>v_#(3qn5RwDZeXdB7j-?*`g8fWE@c(^_kSDbl%!Z zW$wW+wQixi(j{QLB?1CLoM6dqklYx6o{8d~W1nq@+;;rBk=s9#jt4Iw+yr3Uhv)bY z{KAKgzVNqhl!_Y0alw={;$2Ef+r1F+sXj-x6;3V^o(u;;pXKps16L!vgBR-AZKi9N zbR5>GvQrHY$V)0aQ4Y*9D{yY6T1@>{Y(CAXqCjpBQK*0k>JdaD6X9)r+Z*5SbX{HdD+%d?69?}eO#`FAQC6Z`3~QchA|2iRE{P7XoowbbyrB+`)pvmm^!XBBRTO&B>463 z_SrFl6XKf0y+e6=Dk$t$T}VBbvo#2h^@hZmR>9V6J1}cx4;IZs>b3*@QysT);3Z|D zN?+DNEeCbPw}-ttW9jqq$T?WhnOd6Gd`wKKbhhgoL-`zP^o1?c-<>hH7kA3|W5I}PiwYa=a%t#gBQBGn^-r&;9@Uld7lC6?x%?djM(i&5Jj6i(6S=#qJ?Ke z2=4&ZwLiG1h7o|fE-^J8vHoj4*SYQ6_a9^%cmnsTDu3dMzn;Jw)bm?wwnXFOLJ>LG zo(oLbmsUvPwp<>}k0Ng1vutGVqUO;_9e-D=+f8zAz{*1Hb-A@sIgU$YL4w-?4ZR=A zvB>n<+12kmrfV&o$fi|%d6l3ed}-9d7V;hisET$N+9#sxK8==Uxg2J5&Hi`$OFW2X zK{%)`@nn3h$+j*LRI3l()_vW!iQ_HK+bj-7BYs*^)3E3n>Rtx0sq!kJ-Z{>uoPU17V z*62OjUoj;WqZ8Mt&g8tLXij$z5EzPb+y*#d={BkK(8);cu>X8WK}Yq2;<0Vj>US)M z0c@LC<-bAARmqG)$|UX!qRWTmbcU@QMzRocKHKM9<&T!JFH!lNp}pl8TCRu-rVBrz z!r=}w#(5V`_v0__vjb0Bo2Bd2BI-FxLDB}wx)apG26n?WgV|Zh^4{Vng2`}hox)6J z5=onF)ECT@0^hG%dy!t3NTstP7WepBnTR%9mf-0zSZ*r9;}c*Cvbw6wcmZ!0POz+& z?}^UAR>TM;=tz!$cDz0Xo-( z7&z%Gx1ESDhe~_Z;&5UYX+GeQ_cA0c^M@Mw(O?1g12EHklu{9PNO%kcLZhC|jlGGH z-2iz-L6=rG9e0h-V9D$%TDr7pcBTEEM#1;l_eje{eI_KDODI}aSNI?3uU7UTn-^z$ z#G@3F_PGD@y;l&&<#S@4w5<*yx0VzDg zZA;9i3l*kAH>!c|*RiZ_yE7)F1{BjJ>7OP5%lnG&SwVnX$UgC-L>Q{CCw=FRlTX9E z^R^N8Uhrwv_Ol|ft(%w)+CPs#_bbY6=m1pQa??SHF1vmbMX8xQ9s#ZL)G@Is0XG8R z+e*r2u?RziGhX{zGDy!vezkbmODxnZ9KDM>YGD#}GzH(G_RXG|lv6%FzHJD;w~(m+ zpl6ZOhH+LFTZejtb#;iAqKCMdEk045PHpIVIF%frj$X@QBHJa<*e362-R2-Y^IUku>$KJVDI?8T3c4e;PT{2vpa3o1S5)4^i0a+ylPUuo4!Z2stX8s6ryr43UD6dn#;9kK8cBqePxSJ5$Ua*eL*Z-YbLixT!! zXhA4%dka0m^;?eHc*sa)HEtTAKJ4vBlP3ZIQT%K9+Cme@uX8qbc|S3PMj3X1$0U81 z-l+$L>#I2xwkgqy-YqhzYr8G#IBQ9tfopoWX1YynAJuWFRwrIYT6z${8c8ht62|)9x&$pl7`}@z&FQ9r4f2nc$Pd&K+4R@oL zL}C?xQk#I7k7eX`(oJ1Mxki?~&e9}@@G#$&X()$h1|P}8do zVGLG0uHZrq1195X=~tD&S^oZb(1r4b5OE%k7^?afNI>7tol&zG;vJerQVsf&HWjc6lL$TU#MYlA3OX5M%}fSLAXdW?@tH=jz#OI z&}3eB;C%U)Uqs?|a(Z)PH7r7?6%2tBl$~lBqi_bi0ErrmXtT!r4aI1At>GRsiBm^u z4{rbMuV<%f5FMu|AASv@xxFBLT8)sOWjr2P6|n zZvj&9{Xv~TZm8{yq=UwzMmeD({}w$G9CY~J7Bk>snLV7(5D}>?v^eW1`LtKp3BF^f z;({X)C*}(NIyzo$QFOw^Dj#z=YSn1O_VfT(jL%bOxB!m8Y)XCPY9ER^E?rZMLSXRJ zolPl;P4dhLTF=ePN{G#ITizN83Cb?ima`+k<*y9=K)YHEi2S*%2$+hChH9EBz=AXl zC=p~Wdb^~wg|VQ4KzTNQkIWnoA*bdu@0fZ~!(hPGyy$Wf+96~x_nqKQVlUGFWF4a0 zM~!^IqLF9rp1C{wP={|a?nd3d$-E=q=TtUE`lsJVw8h@ zoN>sv_*V zm`N|>tp3Gz^V;FV9mRkTAKr^w2hPEV4|jLA9Wvn4et-mt5QmlKLXmy8k$BdmMHJs|4&q!FC$!ckQO~)TY#~vbLifrrdyxzcE#~<6;sGh$; z&#ML<&Cl*=d^9CtMS36@#xDozQelZ@z~{%bmG@n8u@qsZ15|rOO}0kM>`xb>_~-Sab@c$ zRb<2YNJtaYgI={q?BG{+G;W1ieMU~W_4d2-NAi%BUEFtw2u)ad_^@H#klwQ`KM~#k2&@#NVBy*K1#0#$Klv( z-xL0mWnXIyE(b{Djjyan^5=n|nS!C$x3?I3ywytK0wFl~-MjM7)ovUgT7=L4Vq!}h zTx7EX1_^^Af=er0qh!O}kVhOQ0x6!AOi4Fe2n)FVHU9Mqc%+*aZqz9o;lbE{`4s_G#*Rmq;tJS}4qPbeNSa~zW>V(IGoc8UG0#0_uSONqzQcer=o*zT)m zLjSr3BRk1AS@DyZPWBMrBMC}LzH9JA65CXHev>wErPqt+gjV zprMs>eOJ@u~kU?O7~s@w|zW!m{ocO+h6u))f zXatCqvl1^a*zXuoAZCT|xdYU!l~LzIzQc6OBl5b!-K1k!hxB@X@c^`dg$8(tJJgDj0m36{S+md8Q_IckdA*mQ zvF6CWzZT6M-e}A1Kcs=gTf?7s_PB_t(Wf7Nu620 zY}O&6)SqVFS2gd>e&Wn?Y}}QOA-z+dd%#OuSFH6nNYc|jxj@jroGX7Zt6)Z6Um(-R zp^dd+J%Q-eIQY+l16>x{)K}PPlBB#)TafCptw;dFiw|P17Tq3sQF0rzj$#P#TQ&eU zSIDSqdE#8@;n%#Q_7TUwi+;eCn%}a-v(q{ie10Fis(Nva_6C1xhHhzJ zH0LYnw@6NPU3H-%kR1K}3r*Zfx(}XVO+0uU%~c|&M94|!v2@wYZcZF_i}w`U6ejJ1 z!h2$_*N&FPo1Hb3J4?f9eGjuzrSz+I%a+>)5I5r+)D+vdgB46_kN`*5>J_onVuaJ4 zi$_l51%|>_qa<7U>hiP}=1u`VAb|TW>6Es|I860R#=%${*4{RTJpv=W{p#`w+i(+H z?i7lng5tIaGZ!K9Hv^{KReTCp9U)J>xdXn)YWiYL3RuNqLYU95^{Inf*s%zKk-o8a z#}bsFJ;#zHLb@-tA@McWWG!tV4TP{*-njj(`R&HwT#&>3a=UnWz170CsDtZjcx8jU zG5oldF6`?c1Irlc!cd(q)EKVXjff06Ja=`0bMj(zmft>o(RUkzQ(>lPOcyS0-0Ya5 zNgu@+mIW(#7INOGZuWzX{Az5*&778}mo~1>uC_O3*o!Pv21E5&zhoJ?U0L=+si!}kXFu-h{h3oZ5eJ1+ zNGaf})yO9#A6&%7Ais}KQZi1G)8gU7$B?a%@{V{>zytP{Qb+wsBR_s@^~RCE%H=~K z%s6b+Ix2`iX%vGrvv2v&8l=VIe=_@@J-f1epmVPC#~31jfr;Vj>Ux-zc0D6>MIcyS zjLBTt%}!cYj7d}eM@U0Pye!)@Fxat>!!D3b80C4|^6XK^V~}hctgqicRUWV0>LA*! zQ*YEo2SeO$4-DjQo^7p1e8YC$ZXXGq(r&+*{J_9qXA-i6Oh>!F)&ku#06fF^8C+jj zzGr~sbQE2zC1njwfQDihP4bpEWcT!+X*WC^fqcp)i#H$ga(ij9Hn&N+e5MD7NR=E+ z1wJdZLAE3tvaR=f$`$09llnZ&?(GlZxb4L$i)KKs%LjqsKFrzOYvZ_<-FIiJIaDp? zP|sR=OSP2tJG+0NF-FcE&vw^75)Q`kOTGp|!68}wL++J){|(~VTH#mrGXFT7n5ppb zQ+|N5Y?KT!I#Ju7mHdFR3Eb+1=)`mVWDg9aL;c_YhnoM%?0%4i=Tu(x9805YbFA^bxn1D=5UJI?;H^j&qpP$^S!ua%FSRyq$U9W@ zxGVk2th}VvF5YC_Q?is-HB8u%Gs+n`w>q;To=y}t)Y0f1FwEOM1*pwX@r)rdM$sX6 z2E>M2X6IH#%b}!Qh_Y+&dzI-{2a;E8B4H9rrShuJklLjuxb|SMC3=d(hp6JS z9zL>MyQT!QN1a2@2P<=V3PUvYloz<|MD3M-t(EOAetK>bOEBs)lWIc=5iN1#sHK6F z%QH2U^{sI@_OU!Y7s?}a`#151#yDl3dSv2#SbL2T5#3qMTRJGcNhDyQeCSP0OD2%( z!Ei-pM!oEHU%lj54@*q3#rd5HbT7bsrVbh3OJ*q59^ zjrnNWPpn*_sP2{QF7naBN9c`1c0E+tGBgP|0KH}|`T=TZA|iI0`mqN1Ito1t-93JW z)b4y5?>*qZyLjfzYDy&%j{a|Jn&(%lUs=N=lv8Fg7ELNnZ3PG$u2H@!JpXYplDC3i zA%=fx-5(lAY!^=2#7A!>wksXhVq$J}_4LBZ)-gWe?kq0w8*gXwv1%o8v)7^2NN;3U zN9XOBlaz^Y2xppr$ww<69vD1DyauU*s`^|QACBH=EnK58u|IgOwK(-O4VBpf1~-3X zpg70a*{cTfVJU9sxMv?RlJn_Z6STtU@N>HV0OPg3$2$8hyxSACZcnJQBAXc~hW#?s zC4G9J#|Pjv?_n%CJurBj+XF2$#T43`?TeQdF11FQOIOf?w8=NzI&Oc$%Z<#gQ;%(( z>Pb%yZb$%e9cxwIfx%iuMQ3FFGwqWb6k+vsq8|0I&x5#C=1_i@sd~I{1us)d3 z6ZVtBUic=jURItr`kvL_8H;s`DQ>%r-0nZ`Oj+?;jJVBS{32I&VW82AiqAX-KAu=x zCBM8%xn2pGZN%0Ti(lTAkByO04qM>E^15LU)hyUOnZa2mc!q=;{&!7 z4(|2Z30ty*J28}9*HPowZw(BN2k}p*riUlU8(d$yt&zj)WgVN>1S;2Uxev6WQNqv*Ihd#~1iktWV%a%KbAd=i%%~yQ2H3Yls+uUkaSL zka-0z=SzCGy-I#27#ny9#lK8~UHOo!ppj3J344wS)Jjfx+lvaA|>@5(LKW-`HAfwQ+^8 zpQmsvD54)kJ`AxUOaAAJd`b^yZ0cw{u}&m2U3{6GqT;Bz1>b^{an}DN?do7N^Q5RyZ#%?9Ywk z;YT&q{PXqoKoYX`=zXu>l4S4J6y7u)!J~aKc9YbAb%lz3K7D+#Fg~j-@&YYVqoyXHiLu{ zR9K{AxNUj}##2sH_GxYCM+UOb_9A}A{TkKB6H`wa&AXCDFWwtkVDXJQKy6n^8F=NY z$gWCld9Roo1J z8VIl`T@aik(>Z2Giw+20gAn!anWtC%6Sw5Vt0H*vCKf^A z-w|(%mj^c}q97FMta8<{!}5Z`fj}2l?wlkevd$ru5+y0qsN}>L%$_c9kG`xNnd4P9 zejL41SVM%+w>^g2v;4A=5aN(XrQ{ai_CI8ult+TJ76@4zdGb@0(~8tk&8W1)`Tyo3 z_tEJ5>4lr|{rNJ=dna-FZ6jy?r21Uh$g8iOT3BBqSA z+~RVm=gJN|1z9X&AEg{rHWs9l$o9DpHJ%KZ2&%3Wy}bi@_VWXctKo!0iKEL}bd!q? zDIA2xfu|mtUNL`qPG;k&S4eRD;y~ja;cL80?99Z{p6eG)*Kl!7Rsf=ViOxE=x@>XO zg9idWKpMwbuBXYGh-xT1#ov$Nu*%=?CEhAUx4Bfo;==wzSm0pGEe&dd(dm?w`$aG%mT>eP63UmJEj*(ZxpIcd2BfMjyW5Neise646 z_A~$X0MibW`~E=AO|*CS)Fy{mmdi?Tiuy?f`X;W3}lq$hr7sKwQwW$b0q%3`kSUtZosvV zvwZIkC*nk|rvE>36;)2OqMaZ=&Q>)&HnTQav!aXZP!^r7a=G^1)9a{RozB?}1iSHq zwbc@_+;HNk>k)QEE*#Bz4`>-{1Me!{QT<8-OE-yCQ>5sk;=;oUHEJ*|+x;!}fOxQW`HT;9%&xcD zg{{cd6t4G;>TS#SE@lX(#I)Oyf0^~~g9ZSjIGwg(L*5_$H08WLj5=`3OIOo_obnEI zdsCw<*uwCqFhSXtfUD&aGKZNZ&?B@rRcb_=RV!+C_h>z& z2p6}Z-Q`bnFp7C&)-Vlhlv9t>eu?|ptvoOur}W|F&>Czo<3_CMpUGx}#Yu}#zNFQ# zu5mty+*G{w?We zu3S4(@9WX=QFvMyBY%Mp?VUCR@fkTGFK)>#Kz_1O2prg(zpK`9EZu4S#Ka4&wT-J> zTLXLh+Cpxj)fn=-in^fbuDYjZ1yO57S+{NLM;t@AJij}T|85O9rk1WzWBF=d+EOyj z2|E?SEo=Zo`DmO_M#@8YNcL5st@+R;^w+EWZY1<3?Ox`$E=Koq(D!RJ9ao^s2 zJop}Tf!J8{E4kt zXwd6|H&w&1X%^cL?9D$amITtVghrXn;j#M;7Sn}f)wX#6sCGTLH+!%HsFS_lZwFqZ z&jr38rSGQjI>DD6?C5_^75bVHv`8=O>Z_q0&H6~ti4fYd2z?-@rIqc)AVdGLX-I=* z*&(g};7~S{J=6iqLxZ9hxz()iu_#HcU0flBwz7yjWM6jc3OSKiEu5Vwmu`;?gN zp&T`!T#4-^&>OXJ*y>02=5Krq$Jf^Bg|+&2*WPExAK6=s#9YjAmcDj$-)lJ&9w z*)_d4Zd^sNkS0nDlaL=1jStz^a!=E*sh>{j=Q6MkctbF746h~7_;E|3;mP?!E zZ{1bA+0YqI07hC_Hre!17F7&{@i*=AXoupDSx|@WwYl@Zcx+O?WI^i2CD=W968HC8M^BMvH7oA}b!tMXc1ma%pVw*}O$PsQG~ys6sM zO1KwS*RAYiuTP=VdlwgCs?E1eaE{Bz6(b{mkH^bAK{1#S5FO(-a5a&dr zn$s)I^A-n@kwI3eA>A^!!m*-W4lkJK<)ISgR5&s?XNpsU*B!_m&RXIKf$1m~)P*^+2NPj;jdb-lOvczRM>LL+I~P*GlhiQN!Q+=O_br2FOK zk$gs_2yiFXRufR6{Uyni0-Y4!a#iWGy(Vs0Tpg?AqZ)~XC>l8+TS?^`>B&oxS)G!k(k+tj1sTo`z~*&#eA{=O@u*=g9LRuH#L$$3U`yG zkLhqep|`U8aO;|5CRD6jw>h^~RyVP3*r{>xo!wYW8fH7!41-X#*z(eBL|Sk}aoF?a z!|dZYBYT~3_*c=-{tC%i7z+!stjI|?t6>d-5>SP-XdSt`QlaaG=If>Hx7S=! z`dv&=I=Qo45bt0WBU16M+IO&?hrtdNVu9YFZ| zppt|wm73Z)ghx>w2b}_Icxv@VHeCF1)n?=tR6@iiBv@;KsEN?2$j=QU;?=wJWrsL@ zfALIBoDRY|5_LIS-OeakIHG1~_%#d-xDf<@$B?vF(_x*#7oE-UYM+}N_^vE1lH}4* z2h$2yR?CIj>@OA1cr#RyrGdPXD+y`0B(0UG}};xSS`8x2MMgkH(|sti}~`&5~}(ELkO$ zU(yOc(0FYg1Y&*9=7hC(ms>dyVR<85gxg3bK_i0?s&d8a^6~JTMWag|DN@1mh48Ar ziq0xGct6;t&@Q52GnQZ}1e4z0`Q}+k5DR-V{z;^`r^s4rS=yWNPZIIgYs(+ zqmL;6I)-nA;s!rQnH=Ob8+uyrEF|CV*Ixpykt+&dUO^@go}?CJr$qNK6M z_{3)?^O4tWPW|R6RaUdD8ov$q#Ul0c!uttqH^Krc%VV#IzE<51Rpo^&7^u^`S5=0l_41*@~LoNw-mN{)P( z1WUmWyU5wg4!w{ zgv=oS*Lsn4_TAgg;b=DiJDLTG%zgujA+srO?#dJFS$<&SDg;PG>cKpplqqa3HeiUw zT)nW>4f1|Mbe6Y%XKy|=r$3Ga>7MET&bCw8Z?D#cV3L56<*r?qfQMEVwmKR{q#f^) zh~L*|j3HSohXEckIaKXuT>(>Hb@m@!tL7?;`S5WB)5Q(+bn2!3fxY>UYRXFpcZEmD zlH;S{FzWL(b*!JUM|2$HAzy){iI45gXYm41nhO0)Uzlex3WZPX&7a3Xdv#rYZ=DEM zt!p+GyI8rhKOec|`oH?p4Z8@%eg^PF!6+xN@|^p~JV+HGxR3Db#Rm~Q{=gj{=nn;& z@sS$M_>d8Zp@Vt$5s?gjeyq=i2VcUtDlBXrwNU=rR@N72WRbWe5VzKreWFj#hDrz0 zjx;*)roycZ?ONwi?#S!(Nt?#zt_Sn%(>|lO@6A5jXT09KYkrh#XtO1bG%F_UZ{yuJv|PecTQ1b=r~`GWf7)ePx0Y1 zNHsOdCVs6et!*zen!g>T;ge$Z?keIfFOll%*qPNhFt$ImTD@IHt=3bmja5Kx6z_5O zORB&|*V*TI1gE?ff$%k{69MBZP=35w6d*WH>l$5hjst!!5)4cvE3Kz-oP;c)^bkm~ zU&{Y@`zR}-j@D6Td;#$&bQmsw>|t(@6F$3~FN0ScKx!PgsUXIn*)Zqgg+=MDBw4R8 zV0tX>8-mc>4DnvP21TNdoNFTDSpw91iWdY)gh9MWa&B@;1~-cGt#Y4p=Kq(9pGx{R zzrBUz$|tdzX}d&WsvR*Lv2&17`@C?OC2UH=v{3`(CB^%@0MWZ4)=BwA17QW6F)d>I zg!CcVkV~4?7@O!rlwi~rMN7$yHa0v_D64`4S2Usbs2Z%QF?YD++U4&6ITD%V>X2N2 ze6$6_hEUHnY7+hY=86WeK)Ct!*23CF`)SLi>UKZOgD=pT`H}zND%N|+S+PlczPJHO@_y3F$UJw)*yD!}hZ`S{ zvAvDsfv;VZHs6e!`&p@0yTee^c{|C3Z3^$9d@_;Eua3dH*8M;B_DfnD~Xju0#=L0Y?ix>T?U_#q;TEs?kwV zgm5r=uE$+Px}w~B)vm@dI}E-syNjdTr6kf2DsvR!@FvqJT5s;NDtc!0Ia*?>{*!@l zrfditmpvQ-gFnc1foviZD4X~a!Ick;a$L+4iTlevOc$4}m=KdNj|i1_v14GKNaN_8 zAdR#@Dojn`LO+m5CvY?zzPR1;!u=^!g%6;tkOPRG6ju-gKgF0q<~h;neXI|LT-Az} zr)+)V8^Ir^;ejU}E93#}PBW6~Z!KP#BKYALcl8xQ@o|X};q$(hEj)iGeZhpFSPuwO zA<^Dq!yY7ZAEe=kN>gzr(>76g;>H$Xo%1NZ2s@x6Uw<*E$T$Atv~U#u;s69fQ~F`-97(TqOSaZKF1MPn6_W$irCWLPT&w$u z=6xJbvv1#OWV=ysF=)^T^!fsutJv)a|L)$w?Wf&wJIaG9Kd!)gl*V(bcJpM#=Yqs$ z*N){Hhogh8M>7d*zF(KY5?GF$u}>8d^DZ-5*q4${lIa2tvFaj)U}(TLGUA)-BYM>g zIgeIjma~B$v@cFrSO-UWck!P7U&ebU@~&fWeUZ&6iZ9eZGS#PTYR#-3P3l4CQ67m) zG)w7Qq#1~aX>yd1!Y$aikm#P~b~N)^Ij)6xtR;BYxpR*uV~*YC>*c9*-#3BAmzG=f zja73sefK6crE@a9rH>TC@*eJE?pjM(khZC+Od9jMO*og}4wcA~FZgc_Bz^`DVE2cM zBQN3)LC6__3Fp_sM|+DGyyaFOVF#~-v;?S2Yx_(g;Pb7xX@j-p)=5}c4DU65ZLpAl zCT_x*oMe*^p1#NNk41R=V_oiW11|BIW0$-yR;)&`{$iF9gSmj0qLo>W875q7tDHOi zrQ-K)*BM)lq|?z)^b0wwc@PYPNc$4widfj#5@jsp33u3LR_+r#Uwt-@K0FiwNOL{w z88uY02BZ2zP@-B>sUc>&iD2gn>ej>uiJDBs2D{r+c zggZe)$Ir>I*_0l>RTO9Pp?qlQ6y^?8?h~`H#S$tPu$C&XScrscUR=P#t2k4svGsR0 zZ115D%O=BznC5UOzulL+$u-sk)+q-obac!Lr8flLeydv|N3`3(L(ajQ8!9!Tyh|ID z@BP`{d^zZ!Q~HZjXf=*lk7$>NA?J&&<~@0SAh@xfLG}K#{%Eq3`0eu{`sT@6Y)ZZ_ z`PzjY=)e}cu13afDTAMR*4UE=uO2BP+Boim=&wFIedajDG}g2^WKs>ul;V8Nl*MVl zf!?fF9~=wn6no#?ETZa3Hd@hidvdUx@Ldao=VW!-esGRB8+_~0eZcp}@nuSrlSlXH z-qpc!()T)SJZS!%?T7aueD@mD?c3F7DFw>8)zuX)(a%7mbpeFc^PLXmL}b`&^I9kq zEqBFRq>w0H?Ua*1c3is}!mJT3n1E6v)g*}%RR!+F1VI^$$2BU;YPn)?r60dH-* z2JJ`wEe}Eu99lj+UJC@ysfD7rhG;}R01Kuoj`05%q`<<&Oq4pV3M2%sx~$~@=;#|8 z)TJuOm|wM#FkKlVKo-)~>s@A+{6I??URy@p>i{tj%p+#nd-vrR0%&$$P!=P=37x#R zcP%FBFBi&Y@Pbk(IlbY6IS`Jvl7W(x;RR0?kPQdggLV79eT~k12^0^KgNZvYkk!Jy z7pCxDxPMFqVlhDck7=-yR*00I zuwhgzLLPWyx`*8^O)GDkTFK(crhCA^gWpk02u0)lQ{jEyKs}|GHp--{gU58pO|W=AX=~i1Ax|u>k!W2npYeT| zTa|s20IN#6c+%hwl0%FjGAt#Qo<##H5nGHR`cCdTf>^WZ`bH@oVQ4eUHK3?824xT*d?IIP+TBbI9>Es=oP!Y!$_jQU^DNN`)Tcgv$e z+n8_>5yjF?^W6AMjU8_mUm$m}#pjxPTH~3=2QrFSYV?EV;3&sSMY!|R9Z!^aRu>jZ zQLR|$U52KOYUlw6+(EOBBIpZo(3i&{ypHvp$YR=#Xs(mgu~Qkv?HLuKsB;L-CdR;_e8QahO2o7y~AL^@*N z+XGtQ?re2UBQtC!2%REFsjd&=vfCDbnaGEhZr>5hq82T4Hk@n}*32jEP!tD8p8x?b zb3$MwelPw#x@yLs;1@{X-=cDmiv<#fVr|3&6gw1i-2q4az#ZQs4L5#FRkn`@_a$c= zW=0-@#f|n5Saf~#7#RWOWutYL5yG-oW%*Rl)y_0S#9UO+^oGnK8C^C>ahwpKS5BIP z0`j_~|MvAa6gl}R($7pqNl4U-<~RflWe59!7V9xlFV%rf5RMY5w!YN5xYQgV#BGj0 zlAx0e9m%l6zazqRlqNq-qRq|T0t+BYly=ZoVHBkl6QdiuX zhx((>aa}_k(~FllldX%_iCgL#a*zn6Ng|Yn9h)B7mro^VUNb)W6n#ImuQQ;@UdJT% z@ILNd{m-sP_GSFT*Kl$;d(|y=+8k{pid)DuZqe+S$99r#7&EJ)Zw<*>>v6lLw0M*l z=xolW`_K0lF_XQ=hS-qC#;QCXmfZ_)J0(l1awKadc3x$Mje`XgSIA zww6~Hn)SA+;PidbJBgpq8-t)2npoDb>xC(Ygp+?!g`X$<$bFS#Im|$C6wU&zWn*x3vxZJV(?;=YV^E%?YJXQ~)o1tRU+RAE$ebK-JynS(KUU6j*tpC7UtI^=IJM{dtniVp z4_RgW!pN7o!*_>y_t_o3JIT8XJAC&Z<%DnT@Z|~KUE1NhL%e&v&%0yfzJ7}9nUf3I z%BYn*NCi9`p8KG7FQf9Vl(ag~2>Q4`54zEcg2dnyTu@4!!;ODa>>?#<%&i^nO-?wZ zVXp#cl8RN?1s-2sxFVkB;nX*AIG18BLO#E&7ivK;tE2Pn*23~dB_VJJ7yFs+A8Rj1 zpV$PoUcDgYpXG39-E1wATgOsB8rJ}id=-6=nn)@)dWG{~J6`yp;o_2s0VjN*eMyF?I;IV=!eFN1a#{K1G0);{b#vrs6)PY0Bfx(8w zaE@x7#Gbg~OKb`6#(dS1{mB+;ru0QqWWj;KLA%~cD&;Fz-=zdoNp6VoE4oA1@x=~w zrc~}EEj`!k#?|O!v#0Su9Tp}N;pZ;55_Lq1NPQ;0PtOD~cRh~c!LP=i*b=^rZM&i5 z2r#k86-sTcRSw}a0iOs^3M>&^{o}gA5k)?Od>Pp~W9cvJfeV%(!0!cnf;Chk$55X?dvee-+3JsxvfM};owxA`=I z+$g?aAS+?G#d^R~cfuT^y&Nc!R88DD)zr&C@dvS&B{iI$|bx zDrX;wPifJ~J#Lq2lmX{RMd7a!rD*OrEGh93>QlhXm#OhkK9L$WIbqr!u9xIGj#Xps^XTgWn z>sau_S7|kQ11pmG0S0ahsWu{r56=SeO`j7}PSS&d|K?WLmKNLDy~WGy3G9Kjn0SAEtR@ypU#akv05#q@3pXW?W}3DXx$_&9}xzlA?c2+1R?YZv}P96suV4> zsHU_b6MVSd(gK5WN1i!$+Ky8z9Hy5RZ}z`xXG9S4p7ggEJFb_N^I1F?_(6VYI_-I- zD{0GrI!U<^2RU&VY})08h|;a*%nDsO=Sm)h`vxf%6#*VKhfSpc7PIfvTGt}a;|FDi z!xYm(pVWiMtUPO^+4P_^@gsh~7Ln(4lVra#bPsgOKS1m?GK409tgiL*W*fk8y8p@Z zAsRwnghO0#eq76E4He9}%;V|&e&Q4RG=OAf2>3hD8xBg)t_68P2hu?>fRwXn287T| zoOeGIKW)#4;5Sc%Dd$#3l0`=$?*1}+9>DYMaceB=@|oBRkbtR)rt$R>(Qp7Q<(0T8 z3+XP8o6;Ec=kSJQ`_-jY55>FI0ss8NW)5TB2KEjh6Je2b=^E<%f@T1 zl8{ByE5HrtJaQ+UFka$u+1&|8eIS3r9f5V+9Qn~gI=_)v4M0F9v*i#6Bc&vC&-&F7 zQOE7>kxaxq5t*>;ezGi`7TJp5Ni`UBQ`%8fT7mRJIJNHaz0iN)-VXTXdY+Wnzec7q z{bI&$@K%rgxEZ~}4!9E@Dsz=Sw$3bRIMzgJK@mFOV?VEX{Q3ZcQhCNIW<@@ zrd&Or-{DiHB@E^h2yS&X$M4JRNlv;sKC!y4k@o!$wAU9WFc}66xJPC= zmg+Jaa%uAl%wD@KJ&MH%w9KQc`C*XS1U4fL^M{rL4Lp1}qHgMhTh`ixl?}fAxL1NLFnHA)kD_q5GVy?x%O68~f z)FYX-nhF2Hfl@UhV{o*F3HRA}yO$jIOX6J87(vG3sQ$W$j165?!?Dw1JYq#sbzWES z7>Q6i)9j)e7y8X@l$24J8pTRnM{EoEh+>jXeRN2x+>xUE%Jx-C&+=-IDwHG(L0Wns z43a)@)?N$k_`z;yh2q|Fy7~|DeD5H^&J!#Sf2HU+risJwkwubhAU8<#j4TQ8U*virYf$e@ z8e>8CL+CdXnJ4(k>8?8|=|%qf;oE%v#t3xYu8 z)KLm5_AunsuKbbFcbPjd&f)ip?$v3AF1v0hirw14(`c5q8;bw z$E;=e6Z^7H-0=u~d>KD^$DMpSfcg0vn6%Z3ZhdxNPu9oJ0yWy}&u+KHBun=#W;@6) zQ0;N$&y!~(GtI}BTFcFRf~_41T0oFBiHxLz>`Zoyd!IgNPvr62Ec?6`^3(gWFW&LY zd#zGm-fljplD8pT0qlZ&5sQ%kC<{TEtN=gO67VWK!Bt1X!J>t?59MRi=?774+m3Y} zTign=vz9KDF>b^jS+!tG$yG}v8k6JW%>1mRbXfn|zWg}A+TZC6WZBoY8&-N;d$|@Y zo)30_oE=TeaNLC_#pXqT-#i)gHRylB>XE9j zR^<*2Q2S6=WaNp&Zjhrdybn_?InbC4d*KX=sMzkV7qqs`a_odM=^3>^iSC*AjE%fm zj!_B6MO;N}AK{nyb(e(r@XTr?4LG=v4=ofU!sEz?K5`Dm^x9UUH0X~Jo7FU$=vO(F z9={sbj};tNj;0p(xk%=S)Q)=!CO(%rs-8N1p$3XMad_f~Zwl%lqm+~3!;si(Z}E&? z^TY`C_hN3Ubb#B$gnb9fY+K@G5>)s>H-5;p8tirYG^+V6hgr%e_gWe~9l2 zIbb%x037Al0!zXitWzX}OL6~gcU6)~iR513{rDiDfLtt0k%{*@N1@zEOZfOIb%R3| z<+O`0@sPVUKLE{YmyEsU5Q^)IU!~nHpGm#Wx|>nZq74;4ac0RRywyci^?0-g?_Sq` z!ce+n5!wj}6&j=3(YROVRDtCts>?TOuM&9Xh-RC+feA-?R7n*Zk!++hN&vJ)8~7qr zYDtS?Fqy|FLlSH$}t(4#x}+28TzrX-KhghBx#tc{N+}H z5H;b4H4k&&RZT+i=hcw5*6P&0Dvt*SwOxIGAIYZ9c@{GmRPZ7~i(GHaEJ9_~J8pm` zEa6iu={l~SBuE<}E*DYO=A@Q7OX}O}E!@pEfH-t-Y)Ls8Kb({LAp2GKl1g6#R>Wx2 zFNj>kFVI@OM=PNI5U@ef^jR9zw4?fn$ZmI{yT3S;>#Ou`SbVeSqzrf=6 zxa*F170QWG47yi^*!~)Z(``EL?F}g{>7leH=zTtfcz8;m`78gY>~OV7*Ve!4^BEi?QZ*yuVV}cBf({~kS@7OefGfyY zEiCiW-76vz))U1I#=6uA_!N5?9WxViIvii!Shq8c?B)>EkvyVd(CCCTg9mpYas1J~ zDos0Cw^|!pAx`Qn2C;P#ff4nAsCbS4oaH|-A+Xq}p72;9K16>VW37;Ri0mTK85{M@ zefcvXNaCr`B<=2|IOF|xfkcmyZ+7s5-|poHzwP|sw|iim>g<_}LZh(-_kiKYpd%1* zIH>RTd@9dltc5}o=Jsf%o$CjGgIn?)y`5cnpZazqa z%u-YS>PNywJJU@5Y}#3<-)22B6fV0PvqnM>+l)>suzvg>-i@}mIF!_x_)Zov+cU_j z{cK-0&@<`*_y>i)EpBZyuDmC$CdqKUhhaw0xKMSd1&AM&Luk*M1m!9xwjMaAU~Cfl zGlJ4Q0|&wqeUJDutm6W5wfB8ri1iW~Q?|b?#zxjyvvrq!CQih1e&DUO)J)7lpcEVz z_vHDwf3=^}ea4vs$>*AuS?IzjJ+Id?He7>`6?C%_3=>G~L8QFJh~s zQd1QNLbfe#Qn&jf7X-s#T&7yr*N{_Tdv4ovav~T_Aip&5lL4GX*}M!#U_YCvO+u2{ zUWj|3MZpnWWJ1$Q^gktin&7eA=KCF_*2)_P5%R>BfF*sfkjOK$Ro*Antb z_Hg>|FS@8LM^9ojQps`Bt4XBBi2XdHxipJK3O^^eAf%jJCZoTat6&X*VAlRH5mYJ~ z7jj}2z7xwWuPQm>l9;1>os{8*Zf}@9M3SEv-9!dw$uY02qSyleu)YFy8e%~|YvDx` zw@rdHb@^heU%s}#Tzt-44ZPfRo%MHWFI77sr*?la{Yy9!qy!Vc?h1vp;xA9jBbZn& z+#xWEYG***SeZb{1Oi`0Vr9w7wdFNm1u#-0%16xoIGifFeqi2|4md1fymKiRqoZtLt0jfb~C)nSXUx_SA~q9(f!`6kIOyLum8z39MfWxWb#<*ByM=Pn|w; z**`yoiZ}EGcbM|3Chy-vcg)lD(SASFXPVQv$qFBI176r>J~z8Hq#a z_Kdr`yZCV5E~;uE*B5R=f()y~<9Rs=_^B`T{jOF_!rX|Ncr)gWZco|0W{9lhFz{Q% z{ekykRU*SkXd?a&cJAYLoD5t?I0p9hUBySczm7~rpB`dO3xsC#x4FCc!)f>-KUGpV zE#f_3Q84y+akI6qb@bJPH-mKaE&aA~d(3NPB;D-&n9xHhFxx@_M=&1&=U^*fNz7Z&e3BI^m+>f31CcYU@_U_%%zbp_CU;85g50Il** zovJQCS^YAX>Ic8E2sqAF1f8wn3Sr7yyF{5LC%_WXH75erz)9TPf>FE^e5q=Ez%g18 z1TOx1y$?3+(z=Ss??4^&$Q{$mnLP#N(5Z!0Q#!m#!uZUdY`T&LV|DDaT)H@15d+a^ zJf*mg##0YTQFEe_-omTBgl)eNI@I1~$Tw^I;)!%`45lh{4n34}(;HBb@I{RN($LPR z#&6>}(k3fWU-t*|IF&#PMH{1EJfy$~)n@z2Jg}qY#=+?F3B!dBXI!LonaprbTE8NU zGX6w=RK39eqh;eAu%XsLd0_gwhCF5Ase5w&1-=+!%5{Ta4S5|hVb|7M&2+zBUP%7#?sS+g<bxBdNpUv}$m|BMZ(5Oilto$@vjr?RB_wZrV%+`o{N;fx&b z^GPfCN6}2V8n+vHV{VUh75GP*g!km@Fszu%*+L7@E?&X7KO^tR< zi`|R4wK#!6h)25GC{Lc{=0s}PTqbJ9t-aWRe^9l?aFKWlxCfJ!#%;khxD-)X?stQ8 z!9n#~M8twCk15JU+$@|*ee2c+vwnFS#aXWHfaWh$r1uKNqBr^#_h|er_TC4y((}6W ze_zd=vBs8Wt{l0Qcjd0Um0QiOd@Cn%f3hoQM>Eo7W~1@QGn&MvHj+lVGjn(J&$^O5 zDhVWzfCDi!kU$L%G>||83DnR)0u9tqLktbn&_E3}G*H7DYKWnRHPrC?e9w8F_s_jo zBTeG$Z+~opW9z=}`}{l4dCqhGpUBq~Gp{B+aDzI+LUB94k&+gYuhx>k!@4%KNF0)i z6noU~qLzRPYmIOf-GjT5Or7(9t`U_$(sAN=>gF`f*8N1|Sg@7TD0uFnKVGEt#CHAB zM=#D?x^Vg8>6wMIQx~TfX3w2JH^2DI0oGm5+4`8__~eDv6Us(#|*d_ovyiKsE3?kc`(%Gp&FxGTvFAMwvx`{MDg*=ywk^U~jJr_Vwp%PSv{ z2Le9TJ?U(5+W!5m);;F*%A4yXCr$qMQrkS} zn$*a5LM36R)5^EAhDC1Lv>b3Y@Eci6B_#|l0ZJ>|uAt+JCS!_)V;F{5MowHwTk?t3@*@Qgax}%UI)VUPF{Th^J9bv^ znh?t_qaN{+=7${)b<-60*)c@`biHZTYxr)@nWBy9)NRmFW%=8WR4#iMh=qJCo}YRW zDt77Y!sR)#xJ}P2oVq;w>4no5EO&H!`%gS~(v7DQ7QKbn{Jqa1k z)St%z=wJA2=qe1@f!dEWYOt=7;tygy{<0m1uk;KgU%72Ge=)FRUn{U=FZOhg`E{~@ zpnG#y*~M?}q8+pgWn;ak$UadqgqKPLkiJnW3u0_Y=1>juG3Ck(WgHo?eisy$`3Bki zvM%zBg+&GqH&(GgFZLwgu$8{VN?*F|m3}j<^jn3MezRqzV^ip~xx>v%wY1FYS@u00 zFHXxASVecTT3+0+_?QLl^LT2_l-9r^(_1u7$+xtuZ}ueL>FFr}yaQRua5W(~ihCIB z)1i^rVM$j7P#8T>GAqC(Ekb-Po-3{k#UVOBm_R%FkuM{aIQtmdyZf#kShI83m-YcP z22Mg+;;4REk~V~vK}d<>oEQqY5}Ow0kIU=!m1$xQv4kmCd1WCn%7wb7%5Td4lx1Y{ zo`oj3s9bHVO2H+EpDbviHk|o*Lvc_AxQqz#i%d|Mo+t_IaZK%X7#o2^1#$k7E}1Ec zXcZr{z!~Zr_(^IHDF;64gWNwv3yZK-EICqK4(L%u#<+nCd(`SG^>dkfmgOF`1isL# zyRr=_L}5-~gjB2q4q1|@MM%=f=5zpV>brJ8Py~EG=PcF;IBnpVMKMSJqguw|TpgSr z(KH!D1b6F?vZ%=cMfCdTY5L?m?C_=veV0U-&JNeZfv;*Up`Dx7U%WH@YQfh#BNC%S z#R=fb{z`uR#uc@nlL?9%SS8|I!<5LF(W))|xD2O3@0r;eGGkY&kPVQdh(@ub83draAc|fTHqz*JC~cdx`~X)``Wr^};BelhC&l5}gVRa|E5qkQP?wDxAWk|44j? z443javRY z%_JKougFutLwOz$j!#x>t5uPAeJ8xpRKb(A!x-WK_ZY#J%`jQ_vzJNF>)8|XG487T z+tl8ZhuP{p_pDPD+40Oxa6{6n^|&ot1SRx68oxUjS9$9bbD*fj~Y{c{-`JYQ=guT$|b+BJZCBN^GEFq8!NUf3EAaE zrGp^}EWl2Z+$n&d0GUxGc_fpkee!d@cru0#hUJvNa3~pYeLdoOr}ycIAEJeo9dcR~ zr@^Hb^H#f)jx2dTW@&_$?5g>l##dgRy*+{I;bb-v|IaqIuZN}Vv4kVU#@sgd*)C4L zn%`#`qB+;yZ^qu}DmAuQ@+Atm)eK6FgiMYBM?7LrCnEWA)QXYxvedOSJ7a7^SLGuQUe zKe8Q~98C;&i9lIM?eEUr0pPH3PlqRQT49H?ReVMcj$BSr^Buo4$H!WX7bL2KOJ+7` z$KyA|8`a7vME0Ilve(%04qjfGVdRhh*SuNNMBqg?{W~c2#*W)gch*suaq*fN!m7aA zcX7_hHRxOA4Uf;&Oezps7rMiPxdK`h{C!9p3eCuUlC6?$=98k~jkR4N{2`d=YIDdW zewb8nedUxbgFEJMK2*_7r)>Z?*13&Lb=Mg@P`oU`$`d>F9gg>%h4Kzdk=HQ+B+^%O zR(xn~P7xh348B~ndTR}icyRGST5ymafGoe((@h3GsW?fQx7i$|Q1<$KW3!qc@1iSX zk#3ML-(@#a01h|`XL4B&_R=!(AP7x2Z24i-4i*XWfPu4#>T5RW%nB-NbY)ddb1F?& zEP}DX)<$h4-;DZT%>^(s`hzB~_hj+C>Y~KsMw&2KKA*_}&Sz9IeOl>VQ8K+CbYuXR zr$V_d6ZZaqqbfUeZ6u_P1nvan9JuYtFjt_8<_xJJnX;061Kz}7k+HQIsSkEgS zLWlQ=#3ZSfX~hHH5n4Ewg%;+g2OWh4Ewx~N|I!L+;#y9FJT=fwm7flHl853E$&XFT z9Kd{fT?m&|vB`L&xljnii1ni*dtS`YN%$20Sp*YDU3@N6#wQ^y`Wrpz=#-!qE~ey- z&d@A9-fD02%C(t-XNa;Pk&FXX#` zrn=g>%CTRcZ(`UB9f!3rY^-*8gXFr5)nYZX8FM0WDdhlUH`Kcy0r&e}>+(C^b5D;1swH7DL1!0`KjU*d zy0F32!dAlF26-1mH&>02s$Z^{p&#zSKNTTg3il2TmQ2Z*8H3%MwX8g(=7}1K^V1C# z8*?vmFNrw|T1JgenhkE2Tq#i-43{eG@lEyOm!lE&p>hiLc)%)^ZGGte0oiC=g1#-a z{&VZFS=@HkU$LjioP}V;Q%fsIH?sf29Ir;^IGBWoOnkQ4)F#e1)&t<>d5BK(t30tF z;XtzsnjTrdWvQs4GFWX?Lem>2c*)B;xAT{g8^FwZv*Q_#3f#LM0QmIm8EM6aS zyTy}Ck`NZ!U!ZGa7{>DPqh=z{nG+}N&VOe6f~l0VL2VQO$CC>i{&a*eo@#cQL+Ceb zmGjWXSpO~JSY)Z)E+rE@X}~<=o3BTph*(UzEh*Wi8+91$htqjpHA(UW@FF65OR+K3 zZ+T80aK-i}te~%wPSQZe)q?n^x<8p>#i(@?^^ALW2|`&Ec0?+NdC{-AxAG5~jR7?K zJgPt~FqzP3-bOFy6({JmVO!9tovn48?*3L?L&C*6$)d~$F`ELB0fbcE zmvXun0Tr3lEo0%vF6qoHp_i$J7>i+Sg{WUH@9#=l;|yZ*!seQ@)?3E z#7SuJk7eJGt$Ho_tFt4J^k>P1vR><9vjg`DDOZ;t&i!r~gA3+cn)m6Y^P z9ALve`m+L;(;MVDR1IfDO&=+>kyh-v!VD#Y{wgDpK*fRx&TMSmD2~&m?5kpxZhRD@ zY{yY{WDqfpQE{+C1W8;emvcy<0LuSo8>E6 z-N4a)Yj=Fs|LfrBE}M38GraPL;Fq;r%zk3U>bIzcTx^8$3zy|<+t*tk_gnm1>r+fd zn}kPZ%CFvDj(T^suQ%!Iz1>V5AB2pk_w?qeVeX;7t`E}W-rg*6Mp$@BBj)5s{=N|{ z&>kd}7p8ECFfe5 z-9hCMaTRG0jn-f2FfH?Ulw}>`C2m3SkRI1#U$wa@ADfURyw4kQ{Ug0prSglXu&&DU zDGnr(nSCIkS|>CvI(Q1Q6pdON!(gqt5E4b3XvF@M-|io&*Dm)djoA7%ybMDhwTT(T zY57A2QT9kB6xP%oi#lC-x2^g9hwHxEMu|>Ii0;4bULNSJSYXwO0%AST+cOeOMugA@ zWU{nF`JpN5-aBis+bpEX2_ftQy~%@}`X9fvv$nRhwR_R>R^95bPJ(c{^Pp`Dijhvc z(oq~VA=FBwfJ<$^OoKOxN~f=SW0U*C@&OH?9P9M?sLDd`5xag;u9kGsB-8MM#P5QR zK6$9)I>Mm7j*{n3k(Q(d^Nv#3=4)zSjW1AGGL$@QWGC&aCXaNQue*#G zk(fL=9qtT}-|I*vUbU3kHg=apb19i0bWZcwZ3RqD6k5yoBdz?K4t3U+20DPDZ7FnI z&vQkoc?2{`nqyXxY%X1%$H8qSd(K2%tp$}cCsznk8$Q)op&OY34s}nN-p9rW+8mpc z@{Pw;GE+~+5dzJ^kYVQAPzI@rIpfy|VrZ*N3SpalTd@^fJdO`i z&(|}HJdi*sZ`9Tmb6S+BY%rB`s3HY+|LyTPKWe~Fo7(NkBg6Sa!MVA)YUQ$|THVzI zv;h!r%Hsx4jX2w(%j?0&cC_+!tt*(yT`?=deH{axz)IF6`G{spW=ka&RDHk5g{u){ov>)^?=O{=ov=c&(S(v2`$upQ*=mplG_Tq@+-|9y z64fNNNi~_-15%^sNC|K-7*#vMC`-fii*!0T0!_t07wqiqle&euHaWM)EYIfq84XPB zreVtjxqi)~HI;RHZ@^b&?4tzmYA_4SM`>qbbjYpB)20eu7Tt!`)lAA$un&;FY(vWv+BvRsW&U0A`QJ#MQY zdrAG8DCHf21qr{0ZhI|Cy%hTDHj@Ik52ImBM&z?GvQw-pHnYwi{Uub-Y9G?^;x_p} zsvFA#!F?m#O90a>-UDo&Jv3!exM#}%@vdY(uMNy@D0>^X;H>&I0I~@Ac*7i>#0l?` zu5nmzvqp2-txic011)5$#tLdE16L*AKGoy&?}HqM;La^(-VhkQoh8_H578hbT5|;X z+H}@7nm zIfMFv)LR%;=hY_XfVL<{2?PraWM5@dK+L9FW(viUMPf!my?N{p@d7d|l?zVIku>}4 zW0gNQtj)hf?ePcBLRt0njLWJ`lR?1mE}Jx+VGg}Mg}FFB&!?`DJk%p=gw^xgK2-kw zo@4FLLoD@X{-*0!qhsN1GY|tEFUN61@4U==8wYTpyM9cFB8?R~uUjwxNxjobhE6rM z�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

Sv}k-q$N-oJ5+;5Uj6N1Ia{RtU?S z-^RYcuV;oPQXgk8tZTUV*k3@@khBr@v-OML&8^18Tu z-2891X#jGCWg0aX>8|H4LFJ|_4Tak$WWcv&VF;k4`Aee4^nTMpk?O1oT%K?HuQP%f zsLi&rw9563PrEj@Y_>pi3agwuew5yO#}2MjCEApvpP#yb2tGk?DYNgfs)knWB~Cz? z(_F?^4!`ogaz;*aoX-Nzp=a;FxVSKTWnzjFYTc*5+-PDgK;o_6HhP=Z&^FcnqmEn&)nmO4;|6 zv9wUHoZ#awa3DnvCEQtZd=M)@ebn-ED1*6sBs`<}$woSKRK##@M&h-nKBx)^>o0wZXqxi>uWdbgi5$ zfY)A?tURP(8+*?^k1i*vvH_SbwK${|abz(ni(9JIKU-h;Je)`3xwX>W?0x{Nq1P9LuN#xA;sqZiHDlQ-h zLeF|Co6JkM6^pC)E-!VLR#RnlHNO)1!YmSoh#6W(R>BA76Pg$zdZ;^fSKiGIqGn~F z96e@k$qIelzqj+x+2zMUt7Bfz5FKNxs8cjmgbSSLp_&?y1sn^bwk~969vnX&iZ~}l z^-&~Qvz1kT<3M|yNZH+(f)fh(3hV7Kp^b&Lb>CNB4(SK*z3*D z?@Gr+u@?;n;b#F);oiNh2;>y<_B7I~*39=vTcEEUK}q@MN_{cn!I@OXR}b&PM;duC zk}{DfJrFhlp{pKjx`y$q$<=1(NKfbv>4!o?8P1N7mmJUH9$>ZO1;5=Z)K*E@0 zQZ*^rtx{=cc3QR*>N1`Mj$MrlehC1w!vX~Bo)+$+0E;7C6tw8E-8Oetoe~N9S3B5+ zMVj4o%Q|f+1C$M5fz=RkqU3BsuQST70*nn*mwrwfwrSv_(jB~AOM(W7WYADo!O)0t z%FKb*lXmQrOW+6@B&3IVRn8RdWAc zHE7sM63ww>lxquKy^zO28#%E!*qLcW%?ibI5cJ}pay%)}h@{;dWwfTAwP8U!`?5>rSW>avtI#pio@^ zluseAAua=y8E2!q18ct5PA7=en7GOb!W^AD;JOKO8LmwoU+n{_&Q)a>En(O&A$fYQP4Mo73uN!8EK630CkFx?g#oc7o3b)16Ka+Yb!@YlkkgoI0IS zp-1P5yCHA9OUKO-5Ms-O8Nt%ecEeQJf?H!)UUjy!J4QZ}S+5dAlN$y!Tv;OSMi^b~ zflVWL+gypjR4OQLPYFH}XuMGzE5d(Uhv}N&t;jo&i7i>Sjc_7g>C0#G{l%D^3%Fp8 zZ+mASU{+5v1NUJ*WEtiCv!eYU>~r=Xd7$qy{2zEGqp5+;OzvHIyKH!5uW0qt{x|=5 zd9%N)f2&>>=+VHal(oUWWd-$OqU@c7UsJWsZDp;2YTnTx1hBxPvbbvdhHY*MkplmeTN*bxKrx|M^qYv4>rj%>f?oTcn{XTDW-;kgKfm&RxeDW-9VRV2Z@8tk zC`|B=325Y_O?6HpRGdQPTUo3TKsuN@g8a;H+@T&FI(068Lo?e5SjOmTm#`(u=`209 zP$W8}zLLup;lvWCIQ^P_6Vr=Hk|WaB54Y{?FI1|6(%Y909+ZYk@d-=m>8J_?B#(IM z)%GKhN-oetaGguXZ~Pi4F1EN<2+mM3@uN3+8l+yr^v|WJH}2p8(arg6VJ!lCk8x1S zj69c$xr0it$hRIwz$$z^v3Z@4G+02H_`KoyQw4=B$?uRd2Bkry#JpS=@6l@yr*-nK zg*59tkbfty;LBi-%am&vg#kMhWv9>LytYGL6DL{~(R(b|0KTv8$P3!>#} z7a*+YD(V|4OHvq4eIPdGm->42i&$|z{p9JlE?hHm>y6){MYsLHC5eUt<`)?+%>OoM(zf+C`&P-$iX zTF$KS)1Ja>Ug$)5d+8T?xyj?E?3BGG!hH!HTJ%qBKLL3K?G zV?X->Zc_P1l19nVCYwtySNT3i?a*l#L8o)Vja*bV_o>R>tYq|aT45pmtQE4*UYU*2eXl6s@ZYyhz~ zViK~CNwD3!7jA({*|Pw7bs$U>!*#M^bgf$|KK5AW;>x8XE0Us}UckZedNvQgrWecH zhAF*(^-FJPrA{ygkI&ORVPRhDeC@VOwcwQe3_L)Li#Qa44{`|_zNKhD6*N{N0|;2& zhDDc47uJtjSDPq4(=P!Y{}U%v!XE*1{*LJz7GtcLp_w+WUPLxUjO6@z(6nboIBPji znTf+5!Foe#c~TfS7;hJ@R@I!7`OJa@GIv{D^#(>3XC88s%G@@J-u2(^7bT1uNyIvd zm~&#j7&$wd}<(WWf?W6eOZ&>*`! zE$UF_KiHSAU_e>f_TOYEzD$Ct1nw7~S_e+D{pE{b(})Vvq#(LMGgXA@lw8N2;E~*` zm{Fjz+ydBv`d-8^6)3|+y*s(F$_$Jc@tAijXkfX-tT$qd+<}XpYIrNzpRvttN%h4h zYbP0V7KE^B-JDTCa&Be{3`@{YuCwH~GQC3e04Ppr1AF;FQ+Z$pcY1)n9k;u!ncJ@m zhZeb)F;VO*ZHoW^M=G7?2WvQ(GJu|e4O6PS3vd`%WB{j9qqROVV(tvq9x~b>qN2c5 z@K#woAuGD;e;UdquyBd^kp)5+(n5wBVm?HLBuI3BlRVmrM+g_;Ick{dl2G}J2|O(< zJq^uDMZohM^+*Ui$#yjmn{$kf<;t88wjtwv?Or@;mo1PK|H|q%(A1e-4LI}Sig)?B zDxZQja2&I#la7w%NfJ^!SQw|Ok#RaunE#_W3_#gsCt%_|xMO}&>!@xv2ZCw2-4f$K zGW?{5V55p5hzj2FH~Zh^0rx$3rjCebr7FSV)hID9eZF%&lxk~?PFa6lP7L^cD%~TN z<62yJvN`OK=-mmQ{M+2#AL`3j^FFF}D&(Xyg{_lxw&m5~!rLAH;UBi1LZhvSr;$Gi zHnl;%tVBB$E;pSMv?N+Y)&6L&BrC7ecCZ#}htP z;1cDi3w`97y>p}I9g9)yeL+XOGb?C`Z5fYw^=Zqlb100wpq?P!8*S5}PrbQGR ziO_3p-Uq4RU^Xt9%VQN{X*w|2E?DO#FcY=Av-FI~@*l~w?9Oc9BxZAviEErUK5sc$ ze;-%IeSPoI{t>_N7TBF~dvG;IqC$}4@JLqi3q#hBaA^U?Z61rFt zlCwf|mR+zA7S6GVE^BBP2^krNG_hp+45DxTr4X-7;AImq{a)^T2_(M6iMr7c9?C@l zEySA{C{#!}N#mx$5vgf0hscg1Ti3~W@Oz7YcjG-pQveb)HJrM}*scf8$Gfq&_vRq- z6LpBZPq}s?9du&{yT(@7w~eqVyN5d|d)+uorI!ocryUIJJ>Ht-h{Hd2Hw6>!4mj~Z zB>>yO%G0K8c~L$SFea8|U&m?;&$h^!20#QK2@h%QJqj#dh~YVz0`8V8Fg#|?yu z0Hem9knW%Vk)8|WQR}&n2v@Oj+G!vcF?_-;sH-ggra+m=J47cj8%qS1Zonxgxywqi zus9Pfi-`})lS}#m^xSjE2WDrksM(&>T+50@ND|B4V`UDtfS$X^X$1!*L(#5FyIT0D z%ORC4X9UqTjj{@aTXmHEC95IMu+XB!jg>pNA`&d`g zHK;rho8FuMD&y{4QCO3-7iDuSV1^5+F}>T?a5}N(H8X0!{R&v4XmNWHN{tJNLoQt9 zQs}VfT((Z5xg_4U$isH1R+ZQZWMP#+(dSD`esJ0%+q~r^vq)gnJ(!t(${y6%y6jb* zFjk9=KTRo%9&hP^W}_+VUvWCgE$LxT=2skD?Aq9CW9z<(c5`jD@E-4R<4&%pU5C#i z6CsbLSH)O4gwN>^fKv4}dy*{$+rOVEWJ7DW6Yb!1^~RsU-s3(R$%r=BdRX8wu~6=k zH|q%ed3n;n3o5~AKG};T%E&PZ(3MD=QvcT;IGC(4<6uQ&ktfXtfl!b}daFbzy5;BSmpPFHc)w}0&v*#;PNA0Kcimxji-x$|B)K@{n&rTg|FUQ z{aXSb!6JxEtUlHqUm6sJ)7WMSK5|NyDww33h$!cKHc}a7`7kfJ;F!$cwZKJS zx!bcD7&@Z2?h~2e3cK869%{Seus=ALj~?>lhU3wb6SH_quA_hr2LB3JsS?L_2Tii~ z*G6xEFccd`zzny94kRRCI%*^`V@YQfqi1CGu#xMT85>DKy@Ep&To5T0!B!puZtiSaEC}MkJ4wr_yzKjmXhiqedP)x8)5tnZanJ4WxuUZO}vT zMEgX~yxfjcBpG!jS=Z~hxJu#*!n1NZT(7IiZ>gHcV_2tWu4B)}&lM?(*1R3%#%qgP-u;5J_(m0N)v-oiixqu0km3LUmfBx&+ zc4fQ9i2vv;uTnPGKb##no1z&B5BPu-mM^3gG>k|oyG3M7P*WHQ!$|Sh{gcjL_Mcr? z-Y|lC1e<~r03a)eT)NK5r)~$tg)$jn|*O+YJhCjT_+HVk@*C% ztnZ{P*tG*+XxYM&M^2M|Wp;z8VgZusWflePqmkJoVLKHxL!iAvsq?h!bWwcM<&JYi zApouYsp=k5ka;*Y;*x$73YiL%;DqdvN?OLCB&iWq*3bxKi`G**$nnqYy#ck~EF5g=+Po?#SXpCH{jg)w5ybD%1^RQ5^ScGe5>a=GqwaZ-|jH)tyo3pQO zptOM&O%)x6Lx{IfP*V&ID-ME6@3;oJV=kOWzs5nIyJ|TQxBdeKmW2J1wbB zJS&TV=dgo4`~A%$tETW+7!v27a?%ovHkha~nQ?xS<>zMzp>h4nD)P!`B7uckWgyAo z!s5y-hLx$$6z$=%Z0wGDdsRE|3e?TtX^ONK^7UEfewKy?L?5OTN=WE>yDpzXijbk^ z{OG_VNRw=T<-j>1N-v<_XUJc}*)Ea;YkMHJ2l+X zv@YfAAtqMXlE{mmwWdn0hV~4fM)hIb*6T#&WsKIpQaPApd=3Cu^mRzc(lMl!V_uoS z^>0-3Ce$WQvKW}K1b8t-6K-_Uz|<(aog1Rc9*z!iykQJ%3|ghTBgBaoDWZYPsB;m_ zQOFQ(-Y6AH0SS6S{$2S~rqo;PGISR%*4Y4!*0ENcy8f`wY5U`nRQW@p^GS6ufqL50 zM>_?vOF*o%WXD}nf?0n;N3!fLol;Chl$n1WXkHToRxhek&5x2=gH0kfRYmlGa#hVp zc9lc!mc%GF<~20CbE~1*rwk1|WLY5bsXI%9vJaT}UQgzmE%W;~=RcY6UXy)cw4SIl zARYV>W0nkyf)sl2)Ub&xW5|P6RS00_-$EKfyIapO zbXrT}u&lM!E3f5M$@zNiA=$|xX>>+dHd)byq<16L>18J+r_X);1MzAI}N7m zhlC2jNL|J$^LzSVmSGDFZ(Q}Me=xpN+>6ofJ)#P6OM*9w-C;zu(3o0La&sW35(Za9SQ7F{ez7&(#cGvyTZ{mka;3ewkV=sTa=7u zA$}!;bUgQ1aydwj$2V&IA$T`lG;$n|szw3UEMuUEF#QhFDknLqgnA~)(ya3tIn3&C zTAN19LRibdvi)G1WJZuQ%?h5TIr9fL=RcRXjvY0qg-Rc_a}H0Q`zQZ2PZT95COs z`nW0LGhNzlzmg6J`fFi&;D}u8XDr!uka9n>)|nEAmTKOVr%vEzo1coER`qp?2OeD= zs$96SSk(3gRGyn36Qi7obU2YbG-InAiQNbr zp)y{ey?oEMBL5AT5FWViRTjYl5=unWS&0Fo^McAnqq~9$@W0ge z3{{c5`hBmWwfe~GORnY-+Dj<~L_7lO!koOvxOI(b^peDKSm8y;2C@hY*%oL5?0(IO z?yL&;r5ZIjcGhOCHTb_P98%8@|IH}diw-^EX0?61!hK5>F(2(5aUPQvZCTx&M4_DE zxTS1QG!00>OtTY9n8iBt3o9yBWww3-HgxIb9`kzmgxTsE=`a9;Rd_SlFxHeCRk5Qx zkoBIiU|wg^ug%p{o*5^zljbjib%d+J4>6Y%bMA%L4$r9dK?$BUd`qXKCiqT{7ZaKexfQ|8Av z=f9Y5Id*zxUOVkfS;#MOkrMgV6vTD~Zf!kmH1#geOO4~8Wo0Sa+I45@f`#hv8)^VF zBOsX)E+8JeL=f}i{eLCfoxWYl>yNENqZqqAbHfToc#`$gg%RK+U~xTbj{xS{`6=Sv zup^LaR=tg(8Hc(t?42X_h%6GVQJo&Na@5QOtR9Y=N}s~Fz|C&CQ{mw&ixOn|R9~m{ zj0KD*zbDy*h>AK4p-s=SB}3S@l2AxX+AF0BK%U^@Uj0rfzE`1JLbr&+hOFV%F%45S`RN|uEIer0m?)Uxen(qVM4H}%WS9fEy5nY14UH&l7dV8 zzII>1iYc0=SZ+MCmN6O0r4R&bvP?H><4D?qAP*N2$ta1~fj)ks_aQS-(tFaA4~FWo z$qDd?>N0<%zo44b?8-8^xm1(#4?C!TZRN-F?2~x`0PLR@SSe`BIph7E6K3EY!@?lO z(k4;jf^4zoM~7Nkf>mUZx2x>6Yz}I?uN<}tIT%;eQW|t0UlIu}trBsPZF3Cl&9n*r4omNO~T>Nv$Ts3Og~A$1Ml~K?1yVlbGrRlAQqN zlHOBT=pOxc6&h){VzlvYoAGY5Upb{g38*Om*Vkg@X1W;UOsHEZUUlDId&3}riwdQl|_ zD8f>zTBhP?!Z6}giMb@hbreWPkzSLvxpS;MEKn})S-!Lc6168!H00vKbr(!*X#v#~ z1S2C<5JnEym*&L&i4Y-iy?aSiXui?C1eMSPfVBcX$^#Yt^jfJY-zDPUU9C4dUXpLC zSKDQNeslhDG7TpB@5(4p<6U^@ED@jjcaITyzS2Fhpgwvp+TRgVcO5!9<46?a0qs7? zdSZ*^;d9^jdUv5@k)lB+I@8N>8{l;@)_q3n%fXBpJ9lwfQVa)ilQ0 zT?|EWjRU{jKSHDqmLT^5+a}(#!6y11v-4G0PxUaDnH0%zBWOFT#Q+9Z`mE1v&VM!E zd03E1?Fz#T@znn^e(L_j5D_u&aM(OQHLRhP+q8r!YZ#{imFD&QtPb}y)SF%_gBgR| zPN8r!qajSy4rOS)#&fc{@5(6A{`=Q4DMH#&KJWHN-WtcJ#fN?s_+{LkhASQ}_#nQsO5Amv3xd zqOdvK1mXAn(GVV+PU8w%v4tMQw*&JMCp`+itUEft30e|6dYkBIHwlg~z`=yme&4GK zKaoA<)CSwC@cCoozddj{uMoQB<+$q8*$AJTYd7j)>QK)H><}HR!Q-At%4q2(y{c`> zg_{NO+19In)qz<2+XD%o4axHl^uIhqSSA^Tctb*N;#1%5^vNvDn|`kU7sNl_Z8tW^ zIPq0v`Ns=&;R%8?-n=>gV%|?tI*VpYXs~PR|Mm46TB+Fn3#NP3%$2gOxYgx_x4D;> zb56>cTL}bKSuB>m9kdc0Ztt&6v>V!J2OFlK>W=H^)=|mCXU9Ea0uT$6!6_(PZQflEP)k9)8E#e-w?R>#4b?1w%wk{(x=tOgXwIc|uct&F zEo)C!6vynbJRB%j=D*m#J1bI|GOVbwyJ_e_`?T6Co_(xQFj58v0)HT%fVC>1R{4GX zVpijsn(z_f|MluSmx$NAank2K*6B_z&6oh~xj?_HcRien?2`1G=)LPjwwm&gzdh1h zY!L|g_p+os=h}rbZQ|9+S2yRsMQh`L|KbyeQlGw4s&QS;N{v8iJBDjY`M}%!CjHxus)677vU->irVL+$>DkSRc{^ zscn8~>Vc4gQoPk*Z>2kyi9voiLPQ?{dgfA4YF#+e*xv3J>({=R%?)>>wmP0 zDMmO}B7-8cVlX#cm01Tyk}L(%KPBNJ-*X4RRNF3>2WemV8pyzLq1}{#d7VzU!CBW= zO3FXpe^1sT0;QYVzqi=G#a{M*5*A^B=KLrRcqMMj8lq~n$umJ*%lD>`9zi9AZMFw| zAJSMB5I3smP+M~OK-?MK6}?6@m*@O-utP-{f(-@!KnvI}M(3~{N#`R*w=+xB4cBv) ziKbR>6qi;Ax+U+<4X=O%&7+Y=h)+U?Bo6qZ{RfC)1YO6}`AFv9XhPh~pVF#)3xpfl zQh=_$^kg!wwkb!&$R(_=gL;BnK0!L@&33Y810)2kU9eBtg;JSWqG$Q}TQ}!l&3DR^ z^k);9{zFnDYd))cvE!RSM= zDK9V#F>g$BLVRhdd!p0%;%$99Qm0&gRtT7mP6r9!0!K8D&v^;=ye?=D3OW6NxWr35 zUY=zJ&m<3`6$;B*a_bFUsM$HB`s#_~uCXSqk(9I?pVKN4Gt-EfJLK+M6XE8%)f!3I z32XR&wAlR9{eLyvIik|D-8}xgV~73CMcdT+Rf(G8_=T`e<4j_kG6L!Ga#z@C2pQV6 z>CUa6)03Vw9;$Je5>o&>LIIu+033@@ZYSbdj8+!~&+`6Fn>PJM|8I$eA?mpR%VAcL z@!_+@(&sTq=?6||k{}@Y^r3J3lq`&xETixZ=E6;_ulAp9u(s-B z-|MT#dJbYx^+oK+MhWk4QJx8x$hZIztE$Z34hnwpIt=!+oBkFcfz&vW4-#rh%n1pK z4+5Vh6^#vxdYC`XLcAlTPHmznwLsr1u{qQ16j&vLcUR@fY(5}kwt5`A^1g8rn9JO8 zJbKJ5Dp+$2|ukrAOqZUubn%OCfWu%A4I?Ii7B-64=H9L4vLtilHP;2wx!QMy7 z{Hq?N-q7a!>-jEh_UfNtkpZXVo^7?havK86YfZXrI1?(@y~-3&GgY#(dNSJ|saSS5 z3bs^VCzaA0H<$#S9Hhy#=}-fe#0@QQs@D~+FkaJEE#zVvOM*S*KD}W(tRSDFZEJ*N zC!LsjL_R8eZ$nfyMF}+Qxy2RbI%UHL`Ko7GL!gtF;dxAeuW5eBaTPGyfmKw`?3<*| z2>baz+VrV(>3jLa+QxsJ**N(8e0J+LOSk!@l3LwvGY(oKfuSkdyd{*_)n4O6qxTXW=$>gg>J@Zo74E zFfprAC!*zXD-=tyrpTZR?nYrf6oot5U7fqQ;DMGPHizs!`}`aIugC_@($n2As+%`H z-{PXTxach|Dp}yqAs79j&G|QOanV~`6kX>Q7yV=BqTlQv$aWm*bf#Bx|Id!91P>Nv z@-L-YE}9gCwbyzLq+%ataqcW1z`!_zJ!fGF*|@j=V&8Jlikftyup_7|L-1)*b=MY zngF3}aZ^PNAj`J>v)5sfssME{w018JK3l8B;ZOt3=bmTVb1WTSDD1DKn<2v@D?0?F zHmilU>lgz0Cq3SZXkW)Di-8R2(4|9_yQX21p>&`43s#L zJ>>rw4)#u98awMBB3ZTXAQFWkV^AekZ zI;q`LayG8*5-B@K-_3@aSGRaC9V_#aX_nPhN7*5eT7+TDZ|HH4ki69;k~kH&`h5Gk zL~h@c^`D+w%Jr}Q;v8isPZC9#XZvsH0H5t2>|3XByyD_KefpfeX?FYafJdb~IDLv< zC*lXgMH;5>L(x_c;;Ts1FvIHoff~<9ap%1~Y6*o2Lk@&t%2c#&6j~W}hUm%_z=* z>!}Dw^<0+Sz8$H3SlU88(1Wty@D=M8k5GyKdNrT0>eNVz*dUg*^5?kxxfx<50u!kFnSjQnF7 z_U;D0WpK|*8elqaEX!i`DYY7Y6G9og@ALwRlgo_A%`w6pyT%}91#Oj!&X4R|K`D85 z2hiVQo_PSx4~`Y-rhpR>zugeVWI*J99(oXmBBORXz0TAu)?}RXW_&$(F!*&x^AbP( z%bW9W=KX8x7igG;zP2&2IGtwo0{MUSddl)_4OGe?=osDcF_D>Pxc}+`e=BVAg+Trkm?utwC#^WylRmylnfYANfTh$8Y^} z3j((wa0>#rAaDx;w;*r}0=FP=3j((wa0>#rAaDx;w;*r}0=FP=3j((wa0>#rAaDx; zw;=FGg}@HnLgU!@m*rwIU#Z88%Yzw-7oHA@`^DVuR%whp3;A5}N#Np;?;`n;l2dhtzR7y*IV?X}KeQoZ-C08>bEhls2*K3hHRu<8}E!CGB`m16)n=-*{ha_L&k# z%KYP-^FPQ3)_Bh5IjusDPeUGM;;k&LHhpKbOi6XI$i^a0g~VWM-C-4^$n38|=SPo~ z0|s?-dwTArS{T%xvFZrp7yz{4YZS5qAv{kf#h_Hr(?3udpvs8$G_RTN+ubFGlahu9 zRvf^SK;$|MG%E-3``L;}2aVKb1gaK8bf$gWU{(a5Aum!w*NEm-}hQvyZhmcy5+ z#ISPs#LV*r~VRosCoNfpkqAu;#P1^YYA@Dep))QJfe(@nD(#L^UT4 z!k${P?Z)=#xUB>>-+45Z2^=CNp-O5`PVwH2aS<#l2wX7V-@@D+H!y&T$8vIsB3UZP z@ELV-^pmi)zeOufW9en9mSw3$+%K|ZsZzO9|G-8~cI6J~Q({FY--AO1epnwr&Q@dhaB* z$Y-n+5y%Rwp6yI4w^}JLn#PMiCg1mNelcQG4v$(<`h;O>0iZr_q8s&9vRE?}U0c4^ zQ5k84#Hl7Kb+l8>Upd34RI7}8Yfu)8@_IaJE?5d9k5IUU62O!UwL8vfk)&iyX}Y5v z|3vODiyV1L4b{vh7fs%6S`1hvfW@fh;O)Sd7l!QwiI$@qfz`P8ZN09es+j|aUYvdQ z>+dXI@?QVv&QxM0QKUMv#g<+nyf(UEA*+T?Y%$Sj#SA52@>zAF%3_4=^=!_<2vt$A z%W-hmph`kC58bPS672daM^fPvOqp2r8p}FH#~lM;@UW2hRe&do%^;A zXW6fR^|7Jrw{7P1QYV|VH!DOyXbe}s#umn8lh@dlj!A0@fEp_cVoX+;HJJjU`Tg66 zvR&t`4^1~u9|m^N!JzBx?E$g3sb;8=8il5yt@6}^*9es8(i?`%ujo1`wy2EBRJOH# zJf%ZQpomplaEYg|vMRL=5mt*W0(uXk(ddoDSS7NKY=4wU7V=ny&(07m$Cn$gY|Cgl z?y0e_wrF6LAhf6qN^cXvBQOC6EAp#I9V_XZ4t};`k`X%@`S%c?a@arOLKJF-=4 zA!1Z(srTv;KtAsCSkguV5a}a2r}DCr9F*?6eqkxUn7rYS=ErqvpKU-#Eb_WK52{{3 z;D*}!q|@V$TQV|jAawL8kIkC{w?;J_+%$5_bb38laB`FsR26bdPv|{c$Z5Sf-uouW zrvGny?*d=fRo(fYtH_oTQHwj2v=N3rERa9mwky0(R_ zM|7pwN(mSUouohqDDVdwXn;^)21-IhOWLGOr%)b+PUw&VEd|1)CHx0yc!ZWVl==SF z+WVYy^+@8-{)hR0lFv-B&OK-Ewbx#Iz1P~{Jzd#7MbQ|ipX(R2rgKs z4HK>I<;y-U_^xF$T;(6xLj#NhY&E!4u^UX>HFP;3 zUec)24|2{SokEH*goeFJ=%UbjQE5?Ag_{iGfyj&PW|vo%oIp;b;!yk}r-#%QpHDEW zq>yWeM1UtcKIhMN<8jta?l|#PJZjyf&E1#ncvziuBPvv97j1^3$rD*(adNSmNOIyZ zap_%QR%B)9gE9-Xkzl5HPdDn* z_b)JS!>6VT(0zJInv{1QAc52V?}m>2z?cm+s5AVekg+B&5;6sb@^dI@Hs-sxYy3#$ z#AlpRV;5VWkkGlsIy++#0f z`6z;}OY;}MF(G%8zItpSS4PM+ym4Q;*|aCR^^6B?4aGBa zJiyVs7e>CD=|gY}^gFv#Eb9vaXA*x_e`)jyHG;^$kdEqR21P4<-oSMC(ZPvK?!Q;d zdMVWgW5Y%$q3^poK?$Zh@7B|8IoO_{92A=S=qFABvOk-n&U6Y_`TMrVKhYQ4i(dr% zmp;F!bb3=);mGD9`bixi^m{3a;V8@`f~|ML2-r@a)B&ED4v>_71|7fz`4iItY~B;l z0lG5A6qE=Ram-R8GM*Hf8~i|*xSOs$u>hYd4%b-7mg!H3k=R^izL9mU98I5Mxk0w5 zf}@14PI9}$;-rxaCVWw9HZpi@3%+-3*4h?zKg1fxo44+rg_UIvH@Oyq!$peyaQMz| zB*_^#TBwR2!X0<+2S-6G08?C7BS_pZA^`cEem{QoNBsj!Dq!0Fqc!~&yl=V&1rwOE z2gHb1eBeS3SB20S`1U2|CVgmYTkR46d7ehDv!#{hecIf?yZz(VtV7z|ou!Y8HJ@IZ z&$7brjYz@KXiR$N)_%VfJ@!EM@W10=Hi+=k90gu5#%P>BIe>@YKkL|7R+F3hlNZxIIQ@+!-yu5W+_vYpsZAD%{ z8YHG$z-+3wSV=qMr#lBnYxW@^g=V+&f2b=lW?36QV^^0uac8yfrl~ivnee}@?Yr%E zge19J6ypn#rwRhLSc_krpk0Yq$K##g5{$7a2yIdFr>@y(LoxNUYZivWJ89|6#ia|H z+P1}e>vcRiUc|J@JH=JdQmex{G(6{H&e@_Vj&`Y zDWX?AGgIR${OZoo3V)vAqrbH-zp57md9z%f&nl8_(KHP;j|7wjp=~5oVwY&uCAwA>f)wKgzWKd=Xh7zS%Dgip~Hl{guel6_x~&_S5i8(U%Mi5oPh30lS`+I=jR7m0C|u+P*-T zG{kJ&gs_XPh_+;L6g=aHB^1pq>s--p3ZSo?BAaGe$Y}6@0{_UOSspYPu4V5L?-2Ohc{bYsba+-n*Zp~Z;x2J$K8kYmN)Oq10(4QIiqN&$z__% zf2CPt0F9tFufAI%0lXa z*GCc>hZk1s69aWe;sAk&@dNAEZ|T|Ey=Qy>!0!G_cXeOVGtk$wtM}3^)qbn&4UrMA zA?7BEEt@1Ki0$f~AnjUUb?3Aw8bfgXtL=7ea_jhH20}!B^9RF^SpoDU zJ=t~6hD0^|Z$Pt3dMo;T6GMtQbbdz*7-j)XVsG)XK=*A)6S4$$3uY;<+@^7`%1@Ki zLsKy*Zwu1(x4NZM(IT3WayTW%sHsN2c{|~>PyPYnfa>`1T{UK-^M%MbX$3ib{sH?# zJVosuNB7(3Y?sxf3$6a6VmlV}Qg6t~FiwhF{0e*kmFiBiL}+=geYOwl3USys9Aer@ zXRR`hfP?_Gx(uh~?T}KE5QHh;z@>-mhSUeIV7GNN@E59|d%Y#6AS19#Yh?5`b*G2n ztkx37VL0Z04bAz`;7#6BQ_e-ra1Kg@MZN~?RAp~f`uh6ywj{bwhR}>OyR_83xU{dS zbsgv@tmn7a*1xypQ^$vb~=(aY~TkR%^y`Rsk2qe*h{+YkP0 z+Z2EQ$-Aeo_|+u&ouB;Ec~5^;lALtuzBlZCO_DryWlwGSo08;MYq_-l9XxOP(T1M) zCCNqU_{%?edy+hS^E3ba`*$VD3%~i24}TtQ=c->HzG3{nBsuN3KeG8t-$;@doPGZX z+rO72=ihq6_UB{GedF(+anlv$QgZFP@41bOo05Y!-O=)%^GnIh^S|`PA8joq$DaC( zSG;0xDQR2rgI~Y=no_dmx!?W$U%#=Gyz`@@%h$cDl$`%7zkT{k{)q4X?33^9`C=(K zul)xb?(+odspr}*z>-o z|2Qcrzx_+kcry{4FMsB}XFPmabJF#-Z8uH)Kh4P>-#4T_M2a9`F>0C({DfXp3h&?ntbd zH81%5QQBDPkYb5{I5TF&Z^{8^KIQGt ze#?#Pk_Z0f!ykG1ea}t);U9Kf__8aWmz?^dzaIVOvKJ&b-hTZbY;E0~+;;sxPFA0P zNwV&%E8lX#$6l0t;WhXDYRh$f$-Q@1{&DY(dy92qHsqd^NU2lBj z?$T`slAGWBz$3r$%+chI(?-i*`?q@1amVwox^~;ICb#_hit9GDyehfv?YF(^mQAlo zI<|h~heJ(oNp5TD`HrOTuP%P!KXkq?IeuB`efQsfd(!pyrH_2}Z|_PfPuq2D z%blM}x^7zehp*prUo!ET3vT`0yS|YeAGrO3tN-<(G+GjarE7*t|@iC^3FAn zy!gh_@xQvZ<;A6Um2P`@*;UV3_eZ6TYo`XTZ2MyA__;^Ed)2K!EN%Sh%x~>#U*1%m zu3o?D*Dh$P{^VP4`<*2a_TPVV#T)K@S<^jVd)D-S|NieZ-SYA;Pv7+R&o|w2FnP!J zhyJap@|9KZI`5axJ*o23U58KEv;U;yH-6?luljFqJ?ZP0zv^GF{;j_{Y2%q+-1p|E zLD*|wcF`?kmo?vW+cl@X zKK0|5Kl5)FZG6@EgCn~xT71vM(pPLf@{YwDAG*2k>G!s@-184Bf3NgEkG0%${yCp~ zb@_WO$6L0)>w(Wqv?lj`;D5dLHUHe2yubI#-}oOlo}3)t)W3Z7*{2+T_hl0g{_-bI zNgllKUmp3D$)_AY^G7?AnRD8Xf8pPTfBekvwk4zYc76AZKVFjj;_GjHQ{}f#P0D|A z#i^(K+S252UhQ~`@z4)`_pkr*smXm0HDCLZ zC8sA}f7{Wfrs~s@^2G<9_q9(xJ^AYM*K}XG^^D}(fBT`2eCaE{ko0^qY5AY8U6Fk3 z?yoBS1U;CP5+oyl;3&RinW|F-8TW`Jl zdGAQdi~jS|-?##f{k0FjeCy4(Cl9vW_>{l?_+81BcmKupU%3Us{`~8nd&~3gOFHk{ z`_PJaeIuE8;XS{w^s5j3H2n9$d(AR3X=p}b6fd}@Nc=Q$X43T9K`dS@X#_W!I`qEi zMc@sh%Y^q#Z9v>llM|z)J$uot-C~L&dQBbY4cRc}$PfL;5uga{L3)j4(k%|_>bnBc zOk3&3TRx0Kg1_V^k(9TL8f9PcND8MLEc(UXwAntUmo3Ex{le~&z+^@`yLN)uo-p$} zEZrJrn>L|zFf9?+GMG>zVz^dU&@}vlp5?bmTXq$20GQuNVsP7HEz^f&lbACiQr*PMk^-xbqN3NQNLi*wjq;Ac zz9SPex;U|Gn&XT`77Xvjxw8v<$RuJR_JZ2ASB&udE9QHtPvZ*e{+hXj{9CWt5S}2<5^};xHq&0?T{-o#0$EXiv;Xx zj4+WS7}pYXN4b{mhD)}=MyUDAm1=fO_a5eAw6*&x7hlY^bn)!&J-n}S&b=9Z4A|$Z zQal2U@9?EAFHwpDns)Ut?Vvav{VaeaEXcvK{ynE4^!oMqL%64Lq&|RtJ~cxVKHDcy z2Y8Vc&~FE-2IGck;1LbkZr@g^1V#}~HFi=w1#?aqyzWszApN3am5_SjI$(&-;S9lk zYDl%xk+F_tg+%aWCEyTnn7Q1ls~psj$F?7zR#=gKpS8VUEMto2rM1Tg-+7&#Ck!Ba z{6qn?_zQQmz&>Cu8MtfH^VW5x5v5vNhAKN>@XLd`jHJ4E?dr;Tt1IWPuB2(YFWX)T z72^udLMxpz+t&J_Jiz8Zq@C5Cv(=SOZOE(-&dcA;Uu3S@)KHpqLV7z!4m!6_fU;M< zDmmiJ&ntu1=+#891+m=)$@x^m*aTGoo=!%;FhPJMlj)i_01hqd$u7MD&c(~3`16+j~tVwZ|JfGgoVh$QdaMVCD{E`|V_MG2apsVgPqrES?>fUmJ@$2%dWpd}f z;>^Wupva?!bl~=yfnm#j;+DP~aXhYx0ZQ<~>l+s5o? zTuO95!+U$#;x7Cah5yQZ`3CFQk*{C(Y-SUb!9$`wuaA*VaLB7}^fyV8?4%I~h#^Bt z)hSt8ruewg-RQV!3StDhI^qjrn&vqIC6Zi$Ks=Qg0OaBg(JPL1@QHQ^PZs864ZVx; z`gokv1gdl?$i|c%oD(YkKsCvBDyIh4^#$=x!N!S@yCv`xa@*&5pD+j7)mS~P?xt*{ zHk_f8jdNg zWpbahi56qz#%`i>jvbsjB=1x|yAAc?YUXUYo?<7M#ZCIvghU>t2XEnb<6t<4zPYu6$t7?q;c1E?9e>yXceS9>2-S%3b|X4-^D6>+eOS zcuW$xTnU)fed{aXPS;O8o{x;I)}xIWC|`d(pKKYQCNLI0yy!yvFxh6;2Zc*y4}i{E z4P0hBdi3bgv`*at^%DChN3I*Oy~Qtou&}FyIwxnq=9+Ay*96j7!|j@DCMSl@eST@A z>4Ie4=0hV#hBwLmtv;-cf3Db=|JrzWtil*udir+tZ0_#w*|NSu^ohGr*)F3JBByF` zZe0)a5g1=yaSH~SSp)6XCUi((!)ELRKYSha-3}+cQen&1E!{8rq_!y@Nsfmah7Jk* z?CQ=G+3tRC^DF}oM`H()^}NpWE=adKSPc-V$!UlbwSKlRdg#H~IJ^Zz8v*({!%yf; zHauopf=xQX84H;W>4G>aK-3J6c=QF&g-CUeLr119<0D$z1q3y2Fv*>Z7TsC;3Be7; z$r^CUxkl6(Q=~I3Y|L6(59ipM*^=MfTfcm57)v+%wgonV%YV+*zJ}2?aXSk&rqvEd zA@@VAc4YCdRaiTankfj%T!ViYp}A9|x&Sb<$SezHT;7?{A52G$?$f@@JNw5kUt1Wc zci196cRvjR;W>w^2X|BRX&j9 z5Pl1)kCuROBlN@*Q(AQDg~`fYF3pAqOZh*SZ-`H)NvDNivZyD{7$MC9eO6T)gyAq5 zFUF`ap$-#o(>ob^jqeO{WN?bHh178!7@SPE=unu`?sh1$1ClD&X_|IAB`I`K7d?$`KLZag<*4($bvom1nMNOnQ7c{t?U zs&3It3~ZRSixF~1Y1P)Dm19Z{9vd*Ic(Hc2mEshmqK`xO4Cg)avxuByJ9rNDN_@{HwOO!U&kY1X3*r7niPSTE1ns zvTMxXSuo8pUZ{%Ss91gtRv6o6IPqb8_J%<@@uDnz{$a+SCxO6l*armO^w^+XO+vClyD^RWno~#7Gm>EvaY#Ry=RaXh zKBVG*d_Y1-B7@xiH%UJ8_U9$F&z))i>;H$Jc-XcLv_&3j1mqrT{F!U6jjD9!^Rli%X}sCZ&r{ z?MhbfVtM^C^2QD(rP0NuGg`@=NH)R%K$RFWNksfsn)9SpIYs<}n4!XE(W35Cdrtil zYkLC!wZd__u@2aHZH}KUbj}#?F@j(@9PGxYdYfELoK=-8a84=B$7nrX+N+VE-kS^3 zQ)31FfNuAuL@N}5ETX`MwAy-IxifWJ6}h!F1Yg^TGvWZAO~@D?sB_;0GA>-Ttc(~q z%{9|xBHE>|(fe&bcv5%#7SLwUp~Ks*Fk;>)vKO+y^%187CDzvvA4^G19uyhA2JyeKgoHNRD^IJmZMDm zmr!*r&Z2dv3g>hmLH#h!3lo-ILnSj835W>I)2u{P`B&7tAP}x3Qp`~#sS0l>m#unu z%HO*u3{Z*Qhw-uXGPZSlEH@58(H?inYMZxcN!mCl0uQgHHYevUNy@MHDOMGDQ(%uZ2U{O9eZa@)xh9^@q&PkfG-3%kJ)M9^(a1w{qvqaJqRE0{5)d+F2 zZFx?tO72(PT&&3v<>EVGgUw4SJ`37C9h!GFx4Gg7I{O}=$djGMR-U>(S$PF5Bx>5) zQvT284cXJ$FmbmdN|9SfPFPZU#p2Rg9Qx@~pO)@WpGtHkGui<+gd!jr7o-gklD=8K%a#q%DM7me5CiXZ2l!^C|2KV!8rJk0*+ zc*!*T0ZP#(rfb}VL>Ge58iIha2YqaUGT^{RcDh!KlnXlImhezkgZm9d?Z)xA5k?gS z=rQ4B;T&Z%B(~Git0`+}ZQcSyiwn&Ap_JeIg$JJ+QbbG z^Ld-i7xypDYe!Y~-C*&PbY)Pky#~~>s&AFAjLtzZYt?KFxDJ>Y=0?Mz8Ft3Xib!tv zcVsc$bn5Fg`TL6>S1hOndyHeTc1z~g^AtmPYD6b9j3WC~EmGvP>{j?gsES|eI-`TC zF_C4-XD&`Tl2rbhtTgpD{1%jH5s?KUWS7QoZjmoed_PdFSqKNFsds|NOf0+DOZ)bW z;TD^o;5M7-dbbNZQ2aWMVl1zUIF6cI7AhRB0UrUK!UzT=bep|{l0YvkC6t3$@fOql z5tA978$r0Dw!bbVxs<#?i2hW=E=LHChL_l)xe%0YqRgRnxgwy&we{k#Ljf4p5j~^v zY~&h%a9LcAxtI#o2RiV2Cxquz1Q-C`GkJu#6oI31`KOxVO$K;8eR;HG5HW8ntnAsf zJzdSA!gFbKHc!`!yKIm^hf!w=hJ#mSh~wv&><6BPvtnE^EV>b*e9es~WdlP5N-ciu zki_NWA4kH4+9Ib@^?q7<+o=~P8+Q6Fg0L>#>0K|)e$c=P(niIi90KfOj6UAiT<%82YB`*FFZA`Z z>#Imj^6v)1k*OLJv|6QM$rw$QliV7)J12E%e07ga$j<__`fM)z!e947q~a#vm=BN5 zG^m^FLf~aNSYE=1vNafsn<7WXHUs=rZK0u7+>#9?=yTGPK5SpcvDA7kN>D8$DEU#% zi%b@gXLi3*b-d&QRt&IqWtQVDD4c>2B^y<8>_*~evpR?1% z>=+l|dTP>|-_cUcVh>h?rBKB$HJz|d)`gmy1xcoP@v@t%Ic(K&*+WPz2*R_)a<+%6 zFWrH|q}{30fen5NEIcqfB|kyorcEtDQv?l|Gwpd@l!P-(D7-Hie3rx!PLhJ^X37@6@bXG?=op?* z)C`FHl|Tc+=JPAnd7vT-YK&%o^}6x`@S6-)T(qN+&-=R6S7(RD{j9_(O7+=ur>pz& z&5>fQ@Pi1V z`w1<+5xR-%xr0aDd^Ok23y&VLH1D+VlgLj20FHrj3$KZj`r~Vy_Fu^ zPjGM3KZN8=NSLHD^kkldU>$GYB^`;jv^LiE@$tjc6L$EKTjj4{sBlxMeus_dr@SOj zqv6L05>Yvp?2`I?()%^xKt$PZm-Cv-Oy{zW(=qd0Ao+5icGRar6(7uf|yI7N#a$5F^&w4Mu`3yYPHOr>-|iW@QyCNkWf$lh$kvpO=0 zcnhM!udw~};^rm=j+Llkle?q{r#*r#B(e&0pz#SsJMG-dqzhxEr4KDGUEDhRcGa=* zi6iyq8_a5$rB|>=ZnS7)wwVY)Y`eAjlun||{h%&NIc+WEs@K*~w;9`&fG8M zMpjLZDsDVajtu#KtPW!Eh&eTP;1HMpHTZ$Orq+0e$fD{TF6=fL5z0qJnLLVL!n8`G z9lQ>Qh%FFdV0AX-n9_hGkR@uzEJz?um7gq!)#(o-5xYKU?oeh>I`N;%akiFhWH@?o zrlKAjDmAZL3A4wHcng}80YL()+<|N9k&BN>`a<}6KpAw}PoTTm9;1|uj42Pt{uzus_TVo%uUz-x<->pgo#QzYk zWPA~!{X4;J3tVb=g$$Te^uTv|Vszv&=ZiX@TTq^$Ye>kJz@1)%Pj2R7o z&lpc;G(4Hn;Ot9sSX$=Pp!Eyo0RD^_4fiiD^|U^j(cqF1g~@V!mDcoRMuT|%lNk*J zdw#ZzhHstvf@Gr$sMwO`+FEJOllIl_TQM!CnCBH+mFKcD`c{H^5EGuT^A(ElK!3a| zLGqcFGBnvJl&+c7w!A$muv~_7yG#}{F&pALl3h2OZW+A}ao+GrK5x3RcesDtGI1@3 z_j{*efy9WK&7)~7ydqfY=(Ro;8jdT?xg8lNnQtj*ulkWL(1j)y_2CVSyvt2Dx=fUr^?Qn$A&>iUx}x=MWXg zGS{NL&w6~7=#6q$9h|118&eS@faMVoQY;n?ln}jKP11Bt2h0Phtxb#0IOVcdQx{Gs zlDq4x;EkIdx;Q!Me~9JeDzt%d#~40dW^B0c)OgRcmQ! zbb1C`$9(EGgq%aH#~vtG(Nc$5GRY5Ae<`m{2_xR?DrlVek5K#x2XiA48BG|4GpK;> zZN>vV2ziFog^3z=5WWDSVp9C3)DMcVE8#RNaAsZ~QZ|vN$pvdM-JpgyT0sEPy^`3O z@@E7+d)6Xk2Lbq_x5GU$;ZTskW_A%(tJ-IPSB3@q$XbidaCzS}VFnHhOiSNdT-wvR zV)^zyQj*K%lcWM$<=wOF2p$qPH9f*bSLZFw?w=!QJ?FYilgTujFPBioJtZAZqaGmf{eG%Lkyxi->qy zyGKhWa`Trw@{p2XKh-IPGA{vR;`p)=^H++ak_LX|_PFRPLKJ532q5ok^7*H`~w$#m0~!$1FBM#QH9nm50Xhm~rAUqipB;Ap6=>@9^nQsZ7kA zJ4l~_v7fQGWNFdT?qu~={76JgMJ%P_ALa5kG8gfJbClceF|HU{_}SJzDll-%5Ivjo zsRKs@RRiGw!doXsYHzX%Z!2Yf0<$FdTNVOCh<3(_xkXyoq#x9u4sx)uz}s@mSv7$| zSF`{OwGfgA@(^VnA8Pi^x5S9dk^=+z&ARZR=&CM!6+SU{glFkAv@VT#0ULrB0o&O? zdqQ5K?LCu&cwwyVSzoBrjRRF)TPV1}4`E&m>w#vKHWtUXR+EH?lt{pW&2EQl1YeJ} zHi$Mq8EHrqp(dq2fd%8iPx#OZyii@oUSHS-D0Lq2IC+ZdZNhh8u??N65Y}TWLZV52 z6%PDS#T=sB_3LBR@ILyV+MWZCu5Th^!xo5l1K}I`yje1V{~@yCMG9^_HHn##!LfH2 z69nSj<(b#(*M}jhOyo(6BlW(R3;`wXt%|N$N$GowOCzn#g(kDJ>L8Q_5hCRGA*6HbW_r~Ly@0@H7B};zuG!C;h){DGHIyN{m@J2PvwnFj&wC0QCB*` zX+AJAiFZk^RQ$A4l@4WkTJ^yy2#Z2b+QV8}am|^7G&D~T@D94l0du62Zc3(?s(!7U zA7TsH$mC0DAk(?-EIkYELcNLL2nSlz2qx33K$lNjdYE#V)^deuCqnm1+LtX4o}gm# zy53iV5opF+k+_cx=4#^Cw^ThXx)JH*&$vsBBabp+`yy(u9aEP- zXs|er`=oK%`U&tq<8d&faHI}x=LbVngs@f|Pvp(Obm!PY&OR{`*Q-ge+<;K*Ov5uI+tIrWK=U+l6Lzyox9=ANtc}GmN63E=z`%+!Q-60Njf;zWV^38?$M}lpEk1ou=TAkIn zYrfV}>CTey)0yFiQ4NkIgm05|#mDF6&o>sI_a7ZUCatt=pOk*QxHL_CVoS23|5%?A z#!B%Y&8zKi%TYHAxzuta$hpHH(}oryc#2wXC~bUsE~*l2-a#QEH*CLVkBmN?cUtIy$5U#(F;{+qLw_aU&y6< zf2IG@ODo$i-FZo6XZMbt-IXhPw{Nd(>Z$ba>QRY(rF(a!uY1q#o-Ju4eud!*|U3=V-29-ixs;xHszw2jp_>*2dgv88rnoDB^cd4_&wNr z4GEh|lUpm5-LCTn-X{~f@EwejtS(t&3DQPj`FK3fqRqzX{4MwgpBwWGB_Iue)s78W zw^-9C?9il9D|98M`xJ~4wP4>yV!JO-n(8E;G}}$3ze{%<3sGN8x=>l7t&W|}h8mM| zlNdnv#PNd?T4NU73yc?`W0LIJ5i+PHf(v&K2Qwv5Q_dFM0VNSQxiSl|l@_&>u5Vqw z&NeN-&*GlbuuIP>Sqlg}RT2-O&$Tac);7Vb;})5Q5w(7Mh|f-wXVfk z(`}BQnkDRZk1A*2;ghy-{3?I`;=6w1i?KAWZBc`s-~^EMf-tJ^J9iCMiL=5oMB_5C zkY$0g)e_0m=5f)43;-4U!W9Uu;x2RTu|WJf>LPR=sllC>7^K?+`sadQ9$ND&pFF%M z*aW%`xgWFyxqM>a+Xe~#p2r2hz5aL?(7B6JsKI(|i%KGwl$Mv0`$2tg&{E~0K_jGn znpe!^C9y>w5>6#04ql2{WDJpb$0r#xk{Xukn3Y%OdxR=5R2v|*K)_I8ZR7yuf%4pF zV|PS}Vy@%3%O=gL=rJ!`_(Jc~=){!60t>JzBVPhqn1LZ*t8`xi+D7$p04LW6;g1H2 zI3qvlgpA1o@Fj}Et%%el0t$ybsS|^E;^2*sYnOcZxw{m=fY6HcwlX8Q(gjPmCM(Sx zm7fz|@~d0hX+@8Ds=rn9G>?DrP0B6KvfE7UB7H!WAo2zIr&K?xM}8RL!E3iYJ=(MU zZ}Z2IGuW*#LxHn*)+rILai5 zeqR!aTG}ra)&wUI)X4Gq@I;7lno- z=$cwXq?Jo@ajtXBoib|mDz?F4Rwx5Fq?OYnsZzCP1JUrUrlpfxN^fgz?Q~SLkFE(O z_zrJ1gpX=#VTVB(6cSX_>FQp@aV_(6#4xppYF)c0@9sfv8vBV_Vqw&Z% z)_~-GQa>EtE{xC1%8HBKsg$ycJrCDZ>oH?S4uWD?R)0BoWEU~IqvWrN!CbX;ACt7b zlvtW7>23Up_#*i9H;wkqdbN>gu3P3wKA0e>BIcfhY`O%>hGNC!K8ZGnn`bH*R$aR)3AuC-|P|SQEwYeQsR{biKWcWNwG=$dliCGxKIYCT{X_y9a*D7 z)-t8)YvVK*x)&=t0&x^xmRJ(W+ejF#PJTKqwm6N=wcK%<-f@=IRK8|u1rcxm$!yA} z$i9QNDa-_aYzoKVTK)5}rrDTH<08(lFrU#nC?d5IItNogL3=7qC=?jqN$@KtE>rlnwZ1w6SqixV=5e%0pe8zP#c9h)Gk;Y0Q?ryKa#s=g_ zOmgT+;jnxH3&Z&I;Vzdrtmj%62Q)8p&2kCY6!A)Y#?uUDOTA1d;I@3J%75oqIK~0$ z$tTCX`EGHQr8O<3ceJ)w+~|!VTDy&^nf9xh*zm6%+X7V_)hhbnGqMO`uk7J;L$-5$ zp}#{Dqy3> zs!;gy_&i^R%w*fY)O5|leuvvE2dV$CVt%(KVSA7cprYQ7iVCEm$uAT4J4U_vje}{v z7}&MjE}TsGrl}MVM1RoEH{%%^nd&2ehJB;Fg;`cX+r7rlyyK3-TV}o+;n|lmmr?ty z0-U@MA0|zXS9W>~hFJ+ddh+_jpk1g8;Zl=-)6(9gvmZ%W?>T1O%1aG@wJx_4T1xIL zRg5!e5Bt0^XwY5ZH3U@B6~3<~UxFhvJP|XJs8H8K5sb4Y|BB&CuUq=UqYTevZJ*rZb`5KtItD@3q15nd!Vn3UyBYjLa8p|)CikJ{u(c9(b zTfF$r(mohNJ4#e|tSAX)f-?TIb=8h3q$Tx(6JgQ)8l28|L4K@-GgT;~?x88JP%m z86GHY>IUqI1s2FstwZ*@yam`M*g)oc#UJl05{*ET*?VzAgQwB-9B9@oDSR>Br`dT&u&)1NC^b*XG7P+Bv*)2Q(VZx8Q2{!)BS0WRN%^+0g(GpdnEY5X?fw0>UwO zY)*(l>QSH+C)^HXX>p|LDyteX)>}^xF;hscP`b)Ili~YroQ%3pN-ru4%{FJW#tHlK zrS)-I8rFqs-#8U^0IJ+VGlg|&n8rDd*rJ@YjnV9uxnG>B4J}S&K9)(`vq|X~I!vmQ zTp^s%5c0E&>Sm#IwS18hZYJz|N_ctUsQcwP^f{~hI--lb@dpCQau>^&z?IKRy^sXJ z%_uIcZ~X*yRrp7|>mfT>6>C~Vn?b}sA6RmlS`*&9UEwslW zXD&X}Qc16IOR0!X=Ul}Vgp=-_7QzYUsI_p^TG4NU9#Wu{>;o0?12xMR2lLi|C_*7I z!=ftj-3(#KQgOn;Z$~y|$q!MCX7nMoz&&b#*bF;CcqK1NpfFv*0%xk13jb~{{9AU> zM_WHZWWIU3XS#Bhvaiz8XiMpKLYmvTfZ_0nl0xMU?;D&6KHbmr+m2+5Q*uy&cI+Rm zm*zfdUcO_-Bdks3PNsW^Aeu5#*gj=+Ske#VF1msK>3#v7!|~;MTw@20}0c_)+7-7Tg2NL+ry(o59`@LJT*QuyBuTsF!nV&=`rX4b!W-J4}j z(Yg!y;_a2)VsL{948z~$JCpMqcbM0>>OtC}A>?-m?YrKlfxdp?10k0WjMM8VRL^Gv zexl_a8qwV&=BUNO9VY==2}l4kn1LvpGKvfY`uI`Zs1RM!8+u1ar~r?-DzH!B*fvvl{5~Yy2+y7fpAMDk=vkrGBNY=rzk(Biy||dDGBBjW0Qm6 z=pg#LH!W5OUoi-BAf1v$@|K;GSSxE~+%fmj)If;C+mRX;ve^T*YM6Kv znC+syh5QDI(g6L0ilL_H0?zBv=XCGHEO@3Zw=NIe@om;=hkzX(Ewy9@3wAMyEKH;J zqGPd(!)-ZrJu?1eoh>eZS!qm{xo%)KA=+QKB^z6y@U>+B5hZe{mzwaWO%F;x)BC_h zDVHYTr=OR?uo4&{3lPGYlulJZoVj8qro?_QAuO6b!%Nr~*1(U+E-H}-cyJbY^4j1R z<8ZnbUzkhdPphq0mJm@8iX2J&`V?PNU!fzen2kp{MAQIXjkxMBC?X461_J_|vFC(sUKUF2??q@3e% zS^BP+k|AZ`$^V|jz|SoPR-Wl>Kgxzk%6>dKKd4ZsD7j9fgD2$#{dw?+5`@V^#l?e9 zXa%>|?IafE=>5S7bH| zi=3+ zCQut@K!h%xIY@$&+7aS+`h;3kltANCIdcgwQ5k|ADIL+clS5)U#Y*EJ+Zam0s!zA9 zJN{T?(?-%tv>TYu#|lmZ2}uVlbSabuGdrUmU0CK+zQOF8Elx|z5oKDHsgsrJrtOz* ze$l|T?%mr4Heb4DXMa__Mv2V0Iv_2-l$>5B*78HsCnDY!-Z_*DeQo;;$_`jqArx`> z4!Ph_{-YJR6bT|oA8;-T=nhvIg1*owo3wY?iPT#tuuz*ERXaNCms{r_q zgMLCLtH@hTH>W4^%~1X4$)$4gp8J=zq51c-o7hBpD$_hj`v@bJ*f_mfoi*k8rR1u* z{o<;(%+p{trzp%JoQn18#)PyP>7lC?edjhfvlgYE@{L&-UQ!s6X&UT^7>;?CGEHQ3 za7<)+SbK|Xzci+_S3E%)M5$g}uG6niu^T_uCxS9MndE-uQYx;L-81XWPXFHW6eikNSj^ zI@aWQiR_aRv4jIof8ME1q4UOyY91Ra*F}@w(OU*5kr*%pV;Zhqi<(AwgHxZ`LdRgW zV2ZdgpBU!Up*h^eiQ}aM0dvKmU8a-VQ`s_JIp-Wyy>rfK1V9Eln>sulHpEUM2qULyya0#wQP+%PYIj<+0vd z6%K0emNc>B##;G*gz?5G3`Q5vW3G5Jf`^YTOlme~9NN!0xKJ*^YBg*(^;eXM4W$4! z-d8O3I$*(PKjoE1I zl@h|W4f;g7zCB4xXO{bt4VSY62WEByH@fy@&3MaY$wql0bREDj9&7a}EzNmS?g;Nt zZY;-4au!m6v@m%903iQS#KO$DE2`lk{v3>coSD5c@wERAH`~h<9anI=WRBvNj)!~L z?hKSk?u1eucJRh0p?Vfpg>j5=6HYMf8JWYueTWdN=>Uk}qasWo!DhupGc*P6Y=uCt z$Kfy7kA>96`ClD!7lQIDdH;jH+@1();rl0KMYMMdWXIgIz+Cf<5pz}h#WD>7+O}Jd zSTfb}+5PJ$G;>n=J8r9JOduFOQlC1^Z3MkzGM%Nd=ppCVS<*0i*$yesK653EmH zFE#vCUTr1&Dtr(rwl+1LampH@^lJRfa_wq(C9S}3^$KO7{3X;kmDlRMkA?R{N-$o# zNH{x59=`HZV8f)OwJGJNK4l|ZAhIXY-4DD&ik-~%X-bl5Wd=e~nW5g*d4s2EsCWZv zRnW^S4}<`Hv(mdWC|lLEcbJdO6XNE3J%67PWWJ9*2z`XS)E!}9*G}20$eZtoEhzGq zj?}vEmYV7&KfWxc?xlEHTP5KU$-v^)f-6mKfnFNBOK?ua#C@s2XHgN{ zSwsiPO%Au=S`+G=y6}I`VXLIZD^J!A>7*2=h!|duCsfQC1ziK>kHn_UqsZ5~mn}wi z3_1f1(l!2}E#jr%stBq_TDrKrJ6UIRSKm5Wt6fLZWaFQ$EBrZK7me!Pdot8?y46koI8P#60JH* z*^pwx_YEoT2p-~P5ksbmy1zY6N*@+t8QtZ65lVm{Hv1J1yld zd)9v}Jo#QrxznCpLJAh0n;&jj=Wozrk#rT(DSq6tt|N{uPGfWEBB~v1;`PM$(bj^ z33pis9X|}=hse^%r%`rZx-O(>515#5UT*(0SiZ4&n47WeRtqCl$FTjFZp6%0w{fiE z@KrmZ2at7p(`Z?DpY~?ILlE|jOFV6_59IF~*@iAZ`Ypf|UBH|Y)wQL{57eQs3^uO1 zbI75>5vNWk2>Q~7AXt1s=9|ey)wP?1rffT4vP~`k!)bC&x%ssXn2Ns$RopHS5Vbu% z9vGY&2*_-X=q^u}(He^Aj&FOyr>{DEWh$75IRiSX;TI*bN{bCwV0-&w7(l4X@peeo z;XIwTYFk3hUUeL&i;$^149o_P2W$ghr`w#_xY_FC#ip~#V#}NXlO;`UjZ0j3G!)-^ z*fKGB7(`5M0UjBom1;J2j>&2o?+C5#2pfYYq#d4AEX=r&Q;ND+g+_dln`c|J%lGPX zYW%i_-lNU^k-$~?HxTWGR)v8kXSk|%ro4P)jAr^>*O!}Ln$bKRK2<0fU-!4uW)Kjl zue-0;jp;00(eOdNbCVpao2Iz~v^H7ZAeK2ZAh!(u=#io3mDxXQM=ITVp>Wi) z-_wM+M5HXRiF760E2huBs<~@O?W)6|l>d+Xm8%)tXG2Ja*k_&-x7~mCg9+0{Nlm+= zZ_H10a(ff~!MAeIP4CIMvU7m#BV#f&#-{QW)ti~ZAHKOfQdTn{F+p)hg^0#dV>b+mIS<57>aCGgmG$wP%kM2W@1bf|FFCo0qhxQJ zHjeXxmcA!EbMrNU{}i`$4s~L`shN~B+i+;^saB7yJzr+(K>b-uUDL<<_ZVwQ`5;$AElY>poOod8l%^mMENS^@Z=O4~?Bj zP7kh6Cy8sZsxmdL@V4tdpq{*II>}uQ1$Yx#b41SKh-wWfx=P=X^ zIC5a|qG4Xw=L?Py9v(c1@vDHZXHZG;<*q`T$w8>*i?5fgDGREnvG*Cgu4^-Ez*ziFBn!(QnB;lI12a$cb(~Ajdiak(h9h#->N(ezj4tP zFTDvBP1V8pgz6*eeq({vw3#&vjn(<-p-6CIe3lGN<4loK2*ft*c!+avi4G=OS~6M4At1!9KQdyr`9oxl2P;(AukSU zwHUZQ5g}>EB^<5ci9u#9Zzm^4{~jnLI8ycAZtO~OCTDe*?CRdRrLQ~7+l<97-cQ3g z7z7fiT!ub;N`6umz)wtJ

)V8ulO1oAC(5i%~ryZ1ZK5tF6R_$C(1@VoZ45DgIc? zD==p+pW)<^XsK+nEbpRfpwZ;mlHL-MO$D^8@UgiND~+Z|p!_bC@Ft=k%2fX$8{=xN@7V`M;SJCg(Uo`9*k|@3^N1YIiVl^oDj3p0E(npO(g!<(X;<^#nmGS+G z190Ts2~@>hVj^)M179Ed5~_~fMOIJkYJw|%(w}15ou&=L$FyNAA?S@cL~kH@@Ce46 zqu-#SCzUyk7={vy!Qr7nm@1eMwFHNr&CD(a*$@;h@)tr`y;HI5VADH7ia=CmxHOQm zF**sUXFJMA5nHUrF)rF>1{LVT@*G$};72)VaG^tzX)l?aVhHsikoVaPXooI<2IQB@ z*#$|f^NexUoC(MQ&F-fYkA`=6AKCXK!=0UxW~CNhRr*|cH5iCW3?vnHp3QIEcHuo= zN;Zgq;qfD3iA+MbL)}$ml@CCSW5~smFpu*WNx;AG)?uyWm4qxm=5(Xf$qmB}$M@Mr zh|b&z=HGK{<{${rk@^z+-dXXyzXF%Go15H4M!k4Qi6pzw^~j+(E1n{eb)CaCXXRpO z`Sm)+{qxJ#iewOopq?_y&P)4y)_dD2G?D3pa;()V(x>Iw5}vERAxJ!N!H|<_Zv}b% zh_x!qovx_22gf`*2?p~|bXufCV4VVi68*F#hLAvB9y7^Vt3U~wN#KAueeJSZ>)qvI z8_^3J=9J~7Ndc=cU%z6*f@9G)mR7dfIyNVQ2odvda!%NO(}=nM(+~u= znkCq{)`(N>Y9>ePSgd=Hj${fDr#Z+mKj6+Z#%c$-&lm`qbdQ@sD>qsOv^8osY zyUv1_F7mzDenM?m;vjH64tCT6Ld`EOP+cu7%#bljT9%85p>cFbvKxZp55&U|jO;Bd zvp6!7Zku((Aj(k3hTyM85?di;a~u7ix$+Z@BO09A=jhcAZ<(CYb8q_0GGRUXyF29L z!n-)Qej?xr=@!2MV_<4L-W}MwLaH;ASZ?><+S|!9FV1PqgTiA@S`24{->Sdu*E>gF zqlQYigts(_zm(6h5^t^y|KU2*JhIR<{*`vIn!P{IMB5DVh&XffH|MLdI!L)`Ty>3@ z^LT*xV*}8Aj=_P((c1lK(q8^-1FVleSlA6KbHcaO_%e$sY*_5jRP8yYQYHL=gGWMO zn>O31@xf{1g4<5%3Y`M#Q>Se8=2)Ydi$~W6vPAP75tYgVIqZeBLVfPm3R`IuP(^^q zO_vQ~InH+e1;!x`45ui|u&la^eNBF6&l(LxKR&6X)h*-pSUUzBEwof|L-6xUynZfteI2A%bZx681lks4y!B;pl!^ zJIy7HFL?t@R5870Tb{LkMMwlVZU2S#xchtlJ$B#IIen`gTK3T)jVC6X-z*-3F~%u^ z!tL+pK_A;kP(;a4*vEhv6z#{qclkG~Zk@efMSvY`4nrEbj|EyHXO1GER@gNV>A@JO z)3HN@GHEF7l(I!Zd5)p3vo37-= zVbW?CfhYxfO%U)5ozB)HW=&X;GdNpc-~quo)G(}jJ!p0;8b;5u=oXvbXkcl^WW}bz z{WTEVz78tMW8KN;^I(o~tA<}~piSMIdeZGtA;twUbVxXxoJ#I)vW^Y8_^uz3k2*rIEv7(&0V{|ASJz(Q80IfDNY%M&3MX>FYN=F`g zA3TDQK0I?Z>Y~Y?n89~8efi(V3`QGoMBJ0MFy4j7V+*q> z3tPgBk=awhsB}|U3h1NR!g37$ds@Q}6^vmg%f?e{X9 z#+m9huVMVNyCOf-G}{&VcTc(^jnO{oiY&Tqq|C?_NuHKmU5#Edcc{BJ!+f@;iw|Ng-1HQ+@It~;wu#Fi{)FoD^T;Vk|D8KMCC@*rz?n*xqf<@S+E-FlFkmfz*0lDAG_crt z)t^6nQir8H49LmYb$^+%hdz&OqSk3(55Q->VD>m7kPVEQpD5buB9j{{ySdwFZ*@rK z?fUh7jG!A#_76^?f$|5rdaK3Ci7%-Zdqo8M1OP6}{r{7)#rnI-H2IzCDlKc9Ak`=v z7QmFYmxFbyfmPi*A6Nx&_Epo>o+ysGJX|YB=xoZag)q1}W+{%;N3U;QvaIdF${x!$ z4?vKVuS2Zdn|v;9w6gpiagJrKRHj4s!U!yYCOqO`MP0R;jn);RGC66(&);?WvgLPG zNF7jeT#PyRix#ga=ya~4I#yn5;34&AiYad~ZM!*tj4SFJ+NcfV1XFSNj?3%G7! zQOo;c+`~c*7V#J)ViA&2a>5bCYYL8T%}2)3q>j_%J5j6P6GbY^KM%YmEEGKJB$90jbQ<&Dm{aW5!(cyeY9p4fb2EVdr1Bhr5J zy!c-sF;6G3BP0-E2e!6N<7h3n;jS#7xh&b@zi^=z$IdFSiZ7hCEZOcacpzCm8(wX0 z_dh$@cYwZ>lU98NWNtO<_F!zYy=QOL)WSq9Aj^~Bk{G+Z}qEi{W7T4P`q^C)nb z2`{3P~h(Vm6Ot>N^8l@8op7@!6(IY0xHg;{dBkut6zTDVQf z;!RgIV4}Eu!-u2h-x(7N%<>~cu9~(Bg(8_MfldG*!nKwEjG%+%nww@IA>5wa7EyC6htbnKaX3gy4lN!;MaNs7S+OoK004ef~1e8 z{bA=xTAZynRj;rW^p9_?QRNzflFAV@d7p*}7T_$8Yl7{@l@^*HS+VoLloXWq<(8b$ z+7a(79q0B9UDi{6DA|}l^AwKe;#&_TD=8&1H)E}>_=A6LqHa|SgV6J4e3WF|@NVwl zdX$g6|6=~p+zFPH;tYKSFtb@278Ku1Dw}Gx1JcV^tfQgzftdm28;}Q{ETN_-o-reT z*YrcVD^U%C1)F+$wqB*v8zOsRe7dWkHhgYyJFUx{WeVUX7c9ew@N?VXOp=H~{rB;* zPZY=eSYyVGS0W8uOB{9V;NwiWdEKJfcCMw|^qfG-4U(EWM5#2kc^lG1iupH>%+0@P z{E*P6&Jbtx$pjp9OSZSgpMYFxfS-&|{w9(3tcEhJ-jB>4I6Q`R z((uC)(tTS|X6L5+X6bF!Iis0liEPu{3>(B#Z27sCE=7_k$t(-ZXddUep@5*h6sKSyAlq zK*+BRBbpCzAzW21wkGf$W2>sG*(CgS#fxpV1S}tz)DVHkHLly+uE)PfRu`Pd&lVHha{)ZJwXxQx>#QHTlJX zpWjWCS4znp9p0BU#Xk=~1m0}k{B$U2Z^oHRQ(RJ7Xker4f2d?XccUArRQ>B}Y#yai zq}1v80emqwRQ9VJR9+1cC~fa{Uh9)Jx9`g07APNMip;xuy{#;Ctea;`R^Sa;a8H~F za!f9;EssPmWpP)sTM$DHAKRe3@lb*kUEyoA&btCB@VSAn9Q#uzM8^&{8gctFFa z#Y$F9%GsCb#O*Y$3ADkn$gql~#PJajpaugI=SY8c~=M;&7}3|);~$6MFMb=exq zD*_zT%PJd4c*iKj>6!KO9?ZZLAqs4ZyhiYJhdKceO3e$MxC@36Tn4~H#*KvkI=MrJ#x{z3OCjm?ngGInsattAxKtXGqfH9{(HGm+jUrb;d`_f}0R25Fse zv;<${g2+$Tgn_gu%V=OQZ_qdz3g;<;r#a12Q=B`@RYJ_9h46T&HS7DA?0#&Lu z#L2ZDodC!ofMNofG6hM5!WoT~5ry@IUuhM;+mGvuXnEAypQ#^lZFoBB&E-1D;;UM^ zR-m3{8isTVQ^DfgdexcI_=IE@bfpS0odZD{+~SOsqHg!|#6HL!IAZc_rsB6jQt1Uf zgrX6I{HB`*L&Rf)PKT9QARu)o^ldh#AmyBg78LTYctLEXIz4ruOO1Y2x|=5VHiTf1 zkwYL^l^nyB#*3#XaGv7p6Da9+nr1wg-u|V?F%mh6-4iU08?&`=ZM1Q!%N@2#(<*3;UCZgL1eUwav z_O=@`?rUv;&<6btw#c)Jg&3;>;BZjaO>cv+i&p2C)dSeqVkI+N$UQQo^crnw1V>aF zd9DYoViAky{-<4{B0Tk>QA68mE6;ZYq`CZ(`uJGaP0KoJrHZ{!sqXT!rtsBf%RP+^ zzAG=>eW?}i>^Fwv1Sjnw+@mnr2qj#4DFPQF^b89N zm1lIguv(xYg6#GDipc8^?|ZGkG)xYoB`HRSH9WaCIXOPLu0fn7u(UojNN@l@5(%T% z&oiz0w1QG;w_+`{;t~2R!gRCDXd@avYrVg_T}MipZ@ zmMDtRd$HRao22!LYNpn(qYHqL~9ps0p1BQ1TKjX?8xr1M8LpDVA`w157$^GmIcUlBq85HWQX)+ zl4d-g-NTn7*F~We5DljZ`+{<1oJl~E;O-GJk5<!|T5Sni=?F`LiyOzRoYv*a_YvJSNqa%7*V?PHd{Ot)=I#IS| zKq^2LxtFD8xY}E76aeej=d6GhN?s)_-$bbd|8PRhhS#QMd?{oq#ofzhHRe{ z8@JU_fW1sAsN7xI=+;)Ix!oN!pKe*z+}x-wWOJC$DU-8B4~&1CZgA&OmYA4)x}|w4 zBLJbw9X9HR?DrqX;u!KO{f4klwD8T^oNDxu`q5>HlYzE<_Uc~UyrFio{ zAoLrprIQfOiT#u=x8%=cp4Y_VoqA>Fy`zGZEP@-)`5{Q4G|l~T&*O|c~PZ-5gv zP#mwiub2t$h&!TCcdJ z;t8JeD#N{H43Hp>Om$%(dnD?SI>X8i<-;`TmXLRemZ?+?9;DbdqiTL+PeFHwoOPRH+Wv_D>%ayBVr&QWv95Gdt~)LvIgYja*WP zZeZ$ITkK0$nK~vHc?&7zdc2M zzAf1dZ4@W&H1Y`zzLFm=rHr?q)dWo-j-BVnMe~yG>zrx<5tS$#D2*COb4N%|R|l0( zv~UC7CAgjRzI2UjeB2DNqS){Vp~kfKk>RU@Hb-@?JmvL)0F}n`yC));rcO%}H_B&{ z@Fk_=;al}mGJ8NgsczK@1udmZMa5dTd4aG%1ZbXDAE)sOWofi)r0R14muz|F4KSa0 Ny8KL2|Blm={|!POdttiAip62LIMONe2hhRg*53;(jOpV z1m=K>q6S-hdd5!>QCJBQfoa{5k+7h0j;yjHv*HdrW)>U}*_9pG5kKSJs;-2DIDI<( z>b<)6zWeUG|3v;Xdt;vv<57dkh-#rH=CV+;4=i=fN9gw(Stzq-b?Ms0MeYa0C_Z_wpYa~DL%N(~b!gv-T=@wPI>t#}=3KqMQ( zr^Ixb67#~4(mG zD<0y*r?NUAAw0)E8*U3fYcGTm;g9V;Fo$PkZ-B(`d)c*cdw9ge+VJnPE#dsn&EX4M zl5V0~!rc=WK~h+lloPISr@>|p%;cyTU+!Bg;&F~6>ElQV|4fv8$PXTnmcd66ys7U1 zKH;ZkK`DF|F;~IgO-Y|1`A^BG8u`LP@)^zw$sf772Qj|jo*pR^z6h6Et$bgPl$3v- z#DmrA^LrHcc@XOfO!Bp=ekJJgdHYu~Jc`$;1bzN?9fF+KXeIFxZ%HL^k=MK>rQp!= zmNeFK5ejQtHPn)ORoANKAZqVLJ~l(jfUl!CJ#R^tvEM*_o$9Y}1zMG$qq*Fz1Og?Y zdnP0BHv@d}5eKDv;2N(uC{2TJ`KE)CJt`UtKYCD#>woS$D9wf+c+Meddhrhf!U8~P z;Sb(5{!kMT{Gv2s!AxTDNnrY&B;cb-B#EFad}Pld=^240L8Q(NPYW~|_|>$SqEV?J zF4WW|6K`$xDGQ>HgrouQIw}>( znHoQ-K(Sb^)vG^JYmC{c27oh*gt&C|m_1h5R z>!`P1KKzbkp>JoPuz?}PzKwS8~e z0nib?YgZ=Sq)XkxciCc=&@HHqUzo;*{}LE2Yy}p6dFojH{0EYaJ^?(@5mQFDqe!f* zT;pmki%H{;SlL9n1Nd#pY&36AW-0V};5?cANgH*H7mabJ0rdMZY&P8uJpMBn7Y@!f z)4jki*;yJKio|8Je;0UyC1zfv_%3!%QrWfoX4QuG6m&Uk9@T@MTMJ-;kVkjUHeZu1 zhyW|yzLmDMF1OpZQnk4i|0>mw>x%ceW%s+a;1(z@cKDoXaq+_X()#N1#+u5S+64`b zWexR}3-4bMsViXTg;{kKs>6lBqYhQx6+oSz>k9;kUHtTyip#A!Z9$*5^%~V5v?*R& z<>DIK%4m|Jy-{pl9ia8nO!uC_5lBB7foB;15g$4 zPcA6PD?*lBs}MEh$Lxt%Djm*%B9g-ZGga+z@N2Y~9yA*ceV{vpX{`46)??gfYeN=XiE< zN#~1Co6VAbc?B{m*9HA9Z@}e%tAIhq+N>&0)qe$Dbd~-@AWQ8B30%i$r)8!CNEo)S zX!MeJp9?B5jhV0-8tB#N7XLJx<>fVixg28!gdk(!+MpXO8VLpP9z;@zTwTWtK|FE; zm3$7XrauC|cMi+C52$F3W))f@^dkT>qx4XCnB4k27>s^IMEqi2L?{M$1izUEZo@P% zff{+>Htq1yJTL))5hsE2#u}E!znja(3yBmxVhyuo5t6dV+v4@D^`e`jP-RR8U5JL8 zNF#_V08P?~r1OX8v3WF^@;}UD88nshALcRpFNQ}XhLoU(upK4yVNdFVL{ z3|zI2&4ADNYjwa$@C#&E=8H$BIeSl$h3i0Qi5MC!K|jFn(`HY zma=IL<$qtw()m+MnTO8TC)IQj<<-krUiP9P)}a!DKI z$In6r4N<mblovUeO&gav*i;P| zUykK(I#|`+TZWvkUAx8pnx!50?Z3om(X!PbJJZRg(70T-unBZtpB(Rr4 zmbO^d9#jLkYI8IzE^njD*@J3qlmwc9@s+vB@ADj{P+}~XI-PzspdrPtQUb%_GjO#L zt1X8beaDYCvD@i8lz-NQX4Zr1(uCs0(YA`&?;ehC@oKJi_&N*v4pW{xfsI+-dy`4+ z0NSbaTw@p#d2xuA?HsPfJ5h$HjoLtWQ?lC-;OaYBN?sSF7>6a08^C%>S*13%sO?zn z50WU^tKoK2(yil;=0)S!*t(t}8@q;Y?22xDcnDnAFf-`V*+c2+_d2qfjoNU8LcVbq z{nuy4a!(n)PL2$r-aVWPWLrCa?+~~X!{JUu;Z9IXKL7nVmc)-Vv!uL}h<4L;pVD;m zG~((t{3*ofw};bF>{I=A=3+}zQ6y&Fgh6M%5K=UK3>9K{I&Hx1cd^MO$HBT#3wNtD zKFhsPG!7S1+`}$ce8id*xWwp=1wJv3&_}8o1czS{I z9xt1~r?s%L^b+MuTG(CmD&>#1u=MOpL*#d5xcsg}$zCyteBZ)mWM3VEbbUC|^(fMH z1L<)$TV}a|YxGA-@QdEu3<3c`XROSE;SN(2)F3T*i^L>AhV~R)Cd7srpO#``08SPl zzkg<6VK|P`;g5Nkc>`)^Zq)Mo9g%MBcxmyolmPk*&B#Lm)j6<&<~aarad}%qK~y)3 zuAtZ?^M!&#S1hXEj|N2t8W7P-MpMqm0+o;TGCAev-dY@Zq(H2|OTFm169nGqWur=l z89roaaC)mJNdTKJ2WQs&adULk8TsOrx8gH~nAo#_lF64K*FgWJ}VVEC7Mb!+r6ya`q3=q%^ zvj<#;26Kzcs1yeGI{1|~HagxsP~|3K&E;ol34>}`5AgT>Ed6E~y9xN0AvSJs1&fu~ zkqu1momwN8H?q+tI1mvZW-BPX9dSI$RsrneA8lpD@L_~K#vX(XAHfo9ZkZdKM$tZ5 z;ExyJSl3^gNDMLW{`BI=pNvnsax$4f%-fGYUB^c@ML(}W4EbpN%lrF*-a|3;!+reQ zEvNh8zC^eo#Bg3=FDM>K2$#39I&8@;-^ON3ni$1J{PZz~t+j1z4mRC>+QpLj_$OH9 zly7^f(R|Lq=5vnGeEyjwB%*(`F^hLT!L0lc{^b1a@d=M#m{Bt$jk~k2vm4ZoO_x3Fby@(tV=tRTtAW3< zmrW2C0c?!?VK2K1k`s3~U*o+CVn_4yZ?Mn7$=}<@PQ>6c5f!ZPwHL2+vogU0ly96I zTO8X4@F;;zdN19=zwc&t*updSvkbNsv@{W(LQ;%K6WDi>kQc< zbYX)aZl*j(YZxqIctlqk@R?Da=Z&n>G zSb!~6{l10R{#X4+pmV0ay0BGsELQzm7oZo+h5B0kI%DMom~-`&S*lkJxB@33KMGOf z^9L2TE7*Pt^0WG>JJd7KIZ2z%Hf-c9bpFG__#AZRM=fcA>ToMAPakw%fGl&l&#%U( zVDmv^iG0idd5JttxP)D|Z*5NPRgMyxb7-sVN&d9X~h5T zH0S5h$iDmJB+6$ga<*^*^aeWWXG@NJAh87{5LPi9sG&)@ zyXB=6$BVn=Ed0;N?XStRMs`J0W2>H)>nInWeMlZez{!=L4Bn_{vS$>$zlKi From 765ed31ed0b870c88db079b317bf4c2bc3995ecb Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Mon, 1 Sep 2025 17:35:20 +0200 Subject: [PATCH 15/53] revive/rpc: use static api to get ethereum block hash --- .../revive/rpc/src/client/storage_api.rs | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client/storage_api.rs b/substrate/frame/revive/rpc/src/client/storage_api.rs index 7504d19e4697e..20775f577c4f3 100644 --- a/substrate/frame/revive/rpc/src/client/storage_api.rs +++ b/substrate/frame/revive/rpc/src/client/storage_api.rs @@ -19,7 +19,7 @@ use crate::{ subxt_client::{self, runtime_types::pallet_revive::storage::ContractInfo, SrcChainConfig}, ClientError, H160, LOG_TARGET, }; -use sp_core::H256; +use sp_core::{H256, U256}; use subxt::{storage::Storage, OnlineClient}; use pallet_revive::evm::{block_hash::ReceiptGasInfo, Block}; @@ -37,17 +37,24 @@ impl StorageApi { /// Get the contract info for the given contract address. pub async fn get_contract_info( &self, - contract_address: &H160, + _contract_address: &H160, ) -> Result { + return Err(ClientError::ContractNotFound); + // TODO: for some reason `contract_info_of` is no longer available after regenerating + // metadata + // ``` + // subxt metadata --url ws://localhost:9944 --version 15 > substrate/frame/revive/rpc/revive_chain.metadata + // ``` + // TODO: remove once subxt is updated - let contract_address: subxt::utils::H160 = contract_address.0.into(); + // let contract_address: subxt::utils::H160 = contract_address.0.into(); - let query = subxt_client::storage().revive().contract_info_of(contract_address); - let Some(info) = self.0.fetch(&query).await? else { - return Err(ClientError::ContractNotFound); - }; + // let query = subxt_client::storage().revive().contract_info_of(contract_address); + // let Some(info) = self.0.fetch(&query).await? else { + // return Err(ClientError::ContractNotFound); + // }; - Ok(info) + // Ok(info) } /// Get the contract trie id for the given contract address. @@ -79,24 +86,15 @@ impl StorageApi { } pub async fn get_ethereum_block_hash(&self, number: u64) -> Result { - // TODO revert BlockHash key type to U256 - let key = number.into(); - let query = subxt::dynamic::storage("Revive", "BlockHash", vec![key]); - - let Some(info) = self.0.fetch(&query).await.inspect_err(|e| { - log::error!( - target: LOG_TARGET, - "get_ethereum_block_hash {number} error = {e:?}" - ) - })? - else { - log::error!( - target: LOG_TARGET, - "get_ethereum_block_hash {number} ERROR block not found" - ); + // Convert u64 to the wrapped U256 type that subxt expects + let number = subxt::utils::Static(U256::from(number)); + + let query = subxt_client::storage().revive().block_hash(number); + + let Some(hash) = self.0.fetch(&query).await? else { return Err(ClientError::EthereumBlockNotFound); }; - let bytes = info.into_encoded(); - codec::Decode::decode(&mut &bytes[..]).map_err(|err| err.into()) + + Ok(hash) } } From 3adba587d7d95dc20685f45be6c68e00719635b3 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Mon, 1 Sep 2025 18:09:24 +0200 Subject: [PATCH 16/53] revive/rpc: fix contract info getting after metadata update --- .../revive/rpc/src/client/storage_api.rs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client/storage_api.rs b/substrate/frame/revive/rpc/src/client/storage_api.rs index 20775f577c4f3..52682830eaad4 100644 --- a/substrate/frame/revive/rpc/src/client/storage_api.rs +++ b/substrate/frame/revive/rpc/src/client/storage_api.rs @@ -16,8 +16,12 @@ // limitations under the License. use crate::{ - subxt_client::{self, runtime_types::pallet_revive::storage::ContractInfo, SrcChainConfig}, - ClientError, H160, LOG_TARGET, + subxt_client::{ + self, + runtime_types::pallet_revive::storage::{AccountType, ContractInfo}, + SrcChainConfig, + }, + ClientError, H160, }; use sp_core::{H256, U256}; use subxt::{storage::Storage, OnlineClient}; @@ -37,24 +41,20 @@ impl StorageApi { /// Get the contract info for the given contract address. pub async fn get_contract_info( &self, - _contract_address: &H160, + contract_address: &H160, ) -> Result { - return Err(ClientError::ContractNotFound); - // TODO: for some reason `contract_info_of` is no longer available after regenerating - // metadata - // ``` - // subxt metadata --url ws://localhost:9944 --version 15 > substrate/frame/revive/rpc/revive_chain.metadata - // ``` - // TODO: remove once subxt is updated - // let contract_address: subxt::utils::H160 = contract_address.0.into(); - - // let query = subxt_client::storage().revive().contract_info_of(contract_address); - // let Some(info) = self.0.fetch(&query).await? else { - // return Err(ClientError::ContractNotFound); - // }; - - // Ok(info) + let contract_address: subxt::utils::H160 = contract_address.0.into(); + + let query = subxt_client::storage().revive().account_info_of(contract_address); + self.0 + .fetch(&query) + .await? + .and_then(|info| match info.account_type { + AccountType::Contract(contract_info) => Some(contract_info), + _ => None, + }) + .ok_or(ClientError::ContractNotFound) } /// Get the contract trie id for the given contract address. From 904822c615a9ce975d6cdd625fe2de8e55065176 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:54:35 +0200 Subject: [PATCH 17/53] revive/rpc: add some debugging --- substrate/frame/revive/rpc/src/client.rs | 6 ++++ .../revive/rpc/src/client/storage_api.rs | 14 +++++++-- .../frame/revive/rpc/src/receipt_provider.rs | 30 +++++++++++++++++-- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 2a8b14f504b42..a7bfc2f057c60 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -681,6 +681,8 @@ impl Client { block: Arc, hydrated_transactions: bool, ) -> Block { + log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); + let storage_api = self.storage_api(block.hash()); let ethereum_block = storage_api.get_ethereum_block().await.inspect_err(|err| { log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); @@ -691,6 +693,8 @@ impl Client { // - the node we are targeting has an outdated revive pallet (or ETH block functionality is // disabled) if let Ok(mut eth_block) = ethereum_block { + log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.header_hash()); + // This means we can live with the hashes returned by the Revive pallet. if !hydrated_transactions { return eth_block; @@ -710,6 +714,7 @@ impl Client { return eth_block; } + log::trace!(target: LOG_TARGET, "Reconstructing ethereum block for substrate block {:?}", block.hash()); // We need to reconstruct the ETH block fully. let (signed_txs, receipts): (Vec<_>, Vec<_>) = self .receipt_provider @@ -731,6 +736,7 @@ impl Client { signed_txs: Vec, hydrated_transactions: bool, ) -> Block { + log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?} from receipts", block.hash()); let runtime_api = self.runtime_api(block.hash()); let gas_limit = runtime_api.block_gas_limit().await.unwrap_or_default(); diff --git a/substrate/frame/revive/rpc/src/client/storage_api.rs b/substrate/frame/revive/rpc/src/client/storage_api.rs index 52682830eaad4..dc8be06f0baa9 100644 --- a/substrate/frame/revive/rpc/src/client/storage_api.rs +++ b/substrate/frame/revive/rpc/src/client/storage_api.rs @@ -28,6 +28,8 @@ use subxt::{storage::Storage, OnlineClient}; use pallet_revive::evm::{block_hash::ReceiptGasInfo, Block}; +const LOG_TARGET: &str = "eth-rpc::storage_api"; + /// A wrapper around the Substrate Storage API. #[derive(Clone)] pub struct StorageApi(Storage>); @@ -68,8 +70,10 @@ impl StorageApi { let query = subxt::dynamic::storage("Revive", "ReceiptInfoData", ()); let Some(info) = self.0.fetch(&query).await? else { + log::warn!(target: LOG_TARGET, "Receipt data not found"); return Err(ClientError::ReceiptDataNotFound); }; + log::trace!(target: LOG_TARGET, "Receipt data found"); let bytes = info.into_encoded(); codec::Decode::decode(&mut &bytes[..]).map_err(|err| err.into()) } @@ -77,24 +81,28 @@ impl StorageApi { /// Get the Ethereum block from storage. pub async fn get_ethereum_block(&self) -> Result { let query = subxt::dynamic::storage("Revive", "EthereumBlock", ()); - let Some(info) = self.0.fetch(&query).await? else { + log::warn!(target: LOG_TARGET, "Ethereum block not found"); return Err(ClientError::EthereumBlockNotFound); }; + log::trace!(target: LOG_TARGET, "Ethereum block found"); let bytes = info.into_encoded(); codec::Decode::decode(&mut &bytes[..]).map_err(|err| err.into()) } pub async fn get_ethereum_block_hash(&self, number: u64) -> Result { // Convert u64 to the wrapped U256 type that subxt expects - let number = subxt::utils::Static(U256::from(number)); + let number_u256 = subxt::utils::Static(U256::from(number)); - let query = subxt_client::storage().revive().block_hash(number); + let query = subxt_client::storage().revive().block_hash(number_u256); let Some(hash) = self.0.fetch(&query).await? else { + log::warn!(target: LOG_TARGET, "Ethereum block #{number} hash not found"); return Err(ClientError::EthereumBlockNotFound); }; + log::trace!(target: LOG_TARGET, "Ethereum block #{number} hash: {hash:?}"); + Ok(hash) } } diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index c8122ada34bc6..7932e320ab09a 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -17,7 +17,7 @@ use crate::{ client::{SubstrateBlock, SubstrateBlockNumber}, Address, AddressOrAddresses, BlockInfoProvider, BlockNumberOrTag, BlockTag, Bytes, ClientError, - FilterTopic, ReceiptExtractor, SubxtBlockInfoProvider, LOG_TARGET, + FilterTopic, ReceiptExtractor, SubxtBlockInfoProvider, }; use pallet_revive::evm::{Filter, Log, ReceiptInfo, TransactionSigned}; use sp_core::{H256, U256}; @@ -28,6 +28,8 @@ use std::{ }; use tokio::sync::Mutex; +const LOG_TARGET: &str = "eth-rpc::receipt_provider"; + /// ReceiptProvider stores transaction receipts and logs in a SQLite database. #[derive(Clone)] pub struct ReceiptProvider { @@ -138,7 +140,16 @@ impl ReceiptProvider { ) .fetch_optional(&self.pool) .await - .ok()??; + .inspect_err(|e| { + log::error!(target: LOG_TARGET, "failed to get block mapping for ethereum block {ethereum_block_hash:?}, err: {e:?}"); + }) + .ok()? + .or_else(||{ + log::trace!(target: LOG_TARGET, "No block mapping found for ethereum block: {ethereum_block_hash:?}"); + None + })?; + + log::trace!(target: LOG_TARGET, "Get block mapping ethereum block: {:?} -> substrate block: {ethereum_block_hash:?}", H256::from_slice(&result.substrate_block_hash[..])); Some(H256::from_slice(&result.substrate_block_hash[..])) } @@ -156,7 +167,16 @@ impl ReceiptProvider { ) .fetch_optional(&self.pool) .await - .ok()??; + .inspect_err(|e| { + log::error!(target: LOG_TARGET, "failed to get block mapping for substrate block {substrate_block_hash:?}, err: {e:?}"); + }) + .ok()? + .or_else(||{ + log::trace!(target: LOG_TARGET, "No block mapping found for substrate block: {substrate_block_hash:?}"); + None + })?; + + log::trace!(target: LOG_TARGET, "Get block mapping substrate block: {substrate_block_hash:?} -> ethereum block: {:?}", H256::from_slice(&result.ethereum_block_hash[..])); Some(H256::from_slice(&result.ethereum_block_hash[..])) } @@ -170,6 +190,8 @@ impl ReceiptProvider { return Ok(()); } + log::trace!(target: LOG_TARGET, "Removing block mappings: {ethereum_block_hashes:?}"); + let placeholders = vec!["?"; ethereum_block_hashes.len()].join(", "); let sql = format!( "DELETE FROM eth_to_substrate_blocks WHERE ethereum_block_hash in ({placeholders})" @@ -354,6 +376,8 @@ impl ReceiptProvider { let block_hash_ref = block_hash.as_ref(); let block_number = block.number() as i64; + log::trace!(target: LOG_TARGET, "Insert receipts for substrate block #{block_number} {:?}", block_hash); + let result = sqlx::query!( r#"SELECT EXISTS(SELECT 1 FROM transaction_hashes WHERE block_hash = $1) AS "exists!: bool""#, block_hash_ref From 2f2373460a95d0067e267a7d53b39d01b11ea584 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:50:34 +0200 Subject: [PATCH 18/53] revive/rpc: prune blocks in separate method --- .../frame/revive/rpc/src/receipt_provider.rs | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index 7932e320ab09a..b8b47bfbf8852 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -346,6 +346,8 @@ impl ReceiptProvider { &self, block: &SubstrateBlock, ) -> Result, ClientError> { + self.prune_blocks(block).await?; + let receipts = self.receipts_from_block(block).await?; self.insert(block, &receipts).await?; @@ -359,6 +361,35 @@ impl ReceiptProvider { Ok(receipts) } + /// Prune blocks older blocks. + async fn prune_blocks(&self, block: &SubstrateBlock) -> Result<(), ClientError> { + // Keep track of the latest block hashes, so we can prune older blocks. + if let Some(keep_latest_n_blocks) = self.keep_latest_n_blocks { + let latest = block.number(); + let block_hash = block.hash(); + let mut block_number_to_hash = self.block_number_to_hash.lock().await; + + let oldest_block = latest.saturating_sub(keep_latest_n_blocks as _); + let mut to_remove = block_number_to_hash + .iter() + .take_while(|(n, _)| **n <= oldest_block) + .map(|(_, hash)| *hash) + .collect::>(); + + block_number_to_hash.retain(|&n, _| n > oldest_block); + match block_number_to_hash.insert(block.number(), block_hash) { + Some(old_hash) if old_hash != block_hash => { + to_remove.push(old_hash); + }, + _ => {}, + } + + log::trace!(target: LOG_TARGET, "Pruning old blocks: {to_remove:?}"); + self.remove(&to_remove).await?; + } + Ok(()) + } + /// Insert receipts into the provider. /// /// Note: Can be merged into `insert_block_receipts` once is fixed and subxt let @@ -389,30 +420,6 @@ impl ReceiptProvider { return Ok(()); } - // Keep track of the latest block hashes, so we can prune older blocks. - if let Some(keep_latest_n_blocks) = self.keep_latest_n_blocks { - let latest = block.number(); - let mut block_number_to_hash = self.block_number_to_hash.lock().await; - - let oldest_block = latest.saturating_sub(keep_latest_n_blocks as _); - let mut to_remove = block_number_to_hash - .iter() - .take_while(|(n, _)| **n <= oldest_block) - .map(|(_, hash)| *hash) - .collect::>(); - - block_number_to_hash.retain(|&n, _| n > oldest_block); - match block_number_to_hash.insert(block.number(), block_hash) { - Some(old_hash) if old_hash != block_hash => { - to_remove.push(old_hash); - }, - _ => {}, - } - - log::trace!(target: LOG_TARGET, "Pruning old blocks: {to_remove:?}"); - self.remove(&to_remove).await?; - } - for (_, receipt) in receipts { let transaction_hash: &[u8] = receipt.transaction_hash.as_ref(); let transaction_index = receipt.transaction_index.as_u32() as i32; From d5c48f8f2bdbce45517347b0fe9b5761f2e90e21 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:58:42 +0200 Subject: [PATCH 19/53] revive/rpc: debug insert block mapping --- substrate/frame/revive/rpc/src/receipt_provider.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index b8b47bfbf8852..462faf3563f52 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -124,6 +124,7 @@ impl ReceiptProvider { .execute(&self.pool) .await?; + log::trace!(target: LOG_TARGET, "Insert block mapping ethereum block: {ethereum_block_hash:?} -> substrate block: {substrate_block_hash:?}"); Ok(()) } From e5fa0a1d4e316cd908dee2cdfd735205dd9b851d Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:06:48 +0200 Subject: [PATCH 20/53] revive/rpc: fix header_hash debug --- substrate/frame/revive/rpc/src/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index a7bfc2f057c60..34da076b6296b 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -693,7 +693,7 @@ impl Client { // - the node we are targeting has an outdated revive pallet (or ETH block functionality is // disabled) if let Ok(mut eth_block) = ethereum_block { - log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.header_hash()); + log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.hash); // This means we can live with the hashes returned by the Revive pallet. if !hydrated_transactions { From cf2671e20c07a103ea55e9268da0be1a78be99a3 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:04:14 +0200 Subject: [PATCH 21/53] revive/rpc: use substrate block hash to fetch gas price --- .../frame/revive/rpc/src/receipt_extractor.rs | 44 ++++++------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 08e375c66c551..5359444971ff2 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -154,14 +154,15 @@ impl ReceiptExtractor { /// Extract a [`TransactionSigned`] and a [`ReceiptInfo`] from an extrinsic. async fn extract_from_extrinsic( &self, - block_number: U256, - block_hash: H256, + substrate_block: &SubstrateBlock, + eth_block_hash: H256, ext: subxt::blocks::ExtrinsicDetails>, call: EthTransact, maybe_receipt: Option, ) -> Result<(TransactionSigned, ReceiptInfo), ClientError> { let transaction_index = ext.index(); let events = ext.events().await?; + let block_number: U256 = substrate_block.number().into(); let success = events.has::().inspect_err(|err| { log::debug!( @@ -185,14 +186,7 @@ impl ReceiptExtractor { ClientError::RecoverEthAddressFailed })?; - // TODO below causes such errors: - // ``` - // 2025-08-27 23:34:42.026 WARN tokio-runtime-worker eth-rpc: Error extracting extrinsic: SubxtError(Rpc(ClientError(User(UserError { code: 4003, message: "Client error: UnknownBlock: Expect block number from id: BlockId::Hash(0x69a76a3ffb732205f70236a5ac95653680a193dee3c02f489ba88af4e9cc8978)", data: None })))) - // 2025-08-27 23:34:42.026 ERROR tokio-runtime-worker eth-rpc: Failed to process block 9: SubxtError(Rpc(ClientError(User(UserError { code: 4003, message: "Client error: UnknownBlock: Expect block number from id: BlockId::Hash(0x69a76a3ffb732205f70236a5ac95653680a193dee3c02f489ba88af4e9cc8978)", data: None })))) - // 2025-08-27 23:34:42.923 DEBUG tokio-runtime-worker eth-rpc: Processing block receipts for Substrate block 0x84fcafbf84a9cce7d0aa9a6c9ef219c6f4dc1b96697a864a95bb0effeea3d4d3 (block #7) - // ``` - // let base_gas_price = (self.fetch_gas_price)(block_hash).await?; - let base_gas_price = U256::zero(); + let base_gas_price = (self.fetch_gas_price)(substrate_block.hash()).await?; let tx_info = GenericTransaction::from_signed(signed_tx.clone(), base_gas_price, Some(from)); @@ -223,7 +217,7 @@ impl ReceiptExtractor { block_number, transaction_hash, transaction_index: transaction_index.into(), - block_hash, + block_hash: eth_block_hash, log_index: event_details.index().into(), ..Default::default() }) @@ -244,7 +238,7 @@ impl ReceiptExtractor { }; let receipt = ReceiptInfo::new( - block_hash, + eth_block_hash, block_number, contract_address, from, @@ -282,17 +276,11 @@ impl ReceiptExtractor { // the state tries. Are we sorting them afterwards? stream::iter(ext_iter) .map(|(ext, call, receipt)| async move { - self.extract_from_extrinsic( - substrate_block_number.into(), - eth_block_hash, - ext, - call, - receipt, - ) - .await - .inspect_err(|err| { - log::warn!(target: LOG_TARGET, "Error extracting extrinsic: {err:?}"); - }) + self.extract_from_extrinsic(block, eth_block_hash, ext, call, receipt) + .await + .inspect_err(|err| { + log::warn!(target: LOG_TARGET, "Error extracting extrinsic: {err:?}"); + }) }) .buffer_unordered(10) .collect::>>() @@ -374,14 +362,8 @@ impl ReceiptExtractor { .await .unwrap_or(substrate_block_hash); - self.extract_from_extrinsic( - substrate_block_number.into(), - eth_block_hash, - ext, - eth_call, - maybe_receipt, - ) - .await + self.extract_from_extrinsic(block, eth_block_hash, ext, eth_call, maybe_receipt) + .await } /// Get the Ethereum block hash for the given Substrate block. From a4555fc71b40ccec0d56b36e4d80a1f31a043b99 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:12:27 +0200 Subject: [PATCH 22/53] revive/rpc: remove populate mappings methods --- substrate/frame/revive/rpc/src/client.rs | 16 ---- .../frame/revive/rpc/src/receipt_provider.rs | 86 ------------------- 2 files changed, 102 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 34da076b6296b..47323c081c1b8 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -498,22 +498,6 @@ impl Client { self.receipts_count_per_block(ethereum_hash).await } - /// Populate missing block mappings for existing blocks. - /// This can be used for historical data population. - pub async fn populate_missing_mappings(&self, substrate_block: &SubstrateBlock) -> Result<(), ClientError> { - self.receipt_provider.populate_missing_mappings(substrate_block).await - } - - /// Batch populate missing mappings for a range of blocks. - pub async fn batch_populate_mappings( - &self, - start_block: SubstrateBlockNumber, - end_block: SubstrateBlockNumber, - batch_size: usize, - ) -> Result { - self.receipt_provider.batch_populate_mappings(start_block, end_block, batch_size).await - } - /// Get the system health. pub async fn system_health(&self) -> Result { let health = self.rpc.system_health().await?; diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index 462faf3563f52..b03b6c6cf577e 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -207,92 +207,6 @@ impl ReceiptProvider { Ok(()) } - /// Populate missing block mappings for existing blocks. - /// This method can be used to backfill mappings for historical data. - pub async fn populate_missing_mappings( - &self, - substrate_block: &SubstrateBlock, - ) -> Result<(), ClientError> { - let substrate_hash = substrate_block.hash(); - let substrate_hash_ref = substrate_hash.as_ref(); - let block_number = substrate_block.number() as u64; - - // Check if mapping already exists - let existing = query!( - r#" - SELECT EXISTS(SELECT 1 FROM eth_to_substrate_blocks WHERE substrate_block_hash = $1) AS "exists!: bool" - "#, - substrate_hash_ref - ) - .fetch_one(&self.pool) - .await?; - - if existing.exists { - return Ok(()); - } - - // Get the Ethereum block hash and insert mapping - if let Some(ethereum_hash) = - self.receipt_extractor.get_ethereum_block_hash(substrate_block).await - { - self.insert_block_mapping(ðereum_hash, &substrate_hash, block_number).await?; - log::debug!( - target: LOG_TARGET, - "Populated mapping: ETH {:?} -> Substrate {:?} (block #{})", - ethereum_hash, - substrate_hash, - block_number - ); - } - - Ok(()) - } - - /// Batch populate missing mappings for a range of blocks. - /// This is useful for historical data population. - pub async fn batch_populate_mappings( - &self, - start_block: u32, - end_block: u32, - batch_size: usize, - ) -> Result { - let mut populated = 0u32; - let mut current = start_block; - - while current <= end_block { - let batch_end = std::cmp::min(current + batch_size as u32 - 1, end_block); - - for block_num in current..=batch_end { - if let Some(block) = self.block_provider.block_by_number(block_num).await? { - self.populate_missing_mappings(&block).await?; - populated += 1; - } - } - - current = batch_end + 1; - - // Log progress every 100 blocks - if populated % 100 == 0 { - log::info!( - target: LOG_TARGET, - "Block mapping population progress: {} blocks processed (current: {})", - populated, - batch_end - ); - } - } - - log::info!( - target: LOG_TARGET, - "Completed block mapping population: {} mappings created for blocks {}-{}", - populated, - start_block, - end_block - ); - - Ok(populated) - } - /// Deletes older records from the database. pub async fn remove(&self, block_hashes: &[H256]) -> Result<(), ClientError> { if block_hashes.is_empty() { From 72ca6da251827338b06f0a35433421c9708ac227 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 5 Sep 2025 11:33:58 +0200 Subject: [PATCH 23/53] revive/rpc: improve receipt extractor mock --- substrate/frame/revive/rpc/src/receipt_extractor.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 5359444971ff2..f9eb79d7758b5 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -137,8 +137,13 @@ impl ReceiptExtractor { #[cfg(test)] pub fn new_mock() -> Self { let fetch_receipt_data = Arc::new(|_| Box::pin(std::future::ready(None)) as Pin>); - let fetch_eth_block_hash = - Arc::new(|_, _| Box::pin(std::future::ready(None)) as Pin>); + // This method is useful when testing eth - substrate mapping. + let fetch_eth_block_hash = Arc::new(|block_hash: H256, block_number: u64| { + // Generate hash from substrate block hash and number + let bytes: Vec = [block_hash.as_bytes(), &block_number.to_be_bytes()].concat(); + let eth_block_hash = H256::from(keccak_256(&bytes)); + Box::pin(std::future::ready(Some(eth_block_hash))) as Pin> + }); let fetch_gas_price = Arc::new(|_| Box::pin(std::future::ready(Ok(U256::from(1000)))) as Pin>); From 0340c5b0a2623d29b7472414ba815b9858066ac2 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 5 Sep 2025 11:46:12 +0200 Subject: [PATCH 24/53] revive/rpc: update pruning --- ...93cbf05b3451cb8e4c4cb6cf86ec70930a11e.json | 12 -- ...d25246c7b20ae8f5d7efa4aaaf915e92cf70f.json | 20 --- ...285ccf101a8e36d68455e05a76df3b366420e.json | 12 ++ ...67296260bb075618d7e9dfaf6cba1e59fefb8.json | 12 ++ ...61dae3a284ad4f7979dacb0ccff32cdc39051.json | 12 -- .../frame/revive/rpc/src/receipt_extractor.rs | 10 +- .../frame/revive/rpc/src/receipt_provider.rs | 139 ++++++++---------- 7 files changed, 95 insertions(+), 122 deletions(-) delete mode 100644 substrate/frame/revive/rpc/.sqlx/query-76dd0f2460cfc0ffa93dda7a42893cbf05b3451cb8e4c4cb6cf86ec70930a11e.json delete mode 100644 substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-c009009858fd2f048c98ba5009867296260bb075618d7e9dfaf6cba1e59fefb8.json delete mode 100644 substrate/frame/revive/rpc/.sqlx/query-de639fe0ac0c3cfdfbbfa07e81a61dae3a284ad4f7979dacb0ccff32cdc39051.json diff --git a/substrate/frame/revive/rpc/.sqlx/query-76dd0f2460cfc0ffa93dda7a42893cbf05b3451cb8e4c4cb6cf86ec70930a11e.json b/substrate/frame/revive/rpc/.sqlx/query-76dd0f2460cfc0ffa93dda7a42893cbf05b3451cb8e4c4cb6cf86ec70930a11e.json deleted file mode 100644 index e8c40966e8395..0000000000000 --- a/substrate/frame/revive/rpc/.sqlx/query-76dd0f2460cfc0ffa93dda7a42893cbf05b3451cb8e4c4cb6cf86ec70930a11e.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n\t\t\t\t\tINSERT OR REPLACE INTO logs(\n\t\t\t\t\t\tblock_hash,\n\t\t\t\t\t\ttransaction_index,\n\t\t\t\t\t\tlog_index,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tblock_number,\n\t\t\t\t\t\ttransaction_hash,\n\t\t\t\t\t\ttopic_0, topic_1, topic_2, topic_3,\n\t\t\t\t\t\tdata)\n\t\t\t\t\tVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\n\t\t\t\t\t", - "describe": { - "columns": [], - "parameters": { - "Right": 11 - }, - "nullable": [] - }, - "hash": "76dd0f2460cfc0ffa93dda7a42893cbf05b3451cb8e4c4cb6cf86ec70930a11e" -} diff --git a/substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json b/substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json deleted file mode 100644 index f491fedaf5f93..0000000000000 --- a/substrate/frame/revive/rpc/.sqlx/query-9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n\t\t\tSELECT EXISTS(SELECT 1 FROM eth_to_substrate_blocks WHERE substrate_block_hash = $1) AS \"exists!: bool\"\n\t\t\t", - "describe": { - "columns": [ - { - "name": "exists!: bool", - "ordinal": 0, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false - ] - }, - "hash": "9eadf295b6a6b2d6de222d91e1cd25246c7b20ae8f5d7efa4aaaf915e92cf70f" -} diff --git a/substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json b/substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json new file mode 100644 index 0000000000000..76ad4a8c1fe95 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\t\t\tINSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index)\n\t\t\t\t\tVALUES ($1, $2, $3)\n\t\t\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-c009009858fd2f048c98ba5009867296260bb075618d7e9dfaf6cba1e59fefb8.json b/substrate/frame/revive/rpc/.sqlx/query-c009009858fd2f048c98ba5009867296260bb075618d7e9dfaf6cba1e59fefb8.json new file mode 100644 index 0000000000000..ab3d18135f601 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-c009009858fd2f048c98ba5009867296260bb075618d7e9dfaf6cba1e59fefb8.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\t\t\t\tINSERT OR REPLACE INTO logs(\n\t\t\t\t\t\t\tblock_hash,\n\t\t\t\t\t\t\ttransaction_index,\n\t\t\t\t\t\t\tlog_index,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\tblock_number,\n\t\t\t\t\t\t\ttransaction_hash,\n\t\t\t\t\t\t\ttopic_0, topic_1, topic_2, topic_3,\n\t\t\t\t\t\t\tdata)\n\t\t\t\t\t\tVALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)\n\t\t\t\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 11 + }, + "nullable": [] + }, + "hash": "c009009858fd2f048c98ba5009867296260bb075618d7e9dfaf6cba1e59fefb8" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-de639fe0ac0c3cfdfbbfa07e81a61dae3a284ad4f7979dacb0ccff32cdc39051.json b/substrate/frame/revive/rpc/.sqlx/query-de639fe0ac0c3cfdfbbfa07e81a61dae3a284ad4f7979dacb0ccff32cdc39051.json deleted file mode 100644 index 6df5453213956..0000000000000 --- a/substrate/frame/revive/rpc/.sqlx/query-de639fe0ac0c3cfdfbbfa07e81a61dae3a284ad4f7979dacb0ccff32cdc39051.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n\t\t\t\tINSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index)\n\t\t\t\tVALUES ($1, $2, $3)\n\t\t\t\t", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - }, - "hash": "de639fe0ac0c3cfdfbbfa07e81a61dae3a284ad4f7979dacb0ccff32cdc39051" -} diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index f9eb79d7758b5..99e8245a0bef4 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -372,9 +372,11 @@ impl ReceiptExtractor { } /// Get the Ethereum block hash for the given Substrate block. - pub async fn get_ethereum_block_hash(&self, block: &SubstrateBlock) -> Option { - let substrate_block_number = block.number() as u64; - let substrate_block_hash = block.hash(); - (self.fetch_eth_block_hash)(substrate_block_hash, substrate_block_number).await + pub async fn get_ethereum_block_hash( + &self, + block_hash: &H256, + block_number: u64, + ) -> Option { + (self.fetch_eth_block_hash)(*block_hash, block_number).await } } diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index b03b6c6cf577e..df504cdfc296a 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -261,23 +261,13 @@ impl ReceiptProvider { &self, block: &SubstrateBlock, ) -> Result, ClientError> { - self.prune_blocks(block).await?; - let receipts = self.receipts_from_block(block).await?; self.insert(block, &receipts).await?; - - // Insert block mapping from Ethereum to Substrate hash - if let Some(ethereum_hash) = self.receipt_extractor.get_ethereum_block_hash(block).await { - let substrate_hash = block.hash(); - let block_number = block.number() as u64; - self.insert_block_mapping(ðereum_hash, &substrate_hash, block_number).await?; - } - Ok(receipts) } /// Prune blocks older blocks. - async fn prune_blocks(&self, block: &SubstrateBlock) -> Result<(), ClientError> { + async fn prune_blocks(&self, block: &impl BlockInfo) -> Result<(), ClientError> { // Keep track of the latest block hashes, so we can prune older blocks. if let Some(keep_latest_n_blocks) = self.keep_latest_n_blocks { let latest = block.number(); @@ -314,10 +304,6 @@ impl ReceiptProvider { block: &impl BlockInfo, receipts: &[(TransactionSigned, ReceiptInfo)], ) -> Result<(), ClientError> { - if receipts.is_empty() { - return Ok(()); - } - let block_hash = block.hash(); let block_hash_ref = block_hash.as_ref(); let block_number = block.number() as i64; @@ -331,65 +317,76 @@ impl ReceiptProvider { .fetch_one(&self.pool) .await?; - if result.exists { - return Ok(()); - } - - for (_, receipt) in receipts { - let transaction_hash: &[u8] = receipt.transaction_hash.as_ref(); - let transaction_index = receipt.transaction_index.as_u32() as i32; - - query!( - r#" - INSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index) - VALUES ($1, $2, $3) - "#, - transaction_hash, - block_hash_ref, - transaction_index - ) - .execute(&self.pool) - .await?; - - for log in &receipt.logs { - let log_index = log.log_index.as_u32() as i32; - let address: &[u8] = log.address.as_ref(); + self.prune_blocks(block).await?; - let topic_0 = log.topics.first().as_ref().map(|v| &v[..]); - let topic_1 = log.topics.get(1).as_ref().map(|v| &v[..]); - let topic_2 = log.topics.get(2).as_ref().map(|v| &v[..]); - let topic_3 = log.topics.get(3).as_ref().map(|v| &v[..]); - let data = log.data.as_ref().map(|v| &v.0[..]); + if !result.exists { + for (_, receipt) in receipts { + let transaction_hash: &[u8] = receipt.transaction_hash.as_ref(); + let transaction_index = receipt.transaction_index.as_u32() as i32; query!( r#" - INSERT OR REPLACE INTO logs( - block_hash, - transaction_index, - log_index, - address, - block_number, - transaction_hash, - topic_0, topic_1, topic_2, topic_3, - data) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) + INSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index) + VALUES ($1, $2, $3) "#, - block_hash_ref, - transaction_index, - log_index, - address, - block_number, transaction_hash, - topic_0, - topic_1, - topic_2, - topic_3, - data + block_hash_ref, + transaction_index ) .execute(&self.pool) .await?; + + for log in &receipt.logs { + let log_index = log.log_index.as_u32() as i32; + let address: &[u8] = log.address.as_ref(); + + let topic_0 = log.topics.first().as_ref().map(|v| &v[..]); + let topic_1 = log.topics.get(1).as_ref().map(|v| &v[..]); + let topic_2 = log.topics.get(2).as_ref().map(|v| &v[..]); + let topic_3 = log.topics.get(3).as_ref().map(|v| &v[..]); + let data = log.data.as_ref().map(|v| &v.0[..]); + + query!( + r#" + INSERT OR REPLACE INTO logs( + block_hash, + transaction_index, + log_index, + address, + block_number, + transaction_hash, + topic_0, topic_1, topic_2, topic_3, + data) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) + "#, + block_hash_ref, + transaction_index, + log_index, + address, + block_number, + transaction_hash, + topic_0, + topic_1, + topic_2, + topic_3, + data + ) + .execute(&self.pool) + .await?; + } } } + + // Insert block mapping from Ethereum to Substrate hash + if let Some(ethereum_hash) = self + .receipt_extractor + .get_ethereum_block_hash(&block_hash, block_number as u64) + .await + { + self.insert_block_mapping(ðereum_hash, &block_hash, block_number as u64) + .await?; + } + Ok(()) } @@ -712,6 +709,7 @@ mod tests { } assert_eq!(count(&provider.pool, "transaction_hashes", None).await, n); assert_eq!(count(&provider.pool, "logs", None).await, n); + assert_eq!(count(&provider.pool, "eth_to_substrate_blocks", None).await, n); assert_eq!(provider.block_number_to_hash.lock().await.len(), n); return Ok(()); @@ -740,6 +738,7 @@ mod tests { } assert_eq!(count(&provider.pool, "transaction_hashes", None).await, 1); assert_eq!(count(&provider.pool, "logs", None).await, 1); + assert_eq!(count(&provider.pool, "eth_to_substrate_blocks", None).await, 1); assert_eq!( provider.block_number_to_hash.lock().await.clone(), [(1, H256::from([2u8; 32]))].into(), @@ -1070,20 +1069,12 @@ mod tests { Ok(()) } - async fn count_mappings(pool: &SqlitePool) -> usize { - let count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM eth_to_substrate_blocks") - .fetch_one(pool) - .await - .unwrap(); - count as _ - } - #[sqlx::test] async fn test_mapping_count(pool: SqlitePool) -> anyhow::Result<()> { let provider = setup_sqlite_provider(pool).await; // Initially no mappings - assert_eq!(count_mappings(&provider.pool).await, 0); + assert_eq!(count(&provider.pool, "eth_to_substrate_blocks", None).await, 0); // Insert some mappings provider @@ -1093,11 +1084,11 @@ mod tests { .insert_block_mapping(&H256::from([3u8; 32]), &H256::from([4u8; 32]), 2) .await?; - assert_eq!(count_mappings(&provider.pool).await, 2); + assert_eq!(count(&provider.pool, "eth_to_substrate_blocks", None).await, 2); // Remove one provider.remove_block_mappings(&[H256::from([1u8; 32])]).await?; - assert_eq!(count_mappings(&provider.pool).await, 1); + assert_eq!(count(&provider.pool, "eth_to_substrate_blocks", None).await, 1); Ok(()) } From 0f1f09eac5c54b4f88e42e424b3f2c46b351caf5 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 5 Sep 2025 13:26:48 +0200 Subject: [PATCH 25/53] revive/rpc: use static api to get block and receipt info data --- .../frame/revive/rpc/src/client/storage_api.rs | 17 ++++++++--------- substrate/frame/revive/rpc/src/subxt_client.rs | 8 ++++++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client/storage_api.rs b/substrate/frame/revive/rpc/src/client/storage_api.rs index dc8be06f0baa9..b599e151eb430 100644 --- a/substrate/frame/revive/rpc/src/client/storage_api.rs +++ b/substrate/frame/revive/rpc/src/client/storage_api.rs @@ -67,27 +67,26 @@ impl StorageApi { /// Get the receipt data from storage. pub async fn get_receipt_data(&self) -> Result, ClientError> { - let query = subxt::dynamic::storage("Revive", "ReceiptInfoData", ()); + let query = subxt_client::storage().revive().receipt_info_data(); - let Some(info) = self.0.fetch(&query).await? else { + let Some(receipt_info_data) = self.0.fetch(&query).await? else { log::warn!(target: LOG_TARGET, "Receipt data not found"); return Err(ClientError::ReceiptDataNotFound); }; log::trace!(target: LOG_TARGET, "Receipt data found"); - let bytes = info.into_encoded(); - codec::Decode::decode(&mut &bytes[..]).map_err(|err| err.into()) + let receipt_info_data = receipt_info_data.into_iter().map(|entry| entry.0).collect(); + Ok(receipt_info_data) } /// Get the Ethereum block from storage. pub async fn get_ethereum_block(&self) -> Result { - let query = subxt::dynamic::storage("Revive", "EthereumBlock", ()); - let Some(info) = self.0.fetch(&query).await? else { + let query = subxt_client::storage().revive().ethereum_block(); + let Some(block) = self.0.fetch(&query).await? else { log::warn!(target: LOG_TARGET, "Ethereum block not found"); return Err(ClientError::EthereumBlockNotFound); }; - log::trace!(target: LOG_TARGET, "Ethereum block found"); - let bytes = info.into_encoded(); - codec::Decode::decode(&mut &bytes[..]).map_err(|err| err.into()) + log::trace!(target: LOG_TARGET, "Ethereum block found hash: {:?}", block.hash); + Ok(block.0) } pub async fn get_ethereum_block_hash(&self, number: u64) -> Result { diff --git a/substrate/frame/revive/rpc/src/subxt_client.rs b/substrate/frame/revive/rpc/src/subxt_client.rs index 08d9343797e31..46f3eda4246d2 100644 --- a/substrate/frame/revive/rpc/src/subxt_client.rs +++ b/substrate/frame/revive/rpc/src/subxt_client.rs @@ -62,6 +62,14 @@ pub use subxt::config::PolkadotConfig as SrcChainConfig; substitute_type( path = "sp_weights::weight_v2::Weight", with = "::subxt::utils::Static<::sp_weights::Weight>" + ), + substitute_type( + path = "pallet_revive::evm::api::rpc_types_gen::Block", + with = "::subxt::utils::Static<::pallet_revive::evm::Block>" + ), + substitute_type( + path = "pallet_revive::evm::block_hash::ReceiptGasInfo", + with = "::subxt::utils::Static<::pallet_revive::evm::block_hash::ReceiptGasInfo>" ) )] mod src_chain {} From 812314d9eacef4ff7aa6172450cb00ce3c4a5130 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 12 Sep 2025 17:35:30 +0200 Subject: [PATCH 26/53] revive/rpc: fix fetching transaction by index --- substrate/frame/revive/rpc/src/client.rs | 9 ++++- substrate/frame/revive/rpc/src/lib.rs | 47 +++++++++++++++++------- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 47323c081c1b8..6e9512de6d876 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -26,7 +26,7 @@ use storage_api::StorageApi; use crate::{ subxt_client::{self, revive::calls::types::EthTransact, SrcChainConfig}, BlockInfoProvider, BlockTag, FeeHistoryProvider, ReceiptProvider, SubxtBlockInfoProvider, - TracerType, TransactionInfo, LOG_TARGET, + TracerType, TransactionInfo, }; use jsonrpsee::{ core::traits::ToRpcParams, @@ -131,6 +131,7 @@ pub enum ClientError { #[error("Ethereum block not found")] EthereumBlockNotFound, } +const LOG_TARGET: &str = "eth-rpc::client"; const REVERT_CODE: i32 = 3; impl From for ErrorObjectOwned { @@ -554,6 +555,12 @@ impl Client { self.receipt_provider.get_substrate_hash(ethereum_hash).await } + /// Resolve Substrate block hash to Ethereum block hash, then get the block. + /// This method provides the abstraction layer needed by the RPC APIs. + pub async fn resolve_ethereum_hash(&self, substrate_hash: &H256) -> Option { + self.receipt_provider.get_ethereum_hash(substrate_hash).await + } + /// Get a block by Ethereum hash with automatic resolution to Substrate hash. /// Falls back to treating the hash as a Substrate hash if no mapping exists. pub async fn block_by_ethereum_hash( diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index f3b55fb1d9779..4d58d688a8c0a 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -314,22 +314,15 @@ impl EthRpcServer for EthRpcServerImpl { block_hash: H256, transaction_index: U256, ) -> RpcResult> { - let Some(receipt) = self - .client - .receipt_by_ethereum_hash_and_index( - &block_hash, - transaction_index.try_into().map_err(|_| EthRpcError::ConversionError)?, - ) - .await + let Some(substrate_block_hash) = self.client.resolve_substrate_hash(&block_hash).await else { return Ok(None); }; - - let Some(signed_tx) = self.client.signed_tx_by_hash(&receipt.transaction_hash).await else { - return Ok(None); - }; - - Ok(Some(TransactionInfo::new(&receipt, signed_tx))) + self.get_transaction_by_substrate_block_hash_and_index( + substrate_block_hash, + transaction_index, + ) + .await } async fn get_transaction_by_block_number_and_index( @@ -340,7 +333,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_number_or_tag(&block).await? else { return Ok(None); }; - self.get_transaction_by_block_hash_and_index(block.hash(), transaction_index) + self.get_transaction_by_substrate_block_hash_and_index(block.hash(), transaction_index) .await } @@ -386,3 +379,29 @@ impl EthRpcServer for EthRpcServerImpl { Ok(result) } } + +impl EthRpcServerImpl { + async fn get_transaction_by_substrate_block_hash_and_index( + &self, + substrate_block_hash: H256, + ethereum_tx_index: U256, + ) -> RpcResult> { + let mut substrate_tx_idx: usize = + ethereum_tx_index.try_into().map_err(|_| EthRpcError::ConversionError)?; + // Skip substrate system extrinsics + substrate_tx_idx += 2; + + let Some(receipt) = self + .client + .receipt_by_hash_and_index(&substrate_block_hash, substrate_tx_idx) + .await + else { + return Ok(None) + }; + let Some(signed_tx) = self.client.signed_tx_by_hash(&receipt.transaction_hash).await else { + return Ok(None); + }; + + Ok(Some(TransactionInfo::new(&receipt, signed_tx))) + } +} From 6d67931715deeca34665a8557ea5d4c2bdb6e644 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:56:41 +0200 Subject: [PATCH 27/53] revive/rpc: fix comment --- substrate/frame/revive/rpc/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 4d58d688a8c0a..94964f1be5af6 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -388,7 +388,7 @@ impl EthRpcServerImpl { ) -> RpcResult> { let mut substrate_tx_idx: usize = ethereum_tx_index.try_into().map_err(|_| EthRpcError::ConversionError)?; - // Skip substrate system extrinsics + // Skip substrate inherents substrate_tx_idx += 2; let Some(receipt) = self From 6836c6b02c593b02c23383e5f012686cf292a057 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 17 Sep 2025 18:20:33 +0200 Subject: [PATCH 28/53] revive/rpc: order transactions properly --- substrate/frame/revive/rpc/src/lib.rs | 12 ++++----- .../frame/revive/rpc/src/receipt_extractor.rs | 25 ++++++++++++------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 94964f1be5af6..6f66c3357ae2f 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -384,16 +384,14 @@ impl EthRpcServerImpl { async fn get_transaction_by_substrate_block_hash_and_index( &self, substrate_block_hash: H256, - ethereum_tx_index: U256, + transaction_index: U256, ) -> RpcResult> { - let mut substrate_tx_idx: usize = - ethereum_tx_index.try_into().map_err(|_| EthRpcError::ConversionError)?; - // Skip substrate inherents - substrate_tx_idx += 2; - let Some(receipt) = self .client - .receipt_by_hash_and_index(&substrate_block_hash, substrate_tx_idx) + .receipt_by_hash_and_index( + &substrate_block_hash, + transaction_index.try_into().map_err(|_| EthRpcError::ConversionError)?, + ) .await else { return Ok(None) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 99e8245a0bef4..c38d3d9f86eb1 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -164,8 +164,8 @@ impl ReceiptExtractor { ext: subxt::blocks::ExtrinsicDetails>, call: EthTransact, maybe_receipt: Option, + transaction_index: usize, ) -> Result<(TransactionSigned, ReceiptInfo), ClientError> { - let transaction_index = ext.index(); let events = ext.events().await?; let block_number: U256 = substrate_block.number().into(); @@ -277,17 +277,17 @@ impl ReceiptExtractor { .await .unwrap_or(substrate_block_hash); - // TODO: Order of receipt and transaction info is important while building - // the state tries. Are we sorting them afterwards? + // Process extrinsics in order while maintaining parallelism within buffer window stream::iter(ext_iter) - .map(|(ext, call, receipt)| async move { - self.extract_from_extrinsic(block, eth_block_hash, ext, call, receipt) + .enumerate() + .map(|(idx, (ext, call, receipt))| async move { + self.extract_from_extrinsic(block, eth_block_hash, ext, call, receipt, idx) .await .inspect_err(|err| { log::warn!(target: LOG_TARGET, "Error extracting extrinsic: {err:?}"); }) }) - .buffer_unordered(10) + .buffered(10) .collect::>>() .await .into_iter() @@ -357,7 +357,7 @@ impl ReceiptExtractor { let (ext, eth_call, maybe_receipt) = ext_iter .into_iter() - .find(|(e, _, _)| e.index() as usize == transaction_index) + .nth(transaction_index) .ok_or(ClientError::EthExtrinsicNotFound)?; let substrate_block_number = block.number() as u64; @@ -367,8 +367,15 @@ impl ReceiptExtractor { .await .unwrap_or(substrate_block_hash); - self.extract_from_extrinsic(block, eth_block_hash, ext, eth_call, maybe_receipt) - .await + self.extract_from_extrinsic( + block, + eth_block_hash, + ext, + eth_call, + maybe_receipt, + transaction_index, + ) + .await } /// Get the Ethereum block hash for the given Substrate block. From a66e7f594b8a2ae311b9d98c8a6a582485afff45 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Mon, 29 Sep 2025 13:42:15 +0200 Subject: [PATCH 29/53] revive/rpc: do not use effective gas price from storage --- substrate/frame/revive/rpc/src/receipt_extractor.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index c38d3d9f86eb1..5798a0247c865 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -194,18 +194,17 @@ impl ReceiptExtractor { let base_gas_price = (self.fetch_gas_price)(substrate_block.hash()).await?; let tx_info = GenericTransaction::from_signed(signed_tx.clone(), base_gas_price, Some(from)); - - let (gas_price, gas_used) = if let Some(receipt) = maybe_receipt { + let gas_price = tx_info.gas_price.unwrap_or_default(); + let gas_used = if let Some(receipt) = maybe_receipt { // If we have a receipt, use it to accurately represent the gas. - (U256::from(receipt.effective_gas_price), U256::from(receipt.gas_used)) + U256::from(receipt.gas_used) } else { // Otherwise, calculate gas used from the transaction fees. - let gas_price = tx_info.gas_price.unwrap_or_default(); let gas_used = U256::from(tx_fees.tip.saturating_add(tx_fees.actual_fee)) .saturating_mul(self.native_to_eth_ratio.into()) .checked_div(gas_price) .unwrap_or_default(); - (gas_price, gas_used) + gas_used }; // get logs from ContractEmitted event From 8e08f717869b168eab5f105d47968c86daebafcb Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 30 Sep 2025 16:33:53 +0000 Subject: [PATCH 30/53] cargo: Update cargo lock with minimal changes Signed-off-by: Alexandru Vasile --- Cargo.lock | 5792 +++++++++++++++++++++++++--------------------------- 1 file changed, 2763 insertions(+), 3029 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bea15b35a0366..2fa27b923fedb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,27 +14,27 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.31.1", + "gimli 0.28.0", ] [[package]] name = "addr2line" -version = "0.25.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli 0.32.3", + "gimli 0.31.1", ] [[package]] -name = "adler2" -version = "2.0.1" +name = "adler" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "adler32" @@ -54,9 +54,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher 0.4.4", @@ -74,27 +74,27 @@ dependencies = [ "cipher 0.4.4", "ctr", "ghash", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] name = "ahash" -version = "0.8.12" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom 0.2.10", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.32", ] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -107,9 +107,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-consensus" -version = "1.0.37" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59094911f05dbff1cf5b29046a00ef26452eccc8d47136d50a47c0cf22f00c85" +checksum = "d213580c17d239ae83c0d897ac3315db7cda83d2d4936a9823cc3517552f2e24" dependencies = [ "alloy-eips", "alloy-primitives", @@ -125,16 +125,15 @@ dependencies = [ "once_cell", "secp256k1 0.30.0", "serde", - "serde_json", "serde_with", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "alloy-core" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575053cea24ea8cb7e775e39d5c53c33b19cfd0ca1cf6c0fd653f3d8c682095f" +checksum = "ad31216895d27d307369daa1393f5850b50bbbd372478a9fa951c095c210627e" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -145,9 +144,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c2905bafc2df7ccd32ca3af13f0b0d82f2e2ff9dfbeb12196c0d978d5c0deb" +checksum = "7b95b3deca680efc7e9cba781f1a1db352fa1ea50e6384a514944dcf4419e652" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -156,7 +155,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow 0.7.13", + "winnow 0.7.10", ] [[package]] @@ -169,7 +168,7 @@ dependencies = [ "alloy-rlp", "crc", "serde", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] @@ -193,14 +192,14 @@ dependencies = [ "alloy-rlp", "k256", "serde", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "alloy-eips" -version = "1.0.37" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac7f1c9a1ccc7f3e03c36976455751a6166a4f0d2d2c530c3f87dfe7d0cdc836" +checksum = "2a15b4b0f6bab47aae017d52bb5a739bda381553c09fb9918b7172721ef5f5de" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -215,14 +214,14 @@ dependencies = [ "serde", "serde_with", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "alloy-json-abi" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2acb6637a9c0e1cdf8971e0ced8f3fa34c04c5e9dccf6bb184f6a64fe0e37d8" +checksum = "15516116086325c157c18261d768a20677f0f699348000ed391d4ad0dcb82530" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -232,24 +231,24 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.4.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b77f7d5e60ad8ae6bd2200b8097919712a07a6db622a4b201e7ead6166f02e5" +checksum = "bc9485c56de23438127a731a6b4c87803d49faf1a7068dcd1d8768aca3a9edb9" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", "derive_more 2.0.1", - "foldhash 0.2.0", - "hashbrown 0.16.0", - "indexmap 2.11.4", + "foldhash", + "hashbrown 0.15.3", + "indexmap 2.9.0", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand 0.9.2", + "rand 0.9.0", "ruint", "rustc-hash 2.1.1", "serde", @@ -274,16 +273,16 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "alloy-serde" -version = "1.0.37" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5413814be7a22fbc81e0f04a2401fcc3eb25e56fd53b04683e8acecc6e1fe01b" +checksum = "f1b3b1078b8775077525bc9fe9f6577e815ceaecd6c412a4f3b4d8aa2836e8f6" dependencies = [ "alloy-primitives", "serde", @@ -292,67 +291,67 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c84c3637bee9b5c4a4d2b93360ee16553d299c3b932712353caf1cea76d0e6" +checksum = "a14f21d053aea4c6630687c2f4ad614bed4c81e14737a9b904798b24f30ea849" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a882aa4e1790063362434b9b40d358942b188477ac1c44cfb8a52816ffc0cc17" +checksum = "34d99282e7c9ef14eb62727981a985a01869e586d1dec729d3bb33679094c100" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.11.4", + "indexmap 2.9.0", "proc-macro-error2", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5772107f9bb265d8d8c86e0733937bb20d0857ea5425b1b6ddf51a9804042" +checksum = "eda029f955b78e493360ee1d7bd11e1ab9f2a220a5715449babc79d6d0a01105" dependencies = [ "const-hex", "dunce", "heck 0.5.0", "macro-string", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e188b939aa4793edfaaa099cb1be4e620036a775b4bdf24fdc56f1cd6fd45890" +checksum = "10db1bd7baa35bc8d4a1b07efbf734e73e5ba09f2580fb8cee3483a36087ceb2" dependencies = [ "serde", - "winnow 0.7.13", + "winnow 0.7.10", ] [[package]] name = "alloy-sol-types" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8a9a909872097caffc05df134e5ef2253a1cdb56d3a9cf0052a042ac763f9" +checksum = "58377025a47d8b8426b3e4846a251f2c1991033b27f517aade368146f6ab1dfe" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -384,9 +383,9 @@ checksum = "e64c09ec565a90ed8390d82aa08cd3b22e492321b96cb4a3d4f58414683c9e2f" dependencies = [ "alloy-primitives", "darling 0.21.3", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -395,6 +394,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4436e0292ab1bb631b42973c61205e704475fe8126af845c8d923c0996328127" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -412,59 +417,57 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.48.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.48.0", ] [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "approx" @@ -484,16 +487,16 @@ dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "arbitrary" -version = "1.4.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -627,7 +630,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "itertools 0.13.0", "num-bigint", "num-integer", @@ -732,7 +735,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.1", + "rustc_version 0.4.0", "zeroize", ] @@ -763,7 +766,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" dependencies = [ - "quote 1.0.41", + "quote 1.0.40", "syn 1.0.109", ] @@ -773,7 +776,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote 1.0.41", + "quote 1.0.40", "syn 1.0.109", ] @@ -783,8 +786,8 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ - "quote 1.0.41", - "syn 2.0.106", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -795,7 +798,7 @@ checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ "num-bigint", "num-traits", - "quote 1.0.41", + "quote 1.0.40", "syn 1.0.109", ] @@ -807,8 +810,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint", "num-traits", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -820,9 +823,9 @@ checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ "num-bigint", "num-traits", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -863,7 +866,7 @@ dependencies = [ "ark-std 0.5.0", "educe", "fnv", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "rayon", ] @@ -964,8 +967,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -975,9 +978,9 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -1048,25 +1051,24 @@ dependencies = [ [[package]] name = "array-bytes" -version = "6.2.3" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5dde061bd34119e902bbb2d9b90c5692635cf59fb91d582c2b68043f1b8293" +checksum = "6f840fb7195bcfc5e17ea40c26e5ce6d5b9ce5d584466e17703209657e459ae0" [[package]] name = "array-bytes" -version = "9.3.0" +version = "9.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d55334c98d756b32dcceb60248647ab34f027690f87f9a362fd292676ee927" +checksum = "4449507daf4f07a8c8309e122d32a53d15c9f33e77eaf01c839fea42ccd4d673" dependencies = [ "smallvec", - "thiserror 2.0.17", ] [[package]] name = "arrayref" -version = "0.3.9" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" @@ -1085,25 +1087,25 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "asn1-rs" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +checksum = "22ad1373757efa0f70ec53939aabc7152e1591cb485208052993070ac8d2429d" dependencies = [ - "asn1-rs-derive 0.5.1", + "asn1-rs-derive 0.5.0", "asn1-rs-impl", "displaydoc", "nom 7.1.3", "num-traits", "rusticata-macros", - "thiserror 1.0.69", + "thiserror 1.0.65", "time", ] [[package]] name = "asn1-rs" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +checksum = "607495ec7113b178fbba7a6166a27f99e774359ef4823adbefd756b5b81d7970" dependencies = [ "asn1-rs-derive 0.6.0", "asn1-rs-impl", @@ -1111,20 +1113,20 @@ dependencies = [ "nom 7.1.3", "num-traits", "rusticata-macros", - "thiserror 2.0.17", + "thiserror 2.0.12", "time", ] [[package]] name = "asn1-rs-derive" -version = "0.5.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +checksum = "7378575ff571966e99a744addeff0bff98b8ada0dedf1956d59e634db95eaac1" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", - "synstructure 0.13.2", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", + "synstructure 0.13.1", ] [[package]] @@ -1133,10 +1135,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", - "synstructure 0.13.2", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", + "synstructure 0.13.1", ] [[package]] @@ -1145,21 +1147,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "assert_cmd" -version = "2.0.17" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" +checksum = "ed72493ac66d5804837f480ab3766c72bdfab91a65e565fc54fa9e42db0073a8" dependencies = [ "anstyle", "bstr", "doc-comment", - "libc", "predicates", "predicates-core", "predicates-tree", @@ -1537,7 +1538,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ - "quote 1.0.41", + "quote 1.0.40", "syn 1.0.109", ] @@ -1554,11 +1555,12 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +checksum = "9f2776ead772134d55b62dd45e59a79e21612d85d0af729b8b7d3967d601a62a" dependencies = [ "concurrent-queue", + "event-listener 5.3.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -1566,69 +1568,99 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" dependencies = [ + "async-lock 2.8.0", "async-task", "concurrent-queue", - "fastrand 2.3.0", - "futures-lite 2.6.1", - "pin-project-lite", + "fastrand 1.9.0", + "futures-lite 1.13.0", "slab", ] [[package]] name = "async-fs" -version = "2.2.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ - "async-lock", + "async-lock 3.4.0", "blocking", - "futures-lite 2.6.1", + "futures-lite 2.3.0", ] [[package]] name = "async-global-executor" -version = "2.4.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" dependencies = [ - "async-channel 2.5.0", + "async-channel 1.9.0", "async-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "blocking", - "futures-lite 2.6.1", + "futures-lite 1.13.0", "once_cell", ] [[package]] name = "async-io" -version = "2.6.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ + "async-lock 2.8.0", "autocfg", "cfg-if", "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.23", + "slab", + "socket2 0.4.9", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", "futures-io", - "futures-lite 2.6.1", + "futures-lite 2.3.0", "parking", - "polling 3.11.0", - "rustix 1.1.2", + "polling 3.4.0", + "rustix 0.38.42", "slab", - "windows-sys 0.61.1", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", ] [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -1639,64 +1671,65 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io", + "async-io 2.3.3", "blocking", - "futures-lite 2.6.1", + "futures-lite 2.3.0", ] [[package]] name = "async-process" -version = "2.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock", + "async-channel 2.3.0", + "async-io 2.3.3", + "async-lock 3.4.0", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", - "futures-lite 2.6.1", - "rustix 1.1.2", + "event-listener 5.3.1", + "futures-lite 2.3.0", + "rustix 0.38.42", + "tracing", ] [[package]] name = "async-signal" -version = "0.2.13" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32" dependencies = [ - "async-io", - "async-lock", + "async-io 2.3.3", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 1.1.2", + "rustix 0.38.42", "signal-hook-registry", "slab", - "windows-sys 0.61.1", + "windows-sys 0.52.0", ] [[package]] name = "async-std" -version = "1.13.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ "async-attributes", "async-channel 1.9.0", "async-global-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 2.6.1", - "gloo-timers 0.3.0", + "futures-lite 1.13.0", + "gloo-timers", "kv-log-macro", "log", "memchr", @@ -1709,9 +1742,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", @@ -1720,13 +1753,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -1737,13 +1770,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -1789,9 +1822,9 @@ checksum = "a8ab6b55fe97976e46f91ddbed8d147d966475dc29b2032757ba47e02376fbc3" [[package]] name = "atomic-waker" -version = "1.1.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" [[package]] name = "attohttpc" @@ -1799,7 +1832,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" dependencies = [ - "http 0.2.12", + "http 0.2.9", "log", "url", ] @@ -1820,16 +1853,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "autocfg" -version = "1.5.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "average" @@ -1854,24 +1887,24 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.10", "instant", "rand 0.8.5", ] [[package]] name = "backtrace" -version = "0.3.76" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ - "addr2line 0.25.1", + "addr2line 0.21.0", + "cc", "cfg-if", "libc", "miniz_oxide", - "object 0.37.3", + "object 0.32.2", "rustc-demangle", - "windows-link 0.2.0", ] [[package]] @@ -1886,22 +1919,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base256emoji" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" -dependencies = [ - "const-str", - "match-lookup", -] - [[package]] name = "base58" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.7" @@ -1916,15 +1945,15 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "binary-merkle-tree" version = "13.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "hash-db", "log", "parity-scale-codec", @@ -1951,28 +1980,27 @@ dependencies = [ "cexpr", "clang-sys", "itertools 0.13.0", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "bip32" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db40d3dfbeab4e031d78c844642fa0caa0b0db11ce1607ac9d2986dff1405c69" +checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" dependencies = [ "bs58", "hmac 0.12.1", "k256", "rand_core 0.6.4", "ripemd", - "secp256k1 0.27.0", "sha2 0.10.9", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] @@ -2023,7 +2051,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" dependencies = [ "bitcoin-internals", - "hex-conservative 0.1.2", + "hex-conservative 0.1.1", ] [[package]] @@ -2097,37 +2125,37 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" dependencies = [ "arrayref", "arrayvec 0.7.6", - "constant_time_eq 0.3.1", + "constant_time_eq 0.3.0", ] [[package]] name = "blake2s_simd" -version = "1.0.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" +checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" dependencies = [ "arrayref", "arrayvec 0.7.6", - "constant_time_eq 0.3.1", + "constant_time_eq 0.2.6", ] [[package]] name = "blake3" -version = "1.8.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" dependencies = [ "arrayref", "arrayvec 0.7.6", "cc", "cfg-if", - "constant_time_eq 0.3.1", + "constant_time_eq 0.3.0", ] [[package]] @@ -2150,22 +2178,24 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.2" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" dependencies = [ - "async-channel 2.5.0", + "async-channel 1.9.0", + "async-lock 2.8.0", "async-task", - "futures-io", - "futures-lite 2.6.1", - "piper", + "atomic-waker", + "fastrand 1.9.0", + "futures-lite 1.13.0", + "log", ] [[package]] name = "blst" -version = "0.3.16" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" dependencies = [ "cc", "glob", @@ -2187,9 +2217,9 @@ dependencies = [ [[package]] name = "bounded-collections" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ad8a0bed7827f0b07a5d23cec2e58cc02038a99e4ca81616cb2bb2025f804d" +checksum = "32ed0a820ed50891d36358e997d27741a6142e382242df40ff01c89bcdcc7a2b" dependencies = [ "log", "parity-scale-codec", @@ -2207,7 +2237,7 @@ dependencies = [ "log", "parity-scale-codec", "scale-info", - "schemars 1.0.4", + "schemars", "serde", ] @@ -2217,7 +2247,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68534a48cbf63a4b1323c433cf21238c9ec23711e0df13b08c33e5c2082663ce" dependencies = [ - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -2938,12 +2968,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", - "regex-automata", + "regex-automata 0.3.6", "serde", ] @@ -2979,9 +3009,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" [[package]] name = "byteorder" @@ -3000,19 +3030,20 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.13+1.0.8" +version = "0.1.11+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" dependencies = [ "cc", + "libc", "pkg-config", ] [[package]] name = "c-kzg" -version = "2.1.4" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137a2a2878ed823ef1bd73e5441e245602aae5360022113b8ad259ca4b5b8727" +checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" dependencies = [ "blst", "cc", @@ -3035,18 +3066,18 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.1" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" dependencies = [ - "serde_core", + "serde", ] [[package]] name = "cargo-platform" -version = "0.1.9" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" dependencies = [ "serde", ] @@ -3059,10 +3090,10 @@ checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", - "semver 1.0.27", + "semver 1.0.18", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -3079,9 +3110,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.2.39" +version = "1.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" dependencies = [ "find-msvc-tools", "jobserver", @@ -3106,18 +3137,18 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.8" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" dependencies = [ "smallvec", ] [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" @@ -3188,23 +3219,24 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link", ] [[package]] name = "ciborium" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", @@ -3213,15 +3245,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half", @@ -3248,7 +3280,7 @@ checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" dependencies = [ "core2", "multibase", - "multihash 0.19.3", + "multihash 0.19.1", "unsigned-varint 0.8.0", ] @@ -3274,9 +3306,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.8.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", @@ -3284,9 +3316,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.48" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", "clap_derive", @@ -3294,9 +3326,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.48" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", @@ -3307,39 +3339,39 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.58" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75bf0b32ad2e152de789bb635ea4d3078f6b838ad7974143e99b99f45a04af4a" +checksum = "aa3c596da3cf0983427b0df0dba359df9182c13bd5b519b585a482b0c351f4e8" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "cmd_lib" -version = "1.9.6" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1af0f9b65935ff457da75535a6b6ff117ac858f03f71191188b3b696f90aec5a" +checksum = "371c15a3c178d0117091bd84414545309ca979555b1aad573ef591ad58818d41" dependencies = [ "cmd_lib_macros", - "env_logger 0.10.2", + "env_logger 0.10.1", "faccess", "lazy_static", "log", @@ -3348,24 +3380,25 @@ dependencies = [ [[package]] name = "cmd_lib_macros" -version = "1.9.6" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e69eee115667ccda8b9ed7010bcf13356ad45269fc92aa78534890b42809a64" +checksum = "cb844bd05be34d91eb67101329aeba9d3337094c04fd8507d821db7ebb488eaf" dependencies = [ "proc-macro-error2", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "coarsetime" -version = "0.1.36" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91849686042de1b41cd81490edc83afbcb0abe5a9b6f2c4114f23ce8cca1bcf4" +checksum = "a90d114103adbc625300f346d4d09dfb4ab1c4a8df6868435dd903392ecf4354" dependencies = [ "libc", - "wasix", + "once_cell", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -3375,18 +3408,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "codespan-reporting" -version = "0.12.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "serde", "termcolor", - "unicode-width", + "unicode-width 0.1.10", ] [[package]] @@ -3510,9 +3542,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" dependencies = [ "backtrace", "eyre", @@ -3523,46 +3555,47 @@ dependencies = [ [[package]] name = "color-print" -version = "0.3.7" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aa954171903797d5623e047d9ab69d91b493657917bdfb8c2c80ecaf9cdb6f4" +checksum = "f2a5e6504ed8648554968650feecea00557a3476bc040d0ffc33080e66b646d0" dependencies = [ "color-print-proc-macro", ] [[package]] name = "color-print-proc-macro" -version = "0.3.7" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692186b5ebe54007e45a59aea47ece9eb4108e141326c304cdc91699a7118a22" +checksum = "d51beaa537d73d2d1ff34ee70bc095f170420ab2ec5d687ecd3ec2b0d092514b" dependencies = [ "nom 7.1.3", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 1.0.109", ] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" -version = "2.2.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" dependencies = [ + "is-terminal", "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] name = "combine" -version = "4.6.7" +version = "4.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" dependencies = [ "bytes", "memchr", @@ -3570,12 +3603,12 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.2.1" +version = "7.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b7db8e0b4b2fdad6c551e634134e99ec000e5c8c3b6856c65e8bbaded7a3b" +checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" dependencies = [ "unicode-segmentation", - "unicode-width", + "unicode-width 0.2.0", ] [[package]] @@ -3595,15 +3628,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.11" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", + "lazy_static", "libc", - "once_cell", - "unicode-width", - "windows-sys 0.59.0", + "unicode-width 0.1.10", + "windows-sys 0.52.0", ] [[package]] @@ -3618,48 +3651,45 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.16.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6407bff74dea37e0fa3dc1c1c974e5d46405f0c987bf9997a0762adce71eda6" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if", "cpufeatures", + "hex", "proptest", - "serde_core", + "serde", ] [[package]] name = "const-oid" -version = "0.9.6" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "const-random" -version = "0.1.18" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" dependencies = [ "const-random-macro", + "proc-macro-hack", ] [[package]] name = "const-random-macro" -version = "0.1.16" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.10", "once_cell", + "proc-macro-hack", "tiny-keccak", ] -[[package]] -name = "const-str" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" - [[package]] name = "const_format" version = "0.2.34" @@ -3675,9 +3705,9 @@ version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "unicode-xid 0.2.6", + "proc-macro2 1.0.95", + "quote 1.0.40", + "unicode-xid 0.2.4", ] [[package]] @@ -3688,9 +3718,15 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] name = "convert_case" @@ -3717,21 +3753,11 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" -version = "0.8.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core2" @@ -3941,9 +3967,9 @@ dependencies = [ [[package]] name = "cpp_demangle" -version = "0.4.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" dependencies = [ "cfg-if", ] @@ -3960,9 +3986,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.17" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -4020,7 +4046,7 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli 0.31.1", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "log", "pulley-interpreter", "regalloc2 0.12.2", @@ -4106,9 +4132,9 @@ checksum = "b530783809a55cb68d070e0de60cfbb3db0dc94c8850dd5725411422bedcf6bb" [[package]] name = "crc" -version = "3.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ "crc-catalog", ] @@ -4121,9 +4147,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] @@ -4183,53 +4209,58 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ + "autocfg", + "cfg-if", "crossbeam-utils", + "memoffset", + "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.12" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" -version = "0.2.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.5" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] @@ -4261,7 +4292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ "generic-array 0.14.7", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -4275,7 +4306,7 @@ dependencies = [ "generic-array 0.14.7", "poly1305", "salsa20", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] @@ -4290,20 +4321,19 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" dependencies = [ - "dispatch", - "nix 0.30.1", - "windows-sys 0.61.1", + "nix 0.29.0", + "windows-sys 0.59.0", ] [[package]] name = "cumulus-client-bootnodes" version = "0.1.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "cumulus-primitives-core", "cumulus-relay-chain-interface", @@ -4352,7 +4382,7 @@ dependencies = [ "cumulus-test-runtime", "futures", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -4385,7 +4415,7 @@ dependencies = [ "cumulus-test-relay-sproof-builder", "futures", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", @@ -4472,7 +4502,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -4484,7 +4514,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-relay-chain-interface", "futures", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-consensus", "sp-api", "sp-block-builder", @@ -4509,7 +4539,7 @@ dependencies = [ "futures", "futures-timer", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-parachain-primitives", @@ -4682,7 +4712,7 @@ dependencies = [ "frame-support", "frame-system", "futures", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "hex-literal", "impl-trait-for-tuples", "log", @@ -4719,10 +4749,10 @@ dependencies = [ name = "cumulus-pallet-parachain-system-proc-macro" version = "0.6.0" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -4840,7 +4870,7 @@ dependencies = [ "sp-io", "sp-maybe-compressed-blob", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] @@ -4982,14 +5012,14 @@ dependencies = [ "sp-blockchain", "sp-state-machine", "sp-version", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "cumulus-relay-chain-minimal-node" version = "0.7.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "async-trait", "cumulus-client-bootnodes", @@ -5254,7 +5284,7 @@ version = "0.1.0" dependencies = [ "anyhow", "cumulus-zombienet-sdk-helpers", - "env_logger 0.11.8", + "env_logger 0.11.3", "futures", "log", "polkadot-primitives", @@ -5272,24 +5302,24 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.49" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" +checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.6.0", - "windows-sys 0.59.0", + "socket2 0.5.9", + "windows-sys 0.52.0", ] [[package]] name = "curl-sys" -version = "0.4.83+curl-8.15.0" +version = "0.4.72+curl-8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5830daf304027db10c82632a464879d46a3f7c4ba17a31592657ad16c719b483" +checksum = "29cbdc8314c447d11e8fd156dcdd031d9e02a7a976163e396b548c03153bc9ea" dependencies = [ "cc", "libc", @@ -5298,7 +5328,7 @@ dependencies = [ "openssl-sys", "pkg-config", "vcpkg", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5312,20 +5342,20 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "rustc_version 0.4.1", - "subtle 2.6.1", + "rustc_version 0.4.0", + "subtle 2.5.0", "zeroize", ] [[package]] name = "curve25519-dalek-derive" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -5343,75 +5373,56 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.186" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9c4fe7f2f5dc5c62871a1b43992d197da6fa1394656a94276ac2894a90a6fe" +checksum = "28403c86fc49e3401fdf45499ba37fad6493d9329449d6449d7f0e10f4654d28" dependencies = [ "cc", - "cxx-build", - "cxxbridge-cmd", "cxxbridge-flags", "cxxbridge-macro", - "foldhash 0.2.0", "link-cplusplus", ] [[package]] name = "cxx-build" -version = "1.0.186" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5cf2909d37d80633ddd208676fc27c2608a7f035fff69c882421168038b26dd" +checksum = "78da94fef01786dc3e0c76eafcd187abcaa9972c78e05ff4041e24fdf059c285" dependencies = [ "cc", "codespan-reporting", - "indexmap 2.11.4", - "proc-macro2 1.0.101", - "quote 1.0.41", + "once_cell", + "proc-macro2 1.0.95", + "quote 1.0.40", "scratch", - "syn 2.0.106", -] - -[[package]] -name = "cxxbridge-cmd" -version = "1.0.186" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "077f5ee3d3bfd8d27f83208fdaa96ddd50af7f096c77077cc4b94da10bfacefd" -dependencies = [ - "clap", - "codespan-reporting", - "indexmap 2.11.4", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "cxxbridge-flags" -version = "1.0.186" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0108748615125b9f2e915dfafdffcbdabbca9b15102834f6d7e9a768f2f2864" +checksum = "e2a6f5e1dfb4b34292ad4ea1facbfdaa1824705b231610087b00b17008641809" [[package]] name = "cxxbridge-macro" -version = "1.0.186" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e896681ef9b8dc462cfa6961d61909704bde0984b30bcb4082fe102b478890" +checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ - "indexmap 2.11.4", - "proc-macro2 1.0.101", - "quote 1.0.41", - "rustversion", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "darling" -version = "0.20.11" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] @@ -5426,16 +5437,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.11" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "strsim", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -5446,21 +5457,21 @@ checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "strsim", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "darling_macro" -version = "0.20.11" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.11", - "quote 1.0.41", - "syn 2.0.106", + "darling_core 0.20.10", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -5470,34 +5481,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", - "quote 1.0.41", - "syn 2.0.106", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "dashmap" -version = "5.5.3" +version = "5.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "edd72493923899c6f10c641bdbdeddc7183d6396641d99c1a0d1597f37f92e28" dependencies = [ "cfg-if", "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.11", + "parking_lot_core 0.9.8", ] [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "data-encoding-macro" -version = "0.1.18" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" +checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -5505,12 +5516,12 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.16" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" +checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" dependencies = [ "data-encoding", - "syn 2.0.106", + "syn 1.0.109", ] [[package]] @@ -5524,9 +5535,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.10" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "pem-rfc7468", @@ -5539,7 +5550,7 @@ version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" dependencies = [ - "asn1-rs 0.6.2", + "asn1-rs 0.6.1", "displaydoc", "nom 7.1.3", "num-bigint", @@ -5553,7 +5564,7 @@ version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" dependencies = [ - "asn1-rs 0.7.1", + "asn1-rs 0.7.0", "displaydoc", "nom 7.1.3", "num-bigint", @@ -5563,12 +5574,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.4" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", - "serde_core", + "serde", ] [[package]] @@ -5577,8 +5588,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -5588,9 +5599,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -5599,33 +5610,33 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "derive_arbitrary" -version = "1.4.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "derive_more" -version = "0.99.20" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case 0.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "rustc_version 0.4.1", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "rustc_version 0.4.0", + "syn 1.0.109", ] [[package]] @@ -5652,9 +5663,9 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -5664,10 +5675,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "convert_case 0.7.1", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", - "unicode-xid 0.2.6", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", + "unicode-xid 0.2.4", ] [[package]] @@ -5709,7 +5720,7 @@ dependencies = [ "block-buffer 0.10.4", "const-oid", "crypto-common", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -5763,38 +5774,30 @@ dependencies = [ "winapi", ] -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "dissimilar" -version = "1.0.10" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8975ffdaa0ef3661bfe02dbdcc06c9f829dfafe6a3c474de366a8d5e44276921" +checksum = "86e3bdc80eee6e16b2b6b0f87fbc98c04bee3455e35174c0de1a125d0688c632" [[package]] name = "dlmalloc" -version = "0.2.11" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06cdfe340b16dd990c54cce79743613fa09fbb16774f33a77c9fd196f8f3fa30" +checksum = "203540e710bfadb90e5e29930baf5d10270cec1f43ab34f46f78b147b2de715a" dependencies = [ - "cfg-if", "libc", - "windows-sys 0.60.2", ] [[package]] @@ -5821,12 +5824,12 @@ dependencies = [ "common-path", "derive-syn-parse", "once_cell", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "regex", - "syn 2.0.106", + "syn 2.0.98", "termcolor", - "toml 0.8.23", + "toml", "walkdir", ] @@ -5844,9 +5847,9 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "downcast-rs" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "drawille" @@ -5860,21 +5863,21 @@ dependencies = [ [[package]] name = "dtoa" -version = "1.0.10" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "dunce" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "dyn-clonable" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36efbb9bfd58e1723780aa04b61aba95ace6a05d9ffabfdb0b43672552f0805" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" dependencies = [ "dyn-clonable-impl", "dyn-clone", @@ -5882,20 +5885,20 @@ dependencies = [ [[package]] name = "dyn-clonable-impl" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8671d54058979a37a26f3511fbf8d198ba1aa35ffb202c42587d918d77213a" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 1.0.109", ] [[package]] name = "dyn-clone" -version = "1.0.20" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "easy-cast" @@ -5908,9 +5911,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.9" +version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ "der", "digest 0.10.7", @@ -5923,9 +5926,9 @@ dependencies = [ [[package]] name = "ed25519" -version = "2.2.3" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ "pkcs8", "signature", @@ -5933,32 +5936,31 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", "rand_core 0.6.4", "serde", "sha2 0.10.9", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] [[package]] name = "ed25519-zebra" -version = "4.1.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0017d969298eec91e3db7a2985a8cab4df6341d86e6f3a6f5878b13fb7846bc9" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ "curve25519-dalek", "ed25519", - "hashbrown 0.15.5", - "pkcs8", + "hashbrown 0.14.5", + "hex", "rand_core 0.6.4", "sha2 0.10.9", - "subtle 2.6.1", "zeroize", ] @@ -5969,9 +5971,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -5999,7 +6001,7 @@ dependencies = [ "rand_core 0.6.4", "sec1", "serdect", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] @@ -6059,29 +6061,29 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "1.0.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] [[package]] name = "enum-as-inner" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" dependencies = [ - "heck 0.5.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "heck 0.4.1", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -6099,40 +6101,40 @@ version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "enumflags2" -version = "0.7.12" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.12" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "enumn" -version = "0.1.14" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -6157,9 +6159,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.10.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" dependencies = [ "humantime", "is-terminal", @@ -6170,14 +6172,14 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" dependencies = [ "anstream", "anstyle", "env_filter", - "jiff", + "humantime", "log", ] @@ -6189,9 +6191,9 @@ checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "equivocation-detector" @@ -6209,13 +6211,11 @@ dependencies = [ [[package]] name = "erased-serde" -version = "0.4.8" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" +checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" dependencies = [ "serde", - "serde_core", - "typeid", ] [[package]] @@ -6230,12 +6230,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.14" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.61.1", + "windows-sys 0.59.0", ] [[package]] @@ -6305,9 +6305,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.1" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -6316,11 +6316,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.3.1", "pin-project-lite", ] @@ -6343,16 +6343,16 @@ dependencies = [ "file-guard", "fs-err", "prettyplease", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "eyre" -version = "0.6.12" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" dependencies = [ "indenter", "once_cell", @@ -6382,8 +6382,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" dependencies = [ "bit-set", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -6430,7 +6430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec6f82451ff7f0568c6181287189126d492b5654e30a788add08027b6363d019" dependencies = [ "fatality-proc-macro", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -6440,11 +6440,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb42427514b063d97ce21d5199f36c0c307d981434a6be32582bc79fe5bd2303" dependencies = [ "expander", - "indexmap 2.11.4", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "indexmap 2.9.0", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -6454,7 +6454,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" dependencies = [ "libc", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -6475,19 +6475,19 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] name = "fiat-crypto" -version = "0.2.9" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "file-guard" @@ -6501,14 +6501,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if", "libc", - "libredox", - "windows-sys 0.60.2", + "redox_syscall 0.3.5", + "windows-sys 0.48.0", ] [[package]] @@ -6523,7 +6523,7 @@ dependencies = [ "log", "num-traits", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "scale-info", ] @@ -6539,15 +6539,15 @@ dependencies = [ "futures", "log", "num-traits", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "relay-utils", ] [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" [[package]] name = "findshlibs" @@ -6589,17 +6589,11 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - [[package]] name = "flate2" -version = "1.1.2" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -6634,12 +6628,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - [[package]] name = "foreign-types" version = "0.3.2" @@ -6664,9 +6652,9 @@ dependencies = [ [[package]] name = "form_urlencoded" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -6678,7 +6666,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835f84f38484cc86f110a805655697908257fb9a7af005234060891557198e9" dependencies = [ "nonempty", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -6693,15 +6681,15 @@ dependencies = [ [[package]] name = "fragile" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "frame-benchmarking" version = "28.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "frame-support", "frame-support-procedural", "frame-system", @@ -6731,7 +6719,7 @@ name = "frame-benchmarking-cli" version = "32.0.0" dependencies = [ "Inflector", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "chrono", "clap", "comfy-table", @@ -6788,7 +6776,7 @@ dependencies = [ "substrate-test-runtime", "subxt 0.43.0", "subxt-signer 0.43.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "thousands", "westend-runtime", ] @@ -6812,7 +6800,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7cb8796f93fa038f979a014234d632e9688a120e745f936e2635123c77537f7" dependencies = [ - "frame-metadata 21.0.0", + "frame-metadata 20.0.0", "parity-scale-codec", "scale-decode", "scale-info", @@ -6841,12 +6829,12 @@ dependencies = [ "frame-election-provider-support", "frame-support", "parity-scale-codec", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", "scale-info", "sp-arithmetic", - "syn 2.0.106", + "syn 2.0.98", "trybuild", ] @@ -6886,7 +6874,7 @@ name = "frame-executive" version = "28.0.0" dependencies = [ "aquamarine", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "frame-support", "frame-system", "frame-try-runtime", @@ -6916,17 +6904,6 @@ dependencies = [ "serde", ] -[[package]] -name = "frame-metadata" -version = "21.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20dfd1d7eae1d94e32e869e2fb272d81f52dd8db57820a373adb83ea24d7d862" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "scale-info", -] - [[package]] name = "frame-metadata" version = "23.0.0" @@ -6943,7 +6920,7 @@ dependencies = [ name = "frame-metadata-hash-extension" version = "0.1.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "const-hex", "docify", "frame-metadata 23.0.0", @@ -6976,7 +6953,7 @@ dependencies = [ "sp-runtime", "sp-statement-store", "tempfile", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] @@ -7020,7 +6997,7 @@ version = "28.0.0" dependencies = [ "Inflector", "aquamarine", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "binary-merkle-tree", "bitflags 1.3.2", "docify", @@ -7077,15 +7054,15 @@ dependencies = [ "parity-scale-codec", "pretty_assertions", "proc-macro-warning", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "regex", "scale-info", "sp-crypto-hashing 0.1.0", "sp-io", "sp-metadata-ir", "sp-runtime", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -7093,19 +7070,19 @@ name = "frame-support-procedural-tools" version = "10.0.0" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "frame-support-procedural-tools-derive" version = "11.0.0" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -7227,12 +7204,9 @@ dependencies = [ [[package]] name = "fs-err" -version = "2.11.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] +checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" [[package]] name = "fs2" @@ -7250,7 +7224,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f9df8a11882c4e3335eb2d18a0137c505d9ca927470b0cac9c6f0ae07d28f7" dependencies = [ - "rustix 0.38.44", + "rustix 0.38.42", "windows-sys 0.48.0", ] @@ -7327,7 +7301,7 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.4", + "parking_lot 0.12.3", ] [[package]] @@ -7353,9 +7327,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.6.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "fastrand 2.3.0", "futures-core", @@ -7370,9 +7344,9 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -7382,7 +7356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.32", + "rustls 0.23.18", "rustls-pki-types", ] @@ -7404,7 +7378,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" dependencies = [ - "gloo-timers 0.2.6", + "gloo-timers", "send_wrapper", ] @@ -7461,6 +7435,19 @@ dependencies = [ "sp-staking", ] +[[package]] +name = "generator" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.58.0", +] + [[package]] name = "generic-array" version = "0.12.4" @@ -7493,29 +7480,25 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", - "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", - "wasi 0.14.7+wasi-0.2.4", - "wasm-bindgen", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", ] [[package]] @@ -7530,14 +7513,20 @@ dependencies = [ [[package]] name = "ghash" -version = "0.5.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" dependencies = [ - "opaque-debug 0.3.1", + "opaque-debug 0.3.0", "polyval", ] +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + [[package]] name = "gimli" version = "0.31.1" @@ -7545,21 +7534,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", - "indexmap 2.11.4", + "indexmap 2.9.0", "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - [[package]] name = "git2" -version = "0.20.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +checksum = "3fda788993cc341f69012feba8bf45c0ba4f3291fcc08e214b4d5a7332d88aff" dependencies = [ "bitflags 2.9.4", "libc", @@ -7570,9 +7553,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "glob-match" @@ -7590,12 +7573,12 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http 1.3.1", + "http 1.1.0", "js-sys", "pin-project", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -7613,18 +7596,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "gloo-utils" version = "0.2.0" @@ -7686,9 +7657,9 @@ dependencies = [ [[package]] name = "gmp-mpfr-sys" -version = "1.6.8" +version = "1.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" +checksum = "a636fb6a653382a379ee1e5593dacdc628667994167024c143214cafd40c1a86" dependencies = [ "libc", "windows-sys 0.60.2", @@ -7716,9 +7687,9 @@ dependencies = [ [[package]] name = "governor" -version = "0.6.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4" dependencies = [ "cfg-if", "dashmap", @@ -7726,12 +7697,10 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.4", - "portable-atomic", + "parking_lot 0.12.3", "quanta", "rand 0.8.5", "smallvec", - "spinning_top", ] [[package]] @@ -7742,22 +7711,22 @@ checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core 0.6.4", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] name = "h2" -version = "0.3.27" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.12", - "indexmap 2.11.4", + "http 0.2.9", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -7766,17 +7735,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.11.4", + "http 1.1.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -7785,26 +7754,22 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" -dependencies = [ - "cfg-if", - "crunchy", -] +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "handlebars" -version = "5.1.2" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +checksum = "ab283476b99e66691dee3f1640fea91487a8d81f50fb5ecc75538f8f8879a1e4" dependencies = [ "log", "pest", "pest_derive", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -7850,23 +7815,13 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", - "foldhash 0.1.5", - "serde", -] - -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" -dependencies = [ - "foldhash 0.2.0", + "foldhash", "serde", ] @@ -7881,11 +7836,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.10.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.14.5", ] [[package]] @@ -7902,21 +7857,24 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-conservative" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" [[package]] name = "hex-conservative" @@ -7935,9 +7893,9 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hickory-proto" -version = "0.24.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" dependencies = [ "async-trait", "cfg-if", @@ -7946,12 +7904,12 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.4.0", "ipnet", "once_cell", "rand 0.8.5", - "socket2 0.5.10", - "thiserror 1.0.69", + "socket2 0.5.9", + "thiserror 1.0.65", "tinyvec", "tokio", "tracing", @@ -7971,12 +7929,12 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 1.0.3", "ipnet", "once_cell", - "rand 0.9.2", - "ring 0.17.14", - "thiserror 2.0.17", + "rand 0.9.0", + "ring 0.17.8", + "thiserror 2.0.12", "tinyvec", "tokio", "tracing", @@ -7985,21 +7943,21 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.4" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" dependencies = [ "cfg-if", "futures-util", - "hickory-proto 0.24.4", + "hickory-proto 0.24.1", "ipconfig", "lru-cache", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "resolv-conf", "smallvec", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tracing", ] @@ -8016,11 +7974,11 @@ dependencies = [ "ipconfig", "moka", "once_cell", - "parking_lot 0.12.4", - "rand 0.9.2", + "parking_lot 0.12.3", + "rand 0.9.0", "resolv-conf", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio", "tracing", ] @@ -8066,31 +8024,41 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "honggfuzz" -version = "0.5.58" +version = "0.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8319f3cc8fe416e7aa1ab95dcc04fd49f35397a47d0b2f0f225f6dba346a07" +checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" dependencies = [ "arbitrary", "lazy_static", - "memmap2 0.9.8", - "rustc_version 0.4.1", - "semver 1.0.27", + "memmap2 0.5.10", + "rustc_version 0.4.0", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", ] [[package]] name = "http" -version = "0.2.12" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -8099,9 +8067,9 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -8110,35 +8078,35 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", - "http 0.2.12", + "http 0.2.9", "pin-project-lite", ] [[package]] name = "http-body" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http 1.3.1", + "http 1.1.0", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", - "http 1.3.1", - "http-body 1.0.1", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -8150,9 +8118,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" -version = "1.10.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -8162,9 +8130,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.3.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "humantime-serde" @@ -8178,22 +8146,22 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.32" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", + "h2 0.3.26", + "http 0.2.9", + "http-body 0.4.5", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.5.9", "tokio", "tower-service", "tracing", @@ -8202,22 +8170,20 @@ dependencies = [ [[package]] name = "hyper" -version = "1.7.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ - "atomic-waker", "bytes", "futures-channel", - "futures-core", - "h2 0.4.12", - "http 1.3.1", - "http-body 1.0.1", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", "httparse", "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -8230,10 +8196,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http 0.2.12", - "hyper 0.14.32", + "http 0.2.9", + "hyper 0.14.29", "log", - "rustls 0.21.12", + "rustls 0.21.7", "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", @@ -8241,21 +8207,22 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ - "http 1.3.1", - "hyper 1.7.0", + "futures-util", + "http 1.1.0", + "hyper 1.6.0", "hyper-util", "log", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.18", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.0", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots 0.26.3", ] [[package]] @@ -8264,7 +8231,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper 0.14.32", + "hyper 0.14.29", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -8278,7 +8245,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.7.0", + "hyper 1.6.0", "hyper-util", "native-tls", "tokio", @@ -8288,43 +8255,35 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ - "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.7.0", - "ipnet", - "libc", - "percent-encoding", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.6.0", "pin-project-lite", - "socket2 0.6.0", - "system-configuration", + "socket2 0.5.9", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", - "log", "wasm-bindgen", - "windows-core 0.62.1", + "windows 0.48.0", ] [[package]] @@ -8338,22 +8297,21 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", @@ -8362,11 +8320,31 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", @@ -8374,54 +8352,67 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", + "utf16_iter", + "utf8_iter", + "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] name = "icu_properties" -version = "2.0.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", - "icu_locale_core", + "icu_locid_transform", "icu_properties_data", "icu_provider", - "potential_utf", - "zerotrie", + "tinystr", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", - "icu_locale_core", + "icu_locid", + "icu_provider_macros", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", - "zerotrie", "zerovec", ] +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -8430,20 +8421,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "idna_adapter" -version = "1.2.1" +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", @@ -8461,25 +8462,21 @@ dependencies = [ [[package]] name = "if-watch" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" +checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" dependencies = [ - "async-io", - "core-foundation 0.9.4", + "async-io 2.3.3", + "core-foundation", "fnv", "futures", "if-addrs", "ipnet", "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-proto", - "netlink-sys", "rtnetlink", - "system-configuration", + "system-configuration 0.5.1", "tokio", - "windows 0.53.0", + "windows 0.51.1", ] [[package]] @@ -8492,8 +8489,8 @@ dependencies = [ "attohttpc", "bytes", "futures", - "http 0.2.12", - "hyper 0.14.32", + "http 0.2.9", + "hyper 0.14.29", "log", "rand 0.8.5", "tokio", @@ -8554,35 +8551,35 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "include_dir" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", ] [[package]] name = "indenter" -version = "0.3.4" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" @@ -8597,14 +8594,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.3", "serde", - "serde_core", ] [[package]] @@ -8615,22 +8611,22 @@ checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" [[package]] name = "indicatif" -version = "0.17.11" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" dependencies = [ "console", + "instant", "number_prefix", "portable-atomic", - "unicode-width", - "web-time", + "unicode-width 0.1.10", ] [[package]] name = "inout" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ "generic-array 0.14.7", ] @@ -8654,14 +8650,14 @@ dependencies = [ ] [[package]] -name = "io-uring" -version = "0.7.10" +name = "io-lifetimes" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "bitflags 2.9.4", - "cfg-if", + "hermit-abi", "libc", + "windows-sys 0.48.0", ] [[package]] @@ -8676,7 +8672,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.10", + "socket2 0.5.9", "widestring", "windows-sys 0.48.0", "winreg", @@ -8684,46 +8680,30 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" -dependencies = [ - "memchr", - "serde", -] +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.16" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", - "libc", - "windows-sys 0.59.0", + "rustix 0.38.42", + "windows-sys 0.48.0", ] [[package]] name = "is_executable" -version = "1.0.5" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baabb8b4867b26294d818bf3f651a454b6901431711abb96e296245888d6e8c4" +checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8" dependencies = [ - "windows-sys 0.60.2", + "winapi", ] -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "isahc" version = "1.7.2" @@ -8738,7 +8718,7 @@ dependencies = [ "encoding_rs", "event-listener 2.5.3", "futures-lite 1.13.0", - "http 0.2.12", + "http 0.2.9", "log", "mime", "once_cell", @@ -8798,9 +8778,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "ittapi" @@ -8824,9 +8804,9 @@ dependencies = [ [[package]] name = "jam-codec" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb948eace373d99de60501a02fb17125d30ac632570de20dccc74370cdd611b9" +checksum = "d72f2fb8cfd27f6c52ea7d0528df594f7f2ed006feac153e9393ec567aafea98" dependencies = [ "arrayvec 0.7.6", "bitvec", @@ -8840,54 +8820,28 @@ dependencies = [ [[package]] name = "jam-codec-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "319af585c4c8a6b5552a52b7787a1ab3e4d59df7614190b1f85b9b842488789d" -dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", -] - -[[package]] -name = "jiff" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" -dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde", -] - -[[package]] -name = "jiff-static" -version = "0.2.15" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +checksum = "09985146f40378e13af626964ac9c206d9d9b67c40c70805898d9954f709bcf5" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "jni" -version = "0.21.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" dependencies = [ "cesu8", - "cfg-if", "combine", "jni-sys", "log", - "thiserror 1.0.69", + "thiserror 1.0.65", "walkdir", - "windows-sys 0.45.0", ] [[package]] @@ -8898,21 +8852,19 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ - "once_cell", "wasm-bindgen", ] @@ -8924,7 +8876,7 @@ checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" dependencies = [ "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -8937,7 +8889,7 @@ dependencies = [ "pest_derive", "regex", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -8953,9 +8905,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.24.9" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b26c20e2178756451cfeb0661fb74c47dd5988cb7e3939de7e9241fd604d42" +checksum = "834af00800e962dee8f7bfc0f60601de215e73e78e5497d733a2919da837d3c8" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -8971,24 +8923,24 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bacb85abf4117092455e1573625e21b8f8ef4dec8aff13361140b2dc266cdff2" +checksum = "548125b159ba1314104f5bb5f38519e03a41862786aa3925cf349aae9cdd546e" dependencies = [ "base64 0.22.1", "futures-channel", "futures-util", "gloo-net", - "http 1.3.1", + "http 1.1.0", "jsonrpsee-core", "pin-project", - "rustls 0.23.32", + "rustls 0.23.18", "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.0", "tokio-util", "tracing", "url", @@ -8996,25 +8948,25 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456196007ca3a14db478346f58c7238028d55ee15c1df15115596e411ff27925" +checksum = "f2882f6f8acb9fdaec7cefc4fd607119a9bd709831df7d7672a1d3b644628280" dependencies = [ "async-trait", "bytes", "futures-timer", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http 1.1.0", + "http-body 1.0.0", "http-body-util", "jsonrpsee-types", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-stream", "tracing", @@ -9023,53 +8975,53 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c872b6c9961a4ccc543e321bb5b89f6b2d2c7fe8b61906918273a3333c95400c" +checksum = "b3638bc4617f96675973253b3a45006933bde93c2fd8a6170b33c777cc389e5b" dependencies = [ "async-trait", "base64 0.22.1", - "http-body 1.0.1", - "hyper 1.7.0", - "hyper-rustls 0.27.7", + "http-body 1.0.0", + "hyper 1.6.0", + "hyper-rustls 0.27.3", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", - "rustls 0.23.32", + "rustls 0.23.18", "rustls-platform-verifier", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", - "tower 0.4.13", + "tower", "tracing", "url", ] [[package]] name = "jsonrpsee-proc-macros" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e65763c942dfc9358146571911b0cd1c361c2d63e2d2305622d40d36376ca80" +checksum = "c06c01ae0007548e73412c08e2285ffe5d723195bf268bce67b1b77c3bb2a14d" dependencies = [ "heck 0.5.0", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "jsonrpsee-server" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e363146da18e50ad2b51a0a7925fc423137a0b1371af8235b1c231a0647328" +checksum = "82ad8ddc14be1d4290cd68046e7d1d37acd408efed6d3ca08aefcc3ad6da069c" dependencies = [ "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http 1.1.0", + "http-body 1.0.0", "http-body-util", - "hyper 1.7.0", + "hyper 1.6.0", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", @@ -9078,31 +9030,31 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-stream", "tokio-util", - "tower 0.4.13", + "tower", "tracing", ] [[package]] name = "jsonrpsee-types" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a8e70baf945b6b5752fc8eb38c918a48f1234daf11355e07106d963f860089" +checksum = "a178c60086f24cc35bb82f57c651d0d25d99c4742b4d335de04e97fa1f08a8a1" dependencies = [ - "http 1.3.1", + "http 1.1.0", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "jsonrpsee-wasm-client" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6558a9586cad43019dafd0b6311d0938f46efc116b34b28c74778bc11a2edf6" +checksum = "1a01cd500915d24ab28ca17527e23901ef1be6d659a2322451e1045532516c25" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -9111,11 +9063,11 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.24.9" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b3323d890aa384f12148e8d2a1fd18eb66e9e7e825f9de4fa53bcc19b93eef" +checksum = "0fe322e0896d0955a3ebdd5bf813571c53fea29edd713bc315b76620b327e86d" dependencies = [ - "http 1.3.1", + "http 1.1.0", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", @@ -9152,9 +9104,9 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ "cpufeatures", ] @@ -9206,7 +9158,7 @@ checksum = "c33070833c9ee02266356de0c43f723152bd38bd96ddf52c82b3af10c9138b28" name = "kitchensink-runtime" version = "3.0.0-dev" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "log", "node-primitives", "pallet-example-mbm", @@ -9247,9 +9199,9 @@ dependencies = [ "either", "futures", "home", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.29", "hyper-rustls 0.24.2", "hyper-timeout", "jsonpath-rust", @@ -9258,17 +9210,17 @@ dependencies = [ "pem", "pin-project", "rand 0.8.5", - "rustls 0.21.12", - "rustls-pemfile", + "rustls 0.21.7", + "rustls-pemfile 1.0.3", "secrecy 0.8.0", "serde", "serde_json", "serde_yaml", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-tungstenite 0.20.1", "tokio-util", - "tower 0.4.13", + "tower", "tower-http 0.4.4", "tracing", ] @@ -9281,13 +9233,13 @@ checksum = "b5bba93d054786eba7994d03ce522f368ef7d48c88a1826faa28478d85fb63ae" dependencies = [ "chrono", "form_urlencoded", - "http 0.2.12", + "http 0.2.9", "json-patch", "k8s-openapi", "once_cell", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -9305,12 +9257,12 @@ dependencies = [ "json-patch", "k8s-openapi", "kube-client", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "serde", "serde_json", "smallvec", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-util", "tracing", @@ -9341,7 +9293,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" dependencies = [ "kvdb", - "parking_lot 0.12.4", + "parking_lot 0.12.3", ] [[package]] @@ -9352,7 +9304,7 @@ checksum = "e8beb5ce840610e5a945f0306f6e7a2d5b3e68ea3e64e9a4f081fa4ee5aa6525" dependencies = [ "kvdb", "num_cpus", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "regex", "rocksdb", ] @@ -9368,13 +9320,13 @@ dependencies = [ [[package]] name = "landlock" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9baa9eeb6e315942429397e617a190f4fdc696ef1ee0342939d641029cbb4ea7" +checksum = "1530c5b973eeed4ac216af7e24baf5737645a6272e361f1fb95710678b67d9cc" dependencies = [ "enumflags2", "libc", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -9386,6 +9338,12 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -9394,9 +9352,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.176" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libflate" @@ -9420,19 +9378,20 @@ dependencies = [ [[package]] name = "libfuzzer-sys" -version = "0.4.10" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ "arbitrary", "cc", + "once_cell", ] [[package]] name = "libgit2-sys" -version = "0.18.2+1.9.1" +version = "0.18.0+1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +checksum = "e1a117465e7e1597e8febea8bb0c410f1c7fb93b1e1cddf34363f8390367ffec" dependencies = [ "cc", "libc", @@ -9442,15 +9401,15 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.15" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libnghttp2-sys" -version = "0.1.11+1.64.0" +version = "0.1.9+1.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6c24e48a7167cffa7119da39d577fa482e66c688a4aac016bee862e1a713c4" +checksum = "b57e858af2798e167e709b9d969325b6d8e9d50232fcbc494d7d54f976854a64" dependencies = [ "cc", "libc", @@ -9466,7 +9425,7 @@ dependencies = [ "either", "futures", "futures-timer", - "getrandom 0.2.16", + "getrandom 0.2.10", "libp2p-allow-block-list", "libp2p-connection-limits", "libp2p-core", @@ -9485,10 +9444,10 @@ dependencies = [ "libp2p-upnp", "libp2p-websocket", "libp2p-yamux", - "multiaddr 0.18.2", + "multiaddr 0.18.1", "pin-project", "rw-stream-sink", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -9526,17 +9485,17 @@ dependencies = [ "futures", "futures-timer", "libp2p-identity", - "multiaddr 0.18.2", - "multihash 0.19.3", + "multiaddr 0.18.1", + "multihash 0.19.1", "multistream-select", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "quick-protobuf", "rand 0.8.5", "rw-stream-sink", "smallvec", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "unsigned-varint 0.8.0", "void", @@ -9551,10 +9510,10 @@ checksum = "97f37f30d5c7275db282ecd86e54f29dd2176bd3ac656f06abf43bedb21eb8bd" dependencies = [ "async-trait", "futures", - "hickory-resolver 0.24.4", + "hickory-resolver 0.24.2", "libp2p-core", "libp2p-identity", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "smallvec", "tracing", ] @@ -9577,25 +9536,25 @@ dependencies = [ "quick-protobuf", "quick-protobuf-codec", "smallvec", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "void", ] [[package]] name = "libp2p-identity" -version = "0.2.12" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" +checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8" dependencies = [ "bs58", "ed25519-dalek", "hkdf", - "multihash 0.19.3", + "multihash 0.19.1", "quick-protobuf", "rand 0.8.5", "sha2 0.10.9", - "thiserror 2.0.17", + "thiserror 1.0.65", "tracing", "zeroize", ] @@ -9622,7 +9581,7 @@ dependencies = [ "rand 0.8.5", "sha2 0.10.9", "smallvec", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "uint 0.9.5", "void", @@ -9637,14 +9596,14 @@ checksum = "14b8546b6644032565eb29046b42744aee1e9f261ed99671b2c93fb140dba417" dependencies = [ "data-encoding", "futures", - "hickory-proto 0.24.4", + "hickory-proto 0.24.1", "if-watch", "libp2p-core", "libp2p-identity", "libp2p-swarm", "rand 0.8.5", "smallvec", - "socket2 0.5.10", + "socket2 0.5.9", "tokio", "tracing", "void", @@ -9680,15 +9639,15 @@ dependencies = [ "futures", "libp2p-core", "libp2p-identity", - "multiaddr 0.18.2", - "multihash 0.19.3", + "multiaddr 0.18.1", + "multihash 0.19.1", "once_cell", "quick-protobuf", "rand 0.8.5", "sha2 0.10.9", "snow", "static_assertions", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "x25519-dalek", "zeroize", @@ -9725,13 +9684,13 @@ dependencies = [ "libp2p-core", "libp2p-identity", "libp2p-tls", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "quinn", "rand 0.8.5", - "ring 0.17.14", - "rustls 0.23.32", - "socket2 0.5.10", - "thiserror 1.0.69", + "ring 0.17.8", + "rustls 0.23.18", + "socket2 0.5.9", + "thiserror 1.0.65", "tokio", "tracing", ] @@ -9787,9 +9746,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206e0aa0ebe004d778d79fb0966aa0de996c19894e2c0605ba2f8524dd4443d8" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -9804,7 +9763,7 @@ dependencies = [ "libc", "libp2p-core", "libp2p-identity", - "socket2 0.5.10", + "socket2 0.5.9", "tokio", "tracing", ] @@ -9820,10 +9779,10 @@ dependencies = [ "libp2p-core", "libp2p-identity", "rcgen", - "ring 0.17.14", - "rustls 0.23.32", - "rustls-webpki 0.101.7", - "thiserror 1.0.69", + "ring 0.17.8", + "rustls 0.23.18", + "rustls-webpki 0.101.4", + "thiserror 1.0.65", "x509-parser 0.16.0", "yasna", ] @@ -9855,14 +9814,14 @@ dependencies = [ "futures-rustls", "libp2p-core", "libp2p-identity", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project-lite", "rw-stream-sink", "soketto", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "url", - "webpki-roots 0.25.4", + "webpki-roots 0.25.2", ] [[package]] @@ -9874,21 +9833,10 @@ dependencies = [ "either", "futures", "libp2p-core", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "yamux 0.12.1", - "yamux 0.13.6", -] - -[[package]] -name = "libredox" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" -dependencies = [ - "bitflags 2.9.4", - "libc", - "redox_syscall 0.5.17", + "yamux 0.13.5", ] [[package]] @@ -9907,12 +9855,12 @@ dependencies = [ [[package]] name = "libsecp256k1" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ "arrayref", - "base64 0.22.1", + "base64 0.13.1", "digest 0.9.0", "hmac-drbg", "libsecp256k1-core", @@ -9932,7 +9880,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" dependencies = [ "crunchy", "digest 0.9.0", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -9966,9 +9914,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.22" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" dependencies = [ "cc", "libc", @@ -9978,9 +9926,9 @@ dependencies = [ [[package]] name = "link-cplusplus" -version = "1.0.12" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" dependencies = [ "cc", ] @@ -9993,33 +9941,39 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linked_hash_set" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae85b5be22d9843c80e5fc80e9b64c8a3b1f98f867c709956eca3efff4e92e2" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" dependencies = [ "linked-hash-map", ] [[package]] name = "linregress" -version = "0.5.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9eda9dcf4f2a99787827661f312ac3219292549c2ee992bf9a6248ffb066bf7" +checksum = "4de0b5f52a9f84544d268f5fabb71b38962d6aa3c6600b8bcd27d44ccf9c9c45" dependencies = [ "nalgebra", ] [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "lioness" @@ -10053,9 +10007,9 @@ dependencies = [ [[package]] name = "litemap" -version = "0.8.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "litep2p" @@ -10071,13 +10025,13 @@ dependencies = [ "futures", "futures-timer", "hickory-resolver 0.25.2", - "indexmap 2.11.4", + "indexmap 2.9.0", "libc", "mockall", "multiaddr 0.17.1", "multihash 0.17.0", "network-interface", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "prost 0.13.5", "prost-build", @@ -10087,8 +10041,8 @@ dependencies = [ "simple-dns", "smallvec", "snow", - "socket2 0.5.10", - "thiserror 2.0.17", + "socket2 0.5.9", + "thiserror 2.0.12", "tokio", "tokio-stream", "tokio-tungstenite 0.27.0", @@ -10099,16 +10053,16 @@ dependencies = [ "url", "x25519-dalek", "x509-parser 0.17.0", - "yamux 0.13.6", + "yamux 0.13.5", "yasna", "zeroize", ] [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -10116,21 +10070,34 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" dependencies = [ "serde", "value-bag", ] +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber 0.3.18", +] + [[package]] name = "lru" -version = "0.12.5" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.14.5", ] [[package]] @@ -10142,26 +10109,21 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - [[package]] name = "lz4" -version = "1.28.1" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20b523e860d03443e98350ceaac5e71c6ba89aea7d960769ec3ce37f4de5af4" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" dependencies = [ + "libc", "lz4-sys", ] [[package]] name = "lz4-sys" -version = "1.11.1+lz4-1.10.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" dependencies = [ "cc", "libc", @@ -10169,9 +10131,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -10182,9 +10144,9 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -10195,8 +10157,8 @@ checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" dependencies = [ "macro_magic_core", "macro_magic_macros", - "quote 1.0.41", - "syn 2.0.106", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -10208,9 +10170,9 @@ dependencies = [ "const-random", "derive-syn-parse", "macro_magic_core_macros", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -10219,9 +10181,9 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -10231,8 +10193,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", - "quote 1.0.41", - "syn 2.0.106", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -10242,30 +10204,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] -name = "match-lookup" -version = "0.1.1" +name = "match_cfg" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" -dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 1.0.109", -] +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matchers" -version = "0.2.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] name = "matrixmultiply" -version = "0.3.10" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" dependencies = [ "autocfg", "rawpointer", @@ -10283,17 +10240,17 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memfd" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" +checksum = "ffc89ccdc6e10d6907450f753537ebc5c5d3460d2e4e62ea74bd571db62c0f9e" dependencies = [ - "rustix 1.1.2", + "rustix 0.37.23", ] [[package]] @@ -10307,22 +10264,31 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "45fd3a57831bf88bc63f8cebc0cf956116276e97fef3966103e96416209f7c92" dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "memory-db" version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e300c54e3239a86f9c61cc63ab0f03862eb40b1c6e065dc6fd6ceaeff6da93d" dependencies = [ - "foldhash 0.1.5", + "foldhash", "hash-db", - "hashbrown 0.15.5", + "hashbrown 0.15.3", ] [[package]] @@ -10331,7 +10297,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3e3e3f549d27d2dc054372f320ddf68045a833fab490563ff70d4cf1b9d91ea" dependencies = [ - "array-bytes 9.3.0", + "array-bytes 9.1.2", "blake3", "frame-metadata 23.0.0", "parity-scale-codec", @@ -10363,7 +10329,7 @@ dependencies = [ "hex", "log", "num-traits", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "relay-utils", "sp-arithmetic", "sp-core 28.0.0", @@ -10407,22 +10373,23 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.9" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ - "adler2", + "adler", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -10441,12 +10408,12 @@ dependencies = [ "hashlink 0.8.4", "lioness", "log", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "rand_chacha 0.3.1", "rand_distr", - "subtle 2.6.1", - "thiserror 1.0.69", + "subtle 2.5.0", + "thiserror 1.0.65", "zeroize", ] @@ -10457,7 +10424,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-offchain", @@ -10509,26 +10476,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ca3004c2efe9011bd4e461bd8256445052b9615405b4f7ea43fc8ca5c20898" dependencies = [ "cfg-if", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "moka" -version = "0.12.11" +version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" dependencies = [ "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "equivalent", - "parking_lot 0.12.4", + "loom", + "parking_lot 0.12.3", "portable-atomic", - "rustc_version 0.4.1", + "rustc_version 0.4.0", "smallvec", "tagptr", + "thiserror 1.0.65", "uuid", ] @@ -10559,31 +10527,30 @@ dependencies = [ [[package]] name = "multiaddr" -version = "0.18.2" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" +checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" dependencies = [ "arrayref", "byteorder", "data-encoding", "libp2p-identity", "multibase", - "multihash 0.19.3", + "multihash 0.19.1", "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.8.0", + "unsigned-varint 0.7.2", "url", ] [[package]] name = "multibase" -version = "0.9.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" dependencies = [ "base-x", - "base256emoji", "data-encoding", "data-encoding-macro", ] @@ -10607,33 +10574,33 @@ dependencies = [ [[package]] name = "multihash" -version = "0.19.3" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" dependencies = [ "core2", - "unsigned-varint 0.8.0", + "unsigned-varint 0.7.2", ] [[package]] name = "multihash-derive" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 1.3.1", "proc-macro-error", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", "synstructure 0.12.6", ] [[package]] name = "multimap" -version = "0.10.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multistream-select" @@ -10651,12 +10618,13 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.33.2" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" dependencies = [ "approx", "matrixmultiply", + "nalgebra-macros", "num-complex", "num-rational", "num-traits", @@ -10664,6 +10632,17 @@ dependencies = [ "typenum", ] +[[package]] +name = "nalgebra-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +dependencies = [ + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 1.0.109", +] + [[package]] name = "names" version = "0.14.0" @@ -10681,9 +10660,9 @@ checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ "libc", "log", @@ -10691,27 +10670,28 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework", "security-framework-sys", "tempfile", ] [[package]] name = "netlink-packet-core" -version = "0.7.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" dependencies = [ "anyhow", "byteorder", + "libc", "netlink-packet-utils", ] [[package]] name = "netlink-packet-route" -version = "0.17.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" dependencies = [ "anyhow", "bitflags 1.3.2", @@ -10730,28 +10710,29 @@ dependencies = [ "anyhow", "byteorder", "paste", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "netlink-proto" -version = "0.11.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" dependencies = [ "bytes", "futures", "log", "netlink-packet-core", "netlink-sys", - "thiserror 2.0.17", + "thiserror 1.0.65", + "tokio", ] [[package]] name = "netlink-sys" -version = "0.8.7" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" dependencies = [ "bytes", "futures", @@ -10762,21 +10743,21 @@ dependencies = [ [[package]] name = "network-interface" -version = "2.0.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07709a6d4eba90ab10ec170a0530b3aafc81cb8a2d380e4423ae41fc55fe5745" +checksum = "c3329f515506e4a2de3aa6e07027a6758e22e0f0e8eaf64fa47261cec2282602" dependencies = [ "cc", "libc", - "thiserror 2.0.17", + "thiserror 1.0.65", "winapi", ] [[package]] name = "nix" -version = "0.26.4" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -10806,18 +10787,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "cfg_aliases 0.2.1", - "libc", -] - [[package]] name = "no-std-compat" version = "0.4.1" @@ -10828,10 +10797,10 @@ checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" name = "node-bench" version = "0.9.0-dev" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-trait", "clap", - "derive_more 0.99.20", + "derive_more 0.99.17", "fs_extra", "futures", "hash-db", @@ -11015,18 +10984,19 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "windows-sys 0.52.0", + "overload", + "winapi", ] [[package]] name = "num" -version = "0.4.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" dependencies = [ "num-bigint", "num-complex", @@ -11065,9 +11035,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.6" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -11084,9 +11054,9 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -11110,9 +11080,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", @@ -11121,10 +11091,11 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ + "autocfg", "num-bigint", "num-integer", "num-traits", @@ -11142,9 +11113,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.17.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", @@ -11166,10 +11137,10 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -11189,9 +11160,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nybbles" -version = "0.4.6" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" +checksum = "675b3a54e5b12af997abc8b6638b0aee51a28caedab70d4967e0d5db3a3f1d06" dependencies = [ "alloy-rlp", "cfg-if", @@ -11203,32 +11174,32 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ - "crc32fast", - "hashbrown 0.15.5", - "indexmap 2.11.4", "memchr", ] [[package]] name = "object" -version = "0.37.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ + "crc32fast", + "hashbrown 0.15.3", + "indexmap 2.9.0", "memchr", ] [[package]] name = "oid-registry" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +checksum = "1c958dd45046245b9c3c2547369bb634eb461670b2e7e0de552905801a648d1d" dependencies = [ - "asn1-rs 0.6.2", + "asn1-rs 0.6.1", ] [[package]] @@ -11237,7 +11208,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" dependencies = [ - "asn1-rs 0.7.1", + "asn1-rs 0.7.0", ] [[package]] @@ -11250,17 +11221,11 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - [[package]] name = "oorandom" -version = "11.1.5" +version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" @@ -11270,15 +11235,15 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "opaque-debug" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.9.4", "cfg-if", @@ -11295,22 +11260,22 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -11337,7 +11302,7 @@ dependencies = [ "orchestra-proc-macro", "pin-project", "prioritized-metered-channel", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", ] @@ -11348,12 +11313,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43dfaf083aef571385fccfdc3a2f8ede8d0a1863160455d4f2b014d8f7d04a3f" dependencies = [ "expander", - "indexmap 2.11.4", + "indexmap 2.9.0", "itertools 0.11.0", - "petgraph 0.6.5", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", + "petgraph", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -11368,19 +11333,25 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" dependencies = [ "libc", "windows-sys 0.59.0", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "owo-colors" -version = "4.2.3" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] name = "p256" @@ -11445,7 +11416,7 @@ dependencies = [ name = "pallet-alliance" version = "27.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "frame-benchmarking", "frame-support", "frame-system", @@ -11815,7 +11786,7 @@ dependencies = [ name = "pallet-beefy-mmr" version = "28.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "binary-merkle-tree", "frame-benchmarking", "frame-support", @@ -12068,7 +12039,7 @@ dependencies = [ name = "pallet-contracts" version = "27.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "environmental", "frame-benchmarking", @@ -12114,7 +12085,7 @@ dependencies = [ "parity-wasm", "sp-runtime", "tempfile", - "toml 0.8.23", + "toml", "twox-hash 1.6.3", ] @@ -12153,9 +12124,9 @@ dependencies = [ name = "pallet-contracts-proc-macro" version = "18.0.0" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -12327,7 +12298,7 @@ dependencies = [ "pallet-staking", "pallet-timestamp", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "scale-info", "sp-core 28.0.0", "sp-io", @@ -12348,7 +12319,7 @@ dependencies = [ "log", "pallet-balances", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "scale-info", "sp-arithmetic", @@ -12373,7 +12344,7 @@ dependencies = [ "log", "pallet-balances", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "scale-info", "sp-arithmetic", @@ -13262,9 +13233,9 @@ dependencies = [ "alloy-consensus", "alloy-core", "alloy-trie", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", - "derive_more 0.99.20", + "derive_more 0.99.17", "environmental", "ethereum-standards", "ethereum-types", @@ -13325,7 +13296,7 @@ dependencies = [ "alloy-core", "anyhow", "clap", - "env_logger 0.11.8", + "env_logger 0.11.3", "futures", "git2", "hex", @@ -13354,7 +13325,7 @@ dependencies = [ "substrate-prometheus-endpoint", "subxt 0.43.0", "subxt-signer 0.43.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -13371,16 +13342,16 @@ dependencies = [ "serde_json", "sp-core 28.0.0", "sp-io", - "toml 0.8.23", + "toml", ] [[package]] name = "pallet-revive-proc-macro" version = "0.1.0" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -13457,7 +13428,7 @@ dependencies = [ name = "pallet-sassafras" version = "0.3.5-dev" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "frame-benchmarking", "frame-support", "frame-system", @@ -13610,7 +13581,7 @@ name = "pallet-staking-async" version = "0.1.0" dependencies = [ "anyhow", - "env_logger 0.11.8", + "env_logger 0.11.3", "frame-benchmarking", "frame-election-provider-support", "frame-support", @@ -13938,11 +13909,11 @@ dependencies = [ name = "pallet-staking-reward-curve" version = "11.0.0" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", "sp-runtime", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -14114,7 +14085,7 @@ dependencies = [ name = "pallet-transaction-storage" version = "27.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "frame-benchmarking", "frame-support", "frame-system", @@ -14465,9 +14436,9 @@ checksum = "16b56e3a2420138bdb970f84dfb9c774aea80fa0e7371549eedec0d80c209c67" [[package]] name = "parity-db" -version = "0.4.13" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592a28a24b09c9dc20ac8afaa6839abc417c720afe42c12e1e4a9d6aa2508d2e" +checksum = "59e9ab494af9e6e813c72170f0d3c1de1500990d62c97cc05cc7576f91aa402f" dependencies = [ "blake2 0.10.6", "crc32fast", @@ -14477,11 +14448,10 @@ dependencies = [ "log", "lz4", "memmap2 0.5.10", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "siphasher 0.3.11", "snap", - "winapi", ] [[package]] @@ -14507,10 +14477,10 @@ version = "3.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -14538,12 +14508,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.11", + "parking_lot_core 0.9.8", ] [[package]] @@ -14562,15 +14532,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.17", + "redox_syscall 0.3.5", "smallvec", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -14587,7 +14557,7 @@ checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", "rand_core 0.6.4", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -14609,9 +14579,9 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.5" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ "base64 0.22.1", "serde", @@ -14911,26 +14881,25 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.8.2" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" +checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" dependencies = [ - "memchr", - "thiserror 2.0.17", + "thiserror 1.0.65", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.2" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc58706f770acb1dbd0973e6530a3cff4746fb721207feb3a8a6064cd0b6c663" +checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" dependencies = [ "pest", "pest_generator", @@ -14938,52 +14907,43 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.2" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d4f36811dfe07f7b8573462465d5cb8965fffc2e71ae377a33aecf14c2c9a2f" +checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "pest_meta" -version = "2.8.2" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42919b05089acbd0a5dcd5405fb304d17d1053847b81163d09c4ad18ce8e8420" +checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" dependencies = [ + "once_cell", "pest", "sha2 0.10.9", ] [[package]] name = "petgraph" -version = "0.6.5" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ - "fixedbitset 0.4.2", - "indexmap 2.11.4", + "fixedbitset", + "indexmap 2.9.0", ] [[package]] -name = "petgraph" -version = "0.7.1" +name = "phf" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" -dependencies = [ - "fixedbitset 0.5.7", - "indexmap 2.11.4", -] - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", "phf_shared", @@ -15007,9 +14967,9 @@ checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", "phf_shared", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -15036,16 +14996,16 @@ version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -15053,17 +15013,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand 2.3.0", - "futures-io", -] - [[package]] name = "pkcs1" version = "0.7.5" @@ -15093,9 +15042,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plotters" -version = "0.3.7" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ "num-traits", "plotters-backend", @@ -15106,15 +15055,15 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.7" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" [[package]] name = "plotters-svg" -version = "0.3.7" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" dependencies = [ "plotters-backend", ] @@ -15160,7 +15109,7 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", "sc-keystore", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "sp-application-crypto", "sp-authority-discovery", "sp-core 28.0.0", @@ -15219,7 +15168,7 @@ dependencies = [ "sp-keyring", "sp-keystore", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15249,7 +15198,7 @@ dependencies = [ "sp-core 28.0.0", "sp-keyring", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tracing-gum", ] @@ -15287,7 +15236,7 @@ dependencies = [ "sp-keyring", "sp-runtime", "substrate-build-script-utils", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -15317,7 +15266,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-util", "tracing-gum", @@ -15343,7 +15292,7 @@ dependencies = [ "fatality", "futures", "futures-timer", - "indexmap 2.11.4", + "indexmap 2.9.0", "parity-scale-codec", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -15358,7 +15307,7 @@ dependencies = [ "sp-keyring", "sp-keystore", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15374,7 +15323,7 @@ dependencies = [ "reed-solomon-novelpoly", "sp-core 28.0.0", "sp-trie", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -15385,7 +15334,7 @@ dependencies = [ "async-trait", "futures", "futures-timer", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -15418,7 +15367,7 @@ dependencies = [ "futures", "futures-timer", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-metrics", "polkadot-node-network-protocol", "polkadot-node-subsystem", @@ -15431,7 +15380,7 @@ dependencies = [ "sp-consensus", "sp-core 28.0.0", "sp-keyring", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15453,7 +15402,7 @@ dependencies = [ "schnellru", "sp-core 28.0.0", "sp-keyring", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15464,14 +15413,14 @@ dependencies = [ "assert_matches", "async-trait", "bitvec", - "derive_more 0.99.20", + "derive_more 0.99.17", "futures", "futures-timer", "itertools 0.11.0", "kvdb-memorydb", "merlin", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", @@ -15485,7 +15434,7 @@ dependencies = [ "rand_core 0.6.4", "sc-keystore", "schnellru", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "sp-application-crypto", "sp-consensus", "sp-consensus-babe", @@ -15495,7 +15444,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15521,7 +15470,7 @@ dependencies = [ "rand 0.8.5", "rand_core 0.6.4", "sc-keystore", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "sp-consensus", "sp-consensus-babe", "sp-core 28.0.0", @@ -15540,7 +15489,7 @@ dependencies = [ "futures-timer", "kvdb-memorydb", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -15552,7 +15501,7 @@ dependencies = [ "sp-core 28.0.0", "sp-keyring", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15580,7 +15529,7 @@ dependencies = [ "sp-keyring", "sp-keystore", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15595,7 +15544,7 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "sp-keystore", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", "wasm-timer", ] @@ -15657,14 +15606,14 @@ dependencies = [ "futures-timer", "kvdb-memorydb", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", "sp-core 28.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15692,7 +15641,7 @@ dependencies = [ "sp-keyring", "sp-keystore", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15708,7 +15657,7 @@ dependencies = [ "polkadot-primitives", "sp-blockchain", "sp-inherents", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15728,7 +15677,7 @@ dependencies = [ "rstest", "sp-core 28.0.0", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15750,7 +15699,7 @@ dependencies = [ "schnellru", "sp-application-crypto", "sp-keystore", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15759,7 +15708,7 @@ name = "polkadot-node-core-pvf" version = "7.0.0" dependencies = [ "always-assert", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "criterion", "futures", @@ -15791,7 +15740,7 @@ dependencies = [ "tempfile", "test-parachain-adder", "test-parachain-halt", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tracing-gum", ] @@ -15840,7 +15789,7 @@ dependencies = [ "sp-io", "sp-tracing 16.0.0", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15909,7 +15858,7 @@ dependencies = [ "futures", "futures-timer", "http-body-util", - "hyper 1.7.0", + "hyper 1.6.0", "hyper-util", "parity-scale-codec", "polkadot-primitives", @@ -15931,7 +15880,7 @@ dependencies = [ "async-channel 1.9.0", "async-trait", "bitvec", - "derive_more 0.99.20", + "derive_more 0.99.17", "fatality", "futures", "hex", @@ -15945,7 +15894,7 @@ dependencies = [ "sc-network-types", "sp-runtime", "strum 0.26.3", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -15961,14 +15910,14 @@ dependencies = [ "polkadot-parachain-primitives", "polkadot-primitives", "sc-keystore", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "serde", "sp-application-crypto", "sp-consensus-babe", "sp-consensus-slots", "sp-keystore", "sp-maybe-compressed-blob", - "thiserror 1.0.69", + "thiserror 1.0.65", "zstd 0.12.4", ] @@ -15986,7 +15935,7 @@ version = "1.0.0" dependencies = [ "async-trait", "futures", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-erasure-coding", "polkadot-node-primitives", "polkadot-node-subsystem", @@ -16006,7 +15955,7 @@ name = "polkadot-node-subsystem-types" version = "7.0.0" dependencies = [ "async-trait", - "derive_more 0.99.20", + "derive_more 0.99.17", "fatality", "futures", "orchestra", @@ -16025,7 +15974,7 @@ dependencies = [ "sp-consensus-babe", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -16040,7 +15989,7 @@ dependencies = [ "kvdb-shared-tests", "parity-db", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-erasure-coding", "polkadot-node-metrics", "polkadot-node-network-protocol", @@ -16058,7 +16007,7 @@ dependencies = [ "sp-core 28.0.0", "sp-keystore", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -16227,9 +16176,9 @@ dependencies = [ name = "polkadot-parachain-primitives" version = "6.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "bounded-collections 0.3.2", - "derive_more 0.99.20", + "derive_more 0.99.17", "parity-scale-codec", "polkadot-core-primitives", "scale-info", @@ -16264,7 +16213,7 @@ dependencies = [ "sp-runtime", "sp-staking", "sp-std 14.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -17002,7 +16951,7 @@ dependencies = [ "pallet-transaction-payment-rpc-runtime-api", "parity-db", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "polkadot-approval-distribution", "polkadot-availability-bitfield-distribution", "polkadot-availability-distribution", @@ -17090,7 +17039,7 @@ dependencies = [ "staging-xcm", "substrate-prometheus-endpoint", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", "westend-runtime", "westend-runtime-constants", @@ -17126,7 +17075,7 @@ dependencies = [ "sp-keyring", "sp-keystore", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing-gum", ] @@ -17371,7 +17320,7 @@ version = "0.1.0" dependencies = [ "anyhow", "cumulus-zombienet-sdk-helpers", - "env_logger 0.11.8", + "env_logger 0.11.3", "log", "parity-scale-codec", "polkadot-primitives", @@ -17493,9 +17442,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f2116a92e6e96220a398930f4c8a6cda1264206f3e2034fc9982bfd93f261f7" dependencies = [ "polkavm-common 0.18.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -17505,9 +17454,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6069dc7995cde6e612b868a02ce48b54397c6d2582bd1b97b63aabbe962cd779" dependencies = [ "polkavm-common 0.26.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -17517,9 +17466,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8abdd1210d96b1dda9ac21199ec469448fd628cea102e2ff0e0df1667c4c3b5f" dependencies = [ "polkavm-common 0.27.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -17529,7 +17478,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c16669ddc7433e34c1007d31080b80901e3e8e523cb9d4b441c3910cf9294b" dependencies = [ "polkavm-derive-impl 0.18.1", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -17539,7 +17488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581d34cafec741dc5ffafbb341933c205b6457f3d76257a9d99fb56687219c91" dependencies = [ "polkavm-derive-impl 0.26.0", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -17549,7 +17498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a45173d70138aa1879892c50777ed0d8b0c8556f7678372f09fa1d89bbbddb4" dependencies = [ "polkavm-derive-impl 0.27.0", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -17614,16 +17563,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.11.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", "pin-project-lite", - "rustix 1.1.2", - "windows-sys 0.61.1", + "rustix 0.38.42", + "tracing", + "windows-sys 0.52.0", ] [[package]] @@ -17633,36 +17582,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ "cpufeatures", - "opaque-debug 0.3.1", + "opaque-debug 0.3.0", "universal-hash", ] [[package]] name = "polyval" -version = "0.6.2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" dependencies = [ "cfg-if", "cpufeatures", - "opaque-debug 0.3.1", + "opaque-debug 0.3.0", "universal-hash", ] [[package]] name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "portable-atomic-util" -version = "0.2.4" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" -dependencies = [ - "portable-atomic", -] +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "portpicker" @@ -17685,15 +17625,6 @@ dependencies = [ "serde", ] -[[package]] -name = "potential_utf" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" -dependencies = [ - "zerovec", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -17713,44 +17644,42 @@ dependencies = [ "log", "nix 0.27.1", "once_cell", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "smallvec", "symbolic-demangle", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "ppv-lite86" -version = "0.2.21" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "predicates" -version = "3.1.3" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" dependencies = [ "anstyle", "difflib", + "itertools 0.10.5", "predicates-core", ] [[package]] name = "predicates-core" -version = "1.0.9" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" [[package]] name = "predicates-tree" -version = "1.0.12" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" dependencies = [ "predicates-core", "termtree", @@ -17758,9 +17687,9 @@ dependencies = [ [[package]] name = "pretty_assertions" -version = "1.4.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ "diff", "yansi", @@ -17768,12 +17697,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.37" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ - "proc-macro2 1.0.101", - "syn 2.0.106", + "proc-macro2 1.0.95", + "syn 2.0.98", ] [[package]] @@ -17819,31 +17748,31 @@ checksum = "a172e6cc603231f2cf004232eabcecccc0da53ba576ab286ef7baa0cfc7927ad" dependencies = [ "coarsetime", "crossbeam-queue", - "derive_more 0.99.20", + "derive_more 0.99.17", "futures", "futures-timer", "nanorand", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", ] [[package]] name = "proc-macro-crate" -version = "1.1.3" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "thiserror 1.0.69", - "toml 0.5.11", + "once_cell", + "toml_edit 0.19.15", ] [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.23.6", + "toml_edit 0.21.0", ] [[package]] @@ -17853,8 +17782,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", "version_check", ] @@ -17865,8 +17794,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "version_check", ] @@ -17876,8 +17805,8 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", ] [[package]] @@ -17887,20 +17816,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ "proc-macro-error-attr2", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + [[package]] name = "proc-macro-warning" -version = "1.84.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75eea531cfcd120e0851a3f8aed42c4841f78c889eefafd96339c72677ae42c3" +checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -17914,9 +17849,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -17933,7 +17868,7 @@ dependencies = [ "hex", "lazy_static", "procfs-core", - "rustix 0.38.44", + "rustix 0.38.42", ] [[package]] @@ -17949,16 +17884,16 @@ dependencies = [ [[package]] name = "prometheus" -version = "0.13.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" dependencies = [ "cfg-if", "fnv", "lazy_static", "memchr", - "parking_lot 0.12.4", - "thiserror 1.0.69", + "parking_lot 0.12.3", + "thiserror 1.0.65", ] [[package]] @@ -17969,7 +17904,7 @@ checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" dependencies = [ "dtoa", "itoa", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "prometheus-client-derive-encode", ] @@ -17979,38 +17914,38 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "prometheus-parse" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811031bea65e5a401fb2e1f37d802cca6601e204ac463809a3189352d13b78a5" +checksum = "0c2aa5feb83bf4b2c8919eaf563f51dbab41183de73ba2353c0e03cd7b6bd892" dependencies = [ "chrono", - "itertools 0.12.1", + "itertools 0.10.5", "once_cell", "regex", ] [[package]] name = "proptest" -version = "1.8.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", "bitflags 2.9.4", "lazy_static", "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand 0.8.5", + "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -18048,21 +17983,22 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.13.5" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +checksum = "f8650aabb6c35b860610e9cff5dc1af886c9e25073b7b1712a68972af4281302" dependencies = [ + "bytes", "heck 0.5.0", - "itertools 0.14.0", + "itertools 0.13.0", "log", "multimap", "once_cell", - "petgraph 0.7.1", + "petgraph", "prettyplease", "prost 0.13.5", "prost-types", "regex", - "syn 2.0.106", + "syn 2.0.98", "tempfile", ] @@ -18074,8 +18010,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -18087,9 +18023,9 @@ checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", "itertools 0.12.1", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -18100,16 +18036,16 @@ checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", "itertools 0.14.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "prost-types" -version = "0.13.5" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +checksum = "60caa6738c7369b940c3d49246a8d1749323674c65cb13010134f5c9bad5b519" dependencies = [ "prost 0.13.5", ] @@ -18132,9 +18068,9 @@ version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "938543690519c20c3a480d20a8efcc8e69abeb44093ab1df4e7c1f81f26c677a" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -18150,33 +18086,35 @@ dependencies = [ "prost 0.11.9", "reqwest", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "url", "winapi", ] [[package]] name = "pyroscope_pprofrs" -version = "0.2.10" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50da7a8950c542357de489aa9ee628f46322b1beaac1f4fa3313bcdebe85b4ea" +checksum = "614a25777053da6bdca9d84a67892490b5a57590248dbdee3d7bf0716252af70" dependencies = [ "log", "pprof2", "pyroscope", + "thiserror 1.0.65", ] [[package]] name = "quanta" -version = "0.12.6" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" dependencies = [ "crossbeam-utils", "libc", + "mach2", "once_cell", "raw-cpuid", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", "web-sys", "winapi", ] @@ -18205,7 +18143,7 @@ dependencies = [ "asynchronous-codec 0.7.0", "bytes", "quick-protobuf", - "thiserror 1.0.69", + "thiserror 1.0.65", "unsigned-varint 0.8.0", ] @@ -18217,7 +18155,7 @@ checksum = "5253a3a0d56548d5b0be25414171dc780cc6870727746d05bd2bde352eee96c5" dependencies = [ "ahash", "hashbrown 0.13.2", - "parking_lot 0.12.4", + "parking_lot 0.12.3", ] [[package]] @@ -18233,58 +18171,51 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", - "cfg_aliases 0.2.1", "futures-io", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.32", - "socket2 0.6.0", - "thiserror 2.0.17", + "rustls 0.23.18", + "socket2 0.5.9", + "thiserror 1.0.65", "tokio", "tracing", - "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "getrandom 0.3.3", - "lru-slab", - "rand 0.9.2", - "ring 0.17.14", + "rand 0.8.5", + "ring 0.17.8", "rustc-hash 2.1.1", - "rustls 0.23.32", - "rustls-pki-types", + "rustls 0.23.18", "slab", - "thiserror 2.0.17", + "thiserror 1.0.65", "tinyvec", "tracing", - "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" dependencies = [ - "cfg_aliases 0.2.1", "libc", "once_cell", - "socket2 0.6.0", + "socket2 0.5.9", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.52.0", ] [[package]] @@ -18298,19 +18229,13 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ - "proc-macro2 1.0.101", + "proc-macro2 1.0.95", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "radium" version = "0.7.0" @@ -18330,13 +18255,14 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.1", "serde", + "zerocopy 0.8.20", ] [[package]] @@ -18356,7 +18282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.1", ] [[package]] @@ -18365,17 +18291,18 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.10", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.1", "serde", + "zerocopy 0.8.20", ] [[package]] @@ -18399,20 +18326,20 @@ dependencies = [ [[package]] name = "rand_xorshift" -version = "0.4.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.6.4", ] [[package]] name = "raw-cpuid" -version = "11.6.0" +version = "10.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" dependencies = [ - "bitflags 2.9.4", + "bitflags 1.3.2", ] [[package]] @@ -18423,9 +18350,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -18433,9 +18360,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.13.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -18484,22 +18411,31 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.9.4", ] [[package]] name = "redox_users" -version = "0.4.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror 1.0.65", ] [[package]] @@ -18508,30 +18444,30 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87413ebb313323d431e85d0afc5a68222aaed972843537cbfe5f061cf1b4bcab" dependencies = [ - "derive_more 0.99.20", + "derive_more 0.99.17", "fs-err", "static_init", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -18555,7 +18491,7 @@ checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734" dependencies = [ "allocator-api2", "bumpalo", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "log", "rustc-hash 2.1.1", "smallvec", @@ -18563,38 +18499,59 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.3" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" + +[[package]] +name = "regex-automata" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.5", ] [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relative-path" -version = "1.9.3" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" +checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" [[package]] name = "relay-substrate-client" @@ -18632,7 +18589,7 @@ dependencies = [ "sp-trie", "sp-version", "staging-xcm", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -18650,13 +18607,13 @@ dependencies = [ "jsonpath_lib", "log", "num-traits", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "serde_json", "sp-runtime", "sp-tracing 16.0.0", "substrate-prometheus-endpoint", "sysinfo", - "thiserror 1.0.69", + "thiserror 1.0.65", "time", "tokio", ] @@ -18678,9 +18635,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -18688,45 +18645,52 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.12", - "http 1.3.1", - "http-body 1.0.1", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", "http-body-util", - "hyper 1.7.0", - "hyper-rustls 0.27.7", + "hyper 1.6.0", + "hyper-rustls 0.27.3", "hyper-tls", "hyper-util", + "ipnet", "js-sys", "log", "mime", "native-tls", + "once_cell", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.18", + "rustls-pemfile 2.0.0", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.4", - "tower 0.5.2", - "tower-http 0.6.6", + "tokio-rustls 0.26.0", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots 0.26.3", + "windows-registry", ] [[package]] name = "resolv-conf" -version = "0.7.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] [[package]] name = "revive-dev-node" @@ -18745,7 +18709,7 @@ dependencies = [ name = "revive-dev-runtime" version = "0.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "parity-scale-codec", "polkadot-sdk", "scale-info", @@ -18948,7 +18912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ "hmac 0.12.1", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -18968,14 +18932,15 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.14" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.10", "libc", + "spin 0.9.8", "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -19244,20 +19209,20 @@ checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "rpassword" -version = "7.4.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" +checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.59.0", + "winapi", ] [[package]] name = "rsa" -version = "0.9.8" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +checksum = "af6c4b23d99685a1408194da11270ef8e9809aff951cc70ec9b17350b087e474" dependencies = [ "const-oid", "digest 0.10.7", @@ -19269,7 +19234,7 @@ dependencies = [ "rand_core 0.6.4", "signature", "spki", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] @@ -19282,7 +19247,7 @@ dependencies = [ "futures", "futures-timer", "rstest_macros", - "rustc_version 0.4.1", + "rustc_version 0.4.0", ] [[package]] @@ -19293,41 +19258,38 @@ checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" dependencies = [ "cfg-if", "glob", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "regex", "relative-path", - "rustc_version 0.4.1", - "syn 2.0.106", + "rustc_version 0.4.0", + "syn 2.0.98", "unicode-ident", ] [[package]] name = "rtnetlink" -version = "0.13.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" dependencies = [ "futures", "log", - "netlink-packet-core", "netlink-packet-route", - "netlink-packet-utils", "netlink-proto", - "netlink-sys", - "nix 0.26.4", - "thiserror 1.0.69", + "nix 0.24.3", + "thiserror 1.0.65", "tokio", ] [[package]] name = "rtoolbox" -version = "0.0.3" +version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cc970b249fbe527d6e02e0a227762c9108b2f49d81094fe357ffc6d14d7f6f" +checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" dependencies = [ "libc", - "windows-sys 0.52.0", + "winapi", ] [[package]] @@ -19344,14 +19306,13 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", - "ark-ff 0.5.0", "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", @@ -19362,10 +19323,10 @@ dependencies = [ "primitive-types 0.12.2", "proptest", "rand 0.8.5", - "rand 0.9.2", + "rand 0.9.0", "rlp 0.5.2", "ruint-macro", - "serde_core", + "serde", "valuable", "zeroize", ] @@ -19378,9 +19339,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -19420,11 +19381,11 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.27", + "semver 1.0.18", ] [[package]] @@ -19438,54 +19399,68 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "0.37.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.4.15", + "linux-raw-sys 0.4.14", "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "1.1.2" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.1", + "linux-raw-sys 0.9.4", + "windows-sys 0.60.2", ] [[package]] name = "rustls" -version = "0.21.12" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", - "ring 0.17.14", - "rustls-webpki 0.101.7", + "ring 0.16.20", + "rustls-webpki 0.101.4", "sct", ] [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" dependencies = [ "log", "once_cell", - "ring 0.17.14", + "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.103.6", - "subtle 2.6.1", + "rustls-webpki 0.102.8", + "subtle 2.5.0", "zeroize", ] @@ -19496,95 +19471,115 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.3", "schannel", - "security-framework 2.11.1", + "security-framework", ] [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" dependencies = [ "openssl-probe", + "rustls-pemfile 2.0.0", "rustls-pki-types", "schannel", - "security-framework 3.5.1", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.0.0", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ "base64 0.21.7", ] [[package]] -name = "rustls-pki-types" -version = "1.12.0" +name = "rustls-pemfile" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" dependencies = [ - "web-time", - "zeroize", + "base64 0.21.7", + "rustls-pki-types", ] +[[package]] +name = "rustls-pki-types" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" + [[package]] name = "rustls-platform-verifier" -version = "0.5.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +checksum = "b5f0d26fa1ce3c790f9590868f0109289a044acb954525f933e2aa3b871c157d" dependencies = [ - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "jni", "log", "once_cell", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.18", + "rustls-native-certs 0.7.0", "rustls-platform-verifier-android", - "rustls-webpki 0.103.6", - "security-framework 3.5.1", + "rustls-webpki 0.102.8", + "security-framework", "security-framework-sys", - "webpki-root-certs 0.26.11", - "windows-sys 0.59.0", + "webpki-roots 0.26.3", + "winapi", ] [[package]] name = "rustls-platform-verifier-android" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" +checksum = "84e217e7fdc8466b5b35d30f8c0a30febd29173df4a3a0c2115d306b9c4117ad" [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "ring 0.17.14", + "ring 0.17.8", "rustls-pki-types", "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -19605,7 +19600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5174a470eeb535a721ae9fdd6e291c2411a906b96592182d05217591d5c5cf7b" dependencies = [ "byteorder", - "derive_more 0.99.20", + "derive_more 0.99.17", ] [[package]] @@ -19627,9 +19622,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "safe-mix" @@ -19642,9 +19637,9 @@ dependencies = [ [[package]] name = "safe_arch" -version = "0.7.4" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" dependencies = [ "bytemuck", ] @@ -19674,7 +19669,7 @@ dependencies = [ "log", "sp-core 28.0.0", "sp-wasm-interface 20.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -19709,7 +19704,7 @@ dependencies = [ "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -19720,7 +19715,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-proposer-metrics", @@ -19758,10 +19753,10 @@ dependencies = [ name = "sc-chain-spec" version = "28.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "clap", "docify", - "memmap2 0.9.8", + "memmap2 0.9.3", "parity-scale-codec", "pretty_assertions", "regex", @@ -19790,17 +19785,17 @@ dependencies = [ name = "sc-chain-spec-derive" version = "11.0.0" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "sc-cli" version = "0.36.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "bip39", "chrono", "clap", @@ -19836,7 +19831,7 @@ dependencies = [ "sp-tracing 16.0.0", "sp-version", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -19848,7 +19843,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-executor", "sc-transaction-pool-api", "sc-utils", @@ -19870,7 +19865,7 @@ dependencies = [ name = "sc-client-db" version = "0.35.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "criterion", "hash-db", "kitchensink-runtime", @@ -19881,7 +19876,7 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "sc-client-api", "sc-state-db", @@ -19908,7 +19903,7 @@ dependencies = [ "futures", "log", "mockall", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-client-api", "sc-network-types", "sc-utils", @@ -19920,7 +19915,7 @@ dependencies = [ "sp-state-machine", "sp-test-primitives", "substrate-prometheus-endpoint", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -19932,7 +19927,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -19958,7 +19953,7 @@ dependencies = [ "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -19974,7 +19969,7 @@ dependencies = [ "num-rational", "num-traits", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -20000,7 +19995,7 @@ dependencies = [ "sp-tracing 16.0.0", "substrate-prometheus-endpoint", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -20026,7 +20021,7 @@ dependencies = [ "sp-keystore", "sp-runtime", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -20034,13 +20029,13 @@ dependencies = [ name = "sc-consensus-beefy" version = "13.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "async-trait", "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -20064,7 +20059,7 @@ dependencies = [ "sp-tracing 16.0.0", "substrate-prometheus-endpoint", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "wasm-timer", ] @@ -20077,7 +20072,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-consensus-beefy", "sc-rpc", "serde", @@ -20086,7 +20081,7 @@ dependencies = [ "sp-core 28.0.0", "sp-runtime", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -20107,7 +20102,7 @@ name = "sc-consensus-grandpa" version = "0.19.0" dependencies = [ "ahash", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "async-trait", "dyn-clone", @@ -20117,7 +20112,7 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "sc-block-builder", "sc-chain-spec", @@ -20147,7 +20142,7 @@ dependencies = [ "sp-tracing 16.0.0", "substrate-prometheus-endpoint", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -20171,7 +20166,7 @@ dependencies = [ "sp-keyring", "sp-runtime", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -20209,7 +20204,7 @@ dependencies = [ "substrate-prometheus-endpoint", "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -20222,7 +20217,7 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-client-api", "sc-consensus", "sp-api", @@ -20234,7 +20229,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -20264,12 +20259,12 @@ dependencies = [ name = "sc-executor" version = "0.32.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "criterion", "num_cpus", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "paste", "sc-executor-common", "sc-executor-polkavm", @@ -20294,7 +20289,7 @@ dependencies = [ "substrate-test-runtime", "tempfile", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", "wat", ] @@ -20306,7 +20301,7 @@ dependencies = [ "sc-allocator", "sp-maybe-compressed-blob", "sp-wasm-interface 20.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "wasm-instrument", ] @@ -20328,9 +20323,9 @@ dependencies = [ "cargo_metadata", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "paste", - "rustix 1.1.2", + "rustix 1.0.8", "sc-allocator", "sc-executor-common", "sc-runtime-test", @@ -20361,21 +20356,21 @@ dependencies = [ name = "sc-keystore" version = "25.0.0" dependencies = [ - "array-bytes 6.2.3", - "parking_lot 0.12.4", + "array-bytes 6.2.2", + "parking_lot 0.12.3", "serde_json", "sp-application-crypto", "sp-core 28.0.0", "sp-keystore", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "sc-mixnet" version = "0.4.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "arrayvec 0.7.6", "blake2 0.10.6", "bytes", @@ -20384,7 +20379,7 @@ dependencies = [ "log", "mixnet", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-client-api", "sc-network", "sc-network-types", @@ -20395,14 +20390,14 @@ dependencies = [ "sp-keystore", "sp-mixnet", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "sc-network" version = "0.34.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "async-channel 1.9.0", "async-trait", @@ -20422,7 +20417,7 @@ dependencies = [ "mockall", "multistream-select", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "partial_sort", "pin-project", "prost 0.12.6", @@ -20448,7 +20443,7 @@ dependencies = [ "substrate-test-runtime", "substrate-test-runtime-client", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-stream", "tokio-util", @@ -20494,7 +20489,7 @@ dependencies = [ name = "sc-network-light" version = "0.33.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "futures", "log", @@ -20507,14 +20502,14 @@ dependencies = [ "sp-blockchain", "sp-core 28.0.0", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "sc-network-statement" version = "0.16.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "futures", "log", @@ -20533,7 +20528,7 @@ dependencies = [ name = "sc-network-sync" version = "0.33.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "async-trait", "fork-tree", @@ -20563,7 +20558,7 @@ dependencies = [ "sp-tracing 16.0.0", "substrate-prometheus-endpoint", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-stream", ] @@ -20578,7 +20573,7 @@ dependencies = [ "futures-timer", "libp2p", "log", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "sc-block-builder", "sc-client-api", @@ -20604,7 +20599,7 @@ dependencies = [ name = "sc-network-transactions" version = "0.33.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "futures", "log", "parity-scale-codec", @@ -20629,13 +20624,13 @@ dependencies = [ "libp2p-kad", "litep2p", "log", - "multiaddr 0.18.2", - "multihash 0.19.3", + "multiaddr 0.18.1", + "multihash 0.19.1", "quickcheck", "rand 0.8.5", "serde", "serde_with", - "thiserror 1.0.69", + "thiserror 1.0.65", "zeroize", ] @@ -20649,15 +20644,15 @@ dependencies = [ "futures", "futures-timer", "http-body-util", - "hyper 1.7.0", - "hyper-rustls 0.27.7", + "hyper 1.6.0", + "hyper-rustls 0.27.3", "hyper-util", "num_cpus", "once_cell", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", - "rustls 0.23.32", + "rustls 0.23.18", "sc-block-builder", "sc-client-api", "sc-client-db", @@ -20697,7 +20692,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pretty_assertions", "sc-block-builder", "sc-chain-spec", @@ -20742,7 +20737,7 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-version", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -20753,9 +20748,9 @@ dependencies = [ "forwarded-header-value", "futures", "governor", - "http 1.3.1", + "http 1.1.0", "http-body-util", - "hyper 1.7.0", + "hyper 1.6.0", "ip_network", "jsonrpsee", "log", @@ -20764,7 +20759,7 @@ dependencies = [ "serde_json", "substrate-prometheus-endpoint", "tokio", - "tower 0.4.13", + "tower", "tower-http 0.5.2", ] @@ -20772,7 +20767,7 @@ dependencies = [ name = "sc-rpc-spec-v2" version = "0.34.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "async-trait", "futures", @@ -20782,7 +20777,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pretty_assertions", "rand 0.8.5", "sc-block-builder", @@ -20809,7 +20804,7 @@ dependencies = [ "substrate-test-runtime", "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-stream", ] @@ -20841,7 +20836,7 @@ dependencies = [ "sp-version", "sp-wasm-interface 20.0.0", "subxt 0.43.0", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -20856,7 +20851,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "sc-chain-spec", @@ -20903,7 +20898,7 @@ dependencies = [ "substrate-test-runtime", "substrate-test-runtime-client", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tracing", "tracing-futures", @@ -20913,13 +20908,13 @@ dependencies = [ name = "sc-service-test" version = "2.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-channel 1.9.0", "fdlimit", "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-client-db", @@ -20950,7 +20945,7 @@ version = "0.30.0" dependencies = [ "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sp-core 28.0.0", ] @@ -20960,7 +20955,7 @@ version = "10.0.0" dependencies = [ "log", "parity-db", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-client-api", "sc-keystore", "sp-api", @@ -20982,7 +20977,7 @@ dependencies = [ "fs4", "log", "sp-core 28.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -21001,14 +20996,14 @@ dependencies = [ "serde_json", "sp-blockchain", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] name = "sc-sysinfo" version = "27.0.0" dependencies = [ - "derive_more 0.99.20", + "derive_more 0.99.17", "futures", "libc", "log", @@ -21032,13 +21027,13 @@ dependencies = [ "futures", "libp2p", "log", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "sc-utils", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "wasm-timer", ] @@ -21053,7 +21048,7 @@ dependencies = [ "libc", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "regex", "rustc-hash 1.1.0", "sc-client-api", @@ -21065,20 +21060,20 @@ dependencies = [ "sp-rpc", "sp-runtime", "sp-tracing 16.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "tracing-log", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] name = "sc-tracing-proc-macro" version = "11.0.0" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -21091,14 +21086,14 @@ dependencies = [ "chrono", "criterion", "cumulus-zombienet-sdk-helpers", - "env_logger 0.11.8", + "env_logger 0.11.3", "futures", "futures-timer", - "indexmap 2.11.4", + "indexmap 2.9.0", "itertools 0.11.0", "linked-hash-map", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rstest", "sc-block-builder", "sc-client-api", @@ -21119,11 +21114,11 @@ dependencies = [ "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", "substrate-txtesttool", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-stream", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", "zombienet-configuration", "zombienet-sdk", ] @@ -21134,7 +21129,7 @@ version = "28.0.0" dependencies = [ "async-trait", "futures", - "indexmap 2.11.4", + "indexmap 2.9.0", "log", "parity-scale-codec", "serde", @@ -21142,7 +21137,7 @@ dependencies = [ "sp-blockchain", "sp-core 28.0.0", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -21153,7 +21148,7 @@ dependencies = [ "futures", "futures-timer", "log", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "prometheus", "sp-arithmetic", "tokio-test", @@ -21183,7 +21178,7 @@ dependencies = [ "scale-decode-derive", "scale-type-resolver", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] @@ -21192,10 +21187,10 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f4b54a1211260718b92832b661025d1f1a4b6930fbadd6908e00edd265fa5f7" dependencies = [ - "darling 0.20.11", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "darling 0.20.10", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -21210,7 +21205,7 @@ dependencies = [ "scale-encode-derive", "scale-type-resolver", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] @@ -21219,11 +21214,11 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78a3993a13b4eafa89350604672c8757b7ea84c7c5947d4b3691e3169c96379b" dependencies = [ - "darling 0.20.11", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "darling 0.20.10", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -21246,10 +21241,10 @@ version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" dependencies = [ - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -21268,11 +21263,11 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05c61b6b706a3eaad63b506ab50a1d2319f817ae01cf753adcc3f055f9f0fcd6" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "scale-info", - "syn 2.0.106", - "thiserror 2.0.17", + "syn 2.0.98", + "thiserror 2.0.12", ] [[package]] @@ -21290,96 +21285,59 @@ dependencies = [ "scale-encode", "scale-type-resolver", "serde", - "thiserror 2.0.17", + "thiserror 2.0.12", "yap", ] [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.61.1", + "windows-sys 0.48.0", ] [[package]] name = "schemars" -version = "0.8.22" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +checksum = "763f8cd0d4c71ed8389c90cb8100cba87e763bd01a8e614d4f0af97bcd50a161" dependencies = [ "dyn-clone", - "schemars_derive 0.8.22", + "schemars_derive", "serde", "serde_json", ] [[package]] -name = "schemars" -version = "0.9.0" +name = "schemars_derive" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +checksum = "ec0f696e21e10fa546b7ffb1c9672c6de8fbc7a81acf59524386d8639bf12737" dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", + "proc-macro2 1.0.95", + "quote 1.0.40", + "serde_derive_internals", + "syn 1.0.109", ] [[package]] -name = "schemars" -version = "1.0.4" +name = "schnellru" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" dependencies = [ - "dyn-clone", - "ref-cast", - "schemars_derive 1.0.4", - "serde", - "serde_json", + "ahash", + "cfg-if", + "hashbrown 0.13.2", ] [[package]] -name = "schemars_derive" -version = "0.8.22" +name = "schnorrkel" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" -dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "serde_derive_internals", - "syn 2.0.106", -] - -[[package]] -name = "schemars_derive" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d020396d1d138dc19f1165df7545479dcd58d93810dc5d646a16e55abefa80" -dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "serde_derive_internals", - "syn 2.0.106", -] - -[[package]] -name = "schnellru" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356285bbf17bea63d9e52e96bd18f039672ac92b55b8cb997d6162a2a37d1649" -dependencies = [ - "ahash", - "cfg-if", - "hashbrown 0.13.2", -] - -[[package]] -name = "schnorrkel" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "844b7645371e6ecdf61ff246ba1958c29e802881a749ae3fb1993675d210d28d" +checksum = "844b7645371e6ecdf61ff246ba1958c29e802881a749ae3fb1993675d210d28d" dependencies = [ "arrayref", "arrayvec 0.7.6", @@ -21394,9 +21352,9 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.11.5" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9fcb6c2e176e86ec703e22560d99d65a5ee9056ae45a08e13e84ebf796296f" +checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" dependencies = [ "aead", "arrayref", @@ -21407,10 +21365,16 @@ dependencies = [ "rand_core 0.6.4", "serde_bytes", "sha2 0.10.9", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -21419,9 +21383,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scratch" -version = "1.0.9" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" +checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" [[package]] name = "scrypt" @@ -21437,12 +21401,12 @@ dependencies = [ [[package]] name = "sct" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -21456,7 +21420,7 @@ dependencies = [ "generic-array 0.14.7", "pkcs8", "serdect", - "subtle 2.6.1", + "subtle 2.5.0", "zeroize", ] @@ -21469,15 +21433,6 @@ dependencies = [ "libc", ] -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys 0.8.2", -] - [[package]] name = "secp256k1" version = "0.28.2" @@ -21505,19 +21460,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes 0.14.0", - "rand 0.9.2", + "rand 0.9.0", "secp256k1-sys 0.11.0", ] -[[package]] -name = "secp256k1-sys" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4473013577ec77b4ee3668179ef1186df3146e2cf2d927bd200974c6fe60fd99" -dependencies = [ - "cc", -] - [[package]] name = "secp256k1-sys" version = "0.9.2" @@ -21566,35 +21512,23 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.4", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ "bitflags 2.9.4", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", + "num-bigint", "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -21624,17 +21558,16 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser 0.10.3", + "semver-parser 0.10.2", ] [[package]] name = "semver" -version = "1.0.27" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" dependencies = [ "serde", - "serde_core", ] [[package]] @@ -21645,9 +21578,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "semver-parser" -version = "0.10.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ "pest", ] @@ -21660,11 +21593,10 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ - "serde_core", "serde_derive", ] @@ -21689,43 +21621,33 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.19" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ "serde", - "serde_core", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "serde_derive_internals" -version = "0.29.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 1.0.109", ] [[package]] @@ -21739,36 +21661,26 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.9.0", "itoa", "memchr", "ryu", "serde", - "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.9" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" -dependencies = [ - "serde_core", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -21783,17 +21695,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", - "schemars 0.9.0", - "schemars 1.0.4", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -21803,14 +21713,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ - "darling 0.21.3", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "darling 0.20.10", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -21819,7 +21729,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.9.0", "itoa", "ryu", "serde", @@ -21857,7 +21767,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.1", + "opaque-debug 0.3.0", ] [[package]] @@ -21899,9 +21809,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.7" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" dependencies = [ "lazy_static", ] @@ -21914,18 +21824,18 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "signature" -version = "2.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -21933,9 +21843,9 @@ dependencies = [ [[package]] name = "simba" -version = "0.9.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" dependencies = [ "approx", "num-complex", @@ -21973,9 +21883,12 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "slice-group-by" @@ -21995,9 +21908,9 @@ dependencies = [ [[package]] name = "slotmap" -version = "1.0.7" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" dependencies = [ "version_check", ] @@ -22015,9 +21928,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" dependencies = [ "serde", ] @@ -22028,15 +21941,15 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" dependencies = [ - "async-channel 2.5.0", + "async-channel 2.3.0", "async-executor", "async-fs", - "async-io", - "async-lock", + "async-io 2.3.3", + "async-lock 3.4.0", "async-net", "async-process", "blocking", - "futures-lite 2.6.1", + "futures-lite 2.3.0", ] [[package]] @@ -22046,7 +21959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "966e72d77a3b2171bb7461d0cb91f43670c63558c62d7cf42809cae6c8b6b818" dependencies = [ "arrayvec 0.7.6", - "async-lock", + "async-lock 3.4.0", "atomic-take", "base64 0.22.1", "bip39", @@ -22054,12 +21967,12 @@ dependencies = [ "bs58", "chacha20", "crossbeam-queue", - "derive_more 0.99.20", + "derive_more 0.99.17", "ed25519-zebra", "either", - "event-listener 5.4.1", + "event-listener 5.3.1", "fnv", - "futures-lite 2.6.1", + "futures-lite 2.3.0", "futures-util", "hashbrown 0.14.5", "hex", @@ -22078,7 +21991,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "ruzstd 0.6.0", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "serde", "serde_json", "sha2 0.10.9", @@ -22100,7 +22013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16e5723359f0048bf64bfdfba64e5732a56847d42c4fd3fe56f18280c813413" dependencies = [ "arrayvec 0.7.6", - "async-lock", + "async-lock 3.4.0", "atomic-take", "base64 0.22.1", "bip39", @@ -22111,11 +22024,11 @@ dependencies = [ "derive_more 2.0.1", "ed25519-zebra", "either", - "event-listener 5.4.1", + "event-listener 5.3.1", "fnv", - "futures-lite 2.6.1", + "futures-lite 2.3.0", "futures-util", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "hex", "hmac 0.12.1", "itertools 0.14.0", @@ -22132,7 +22045,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "ruzstd 0.8.1", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "serde", "serde_json", "sha2 0.10.9", @@ -22141,7 +22054,7 @@ dependencies = [ "slab", "smallvec", "soketto", - "twox-hash 2.1.2", + "twox-hash 2.1.1", "wasmi 0.40.0", "x25519-dalek", "zeroize", @@ -22153,24 +22066,24 @@ version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a33b06891f687909632ce6a4e3fd7677b24df930365af3d0bcb078310129f3f" dependencies = [ - "async-channel 2.5.0", - "async-lock", + "async-channel 2.3.0", + "async-lock 3.4.0", "base64 0.22.1", "blake2-rfc", "bs58", - "derive_more 0.99.20", + "derive_more 0.99.17", "either", - "event-listener 5.4.1", + "event-listener 5.3.1", "fnv", "futures-channel", - "futures-lite 2.6.1", + "futures-lite 2.3.0", "futures-util", "hashbrown 0.14.5", "hex", "itertools 0.13.0", "log", "lru", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "rand_chacha 0.3.1", @@ -22189,24 +22102,24 @@ version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bba9e591716567d704a8252feeb2f1261a286e1e2cbdd4e49e9197c34a14e2" dependencies = [ - "async-channel 2.5.0", - "async-lock", + "async-channel 2.3.0", + "async-lock 3.4.0", "base64 0.22.1", "blake2-rfc", "bs58", "derive_more 2.0.1", "either", - "event-listener 5.4.1", + "event-listener 5.3.1", "fnv", "futures-channel", - "futures-lite 2.6.1", + "futures-lite 2.3.0", "futures-util", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "hex", "itertools 0.14.0", "log", "lru", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "rand_chacha 0.3.1", @@ -22221,9 +22134,9 @@ dependencies = [ [[package]] name = "snap" -version = "1.1.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" +checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" [[package]] name = "snow" @@ -22236,10 +22149,10 @@ dependencies = [ "chacha20poly1305", "curve25519-dalek", "rand_core 0.6.4", - "ring 0.17.14", - "rustc_version 0.4.1", + "ring 0.17.8", + "rustc_version 0.4.0", "sha2 0.10.9", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -22348,7 +22261,7 @@ dependencies = [ name = "snowbridge-merkle-tree" version = "0.2.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "hex", "hex-literal", "parity-scale-codec", @@ -22777,34 +22690,34 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", - "windows-sys 0.52.0", + "winapi", ] [[package]] name = "socket2" -version = "0.6.0" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "soketto" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" dependencies = [ "base64 0.22.1", "bytes", "futures", - "http 1.3.1", + "http 1.1.0", "httparse", "log", "rand 0.8.5", @@ -22911,7 +22824,7 @@ dependencies = [ "sp-test-primitives", "sp-trie", "sp-version", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -22922,10 +22835,10 @@ dependencies = [ "assert_matches", "blake2 0.10.6", "expander", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -23029,7 +22942,7 @@ version = "28.0.0" dependencies = [ "futures", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "schnellru", "sp-api", "sp-consensus", @@ -23037,7 +22950,7 @@ dependencies = [ "sp-database", "sp-runtime", "sp-state-machine", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", ] @@ -23051,7 +22964,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -23090,7 +23003,7 @@ dependencies = [ name = "sp-consensus-beefy" version = "13.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "parity-scale-codec", "scale-info", "serde", @@ -23162,7 +23075,7 @@ name = "sp-core" version = "28.0.0" dependencies = [ "ark-vrf", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "bip39", "bitflags 1.3.2", "blake2 0.10.6", @@ -23181,13 +23094,13 @@ dependencies = [ "log", "merlin", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "paste", "primitive-types 0.13.1", "rand 0.8.5", "regex", "scale-info", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "secp256k1 0.28.2", "secrecy 0.8.0", "serde", @@ -23200,7 +23113,7 @@ dependencies = [ "sp-storage 19.0.0", "ss58-registry", "substrate-bip39 0.4.7", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "w3f-bls", "zeroize", @@ -23213,10 +23126,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cdbb58c21e6b27f2aadf3ff0c8b20a8ead13b9dfe63f46717fd59334517f3b4" dependencies = [ "ark-vrf", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "bitflags 1.3.2", "blake2 0.10.6", - "bounded-collections 0.2.4", + "bounded-collections 0.2.3", "bs58", "dyn-clonable", "ed25519-zebra", @@ -23231,12 +23144,12 @@ dependencies = [ "merlin", "parity-bip39", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "paste", "primitive-types 0.13.1", "rand 0.8.5", "scale-info", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "secp256k1 0.28.2", "secrecy 0.8.0", "serde", @@ -23248,7 +23161,7 @@ dependencies = [ "sp-storage 22.0.0", "ss58-registry", "substrate-bip39 0.6.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "w3f-bls", "zeroize", @@ -23328,9 +23241,9 @@ dependencies = [ name = "sp-crypto-hashing-proc-macro" version = "0.1.0" dependencies = [ - "quote 1.0.41", + "quote 1.0.40", "sp-crypto-hashing 0.1.0", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -23338,16 +23251,16 @@ name = "sp-database" version = "10.0.0" dependencies = [ "kvdb", - "parking_lot 0.12.4", + "parking_lot 0.12.3", ] [[package]] name = "sp-debug-derive" version = "14.0.0" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -23356,9 +23269,9 @@ version = "14.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48d09fa0a5f7299fb81ee25ae3853d26200f7a348148aed6de76be905c007dbe" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -23402,7 +23315,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -23444,7 +23357,7 @@ name = "sp-keystore" version = "0.34.0" dependencies = [ "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sp-core 28.0.0", "sp-externalities 0.25.0", ] @@ -23453,7 +23366,7 @@ dependencies = [ name = "sp-maybe-compressed-blob" version = "11.0.0" dependencies = [ - "thiserror 1.0.69", + "thiserror 1.0.65", "zstd 0.12.4", ] @@ -23480,7 +23393,7 @@ dependencies = [ name = "sp-mmr-primitives" version = "26.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "log", "parity-scale-codec", "polkadot-ckb-merkle-mountain-range", @@ -23490,7 +23403,7 @@ dependencies = [ "sp-core 28.0.0", "sp-debug-derive 14.0.0", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -23626,10 +23539,10 @@ version = "17.0.0" dependencies = [ "Inflector", "expander", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -23640,10 +23553,10 @@ checksum = "0195f32c628fee3ce1dfbbf2e7e52a30ea85f3589da9fe62a8b816d70fc06294" dependencies = [ "Inflector", "expander", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -23713,12 +23626,12 @@ name = "sp-state-machine" version = "0.35.0" dependencies = [ "arbitrary", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_matches", "hash-db", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pretty_assertions", "rand 0.8.5", "smallvec", @@ -23727,7 +23640,7 @@ dependencies = [ "sp-panic-handler", "sp-runtime", "sp-trie", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "trie-db", ] @@ -23751,7 +23664,7 @@ dependencies = [ "sp-externalities 0.25.0", "sp-runtime", "sp-runtime-interface 24.0.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "x25519-dalek", ] @@ -23809,7 +23722,7 @@ dependencies = [ "parity-scale-codec", "sp-inherents", "sp-runtime", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -23820,7 +23733,7 @@ dependencies = [ "regex", "tracing", "tracing-core", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] @@ -23832,7 +23745,7 @@ dependencies = [ "parity-scale-codec", "tracing", "tracing-core", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] @@ -23861,15 +23774,15 @@ name = "sp-trie" version = "29.0.0" dependencies = [ "ahash", - "array-bytes 6.2.3", + "array-bytes 6.2.2", "criterion", - "foldhash 0.1.5", + "foldhash", "hash-db", - "hashbrown 0.15.5", + "hashbrown 0.15.3", "memory-db", "nohash-hasher", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "rand 0.8.5", "scale-info", "schnellru", @@ -23877,7 +23790,7 @@ dependencies = [ "sp-externalities 0.25.0", "sp-runtime", "substrate-prometheus-endpoint", - "thiserror 1.0.69", + "thiserror 1.0.65", "tracing", "trie-bench", "trie-db", @@ -23898,7 +23811,7 @@ dependencies = [ "sp-runtime", "sp-std 14.0.0", "sp-version-proc-macro", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -23907,10 +23820,10 @@ version = "13.0.0" dependencies = [ "parity-scale-codec", "proc-macro-warning", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "sp-version", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -23943,7 +23856,7 @@ dependencies = [ "bounded-collections 0.3.2", "parity-scale-codec", "scale-info", - "schemars 0.8.22", + "schemars", "serde", "smallvec", "sp-arithmetic", @@ -23977,29 +23890,30 @@ dependencies = [ ] [[package]] -name = "spinning_top" -version = "0.3.0" +name = "spki" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ - "lock_api", + "base64ct", + "der", ] [[package]] -name = "spki" -version = "0.7.3" +name = "sqlformat" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ - "base64ct", - "der", + "nom 7.1.3", + "unicode_categories", ] [[package]] name = "sqlx" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -24010,32 +23924,37 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" dependencies = [ - "base64 0.22.1", + "atoi", + "byteorder", "bytes", "crc", "crossbeam-queue", "either", - "event-listener 5.4.1", + "event-listener 5.3.1", + "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.5", - "hashlink 0.10.0", - "indexmap 2.11.4", + "hashbrown 0.14.5", + "hashlink 0.9.1", + "hex", + "indexmap 2.9.0", "log", "memchr", "once_cell", + "paste", "percent-encoding", "serde", "serde_json", "sha2 0.10.9", "smallvec", - "thiserror 2.0.17", + "sqlformat", + "thiserror 1.0.65", "tokio", "tokio-stream", "tracing", @@ -24044,30 +23963,30 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "sqlx-core", "sqlx-macros-core", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "sqlx-macros-core" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ "dotenvy", "either", "heck 0.5.0", "hex", "once_cell", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "serde", "serde_json", "sha2 0.10.9", @@ -24075,16 +23994,17 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.106", + "syn 2.0.98", + "tempfile", "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", "base64 0.22.1", @@ -24117,16 +24037,16 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 1.0.65", "tracing", "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", "base64 0.22.1", @@ -24137,6 +24057,7 @@ dependencies = [ "etcetera", "futures-channel", "futures-core", + "futures-io", "futures-util", "hex", "hkdf", @@ -24154,16 +24075,16 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.17", + "thiserror 1.0.65", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.8.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", "flume", @@ -24178,24 +24099,23 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.17", "tracing", "url", ] [[package]] name = "ss58-registry" -version = "1.51.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19409f13998e55816d1c728395af0b52ec066206341d939e22e7766df9b494b8" +checksum = "5e6915280e2d0db8911e5032a5c275571af6bdded2916abd691a659be25d3439" dependencies = [ "Inflector", "num-format", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "serde", "serde_json", - "unicode-xid 0.2.6", + "unicode-xid 0.2.4", ] [[package]] @@ -24216,8 +24136,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -24246,7 +24166,7 @@ dependencies = [ name = "staging-node-cli" version = "3.0.0-dev" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "assert_cmd", "clap", "clap_complete", @@ -24293,7 +24213,7 @@ dependencies = [ "sp-io", "sp-runtime", "sp-statement-store", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -24316,7 +24236,7 @@ version = "2.0.0" name = "staging-xcm" version = "7.0.1" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "bounded-collections 0.3.2", "derive-where", "environmental", @@ -24325,7 +24245,7 @@ dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", "scale-info", - "schemars 0.8.22", + "schemars", "serde", "sp-io", "sp-runtime", @@ -24394,29 +24314,29 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "static_init" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bae1df58c5fea7502e8e352ec26b5579f6178e1fdb311e088580c980dee25ed" +checksum = "8a2a1c578e98c1c16fc3b8ec1328f7659a500737d7a0c6d625e73e830ff9c1f6" dependencies = [ "bitflags 1.3.2", - "cfg_aliases 0.2.1", + "cfg_aliases 0.1.1", "libc", - "parking_lot 0.12.4", - "parking_lot_core 0.9.11", + "parking_lot 0.11.2", + "parking_lot_core 0.8.6", "static_init_macro", "winapi", ] [[package]] name = "static_init_macro" -version = "1.0.4" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1389c88ddd739ec6d3f8f83343764a0e944cd23cfbf126a9796a714b0b6edd6f" +checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" dependencies = [ "cfg_aliases 0.1.1", "memchr", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", ] @@ -24473,8 +24393,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "rustversion", "syn 1.0.109", ] @@ -24486,10 +24406,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ "heck 0.5.0", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "rustversion", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -24508,7 +24428,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2", "rustc-hex", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "sha2 0.10.9", "zeroize", ] @@ -24521,7 +24441,7 @@ checksum = "ca58ffd742f693dc13d69bdbb2e642ae239e0053f6aab3b104252892f856700a" dependencies = [ "hmac 0.12.1", "pbkdf2", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "sha2 0.10.9", "zeroize", ] @@ -24606,11 +24526,11 @@ name = "substrate-prometheus-endpoint" version = "0.17.0" dependencies = [ "http-body-util", - "hyper 1.7.0", + "hyper 1.6.0", "hyper-util", "log", "prometheus", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", ] @@ -24653,7 +24573,7 @@ dependencies = [ "sp-runtime", "sp-trie", "strum 0.26.3", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -24690,7 +24610,7 @@ dependencies = [ name = "substrate-test-client" version = "2.0.1" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "async-trait", "futures", "parity-scale-codec", @@ -24714,7 +24634,7 @@ dependencies = [ name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "frame-executive", "frame-metadata-hash-extension", "frame-support", @@ -24790,13 +24710,13 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "sc-transaction-pool", "sc-transaction-pool-api", "sp-blockchain", "sp-runtime", "substrate-test-runtime-client", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -24820,8 +24740,8 @@ dependencies = [ "hex", "jsonrpsee", "parity-scale-codec", - "parking_lot 0.12.4", - "rand 0.9.2", + "parking_lot 0.12.3", + "rand 0.9.0", "serde", "serde_json", "subxt 0.41.0", @@ -24829,19 +24749,19 @@ dependencies = [ "subxt-rpcs 0.41.0", "subxt-signer 0.41.0", "termplot", - "thiserror 2.0.17", + "thiserror 2.0.12", "time", "tokio", "tokio-util", "tracing", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] name = "substrate-wasm-builder" version = "17.0.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "build-helper", "cargo_metadata", "console", @@ -24861,7 +24781,7 @@ dependencies = [ "sp-version", "strum 0.26.3", "tempfile", - "toml 0.8.23", + "toml", "walkdir", "wasm-opt", ] @@ -24874,9 +24794,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" [[package]] name = "subtle" -version = "2.6.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subtle-ng" @@ -24912,7 +24832,7 @@ dependencies = [ "subxt-macro 0.41.0", "subxt-metadata 0.41.0", "subxt-rpcs 0.41.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio", "tokio-util", "tracing", @@ -24949,7 +24869,7 @@ dependencies = [ "subxt-macro 0.43.0", "subxt-metadata 0.43.0", "subxt-rpcs 0.43.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio", "tokio-util", "tracing", @@ -24966,13 +24886,13 @@ checksum = "324c52c09919fec8c22a4b572a466878322e99fe14a9e3d50d6c3700a226ec25" dependencies = [ "heck 0.5.0", "parity-scale-codec", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "scale-info", "scale-typegen", "subxt-metadata 0.41.0", - "syn 2.0.106", - "thiserror 2.0.17", + "syn 2.0.98", + "thiserror 2.0.12", ] [[package]] @@ -24983,13 +24903,13 @@ checksum = "1728caecd9700391e78cc30dc298221d6f5ca0ea28258a452aa76b0b7c229842" dependencies = [ "heck 0.5.0", "parity-scale-codec", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "scale-info", "scale-typegen", "subxt-metadata 0.43.0", - "syn 2.0.106", - "thiserror 2.0.17", + "syn 2.0.98", + "thiserror 2.0.12", ] [[package]] @@ -25018,7 +24938,7 @@ dependencies = [ "serde_json", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "subxt-metadata 0.41.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "tracing", ] @@ -25048,7 +24968,7 @@ dependencies = [ "serde_json", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "subxt-metadata 0.43.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "tracing", ] @@ -25063,7 +24983,7 @@ dependencies = [ "serde", "serde_json", "smoldot-light 0.16.2", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -25080,7 +25000,7 @@ dependencies = [ "serde", "serde_json", "smoldot-light 0.17.2", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -25092,14 +25012,14 @@ version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c2c8da275a620dd676381d72395dfea91f0a6cd849665b4f1d0919371850701" dependencies = [ - "darling 0.20.11", + "darling 0.20.10", "parity-scale-codec", "proc-macro-error2", - "quote 1.0.41", + "quote 1.0.40", "scale-typegen", "subxt-codegen 0.41.0", "subxt-utils-fetchmetadata 0.41.0", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -25108,15 +25028,15 @@ version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69516e8ff0e9340a0f21b8398da7f997571af4734ee81deada5150a2668c8443" dependencies = [ - "darling 0.20.11", + "darling 0.20.10", "parity-scale-codec", "proc-macro-error2", - "quote 1.0.41", + "quote 1.0.40", "scale-typegen", "subxt-codegen 0.43.0", "subxt-metadata 0.43.0", "subxt-utils-fetchmetadata 0.43.0", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -25131,7 +25051,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] @@ -25146,7 +25066,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] @@ -25167,7 +25087,7 @@ dependencies = [ "serde_json", "subxt-core 0.41.0", "subxt-lightclient 0.41.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio-util", "tracing", "url", @@ -25192,7 +25112,7 @@ dependencies = [ "serde_json", "subxt-core 0.43.0", "subxt-lightclient 0.43.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "tokio", "tokio-util", "tracing", @@ -25216,7 +25136,7 @@ dependencies = [ "parity-scale-codec", "pbkdf2", "regex", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "scrypt", "secp256k1 0.30.0", "secrecy 0.10.3", @@ -25225,7 +25145,7 @@ dependencies = [ "sha2 0.10.9", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "subxt-core 0.41.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "zeroize", ] @@ -25246,7 +25166,7 @@ dependencies = [ "parity-scale-codec", "pbkdf2", "regex", - "schnorrkel 0.11.5", + "schnorrkel 0.11.4", "scrypt", "secp256k1 0.30.0", "secrecy 0.10.3", @@ -25255,7 +25175,7 @@ dependencies = [ "sha2 0.10.9", "sp-crypto-hashing 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "subxt-core 0.43.0", - "thiserror 2.0.17", + "thiserror 2.0.12", "zeroize", ] @@ -25267,7 +25187,7 @@ checksum = "fc868b55fe2303788dc7703457af390111940c3da4714b510983284501780ed5" dependencies = [ "hex", "parity-scale-codec", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] @@ -25278,20 +25198,20 @@ checksum = "8c4fb8fd6b16ecd3537a29d70699f329a68c1e47f70ed1a46d64f76719146563" dependencies = [ "hex", "parity-scale-codec", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "sval" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9739f56c5d0c44a5ed45473ec868af02eb896af8c05f616673a31e1d1bb09" +checksum = "8b031320a434d3e9477ccf9b5756d57d4272937b8d22cb88af80b7633a1b78b1" [[package]] name = "sval_buffer" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f39b07436a8c271b34dad5070c634d1d3d76d6776e938ee97b4a66a5e8003d0b" +checksum = "6bf7e9412af26b342f3f2cc5cc4122b0105e9d16eb76046cd14ed10106cf6028" dependencies = [ "sval", "sval_ref", @@ -25299,18 +25219,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffcb072d857431bf885580dacecf05ed987bac931230736739a79051dbf3499b" +checksum = "a0ef628e8a77a46ed3338db8d1b08af77495123cc229453084e47cd716d403cf" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f214f427ad94a553e5ca5514c95c6be84667cbc5568cce957f03f3477d03d5c" +checksum = "7dc09e9364c2045ab5fa38f7b04d077b3359d30c4c2b3ec4bae67a358bd64326" dependencies = [ "itoa", "ryu", @@ -25319,63 +25239,53 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ed34b32e638dec9a99c8ac92d0aa1220d40041026b625474c2b6a4d6f4feb" +checksum = "ada6f627e38cbb8860283649509d87bc4a5771141daa41c78fd31f2b9485888d" dependencies = [ "itoa", "ryu", "sval", ] -[[package]] -name = "sval_nested" -version = "2.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14bae8fcb2f24fee2c42c1f19037707f7c9a29a0cda936d2188d48a961c4bb2a" -dependencies = [ - "sval", - "sval_buffer", - "sval_ref", -] - [[package]] name = "sval_ref" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4eaea3821d3046dcba81d4b8489421da42961889902342691fb7eab491d79e" +checksum = "703ca1942a984bd0d9b5a4c0a65ab8b4b794038d080af4eb303c71bc6bf22d7c" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.14.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172dd4aa8cb3b45c8ac8f3b4111d644cd26938b0643ede8f93070812b87fb339" +checksum = "830926cd0581f7c3e5d51efae4d35c6b6fc4db583842652891ba2f1bed8db046" dependencies = [ "serde", "sval", - "sval_nested", + "sval_buffer", + "sval_fmt", ] [[package]] name = "symbolic-common" -version = "12.16.3" +version = "12.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03f433c9befeea460a01d750e698aa86caf86dcfbd77d552885cd6c89d52f50" +checksum = "66135c8273581acaab470356f808a1c74a707fe7ec24728af019d7247e089e71" dependencies = [ "debugid", - "memmap2 0.9.8", + "memmap2 0.9.3", "stable_deref_trait", "uuid", ] [[package]] name = "symbolic-demangle" -version = "12.16.3" +version = "12.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d359ef6192db1760a34321ec4f089245ede4342c27e59be99642f12a859de8" +checksum = "42bcacd080282a72e795864660b148392af7babd75691d5ae9a3b77e29c98c77" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -25399,39 +25309,39 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.106" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "unicode-ident", ] [[package]] name = "syn-solidity" -version = "1.4.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2375c17f6067adc651d8c2c51658019cef32edfff4a982adaf1d7fd1c039f08b" +checksum = "b9ac494e7266fcdd2ad80bf4375d55d27a117ea5c866c26d0e97fe5b3caeeb75" dependencies = [ "paste", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "sync_wrapper" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" dependencies = [ "futures-core", ] @@ -25442,28 +25352,28 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "syn 1.0.109", - "unicode-xid 0.2.6", + "unicode-xid 0.2.4", ] [[package]] name = "synstructure" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "sysinfo" -version = "0.30.13" +version = "0.30.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +checksum = "1fb4f3438c8f6389c864e61221cbc97e9bca98b4daf39a5beb7bea660f528bb2" dependencies = [ "cfg-if", "core-foundation-sys", @@ -25474,6 +25384,17 @@ dependencies = [ "windows 0.52.0", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys 0.5.0", +] + [[package]] name = "system-configuration" version = "0.6.1" @@ -25481,8 +25402,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.4", - "core-foundation 0.9.4", - "system-configuration-sys", + "core-foundation", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -25509,9 +25440,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tar" -version = "0.4.44" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" dependencies = [ "filetime", "libc", @@ -25520,27 +25451,27 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.13.3" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "target-triple" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" +checksum = "42a4d50cdb458045afc8131fd91b64904da29548bcb63c7236e0844936c13078" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ + "cfg-if", "fastrand 2.3.0", - "getrandom 0.3.3", "once_cell", - "rustix 1.1.2", - "windows-sys 0.61.1", + "rustix 0.38.42", + "windows-sys 0.59.0", ] [[package]] @@ -25548,28 +25479,28 @@ name = "template-zombienet-tests" version = "0.0.0" dependencies = [ "anyhow", - "env_logger 0.11.8", + "env_logger 0.11.3", "tokio", "zombienet-sdk", ] [[package]] name = "termcolor" -version = "1.4.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "terminal_size" -version = "0.4.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 1.1.2", - "windows-sys 0.60.2", + "rustix 0.38.42", + "windows-sys 0.48.0", ] [[package]] @@ -25583,9 +25514,9 @@ dependencies = [ [[package]] name = "termtree" -version = "0.5.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "test-case" @@ -25603,9 +25534,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" dependencies = [ "cfg-if", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -25614,9 +25545,9 @@ version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", "test-case-core", ] @@ -25626,9 +25557,9 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e33b98a582ea0be1168eba097538ee8dd4bbe0f2b01b22ac92ea30054e5be7b" dependencies = [ - "env_logger 0.11.8", + "env_logger 0.11.3", "test-log-macros", - "tracing-subscriber 0.3.20", + "tracing-subscriber 0.3.18", ] [[package]] @@ -25637,9 +25568,9 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -25754,42 +25685,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ - "thiserror-impl 1.0.69", + "thiserror-impl 1.0.65", ] [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -25800,11 +25731,12 @@ checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", + "once_cell", ] [[package]] @@ -25849,9 +25781,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -25866,15 +25798,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -25891,9 +25823,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", @@ -25911,9 +25843,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -25926,29 +25858,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", - "io-uring", "libc", "mio", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.5.9", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-io-timeout" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" dependencies = [ "pin-project-lite", "tokio", @@ -25960,9 +25890,9 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -25992,25 +25922,26 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.12", + "rustls 0.21.7", "tokio", ] [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.18", + "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -26063,19 +25994,19 @@ checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" dependencies = [ "futures-util", "log", - "rustls 0.23.32", - "rustls-native-certs 0.8.1", + "rustls 0.23.18", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls 0.26.0", "tungstenite 0.27.0", ] [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -26088,121 +26019,65 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.23" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" -dependencies = [ - "indexmap 2.11.4", - "serde_core", - "serde_spanned 1.0.2", - "toml_datetime 0.7.2", - "toml_parser", - "toml_writer", - "winnow 0.7.13", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.22", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] -[[package]] -name = "toml_datetime" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" -dependencies = [ - "serde_core", -] - [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.6.11", - "winnow 0.5.40", + "indexmap 2.9.0", + "toml_datetime", + "winnow 0.5.15", ] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.11.4", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.13", + "indexmap 2.9.0", + "toml_datetime", + "winnow 0.5.15", ] [[package]] name = "toml_edit" -version = "0.23.6" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.7.2", - "toml_parser", - "winnow 0.7.13", + "indexmap 2.9.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.18", ] [[package]] -name = "toml_parser" -version = "1.0.3" +name = "tower" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" -dependencies = [ - "winnow 0.7.13", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", @@ -26215,21 +26090,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-http" version = "0.4.4" @@ -26241,8 +26101,8 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 0.2.12", - "http-body 0.4.6", + "http 0.2.9", + "http-body 0.4.5", "http-range-header", "mime", "pin-project-lite", @@ -26259,49 +26119,31 @@ checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "bitflags 2.9.4", "bytes", - "http 1.3.1", - "http-body 1.0.1", + "http 1.1.0", + "http-body 1.0.0", "http-body-util", "pin-project-lite", "tower-layer", "tower-service", ] -[[package]] -name = "tower-http" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" -dependencies = [ - "bitflags 2.9.4", - "bytes", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "iri-string", - "pin-project-lite", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-layer" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" [[package]] name = "tower-service" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -26311,20 +26153,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -26356,10 +26198,10 @@ version = "5.0.0" dependencies = [ "assert_matches", "expander", - "proc-macro-crate 3.4.0", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -26384,16 +26226,16 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "chrono", "matchers", "nu-ansi-term", "once_cell", - "parking_lot 0.12.4", - "regex-automata", + "parking_lot 0.12.3", + "regex", "sharded-slab", "smallvec", "thread_local", @@ -26452,15 +26294,15 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "trybuild" -version = "1.0.111" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ded9fdb81f30a5708920310bfcd9ea7482ff9cba5f54601f7a19a877d5c2392" +checksum = "b812699e0c4f813b872b373a4471717d9eb550da14b311058a4d9cf4173cbca6" dependencies = [ "dissimilar", "glob", @@ -26469,7 +26311,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml 0.9.7", + "toml", ] [[package]] @@ -26487,12 +26329,12 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 0.2.12", + "http 0.2.9", "httparse", "log", "rand 0.8.5", "sha1", - "thiserror 1.0.69", + "thiserror 1.0.65", "url", "utf-8", ] @@ -26505,12 +26347,12 @@ checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ "bytes", "data-encoding", - "http 1.3.1", + "http 1.1.0", "httparse", "log", - "rand 0.9.2", + "rand 0.9.0", "sha1", - "thiserror 2.0.17", + "thiserror 2.0.12", "utf-8", ] @@ -26522,14 +26364,14 @@ checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" dependencies = [ "bytes", "data-encoding", - "http 1.3.1", + "http 1.1.0", "httparse", "log", - "rand 0.9.2", - "rustls 0.23.32", + "rand 0.9.0", + "rustls 0.23.18", "rustls-pki-types", "sha1", - "thiserror 2.0.17", + "thiserror 2.0.12", "url", "utf-8", ] @@ -26554,27 +26396,21 @@ dependencies = [ [[package]] name = "twox-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" - -[[package]] -name = "typeid" -version = "1.0.3" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" +checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" [[package]] name = "typenum" -version = "1.18.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -26608,15 +26444,15 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.18" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -26635,15 +26471,21 @@ checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-width" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" @@ -26653,9 +26495,15 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" -version = "0.2.6" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unicode_categories" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "universal-hash" @@ -26664,7 +26512,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", - "subtle 2.6.1", + "subtle 2.5.0", ] [[package]] @@ -26709,12 +26557,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna", + "idna 1.0.3", "percent-encoding", "serde", ] @@ -26725,6 +26573,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -26733,32 +26587,30 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.18.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ - "getrandom 0.3.3", - "js-sys", - "wasm-bindgen", + "getrandom 0.2.10", ] [[package]] name = "valuable" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.11.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" +checksum = "8fec26a25bd6fca441cdd0f769fd7f891bae119f996de31f86a5eddccef54c1d" dependencies = [ "value-bag-serde1", "value-bag-sval2", @@ -26766,9 +26618,9 @@ dependencies = [ [[package]] name = "value-bag-serde1" -version = "1.11.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35540706617d373b118d550d41f5dfe0b78a0c195dc13c6815e92e2638432306" +checksum = "ead5b693d906686203f19a49e88c477fb8c15798b68cf72f60b4b5521b4ad891" dependencies = [ "erased-serde", "serde", @@ -26777,9 +26629,9 @@ dependencies = [ [[package]] name = "value-bag-sval2" -version = "1.11.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe7e140a2658cc16f7ee7a86e413e803fc8f9b5127adc8755c19f9fefa63a52" +checksum = "3b9d0f4a816370c3a0d7d82d603b62198af17675b12fe5e91de6b47ceb505882" dependencies = [ "sval", "sval_buffer", @@ -26815,9 +26667,9 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "void" @@ -26898,18 +26750,18 @@ dependencies = [ [[package]] name = "wait-timeout" -version = "0.2.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" dependencies = [ "libc", ] [[package]] name = "waker-fn" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" @@ -26932,26 +26784,17 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "0.13.3+wasi-0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" dependencies = [ - "wit-bindgen", + "wit-bindgen-rt", ] [[package]] @@ -26960,107 +26803,92 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" -[[package]] -name = "wasix" -version = "0.12.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" -dependencies = [ - "wasi 0.11.1+wasi-snapshot-preview1", -] - [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", - "rustversion", "serde", "serde_json", "wasm-bindgen-macro", - "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.104" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "once_cell", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ - "quote 1.0.41", + "quote 1.0.40", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" -dependencies = [ - "unicode-ident", -] +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-encoder" -version = "0.235.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a" +checksum = "41763f20eafed1399fff1afb466496d3a959f58241436cfdc17e3f5ca954de16" dependencies = [ - "leb128fmt", - "wasmparser 0.235.0", + "leb128", ] [[package]] name = "wasm-encoder" -version = "0.239.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be00faa2b4950c76fe618c409d2c3ea5a3c9422013e079482d78544bb2d184c" +checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a" dependencies = [ "leb128fmt", - "wasmparser 0.239.0", + "wasmparser 0.235.0", ] [[package]] @@ -27074,16 +26902,16 @@ dependencies = [ [[package]] name = "wasm-opt" -version = "0.116.1" +version = "0.116.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd87a4c135535ffed86123b6fb0f0a5a0bc89e50416c942c5f0662c645f679c" +checksum = "fc942673e7684671f0c5708fc18993569d184265fd5223bb51fc8e5b9b6cfd52" dependencies = [ "anyhow", "libc", "strum 0.24.1", "strum_macros 0.24.3", "tempfile", - "thiserror 1.0.69", + "thiserror 1.0.65", "wasm-opt-cxx-sys", "wasm-opt-sys", ] @@ -27224,23 +27052,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" dependencies = [ "bitflags 2.9.4", - "hashbrown 0.15.5", - "indexmap 2.11.4", - "semver 1.0.27", + "hashbrown 0.15.3", + "indexmap 2.9.0", + "semver 1.0.18", "serde", ] -[[package]] -name = "wasmparser" -version = "0.239.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9d90bb93e764f6beabf1d02028c70a2156a6583e63ac4218dd07ef733368b0" -dependencies = [ - "bitflags 2.9.4", - "indexmap 2.11.4", - "semver 1.0.27", -] - [[package]] name = "wasmparser-nostd" version = "0.100.2" @@ -27275,8 +27092,8 @@ dependencies = [ "cfg-if", "fxprof-processed-profile", "gimli 0.31.1", - "hashbrown 0.15.5", - "indexmap 2.11.4", + "hashbrown 0.15.3", + "indexmap 2.9.0", "ittapi", "libc", "log", @@ -27287,7 +27104,7 @@ dependencies = [ "postcard", "pulley-interpreter", "rayon", - "rustix 1.1.2", + "rustix 1.0.8", "serde", "serde_derive", "serde_json", @@ -27320,7 +27137,7 @@ dependencies = [ "cranelift-bitset", "cranelift-entity", "gimli 0.31.1", - "indexmap 2.11.4", + "indexmap 2.9.0", "log", "object 0.36.7", "postcard", @@ -27354,11 +27171,11 @@ dependencies = [ "directories-next", "log", "postcard", - "rustix 1.1.2", + "rustix 1.0.8", "serde", "serde_derive", "sha2 0.10.9", - "toml 0.8.23", + "toml", "windows-sys 0.59.0", "zstd 0.13.3", ] @@ -27383,7 +27200,7 @@ dependencies = [ "pulley-interpreter", "smallvec", "target-lexicon", - "thiserror 2.0.17", + "thiserror 2.0.12", "wasmparser 0.235.0", "wasmtime-environ", "wasmtime-internal-math", @@ -27400,7 +27217,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "rustix 1.1.2", + "rustix 1.0.8", "wasmtime-internal-asm-macros", "wasmtime-internal-versioned-export-macros", "windows-sys 0.59.0", @@ -27414,7 +27231,7 @@ checksum = "61d8693995ab3df48e88777b6ee3b2f441f2c4f895ab938996cdac3db26f256c" dependencies = [ "cc", "object 0.36.7", - "rustix 1.1.2", + "rustix 1.0.8", "wasmtime-internal-versioned-export-macros", ] @@ -27464,9 +27281,9 @@ version = "35.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "342b0466f92b7217a4de9e114175fedee1907028567d2548bcd42f71a8b5b016" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -27488,31 +27305,30 @@ dependencies = [ [[package]] name = "wast" -version = "239.0.0" +version = "63.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9139176fe8a2590e0fb174cdcaf373b224cb93c3dde08e4297c1361d2ba1ea5d" +checksum = "2560471f60a48b77fccefaf40796fda61c97ce1e790b59dfcec9dc3995c9f63a" dependencies = [ - "bumpalo", - "leb128fmt", + "leb128", "memchr", - "unicode-width", - "wasm-encoder 0.239.0", + "unicode-width 0.1.10", + "wasm-encoder 0.31.1", ] [[package]] name = "wat" -version = "1.239.0" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e1c941927d34709f255558166f8901a2005f8ab4a9650432e9281b7cc6f3b75" +checksum = "3bdc306c2c4c2f2bf2ba69e083731d0d2a77437fc6a350a19db139636e7e416c" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -27528,35 +27344,17 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-root-certs" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" -dependencies = [ - "webpki-root-certs 1.0.2", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "webpki-roots" -version = "1.0.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -27721,19 +27519,19 @@ dependencies = [ [[package]] name = "whoami" -version = "1.6.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "libredox", + "redox_syscall 0.5.8", "wasite", ] [[package]] name = "wide" -version = "0.7.33" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" +checksum = "aa469ffa65ef7e0ba0f164183697b89b854253fd31aeb92358b7b6155177d62f" dependencies = [ "bytemuck", "safe_arch", @@ -27741,9 +27539,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.2.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" [[package]] name = "winapi" @@ -27763,11 +27561,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.11" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "windows-sys 0.61.1", + "winapi", ] [[package]] @@ -27789,13 +27587,32 @@ dependencies = [ "regalloc2 0.12.2", "smallvec", "target-lexicon", - "thiserror 2.0.17", + "thiserror 2.0.12", "wasmparser 0.235.0", "wasmtime-environ", "wasmtime-internal-cranelift", "wasmtime-internal-math", ] +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + [[package]] name = "windows" version = "0.52.0" @@ -27808,143 +27625,101 @@ dependencies = [ [[package]] name = "windows" -version = "0.53.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.53.0", + "windows-core 0.58.0", "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.52.0" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] name = "windows-core" -version = "0.53.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-result 0.1.2", "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.62.1" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.60.1" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "windows-interface" -version = "0.59.2" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" [[package]] name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ + "windows-result", + "windows-strings", "windows-targets 0.52.6", ] [[package]] name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" -dependencies = [ - "windows-link 0.2.0", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-link 0.1.3", + "windows-targets 0.52.6", ] [[package]] name = "windows-strings" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" -dependencies = [ - "windows-link 0.2.0", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-targets 0.42.2", + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -27980,31 +27755,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.4", -] - -[[package]] -name = "windows-sys" -version = "0.61.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" -dependencies = [ - "windows-link 0.2.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.53.2", ] [[package]] @@ -28040,11 +27791,10 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.4" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ - "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -28055,12 +27805,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -28079,12 +27823,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -28103,12 +27841,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -28139,12 +27871,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -28163,12 +27889,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -28187,12 +27907,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -28211,12 +27925,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -28237,18 +27945,27 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.5.40" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] @@ -28264,16 +27981,25 @@ dependencies = [ ] [[package]] -name = "wit-bindgen" -version = "0.46.0" +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" -version = "0.6.1" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wyz" @@ -28302,14 +28028,14 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" dependencies = [ - "asn1-rs 0.6.2", + "asn1-rs 0.6.1", "data-encoding", "der-parser 9.0.0", "lazy_static", "nom 7.1.3", - "oid-registry 0.7.1", + "oid-registry 0.7.0", "rusticata-macros", - "thiserror 1.0.69", + "thiserror 1.0.65", "time", ] @@ -28319,25 +28045,24 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" dependencies = [ - "asn1-rs 0.7.1", + "asn1-rs 0.7.0", "data-encoding", "der-parser 10.0.0", "lazy_static", "nom 7.1.3", "oid-registry 0.8.1", "rusticata-macros", - "thiserror 2.0.17", + "thiserror 2.0.12", "time", ] [[package]] name = "xattr" -version = "1.6.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" dependencies = [ "libc", - "rustix 1.1.2", ] [[package]] @@ -28366,7 +28091,7 @@ dependencies = [ name = "xcm-emulator" version = "0.5.0" dependencies = [ - "array-bytes 6.2.3", + "array-bytes 6.2.2", "cumulus-pallet-parachain-system", "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", @@ -28425,10 +28150,10 @@ version = "7.0.0" dependencies = [ "Inflector", "frame-support", - "proc-macro2 1.0.101", - "quote 1.0.41", + "proc-macro2 1.0.95", + "quote 1.0.40", "staging-xcm", - "syn 2.0.106", + "syn 2.0.98", "trybuild", ] @@ -28529,9 +28254,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.27" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" [[package]] name = "xmltree" @@ -28551,7 +28276,7 @@ dependencies = [ "futures", "log", "nohash-hasher", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", "rand 0.8.5", "static_assertions", @@ -28559,25 +28284,25 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.6" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2dd50a6d6115feb3e5d7d0efd45e8ca364b6c83722c1e9c602f5764e0e9597" +checksum = "3da1acad1c2dc53f0dde419115a38bd8221d8c3e47ae9aeceaf453266d29307e" dependencies = [ "futures", "log", "nohash-hasher", - "parking_lot 0.12.4", + "parking_lot 0.12.3", "pin-project", - "rand 0.9.2", + "rand 0.9.0", "static_assertions", "web-time", ] [[package]] name = "yansi" -version = "1.0.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "yap" @@ -28608,9 +28333,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -28620,62 +28345,82 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", + "synstructure 0.13.1", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", - "synstructure 0.13.2", + "zerocopy-derive 0.7.32", ] [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +dependencies = [ + "zerocopy-derive 0.8.20", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "zerocopy-derive", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", - "synstructure 0.13.2", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", + "synstructure 0.13.1", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -28686,27 +28431,16 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] name = "zerovec" -version = "0.11.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ "yoke", "zerofrom", @@ -28715,13 +28449,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ - "proc-macro2 1.0.101", - "quote 1.0.41", - "syn 2.0.106", + "proc-macro2 1.0.95", + "quote 1.0.40", + "syn 2.0.98", ] [[package]] @@ -28732,7 +28466,7 @@ dependencies = [ "parity-scale-codec", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-tungstenite 0.26.2", "tracing-gum", @@ -28746,14 +28480,14 @@ checksum = "939599296b4660c38fc4350444a80e34c241c0f0640de33dded9648082b994c8" dependencies = [ "anyhow", "lazy_static", - "multiaddr 0.18.2", + "multiaddr 0.18.1", "regex", "reqwest", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", - "toml 0.8.23", + "toml", "tracing", "url", "zombienet-support", @@ -28773,7 +28507,7 @@ dependencies = [ "hex", "libp2p", "libsecp256k1", - "multiaddr 0.18.2", + "multiaddr 0.18.1", "rand 0.8.5", "regex", "reqwest", @@ -28783,7 +28517,7 @@ dependencies = [ "sp-core 36.1.0", "subxt 0.43.0", "subxt-signer 0.43.0", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tracing", "uuid", @@ -28801,7 +28535,7 @@ checksum = "18efca2715d288088b867a00a7651ad7c0c2d958a3b8ba6c366645c622427c6d" dependencies = [ "pest", "pest_derive", - "thiserror 1.0.69", + "thiserror 1.0.65", ] [[package]] @@ -28825,7 +28559,7 @@ dependencies = [ "serde_yaml", "sha2 0.10.9", "tar", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tokio-util", "tracing", @@ -28868,7 +28602,7 @@ dependencies = [ "regex", "reqwest", "serde_json", - "thiserror 1.0.69", + "thiserror 1.0.65", "tokio", "tracing", "uuid", @@ -28913,9 +28647,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", From df52649819386176a8e81244c392905f23bdf0ad Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 30 Sep 2025 16:36:49 +0000 Subject: [PATCH 31/53] revive: Downgrade log to debug Signed-off-by: Alexandru Vasile --- substrate/frame/revive/src/evm/block_hash/block_builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/revive/src/evm/block_hash/block_builder.rs b/substrate/frame/revive/src/evm/block_hash/block_builder.rs index 8d007e7eaf394..13dcf173c97f0 100644 --- a/substrate/frame/revive/src/evm/block_hash/block_builder.rs +++ b/substrate/frame/revive/src/evm/block_hash/block_builder.rs @@ -170,7 +170,7 @@ impl EthereumBlockBuilder { self.transaction_root_builder.set_first_value(first_tx); self.receipts_root_builder.set_first_value(first_receipt); } else { - log::error!(target: LOG_TARGET, "First transaction and receipt must be present at build phase"); + log::debug!(target: LOG_TARGET, "Building an empty block"); } } From a1965165ae559d02c821ae501203d1b6fc5f2b42 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 17:06:23 +0200 Subject: [PATCH 32/53] revive/rpc: add get_trie_root method --- substrate/frame/revive/rpc/src/client.rs | 39 +++++++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 639df37b71940..bd9c909a5ebfa 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -193,6 +193,34 @@ async fn extract_block_timestamp(block: &SubstrateBlock) -> Option { Some(ext.value.now / 1000) } +/// Calculate the trie root using IncrementalHashBuilder. +/// +/// This method takes a slice of items that implement the `Encode2718` trait, +/// encodes each item, and adds them to the hash builder to compute the trie root. +/// +/// # Arguments +/// * `items` - A vector of items that implement the `Encode2718` trait +/// +/// # Returns +/// The computed trie root as `H256` +fn get_trie_root(items: &[T]) -> H256 { + use pallet_revive::evm::block_hash::IncrementalHashBuilder; + + let mut builder = IncrementalHashBuilder::new(); + + // Handle the first item separately + if let Some(first_item) = items.first() { + builder.set_first_value(first_item.encode_2718()); + } + + // Add remaining items + for item in items.into_iter().skip(1) { + builder.add_value(item.encode_2718()); + } + + builder.finish() +} + /// Connect to a node at the given URL, and return the underlying API, RPC client, and legacy RPC /// clients. pub async fn connect( @@ -735,8 +763,9 @@ impl Client { // TODO: remove once subxt is updated let parent_hash = header.parent_hash.0.into(); - let state_root = header.state_root.0.into(); - let extrinsics_root = header.extrinsics_root.0.into(); + + let transactions_root = get_trie_root(&signed_txs); + let receipts_root = get_trie_root(receipts); let gas_used = receipts.iter().fold(U256::zero(), |acc, receipt| acc + receipt.gas_used); let transactions = if hydrated_transactions { @@ -757,15 +786,15 @@ impl Client { Block { hash: block.hash(), parent_hash, - state_root, + state_root: transactions_root, miner: block_author, - transactions_root: extrinsics_root, + transactions_root, number: header.number.into(), timestamp: timestamp.into(), base_fee_per_gas: runtime_api.gas_price().await.ok().unwrap_or_default(), gas_limit, gas_used, - receipts_root: extrinsics_root, + receipts_root, transactions, ..Default::default() } From 794f29cf33456fdc4174031a3412204fda4761cd Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:19:24 +0200 Subject: [PATCH 33/53] revive: decouple EthereumBlockBuilder from pallet storage Introduces a storage trait abstraction that allows EthereumBlockBuilder to be used both in the pallet (with persistent storage) and in RPC (with in-memory storage). This enables proper EVM block reconstruction in RPC using the same block building logic as on-chain construction. Key changes: - Add BlockBuilderStorage trait with InMemoryStorage and PalletStorage implementations - Refactor EthereumBlockBuilder to use generic storage parameter - Update pallet, tests, and benchmarks to use PalletStorage - Export new storage types from block_hash module --- substrate/frame/revive/src/benchmarking.rs | 24 +++- substrate/frame/revive/src/evm/block_hash.rs | 5 +- .../src/evm/block_hash/block_builder.rs | 116 ++++++++++++++---- .../frame/revive/src/evm/block_storage.rs | 17 ++- .../frame/revive/src/tests/block_hash.rs | 11 +- 5 files changed, 132 insertions(+), 41 deletions(-) diff --git a/substrate/frame/revive/src/benchmarking.rs b/substrate/frame/revive/src/benchmarking.rs index c9acd950dc900..68a8ab5e3a83a 100644 --- a/substrate/frame/revive/src/benchmarking.rs +++ b/substrate/frame/revive/src/benchmarking.rs @@ -21,7 +21,9 @@ use crate::{ call_builder::{caller_funding, default_deposit_limit, CallSetup, Contract, VmBinaryModule}, evm::{ - block_hash::EthereumBlockBuilder, block_storage, runtime::GAS_PRICE, + block_hash::{EthereumBlockBuilder, PalletStorage}, + block_storage, + runtime::GAS_PRICE, TransactionLegacyUnsigned, TransactionSigned, TransactionUnsigned, }, exec::{Key, MomentOf, PrecompileExt}, @@ -2721,7 +2723,10 @@ mod benchmarks { block_storage::get_receipt_details().unwrap_or_default(); let block_builder_ir = EthBlockBuilderIR::::get(); - let mut block_builder = EthereumBlockBuilder::::from_ir(block_builder_ir); + let mut block_builder = EthereumBlockBuilder::from_ir_with_storage( + block_builder_ir, + PalletStorage::::new(), + ); block_builder.process_transaction( signed_transaction, @@ -2794,7 +2799,10 @@ mod benchmarks { block_storage::get_receipt_details().unwrap_or_default(); let block_builder_ir = EthBlockBuilderIR::::get(); - let mut block_builder = EthereumBlockBuilder::::from_ir(block_builder_ir); + let mut block_builder = EthereumBlockBuilder::from_ir_with_storage( + block_builder_ir, + PalletStorage::::new(), + ); block_builder.process_transaction( signed_transaction, @@ -2858,7 +2866,10 @@ mod benchmarks { let (encoded_logs, bloom) = block_storage::get_receipt_details().unwrap_or_default(); let block_builder_ir = EthBlockBuilderIR::::get(); - let mut block_builder = EthereumBlockBuilder::::from_ir(block_builder_ir); + let mut block_builder = EthereumBlockBuilder::from_ir_with_storage( + block_builder_ir, + PalletStorage::::new(), + ); block_builder.process_transaction( signed_transaction, @@ -2920,7 +2931,10 @@ mod benchmarks { let (encoded_logs, bloom) = block_storage::get_receipt_details().unwrap_or_default(); let block_builder_ir = EthBlockBuilderIR::::get(); - let mut block_builder = EthereumBlockBuilder::::from_ir(block_builder_ir); + let mut block_builder = EthereumBlockBuilder::from_ir_with_storage( + block_builder_ir, + PalletStorage::::new(), + ); block_builder.process_transaction( signed_transaction, diff --git a/substrate/frame/revive/src/evm/block_hash.rs b/substrate/frame/revive/src/evm/block_hash.rs index 545fc08b6cc92..f04723093fff1 100644 --- a/substrate/frame/revive/src/evm/block_hash.rs +++ b/substrate/frame/revive/src/evm/block_hash.rs @@ -25,7 +25,10 @@ mod hash_builder; pub use hash_builder::{BuilderPhase, IncrementalHashBuilder, IncrementalHashBuilderIR}; mod block_builder; -pub use block_builder::{EthereumBlockBuilder, EthereumBlockBuilderIR}; +pub use block_builder::{ + BlockBuilderStorage, EthereumBlockBuilder, EthereumBlockBuilderIR, InMemoryStorage, + PalletStorage, +}; use crate::evm::Block; diff --git a/substrate/frame/revive/src/evm/block_hash/block_builder.rs b/substrate/frame/revive/src/evm/block_hash/block_builder.rs index 13dcf173c97f0..7c9b54e6277fb 100644 --- a/substrate/frame/revive/src/evm/block_hash/block_builder.rs +++ b/substrate/frame/revive/src/evm/block_hash/block_builder.rs @@ -29,6 +29,7 @@ use crate::{ }; use alloc::{vec, vec::Vec}; +use core::marker::PhantomData; use codec::{Decode, Encode}; use frame_support::weights::Weight; @@ -37,23 +38,91 @@ use sp_core::{keccak_256, H160, H256, U256}; const LOG_TARGET: &str = "runtime::revive::block_builder"; +/// Storage abstraction for caching first transaction/receipt values. +/// +/// The first transaction and receipt need special handling due to RLP encoding rules +/// for trie indices 0-127. This trait allows different storage backends: +/// - Pallet storage for on-chain block building +/// - In-memory storage for RPC block reconstruction +pub trait BlockBuilderStorage { + /// Store the first transaction and receipt values. + fn put_first_values(&mut self, values: (Vec, Vec)); + + /// Retrieve and remove the first transaction and receipt values. + fn take_first_values(&mut self) -> Option<(Vec, Vec)>; +} + +/// In-memory storage implementation for RPC usage. +/// +/// This implementation doesn't need persistence since RPC block reconstruction +/// happens within a single function call. +pub struct InMemoryStorage { + first_values: Option<(Vec, Vec)>, +} + +impl InMemoryStorage { + /// Creates a new in-memory storage instance. + pub const fn new() -> Self { + Self { first_values: None } + } +} + +impl BlockBuilderStorage for InMemoryStorage { + fn put_first_values(&mut self, values: (Vec, Vec)) { + self.first_values = Some(values); + } + + fn take_first_values(&mut self) -> Option<(Vec, Vec)> { + self.first_values.take() + } +} + +/// Pallet storage implementation for on-chain block building. +/// +/// This implementation uses pallet storage to persist the first transaction +/// and receipt across block construction phases. +pub struct PalletStorage { + _phantom: PhantomData, +} + +impl PalletStorage { + /// Creates a new pallet storage instance. + pub const fn new() -> Self { + Self { _phantom: PhantomData } + } +} + +impl BlockBuilderStorage for PalletStorage { + fn put_first_values(&mut self, values: (Vec, Vec)) { + crate::EthBlockBuilderFirstValues::::put(Some(values)); + } + + fn take_first_values(&mut self) -> Option<(Vec, Vec)> { + crate::EthBlockBuilderFirstValues::::take() + } +} + /// Ethereum block builder designed to incrementally build the transaction and receipt trie roots. /// /// This builder is optimized to minimize memory usage and pallet storage by leveraging the internal /// structure of the Ethereum trie and the RLP encoding of receipts. -pub struct EthereumBlockBuilder { +/// +/// The generic parameter `S` allows for different storage backends: +/// - `PalletStorage` for on-chain block building with persistent storage +/// - `InMemoryStorage` for RPC block reconstruction without persistence +pub struct EthereumBlockBuilder { pub(crate) transaction_root_builder: IncrementalHashBuilder, pub(crate) receipts_root_builder: IncrementalHashBuilder, pub(crate) tx_hashes: Vec, gas_used: U256, logs_bloom: LogsBloom, gas_info: Vec, - _phantom: core::marker::PhantomData, + storage: S, } -impl EthereumBlockBuilder { - /// Constructs a new [`EthereumBlockBuilder`]. - pub fn new() -> Self { +impl EthereumBlockBuilder { + /// Constructs a new [`EthereumBlockBuilder`] with the provided storage backend. + pub fn new(storage: S) -> Self { Self { transaction_root_builder: IncrementalHashBuilder::new(), receipts_root_builder: IncrementalHashBuilder::new(), @@ -61,7 +130,7 @@ impl EthereumBlockBuilder { tx_hashes: Vec::new(), logs_bloom: LogsBloom::new(), gas_info: Vec::new(), - _phantom: core::marker::PhantomData, + storage, } } @@ -79,10 +148,10 @@ impl EthereumBlockBuilder { } } - /// Converts the intermediate representation back into a builder. + /// Converts the intermediate representation back into a builder with the provided storage. /// /// The intermediate representation is placed into the pallet storage. - pub fn from_ir(ir: EthereumBlockBuilderIR) -> Self { + pub fn from_ir_with_storage(ir: EthereumBlockBuilderIR, storage: S) -> Self { Self { transaction_root_builder: IncrementalHashBuilder::from_ir(ir.transaction_root_builder), receipts_root_builder: IncrementalHashBuilder::from_ir(ir.receipts_root_builder), @@ -90,18 +159,18 @@ impl EthereumBlockBuilder { tx_hashes: ir.tx_hashes, logs_bloom: LogsBloom { bloom: ir.logs_bloom }, gas_info: ir.gas_info, - _phantom: core::marker::PhantomData, + storage, } } - /// Store the first transaction and receipt in pallet storage. - fn pallet_put_first_values(&mut self, values: (Vec, Vec)) { - crate::EthBlockBuilderFirstValues::::put(Some(values)); + /// Store the first transaction and receipt in storage. + fn put_first_values(&mut self, values: (Vec, Vec)) { + self.storage.put_first_values(values); } - /// Take the first transaction and receipt from pallet storage. - fn pallet_take_first_values(&mut self) -> Option<(Vec, Vec)> { - crate::EthBlockBuilderFirstValues::::take() + /// Take the first transaction and receipt from storage. + fn take_first_values(&mut self) -> Option<(Vec, Vec)> { + self.storage.take_first_values() } /// Process a single transaction at a time. @@ -134,17 +203,17 @@ impl EthereumBlockBuilder { self.gas_info.push(ReceiptGasInfo { gas_used: gas_used.ref_time().into() }); - // The first transaction and receipt are returned to be stored in the pallet storage. + // The first transaction and receipt are returned to be stored in the storage. // The index of the incremental hash builders already expects the next items. if self.tx_hashes.len() == 1 { - log::debug!(target: LOG_TARGET, "Storing first transaction and receipt in pallet storage"); - self.pallet_put_first_values((transaction_encoded, encoded_receipt)); + log::debug!(target: LOG_TARGET, "Storing first transaction and receipt in storage"); + self.put_first_values((transaction_encoded, encoded_receipt)); return; } if self.transaction_root_builder.needs_first_value(BuilderPhase::ProcessingValue) { - if let Some((first_tx, first_receipt)) = self.pallet_take_first_values() { - log::debug!(target: LOG_TARGET, "Loaded first transaction and receipt from pallet storage"); + if let Some((first_tx, first_receipt)) = self.take_first_values() { + log::debug!(target: LOG_TARGET, "Loaded first transaction and receipt from storage"); self.transaction_root_builder.set_first_value(first_tx); self.receipts_root_builder.set_first_value(first_receipt); } else { @@ -166,7 +235,7 @@ impl EthereumBlockBuilder { gas_limit: U256, ) -> (Block, Vec) { if self.transaction_root_builder.needs_first_value(BuilderPhase::Build) { - if let Some((first_tx, first_receipt)) = self.pallet_take_first_values() { + if let Some((first_tx, first_receipt)) = self.take_first_values() { self.transaction_root_builder.set_first_value(first_tx); self.receipts_root_builder.set_first_value(first_receipt); } else { @@ -405,7 +474,7 @@ mod test { ExtBuilder::default().build().execute_with(|| { // Build the ethereum block incrementally. - let mut incremental_block = EthereumBlockBuilder::::new(); + let mut incremental_block = EthereumBlockBuilder::new(PalletStorage::::new()); for (signed, logs, success, gas_used) in transaction_details { let mut log_size = 0; @@ -425,7 +494,8 @@ mod test { ); let ir = incremental_block.to_ir(); - incremental_block = EthereumBlockBuilder::from_ir(ir); + incremental_block = + EthereumBlockBuilder::from_ir_with_storage(ir, PalletStorage::::new()); println!(" Log size {:?}", log_size); } diff --git a/substrate/frame/revive/src/evm/block_storage.rs b/substrate/frame/revive/src/evm/block_storage.rs index 758b598911ccf..3a379dec4bace 100644 --- a/substrate/frame/revive/src/evm/block_storage.rs +++ b/substrate/frame/revive/src/evm/block_storage.rs @@ -16,7 +16,7 @@ // limitations under the License. use crate::{ - evm::block_hash::{AccumulateReceipt, EthereumBlockBuilder, LogsBloom}, + evm::block_hash::{AccumulateReceipt, EthereumBlockBuilder, LogsBloom, PalletStorage}, sp_runtime::traits::One, BlockHash, Config, EthBlockBuilderIR, EthereumBlock, ReceiptInfoData, UniqueSaturatedInto, H160, H256, @@ -88,13 +88,11 @@ pub fn on_finalize_build_eth_block( EthBlockBuilderIR::::kill(); // Load the first values if not already loaded. - let (block, receipt_data) = EthereumBlockBuilder::::from_ir(block_builder_ir).build( - eth_block_num, - parent_hash, - timestamp, - block_author, - gas_limit, - ); + let (block, receipt_data) = EthereumBlockBuilder::from_ir_with_storage( + block_builder_ir, + PalletStorage::::new(), + ) + .build(eth_block_num, parent_hash, timestamp, block_author, gas_limit); // Put the block hash into storage. BlockHash::::insert(eth_block_num, block.hash); @@ -129,7 +127,8 @@ pub fn process_transaction( let (encoded_logs, bloom) = get_receipt_details().unwrap_or_default(); let block_builder_ir = EthBlockBuilderIR::::get(); - let mut block_builder = EthereumBlockBuilder::::from_ir(block_builder_ir); + let mut block_builder = + EthereumBlockBuilder::from_ir_with_storage(block_builder_ir, PalletStorage::::new()); block_builder.process_transaction(transaction_encoded, success, gas_used, encoded_logs, bloom); diff --git a/substrate/frame/revive/src/tests/block_hash.rs b/substrate/frame/revive/src/tests/block_hash.rs index 798a14b3ddca5..42561012a1243 100644 --- a/substrate/frame/revive/src/tests/block_hash.rs +++ b/substrate/frame/revive/src/tests/block_hash.rs @@ -18,7 +18,10 @@ //! The pallet-revive ETH block hash specific integration test suite. use crate::{ - evm::{block_hash::EthereumBlockBuilder, Block, TransactionSigned}, + evm::{ + block_hash::{EthereumBlockBuilder, PalletStorage}, + Block, TransactionSigned, + }, test_utils::{builder::Contract, deposit_limit, ALICE}, tests::{assert_ok, builder, Contracts, ExtBuilder, RuntimeOrigin, Test}, BalanceWithDust, Code, Config, EthBlock, EthBlockBuilderFirstValues, EthBlockBuilderIR, @@ -85,7 +88,8 @@ fn transactions_are_captured() { let expected_tx_root = Block::compute_trie_root(&expected_payloads); // Double check the trie root hash. - let mut builder = EthereumBlockBuilder::::from_ir(block_builder); + let mut builder = + EthereumBlockBuilder::from_ir_with_storage(block_builder, PalletStorage::::new()); let first_values = EthBlockBuilderFirstValues::::get().unwrap(); builder.transaction_root_builder.set_first_value(first_values.0); @@ -170,7 +174,8 @@ fn events_are_captured() { // 1 transaction captured. assert_eq!(block_builder.gas_info.len(), 1); - let mut builder = EthereumBlockBuilder::::from_ir(block_builder); + let mut builder = + EthereumBlockBuilder::from_ir_with_storage(block_builder, PalletStorage::::new()); builder.transaction_root_builder.set_first_value(expected_payloads[0].clone()); let tx_root = builder.transaction_root_builder.finish(); assert_eq!(tx_root, expected_tx_root.0.into()); From efabca631fa4edea61d046a7b05ab798431a772c Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:21:06 +0200 Subject: [PATCH 34/53] revive/rpc: use EthereumBlockBuilder for proper block reconstruction Updates the RPC client to use EthereumBlockBuilder with InMemoryStorage for reconstructing Ethereum blocks. This ensures the RPC returns blocks with correct EVM parent_hash chains and properly computed trie roots, matching the on-chain block building logic exactly. Key changes: - Replace manual block construction with EthereumBlockBuilder - Use InMemoryStorage for ephemeral block reconstruction - Properly reconstruct logs using AccumulateReceipt - Resolve parent EVM hash from Substrate hash mapping - Fix timestamp conversion (remove division by 1000) The RPC now maintains EVM block chain integrity by using EVM block hashes for parent_hash instead of Substrate block hashes, while falling back to Substrate hashes for backwards compatibility with unmapped blocks. --- substrate/frame/revive/rpc/src/client.rs | 126 +++++++++++------------ 1 file changed, 61 insertions(+), 65 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index bd9c909a5ebfa..e1bb35c8c1062 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -33,7 +33,7 @@ use pallet_revive::{ evm::{ decode_revert_reason, Block, BlockNumberOrTag, BlockNumberOrTagOrHash, FeeHistoryResult, Filter, GenericTransaction, HashesOrTransactionInfos, Log, ReceiptInfo, SyncingProgress, - SyncingStatus, Trace, TransactionSigned, TransactionTrace, H256, U256, + SyncingStatus, Trace, TransactionSigned, TransactionTrace, H256, }, EthTransactError, }; @@ -190,35 +190,7 @@ async fn extract_block_timestamp(block: &SubstrateBlock) -> Option { .find_first::() .ok()??; - Some(ext.value.now / 1000) -} - -/// Calculate the trie root using IncrementalHashBuilder. -/// -/// This method takes a slice of items that implement the `Encode2718` trait, -/// encodes each item, and adds them to the hash builder to compute the trie root. -/// -/// # Arguments -/// * `items` - A vector of items that implement the `Encode2718` trait -/// -/// # Returns -/// The computed trie root as `H256` -fn get_trie_root(items: &[T]) -> H256 { - use pallet_revive::evm::block_hash::IncrementalHashBuilder; - - let mut builder = IncrementalHashBuilder::new(); - - // Handle the first item separately - if let Some(first_item) = items.first() { - builder.set_first_value(first_item.encode_2718()); - } - - // Add remaining items - for item in items.into_iter().skip(1) { - builder.add_value(item.encode_2718()); - } - - builder.finish() + Some(ext.value.now) } /// Connect to a node at the given URL, and return the underlying API, RPC client, and legacy RPC @@ -731,7 +703,6 @@ impl Client { return eth_block; } - log::trace!(target: LOG_TARGET, "Reconstructing ethereum block for substrate block {:?}", block.hash()); // We need to reconstruct the ETH block fully. let (signed_txs, receipts): (Vec<_>, Vec<_>) = self .receipt_provider @@ -746,6 +717,9 @@ impl Client { } /// Get the EVM block for the given block and receipts. + /// + /// This method properly reconstructs an Ethereum block using the same logic as on-chain + /// block building, ensuring correct parent_hash linkage in the EVM block chain. pub async fn evm_block_from_receipts( &self, block: &SubstrateBlock, @@ -753,51 +727,73 @@ impl Client { signed_txs: Vec, hydrated_transactions: bool, ) -> Block { - log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?} from receipts", block.hash()); + use pallet_revive::evm::block_hash::{ + AccumulateReceipt, EthereumBlockBuilder, InMemoryStorage, + }; + + log::trace!(target: LOG_TARGET, "Reconstructing Ethereum block for substrate block {:?}", block.hash()); + let runtime_api = self.runtime_api(block.hash()); let gas_limit = runtime_api.block_gas_limit().await.unwrap_or_default(); - - let header = block.header(); - let timestamp = extract_block_timestamp(block).await.unwrap_or_default(); let block_author = runtime_api.block_author().await.ok().unwrap_or_default(); + let timestamp = extract_block_timestamp(block).await.unwrap_or_default(); - // TODO: remove once subxt is updated - let parent_hash = header.parent_hash.0.into(); + // Build block using the proper EthereumBlockBuilder + let mut builder = EthereumBlockBuilder::new(InMemoryStorage::new()); - let transactions_root = get_trie_root(&signed_txs); - let receipts_root = get_trie_root(receipts); + // Process each transaction with its receipt + for (signed_tx, receipt) in signed_txs.iter().zip(receipts.iter()) { + let tx_encoded = signed_tx.signed_payload(); - let gas_used = receipts.iter().fold(U256::zero(), |acc, receipt| acc + receipt.gas_used); - let transactions = if hydrated_transactions { - signed_txs - .into_iter() - .zip(receipts.iter()) - .map(|(signed_tx, receipt)| TransactionInfo::new(receipt, signed_tx)) - .collect::>() - .into() + // Reconstruct logs from receipt + let mut accumulate_receipt = AccumulateReceipt::new(); + for log in &receipt.logs { + let data = log.data.as_ref().map(|d| d.0.as_slice()).unwrap_or(&[]); + accumulate_receipt.add_log(&log.address, data, &log.topics); + } + + // Process the transaction + builder.process_transaction( + tx_encoded, + receipt.status.unwrap_or_default() == 1.into(), + receipt.gas_used.as_u64().into(), + accumulate_receipt.encoding, + accumulate_receipt.bloom, + ); + } + + // Get parent EVM block hash (not Substrate hash!) + // This is crucial for maintaining the EVM block chain integrity + let parent_evm_hash = if block.number() > 1 { + let parent_substrate_hash = block.header().parent_hash; + // Try to resolve to EVM hash, fallback to substrate hash for backwards compatibility + self.resolve_ethereum_hash(&parent_substrate_hash) + .await + .unwrap_or(parent_substrate_hash) } else { - receipts - .iter() - .map(|receipt| receipt.transaction_hash) - .collect::>() - .into() + H256::zero() // Genesis block }; - Block { - hash: block.hash(), - parent_hash, - state_root: transactions_root, - miner: block_author, - transactions_root, - number: header.number.into(), - timestamp: timestamp.into(), - base_fee_per_gas: runtime_api.gas_price().await.ok().unwrap_or_default(), + // Build the Ethereum block with correct parent hash + let (mut evm_block, _gas_info) = builder.build( + block.header().number.into(), + parent_evm_hash, + timestamp.into(), + block_author, gas_limit, - gas_used, - receipts_root, - transactions, - ..Default::default() + ); + + // Optionally hydrate with full transaction info + if hydrated_transactions { + evm_block.transactions = signed_txs + .into_iter() + .zip(receipts.iter()) + .map(|(tx, receipt)| TransactionInfo::new(receipt, tx)) + .collect::>() + .into(); } + + evm_block } /// Get the chain ID. From 0765c4ea6006ec272c524b77c9ecf4c628a355e1 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 18:37:07 +0200 Subject: [PATCH 35/53] revive/rpc: reconstruct genesis block on server startup --- substrate/frame/revive/rpc/src/client.rs | 66 +++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index e1bb35c8c1062..9951a36081195 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -224,7 +224,7 @@ impl Client { let (chain_id, max_block_weight) = tokio::try_join!(chain_id(&api), max_block_weight(&api))?; - Ok(Self { + let client = Self { api, rpc_client, rpc, @@ -233,7 +233,69 @@ impl Client { fee_history_provider: FeeHistoryProvider::default(), chain_id, max_block_weight, - }) + }; + + // Initialize genesis block (block 0) if not already present + client.ensure_genesis_block().await?; + + Ok(client) + } + + /// Ensure the genesis block (block 0) is reconstructed and stored. + /// + /// This method checks if block 0 exists in storage. If not, it reconstructs + /// an empty EVM genesis block and stores the mapping between its EVM hash + /// and the Substrate hash. + async fn ensure_genesis_block(&self) -> Result<(), ClientError> { + use pallet_revive::evm::block_hash::{EthereumBlockBuilder, InMemoryStorage}; + + // Try to get genesis block + let genesis_block = match self.block_by_number(0).await? { + Some(block) => block, + None => { + log::warn!(target: LOG_TARGET, "Genesis block (0) not found, skipping initialization"); + return Ok(()); + }, + }; + + let substrate_hash = genesis_block.hash(); + + // Check if genesis block mapping already exists + if self.receipt_provider.get_ethereum_hash(&substrate_hash).await.is_some() { + log::debug!(target: LOG_TARGET, "Genesis block mapping already exists"); + return Ok(()); + } + + log::info!(target: LOG_TARGET, "🏗️ Reconstructing genesis block (block 0)"); + + let runtime_api = self.runtime_api(substrate_hash); + let gas_limit = runtime_api.block_gas_limit().await.unwrap_or_default(); + let block_author = runtime_api.block_author().await.ok().unwrap_or_default(); + let timestamp = extract_block_timestamp(&genesis_block).await.unwrap_or_default(); + + // Build genesis block with no transactions + let mut builder = EthereumBlockBuilder::new(InMemoryStorage::new()); + let (genesis_evm_block, _gas_info) = builder.build( + 0u64.into(), // block number 0 + H256::zero(), // parent hash is zero for genesis + timestamp.into(), // timestamp from substrate block + block_author, // block author + gas_limit, // gas limit + ); + + let ethereum_hash = genesis_evm_block.hash; + + // Store the mapping + self.receipt_provider + .insert_block_mapping(ðereum_hash, &substrate_hash, 0) + .await?; + + log::info!( + target: LOG_TARGET, + "✅ Genesis block reconstructed: EVM hash {ethereum_hash:?} -> Substrate hash {substrate_hash:?}" + ); + + Ok(()) } /// Subscribe to past blocks executing the callback for each block in `range`. From 3feef3f9c59596dc7a41ad2ae8680bbee1210e74 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:10:12 +0200 Subject: [PATCH 36/53] revive/rpc: handle error when cannot fetch EVM block --- substrate/frame/revive/rpc/src/client.rs | 93 ++++++++++++------------ substrate/frame/revive/rpc/src/lib.rs | 6 +- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 9951a36081195..b07033c5d6b2f 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -276,11 +276,11 @@ impl Client { // Build genesis block with no transactions let mut builder = EthereumBlockBuilder::new(InMemoryStorage::new()); let (genesis_evm_block, _gas_info) = builder.build( - 0u64.into(), // block number 0 - H256::zero(), // parent hash is zero for genesis - timestamp.into(), // timestamp from substrate block - block_author, // block author - gas_limit, // gas limit + 0u64.into(), // block number 0 + H256::zero(), // parent hash is zero for genesis + timestamp.into(), // timestamp from substrate block + block_author, // block author + gas_limit, // gas limit ); let ethereum_hash = genesis_evm_block.hash; @@ -731,51 +731,52 @@ impl Client { &self, block: Arc, hydrated_transactions: bool, - ) -> Block { + ) -> Result, ClientError> { log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); let storage_api = self.storage_api(block.hash()); - let ethereum_block = storage_api.get_ethereum_block().await.inspect_err(|err| { - log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); - }); - - // This could potentially fail under two circumstances: - // - the block author cannot be obtained from the digest logs (highly unlikely) - // - the node we are targeting has an outdated revive pallet (or ETH block functionality is - // disabled) - if let Ok(mut eth_block) = ethereum_block { - log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.hash); - - // This means we can live with the hashes returned by the Revive pallet. - if !hydrated_transactions { - return eth_block; - } - - // Hydrate the block. - let tx_infos = self - .receipt_provider - .receipts_from_block(&block) - .await - .unwrap_or_default() - .into_iter() - .map(|(signed_tx, receipt)| TransactionInfo::new(&receipt, signed_tx)) - .collect::>(); - - eth_block.transactions = HashesOrTransactionInfos::TransactionInfos(tx_infos); - return eth_block; - } + let block = match storage_api.get_ethereum_block().await { + Ok(mut eth_block) => { + log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.hash); + + // If no need for hydrating transactions then we can live with the hashes returned + // by the Revive pallet. + if hydrated_transactions { + // Hydrate the block. + let tx_infos = self + .receipt_provider + .receipts_from_block(&block) + .await + .unwrap_or_default() + .into_iter() + .map(|(signed_tx, receipt)| TransactionInfo::new(&receipt, signed_tx)) + .collect::>(); + + eth_block.transactions = HashesOrTransactionInfos::TransactionInfos(tx_infos); + } + + eth_block + }, + Err(ClientError::EthereumBlockNotFound) => { + log::warn!(target: LOG_TARGET, "Failed to find Ethereum block for hash {:?}, trying to reconstruct", block.hash()); + // We need to reconstruct the ETH block fully. + let (signed_txs, receipts): (Vec<_>, Vec<_>) = self + .receipt_provider + .receipts_from_block(&block) + .await + .unwrap_or_default() + .into_iter() + .unzip(); + self.evm_block_from_receipts(&block, &receipts, signed_txs, hydrated_transactions) + .await + }, + Err(err) => { + log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); + return Err(err); + }, + }; - // We need to reconstruct the ETH block fully. - let (signed_txs, receipts): (Vec<_>, Vec<_>) = self - .receipt_provider - .receipts_from_block(&block) - .await - .unwrap_or_default() - .into_iter() - .unzip(); - return self - .evm_block_from_receipts(&block, &receipts, signed_txs, hydrated_transactions) - .await + Ok(Some(block)) } /// Get the EVM block for the given block and receipts. diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 6f66c3357ae2f..70228245efd3c 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -217,8 +217,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_ethereum_hash(&block_hash).await? else { return Ok(None); }; - let block = self.client.evm_block(block, hydrated_transactions).await; - Ok(Some(block)) + Ok(self.client.evm_block(block, hydrated_transactions).await?) } async fn get_balance(&self, address: H160, block: BlockNumberOrTagOrHash) -> RpcResult { @@ -262,8 +261,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_number_or_tag(&block_number).await? else { return Ok(None); }; - let block = self.client.evm_block(block, hydrated_transactions).await; - Ok(Some(block)) + Ok(self.client.evm_block(block, hydrated_transactions).await?) } async fn get_block_transaction_count_by_hash( From 0b25e82efef376c6f94acfe1ba932801d380bfed Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:18:25 +0200 Subject: [PATCH 37/53] revive/rpc: return none if failed to fetch EVM block --- substrate/frame/revive/rpc/src/client.rs | 6 +++--- substrate/frame/revive/rpc/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index b07033c5d6b2f..b161998ac1c9a 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -731,7 +731,7 @@ impl Client { &self, block: Arc, hydrated_transactions: bool, - ) -> Result, ClientError> { + ) -> Option { log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); let storage_api = self.storage_api(block.hash()); @@ -772,11 +772,11 @@ impl Client { }, Err(err) => { log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); - return Err(err); + return None; }, }; - Ok(Some(block)) + Some(block) } /// Get the EVM block for the given block and receipts. diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 70228245efd3c..184a8f7eb5fff 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -217,7 +217,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_ethereum_hash(&block_hash).await? else { return Ok(None); }; - Ok(self.client.evm_block(block, hydrated_transactions).await?) + Ok(self.client.evm_block(block, hydrated_transactions).await) } async fn get_balance(&self, address: H160, block: BlockNumberOrTagOrHash) -> RpcResult { @@ -261,7 +261,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_number_or_tag(&block_number).await? else { return Ok(None); }; - Ok(self.client.evm_block(block, hydrated_transactions).await?) + Ok(self.client.evm_block(block, hydrated_transactions).await) } async fn get_block_transaction_count_by_hash( From cfa979d0d0973bc2788afc2f05e025ae2aff086d Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:24:22 +0200 Subject: [PATCH 38/53] revive/rpc: fix price setting --- substrate/frame/revive/rpc/src/receipt_extractor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 5798a0247c865..4378c6c1d425a 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -194,17 +194,17 @@ impl ReceiptExtractor { let base_gas_price = (self.fetch_gas_price)(substrate_block.hash()).await?; let tx_info = GenericTransaction::from_signed(signed_tx.clone(), base_gas_price, Some(from)); + let gas_price = tx_info.gas_price.unwrap_or_default(); let gas_used = if let Some(receipt) = maybe_receipt { // If we have a receipt, use it to accurately represent the gas. U256::from(receipt.gas_used) } else { // Otherwise, calculate gas used from the transaction fees. - let gas_used = U256::from(tx_fees.tip.saturating_add(tx_fees.actual_fee)) + U256::from(tx_fees.tip.saturating_add(tx_fees.actual_fee)) .saturating_mul(self.native_to_eth_ratio.into()) .checked_div(gas_price) - .unwrap_or_default(); - gas_used + .unwrap_or_default() }; // get logs from ContractEmitted event From 576bc2b596e8d869123a2c68350c2b71b7d62fb4 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:50:31 +0200 Subject: [PATCH 39/53] Revert "revive/rpc: return none if failed to fetch EVM block" This reverts commit bd4ace92c7f6e819b8b1366e63913d8f179ede6e. --- substrate/frame/revive/rpc/src/client.rs | 6 +++--- substrate/frame/revive/rpc/src/lib.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index b161998ac1c9a..b07033c5d6b2f 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -731,7 +731,7 @@ impl Client { &self, block: Arc, hydrated_transactions: bool, - ) -> Option { + ) -> Result, ClientError> { log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); let storage_api = self.storage_api(block.hash()); @@ -772,11 +772,11 @@ impl Client { }, Err(err) => { log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); - return None; + return Err(err); }, }; - Some(block) + Ok(Some(block)) } /// Get the EVM block for the given block and receipts. diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 184a8f7eb5fff..70228245efd3c 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -217,7 +217,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_ethereum_hash(&block_hash).await? else { return Ok(None); }; - Ok(self.client.evm_block(block, hydrated_transactions).await) + Ok(self.client.evm_block(block, hydrated_transactions).await?) } async fn get_balance(&self, address: H160, block: BlockNumberOrTagOrHash) -> RpcResult { @@ -261,7 +261,7 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_number_or_tag(&block_number).await? else { return Ok(None); }; - Ok(self.client.evm_block(block, hydrated_transactions).await) + Ok(self.client.evm_block(block, hydrated_transactions).await?) } async fn get_block_transaction_count_by_hash( From 6e16fd07450df624a57788c56ce8b251a26c0063 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Wed, 1 Oct 2025 20:50:43 +0200 Subject: [PATCH 40/53] Revert "revive/rpc: handle error when cannot fetch EVM block" This reverts commit 158180bd3ffabd0df7a0b927750c3287b60bd47e. --- substrate/frame/revive/rpc/src/client.rs | 93 ++++++++++++------------ substrate/frame/revive/rpc/src/lib.rs | 6 +- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index b07033c5d6b2f..9951a36081195 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -276,11 +276,11 @@ impl Client { // Build genesis block with no transactions let mut builder = EthereumBlockBuilder::new(InMemoryStorage::new()); let (genesis_evm_block, _gas_info) = builder.build( - 0u64.into(), // block number 0 - H256::zero(), // parent hash is zero for genesis - timestamp.into(), // timestamp from substrate block - block_author, // block author - gas_limit, // gas limit + 0u64.into(), // block number 0 + H256::zero(), // parent hash is zero for genesis + timestamp.into(), // timestamp from substrate block + block_author, // block author + gas_limit, // gas limit ); let ethereum_hash = genesis_evm_block.hash; @@ -731,52 +731,51 @@ impl Client { &self, block: Arc, hydrated_transactions: bool, - ) -> Result, ClientError> { + ) -> Block { log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); let storage_api = self.storage_api(block.hash()); - let block = match storage_api.get_ethereum_block().await { - Ok(mut eth_block) => { - log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.hash); - - // If no need for hydrating transactions then we can live with the hashes returned - // by the Revive pallet. - if hydrated_transactions { - // Hydrate the block. - let tx_infos = self - .receipt_provider - .receipts_from_block(&block) - .await - .unwrap_or_default() - .into_iter() - .map(|(signed_tx, receipt)| TransactionInfo::new(&receipt, signed_tx)) - .collect::>(); - - eth_block.transactions = HashesOrTransactionInfos::TransactionInfos(tx_infos); - } - - eth_block - }, - Err(ClientError::EthereumBlockNotFound) => { - log::warn!(target: LOG_TARGET, "Failed to find Ethereum block for hash {:?}, trying to reconstruct", block.hash()); - // We need to reconstruct the ETH block fully. - let (signed_txs, receipts): (Vec<_>, Vec<_>) = self - .receipt_provider - .receipts_from_block(&block) - .await - .unwrap_or_default() - .into_iter() - .unzip(); - self.evm_block_from_receipts(&block, &receipts, signed_txs, hydrated_transactions) - .await - }, - Err(err) => { - log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); - return Err(err); - }, - }; + let ethereum_block = storage_api.get_ethereum_block().await.inspect_err(|err| { + log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); + }); + + // This could potentially fail under two circumstances: + // - the block author cannot be obtained from the digest logs (highly unlikely) + // - the node we are targeting has an outdated revive pallet (or ETH block functionality is + // disabled) + if let Ok(mut eth_block) = ethereum_block { + log::trace!(target: LOG_TARGET, "Ethereum block from storage hash {:?}", eth_block.hash); + + // This means we can live with the hashes returned by the Revive pallet. + if !hydrated_transactions { + return eth_block; + } - Ok(Some(block)) + // Hydrate the block. + let tx_infos = self + .receipt_provider + .receipts_from_block(&block) + .await + .unwrap_or_default() + .into_iter() + .map(|(signed_tx, receipt)| TransactionInfo::new(&receipt, signed_tx)) + .collect::>(); + + eth_block.transactions = HashesOrTransactionInfos::TransactionInfos(tx_infos); + return eth_block; + } + + // We need to reconstruct the ETH block fully. + let (signed_txs, receipts): (Vec<_>, Vec<_>) = self + .receipt_provider + .receipts_from_block(&block) + .await + .unwrap_or_default() + .into_iter() + .unzip(); + return self + .evm_block_from_receipts(&block, &receipts, signed_txs, hydrated_transactions) + .await } /// Get the EVM block for the given block and receipts. diff --git a/substrate/frame/revive/rpc/src/lib.rs b/substrate/frame/revive/rpc/src/lib.rs index 70228245efd3c..6f66c3357ae2f 100644 --- a/substrate/frame/revive/rpc/src/lib.rs +++ b/substrate/frame/revive/rpc/src/lib.rs @@ -217,7 +217,8 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_ethereum_hash(&block_hash).await? else { return Ok(None); }; - Ok(self.client.evm_block(block, hydrated_transactions).await?) + let block = self.client.evm_block(block, hydrated_transactions).await; + Ok(Some(block)) } async fn get_balance(&self, address: H160, block: BlockNumberOrTagOrHash) -> RpcResult { @@ -261,7 +262,8 @@ impl EthRpcServer for EthRpcServerImpl { let Some(block) = self.client.block_by_number_or_tag(&block_number).await? else { return Ok(None); }; - Ok(self.client.evm_block(block, hydrated_transactions).await?) + let block = self.client.evm_block(block, hydrated_transactions).await; + Ok(Some(block)) } async fn get_block_transaction_count_by_hash( From 10c8fbeb8c94ba71c66e0dc27be3dc2813951c95 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 08:44:23 +0200 Subject: [PATCH 41/53] revive/rpc: add fetch_block_gas_limit and fetch_block_author to the receipt_extractor --- .../frame/revive/rpc/src/receipt_extractor.rs | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 4378c6c1d425a..59fdc32a9218a 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -49,6 +49,16 @@ type FetchReceiptDataFn = Arc< type FetchEthBlockHashFn = Arc Pin> + Send>> + Send + Sync>; +type FetchBlockGasLimitFn = Arc< + dyn Fn(H256) -> Pin> + Send>> + Send + Sync, +>; + +type FetchBlockAuthorFn = Arc< + dyn Fn(H256) -> Pin> + Send>> + + Send + + Sync, +>; + /// Utility to extract receipts from extrinsics. #[derive(Clone)] pub struct ReceiptExtractor { @@ -61,6 +71,12 @@ pub struct ReceiptExtractor { /// Fetch the gas price from the chain. fetch_gas_price: FetchGasPriceFn, + /// Fetch the block gas limit from the chain. + fetch_block_gas_limit: FetchBlockGasLimitFn, + + /// Fetch the block author from the chain. + fetch_block_author: FetchBlockAuthorFn, + /// The native to eth decimal ratio, used to calculated gas from native fees. native_to_eth_ratio: u32, @@ -125,10 +141,40 @@ impl ReceiptExtractor { Box::pin(fut) as Pin> }); + let api_inner = api.clone(); + let fetch_block_gas_limit = Arc::new(move |block_hash| { + let api_inner = api_inner.clone(); + + let fut = async move { + let runtime_api = api_inner.runtime_api().at(block_hash); + let payload = subxt_client::apis().revive_api().block_gas_limit(); + let gas_limit = runtime_api.call(payload).await?; + Ok(*gas_limit) + }; + + Box::pin(fut) as Pin> + }); + + let api_inner = api.clone(); + let fetch_block_author = Arc::new(move |block_hash| { + let api_inner = api_inner.clone(); + + let fut = async move { + let runtime_api = api_inner.runtime_api().at(block_hash); + let payload = subxt_client::apis().revive_api().block_author(); + let author = runtime_api.call(payload).await?; + Ok(author) + }; + + Box::pin(fut) as Pin> + }); + Ok(Self { fetch_receipt_data, fetch_eth_block_hash, fetch_gas_price, + fetch_block_gas_limit, + fetch_block_author, native_to_eth_ratio, earliest_receipt_block, }) @@ -146,11 +192,18 @@ impl ReceiptExtractor { }); let fetch_gas_price = Arc::new(|_| Box::pin(std::future::ready(Ok(U256::from(1000)))) as Pin>); + let fetch_block_gas_limit = + Arc::new(|_| Box::pin(std::future::ready(Ok(U256::from(30_000_000)))) as Pin>); + let fetch_block_author = Arc::new(|_| { + Box::pin(std::future::ready(Ok(sp_core::H160::zero()))) as Pin> + }); Self { fetch_receipt_data, fetch_eth_block_hash, fetch_gas_price, + fetch_block_gas_limit, + fetch_block_author, native_to_eth_ratio: 1_000_000, earliest_receipt_block: None, } @@ -385,4 +438,14 @@ impl ReceiptExtractor { ) -> Option { (self.fetch_eth_block_hash)(*block_hash, block_number).await } + + /// Get the block gas limit for the given block hash. + pub async fn block_gas_limit(&self, block_hash: H256) -> Result { + (self.fetch_block_gas_limit)(block_hash).await + } + + /// Get the block author for the given block hash. + pub async fn block_author(&self, block_hash: H256) -> Result { + (self.fetch_block_author)(block_hash).await + } } From e6e4fa8553dc0298aa5d8816570c3060938837ca Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:53:15 +0200 Subject: [PATCH 42/53] revive/rpc: add gas_limit and block_author to the ethereum-substrate block mapping --- ...69bf6b75295fcd3abfec26b2d6d7e2b28caeb.json | 12 -- ...da803f842b5c8630d5e9c4c91ae4bc39c168a.json | 12 ++ ...a16aaed5151b5a22ae4ea57c12371ddc56190.json | 32 ++++ ...bd61d257d1ffad222317634327e12be403ab2.json | 20 -- ...003_create_eth_substrate_block_mapping.sql | 6 +- substrate/frame/revive/rpc/src/client.rs | 14 +- .../frame/revive/rpc/src/receipt_provider.rs | 178 ++++++++++++++---- 7 files changed, 197 insertions(+), 77 deletions(-) delete mode 100644 substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-633be9386b88059d022cf532499da803f842b5c8630d5e9c4c91ae4bc39c168a.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-668e8f9a808d1dc82c138f75d60a16aaed5151b5a22ae4ea57c12371ddc56190.json delete mode 100644 substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json diff --git a/substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json b/substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json deleted file mode 100644 index 7079a77b31ea2..0000000000000 --- a/substrate/frame/revive/rpc/.sqlx/query-218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n\t\t\tINSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash, block_number)\n\t\t\tVALUES ($1, $2, $3)\n\t\t\t", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - }, - "hash": "218a5fbe30948811bc7fcde005469bf6b75295fcd3abfec26b2d6d7e2b28caeb" -} diff --git a/substrate/frame/revive/rpc/.sqlx/query-633be9386b88059d022cf532499da803f842b5c8630d5e9c4c91ae4bc39c168a.json b/substrate/frame/revive/rpc/.sqlx/query-633be9386b88059d022cf532499da803f842b5c8630d5e9c4c91ae4bc39c168a.json new file mode 100644 index 0000000000000..b87ef45bf0de7 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-633be9386b88059d022cf532499da803f842b5c8630d5e9c4c91ae4bc39c168a.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tINSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash, block_number, gas_limit, block_author)\n\t\t\tVALUES ($1, $2, $3, $4, $5)\n\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 5 + }, + "nullable": [] + }, + "hash": "633be9386b88059d022cf532499da803f842b5c8630d5e9c4c91ae4bc39c168a" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-668e8f9a808d1dc82c138f75d60a16aaed5151b5a22ae4ea57c12371ddc56190.json b/substrate/frame/revive/rpc/.sqlx/query-668e8f9a808d1dc82c138f75d60a16aaed5151b5a22ae4ea57c12371ddc56190.json new file mode 100644 index 0000000000000..5ae1423c1d96f --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-668e8f9a808d1dc82c138f75d60a16aaed5151b5a22ae4ea57c12371ddc56190.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT ethereum_block_hash, gas_limit, block_author\n\t\t\tFROM eth_to_substrate_blocks\n\t\t\tWHERE substrate_block_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "ethereum_block_hash", + "ordinal": 0, + "type_info": "Blob" + }, + { + "name": "gas_limit", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "block_author", + "ordinal": 2, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "668e8f9a808d1dc82c138f75d60a16aaed5151b5a22ae4ea57c12371ddc56190" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json b/substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json deleted file mode 100644 index d012a83ef5a13..0000000000000 --- a/substrate/frame/revive/rpc/.sqlx/query-7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n\t\t\tSELECT ethereum_block_hash\n\t\t\tFROM eth_to_substrate_blocks\n\t\t\tWHERE substrate_block_hash = $1\n\t\t\t", - "describe": { - "columns": [ - { - "name": "ethereum_block_hash", - "ordinal": 0, - "type_info": "Blob" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false - ] - }, - "hash": "7e5be81ad6f5d96bc6dbf62098cbd61d257d1ffad222317634327e12be403ab2" -} diff --git a/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql b/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql index d4c2370e1bbea..28721ab9100f6 100644 --- a/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql +++ b/substrate/frame/revive/rpc/migrations/0003_create_eth_substrate_block_mapping.sql @@ -1,7 +1,9 @@ CREATE TABLE IF NOT EXISTS eth_to_substrate_blocks ( ethereum_block_hash BLOB NOT NULL PRIMARY KEY, substrate_block_hash BLOB NOT NULL, - block_number INTEGER NOT NULL + block_number INTEGER NOT NULL, + gas_limit BLOB NOT NULL, + block_author BLOB NOT NULL ); CREATE INDEX IF NOT EXISTS idx_substrate_block_hash ON eth_to_substrate_blocks ( @@ -10,4 +12,4 @@ CREATE INDEX IF NOT EXISTS idx_substrate_block_hash ON eth_to_substrate_blocks ( CREATE INDEX IF NOT EXISTS idx_block_number ON eth_to_substrate_blocks ( block_number -); \ No newline at end of file +); diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 9951a36081195..be189a7892bcb 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -276,18 +276,18 @@ impl Client { // Build genesis block with no transactions let mut builder = EthereumBlockBuilder::new(InMemoryStorage::new()); let (genesis_evm_block, _gas_info) = builder.build( - 0u64.into(), // block number 0 - H256::zero(), // parent hash is zero for genesis - timestamp.into(), // timestamp from substrate block - block_author, // block author - gas_limit, // gas limit + 0u64.into(), // block number 0 + H256::zero(), // parent hash is zero for genesis + timestamp.into(), // timestamp from substrate block + block_author, // block author + gas_limit, // gas limit ); let ethereum_hash = genesis_evm_block.hash; - // Store the mapping + // Store the mapping with metadata self.receipt_provider - .insert_block_mapping(ðereum_hash, &substrate_hash, 0) + .insert_block_mapping(ðereum_hash, &substrate_hash, 0, &gas_limit, &block_author) .await?; log::info!( diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index 8166921f88425..a102d72952509 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -20,7 +20,7 @@ use crate::{ FilterTopic, ReceiptExtractor, SubxtBlockInfoProvider, }; use pallet_revive::evm::{Filter, Log, ReceiptInfo, TransactionSigned}; -use sp_core::{H256, U256}; +use sp_core::{H160, H256, U256}; use sqlx::{query, QueryBuilder, Row, Sqlite, SqlitePool}; use std::{ collections::{BTreeMap, HashMap}, @@ -107,19 +107,27 @@ impl ReceiptProvider { ethereum_block_hash: &H256, substrate_block_hash: &H256, block_number: u64, + gas_limit: &U256, + block_author: &H160, ) -> Result<(), ClientError> { let ethereum_hash = ethereum_block_hash.as_ref(); let substrate_hash = substrate_block_hash.as_ref(); let block_number = block_number as i64; + let gas_limit = gas_limit.to_big_endian(); + let gas_limit_bytes = gas_limit.as_ref(); + let block_author_bytes = block_author.as_bytes(); + query!( r#" - INSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash, block_number) - VALUES ($1, $2, $3) + INSERT OR REPLACE INTO eth_to_substrate_blocks (ethereum_block_hash, substrate_block_hash, block_number, gas_limit, block_author) + VALUES ($1, $2, $3, $4, $5) "#, ethereum_hash, substrate_hash, - block_number + block_number, + gas_limit_bytes, + block_author_bytes ) .execute(&self.pool) .await?; @@ -128,6 +136,36 @@ impl ReceiptProvider { Ok(()) } + /// Get block metadata (ethereum hash, gas limit, block author) for the given Substrate block + /// hash. Returns a tuple of (ethereum_block_hash, gas_limit, block_author). + pub async fn get_block_mapping( + &self, + substrate_block_hash: &H256, + ) -> Option<(H256, U256, sp_core::H160)> { + let substrate_hash = substrate_block_hash.as_ref(); + let result = query!( + r#" + SELECT ethereum_block_hash, gas_limit, block_author + FROM eth_to_substrate_blocks + WHERE substrate_block_hash = $1 + "#, + substrate_hash + ) + .fetch_optional(&self.pool) + .await + .ok()??; + + let ethereum_block_hash = H256::from_slice(&result.ethereum_block_hash[..]); + + // Deserialize gas_limit from big-endian bytes + let gas_limit = U256::from_big_endian(&result.gas_limit[..]); + + // Deserialize block_author from bytes + let block_author = sp_core::H160::from_slice(&result.block_author[..]); + + Some((ethereum_block_hash, gas_limit, block_author)) + } + /// Get the Substrate block hash for the given Ethereum block hash. pub async fn get_substrate_hash(&self, ethereum_block_hash: &H256) -> Option { let ethereum_hash = ethereum_block_hash.as_ref(); @@ -157,29 +195,21 @@ impl ReceiptProvider { /// Get the Ethereum block hash for the given Substrate block hash. pub async fn get_ethereum_hash(&self, substrate_block_hash: &H256) -> Option { - let substrate_hash = substrate_block_hash.as_ref(); - let result = query!( - r#" - SELECT ethereum_block_hash - FROM eth_to_substrate_blocks - WHERE substrate_block_hash = $1 - "#, - substrate_hash - ) - .fetch_optional(&self.pool) - .await - .inspect_err(|e| { - log::error!(target: LOG_TARGET, "failed to get block mapping for substrate block {substrate_block_hash:?}, err: {e:?}"); - }) - .ok()? - .or_else(||{ - log::trace!(target: LOG_TARGET, "No block mapping found for substrate block: {substrate_block_hash:?}"); - None - })?; + let (ethereum_hash, _, _) = self.get_block_mapping(substrate_block_hash).await?; + log::trace!(target: LOG_TARGET, "Get block mapping substrate block: {substrate_block_hash:?} -> ethereum block: {ethereum_hash:?}"); + Some(ethereum_hash) + } - log::trace!(target: LOG_TARGET, "Get block mapping substrate block: {substrate_block_hash:?} -> ethereum block: {:?}", H256::from_slice(&result.ethereum_block_hash[..])); + /// Get the block gas limit for the given Substrate block hash. + pub async fn get_block_gas_limit(&self, substrate_block_hash: &H256) -> Option { + let (_, gas_limit, _) = self.get_block_mapping(substrate_block_hash).await?; + Some(gas_limit) + } - Some(H256::from_slice(&result.ethereum_block_hash[..])) + /// Get the block author for the given Substrate block hash. + pub async fn get_block_author(&self, substrate_block_hash: &H256) -> Option { + let (_, _, block_author) = self.get_block_mapping(substrate_block_hash).await?; + Some(block_author) } /// Remove block mappings for the given Ethereum block hashes. @@ -383,8 +413,20 @@ impl ReceiptProvider { .get_ethereum_block_hash(&block_hash, block_number as u64) .await { - self.insert_block_mapping(ðereum_hash, &block_hash, block_number as u64) - .await?; + // Fetch gas_limit and block_author for this block + let gas_limit = + self.receipt_extractor.block_gas_limit(block_hash).await.unwrap_or_default(); // Default gas limit + let block_author = + self.receipt_extractor.block_author(block_hash).await.unwrap_or_default(); // Default author + + self.insert_block_mapping( + ðereum_hash, + &block_hash, + block_number as u64, + &gas_limit, + &block_author, + ) + .await?; } Ok(()) @@ -926,10 +968,18 @@ mod tests { let ethereum_hash = H256::from([1u8; 32]); let substrate_hash = H256::from([2u8; 32]); let block_number = 42u64; + let gas_limit = U256::from(30_000_000); + let block_author = H160::zero(); // Insert mapping provider - .insert_block_mapping(ðereum_hash, &substrate_hash, block_number) + .insert_block_mapping( + ðereum_hash, + &substrate_hash, + block_number, + &gas_limit, + &block_author, + ) .await?; // Test forward lookup @@ -950,16 +1000,30 @@ mod tests { let substrate_hash1 = H256::from([2u8; 32]); let substrate_hash2 = H256::from([3u8; 32]); let block_number = 42u64; + let gas_limit = U256::from(30_000_000); + let block_author = H160::zero(); // Insert first mapping provider - .insert_block_mapping(ðereum_hash, &substrate_hash1, block_number) + .insert_block_mapping( + ðereum_hash, + &substrate_hash1, + block_number, + &gas_limit, + &block_author, + ) .await?; assert_eq!(provider.get_substrate_hash(ðereum_hash).await, Some(substrate_hash1)); // Insert second mapping (should overwrite) provider - .insert_block_mapping(ðereum_hash, &substrate_hash2, block_number) + .insert_block_mapping( + ðereum_hash, + &substrate_hash2, + block_number, + &gas_limit, + &block_author, + ) .await?; assert_eq!(provider.get_substrate_hash(ðereum_hash).await, Some(substrate_hash2)); @@ -977,13 +1041,27 @@ mod tests { let substrate_hash1 = H256::from([3u8; 32]); let substrate_hash2 = H256::from([4u8; 32]); let block_number = 42u64; + let gas_limit = U256::from(30_000_000); + let block_author = H160::zero(); // Insert mappings provider - .insert_block_mapping(ðereum_hash1, &substrate_hash1, block_number) + .insert_block_mapping( + ðereum_hash1, + &substrate_hash1, + block_number, + &gas_limit, + &block_author, + ) .await?; provider - .insert_block_mapping(ðereum_hash2, &substrate_hash2, block_number) + .insert_block_mapping( + ðereum_hash2, + &substrate_hash2, + block_number, + &gas_limit, + &block_author, + ) .await?; // Verify they exist @@ -1006,10 +1084,18 @@ mod tests { let ethereum_hash = H256::from([1u8; 32]); let substrate_hash = H256::from([2u8; 32]); let block_number = 42u64; + let gas_limit = U256::from(30_000_000); + let block_author = H160::zero(); // Insert mapping provider - .insert_block_mapping(ðereum_hash, &substrate_hash, block_number) + .insert_block_mapping( + ðereum_hash, + &substrate_hash, + block_number, + &gas_limit, + &block_author, + ) .await?; assert_eq!(provider.get_substrate_hash(ðereum_hash).await, Some(substrate_hash)); @@ -1028,6 +1114,8 @@ mod tests { let ethereum_hash = H256::from([1u8; 32]); let substrate_hash = H256::from([2u8; 32]); let block_number = 1u64; + let gas_limit = U256::from(30_000_000); + let block_author = H160::zero(); // Create a log with substrate hash let log = Log { @@ -1057,7 +1145,13 @@ mod tests { // Insert block mapping provider - .insert_block_mapping(ðereum_hash, &substrate_hash, block_number) + .insert_block_mapping( + ðereum_hash, + &substrate_hash, + block_number, + &gas_limit, + &block_author, + ) .await?; // Query logs using Ethereum block hash (should resolve to substrate hash) @@ -1078,10 +1172,22 @@ mod tests { // Insert some mappings provider - .insert_block_mapping(&H256::from([1u8; 32]), &H256::from([2u8; 32]), 1) + .insert_block_mapping( + &H256::from([1u8; 32]), + &H256::from([2u8; 32]), + 1, + &U256::from(30_000_000), + &H160::zero(), + ) .await?; provider - .insert_block_mapping(&H256::from([3u8; 32]), &H256::from([4u8; 32]), 2) + .insert_block_mapping( + &H256::from([3u8; 32]), + &H256::from([4u8; 32]), + 2, + &U256::from(30_000_000), + &H160::zero(), + ) .await?; assert_eq!(count(&provider.pool, "eth_to_substrate_blocks", None).await, 2); From 1e057f55aa0b36da05cdaa584198aed7a5f4a2d3 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 10:25:38 +0200 Subject: [PATCH 43/53] revive/rpc: get gas_limit and block_author from the mapping during EVM block reconstruction --- substrate/frame/revive/rpc/src/client.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index be189a7892bcb..3d5ffe553b855 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -795,11 +795,15 @@ impl Client { log::trace!(target: LOG_TARGET, "Reconstructing Ethereum block for substrate block {:?}", block.hash()); - let runtime_api = self.runtime_api(block.hash()); - let gas_limit = runtime_api.block_gas_limit().await.unwrap_or_default(); - let block_author = runtime_api.block_author().await.ok().unwrap_or_default(); let timestamp = extract_block_timestamp(block).await.unwrap_or_default(); + let (_, gas_limit, block_author) = + self.receipt_provider.get_block_mapping(&block.hash()).await + .unwrap_or_else(|| { + log::warn!(target: LOG_TARGET, "No mapping found for substrate block {:?}, restoring defaults", block.hash()); + Default::default() + }); + // Build block using the proper EthereumBlockBuilder let mut builder = EthereumBlockBuilder::new(InMemoryStorage::new()); From 7cfd1a5c1d72be9adfd1771e5b02cccee133e4e3 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 11:06:07 +0200 Subject: [PATCH 44/53] revive/rpc: cleanup --- substrate/frame/revive/rpc/src/receipt_extractor.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 59fdc32a9218a..3d0368cd97de3 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -54,9 +54,7 @@ type FetchBlockGasLimitFn = Arc< >; type FetchBlockAuthorFn = Arc< - dyn Fn(H256) -> Pin> + Send>> - + Send - + Sync, + dyn Fn(H256) -> Pin> + Send>> + Send + Sync, >; /// Utility to extract receipts from extrinsics. @@ -194,9 +192,8 @@ impl ReceiptExtractor { Arc::new(|_| Box::pin(std::future::ready(Ok(U256::from(1000)))) as Pin>); let fetch_block_gas_limit = Arc::new(|_| Box::pin(std::future::ready(Ok(U256::from(30_000_000)))) as Pin>); - let fetch_block_author = Arc::new(|_| { - Box::pin(std::future::ready(Ok(sp_core::H160::zero()))) as Pin> - }); + let fetch_block_author = + Arc::new(|_| Box::pin(std::future::ready(Ok(H160::zero()))) as Pin>); Self { fetch_receipt_data, @@ -445,7 +442,7 @@ impl ReceiptExtractor { } /// Get the block author for the given block hash. - pub async fn block_author(&self, block_hash: H256) -> Result { + pub async fn block_author(&self, block_hash: H256) -> Result { (self.fetch_block_author)(block_hash).await } } From 8db0b2aef5133fbe1e90f2e77aeb6c25b92fbe56 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 17:23:05 +0200 Subject: [PATCH 45/53] revive/rpc: EVM block reconstruction tests --- substrate/frame/revive/rpc/src/tests.rs | 93 +++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/substrate/frame/revive/rpc/src/tests.rs b/substrate/frame/revive/rpc/src/tests.rs index fd8fa53c0b4c1..480c675dc7c88 100644 --- a/substrate/frame/revive/rpc/src/tests.rs +++ b/substrate/frame/revive/rpc/src/tests.rs @@ -275,3 +275,96 @@ async fn invalid_transaction() -> anyhow::Result<()> { Ok(()) } + +#[tokio::test] +async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { + use pallet_revive::evm::BlockNumberOrTag; + + // Start nodes with state pruning enabled + // let _node_handle = thread::spawn(move || { + // if let Err(e) = start_node_inline(vec![ + // "--dev", + // "--rpc-port=45791", + // "--no-telemetry", + // "--no-prometheus", + // "--state-pruning=16", + // "-lerror,evm=debug,sc_rpc_server=info,runtime::revive=trace", + // ]) { + // panic!("Node exited with error: {e:?}"); + // } + // }); + + // let args = CliCommand::parse_from([ + // "--dev", + // "--rpc-port=45790", + // "--node-rpc-url=ws://localhost:45791", + // "--no-prometheus", + // "-linfo,eth-rpc=debug", + // ]); + + // let _rpc_handle = thread::spawn(move || { + // if let Err(e) = cli::run(args) { + // panic!("eth-rpc exited with error: {e:?}"); + // } + // }); + + // let client = Arc::new(ws_client_with_retry("ws://localhost:45790").await); + let client = Arc::new(ws_client_with_retry("ws://localhost:8545").await); + let account = Account::default(); + + // Deploy a contract to have some interesting blocks + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let value = U256::from(5_000_000_000_000u128); + let tx = TransactionBuilder::new(&client) + .value(value) + .input(bytes.to_vec()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + let block_number = receipt.block_number; + println!("block_number = {block_number:?}"); + + // Fetch the block immediately (should come from storage via get_ethereum_block) + let storage_block = client + .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), false) + .await? + .expect("Block should exist"); + + println!("storage block = {storage_block:?}"); + + // Wait for state pruning (16 blocks + buffer) + let target_block = block_number + U256::from(20); + loop { + let current = client.block_number().await?; + + println!("block current = {current:?} target = {target_block:?}"); + if current >= target_block { + break; + } + + // Submit a dummy transaction to produce new blocks + let _ = TransactionBuilder::new(&client) + .value(U256::from(1_000_000u128)) + .to(account.address()) + .send() + .await? + .wait_for_receipt() + .await?; + } + + // Fetch the same block again (should use evm_block_from_receipts reconstruction) + let reconstructed_block = client + .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), false) + .await? + .expect("Block should still exist"); + println!("reconstructed block = {reconstructed_block:?}"); + + // Compare the entire blocks + assert_eq!( + storage_block, reconstructed_block, + "Reconstructed block should match storage block exactly" + ); + + Ok(()) +} From 76b3ae14208a68c081eaf7d72c3273ee89d0aa7c Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:10:58 +0200 Subject: [PATCH 46/53] revive/rpc: store receipt metadata for pruned state recovery --- ...285ccf101a8e36d68455e05a76df3b366420e.json | 12 -- ...d39ac9a81aa8ccaa583dd7160c287e1b9dc2c.json | 32 ++++ ...512b1d39982bade66f588600c4a3816eb426c.json | 62 +++++++ ...b1252e0dcfb05df1e76cdc08337d1b072571d.json | 12 ++ .../0001_create_transaction_hashes.sql | 5 +- .../frame/revive/rpc/src/receipt_extractor.rs | 110 +++++++++---- .../frame/revive/rpc/src/receipt_provider.rs | 153 +++++++++++++++++- 7 files changed, 337 insertions(+), 49 deletions(-) delete mode 100644 substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-cddbc4c024622fb7ceaeaa7e1f7d39ac9a81aa8ccaa583dd7160c287e1b9dc2c.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json create mode 100644 substrate/frame/revive/rpc/.sqlx/query-f82a6993e314fb2fb57f20552e2b1252e0dcfb05df1e76cdc08337d1b072571d.json diff --git a/substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json b/substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json deleted file mode 100644 index 76ad4a8c1fe95..0000000000000 --- a/substrate/frame/revive/rpc/.sqlx/query-b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n\t\t\t\t\tINSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index)\n\t\t\t\t\tVALUES ($1, $2, $3)\n\t\t\t\t\t", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - }, - "hash": "b296f5ac320c7537133dca1ede0285ccf101a8e36d68455e05a76df3b366420e" -} diff --git a/substrate/frame/revive/rpc/.sqlx/query-cddbc4c024622fb7ceaeaa7e1f7d39ac9a81aa8ccaa583dd7160c287e1b9dc2c.json b/substrate/frame/revive/rpc/.sqlx/query-cddbc4c024622fb7ceaeaa7e1f7d39ac9a81aa8ccaa583dd7160c287e1b9dc2c.json new file mode 100644 index 0000000000000..24f0e53698503 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-cddbc4c024622fb7ceaeaa7e1f7d39ac9a81aa8ccaa583dd7160c287e1b9dc2c.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\tSELECT status, gas_used, gas_price\n\t\t\tFROM transaction_hashes\n\t\t\tWHERE transaction_hash = $1\n\t\t\t", + "describe": { + "columns": [ + { + "name": "status", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "gas_used", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "gas_price", + "ordinal": 2, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "cddbc4c024622fb7ceaeaa7e1f7d39ac9a81aa8ccaa583dd7160c287e1b9dc2c" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json b/substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json new file mode 100644 index 0000000000000..a4ba76e5fd033 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json @@ -0,0 +1,62 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\t\tSELECT log_index, address, transaction_hash, topic_0, topic_1, topic_2, topic_3, data\n\t\t\t\tFROM logs\n\t\t\t\tWHERE block_hash = $1 AND transaction_index = $2\n\t\t\t\tORDER BY log_index ASC\n\t\t\t\t", + "describe": { + "columns": [ + { + "name": "log_index", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "address", + "ordinal": 1, + "type_info": "Blob" + }, + { + "name": "transaction_hash", + "ordinal": 2, + "type_info": "Blob" + }, + { + "name": "topic_0", + "ordinal": 3, + "type_info": "Blob" + }, + { + "name": "topic_1", + "ordinal": 4, + "type_info": "Blob" + }, + { + "name": "topic_2", + "ordinal": 5, + "type_info": "Blob" + }, + { + "name": "topic_3", + "ordinal": 6, + "type_info": "Blob" + }, + { + "name": "data", + "ordinal": 7, + "type_info": "Blob" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false, + false, + false, + true, + true, + true, + true, + true + ] + }, + "hash": "ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c" +} diff --git a/substrate/frame/revive/rpc/.sqlx/query-f82a6993e314fb2fb57f20552e2b1252e0dcfb05df1e76cdc08337d1b072571d.json b/substrate/frame/revive/rpc/.sqlx/query-f82a6993e314fb2fb57f20552e2b1252e0dcfb05df1e76cdc08337d1b072571d.json new file mode 100644 index 0000000000000..b8e5474309505 --- /dev/null +++ b/substrate/frame/revive/rpc/.sqlx/query-f82a6993e314fb2fb57f20552e2b1252e0dcfb05df1e76cdc08337d1b072571d.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n\t\t\t\t\tINSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index, status, gas_used, gas_price)\n\t\t\t\t\tVALUES ($1, $2, $3, $4, $5, $6)\n\t\t\t\t\t", + "describe": { + "columns": [], + "parameters": { + "Right": 6 + }, + "nullable": [] + }, + "hash": "f82a6993e314fb2fb57f20552e2b1252e0dcfb05df1e76cdc08337d1b072571d" +} diff --git a/substrate/frame/revive/rpc/migrations/0001_create_transaction_hashes.sql b/substrate/frame/revive/rpc/migrations/0001_create_transaction_hashes.sql index 8fd6b353faa82..3e5a22bcb0725 100644 --- a/substrate/frame/revive/rpc/migrations/0001_create_transaction_hashes.sql +++ b/substrate/frame/revive/rpc/migrations/0001_create_transaction_hashes.sql @@ -14,7 +14,10 @@ CREATE TABLE IF NOT EXISTS transaction_hashes ( transaction_hash BLOB NOT NULL PRIMARY KEY, transaction_index INTEGER NOT NULL, - block_hash BLOB NOT NULL + block_hash BLOB NOT NULL, + status INTEGER NOT NULL, + gas_used BLOB NOT NULL, + gas_price BLOB NOT NULL ); CREATE INDEX IF NOT EXISTS idx_block_hash ON transaction_hashes ( diff --git a/substrate/frame/revive/rpc/src/receipt_extractor.rs b/substrate/frame/revive/rpc/src/receipt_extractor.rs index 3d0368cd97de3..c80a814e203f9 100644 --- a/substrate/frame/revive/rpc/src/receipt_extractor.rs +++ b/substrate/frame/revive/rpc/src/receipt_extractor.rs @@ -34,10 +34,76 @@ use pallet_revive::{ U256, }, }; -use sp_core::keccak_256; +use sp_core::{keccak_256, H160}; use std::{future::Future, pin::Pin, sync::Arc}; use subxt::{blocks::ExtrinsicDetails, OnlineClient}; +/// Helper function to decode a transaction and recover the sender address. +/// Returns (signed_tx, transaction_hash, from_address) +pub fn decode_and_recover_tx( + call: &EthTransact, +) -> Result<(TransactionSigned, H256, H160), ClientError> { + let transaction_hash = H256(keccak_256(&call.payload)); + let signed_tx = + TransactionSigned::decode(&call.payload).map_err(|_| ClientError::TxDecodingFailed)?; + let from = signed_tx.recover_eth_address().map_err(|_| { + log::error!(target: LOG_TARGET, "Failed to recover eth address from signed tx"); + ClientError::RecoverEthAddressFailed + })?; + Ok((signed_tx, transaction_hash, from)) +} + +/// Helper function to calculate contract address for CREATE transactions. +pub fn calculate_contract_address( + from: &H160, + to: Option, + nonce: Option, +) -> Result, ClientError> { + if to.is_none() { + let nonce_u64 = nonce + .unwrap_or_default() + .try_into() + .map_err(|_| ClientError::ConversionFailed)?; + Ok(Some(create1(from, nonce_u64))) + } else { + Ok(None) + } +} + +/// Helper to build a receipt from decoded transaction and collected data. +/// This encapsulates the common logic of creating GenericTransaction, calculating +/// contract address, and assembling the final ReceiptInfo. +pub fn build_receipt_from_tx( + signed_tx: &TransactionSigned, + transaction_hash: H256, + from: H160, + gas_price: U256, + gas_used: U256, + status: bool, + logs: Vec, + eth_block_hash: H256, + block_number: U256, + transaction_index: usize, +) -> Result { + let tx_info = GenericTransaction::from_signed(signed_tx.clone(), gas_price, Some(from)); + let contract_address = calculate_contract_address(&from, tx_info.to, tx_info.nonce)?; + + Ok(ReceiptInfo::new( + eth_block_hash, + block_number, + contract_address, + from, + logs, + tx_info.to, + gas_price, + gas_used, + status, + transaction_hash, + transaction_index.into(), + tx_info.r#type.unwrap_or_default(), + )) +} + type FetchGasPriceFn = Arc< dyn Fn(H256) -> Pin> + Send>> + Send + Sync, >; @@ -232,14 +298,8 @@ impl ReceiptExtractor { .inspect_err( |err| log::debug!(target: LOG_TARGET, "TransactionFeePaid not found in events for block {block_number}\n{err:?}") )?; - let transaction_hash = H256(keccak_256(&call.payload)); - let signed_tx = - TransactionSigned::decode(&call.payload).map_err(|_| ClientError::TxDecodingFailed)?; - let from = signed_tx.recover_eth_address().map_err(|_| { - log::error!(target: LOG_TARGET, "Failed to recover eth address from signed tx"); - ClientError::RecoverEthAddressFailed - })?; + let (signed_tx, transaction_hash, from) = decode_and_recover_tx(&call)?; let base_gas_price = (self.fetch_gas_price)(substrate_block.hash()).await?; let tx_info = @@ -278,33 +338,19 @@ impl ReceiptExtractor { }) .collect(); - let contract_address = if tx_info.to.is_none() { - Some(create1( - &from, - tx_info - .nonce - .unwrap_or_default() - .try_into() - .map_err(|_| ClientError::ConversionFailed)?, - )) - } else { - None - }; - - let receipt = ReceiptInfo::new( - eth_block_hash, - block_number, - contract_address, + let receipt = build_receipt_from_tx( + &signed_tx, + transaction_hash, from, - logs, - tx_info.to, gas_price, gas_used, success, - transaction_hash, - transaction_index.into(), - tx_info.r#type.unwrap_or_default(), - ); + logs, + eth_block_hash, + block_number, + transaction_index, + )?; + Ok((signed_tx, receipt)) } @@ -344,7 +390,7 @@ impl ReceiptExtractor { } /// Return the ETH extrinsics of the block grouped with reconstruction receipt info. - async fn get_block_extrinsics( + pub async fn get_block_extrinsics( &self, block: &SubstrateBlock, ) -> Result< diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index a102d72952509..9b1dcf2ef9f52 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -101,6 +101,29 @@ impl ReceiptProvider { Some((block_hash, transaction_index)) } + /// Fetch receipt metadata from the database for a specific transaction. + /// Returns (status, gas_used, gas_price) + async fn fetch_receipt_metadata(&self, transaction_hash: &H256) -> Option<(bool, U256, U256)> { + let transaction_hash = transaction_hash.as_ref(); + let result = query!( + r#" + SELECT status, gas_used, gas_price + FROM transaction_hashes + WHERE transaction_hash = $1 + "#, + transaction_hash + ) + .fetch_optional(&self.pool) + .await + .ok()??; + + let status = result.status != 0; + let gas_used = U256::from_big_endian(&result.gas_used); + let gas_price = U256::from_big_endian(&result.gas_price); + + Some((status, gas_used, gas_price)) + } + /// Insert a block mapping from Ethereum block hash to Substrate block hash. pub async fn insert_block_mapping( &self, @@ -278,12 +301,123 @@ impl ReceiptProvider { } } + /// Reconstruct receipts from the database when on-chain state has been pruned. + /// This method can work even when events and storage are unavailable. + pub async fn receipts_from_db( + &self, + block: &SubstrateBlock, + ) -> Result, ClientError> { + use crate::receipt_extractor::{build_receipt_from_tx, decode_and_recover_tx}; + + let substrate_block_hash = block.hash(); + let substrate_block_number = block.number() as u64; + let block_number: U256 = substrate_block_number.into(); + + // Get Ethereum block hash from DB mapping + let eth_block_hash = self + .get_ethereum_hash(&substrate_block_hash) + .await + .unwrap_or(substrate_block_hash); + + // Get extrinsics from block (this works even when state is pruned) + let ext_iter = self.receipt_extractor.get_block_extrinsics(block).await?; + + let mut receipts = Vec::new(); + + for (transaction_index, (_, call, _)) in ext_iter.enumerate() { + // Decode transaction and recover sender + let (signed_tx, transaction_hash, from) = decode_and_recover_tx(&call)?; + + // Query receipt metadata from DB + let (status, gas_used, gas_price) = + self.fetch_receipt_metadata(&transaction_hash).await.ok_or_else(|| { + log::warn!( + target: LOG_TARGET, + "Receipt metadata not found in DB for tx {transaction_hash:?}" + ); + ClientError::TxFeeNotFound + })?; + + // Query logs from DB + let block_hash_ref = substrate_block_hash.as_ref(); + let transaction_index_i32 = transaction_index as i32; + let logs_rows = query!( + r#" + SELECT log_index, address, transaction_hash, topic_0, topic_1, topic_2, topic_3, data + FROM logs + WHERE block_hash = $1 AND transaction_index = $2 + ORDER BY log_index ASC + "#, + block_hash_ref, + transaction_index_i32 + ) + .fetch_all(&self.pool) + .await?; + + let logs: Vec = logs_rows + .into_iter() + .map(|row| { + let topics = [row.topic_0, row.topic_1, row.topic_2, row.topic_3] + .iter() + .filter_map(|t| t.as_ref().map(|bytes| H256::from_slice(bytes))) + .collect(); + + Log { + address: H160::from_slice(&row.address), + block_hash: eth_block_hash, + block_number, + data: row.data.map(Bytes::from), + log_index: U256::from(row.log_index as u64), + topics, + transaction_hash, + transaction_index: transaction_index.into(), + removed: false, + } + }) + .collect(); + + // Build the receipt using the common helper + let receipt = build_receipt_from_tx( + &signed_tx, + transaction_hash, + from, + gas_price, + gas_used, + status, + logs, + eth_block_hash, + block_number, + transaction_index, + )?; + + receipts.push((signed_tx, receipt)); + } + + Ok(receipts) + } + /// Fetch receipts from the given block. + /// This method first attempts to extract receipts from on-chain data (events/storage). + /// If that fails (e.g., due to pruned state), it falls back to reconstructing receipts from the + /// database. pub async fn receipts_from_block( &self, block: &SubstrateBlock, ) -> Result, ClientError> { - self.receipt_extractor.extract_from_block(block).await + // Try on-chain extraction first + match self.receipt_extractor.extract_from_block(block).await { + Ok(receipts) => Ok(receipts), + Err(err) => { + log::debug!( + target: LOG_TARGET, + "On-chain receipt extraction failed for block #{} ({:?}), falling back to DB: {err:?}", + block.number(), + block.hash() + ); + // Fall back to DB reconstruction when state is pruned + self.receipts_from_db(block).await + }, + } } /// Extract and insert receipts from the given block. @@ -353,15 +487,26 @@ impl ReceiptProvider { for (_, receipt) in receipts { let transaction_hash: &[u8] = receipt.transaction_hash.as_ref(); let transaction_index = receipt.transaction_index.as_u32() as i32; + let status = receipt.status.unwrap_or_default().as_u32() as i32; + + // Serialize gas_used and gas_price as big-endian bytes + let gas_used = receipt.gas_used.to_big_endian(); + let gas_used_bytes = gas_used.as_ref(); + + let gas_price = receipt.effective_gas_price.to_big_endian(); + let gas_price_bytes = gas_price.as_ref(); query!( r#" - INSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index) - VALUES ($1, $2, $3) + INSERT OR REPLACE INTO transaction_hashes (transaction_hash, block_hash, transaction_index, status, gas_used, gas_price) + VALUES ($1, $2, $3, $4, $5, $6) "#, transaction_hash, block_hash_ref, - transaction_index + transaction_index, + status, + gas_used_bytes, + gas_price_bytes ) .execute(&self.pool) .await?; From e18c1a17d80ade08cc2cc55f9700c3829ab10612 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:11:27 +0200 Subject: [PATCH 47/53] revive/rpc: fix some debugs --- substrate/frame/revive/rpc/src/client.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/substrate/frame/revive/rpc/src/client.rs b/substrate/frame/revive/rpc/src/client.rs index 3d5ffe553b855..92e561148b86d 100644 --- a/substrate/frame/revive/rpc/src/client.rs +++ b/substrate/frame/revive/rpc/src/client.rs @@ -732,11 +732,12 @@ impl Client { block: Arc, hydrated_transactions: bool, ) -> Block { - log::trace!(target: LOG_TARGET, "Get Ethereum block for hash {:?}", block.hash()); + log::trace!(target: LOG_TARGET, "Get EVM block for hash {:?}", block.hash()); let storage_api = self.storage_api(block.hash()); let ethereum_block = storage_api.get_ethereum_block().await.inspect_err(|err| { - log::error!(target: LOG_TARGET, "Failed to get Ethereum block for hash {:?}: {err:?}", block.hash()); + log::warn!(target: LOG_TARGET, "Failed to get EVM block from storage for hash {:?}: {err:?}", block.hash()); + log::warn!(target: LOG_TARGET, "Will try to reconstruct the block from db"); }); // This could potentially fail under two circumstances: @@ -793,11 +794,11 @@ impl Client { AccumulateReceipt, EthereumBlockBuilder, InMemoryStorage, }; - log::trace!(target: LOG_TARGET, "Reconstructing Ethereum block for substrate block {:?}", block.hash()); + log::trace!(target: LOG_TARGET, "Reconstructing EVM block for substrate block {:?}", block.hash()); let timestamp = extract_block_timestamp(block).await.unwrap_or_default(); - let (_, gas_limit, block_author) = + let (expected_evm_block_hash, gas_limit, block_author) = self.receipt_provider.get_block_mapping(&block.hash()).await .unwrap_or_else(|| { log::warn!(target: LOG_TARGET, "No mapping found for substrate block {:?}, restoring defaults", block.hash()); @@ -849,6 +850,12 @@ impl Client { gas_limit, ); + // Sanity check + let evm_block_hash = evm_block.header_hash(); + if expected_evm_block_hash != evm_block_hash { + log::warn!(target: LOG_TARGET, "Reconstructed EVM block hash mismatch hash: {evm_block_hash:} != {expected_evm_block_hash:?}"); + } + // Optionally hydrate with full transaction info if hydrated_transactions { evm_block.transactions = signed_txs From fde452ec6034d91286489d236eb231e1d2f3b9e0 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Thu, 2 Oct 2025 20:14:48 +0200 Subject: [PATCH 48/53] revive/rpc: further cleanup --- ...fb00315b5d17dfe1e8d261df08f71e54e70a.json} | 4 +- .../frame/revive/rpc/src/receipt_provider.rs | 221 +++++++++--------- 2 files changed, 118 insertions(+), 107 deletions(-) rename substrate/frame/revive/rpc/.sqlx/{query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json => query-30ae7176a84f6402b1a43037d3c9fb00315b5d17dfe1e8d261df08f71e54e70a.json} (76%) diff --git a/substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json b/substrate/frame/revive/rpc/.sqlx/query-30ae7176a84f6402b1a43037d3c9fb00315b5d17dfe1e8d261df08f71e54e70a.json similarity index 76% rename from substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json rename to substrate/frame/revive/rpc/.sqlx/query-30ae7176a84f6402b1a43037d3c9fb00315b5d17dfe1e8d261df08f71e54e70a.json index a4ba76e5fd033..1f324777abf14 100644 --- a/substrate/frame/revive/rpc/.sqlx/query-ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c.json +++ b/substrate/frame/revive/rpc/.sqlx/query-30ae7176a84f6402b1a43037d3c9fb00315b5d17dfe1e8d261df08f71e54e70a.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n\t\t\t\tSELECT log_index, address, transaction_hash, topic_0, topic_1, topic_2, topic_3, data\n\t\t\t\tFROM logs\n\t\t\t\tWHERE block_hash = $1 AND transaction_index = $2\n\t\t\t\tORDER BY log_index ASC\n\t\t\t\t", + "query": "\n\t\t\tSELECT log_index, address, transaction_hash, topic_0, topic_1, topic_2, topic_3, data\n\t\t\tFROM logs\n\t\t\tWHERE block_hash = $1 AND transaction_index = $2\n\t\t\tORDER BY log_index ASC\n\t\t\t", "describe": { "columns": [ { @@ -58,5 +58,5 @@ true ] }, - "hash": "ef3f837bd2088904f6e4c258a32512b1d39982bade66f588600c4a3816eb426c" + "hash": "30ae7176a84f6402b1a43037d3c9fb00315b5d17dfe1e8d261df08f71e54e70a" } diff --git a/substrate/frame/revive/rpc/src/receipt_provider.rs b/substrate/frame/revive/rpc/src/receipt_provider.rs index 9b1dcf2ef9f52..84a763b2345c7 100644 --- a/substrate/frame/revive/rpc/src/receipt_provider.rs +++ b/substrate/frame/revive/rpc/src/receipt_provider.rs @@ -16,6 +16,7 @@ // limitations under the License. use crate::{ client::{SubstrateBlock, SubstrateBlockNumber}, + receipt_extractor::{build_receipt_from_tx, decode_and_recover_tx}, Address, AddressOrAddresses, BlockInfoProvider, BlockNumberOrTag, BlockTag, Bytes, ClientError, FilterTopic, ReceiptExtractor, SubxtBlockInfoProvider, }; @@ -301,14 +302,14 @@ impl ReceiptProvider { } } - /// Reconstruct receipts from the database when on-chain state has been pruned. + /// Reconstruct a single receipt from the database by transaction index. /// This method can work even when events and storage are unavailable. - pub async fn receipts_from_db( + async fn receipt_from_db_by_index( &self, block: &SubstrateBlock, - ) -> Result, ClientError> { - use crate::receipt_extractor::{build_receipt_from_tx, decode_and_recover_tx}; - + transaction_index: usize, + call: &crate::subxt_client::revive::calls::types::EthTransact, + ) -> Result<(TransactionSigned, ReceiptInfo), ClientError> { let substrate_block_hash = block.hash(); let substrate_block_number = block.number() as u64; let block_number: U256 = substrate_block_number.into(); @@ -319,78 +320,88 @@ impl ReceiptProvider { .await .unwrap_or(substrate_block_hash); + // Decode transaction and recover sender + let (signed_tx, transaction_hash, from) = decode_and_recover_tx(call)?; + + // Query receipt metadata from DB + let (status, gas_used, gas_price) = + self.fetch_receipt_metadata(&transaction_hash).await.ok_or_else(|| { + log::warn!( + target: LOG_TARGET, + "Receipt metadata not found in DB for tx {transaction_hash:?}" + ); + ClientError::TxFeeNotFound + })?; + + // Query logs from DB + let block_hash_ref = substrate_block_hash.as_ref(); + let transaction_index_i32 = transaction_index as i32; + let logs_rows = query!( + r#" + SELECT log_index, address, transaction_hash, topic_0, topic_1, topic_2, topic_3, data + FROM logs + WHERE block_hash = $1 AND transaction_index = $2 + ORDER BY log_index ASC + "#, + block_hash_ref, + transaction_index_i32 + ) + .fetch_all(&self.pool) + .await?; + + let logs: Vec = logs_rows + .into_iter() + .map(|row| { + let topics = [row.topic_0, row.topic_1, row.topic_2, row.topic_3] + .iter() + .filter_map(|t| t.as_ref().map(|bytes| H256::from_slice(bytes))) + .collect(); + + Log { + address: H160::from_slice(&row.address), + block_hash: eth_block_hash, + block_number, + data: row.data.map(Bytes::from), + log_index: U256::from(row.log_index as u64), + topics, + transaction_hash, + transaction_index: transaction_index.into(), + removed: false, + } + }) + .collect(); + + // Build the receipt using the common helper + let receipt = build_receipt_from_tx( + &signed_tx, + transaction_hash, + from, + gas_price, + gas_used, + status, + logs, + eth_block_hash, + block_number, + transaction_index, + )?; + + Ok((signed_tx, receipt)) + } + + /// Reconstruct receipts from the database when on-chain state has been pruned. + /// This method can work even when events and storage are unavailable. + pub async fn receipts_from_db( + &self, + block: &SubstrateBlock, + ) -> Result, ClientError> { // Get extrinsics from block (this works even when state is pruned) let ext_iter = self.receipt_extractor.get_block_extrinsics(block).await?; let mut receipts = Vec::new(); for (transaction_index, (_, call, _)) in ext_iter.enumerate() { - // Decode transaction and recover sender - let (signed_tx, transaction_hash, from) = decode_and_recover_tx(&call)?; - - // Query receipt metadata from DB - let (status, gas_used, gas_price) = - self.fetch_receipt_metadata(&transaction_hash).await.ok_or_else(|| { - log::warn!( - target: LOG_TARGET, - "Receipt metadata not found in DB for tx {transaction_hash:?}" - ); - ClientError::TxFeeNotFound - })?; - - // Query logs from DB - let block_hash_ref = substrate_block_hash.as_ref(); - let transaction_index_i32 = transaction_index as i32; - let logs_rows = query!( - r#" - SELECT log_index, address, transaction_hash, topic_0, topic_1, topic_2, topic_3, data - FROM logs - WHERE block_hash = $1 AND transaction_index = $2 - ORDER BY log_index ASC - "#, - block_hash_ref, - transaction_index_i32 - ) - .fetch_all(&self.pool) - .await?; - - let logs: Vec = logs_rows - .into_iter() - .map(|row| { - let topics = [row.topic_0, row.topic_1, row.topic_2, row.topic_3] - .iter() - .filter_map(|t| t.as_ref().map(|bytes| H256::from_slice(bytes))) - .collect(); - - Log { - address: H160::from_slice(&row.address), - block_hash: eth_block_hash, - block_number, - data: row.data.map(Bytes::from), - log_index: U256::from(row.log_index as u64), - topics, - transaction_hash, - transaction_index: transaction_index.into(), - removed: false, - } - }) - .collect(); - - // Build the receipt using the common helper - let receipt = build_receipt_from_tx( - &signed_tx, - transaction_hash, - from, - gas_price, - gas_used, - status, - logs, - eth_block_hash, - block_number, - transaction_index, - )?; - - receipts.push((signed_tx, receipt)); + let receipt = self.receipt_from_db_by_index(block, transaction_index, &call).await?; + receipts.push(receipt); } Ok(receipts) @@ -758,58 +769,58 @@ impl ReceiptProvider { Some(rows.into_iter().collect()) } + /// Get the signed transaction and receipt for the given block hash and transaction index. + /// This method first attempts to extract the receipt from on-chain data (events/storage). + /// If that fails (e.g., due to pruned state), it falls back to reconstructing from the + /// database. + async fn signed_tx_and_receipt_by_block_hash_and_index( + &self, + block_hash: &H256, + transaction_index: usize, + ) -> Option<(TransactionSigned, ReceiptInfo)> { + let block = self.block_provider.block_by_hash(block_hash).await.ok()??; + + // Try on-chain extraction first + match self.receipt_extractor.extract_from_transaction(&block, transaction_index).await { + Ok((tx, receipt)) => Some((tx, receipt)), + Err(err) => { + log::debug!( + target: LOG_TARGET, + "On-chain receipt extraction failed for block {block_hash:?} tx index {transaction_index}, falling back to DB: {err:?}" + ); + + // Fall back to DB reconstruction + let ext_iter = self.receipt_extractor.get_block_extrinsics(&block).await.ok()?; + let (_, call, _) = ext_iter.into_iter().nth(transaction_index)?; + self.receipt_from_db_by_index(&block, transaction_index, &call).await.ok() + }, + } + } + /// Get the receipt for the given block hash and transaction index. pub async fn receipt_by_block_hash_and_index( &self, block_hash: &H256, transaction_index: usize, ) -> Option { - let block = self.block_provider.block_by_hash(block_hash).await.ok()??; let (_, receipt) = self - .receipt_extractor - .extract_from_transaction(&block, transaction_index) - .await - .ok()?; + .signed_tx_and_receipt_by_block_hash_and_index(block_hash, transaction_index) + .await?; Some(receipt) } /// Get the receipt for the given transaction hash. pub async fn receipt_by_hash(&self, transaction_hash: &H256) -> Option { let (block_hash, transaction_index) = self.fetch_row(transaction_hash).await?; - - let block = self.block_provider.block_by_hash(&block_hash).await.ok()??; - let (_, receipt) = self - .receipt_extractor - .extract_from_transaction(&block, transaction_index) - .await - .ok()?; - Some(receipt) + self.receipt_by_block_hash_and_index(&block_hash, transaction_index).await } /// Get the signed transaction for the given transaction hash. pub async fn signed_tx_by_hash(&self, transaction_hash: &H256) -> Option { - let transaction_hash = transaction_hash.as_ref(); - let result = query!( - r#" - SELECT block_hash, transaction_index - FROM transaction_hashes - WHERE transaction_hash = $1 - "#, - transaction_hash - ) - .fetch_optional(&self.pool) - .await - .ok()??; - - let block_hash = H256::from_slice(&result.block_hash[..]); - let transaction_index = result.transaction_index.try_into().ok()?; - - let block = self.block_provider.block_by_hash(&block_hash).await.ok()??; + let (block_hash, transaction_index) = self.fetch_row(transaction_hash).await?; let (signed_tx, _) = self - .receipt_extractor - .extract_from_transaction(&block, transaction_index) - .await - .ok()?; + .signed_tx_and_receipt_by_block_hash_and_index(&block_hash, transaction_index) + .await?; Some(signed_tx) } } From 16b61f455fd94289ddf27c14a5949d397cae6885 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Fri, 3 Oct 2025 10:20:40 +0200 Subject: [PATCH 49/53] revive/rpc: custom deserializer for TransactionInfo This is to workaround serde's limitation with flatten and untagged enums --- substrate/frame/revive/Cargo.toml | 1 + .../frame/revive/src/evm/api/rpc_types_gen.rs | 116 +++++++++++++++++- 2 files changed, 114 insertions(+), 3 deletions(-) diff --git a/substrate/frame/revive/Cargo.toml b/substrate/frame/revive/Cargo.toml index 9dd6833c98694..4bd56bc584613 100644 --- a/substrate/frame/revive/Cargo.toml +++ b/substrate/frame/revive/Cargo.toml @@ -42,6 +42,7 @@ revm = { workspace = true } rlp = { workspace = true } scale-info = { features = ["derive"], workspace = true } serde = { features = ["alloc", "derive"], workspace = true, default-features = false } +serde_json = { features = ["alloc"], workspace = true, default-features = false } # Polkadot SDK Dependencies bn = { workspace = true } diff --git a/substrate/frame/revive/src/evm/api/rpc_types_gen.rs b/substrate/frame/revive/src/evm/api/rpc_types_gen.rs index 2efe8695e148b..cc8f27c32744b 100644 --- a/substrate/frame/revive/src/evm/api/rpc_types_gen.rs +++ b/substrate/frame/revive/src/evm/api/rpc_types_gen.rs @@ -386,9 +386,7 @@ impl Default for SyncingStatus { } /// Transaction information -#[derive( - Debug, Default, Clone, Serialize, Deserialize, Eq, PartialEq, TypeInfo, Encode, Decode, -)] +#[derive(Debug, Default, Clone, Serialize, Eq, PartialEq, TypeInfo, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct TransactionInfo { /// block hash @@ -405,6 +403,50 @@ pub struct TransactionInfo { pub transaction_signed: TransactionSigned, } +// Custom deserializer to work around serde's limitation with flatten + untagged enums from Value +// See: https://github.com/serde-rs/serde/issues/1183 +impl<'de> Deserialize<'de> for TransactionInfo { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + use alloc::{collections::BTreeMap, string::String}; + use serde::de::Error; + + // First try deserializing to a map + let mut map = >::deserialize(deserializer)?; + + // Extract the TransactionInfo-specific fields + let block_hash = + map.remove("blockHash").ok_or_else(|| D::Error::missing_field("blockHash"))?; + let block_number = map + .remove("blockNumber") + .ok_or_else(|| D::Error::missing_field("blockNumber"))?; + let from = map.remove("from").ok_or_else(|| D::Error::missing_field("from"))?; + let hash = map.remove("hash").ok_or_else(|| D::Error::missing_field("hash"))?; + let transaction_index = map + .remove("transactionIndex") + .ok_or_else(|| D::Error::missing_field("transactionIndex"))?; + + // The remaining fields should be for TransactionSigned + // Convert back to JSON and deserialize + let remaining = serde_json::Value::Object(map.into_iter().collect()); + let json_str = serde_json::to_string(&remaining).map_err(D::Error::custom)?; + let transaction_signed: TransactionSigned = + serde_json::from_str(&json_str).map_err(D::Error::custom)?; + + Ok(Self { + block_hash: serde_json::from_value(block_hash).map_err(D::Error::custom)?, + block_number: serde_json::from_value(block_number).map_err(D::Error::custom)?, + from: serde_json::from_value(from).map_err(D::Error::custom)?, + hash: serde_json::from_value(hash).map_err(D::Error::custom)?, + transaction_index: serde_json::from_value(transaction_index) + .map_err(D::Error::custom)?, + transaction_signed, + }) + } +} + #[derive(Debug, Clone, Serialize, Deserialize, From, TryInto, Eq, PartialEq)] #[serde(untagged)] pub enum TransactionUnsigned { @@ -1037,6 +1079,7 @@ pub struct Transaction4844Signed { Decode, DecodeWithMemTracking, )] +#[serde(rename_all = "camelCase")] pub struct TransactionLegacySigned { #[serde(flatten)] pub transaction_legacy_unsigned: TransactionLegacyUnsigned, @@ -1078,6 +1121,73 @@ pub struct FeeHistoryResult { mod tests { use super::*; + #[test] + fn test_transaction_info_deserialize_from_value() { + // This tests the custom deserializer for TransactionInfo + // which works around serde's limitation with flatten + untagged enums from Value + let tx_info_expected = serde_json::json!({ + "blockHash": "0xfb8c980d1da1a75e68c2ea4d55cb88d62dedbbb5eaf69df8fe337e9f6922b73a", + "blockNumber": "0x161bd0f", + "from": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97", + "hash": "0x2c522d01183e9ed70caaf75c940ba9908d573cfc9996b3e7adc90313798279c8", + "transactionIndex": "0x7a", + "chainId": "0x1", + "gas": "0x565f", + "gasPrice": "0x23cf3fd4", + "input": "0x", + "nonce": "0x2c5ce1", + "r": "0x4a5703e4d8daf045f021cb32897a25b17d61b9ab629a59f0731ef4cce63f93d6", + "s": "0x711812237c1fed6aaf08e9f47fc47e547fdaceba9ab7507e62af29a945354fb6", + "to": "0x388c818ca8b9251b393131c08a736a67ccb19297", + "type": "0x0", + "v": "0x1", + "value": "0x12bf92aae0c2e70" + }); + + // Test deserializing from Value (this was failing before the custom deserializer) with + // below error: + // ``` + // Failed to deserialize from Value: Some(Error("data did not match any variant of untagged enum TransactionSigned", line: 0, column: 0)) + // ``` + let tx_info_from_value: Result = + serde_json::from_value(tx_info_expected.clone()); + assert!( + tx_info_from_value.is_ok(), + "Failed to deserialize from Value: {:?}", + tx_info_from_value.err() + ); + + // Test deserializing from string (this was always working) + let json_str = serde_json::to_string(&tx_info_expected).unwrap(); + let tx_info_from_str: Result = + serde_json::from_str(&json_str); + assert!( + tx_info_from_str.is_ok(), + "Failed to deserialize from string: {:?}", + tx_info_from_str.err() + ); + + // Verify both methods produce the same result + let tx_info_from_value = tx_info_from_value.unwrap(); + let tx_info_from_str = tx_info_from_str.unwrap(); + assert_eq!( + tx_info_from_value, tx_info_from_str, + "Value and string deserialization should match" + ); + + // Serialize it back to JSON + let tx_info_serialized = serde_json::to_value(&tx_info_from_value); + assert!( + tx_info_serialized.is_ok(), + "Failed to serialize to value: {:?}", + tx_info_serialized.err() + ); + let tx_info_serialized = tx_info_serialized.unwrap(); + + // Verify that deserializing and serializing leads to the same result + assert_eq!(tx_info_serialized, tx_info_expected); + } + #[test] fn test_block_serialization_roundtrip() { let json_input = r#"{ From e1ca942eef461e4e2c19d69b3a09558b280ea4e4 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:20:53 +0200 Subject: [PATCH 50/53] revive/rpc: tests improvements This is to workaround serde's limitation with flatten and untagged enums --- substrate/frame/revive/rpc/src/tests.rs | 212 ++++++++++++++---------- 1 file changed, 128 insertions(+), 84 deletions(-) diff --git a/substrate/frame/revive/rpc/src/tests.rs b/substrate/frame/revive/rpc/src/tests.rs index 480c675dc7c88..b4d82203212a4 100644 --- a/substrate/frame/revive/rpc/src/tests.rs +++ b/substrate/frame/revive/rpc/src/tests.rs @@ -21,15 +21,16 @@ use crate::{ cli::{self, CliCommand}, example::TransactionBuilder, - subxt_client, - subxt_client::{src_chain::runtime_types::pallet_revive::primitives::Code, SrcChainConfig}, + subxt_client::{ + self, src_chain::runtime_types::pallet_revive::primitives::Code, SrcChainConfig, + }, EthRpcClient, }; use clap::Parser; use jsonrpsee::ws_client::{WsClient, WsClientBuilder}; use pallet_revive::{ create1, - evm::{Account, BlockTag, U256}, + evm::{Account, BlockNumberOrTag, BlockTag, U256}, }; use static_init::dynamic; use std::{sync::Arc, thread}; @@ -53,30 +54,40 @@ async fn ws_client_with_retry(url: &str) -> WsClient { } struct SharedResources { + eth_rpc_port: u32, + node_rpc_port: u32, _node_handle: std::thread::JoinHandle<()>, _rpc_handle: std::thread::JoinHandle<()>, } impl SharedResources { - fn start() -> Self { - // Start the node. + fn start_advanced( + node_rpc_port: u32, + eth_rpc_port: u32, + node_extra_args: Vec<&'static str>, + ) -> Self { + let node_rpc_port_arg = format!("--rpc-port={node_rpc_port}"); let _node_handle = thread::spawn(move || { - if let Err(e) = start_node_inline(vec![ + let args = vec![ "--dev", - "--rpc-port=45789", + &node_rpc_port_arg, "--no-telemetry", "--no-prometheus", "-lerror,evm=debug,sc_rpc_server=info,runtime::revive=trace", - ]) { + ]; + let combined_args = [args, node_extra_args].concat(); + if let Err(e) = start_node_inline(combined_args) { panic!("Node exited with error: {e:?}"); } }); + let eth_rpc_port_arg = format!("--rpc-port={eth_rpc_port}"); + let node_rpc_url = format!("--node-rpc-url=ws://localhost:{node_rpc_port}"); // Start the rpc server. let args = CliCommand::parse_from([ "--dev", - "--rpc-port=45788", - "--node-rpc-url=ws://localhost:45789", + ð_rpc_port_arg, + &node_rpc_url, "--no-prometheus", "-linfo,eth-rpc=debug", ]); @@ -86,18 +97,36 @@ impl SharedResources { panic!("eth-rpc exited with error: {e:?}"); } }); + Self { eth_rpc_port, node_rpc_port, _node_handle, _rpc_handle } + } + + fn start() -> Self { + Self::start_advanced(45789, 45788, vec![]) + } - Self { _node_handle, _rpc_handle } + async fn client(&self) -> WsClient { + let url = format!("ws://localhost:{}", self.eth_rpc_port); + ws_client_with_retry(&url).await } - async fn client() -> WsClient { - ws_client_with_retry("ws://localhost:45788").await + async fn node_client(&self) -> OnlineClient { + let url = format!("ws://localhost:{}", self.node_rpc_port); + OnlineClient::::from_url(url) + .await + .expect("Failed to get online client") } } #[dynamic(lazy)] static mut SHARED_RESOURCES: SharedResources = SharedResources::start(); +// TODO maybe it is ok to run single shared resource for all tests? +// Setting state-pruning to low value, to not wait long for state pruning, which is required for +// some EVM reconstruction tests +#[dynamic(lazy)] +static mut SHARED_RESOURCES_ADVANCED: SharedResources = + SharedResources::start_advanced(55789, 55788, vec!["--state-pruning=8"]); + macro_rules! unwrap_call_err( ($err:expr) => { match $err.downcast_ref::().unwrap() { @@ -109,8 +138,8 @@ macro_rules! unwrap_call_err( #[tokio::test] async fn transfer() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = Arc::new(SharedResources::client().await); + let shared_resources = SHARED_RESOURCES.write(); + let client = Arc::new(shared_resources.client().await); let ethan = Account::from(subxt_signer::eth::dev::ethan()); let initial_balance = client.get_balance(ethan.address(), BlockTag::Latest.into()).await?; @@ -137,8 +166,8 @@ async fn transfer() -> anyhow::Result<()> { #[tokio::test] async fn deploy_and_call() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = std::sync::Arc::new(SharedResources::client().await); + let shared_resources = SHARED_RESOURCES.write(); + let client = Arc::new(shared_resources.client().await); let account = Account::default(); // Balance transfer @@ -203,7 +232,12 @@ async fn deploy_and_call() -> anyhow::Result<()> { ); let balance = client.get_balance(contract_address, BlockTag::Latest.into()).await?; - assert_eq!(Some(value), balance.checked_sub(initial_balance), "Contract {contract_address:?} Balance {balance} should have increased from {initial_balance} by {value}."); + assert_eq!( + Some(value), + balance.checked_sub(initial_balance), + "Contract {contract_address:?} +Balance {balance} should have increased from {initial_balance} by {value}." + ); // Balance transfer to contract let initial_balance = client.get_balance(contract_address, BlockTag::Latest.into()).await?; @@ -227,8 +261,8 @@ async fn deploy_and_call() -> anyhow::Result<()> { #[tokio::test] async fn runtime_api_dry_run_addr_works() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = std::sync::Arc::new(SharedResources::client().await); + let shared_resources = SHARED_RESOURCES.write(); + let client = Arc::new(shared_resources.client().await); let account = Account::default(); let origin: [u8; 32] = account.substrate_account().into(); @@ -258,8 +292,8 @@ async fn runtime_api_dry_run_addr_works() -> anyhow::Result<()> { #[tokio::test] async fn invalid_transaction() -> anyhow::Result<()> { - let _lock = SHARED_RESOURCES.write(); - let client = Arc::new(SharedResources::client().await); + let shared_resources = SHARED_RESOURCES.write(); + let client = Arc::new(shared_resources.client().await); let ethan = Account::from(subxt_signer::eth::dev::ethan()); let err = TransactionBuilder::new(&client) @@ -276,41 +310,50 @@ async fn invalid_transaction() -> anyhow::Result<()> { Ok(()) } +// Wait until state is pruned, it is assumed that initially a state is available +// at latest best block. +async fn wait_until_state_pruned(client: OnlineClient) -> anyhow::Result<()> { + let query = subxt_client::storage().revive().ethereum_block(); + let mut blocks = client.blocks().subscribe_best().await?; + + // Get current best block + let block_hash = if let Some(Ok(block)) = blocks.next().await { + block.hash() + } else { + return Err(anyhow::anyhow!("Failed to fetch next block")); + }; + let storage = client.storage().at(block_hash); + + // Inspect storage at best block we got until state is pruned + loop { + match blocks.next().await { + Some(Ok(block)) => { + println!("block current = {:?} {:?} ", block.number(), block.hash()); + // Break only on when state discarded error message appears + match storage.fetch(&query).await { + Ok(_) => { + // State still available, continue waiting + }, + Err(err) if format!("{:?}", err).contains("State already discarded") => { + println!("storage pruned: {:?}", err); + return Ok(()); + }, + Err(err) => { + return Err(anyhow::anyhow!("Error fetching storage: {:?}", err)); + }, + } + }, + Some(Err(e)) => return Err(anyhow::anyhow!("Error subscribing to blocks: {:?}", e)), + None => return Err(anyhow::anyhow!("Block subscription ended unexpectedly")), + } + } +} + #[tokio::test] async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { - use pallet_revive::evm::BlockNumberOrTag; - - // Start nodes with state pruning enabled - // let _node_handle = thread::spawn(move || { - // if let Err(e) = start_node_inline(vec![ - // "--dev", - // "--rpc-port=45791", - // "--no-telemetry", - // "--no-prometheus", - // "--state-pruning=16", - // "-lerror,evm=debug,sc_rpc_server=info,runtime::revive=trace", - // ]) { - // panic!("Node exited with error: {e:?}"); - // } - // }); - - // let args = CliCommand::parse_from([ - // "--dev", - // "--rpc-port=45790", - // "--node-rpc-url=ws://localhost:45791", - // "--no-prometheus", - // "-linfo,eth-rpc=debug", - // ]); - - // let _rpc_handle = thread::spawn(move || { - // if let Err(e) = cli::run(args) { - // panic!("eth-rpc exited with error: {e:?}"); - // } - // }); - - // let client = Arc::new(ws_client_with_retry("ws://localhost:45790").await); - let client = Arc::new(ws_client_with_retry("ws://localhost:8545").await); - let account = Account::default(); + // let client = Arc::new(ws_client_with_retry("ws://localhost:8545").await); + let shared_resources = SHARED_RESOURCES_ADVANCED.write(); + let client = Arc::new(shared_resources.client().await); // Deploy a contract to have some interesting blocks let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; @@ -323,48 +366,49 @@ async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { let receipt = tx.wait_for_receipt().await?; let block_number = receipt.block_number; + let block_hash = receipt.block_hash; println!("block_number = {block_number:?}"); + println!("tx hash = {:?}", tx.hash()); - // Fetch the block immediately (should come from storage via get_ethereum_block) - let storage_block = client - .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), false) + // Fetch the block immediately (should come from storage EthereumBlock) + let storage_block_by_number = client + .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), true) .await? .expect("Block should exist"); + let storage_block_by_hash = + client.get_block_by_hash(block_hash, true).await?.expect("Block should exist"); - println!("storage block = {storage_block:?}"); - - // Wait for state pruning (16 blocks + buffer) - let target_block = block_number + U256::from(20); - loop { - let current = client.block_number().await?; - - println!("block current = {current:?} target = {target_block:?}"); - if current >= target_block { - break; - } + // All storage blocks must match + assert_eq!( + storage_block_by_number, storage_block_by_hash, + "Storage blocks by number and hash should match" + ); - // Submit a dummy transaction to produce new blocks - let _ = TransactionBuilder::new(&client) - .value(U256::from(1_000_000u128)) - .to(account.address()) - .send() - .await? - .wait_for_receipt() - .await?; - } + // Wait for state pruning (8 blocks + buffer) + // wait_until_block(&client, block_number + U256::from(10)).await?; + wait_until_state_pruned(shared_resources.node_client().await).await?; - // Fetch the same block again (should use evm_block_from_receipts reconstruction) - let reconstructed_block = client - .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), false) + // Fetch the same block again - it should be reconstructed now + let reconstructed_block_number = client + .get_block_by_number(BlockNumberOrTag::U256(block_number.into()), true) .await? .expect("Block should still exist"); - println!("reconstructed block = {reconstructed_block:?}"); + let reconstructed_block_by_hash = + client.get_block_by_hash(block_hash, true).await?.expect("Block should exist"); - // Compare the entire blocks + // All reconstructed blocks must match assert_eq!( - storage_block, reconstructed_block, + reconstructed_block_number, reconstructed_block_by_hash, + "Reconstructed blocks by number and hash should match" + ); + + // Reconstructed and storage blocks must matchs + assert_eq!( + storage_block_by_number, reconstructed_block_number, "Reconstructed block should match storage block exactly" ); + Ok(()) +} Ok(()) } From be058ef1488c08ab16ab9ec0822f018309dfea80 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:21:32 +0200 Subject: [PATCH 51/53] revive/rpc: EVM tx reconstruction tests This is to workaround serde's limitation with flatten and untagged enums --- substrate/frame/revive/rpc/src/tests.rs | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/substrate/frame/revive/rpc/src/tests.rs b/substrate/frame/revive/rpc/src/tests.rs index b4d82203212a4..785b1938261a5 100644 --- a/substrate/frame/revive/rpc/src/tests.rs +++ b/substrate/frame/revive/rpc/src/tests.rs @@ -410,5 +410,88 @@ async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { Ok(()) } +#[tokio::test] +async fn reconstructed_tx_matches_storage_tx() -> anyhow::Result<()> { + // let client = Arc::new(ws_client_with_retry("ws://localhost:45790").await); + // let client = Arc::new(ws_client_with_retry("ws://localhost:8545").await); + let shared_resources = SHARED_RESOURCES_ADVANCED.write(); + let client = Arc::new(shared_resources.client().await); + + // Deploy a contract to have some interesting blocks + let (bytes, _) = pallet_revive_fixtures::compile_module("dummy")?; + let value = U256::from(5_000_000_000_000u128); + let tx = TransactionBuilder::new(&client) + .value(value) + .input(bytes.to_vec()) + .send() + .await?; + + let receipt = tx.wait_for_receipt().await?; + let block_number = receipt.block_number; + let block_hash = receipt.block_hash; + let tx_id = U256::from(0); + println!("block_number = {block_number:?}"); + println!("tx hash = {:?}", tx.hash()); + + // Fetch the tx immediately (should come from storage EthereumBlock) + let storage_tx_by_tx_hash = + client.get_transaction_by_hash(tx.hash()).await?.expect("Tx should exist"); + let storage_tx_by_block_hash_and_tx_id = client + .get_transaction_by_block_hash_and_index(block_hash, tx_id) + .await? + .expect("Tx should exist"); + let storage_tx_by_block_number_and_tx_id = client + .get_transaction_by_block_number_and_index( + BlockNumberOrTag::U256(block_number.into()), + tx_id, + ) + .await? + .expect("Tx should exist"); + + // All storage txs must match + assert_eq!( + storage_tx_by_tx_hash, storage_tx_by_block_hash_and_tx_id, + "Storage txs by hash and block hash and tx id should match" + ); + assert_eq!( + storage_tx_by_tx_hash, storage_tx_by_block_number_and_tx_id, + "Storage txs by hash and block number and tx id should match" + ); + + // Wait for state pruning (8 blocks + buffer) + // wait_until_block(&client, block_number + U256::from(10)).await?; + wait_until_state_pruned(shared_resources.node_client().await).await?; + + // Fetch the same tx again - it should be reconstructed now + let reconstructed_tx_by_tx_hash = + client.get_transaction_by_hash(tx.hash()).await?.expect("Tx should exist"); + let reconstructed_tx_by_block_hash_and_tx_id = client + .get_transaction_by_block_hash_and_index(block_hash, tx_id) + .await? + .expect("Tx should exist"); + let reconstructed_tx_by_block_number_and_tx_id = client + .get_transaction_by_block_number_and_index( + BlockNumberOrTag::U256(block_number.into()), + tx_id, + ) + .await? + .expect("Tx should exist"); + + // All reconstructed txs must match + assert_eq!( + reconstructed_tx_by_tx_hash, reconstructed_tx_by_block_hash_and_tx_id, + "Reconstructed txs by hash and block hash and tx id should match" + ); + assert_eq!( + reconstructed_tx_by_tx_hash, reconstructed_tx_by_block_number_and_tx_id, + "Storage txs by hash and block number and tx id should match" + ); + + // Reconstructed and storage txs must matchs + assert_eq!( + storage_tx_by_tx_hash, reconstructed_tx_by_tx_hash, + "Reconstructed tx should match storage tx exactly" + ); + Ok(()) } From e72a5192d993a19aafd2a3deda476764c71250c2 Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:22:42 +0200 Subject: [PATCH 52/53] fmt --- substrate/frame/revive/src/benchmarking.rs | 6 +++--- substrate/frame/revive/src/evm/block_storage.rs | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/substrate/frame/revive/src/benchmarking.rs b/substrate/frame/revive/src/benchmarking.rs index 68a8ab5e3a83a..519473a52a133 100644 --- a/substrate/frame/revive/src/benchmarking.rs +++ b/substrate/frame/revive/src/benchmarking.rs @@ -2724,9 +2724,9 @@ mod benchmarks { let block_builder_ir = EthBlockBuilderIR::::get(); let mut block_builder = EthereumBlockBuilder::from_ir_with_storage( - block_builder_ir, - PalletStorage::::new(), - ); + block_builder_ir, + PalletStorage::::new(), + ); block_builder.process_transaction( signed_transaction, diff --git a/substrate/frame/revive/src/evm/block_storage.rs b/substrate/frame/revive/src/evm/block_storage.rs index 3a379dec4bace..6d68bb54eb63b 100644 --- a/substrate/frame/revive/src/evm/block_storage.rs +++ b/substrate/frame/revive/src/evm/block_storage.rs @@ -88,11 +88,9 @@ pub fn on_finalize_build_eth_block( EthBlockBuilderIR::::kill(); // Load the first values if not already loaded. - let (block, receipt_data) = EthereumBlockBuilder::from_ir_with_storage( - block_builder_ir, - PalletStorage::::new(), - ) - .build(eth_block_num, parent_hash, timestamp, block_author, gas_limit); + let (block, receipt_data) = + EthereumBlockBuilder::from_ir_with_storage(block_builder_ir, PalletStorage::::new()) + .build(eth_block_num, parent_hash, timestamp, block_author, gas_limit); // Put the block hash into storage. BlockHash::::insert(eth_block_num, block.hash); From a400f7b1237ccd0aab10586fe9307f2dab00f35a Mon Sep 17 00:00:00 2001 From: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> Date: Sat, 4 Oct 2025 00:27:30 +0200 Subject: [PATCH 53/53] cleanup --- substrate/frame/revive/rpc/src/tests.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/substrate/frame/revive/rpc/src/tests.rs b/substrate/frame/revive/rpc/src/tests.rs index 785b1938261a5..a68a9b1ed8e35 100644 --- a/substrate/frame/revive/rpc/src/tests.rs +++ b/substrate/frame/revive/rpc/src/tests.rs @@ -124,7 +124,7 @@ static mut SHARED_RESOURCES: SharedResources = SharedResources::start(); // Setting state-pruning to low value, to not wait long for state pruning, which is required for // some EVM reconstruction tests #[dynamic(lazy)] -static mut SHARED_RESOURCES_ADVANCED: SharedResources = +static mut SHARED_RESOURCES_QUICK_PRUNE: SharedResources = SharedResources::start_advanced(55789, 55788, vec!["--state-pruning=8"]); macro_rules! unwrap_call_err( @@ -351,8 +351,7 @@ async fn wait_until_state_pruned(client: OnlineClient) -> anyhow #[tokio::test] async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { - // let client = Arc::new(ws_client_with_retry("ws://localhost:8545").await); - let shared_resources = SHARED_RESOURCES_ADVANCED.write(); + let shared_resources = SHARED_RESOURCES_QUICK_PRUNE.write(); let client = Arc::new(shared_resources.client().await); // Deploy a contract to have some interesting blocks @@ -384,8 +383,6 @@ async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { "Storage blocks by number and hash should match" ); - // Wait for state pruning (8 blocks + buffer) - // wait_until_block(&client, block_number + U256::from(10)).await?; wait_until_state_pruned(shared_resources.node_client().await).await?; // Fetch the same block again - it should be reconstructed now @@ -412,9 +409,7 @@ async fn reconstructed_block_matches_storage_block() -> anyhow::Result<()> { #[tokio::test] async fn reconstructed_tx_matches_storage_tx() -> anyhow::Result<()> { - // let client = Arc::new(ws_client_with_retry("ws://localhost:45790").await); - // let client = Arc::new(ws_client_with_retry("ws://localhost:8545").await); - let shared_resources = SHARED_RESOURCES_ADVANCED.write(); + let shared_resources = SHARED_RESOURCES_QUICK_PRUNE.write(); let client = Arc::new(shared_resources.client().await); // Deploy a contract to have some interesting blocks @@ -458,8 +453,6 @@ async fn reconstructed_tx_matches_storage_tx() -> anyhow::Result<()> { "Storage txs by hash and block number and tx id should match" ); - // Wait for state pruning (8 blocks + buffer) - // wait_until_block(&client, block_number + U256::from(10)).await?; wait_until_state_pruned(shared_resources.node_client().await).await?; // Fetch the same tx again - it should be reconstructed now