From 7816262e2ca07c905d5242c1a41a436dfb234b68 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Fri, 3 Oct 2025 07:48:52 +0200 Subject: [PATCH 1/7] XC-502: Update `ic-cdk` --- Cargo.lock | 57 +++++++--- Cargo.toml | 5 +- e2e/motoko/main.mo | 2 +- e2e/rust/src/main.rs | 56 +++++----- evm_rpc_client/src/fixtures/mod.rs | 8 +- evm_rpc_client/src/lib.rs | 3 +- evm_rpc_client/src/request/mod.rs | 6 +- evm_rpc_client/src/runtime/mod.rs | 51 +++------ evm_rpc_types/src/result/mod.rs | 13 +++ src/http.rs | 161 ++++++++++++++--------------- src/main.rs | 40 +++---- src/metrics.rs | 4 +- src/rpc_client/eth_rpc/mod.rs | 20 ++-- src/rpc_client/mod.rs | 16 +-- tests/mock_http_runtime/mod.rs | 50 ++++----- tests/setup/mod.rs | 20 ++-- tests/tests.rs | 88 ---------------- 17 files changed, 261 insertions(+), 339 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d5f8990..a80c740c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -856,8 +856,7 @@ dependencies = [ [[package]] name = "canhttp" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30b89e93857ec22d9b5f11b1647cdf9bb28c328e1d5ae871ecba2d94e38f8fb" +source = "git+https://github.com/dfinity/canhttp/?rev=0b935a2ba6defb0265bb94bbfb5c5675975531a3#0b935a2ba6defb0265bb94bbfb5c5675975531a3" dependencies = [ "assert_matches", "ciborium", @@ -866,6 +865,7 @@ dependencies = [ "http", "ic-cdk", "ic-error-types", + "ic-management-canister-types", "num-traits", "pin-project", "serde", @@ -885,7 +885,7 @@ dependencies = [ "candid", "canlog_derive", "ic-canister-log", - "ic0 1.0.1", + "ic0", "regex", "serde", "serde_json", @@ -1358,7 +1358,7 @@ dependencies = [ "evm_rpc_types", "ic-cdk", "ic-cdk-bindgen", - "ic-cdk-macros", + "ic-cdk-macros 0.17.2", "ic-certified-map", "serde", "serde_bytes", @@ -1560,7 +1560,6 @@ dependencies = [ "http", "ic-canister-log", "ic-cdk", - "ic-cdk-macros", "ic-crypto-test-utils-reproducible-rng", "ic-error-types", "ic-ethereum-types", @@ -2079,16 +2078,20 @@ dependencies = [ [[package]] name = "ic-cdk" -version = "0.17.2" +version = "0.18.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a7344f41493cbf591f13ae9f90181076f808a83af799815c3074b19c693d2e" +checksum = "4efb278f5d3ef033b3eed7f01f1096eaf67701896aa5ef69f5eddf5a84833dc0" dependencies = [ "candid", "ic-cdk-executor", - "ic-cdk-macros", - "ic0 0.23.0", + "ic-cdk-macros 0.18.7", + "ic-error-types", + "ic-management-canister-types", + "ic0", "serde", "serde_bytes", + "slotmap", + "thiserror 2.0.16", ] [[package]] @@ -2102,9 +2105,13 @@ dependencies = [ [[package]] name = "ic-cdk-executor" -version = "0.1.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903057edd3d4ff4b3fe44a64eaee1ceb73f579ba29e3ded372b63d291d7c16c2" +checksum = "99f4ee8930fd2e491177e2eb7fff53ee1c407c13b9582bdc7d6920cf83109a2d" +dependencies = [ + "ic0", + "slotmap", +] [[package]] name = "ic-cdk-macros" @@ -2120,6 +2127,19 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "ic-cdk-macros" +version = "0.18.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb14c5d691cc9d72bb95459b4761e3a4b3444b85a63d17555d5ddd782969a1e" +dependencies = [ + "candid", + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "ic-certification" version = "3.0.3" @@ -2266,12 +2286,6 @@ dependencies = [ "thiserror 2.0.16", ] -[[package]] -name = "ic0" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de254dd67bbd58073e23dc1c8553ba12fa1dc610a19de94ad2bbcd0460c067f" - [[package]] name = "ic0" version = "1.0.1" @@ -4173,6 +4187,15 @@ dependencies = [ "erased-serde", ] +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.15.1" diff --git a/Cargo.toml b/Cargo.toml index 54c608a0..9da5356a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,6 @@ ic-metrics-encoder = { workspace = true } ic-stable-structures = { workspace = true } ic-canister-log = { workspace = true } ic-cdk = { workspace = true } -ic-cdk-macros = { workspace = true } ic-management-canister-types = { workspace = true } maplit = { workspace = true } minicbor = { workspace = true } @@ -76,7 +75,7 @@ alloy-rpc-types = "1.0.23" assert_matches = "1.5.0" async-trait = "0.1.88" candid = { version = "0.10.13" } -canhttp = { version = "0.2.0", features = ["json", "multi"] } +canhttp = { git = "https://github.com/dfinity/canhttp/", features = ["json", "multi"], rev = "0b935a2ba6defb0265bb94bbfb5c5675975531a3" } canlog = { version = "0.2.0", features = ["derive"] } candid_parser = { version = "0.1.4" } derive_more = { version = "2.0.1", features = ["from", "into"] } @@ -86,7 +85,7 @@ getrandom = { version = "0.2", features = ["custom"] } hex = "0.4.3" http = "1.3.1" ic-canister-log = "0.2.0" -ic-cdk = "0.17.2" +ic-cdk = "0.18.7" ic-cdk-bindgen = "0.1" ic-cdk-macros = "0.17.2" ic-certified-map = "0.4" diff --git a/e2e/motoko/main.mo b/e2e/motoko/main.mo index caa184b3..5672e8e5 100644 --- a/e2e/motoko/main.mo +++ b/e2e/motoko/main.mo @@ -14,7 +14,7 @@ shared ({ caller = installer }) persistent actor class Main() { // (`subnet name`, `nodes in subnet`, `expected cycles for JSON-RPC call`) type SubnetTarget = (Text, Nat32, Nat); - transient let fiduciarySubnet : SubnetTarget = ("fiduciary", 34, 540_545_600); + transient let fiduciarySubnet : SubnetTarget = ("fiduciary", 34, 400_299_200); transient let testTargets = [ // (`canister module`, `canister type`, `subnet`) diff --git a/e2e/rust/src/main.rs b/e2e/rust/src/main.rs index 2ad2cb1a..608e5f21 100644 --- a/e2e/rust/src/main.rs +++ b/e2e/rust/src/main.rs @@ -1,12 +1,10 @@ -use std::str::FromStr; - use candid::{candid_method, Principal}; -use ic_cdk_macros::update; - use evm_rpc_types::{ Block, BlockTag, ConsensusStrategy, EthMainnetService, Hex32, MultiRpcResult, ProviderError, RpcConfig, RpcError, RpcResult, RpcService, RpcServices, }; +use ic_cdk::{call::Call, update}; +use std::str::FromStr; fn main() {} @@ -21,7 +19,7 @@ const CANISTER_ID: Option<&str> = None; #[update] #[candid_method(update)] pub async fn test() { - assert!(ic_cdk::api::is_controller(&ic_cdk::caller())); + assert!(ic_cdk::api::is_controller(&ic_cdk::api::msg_caller())); let canister_id = Principal::from_str(CANISTER_ID.unwrap()) .expect("Error parsing canister ID environment variable"); @@ -34,18 +32,22 @@ pub async fn test() { ); // Get cycles cost - let (cycles_result,): (Result,) = - ic_cdk::api::call::call(canister_id, "requestCost", params.clone()) - .await - .unwrap(); + let cycles_result = Call::unbounded_wait(canister_id, "requestCost") + .with_args(¶ms) + .await + .unwrap() + .candid::>() + .unwrap(); let cycles = cycles_result .unwrap_or_else(|e| ic_cdk::trap(&format!("error in `request_cost`: {:?}", e))); // Call without sending cycles - let (result_without_cycles,): (Result,) = - ic_cdk::api::call::call(canister_id, "request", params.clone()) - .await - .unwrap(); + let result_without_cycles = Call::unbounded_wait(canister_id, "request") + .with_args(¶ms) + .await + .unwrap() + .candid::>() + .unwrap(); match result_without_cycles { Ok(s) => ic_cdk::trap(&format!("response from `request` without cycles: {:?}", s)), Err(RpcError::ProviderError(ProviderError::TooFewCycles { expected, .. })) => { @@ -55,10 +57,13 @@ pub async fn test() { } // Call with expected number of cycles - let (result,): (Result,) = - ic_cdk::api::call::call_with_payment128(canister_id, "request", params, cycles) - .await - .unwrap(); + let result: Result = Call::unbounded_wait(canister_id, "request") + .with_args(¶ms) + .with_cycles(cycles) + .await + .unwrap() + .candid::>() + .unwrap(); match result { Ok(response) => { // Check response structure around gas price @@ -72,10 +77,8 @@ pub async fn test() { } // Call a Candid-RPC method - let (results,): (MultiRpcResult,) = ic_cdk::api::call::call_with_payment128( - canister_id, - "eth_getBlockByNumber", - ( + let results = Call::unbounded_wait(canister_id, "eth_getBlockByNumber") + .with_args(&( RpcServices::EthMainnet(Some(vec![ // EthMainnetService::Ankr, // Need API key EthMainnetService::BlockPi, @@ -90,11 +93,12 @@ pub async fn test() { ..Default::default() }), BlockTag::Number(19709434_u32.into()), - ), - 10000000000, - ) - .await - .unwrap(); + )) + .with_cycles(10000000000) + .await + .unwrap() + .candid::>() + .unwrap(); match results { MultiRpcResult::Consistent(result) => match result { Ok(block) => { diff --git a/evm_rpc_client/src/fixtures/mod.rs b/evm_rpc_client/src/fixtures/mod.rs index 6144ccc2..f6da5e27 100644 --- a/evm_rpc_client/src/fixtures/mod.rs +++ b/evm_rpc_client/src/fixtures/mod.rs @@ -5,7 +5,7 @@ use crate::{ClientBuilder, Runtime}; use async_trait::async_trait; use candid::{utils::ArgumentEncoder, CandidType, Decode, Encode, Principal}; -use ic_error_types::RejectCode; +use ic_cdk::call::Error; use serde::de::DeserializeOwned; use std::collections::BTreeMap; @@ -82,7 +82,7 @@ impl StubRuntime { self } - fn call(&self, method: &str) -> Result + fn call(&self, method: &str) -> Result where Out: CandidType + DeserializeOwned, { @@ -109,7 +109,7 @@ impl Runtime for StubRuntime { method: &str, _args: In, _cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -122,7 +122,7 @@ impl Runtime for StubRuntime { _id: Principal, method: &str, _args: In, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, diff --git a/evm_rpc_client/src/lib.rs b/evm_rpc_client/src/lib.rs index 9487ca30..9030fdce 100644 --- a/evm_rpc_client/src/lib.rs +++ b/evm_rpc_client/src/lib.rs @@ -127,7 +127,6 @@ use evm_rpc_types::{ BlockTag, CallArgs, ConsensusStrategy, FeeHistoryArgs, GetLogsArgs, GetTransactionCountArgs, Hex, Hex32, RpcConfig, RpcServices, }; -use ic_error_types::RejectCode; #[cfg(feature = "alloy")] pub use request::alloy::AlloyResponseConverter; pub use request::CandidResponseConverter; @@ -783,7 +782,7 @@ impl EvmRpcClient { async fn try_execute_request( &self, request: Request, - ) -> Result + ) -> Result where Config: CandidType + Send, Params: CandidType + Send, diff --git a/evm_rpc_client/src/request/mod.rs b/evm_rpc_client/src/request/mod.rs index dc3e5086..dab932e8 100644 --- a/evm_rpc_client/src/request/mod.rs +++ b/evm_rpc_client/src/request/mod.rs @@ -7,7 +7,6 @@ use evm_rpc_types::{ BlockTag, CallArgs, FeeHistoryArgs, GetLogsArgs, GetLogsRpcConfig, GetTransactionCountArgs, Hex, Hex20, Hex32, MultiRpcResult, Nat256, RpcConfig, RpcServices, }; -use ic_error_types::RejectCode; use serde::de::DeserializeOwned; use std::fmt::{Debug, Formatter}; use strum::EnumIter; @@ -507,8 +506,9 @@ impl } /// Constructs the [`Request`] and sends it using the [`EvmRpcClient`]. This method returns - /// either the request response or any error that occurs while sending the request. - pub async fn try_send(self) -> Result + /// either the request response or any [`ic_cdk::call::Error`] that occurs while sending the + /// request. + pub async fn try_send(self) -> Result where Config: CandidType + Send, Params: CandidType + Send, diff --git a/evm_rpc_client/src/runtime/mod.rs b/evm_rpc_client/src/runtime/mod.rs index 2cd89d29..4ae0ee44 100644 --- a/evm_rpc_client/src/runtime/mod.rs +++ b/evm_rpc_client/src/runtime/mod.rs @@ -1,8 +1,7 @@ use async_trait::async_trait; use candid::utils::ArgumentEncoder; use candid::{CandidType, Principal}; -use ic_cdk::api::call::RejectionCode as IcCdkRejectionCode; -use ic_error_types::RejectCode; +use ic_cdk::call::{Call, Error}; use serde::de::DeserializeOwned; /// Abstract the canister runtime so that the client code can be reused: @@ -18,7 +17,7 @@ pub trait Runtime { method: &str, args: In, cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned; @@ -29,7 +28,7 @@ pub trait Runtime { id: Principal, method: &str, args: In, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned; @@ -47,50 +46,28 @@ impl Runtime for IcRuntime { method: &str, args: In, cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, { - ic_cdk::api::call::call_with_payment128(id, method, args, cycles) + Call::unbounded_wait(id, method) + .with_args(&args) + .with_cycles(cycles) .await - .map(|(res,)| res) - .map_err(|(code, message)| (convert_reject_code(code), message)) + .map_err(Error::from) + .and_then(|response| response.candid::().map_err(Error::from)) } - async fn query_call( - &self, - id: Principal, - method: &str, - args: In, - ) -> Result + async fn query_call(&self, id: Principal, method: &str, args: In) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, { - ic_cdk::api::call::call(id, method, args) + Call::unbounded_wait(id, method) + .with_args(&args) .await - .map(|(res,)| res) - .map_err(|(code, message)| (convert_reject_code(code), message)) - } -} - -fn convert_reject_code(code: IcCdkRejectionCode) -> RejectCode { - match code { - IcCdkRejectionCode::SysFatal => RejectCode::SysFatal, - IcCdkRejectionCode::SysTransient => RejectCode::SysTransient, - IcCdkRejectionCode::DestinationInvalid => RejectCode::DestinationInvalid, - IcCdkRejectionCode::CanisterReject => RejectCode::CanisterReject, - IcCdkRejectionCode::CanisterError => RejectCode::CanisterError, - IcCdkRejectionCode::Unknown => { - // This can only happen if there is a new error code on ICP that the CDK is not aware of. - // We map it to SysFatal since none of the other error codes apply. - // In particular, note that RejectCode::SysUnknown is only applicable to inter-canister - // calls that used ic0.call_with_best_effort_response. - RejectCode::SysFatal - } - IcCdkRejectionCode::NoError => { - unreachable!("inter-canister calls should never produce a RejectionCode::NoError error") - } + .map_err(Error::from) + .and_then(|response| response.candid::().map_err(Error::from)) } } diff --git a/evm_rpc_types/src/result/mod.rs b/evm_rpc_types/src/result/mod.rs index 4c3481bd..24fa9b12 100644 --- a/evm_rpc_types/src/result/mod.rs +++ b/evm_rpc_types/src/result/mod.rs @@ -233,3 +233,16 @@ impl From for LegacyRejectionCode { } } } + +impl From for LegacyRejectionCode { + fn from(value: u32) -> Self { + match value { + 1 => LegacyRejectionCode::SysFatal, + 2 => LegacyRejectionCode::SysTransient, + 3 => LegacyRejectionCode::DestinationInvalid, + 4 => LegacyRejectionCode::CanisterReject, + 5 => LegacyRejectionCode::CanisterError, + _ => LegacyRejectionCode::Unknown, + } + } +} diff --git a/src/http.rs b/src/http.rs index 1b061956..f032b666 100644 --- a/src/http.rs +++ b/src/http.rs @@ -1,15 +1,15 @@ -use crate::constants::COLLATERAL_CYCLES_PER_NODE; -use crate::logs::Priority; -use crate::memory::{get_num_subnet_nodes, is_demo_active, next_request_id}; use crate::{ add_metric_entry, - constants::CONTENT_TYPE_VALUE, - memory::get_override_provider, + constants::{COLLATERAL_CYCLES_PER_NODE, CONTENT_TYPE_VALUE}, + logs::Priority, + memory::{get_num_subnet_nodes, get_override_provider, is_demo_active, next_request_id}, types::{MetricRpcHost, MetricRpcMethod, ResolvedRpcService}, util::canonicalize_json, }; +use canhttp::cycles::ChargeCallerError; use canhttp::{ convert::ConvertRequestLayer, + cycles::{ChargeCaller, CyclesAccounting}, http::{ json::{ ConsistentResponseIdFilterError, CreateJsonRpcIdFilter, HttpJsonRpcRequest, @@ -22,30 +22,29 @@ use canhttp::{ }, observability::ObservabilityLayer, retry::DoubleMaxResponseBytes, - ConvertServiceBuilder, CyclesAccounting, CyclesAccountingError, CyclesChargingPolicy, - HttpsOutcallError, IcError, MaxResponseBytesRequestExtension, TransformContextRequestExtension, + ConvertServiceBuilder, HttpsOutcallError, MaxResponseBytesRequestExtension, + TransformContextRequestExtension, }; use canlog::log; use evm_rpc_types::{ HttpOutcallError, LegacyRejectionCode, ProviderError, RpcError, RpcResult, ValidationError, }; -use http::header::CONTENT_TYPE; -use http::HeaderValue; -use ic_cdk::api::management_canister::http_request::{ - CanisterHttpRequestArgument as IcHttpRequest, HttpResponse as IcHttpResponse, TransformArgs, - TransformContext, +use http::{header::CONTENT_TYPE, HeaderValue}; +use ic_cdk::call::Error as IcError; +use ic_management_canister_types::{ + HttpRequestArgs as IcHttpRequest, HttpRequestResult as IcHttpResponse, TransformArgs, + TransformContext, TransformFunc, }; -use serde::de::DeserializeOwned; -use serde::Serialize; -use std::cmp::PartialEq; +use serde::{de::DeserializeOwned, Serialize}; use std::fmt::Debug; use thiserror::Error; -use tower::layer::util::{Identity, Stack}; -use tower::retry::RetryLayer; -use tower::util::MapRequestLayer; -use tower::{Service, ServiceBuilder}; -use tower_http::set_header::SetRequestHeaderLayer; -use tower_http::ServiceBuilderExt; +use tower::{ + layer::util::{Identity, Stack}, + retry::RetryLayer, + util::MapRequestLayer, + Service, ServiceBuilder, +}; +use tower_http::{set_header::SetRequestHeaderLayer, ServiceBuilderExt}; pub fn json_rpc_request_arg( service: ResolvedRpcService, @@ -61,10 +60,13 @@ pub fn json_rpc_request_arg( service .post(&get_override_provider())? .max_response_bytes(max_response_bytes) - .transform_context(TransformContext::from_name( - "__transform_json_rpc".to_string(), - vec![], - )) + .transform_context(TransformContext { + function: TransformFunc(candid::Func { + method: "__transform_json_rpc".to_string(), + principal: ic_cdk::api::canister_self(), + }), + context: vec![], + }) .body(body) .map_err(|e| { RpcError::ValidationError(ValidationError::Custom(format!("Invalid request: {e}"))) @@ -142,7 +144,7 @@ where }) .on_error( |req_data: MetricData, error: &HttpClientError| match error { - HttpClientError::IcError(IcError { code, message }) => { + HttpClientError::IcError(error) => { if error.is_response_too_large() { add_metric_entry!( err_max_response_size_exceeded, @@ -150,20 +152,32 @@ where 1 ); } else { - add_metric_entry!( - err_http_outcall, - (req_data.method, req_data.host, LegacyRejectionCode::from(*code)), - 1 - ); log!( Priority::TraceHttp, - "IC Error for request with id `{}` with code `{}` and message `{}`", + "IC error for request with id `{}`: {}", req_data.request_id, - code, - message, + error ); + match error { + IcError::CallRejected(error) => { + add_metric_entry!( + err_http_outcall, + (req_data.method, req_data.host, LegacyRejectionCode::from(error.raw_reject_code())), + 1 + ); + } + IcError::CallPerformFailed(_) => { + add_metric_entry!( + err_http_outcall, + (req_data.method, req_data.host, LegacyRejectionCode::SysTransient), + 1 + ); + } + IcError::InsufficientLiquidCycleBalance(_) | IcError::CandidDecodeFailed(_) => {} + } } } + HttpClientError::UnsuccessfulHttpResponse( FilterNonSuccessfulHttpResponseError::UnsuccessfulResponse(response), ) => { @@ -215,10 +229,7 @@ where .convert_response(JsonResponseConverter::new()) .convert_response(FilterNonSuccessfulHttpResponse) .convert_response(HttpResponseConverter) - .convert_request(CyclesAccounting::new( - get_num_subnet_nodes(), - ChargingPolicyWithCollateral::default(), - )) + .convert_request(CyclesAccounting::new(charging_policy_with_collateral())) .service(canhttp::Client::new_with_error::()) } @@ -263,7 +274,7 @@ pub enum HttpClientError { #[error("unknown error (most likely sign of a bug): {0}")] NotHandledError(String), #[error("cycles accounting error: {0}")] - CyclesAccountingError(CyclesAccountingError), + CyclesAccountingError(ChargeCallerError), #[error("HTTP response was not successful: {0}")] UnsuccessfulHttpResponse(FilterNonSuccessfulHttpResponseError>), #[error("Error converting response to JSON: {0}")] @@ -297,8 +308,8 @@ impl From for HttpClientError { } } -impl From for HttpClientError { - fn from(value: CyclesAccountingError) -> Self { +impl From for HttpClientError { + fn from(value: ChargeCallerError) -> Self { HttpClientError::CyclesAccountingError(value) } } @@ -324,17 +335,29 @@ impl From for HttpClientError { impl From for RpcError { fn from(error: HttpClientError) -> Self { match error { - HttpClientError::IcError(IcError { code, message }) => { + HttpClientError::IcError(IcError::CallRejected(e)) => { RpcError::HttpOutcallError(HttpOutcallError::IcError { - code: LegacyRejectionCode::from(code), - message, + code: LegacyRejectionCode::from(e.raw_reject_code()), + message: e.reject_message().to_string(), }) } + HttpClientError::IcError(IcError::CallPerformFailed(e)) => { + RpcError::HttpOutcallError(HttpOutcallError::IcError { + code: LegacyRejectionCode::SysTransient, + message: e.to_string(), + }) + } + HttpClientError::IcError(IcError::CandidDecodeFailed(e)) => { + panic!("{}", e.to_string()) + } + HttpClientError::IcError(IcError::InsufficientLiquidCycleBalance(e)) => { + panic!("{}", e.to_string()) + } HttpClientError::NotHandledError(e) => { RpcError::ValidationError(ValidationError::Custom(e)) } HttpClientError::CyclesAccountingError( - CyclesAccountingError::InsufficientCyclesError { expected, received }, + ChargeCallerError::InsufficientCyclesError { expected, received }, ) => RpcError::ProviderError(ProviderError::TooFewCycles { expected, received }), HttpClientError::InvalidJsonResponse( JsonResponseConversionError::InvalidJsonResponse { @@ -380,44 +403,18 @@ struct MetricData { request_id: Id, } -#[derive(Debug, Clone, Eq, PartialEq)] -pub struct ChargingPolicyWithCollateral { - charge_user: bool, - collateral_cycles: u128, -} - -impl ChargingPolicyWithCollateral { - pub fn new( - num_nodes_in_subnet: u32, - charge_user: bool, - collateral_cycles_per_node: u128, - ) -> Self { - let collateral_cycles = - collateral_cycles_per_node.saturating_mul(num_nodes_in_subnet as u128); - Self { - charge_user, - collateral_cycles, - } - } -} - -impl Default for ChargingPolicyWithCollateral { - fn default() -> Self { - Self::new( - get_num_subnet_nodes(), - !is_demo_active(), - COLLATERAL_CYCLES_PER_NODE, - ) - } -} - -impl CyclesChargingPolicy for ChargingPolicyWithCollateral { - fn cycles_to_charge(&self, _request: &IcHttpRequest, attached_cycles: u128) -> u128 { - if self.charge_user { - return attached_cycles.saturating_add(self.collateral_cycles); +pub fn charging_policy_with_collateral( +) -> ChargeCaller u128 + Clone> { + let charge_caller = if is_demo_active() { + |_request: &IcHttpRequest, _request_cost| 0 + } else { + |_request: &IcHttpRequest, request_cost| { + let collateral_cycles = + COLLATERAL_CYCLES_PER_NODE.saturating_mul(get_num_subnet_nodes() as u128); + request_cost + collateral_cycles } - 0 - } + }; + ChargeCaller::new(charge_caller) } pub fn transform_http_request(args: TransformArgs) -> IcHttpResponse { diff --git a/src/main.rs b/src/main.rs index 6dc66668..40e4cea4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ use candid::candid_method; -use canhttp::{multi::Timestamp, CyclesChargingPolicy, CyclesCostEstimator}; +use canhttp::{cycles::CyclesChargingPolicy, multi::Timestamp}; use canlog::{Log, Sort}; use evm_rpc::{ candid_rpc::CandidRpcClient, http::{ - json_rpc_request, json_rpc_request_arg, service_request_builder, transform_http_request, - ChargingPolicyWithCollateral, + charging_policy_with_collateral, json_rpc_request, json_rpc_request_arg, + service_request_builder, transform_http_request, }, logs::{Priority, INFO}, memory::{ @@ -19,23 +19,17 @@ use evm_rpc::{ }; use evm_rpc_types::{Hex32, HttpOutcallError, MultiRpcResult, RpcConfig, RpcResult, RpcServices}; use ic_canister_log::log; -use ic_cdk::{ - api::{ - is_controller, - management_canister::http_request::{ - CanisterHttpRequestArgument as IcHttpRequest, HttpResponse as IcHttpResponse, - TransformArgs, - }, - }, - query, update, -}; +use ic_cdk::{api::is_controller, query, update}; use ic_http_types::{HttpRequest, HttpResponse, HttpResponseBuilder}; +use ic_management_canister_types::{ + HttpRequestArgs as IcHttpRequest, HttpRequestResult as IcHttpResponse, TransformArgs, +}; use ic_metrics_encoder::MetricsEncoder; use std::str::FromStr; use tower::Service; pub fn require_api_key_principal_or_controller() -> Result<(), String> { - let caller = ic_cdk::caller(); + let caller = ic_cdk::api::msg_caller(); if is_api_key_principal(&caller) || is_controller(&caller) { Ok(()) } else { @@ -153,8 +147,8 @@ pub async fn multi_request( } } -#[update] -#[candid_method] +#[update(name = "request")] +#[candid_method(rename = "request")] async fn request( service: evm_rpc_types::RpcService, json_rpc_payload: String, @@ -205,12 +199,12 @@ async fn request_cost( .expect("Error: invalid request") .into_body(); - let cycles_to_attach = { - let estimator = CyclesCostEstimator::new(get_num_subnet_nodes()); - estimator.cost_of_http_request(&request) - }; - let estimator = ChargingPolicyWithCollateral::default(); - Ok(estimator.cycles_to_charge(&request, cycles_to_attach)) + let request_cost_with_collateral = charging_policy_with_collateral().cycles_to_charge( + &request, + ic_cdk::management_canister::cost_http_request(&request), + ); + + Ok(request_cost_with_collateral) } } @@ -280,7 +274,7 @@ async fn update_api_keys(api_keys: Vec<(ProviderId, Option)>) { log!( INFO, "[{}] Updating API keys for providers: {}", - ic_cdk::caller(), + ic_cdk::api::msg_caller(), api_keys .iter() .map(|(id, _)| id.to_string()) diff --git a/src/metrics.rs b/src/metrics.rs index f5fe2f48..6ad66c64 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -60,7 +60,7 @@ pub fn encode_metrics(w: &mut ic_metrics_encoder::MetricsEncoder>) -> st w.gauge_vec("cycle_balance", "Cycle balance of this canister")? .value( &[("canister", "evmrpc")], - ic_cdk::api::canister_balance128().metric_value(), + ic_cdk::api::canister_cycle_balance().metric_value(), )?; w.encode_gauge( "evmrpc_canister_version", @@ -69,7 +69,7 @@ pub fn encode_metrics(w: &mut ic_metrics_encoder::MetricsEncoder>) -> st )?; w.encode_gauge( "stable_memory_bytes", - ic_cdk::api::stable::stable_size() as f64 * WASM_PAGE_SIZE_IN_BYTES, + ic_cdk::stable::stable_size() as f64 * WASM_PAGE_SIZE_IN_BYTES, "Size of the stable memory allocated by this canister.", )?; diff --git a/src/rpc_client/eth_rpc/mod.rs b/src/rpc_client/eth_rpc/mod.rs index 6113d07d..caf8babf 100644 --- a/src/rpc_client/eth_rpc/mod.rs +++ b/src/rpc_client/eth_rpc/mod.rs @@ -1,17 +1,17 @@ //! This module contains definitions for communicating witEthereum API using the [JSON RPC](https://ethereum.org/en/developers/docs/apis/json-rpc/) //! interface. -use crate::rpc_client::eth_rpc_error::{sanitize_send_raw_transaction_result, Parser}; -use crate::rpc_client::json::responses::{Block, FeeHistory, LogEntry, TransactionReceipt}; -use crate::rpc_client::numeric::{TransactionCount, Wei}; -use candid::candid_method; +use crate::rpc_client::{ + eth_rpc_error::{sanitize_send_raw_transaction_result, Parser}, + json::responses::{Block, FeeHistory, LogEntry, TransactionReceipt}, + numeric::{TransactionCount, Wei}, +}; use canhttp::http::json::JsonRpcResponse; -use ic_cdk::api::management_canister::http_request::{HttpResponse, TransformArgs}; -use ic_cdk_macros::query; +use ic_cdk::query; +use ic_management_canister_types::{HttpRequestResult, TransformArgs}; use minicbor::{Decode, Encode}; use serde::{de::DeserializeOwned, Serialize}; -use std::fmt; -use std::fmt::Debug; +use std::{fmt, fmt::Debug}; #[cfg(test)] mod tests; @@ -95,8 +95,8 @@ impl ResponseTransform { } #[query] -#[candid_method(query)] -fn cleanup_response(mut args: TransformArgs) -> HttpResponse { +#[allow(unused_mut)] // Clearing the response header requires `args` to be `mut` +fn cleanup_response(mut args: TransformArgs) -> HttpRequestResult { args.response.headers.clear(); let status_ok = args.response.status >= 200u16 && args.response.status < 300u16; if status_ok && !args.context.is_empty() { diff --git a/src/rpc_client/mod.rs b/src/rpc_client/mod.rs index 6a807599..dcce4b31 100644 --- a/src/rpc_client/mod.rs +++ b/src/rpc_client/mod.rs @@ -1,4 +1,3 @@ -use crate::types::RpcMethod; use crate::{ http::http_client, memory::{get_override_provider, rank_providers, record_ok_result}, @@ -8,7 +7,7 @@ use crate::{ json::responses::RawJson, numeric::TransactionCount, }, - types::MetricRpcMethod, + types::{MetricRpcMethod, RpcMethod}, }; use canhttp::{ http::json::JsonRpcRequest, @@ -18,7 +17,7 @@ use canhttp::{ use evm_rpc_types::{ ConsensusStrategy, JsonRpcError, ProviderError, RpcConfig, RpcError, RpcService, RpcServices, }; -use ic_cdk::api::management_canister::http_request::TransformContext; +use ic_management_canister_types::{TransformContext, TransformFunc}; use json::{ requests::{ BlockSpec, EthCallParams, FeeHistoryParams, GetBlockByNumberParams, GetLogsParam, @@ -297,10 +296,13 @@ impl EthRpcClient { .map(|builder| { builder .max_response_bytes(effective_size_estimate) - .transform_context(TransformContext::from_name( - "cleanup_response".to_owned(), - transform_op.clone(), - )) + .transform_context(TransformContext { + function: TransformFunc(candid::Func { + method: "cleanup_response".to_string(), + principal: ic_cdk::api::canister_self(), + }), + context: transform_op.clone(), + }) .body(JsonRpcRequest::new(method.clone().name(), params.clone())) .expect("BUG: invalid request") }); diff --git a/tests/mock_http_runtime/mod.rs b/tests/mock_http_runtime/mod.rs index a44831b3..5e7eac00 100644 --- a/tests/mock_http_runtime/mod.rs +++ b/tests/mock_http_runtime/mod.rs @@ -2,9 +2,10 @@ pub mod mock; use crate::MAX_TICKS; use async_trait::async_trait; -use candid::{decode_args, utils::ArgumentEncoder, CandidType, Principal}; +use candid::{decode_one, utils::ArgumentEncoder, CandidType, Principal}; use evm_rpc::constants::DEFAULT_MAX_RESPONSE_BYTES; use evm_rpc_client::Runtime; +use ic_cdk::call::{CallFailed, CallRejected, Error}; use ic_error_types::RejectCode; use mock::MockHttpOutcalls; use pocket_ic::{ @@ -34,7 +35,7 @@ impl Runtime for MockHttpRuntime { method: &str, args: In, _cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -58,7 +59,7 @@ impl Runtime for MockHttpRuntime { id: Principal, method: &str, args: In, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -120,37 +121,36 @@ fn check_response_size( response } -fn parse_reject_response(response: RejectResponse) -> (RejectCode, String) { - use pocket_ic::RejectCode as PocketIcRejectCode; - let rejection_code = match response.reject_code { - PocketIcRejectCode::SysFatal => RejectCode::SysFatal, - PocketIcRejectCode::SysTransient => RejectCode::SysTransient, - PocketIcRejectCode::DestinationInvalid => RejectCode::DestinationInvalid, - PocketIcRejectCode::CanisterReject => RejectCode::CanisterReject, - PocketIcRejectCode::CanisterError => RejectCode::CanisterError, - PocketIcRejectCode::SysUnknown => RejectCode::SysUnknown, - }; - (rejection_code, response.reject_message) +fn parse_reject_response(response: RejectResponse) -> Error { + CallFailed::CallRejected(CallRejected::with_rejection( + response.reject_code as u32, + response.reject_message, + )) + .into() } pub fn encode_args(args: In) -> Vec { candid::encode_args(args).expect("Failed to encode arguments.") } -pub fn decode_call_response(bytes: Vec) -> Result +pub fn decode_call_response(bytes: Vec) -> Result where Out: CandidType + DeserializeOwned, { - decode_args(&bytes).map(|(res,)| res).map_err(|e| { - ( - RejectCode::CanisterError, - format!( - "failed to decode canister response as {}: {}", - std::any::type_name::(), - e - ), - ) - }) + decode_one(&bytes) + .map_err(|e| { + // This would normally map to a `ic_cdk::call::CandidDecodeFailed`, but there is no + // way to instantiate this error from outside. + CallFailed::CallRejected(CallRejected::with_rejection( + RejectCode::CanisterError as u32, + format!( + "failed to decode canister response as {}: {}", + std::any::type_name::(), + e + ), + )) + }) + .map_err(Error::from) } async fn tick_until_http_requests(env: &PocketIc) -> Vec { diff --git a/tests/setup/mod.rs b/tests/setup/mod.rs index 2e7069c7..59f6c723 100644 --- a/tests/setup/mod.rs +++ b/tests/setup/mod.rs @@ -11,8 +11,8 @@ use evm_rpc::{ }; use evm_rpc_client::{AlloyResponseConverter, ClientBuilder, EvmRpcClient, Runtime}; use evm_rpc_types::{InstallArgs, Provider, RpcResult, RpcService}; -use ic_cdk::api::management_canister::main::CanisterId; use ic_http_types::{HttpRequest, HttpResponse}; +use ic_management_canister_types::CanisterId; use ic_management_canister_types::CanisterSettings; use ic_metrics_assert::{MetricsAssert, PocketIcAsyncHttpQuery}; use ic_test_utilities_load_wasm::load_wasm; @@ -239,12 +239,11 @@ impl EvmRpcSetup { input: Vec, caller: Principal, ) -> R { - let candid = &assert_reply( + decode_reply( self.env .query_call(self.canister_id, caller, method, input) .await, - ); - Decode!(candid, R).expect("error while decoding Candid response from query call") + ) } async fn call_update( @@ -253,12 +252,11 @@ impl EvmRpcSetup { input: Vec, caller: Principal, ) -> R { - let candid = &assert_reply( + decode_reply( self.env .update_call(self.canister_id, caller, method, input) .await, - ); - Decode!(candid, R).expect("error while decoding Candid response from query call") + ) } } @@ -276,6 +274,10 @@ fn evm_rpc_wasm() -> Vec { load_wasm(std::env::var("CARGO_MANIFEST_DIR").unwrap(), "evm_rpc", &[]) } -fn assert_reply(result: Result, RejectResponse>) -> Vec { - result.unwrap_or_else(|e| panic!("Expected a successful reply, got error {e}")) +fn decode_reply(result: Result, RejectResponse>) -> R { + Decode!( + &result.unwrap_or_else(|e| panic!("Expected a successful reply, got error {e}")), + R + ) + .unwrap_or_else(|e| panic!("Error while decoding Candid response: {e}")) } diff --git a/tests/tests.rs b/tests/tests.rs index 67878010..459eb264 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1015,71 +1015,6 @@ async fn candid_rpc_should_err_without_cycles() { } } -#[tokio::test] -async fn candid_rpc_should_err_with_insufficient_cycles() { - let setup = EvmRpcSetup::with_args(InstallArgs { - demo: Some(true), - nodes_in_subnet: Some(33), - ..Default::default() - }) - .await - .mock_api_keys() - .await; - - let mut result = setup - .client(MockHttpOutcalls::NEVER) - .with_rpc_sources(RpcServices::EthMainnet(None)) - .build() - .get_transaction_receipt(b256!( - "0xdd5d4b18923d7aae953c7996d791118102e889bea37b48a651157a4890e4746f" - )) - .send() - .await - .expect_inconsistent(); - let regex = regex::Regex::new( - "http_request request sent with [0-9_]+ cycles, but [0-9_]+ cycles are required.", - ) - .unwrap(); - assert_matches!( - result.pop().unwrap(), - ( - RpcService::EthMainnet(EthMainnetService::PublicNode), - Err(RpcError::HttpOutcallError(HttpOutcallError::IcError { - code: LegacyRejectionCode::CanisterReject, - message - })) - ) if regex.is_match(&message) - ); - - // Same request should succeed after upgrade to the expected node count - setup - .upgrade_canister(InstallArgs { - nodes_in_subnet: Some(34), - ..Default::default() - }) - .await; - - let mocks = MockHttpOutcallsBuilder::new() - .given(get_transaction_receipt_request().with_id(0_u64)) - .respond_with(get_transaction_receipt_response().with_id(0_u64)) - .given(get_transaction_receipt_request().with_id(1_u64)) - .respond_with(get_transaction_receipt_response().with_id(1_u64)) - .given(get_transaction_receipt_request().with_id(2_u64)) - .respond_with(get_transaction_receipt_response().with_id(2_u64)); - let result = setup - .client(mocks) - .with_rpc_sources(RpcServices::EthMainnet(None)) - .build() - .get_transaction_receipt(b256!( - "0xdd5d4b18923d7aae953c7996d791118102e889bea37b48a651157a4890e4746f" - )) - .send() - .await - .expect_consistent() - .unwrap(); - assert_matches!(result, Some(alloy_rpc_types::TransactionReceipt { .. })); -} - #[tokio::test] async fn candid_rpc_should_err_when_service_unavailable() { let setup = EvmRpcSetup::new().await.mock_api_keys().await; @@ -2593,29 +2528,6 @@ fn get_transaction_count_response() -> JsonRpcResponse { JsonRpcResponse::from(json!({ "jsonrpc" : "2.0", "id" : 0, "result" : "0x1" })) } -fn get_transaction_receipt_response() -> JsonRpcResponse { - JsonRpcResponse::from(json!({ - "jsonrpc": "2.0", - "id": 0, - "result": { - "blockHash": "0x5115c07eb1f20a9d6410db0916ed3df626cfdab161d3904f45c8c8b65c90d0be", - "blockNumber": "0x11a85ab", - "contractAddress": null, - "cumulativeGasUsed": "0xf02aed", - "effectiveGasPrice": "0x63c00ee76", - "from": "0x0aa8ebb6ad5a8e499e550ae2c461197624c6e667", - "gasUsed": "0x7d89", - "logs": [], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "status": "0x1", - "to": "0x356cfd6e6d0000400000003900b415f80669009e", - "transactionHash": "0xdd5d4b18923d7aae953c7996d791118102e889bea37b48a651157a4890e4746f", - "transactionIndex": "0xd9", - "type": "0x2" - } - })) -} - fn send_raw_transaction_response() -> JsonRpcResponse { JsonRpcResponse::from(json!({ "id": 0, "jsonrpc": "2.0", "result": MOCK_TRANSACTION_HASH })) } From 2a5f7b73ce91faf5cce08726f03b979fe166efff Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Tue, 7 Oct 2025 10:58:03 +0200 Subject: [PATCH 2/7] XC-502: Update `canhttp` to latest commit --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/http.rs | 36 +++++++++--------------------------- 3 files changed, 11 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a80c740c..d022b87c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -856,7 +856,7 @@ dependencies = [ [[package]] name = "canhttp" version = "0.2.1" -source = "git+https://github.com/dfinity/canhttp/?rev=0b935a2ba6defb0265bb94bbfb5c5675975531a3#0b935a2ba6defb0265bb94bbfb5c5675975531a3" +source = "git+https://github.com/dfinity/canhttp/?rev=724e87719d2f5d43dc463ed8d881c0fc0f3a4541#724e87719d2f5d43dc463ed8d881c0fc0f3a4541" dependencies = [ "assert_matches", "ciborium", diff --git a/Cargo.toml b/Cargo.toml index 9da5356a..27a907c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,7 +75,7 @@ alloy-rpc-types = "1.0.23" assert_matches = "1.5.0" async-trait = "0.1.88" candid = { version = "0.10.13" } -canhttp = { git = "https://github.com/dfinity/canhttp/", features = ["json", "multi"], rev = "0b935a2ba6defb0265bb94bbfb5c5675975531a3" } +canhttp = { git = "https://github.com/dfinity/canhttp/", features = ["json", "multi"], rev = "724e87719d2f5d43dc463ed8d881c0fc0f3a4541" } canlog = { version = "0.2.0", features = ["derive"] } candid_parser = { version = "0.1.4" } derive_more = { version = "2.0.1", features = ["from", "into"] } diff --git a/src/http.rs b/src/http.rs index f032b666..f72b60a5 100644 --- a/src/http.rs +++ b/src/http.rs @@ -6,10 +6,9 @@ use crate::{ types::{MetricRpcHost, MetricRpcMethod, ResolvedRpcService}, util::canonicalize_json, }; -use canhttp::cycles::ChargeCallerError; use canhttp::{ convert::ConvertRequestLayer, - cycles::{ChargeCaller, CyclesAccounting}, + cycles::{ChargeCaller, ChargeCallerError, CyclesAccounting}, http::{ json::{ ConsistentResponseIdFilterError, CreateJsonRpcIdFilter, HttpJsonRpcRequest, @@ -22,7 +21,7 @@ use canhttp::{ }, observability::ObservabilityLayer, retry::DoubleMaxResponseBytes, - ConvertServiceBuilder, HttpsOutcallError, MaxResponseBytesRequestExtension, + ConvertServiceBuilder, HttpsOutcallError, IcError, MaxResponseBytesRequestExtension, TransformContextRequestExtension, }; use canlog::log; @@ -30,7 +29,6 @@ use evm_rpc_types::{ HttpOutcallError, LegacyRejectionCode, ProviderError, RpcError, RpcResult, ValidationError, }; use http::{header::CONTENT_TYPE, HeaderValue}; -use ic_cdk::call::Error as IcError; use ic_management_canister_types::{ HttpRequestArgs as IcHttpRequest, HttpRequestResult as IcHttpResponse, TransformArgs, TransformContext, TransformFunc, @@ -159,21 +157,14 @@ where error ); match error { - IcError::CallRejected(error) => { + IcError::CallRejected {code, ..} => { add_metric_entry!( err_http_outcall, - (req_data.method, req_data.host, LegacyRejectionCode::from(error.raw_reject_code())), + (req_data.method, req_data.host, LegacyRejectionCode::from(*code)), 1 ); } - IcError::CallPerformFailed(_) => { - add_metric_entry!( - err_http_outcall, - (req_data.method, req_data.host, LegacyRejectionCode::SysTransient), - 1 - ); - } - IcError::InsufficientLiquidCycleBalance(_) | IcError::CandidDecodeFailed(_) => {} + IcError::InsufficientLiquidCycleBalance {..} => {} } } } @@ -335,22 +326,13 @@ impl From for HttpClientError { impl From for RpcError { fn from(error: HttpClientError) -> Self { match error { - HttpClientError::IcError(IcError::CallRejected(e)) => { + HttpClientError::IcError(IcError::CallRejected { code, message }) => { RpcError::HttpOutcallError(HttpOutcallError::IcError { - code: LegacyRejectionCode::from(e.raw_reject_code()), - message: e.reject_message().to_string(), + code: LegacyRejectionCode::from(code), + message, }) } - HttpClientError::IcError(IcError::CallPerformFailed(e)) => { - RpcError::HttpOutcallError(HttpOutcallError::IcError { - code: LegacyRejectionCode::SysTransient, - message: e.to_string(), - }) - } - HttpClientError::IcError(IcError::CandidDecodeFailed(e)) => { - panic!("{}", e.to_string()) - } - HttpClientError::IcError(IcError::InsufficientLiquidCycleBalance(e)) => { + e @ HttpClientError::IcError { .. } => { panic!("{}", e.to_string()) } HttpClientError::NotHandledError(e) => { From 3e62ad37eef1ce9655a1ff47a41037d7b6c49bd6 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Wed, 8 Oct 2025 11:59:28 +0200 Subject: [PATCH 3/7] XC-502: Remove `#[allow(unused_mut)]` --- src/rpc_client/eth_rpc/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc_client/eth_rpc/mod.rs b/src/rpc_client/eth_rpc/mod.rs index caf8babf..ae86aacd 100644 --- a/src/rpc_client/eth_rpc/mod.rs +++ b/src/rpc_client/eth_rpc/mod.rs @@ -95,8 +95,8 @@ impl ResponseTransform { } #[query] -#[allow(unused_mut)] // Clearing the response header requires `args` to be `mut` -fn cleanup_response(mut args: TransformArgs) -> HttpRequestResult { +fn cleanup_response(args: TransformArgs) -> HttpRequestResult { + let mut args = args; args.response.headers.clear(); let status_ok = args.response.status >= 200u16 && args.response.status < 300u16; if status_ok && !args.context.is_empty() { From 66936559b874184b362e11922cc7c8fb83817488 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Wed, 8 Oct 2025 12:45:14 +0200 Subject: [PATCH 4/7] XC-502: Use custom `IcError` instead of `ic_cdk::call::Error` --- Cargo.lock | 1 + evm_rpc_client/Cargo.toml | 1 + evm_rpc_client/src/fixtures/mod.rs | 9 ++- evm_rpc_client/src/lib.rs | 4 +- evm_rpc_client/src/request/mod.rs | 6 +- evm_rpc_client/src/runtime/mod.rs | 94 ++++++++++++++++++++++++++---- tests/mock_http_runtime/mod.rs | 33 +++++------ 7 files changed, 107 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d022b87c..5c93004d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1603,6 +1603,7 @@ dependencies = [ "serde", "serde_json", "strum 0.27.2", + "thiserror 2.0.16", "tokio", ] diff --git a/evm_rpc_client/Cargo.toml b/evm_rpc_client/Cargo.toml index f91ce96b..d0a16640 100644 --- a/evm_rpc_client/Cargo.toml +++ b/evm_rpc_client/Cargo.toml @@ -21,6 +21,7 @@ ic-error-types = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } strum = { workspace = true } +thiserror = { workspace = true } [dev-dependencies] alloy-dyn-abi = { workspace = true } diff --git a/evm_rpc_client/src/fixtures/mod.rs b/evm_rpc_client/src/fixtures/mod.rs index f6da5e27..a23f4bc4 100644 --- a/evm_rpc_client/src/fixtures/mod.rs +++ b/evm_rpc_client/src/fixtures/mod.rs @@ -2,10 +2,9 @@ //! //! Types and methods for this module are only available for non-canister architecture (non `wasm32`). -use crate::{ClientBuilder, Runtime}; +use crate::{ClientBuilder, IcError, Runtime}; use async_trait::async_trait; use candid::{utils::ArgumentEncoder, CandidType, Decode, Encode, Principal}; -use ic_cdk::call::Error; use serde::de::DeserializeOwned; use std::collections::BTreeMap; @@ -82,7 +81,7 @@ impl StubRuntime { self } - fn call(&self, method: &str) -> Result + fn call(&self, method: &str) -> Result where Out: CandidType + DeserializeOwned, { @@ -109,7 +108,7 @@ impl Runtime for StubRuntime { method: &str, _args: In, _cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -122,7 +121,7 @@ impl Runtime for StubRuntime { _id: Principal, method: &str, _args: In, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, diff --git a/evm_rpc_client/src/lib.rs b/evm_rpc_client/src/lib.rs index 9030fdce..62366947 100644 --- a/evm_rpc_client/src/lib.rs +++ b/evm_rpc_client/src/lib.rs @@ -138,7 +138,7 @@ use request::{ GetTransactionReceiptRequestBuilder, JsonRequest, JsonRequestBuilder, Request, RequestBuilder, SendRawTransactionRequest, SendRawTransactionRequestBuilder, }; -pub use runtime::{IcRuntime, Runtime}; +pub use runtime::{IcError, IcRuntime, Runtime}; use serde::de::DeserializeOwned; use std::sync::Arc; @@ -782,7 +782,7 @@ impl EvmRpcClient { async fn try_execute_request( &self, request: Request, - ) -> Result + ) -> Result where Config: CandidType + Send, Params: CandidType + Send, diff --git a/evm_rpc_client/src/request/mod.rs b/evm_rpc_client/src/request/mod.rs index dab932e8..c69c0bbe 100644 --- a/evm_rpc_client/src/request/mod.rs +++ b/evm_rpc_client/src/request/mod.rs @@ -1,6 +1,7 @@ #[cfg(feature = "alloy")] pub(crate) mod alloy; +use crate::runtime::IcError; use crate::{EvmRpcClient, Runtime}; use candid::CandidType; use evm_rpc_types::{ @@ -506,9 +507,8 @@ impl } /// Constructs the [`Request`] and sends it using the [`EvmRpcClient`]. This method returns - /// either the request response or any [`ic_cdk::call::Error`] that occurs while sending the - /// request. - pub async fn try_send(self) -> Result + /// either the request response or any error that occurs while sending the request. + pub async fn try_send(self) -> Result where Config: CandidType + Send, Params: CandidType + Send, diff --git a/evm_rpc_client/src/runtime/mod.rs b/evm_rpc_client/src/runtime/mod.rs index 4ae0ee44..f28e6ffa 100644 --- a/evm_rpc_client/src/runtime/mod.rs +++ b/evm_rpc_client/src/runtime/mod.rs @@ -1,8 +1,9 @@ use async_trait::async_trait; -use candid::utils::ArgumentEncoder; -use candid::{CandidType, Principal}; -use ic_cdk::call::{Call, Error}; +use candid::{utils::ArgumentEncoder, CandidType, Principal}; +use ic_cdk::call::{Call, CallFailed}; +use ic_error_types::RejectCode; use serde::de::DeserializeOwned; +use thiserror::Error; /// Abstract the canister runtime so that the client code can be reused: /// * in production using `ic_cdk`, @@ -17,7 +18,7 @@ pub trait Runtime { method: &str, args: In, cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned; @@ -28,7 +29,7 @@ pub trait Runtime { id: Principal, method: &str, args: In, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned; @@ -46,7 +47,7 @@ impl Runtime for IcRuntime { method: &str, args: In, cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -55,11 +56,20 @@ impl Runtime for IcRuntime { .with_args(&args) .with_cycles(cycles) .await - .map_err(Error::from) - .and_then(|response| response.candid::().map_err(Error::from)) + .map_err(IcError::from) + .map(|response| { + response + .candid::() + .unwrap_or_else(|e| panic!("Failed to decode result: {e}")) + }) } - async fn query_call(&self, id: Principal, method: &str, args: In) -> Result + async fn query_call( + &self, + id: Principal, + method: &str, + args: In, + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -67,7 +77,69 @@ impl Runtime for IcRuntime { Call::unbounded_wait(id, method) .with_args(&args) .await - .map_err(Error::from) - .and_then(|response| response.candid::().map_err(Error::from)) + .map_err(IcError::from) + .map(|response| { + response + .candid::() + .unwrap_or_else(|e| panic!("Failed to decode result: {e}")) + }) + } +} + +/// Error returned by the Internet Computer when making an inter-canister call. +#[derive(Error, Clone, Debug, PartialEq, Eq)] +pub enum IcError { + /// The inter-canister call is rejected. + /// + /// Note that [`ic_cdk::call::Error::CallPerformFailed`] errors are also mapped to this variant + /// with an [`ic_error_types::RejectCode::SysFatal`] error code. + #[error("Error from ICP: (code {code:?}, message {message})")] + CallRejected { + /// Rejection code as specified [here](https://internetcomputer.org/docs/current/references/ic-interface-spec#reject-codes) + code: RejectCode, + /// Associated helper message. + message: String, + }, + /// The liquid cycle balance is insufficient to perform the call. + #[error("Insufficient liquid cycles balance, available: {available}, required: {required}")] + InsufficientLiquidCycleBalance { + /// The liquid cycle balance available in the canister. + available: u128, + /// The required cycles to perform the call. + required: u128, + }, +} + +impl From for IcError { + fn from(err: CallFailed) -> Self { + match err { + CallFailed::CallRejected(e) => { + IcError::CallRejected { + // `CallRejected::reject_code()` can only return an error result if there is a + // new error code on ICP that the CDK is not aware of. We map it to `SysFatal` + // since none of the other error codes apply. + // In particular, note that `RejectCode::SysUnknown` is only applicable to + // inter-canister calls that used `ic0.call_with_best_effort_response`. + code: e.reject_code().unwrap_or(RejectCode::SysFatal), + message: e.reject_message().to_string(), + } + } + CallFailed::CallPerformFailed(e) => { + IcError::CallRejected { + // This error indicates that the `ic0.call_perform` system API returned a non-zero code. + // The only possible non-zero value (2) has the same semantics as `RejectCode::SysFatal`. + // See the IC specifications here: + // https://internetcomputer.org/docs/references/ic-interface-spec#system-api-call + code: RejectCode::SysFatal, + message: e.to_string(), + } + } + CallFailed::InsufficientLiquidCycleBalance(e) => { + IcError::InsufficientLiquidCycleBalance { + available: e.available, + required: e.required, + } + } + } } } diff --git a/tests/mock_http_runtime/mod.rs b/tests/mock_http_runtime/mod.rs index 5e7eac00..9babd0e5 100644 --- a/tests/mock_http_runtime/mod.rs +++ b/tests/mock_http_runtime/mod.rs @@ -4,8 +4,8 @@ use crate::MAX_TICKS; use async_trait::async_trait; use candid::{decode_one, utils::ArgumentEncoder, CandidType, Principal}; use evm_rpc::constants::DEFAULT_MAX_RESPONSE_BYTES; -use evm_rpc_client::Runtime; -use ic_cdk::call::{CallFailed, CallRejected, Error}; +use evm_rpc_client::{IcError, Runtime}; +use ic_cdk::call::{CallFailed, CallRejected}; use ic_error_types::RejectCode; use mock::MockHttpOutcalls; use pocket_ic::{ @@ -35,7 +35,7 @@ impl Runtime for MockHttpRuntime { method: &str, args: In, _cycles: u128, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -59,7 +59,7 @@ impl Runtime for MockHttpRuntime { id: Principal, method: &str, args: In, - ) -> Result + ) -> Result where In: ArgumentEncoder + Send, Out: CandidType + DeserializeOwned, @@ -121,7 +121,7 @@ fn check_response_size( response } -fn parse_reject_response(response: RejectResponse) -> Error { +fn parse_reject_response(response: RejectResponse) -> IcError { CallFailed::CallRejected(CallRejected::with_rejection( response.reject_code as u32, response.reject_message, @@ -133,24 +133,17 @@ pub fn encode_args(args: In) -> Vec { candid::encode_args(args).expect("Failed to encode arguments.") } -pub fn decode_call_response(bytes: Vec) -> Result +pub fn decode_call_response(bytes: Vec) -> Result where Out: CandidType + DeserializeOwned, { - decode_one(&bytes) - .map_err(|e| { - // This would normally map to a `ic_cdk::call::CandidDecodeFailed`, but there is no - // way to instantiate this error from outside. - CallFailed::CallRejected(CallRejected::with_rejection( - RejectCode::CanisterError as u32, - format!( - "failed to decode canister response as {}: {}", - std::any::type_name::(), - e - ), - )) - }) - .map_err(Error::from) + decode_one(&bytes).map_err(|e| { + panic!( + "failed to decode canister response as {}: {}", + std::any::type_name::(), + e + ) + }) } async fn tick_until_http_requests(env: &PocketIc) -> Vec { From 81c05106c9f1f6a6781b34a1e423c30207489fa7 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Mon, 20 Oct 2025 09:29:54 +0200 Subject: [PATCH 5/7] XC-502: Update `canhttp` --- Cargo.lock | 5 +++-- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a86069be..609e638e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -855,8 +855,9 @@ dependencies = [ [[package]] name = "canhttp" -version = "0.2.1" -source = "git+https://github.com/dfinity/canhttp/?rev=724e87719d2f5d43dc463ed8d881c0fc0f3a4541#724e87719d2f5d43dc463ed8d881c0fc0f3a4541" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a904573d46c342d81fc9d07e9f5dad0af53ece2831cb9651bd5fe8dee673ea" dependencies = [ "assert_matches", "ciborium", diff --git a/Cargo.toml b/Cargo.toml index 9096effb..d091ae0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,7 +74,7 @@ alloy-rpc-types = "1.0.23" assert_matches = "1.5.0" async-trait = "0.1.88" candid = { version = "0.10.13" } -canhttp = { git = "https://github.com/dfinity/canhttp/", features = ["json", "multi"], rev = "724e87719d2f5d43dc463ed8d881c0fc0f3a4541" } +canhttp = { version = "0.3.0", features = ["json", "multi"] } canlog = { version = "0.2.0", features = ["derive"] } candid_parser = { version = "0.1.4" } derive_more = { version = "2.0.1", features = ["from", "into"] } From b6bfc2f8414c3f7844710fa0eacb35e5c067619f Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Mon, 20 Oct 2025 14:30:24 +0200 Subject: [PATCH 6/7] XC-502: Increase `IcError` granularity --- evm_rpc_client/src/runtime/mod.rs | 64 +++++++++++++++---------------- src/http.rs | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/evm_rpc_client/src/runtime/mod.rs b/evm_rpc_client/src/runtime/mod.rs index f28e6ffa..7b83dfb3 100644 --- a/evm_rpc_client/src/runtime/mod.rs +++ b/evm_rpc_client/src/runtime/mod.rs @@ -1,6 +1,6 @@ use async_trait::async_trait; use candid::{utils::ArgumentEncoder, CandidType, Principal}; -use ic_cdk::call::{Call, CallFailed}; +use ic_cdk::call::{Call, CallFailed, CandidDecodeFailed}; use ic_error_types::RejectCode; use serde::de::DeserializeOwned; use thiserror::Error; @@ -57,11 +57,7 @@ impl Runtime for IcRuntime { .with_cycles(cycles) .await .map_err(IcError::from) - .map(|response| { - response - .candid::() - .unwrap_or_else(|e| panic!("Failed to decode result: {e}")) - }) + .and_then(|response| response.candid::().map_err(IcError::from)) } async fn query_call( @@ -78,28 +74,13 @@ impl Runtime for IcRuntime { .with_args(&args) .await .map_err(IcError::from) - .map(|response| { - response - .candid::() - .unwrap_or_else(|e| panic!("Failed to decode result: {e}")) - }) + .and_then(|response| response.candid::().map_err(IcError::from)) } } /// Error returned by the Internet Computer when making an inter-canister call. #[derive(Error, Clone, Debug, PartialEq, Eq)] pub enum IcError { - /// The inter-canister call is rejected. - /// - /// Note that [`ic_cdk::call::Error::CallPerformFailed`] errors are also mapped to this variant - /// with an [`ic_error_types::RejectCode::SysFatal`] error code. - #[error("Error from ICP: (code {code:?}, message {message})")] - CallRejected { - /// Rejection code as specified [here](https://internetcomputer.org/docs/current/references/ic-interface-spec#reject-codes) - code: RejectCode, - /// Associated helper message. - message: String, - }, /// The liquid cycle balance is insufficient to perform the call. #[error("Insufficient liquid cycles balance, available: {available}, required: {required}")] InsufficientLiquidCycleBalance { @@ -108,11 +89,32 @@ pub enum IcError { /// The required cycles to perform the call. required: u128, }, + + /// The `ic0.call_perform` operation failed when performing the inter-canister call. + #[error("Inter-canister call perform failed")] + CallPerformFailed, + + /// The inter-canister call is rejected. + #[error("Inter-canister call rejected: {code:?} - {message})")] + CallRejected { + /// Rejection code as specified [here](https://internetcomputer.org/docs/current/references/ic-interface-spec#reject-codes) + code: RejectCode, + /// Associated helper message. + message: String, + }, + + /// The response from the inter-canister call could not be decoded as Candid. + #[error("The inter-canister call response could not be decoded: {message}")] + CandidDecodeFailed { + /// The specific Candid error that occurred. + message: String, + }, } impl From for IcError { fn from(err: CallFailed) -> Self { match err { + CallFailed::CallPerformFailed(_) => IcError::CallPerformFailed, CallFailed::CallRejected(e) => { IcError::CallRejected { // `CallRejected::reject_code()` can only return an error result if there is a @@ -124,16 +126,6 @@ impl From for IcError { message: e.reject_message().to_string(), } } - CallFailed::CallPerformFailed(e) => { - IcError::CallRejected { - // This error indicates that the `ic0.call_perform` system API returned a non-zero code. - // The only possible non-zero value (2) has the same semantics as `RejectCode::SysFatal`. - // See the IC specifications here: - // https://internetcomputer.org/docs/references/ic-interface-spec#system-api-call - code: RejectCode::SysFatal, - message: e.to_string(), - } - } CallFailed::InsufficientLiquidCycleBalance(e) => { IcError::InsufficientLiquidCycleBalance { available: e.available, @@ -143,3 +135,11 @@ impl From for IcError { } } } + +impl From for IcError { + fn from(err: CandidDecodeFailed) -> Self { + IcError::CandidDecodeFailed { + message: err.to_string(), + } + } +} diff --git a/src/http.rs b/src/http.rs index f72b60a5..1449bee8 100644 --- a/src/http.rs +++ b/src/http.rs @@ -332,7 +332,7 @@ impl From for RpcError { message, }) } - e @ HttpClientError::IcError { .. } => { + e @ HttpClientError::IcError(IcError::InsufficientLiquidCycleBalance { .. }) => { panic!("{}", e.to_string()) } HttpClientError::NotHandledError(e) => { From 59abf3729e5d7030920e8596fcb8d02437a95c38 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:09:13 +0000 Subject: [PATCH 7/7] chore: release --- Cargo.lock | 963 +++++++++++++++++++----------------- evm_rpc_client/CHANGELOG.md | 25 + evm_rpc_client/Cargo.toml | 2 +- evm_rpc_types/CHANGELOG.md | 28 ++ evm_rpc_types/Cargo.toml | 4 +- 5 files changed, 575 insertions(+), 447 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 609e638e..0a123025 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -28,9 +19,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d213580c17d239ae83c0d897ac3315db7cda83d2d4936a9823cc3517552f2e24" +checksum = "b9b151e38e42f1586a01369ec52a6934702731d07e8509a7307331b09f6c46dc" dependencies = [ "alloy-eips", "alloy-primitives", @@ -47,15 +38,16 @@ dependencies = [ "rand 0.8.5", "secp256k1", "serde", + "serde_json", "serde_with", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-consensus-any" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81443e3b8dccfeac7cd511aced15928c97ff253f4177acbb97de97178e543f6c" +checksum = "6e2d5e8668ef6215efdb7dcca6f22277b4e483a5650e05f5de22b2350971f4b8" dependencies = [ "alloy-consensus", "alloy-eips", @@ -67,9 +59,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f56873f3cac7a2c63d8e98a4314b8311aa96adb1a0f82ae923eb2119809d2c" +checksum = "3fdff496dd4e98a81f4861e66f7eaf5f2488971848bb42d9c892f871730245c8" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -91,7 +83,7 @@ dependencies = [ "alloy-rlp", "crc", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -114,14 +106,14 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-eips" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a15b4b0f6bab47aae017d52bb5a739bda381553c09fb9918b7172721ef5f5de" +checksum = "e5434834adaf64fa20a6fb90877bc1d33214c41b055cc49f82189c98614368cc" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -136,14 +128,14 @@ dependencies = [ "serde", "serde_with", "sha2", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-json-abi" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "125a1c373261b252e53e04d6e92c37d881833afc1315fceab53fd46045695640" +checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -153,9 +145,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b14fa9ba5774e0b30ae6a04176d998211d516c8af69c9c530af7c6c42a8c508" +checksum = "e58f4f345cef483eab7374f2b6056973c7419ffe8ad35e994b7a7f5d8e0c7ba4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -166,9 +158,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9485c56de23438127a731a6b4c87803d49faf1a7068dcd1d8768aca3a9edb9" +checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" dependencies = [ "alloy-rlp", "bytes", @@ -176,8 +168,8 @@ dependencies = [ "const-hex", "derive_more 2.0.1", "foldhash", - "hashbrown 0.15.5", - "indexmap 2.11.1", + "hashbrown 0.16.0", + "indexmap 2.12.0", "itoa", "k256", "keccak-asm", @@ -210,14 +202,14 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "alloy-rpc-types" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39676beaa50db545cf15447fc94ec5513b64e85a48357a0625b9a04aef08a910" +checksum = "339af7336571dd39ae3a15bde08ae6a647e62f75350bd415832640268af92c06" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -228,9 +220,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a41624eb84bc743e414198bf10eb48b611a5554d6a9fd6205f7384d57dfd7f" +checksum = "605ec375d91073851f566a3082548af69a28dca831b27a8be7c1b4c49f5c6ca2" dependencies = [ "alloy-consensus", "alloy-eips", @@ -246,9 +238,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd1e1b4dcdf13eaa96343e5c0dafc2d2e8ce5d20b90347169d46a1df0dec210" +checksum = "361cd87ead4ba7659bda8127902eda92d17fa7ceb18aba1676f7be10f7222487" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -262,14 +254,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "alloy-serde" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b3b1078b8775077525bc9fe9f6577e815ceaecd6c412a4f3b4d8aa2836e8f6" +checksum = "64600fc6c312b7e0ba76f73a381059af044f4f21f43e07f51f1fa76c868fe302" dependencies = [ "alloy-primitives", "serde", @@ -278,41 +270,41 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20d867dcf42019d4779519a1ceb55eba8d7f3d0e4f0a89bcba82b8f9eb01e48" +checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74e91b0b553c115d14bd0ed41898309356dc85d0e3d4b9014c4e7715e48c8ad" +checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.11.1", + "indexmap 2.12.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84194d31220803f5f62d0a00f583fd3a062b36382e2bea446f1af96727754565" +checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" dependencies = [ "const-hex", "dunce", @@ -320,15 +312,15 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe8c27b3cf6b2bb8361904732f955bc7c05e00be5f469cec7e2280b6167f3ff0" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", "winnow", @@ -336,9 +328,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5383d34ea00079e6dd89c652bcbdb764db160cef84e6250926961a0b2295d04" +checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -364,15 +356,15 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.30" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b5becb9c269a7d05a2f28d549f86df5a5dbc923e2667eff84fdecac8cda534c" +checksum = "f8e52276fdb553d3c11563afad2898f4085165e4093604afe3d78b69afbf408f" dependencies = [ "alloy-primitives", "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -386,9 +378,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" @@ -434,6 +426,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec 0.7.6", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -454,6 +466,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.107", +] + [[package]] name = "ark-ff-macros" version = "0.3.0" @@ -479,6 +501,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.107", +] + [[package]] name = "ark-serialize" version = "0.3.0" @@ -500,6 +535,18 @@ dependencies = [ "num-bigint", ] +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-std 0.5.0", + "arrayvec 0.7.6", + "digest 0.10.7", + "num-bigint", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -520,6 +567,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -558,7 +615,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -575,7 +632,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -595,21 +652,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base16ct" version = "0.2.0" @@ -711,9 +753,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bitvec" @@ -738,9 +780,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" dependencies = [ "cc", "glob", @@ -777,9 +819,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "2.1.1" +version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7318cfa722931cb5fe0838b98d3ce5621e75f6a6408abc21721d80de9223f2e4" +checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" dependencies = [ "blst", "cc", @@ -792,18 +834,18 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.12" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "candid" -version = "0.10.18" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae495fbaf9ee8f4f7898affbd3df85dba8598bfa4ffaca24726c42aa4beb7b1" +checksum = "8037a01ec09d6c06883a38bad4f47b8d06158ad360b841e0ae5707c9884dfaf6" dependencies = [ "anyhow", "binread", @@ -824,14 +866,14 @@ dependencies = [ [[package]] name = "candid_derive" -version = "0.10.18" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7388be3b345b1a2ad30e529619b4db0d1955852afb56da821fa6a805f7cbf6be" +checksum = "fb45f4d5eff3805598ee633dd80f8afb306c023249d34b5b7dfdc2080ea1df2e" dependencies = [ "lazy_static", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -872,7 +914,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.16", + "thiserror 2.0.17", "tower", "tower-layer", ] @@ -901,7 +943,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -921,16 +963,16 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver 1.0.26", + "semver 1.0.27", "serde", "serde_json", ] [[package]] name = "cc" -version = "1.2.36" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ "find-msvc-tools", "shlex", @@ -938,9 +980,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -957,7 +999,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -984,7 +1026,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.6.0", + "half 2.7.1", ] [[package]] @@ -994,20 +1036,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ "termcolor", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] name = "const-hex" -version = "1.15.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dccd746bf9b1038c0507b7cec21eb2b11222db96a2902c96e8c185d6d20fb9c4" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ "cfg-if", "cpufeatures", - "hex", "proptest", - "serde", + "serde_core", ] [[package]] @@ -1018,9 +1059,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] @@ -1168,7 +1209,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1183,7 +1224,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1194,7 +1235,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1205,7 +1246,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1226,12 +1267,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -1271,7 +1312,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1282,7 +1323,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "unicode-xid", ] @@ -1336,7 +1377,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1380,6 +1421,18 @@ dependencies = [ "spki", ] +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.107", +] + [[package]] name = "either" version = "1.15.0" @@ -1418,6 +1471,26 @@ dependencies = [ "log", ] +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.107", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -1440,7 +1513,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -1579,7 +1652,7 @@ dependencies = [ "serde_bytes", "serde_json", "sha2", - "thiserror 2.0.16", + "thiserror 2.0.17", "thousands", "tokio", "tower", @@ -1603,13 +1676,13 @@ dependencies = [ "serde", "serde_json", "strum 0.27.2", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", ] [[package]] name = "evm_rpc_types" -version = "2.1.0" +version = "3.0.0" dependencies = [ "alloy-consensus", "alloy-primitives", @@ -1624,7 +1697,7 @@ dependencies = [ "serde", "serde_json", "strum 0.27.2", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", ] @@ -1668,9 +1741,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "fixed-hash" @@ -1692,9 +1765,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -1708,9 +1781,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "form_urlencoded" @@ -1757,7 +1830,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -1791,9 +1864,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -1809,30 +1882,24 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.5+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "glob" version = "0.3.3" @@ -1862,7 +1929,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.1", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -1877,12 +1944,13 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -1893,9 +1961,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ "foldhash", "serde", @@ -2022,9 +2090,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -2046,9 +2114,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2092,7 +2160,7 @@ dependencies = [ "serde", "serde_bytes", "slotmap", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -2125,7 +2193,7 @@ dependencies = [ "quote", "serde", "serde_tokenstream", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2138,7 +2206,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2284,7 +2352,7 @@ dependencies = [ "serde_cbor", "serde_repr", "sha2", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -2455,7 +2523,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2471,13 +2539,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -2489,17 +2558,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -2534,6 +2592,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -2551,9 +2618,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.78" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -2621,7 +2688,7 @@ dependencies = [ "petgraph", "pico-args", "regex", - "regex-syntax 0.8.6", + "regex-syntax 0.8.8", "string_cache", "term", "tiny-keccak", @@ -2652,9 +2719,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libm" @@ -2664,9 +2731,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags", "libc", @@ -2686,11 +2753,10 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -2720,7 +2786,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2746,7 +2812,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2766,9 +2832,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -2823,7 +2889,7 @@ checksum = "512ce2c37128698ea15c99b3518936c78a8b112b92468e7b95b9fa045666ebd8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -2833,17 +2899,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -2854,11 +2921,11 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2909,9 +2976,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -2919,21 +2986,21 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "nybbles" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0418987d1aaed324d95b4beffc93635e19be965ed5d63ec07a35980fe3b71a4" +checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" dependencies = [ "alloy-rlp", "cfg-if", @@ -2943,15 +3010,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -3014,14 +3072,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -3029,15 +3087,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -3048,12 +3106,12 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", ] [[package]] @@ -3064,12 +3122,11 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", - "thiserror 2.0.16", "ucd-trie", ] @@ -3080,7 +3137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.1", + "indexmap 2.12.0", ] [[package]] @@ -3115,7 +3172,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3165,7 +3222,7 @@ dependencies = [ "strum 0.26.3", "strum_macros 0.26.4", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "tracing-appender", @@ -3205,13 +3262,13 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "pretty" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac98773b7109bc75f475ab5a134c9b64b87e59d776d31098d8f346922396a477" +checksum = "0d22152487193190344590e4f30e219cf3fe140d9e7a3fdb683d82aa2c5f4156" dependencies = [ "arrayvec 0.5.2", "typed-arena", - "unicode-width", + "unicode-width 0.2.2", ] [[package]] @@ -3230,9 +3287,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] @@ -3256,7 +3313,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3270,9 +3327,9 @@ dependencies = [ [[package]] name = "proptest" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" +checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", @@ -3282,7 +3339,7 @@ dependencies = [ "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", - "regex-syntax 0.8.6", + "regex-syntax 0.8.8", "rusty-fork", "tempfile", "unarray", @@ -3290,9 +3347,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" +checksum = "e66fcd288453b748497d8fb18bccc83a16b0518e3906d4b8df0a8d42d93dbb1c" dependencies = [ "cc", ] @@ -3317,7 +3374,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -3330,7 +3387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", @@ -3338,7 +3395,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3360,9 +3417,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -3437,7 +3494,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "serde", ] @@ -3452,9 +3509,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] @@ -3472,45 +3529,45 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.6", + "regex-syntax 0.8.8", ] [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.6", + "regex-syntax 0.8.8", ] [[package]] @@ -3521,15 +3578,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", @@ -3618,13 +3675,14 @@ dependencies = [ [[package]] name = "ruint" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecb38f82477f20c5c3d62ef52d7c4e536e38ea9b73fb570a20c5cae0e14bcf6" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" 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", @@ -3638,7 +3696,7 @@ dependencies = [ "rand 0.9.2", "rlp", "ruint-macro", - "serde", + "serde_core", "valuable", "zeroize", ] @@ -3649,12 +3707,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -3682,7 +3734,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.26", + "semver 1.0.27", ] [[package]] @@ -3695,14 +3747,14 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "751e04a496ca00bb97a5e043158d23d66b5aabf2e1d5aa2a0aaebb1aafe6f82c" dependencies = [ "once_cell", "ring", @@ -3714,9 +3766,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -3736,9 +3788,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.5" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -3753,9 +3805,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ "fnv", "quick-error", @@ -3799,7 +3851,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3808,7 +3860,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -3856,7 +3908,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3903,9 +3955,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags", "core-foundation", @@ -3935,11 +3987,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -3953,20 +4006,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -3979,15 +4034,24 @@ dependencies = [ "serde", ] +[[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.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -3998,19 +4062,20 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -4021,7 +4086,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4033,7 +4098,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4050,19 +4115,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.1", + "indexmap 2.12.0", "schemars 0.9.0", "schemars 1.0.4", - "serde", - "serde_derive", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -4070,14 +4134,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" dependencies = [ - "darling 0.20.11", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4155,6 +4219,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simple_asn1" version = "0.6.3" @@ -4163,7 +4233,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", ] @@ -4181,11 +4251,14 @@ checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slog" -version = "2.7.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" +checksum = "9b3b8565691b22d2bdfc066426ed48f837fc0c5f2c8cad8d9718f7f99d6995c1" dependencies = [ + "anyhow", "erased-serde", + "rustversion", + "serde_core", ] [[package]] @@ -4208,12 +4281,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4228,15 +4301,15 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stacker" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" +checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" dependencies = [ "cc", "cfg-if", @@ -4297,7 +4370,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4309,7 +4382,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4331,9 +4404,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b" dependencies = [ "proc-macro2", "quote", @@ -4342,14 +4415,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b198d366dbec045acfcd97295eb653a7a2b40e4dc764ef1e79aafcad439d3c" +checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4369,7 +4442,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4380,15 +4453,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.22.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -4422,11 +4495,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -4437,18 +4510,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4477,11 +4550,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", + "itoa", "num-conv", "powerfmt", "serde", @@ -4541,40 +4615,37 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -4595,18 +4666,31 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.11.1", + "indexmap 2.12.0", "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ "winnow", ] @@ -4686,7 +4770,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -4756,9 +4840,9 @@ checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" @@ -4808,6 +4892,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -4884,29 +4974,20 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.5+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" -version = "1.0.0+wasi-0.2.4" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -4917,23 +4998,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.51" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -4944,9 +5025,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4954,22 +5035,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.101" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -4989,9 +5070,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.78" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -5009,9 +5090,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] @@ -5038,7 +5119,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -5049,67 +5130,61 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.3", + "windows-link", "windows-result", "windows-strings", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[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.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -5136,16 +5211,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -5166,19 +5241,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -5189,9 +5264,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -5201,9 +5276,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -5213,9 +5288,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -5225,9 +5300,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -5237,9 +5312,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -5249,9 +5324,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -5261,9 +5336,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -5273,9 +5348,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -5288,9 +5363,9 @@ dependencies = [ [[package]] name = "wit-bindgen" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -5333,7 +5408,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "synstructure", ] @@ -5354,7 +5429,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -5374,15 +5449,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -5395,7 +5470,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] [[package]] @@ -5428,5 +5503,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.107", ] diff --git a/evm_rpc_client/CHANGELOG.md b/evm_rpc_client/CHANGELOG.md index 7b307443..6a44b4ea 100644 --- a/evm_rpc_client/CHANGELOG.md +++ b/evm_rpc_client/CHANGELOG.md @@ -5,4 +5,29 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.4.0] - 2025-10-20 + +### Added + +- Add methods to modify RPC config to `RequestBuilder` ([#494](https://github.com/dfinity/evm-rpc-canister/pull/494)) +- Add `alloy` feature flag to `evm_rpc_client` ([#484](https://github.com/dfinity/evm-rpc-canister/pull/484)) +- Add new `json_request` endpoint ([#477](https://github.com/dfinity/evm-rpc-canister/pull/477)) +- Add client support for `eth_getTransactionReceipt` ([#476](https://github.com/dfinity/evm-rpc-canister/pull/476)) +- Add `eth_sendRawTransaction` client support ([#467](https://github.com/dfinity/evm-rpc-canister/pull/467)) +- Add client support for `eth_call` ([#466](https://github.com/dfinity/evm-rpc-canister/pull/466)) +- Add client support for `eth_getTransactionCount` ([#465](https://github.com/dfinity/evm-rpc-canister/pull/465)) +- Add support for `eth_feeHistory` to client ([#460](https://github.com/dfinity/evm-rpc-canister/pull/460)) +- Add support for `eth_getBlockByNumber` to client ([#459](https://github.com/dfinity/evm-rpc-canister/pull/459)) +- Add EVM RPC canister client ([#447](https://github.com/dfinity/evm-rpc-canister/pull/447)) + +### Changed + +- Increase `IcError` granularity +- Merge branch 'main' into lpahlavi/XC-502-update-ic-cdk + +### Fixed + +- Client integration test infrastructure ([#448](https://github.com/dfinity/evm-rpc-canister/pull/448)) + + ## [Unreleased] \ No newline at end of file diff --git a/evm_rpc_client/Cargo.toml b/evm_rpc_client/Cargo.toml index d0a16640..fe852c89 100644 --- a/evm_rpc_client/Cargo.toml +++ b/evm_rpc_client/Cargo.toml @@ -31,4 +31,4 @@ evm_rpc_types = { path = "../evm_rpc_types", features = ["alloy"] } tokio = { workspace = true, features = ["full"] } [features] -alloy = ["evm_rpc_types/alloy", "dep:alloy-primitives", "dep:alloy-rpc-types"] \ No newline at end of file +alloy = ["evm_rpc_types/alloy", "dep:alloy-primitives", "dep:alloy-rpc-types"] diff --git a/evm_rpc_types/CHANGELOG.md b/evm_rpc_types/CHANGELOG.md index 215bc7dc..ae649438 100644 --- a/evm_rpc_types/CHANGELOG.md +++ b/evm_rpc_types/CHANGELOG.md @@ -2,6 +2,34 @@ All notable changes to this project will be documented in this file. +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [3.0.0] - 2025-10-20 + +### Added + +- Add `alloy` feature flag to `evm_rpc_client` ([#484](https://github.com/dfinity/evm-rpc-canister/pull/484)) +- Add client support for `eth_getTransactionReceipt` ([#476](https://github.com/dfinity/evm-rpc-canister/pull/476)) +- Add `eth_sendRawTransaction` client support ([#467](https://github.com/dfinity/evm-rpc-canister/pull/467)) +- Add support for `eth_getTransactionReceipt` response fields ([#474](https://github.com/dfinity/evm-rpc-canister/pull/474)) +- Add client support for `eth_call` ([#466](https://github.com/dfinity/evm-rpc-canister/pull/466)) +- Add client support for `eth_getTransactionCount` ([#465](https://github.com/dfinity/evm-rpc-canister/pull/465)) + +### Changed + +- Merge branch 'main' into lpahlavi/XC-502-update-ic-cdk + +### Fixed + +- Move non-alloy conversion from behind alloy feature ([#493](https://github.com/dfinity/evm-rpc-canister/pull/493)) + +[3.0.0]: https://github.com/dfinity/sol-rpc-canister/compare/2.1.0..3.0.0 + +# Changelog + +All notable changes to this project will be documented in this file. + The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/evm_rpc_types/Cargo.toml b/evm_rpc_types/Cargo.toml index e7699916..eef90695 100644 --- a/evm_rpc_types/Cargo.toml +++ b/evm_rpc_types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "evm_rpc_types" -version = "2.1.0" +version = "3.0.0" description = "Candid types for interacting with the EVM RPC canister" license = "Apache-2.0" readme = "README.md" @@ -34,4 +34,4 @@ alloy = [ "dep:alloy-consensus", "dep:alloy-primitives", "dep:alloy-rpc-types" -] \ No newline at end of file +]