From 8517b75bb6be1f3ce3f716023ff5ed4d0a679e17 Mon Sep 17 00:00:00 2001 From: Dori Medini Date: Fri, 3 Oct 2025 18:31:54 +0300 Subject: [PATCH] starknet_api: fix compiler->SNAPI contract class ABI string conversion for tests --- crates/starknet_api/src/state.rs | 7 +++- crates/starknet_api/src/test_utils.rs | 51 +++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/crates/starknet_api/src/state.rs b/crates/starknet_api/src/state.rs index 861a81751f3..5599b640582 100644 --- a/crates/starknet_api/src/state.rs +++ b/crates/starknet_api/src/state.rs @@ -25,6 +25,8 @@ use crate::core::{ use crate::deprecated_contract_class::ContractClass as DeprecatedContractClass; use crate::hash::{PoseidonHash, StarkHash}; use crate::rpc_transaction::EntryPointByType; +#[cfg(any(test, feature = "testing"))] +use crate::test_utils::py_json_dumps; use crate::{impl_from_through_intermediate, StarknetApiError, StarknetApiResult}; pub type DeclaredClasses = IndexMap; @@ -311,7 +313,10 @@ impl From for Sierra .collect(), contract_class_version: cairo_lang_contract_class.contract_class_version, entry_points_by_type: cairo_lang_contract_class.entry_points_by_type.into(), - abi: cairo_lang_contract_class.abi.map(|abi| abi.json()).unwrap_or_default(), + abi: cairo_lang_contract_class + .abi + .map(|abi| py_json_dumps(&abi).expect("ABI is valid JSON")) + .unwrap_or_default(), } } } diff --git a/crates/starknet_api/src/test_utils.rs b/crates/starknet_api/src/test_utils.rs index d2436a4bf50..1f280d797e3 100644 --- a/crates/starknet_api/src/test_utils.rs +++ b/crates/starknet_api/src/test_utils.rs @@ -212,3 +212,54 @@ impl ContractClass { ContractClass::V1((default_casm, SierraVersion::default())) } } + +/// Formats a json object in the same way that python's json.dumps() formats. +pub(crate) struct PyJsonFormatter; + +impl PyJsonFormatter { + pub(crate) fn comma() -> &'static [u8; 2] { + b", " + } + + pub(crate) fn colon() -> &'static [u8; 2] { + b": " + } +} + +impl serde_json::ser::Formatter for PyJsonFormatter { + fn begin_array_value( + &mut self, + writer: &mut W, + first: bool, + ) -> std::io::Result<()> { + if !first { + writer.write_all(Self::comma())?; + } + Ok(()) + } + + fn begin_object_key( + &mut self, + writer: &mut W, + first: bool, + ) -> std::io::Result<()> { + if !first { + writer.write_all(Self::comma())?; + } + Ok(()) + } + + fn begin_object_value( + &mut self, + writer: &mut W, + ) -> std::io::Result<()> { + writer.write_all(Self::colon()) + } +} + +pub(crate) fn py_json_dumps(value: &T) -> Result { + let mut string_buffer = vec![]; + let mut ser = serde_json::Serializer::with_formatter(&mut string_buffer, PyJsonFormatter); + value.serialize(&mut ser)?; + Ok(String::from_utf8(string_buffer).expect("serialized JSON should be valid UTF-8")) +}