From ee05af81664ff67cd7851e8f46a6ba3d77b2bcb4 Mon Sep 17 00:00:00 2001 From: Vaclav Barta Date: Fri, 31 Jan 2025 14:53:35 +0100 Subject: [PATCH 1/5] registered call (with version-specific errors) --- crates/rpc/src/error.rs | 17 +++++++++++++++-- crates/rpc/src/jsonrpc/error.rs | 6 +++--- crates/rpc/src/jsonrpc/response.rs | 2 +- crates/rpc/src/v06.rs | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/crates/rpc/src/error.rs b/crates/rpc/src/error.rs index 2387533b28..240085a07e 100644 --- a/crates/rpc/src/error.rs +++ b/crates/rpc/src/error.rs @@ -120,14 +120,20 @@ pub enum ApplicationError { } impl ApplicationError { - pub fn code(&self) -> i32 { + pub fn code(&self, version: RpcVersion) -> i32 { match self { // Taken from the official starknet json rpc api. // https://github.com/starkware-libs/starknet-specs ApplicationError::FailedToReceiveTxn => 1, ApplicationError::NoTraceAvailable(_) => 10, ApplicationError::ContractNotFound => 20, - ApplicationError::EntrypointNotFound => 21, + ApplicationError::EntrypointNotFound => { + if version >= RpcVersion::V08 { + 21 + } else { + -32603 /* Custom - new code not available */ + } + } ApplicationError::BlockNotFound => 24, ApplicationError::InvalidTxnHash => 25, ApplicationError::InvalidBlockHash => 26, @@ -173,6 +179,13 @@ impl ApplicationError { pub fn message(&self, version: RpcVersion) -> String { match self { + ApplicationError::EntrypointNotFound => { + if version >= RpcVersion::V08 { + self.to_string() + } else { + "Invalid message selector".to_string() + } + } ApplicationError::InsufficientResourcesForValidate => match version { RpcVersion::V07 => "Max fee is smaller than the minimal transaction cost \ (validation plus fee transfer)" diff --git a/crates/rpc/src/jsonrpc/error.rs b/crates/rpc/src/jsonrpc/error.rs index 9f01082443..a3fd6f38de 100644 --- a/crates/rpc/src/jsonrpc/error.rs +++ b/crates/rpc/src/jsonrpc/error.rs @@ -28,7 +28,7 @@ impl PartialEq for RpcError { } impl RpcError { - pub fn code(&self) -> i32 { + pub fn code(&self, version: RpcVersion) -> i32 { // From the json-rpc specification: https://www.jsonrpc.org/specification#error_object match self { RpcError::ParseError(..) => -32700, @@ -36,7 +36,7 @@ impl RpcError { RpcError::MethodNotFound { .. } => -32601, RpcError::InvalidParams(..) => -32602, RpcError::InternalError(_) => -32603, - RpcError::ApplicationError(err) => err.code(), + RpcError::ApplicationError(err) => err.code(version), RpcError::WebsocketSubscriptionClosed { .. } => -32099, } } @@ -80,7 +80,7 @@ impl crate::dto::SerializeForVersion for RpcError { serializer: crate::dto::Serializer, ) -> Result { let mut obj = serializer.serialize_struct()?; - obj.serialize_field("code", &self.code())?; + obj.serialize_field("code", &self.code(serializer.version))?; obj.serialize_field("message", &self.message(serializer.version).as_ref())?; if let Some(data) = self.data(serializer.version) { diff --git a/crates/rpc/src/jsonrpc/response.rs b/crates/rpc/src/jsonrpc/response.rs index 3df78450dd..4028df66d3 100644 --- a/crates/rpc/src/jsonrpc/response.rs +++ b/crates/rpc/src/jsonrpc/response.rs @@ -155,7 +155,7 @@ mod tests { let expected = json!({ "jsonrpc": "2.0", "error": { - "code": parsing_err.code(), + "code": parsing_err.code(RpcVersion::V07), "message": parsing_err.message(RpcVersion::V07), "data": parsing_err.data(RpcVersion::V07), }, diff --git a/crates/rpc/src/v06.rs b/crates/rpc/src/v06.rs index 8c1ca0e652..b92eabd2e4 100644 --- a/crates/rpc/src/v06.rs +++ b/crates/rpc/src/v06.rs @@ -8,6 +8,7 @@ pub fn register_routes() -> RpcRouterBuilder { .register("starknet_addInvokeTransaction", crate::method::add_invoke_transaction) .register("starknet_blockNumber", crate::method::block_number) .register("starknet_blockHashAndNumber", crate::method::block_hash_and_number) + .register("starknet_call", crate::method::call) .register("starknet_chainId", crate::method::chain_id) .register("starknet_getClass", crate::method::get_class) .register("starknet_getClassAt", crate::method::get_class_at) From 5de563f606decb3bdd4f2217f5deb0df3a091174 Mon Sep 17 00:00:00 2001 From: Vaclav Barta Date: Fri, 31 Jan 2025 15:02:27 +0100 Subject: [PATCH 2/5] re-enabling v06 conversions which should be the same as for V07 --- crates/rpc/src/error.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/rpc/src/error.rs b/crates/rpc/src/error.rs index 240085a07e..08d1f0077a 100644 --- a/crates/rpc/src/error.rs +++ b/crates/rpc/src/error.rs @@ -187,8 +187,9 @@ impl ApplicationError { } } ApplicationError::InsufficientResourcesForValidate => match version { - RpcVersion::V07 => "Max fee is smaller than the minimal transaction cost \ - (validation plus fee transfer)" + RpcVersion::V06 | RpcVersion::V07 => "Max fee is smaller than the minimal \ + transaction cost (validation plus fee \ + transfer)" .to_string(), _ => self.to_string(), }, @@ -220,7 +221,7 @@ impl ApplicationError { ApplicationError::InsufficientAccountBalance => None, ApplicationError::ValidationFailure => None, ApplicationError::CompilationFailed { data } => match version { - RpcVersion::V07 => None, + RpcVersion::V06 | RpcVersion::V07 => None, _ => Some(json!(data)), }, ApplicationError::ContractClassSizeIsTooLarge => None, From 1f88f3dc830eac09c6cc1fc87ab9e21487b10081 Mon Sep 17 00:00:00 2001 From: Vaclav Barta Date: Fri, 31 Jan 2025 15:16:15 +0100 Subject: [PATCH 3/5] fixed test --- crates/rpc/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs index e60bd72f15..f65b147676 100644 --- a/crates/rpc/src/lib.rs +++ b/crates/rpc/src/lib.rs @@ -972,7 +972,6 @@ mod tests { "starknet_estimateFee", "starknet_estimateMessageFee", "starknet_getEvents", - "starknet_call", ], Api::HttpOnly)] // #[case::v0_6_api_websocket("/ws/rpc/v0_6", "v06/starknet_api_openrpc.json", &[], Api::WebsocketOnly)] From 978b1e79d918eb66ef76033cf2df1ae9fab6e53d Mon Sep 17 00:00:00 2001 From: Vaclav Barta Date: Fri, 31 Jan 2025 17:28:43 +0100 Subject: [PATCH 4/5] registered simulate_transactions --- crates/rpc/src/dto/simulation.rs | 20 ++++++++++++++++---- crates/rpc/src/lib.rs | 1 - crates/rpc/src/v06.rs | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/crates/rpc/src/dto/simulation.rs b/crates/rpc/src/dto/simulation.rs index 03c39ecdac..c1c32f0960 100644 --- a/crates/rpc/src/dto/simulation.rs +++ b/crates/rpc/src/dto/simulation.rs @@ -30,7 +30,10 @@ impl crate::dto::SerializeForVersion for TransactionTrace { if self.include_state_diff { serializer.serialize_field("state_diff", &trace.state_diff)?; } - serializer.serialize_field("execution_resources", &trace.execution_resources)?; + if serializer.version > RpcVersion::V06 { + serializer + .serialize_field("execution_resources", &trace.execution_resources)?; + } } pathfinder_executor::types::TransactionTrace::DeployAccount(trace) => { serializer.serialize_field("type", &"DEPLOY_ACCOUNT")?; @@ -50,7 +53,10 @@ impl crate::dto::SerializeForVersion for TransactionTrace { if self.include_state_diff { serializer.serialize_field("state_diff", &trace.state_diff)?; } - serializer.serialize_field("execution_resources", &trace.execution_resources)?; + if serializer.version > RpcVersion::V06 { + serializer + .serialize_field("execution_resources", &trace.execution_resources)?; + } } pathfinder_executor::types::TransactionTrace::Invoke(trace) => { serializer.serialize_field("type", &"INVOKE")?; @@ -65,7 +71,10 @@ impl crate::dto::SerializeForVersion for TransactionTrace { if self.include_state_diff { serializer.serialize_field("state_diff", &trace.state_diff)?; } - serializer.serialize_field("execution_resources", &trace.execution_resources)?; + if serializer.version > RpcVersion::V06 { + serializer + .serialize_field("execution_resources", &trace.execution_resources)?; + } } pathfinder_executor::types::TransactionTrace::L1Handler(trace) => { serializer.serialize_field("type", &"L1_HANDLER")?; @@ -78,7 +87,10 @@ impl crate::dto::SerializeForVersion for TransactionTrace { if self.include_state_diff { serializer.serialize_field("state_diff", &trace.state_diff)?; } - serializer.serialize_field("execution_resources", &trace.execution_resources)?; + if serializer.version > RpcVersion::V06 { + serializer + .serialize_field("execution_resources", &trace.execution_resources)?; + } } } serializer.end() diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs index f65b147676..a9373fdbdc 100644 --- a/crates/rpc/src/lib.rs +++ b/crates/rpc/src/lib.rs @@ -980,7 +980,6 @@ mod tests { "v06/starknet_trace_api_openrpc.json", &[ "starknet_traceTransaction", - "starknet_simulateTransactions", "starknet_traceBlockTransactions", ], Api::HttpOnly)] diff --git a/crates/rpc/src/v06.rs b/crates/rpc/src/v06.rs index b92eabd2e4..803aaee762 100644 --- a/crates/rpc/src/v06.rs +++ b/crates/rpc/src/v06.rs @@ -20,6 +20,7 @@ pub fn register_routes() -> RpcRouterBuilder { .register("starknet_getStorageAt", crate::method::get_storage_at) .register("starknet_getTransactionByHash", crate::method::get_transaction_by_hash) .register("starknet_getTransactionByBlockIdAndIndex", crate::method::get_transaction_by_block_id_and_index) + .register("starknet_simulateTransactions", crate::method::simulate_transactions) .register("starknet_specVersion", || "0.6.0") .register("starknet_syncing", crate::method::syncing) .register("pathfinder_getProof", crate::pathfinder::methods::get_proof) From 69a7f8581ac8f300d72c46f46b674b7926b70539 Mon Sep 17 00:00:00 2001 From: Vaclav Barta Date: Mon, 3 Feb 2025 08:55:09 +0100 Subject: [PATCH 5/5] registered trace_transaction & trace_block_transactions --- crates/rpc/src/lib.rs | 5 +---- crates/rpc/src/v06.rs | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs index a9373fdbdc..f95ba660a4 100644 --- a/crates/rpc/src/lib.rs +++ b/crates/rpc/src/lib.rs @@ -978,10 +978,7 @@ mod tests { #[case::v0_6_trace( "/rpc/v0_6", "v06/starknet_trace_api_openrpc.json", - &[ - "starknet_traceTransaction", - "starknet_traceBlockTransactions", - ], + &[], Api::HttpOnly)] // #[case::v0_6_trace_websocket("/ws/rpc/v0_6", "v06/starknet_trace_api_openrpc.json", &[], Api::WebsocketOnly)] #[case::v0_6_write("/rpc/v0_6", "v06/starknet_write_api.json", &[], Api::HttpOnly)] diff --git a/crates/rpc/src/v06.rs b/crates/rpc/src/v06.rs index 803aaee762..63618aa7fc 100644 --- a/crates/rpc/src/v06.rs +++ b/crates/rpc/src/v06.rs @@ -23,5 +23,7 @@ pub fn register_routes() -> RpcRouterBuilder { .register("starknet_simulateTransactions", crate::method::simulate_transactions) .register("starknet_specVersion", || "0.6.0") .register("starknet_syncing", crate::method::syncing) + .register("starknet_traceBlockTransactions", crate::method::trace_block_transactions) + .register("starknet_traceTransaction", crate::method::trace_transaction) .register("pathfinder_getProof", crate::pathfinder::methods::get_proof) }