|
11 | 11 | use async_trait::async_trait; |
12 | 12 | use blockifier_reexecution::state_reader::rpc_objects::BlockId; |
13 | 13 | use mockito::Server; |
| 14 | +use serde_json::{json, Map, Value}; |
14 | 15 | use starknet_api::invoke_tx_args; |
15 | 16 | use starknet_api::rpc_transaction::RpcTransaction; |
16 | 17 | use starknet_api::test_utils::invoke::rpc_invoke_tx; |
17 | 18 | use starknet_api::transaction::fields::ValidResourceBounds; |
18 | 19 | use starknet_api::transaction::InvokeTransaction; |
19 | 20 | use url::Url; |
20 | 21 |
|
21 | | -use super::virtual_snos_prover::VirtualSnosProver; |
22 | 22 | use crate::blocking_check::BlockingCheckClient; |
23 | 23 | use crate::errors::{RunnerError, VirtualSnosProverError}; |
| 24 | +use crate::proving::virtual_snos_prover::{ProveTransactionResult, VirtualSnosProver}; |
24 | 25 | use crate::running::runner::{RunnerOutput, VirtualSnosRunner}; |
25 | 26 | use crate::test_utils::resource_bounds_for_client_side_tx; |
26 | 27 |
|
@@ -124,6 +125,74 @@ async fn test_check_allowed_proceeds_to_proving() { |
124 | 125 | assert_runner_error(&result); |
125 | 126 | } |
126 | 127 |
|
| 128 | +#[tokio::test] |
| 129 | +async fn test_check_allowed_with_additional_data_proceeds_to_proving() { |
| 130 | + let mut server = Server::new_async().await; |
| 131 | + let _mock = server |
| 132 | + .mock("POST", "/") |
| 133 | + .with_status(200) |
| 134 | + .with_body( |
| 135 | + r#"{"jsonrpc":"2.0","result":{"allowed":true,"additional_data":{"signature":{"issued_at":1716579600,"sig_r":"0x1","sig_s":"0x2"}}},"id":1}"#, |
| 136 | + ) |
| 137 | + .create_async() |
| 138 | + .await; |
| 139 | + |
| 140 | + let url = Url::parse(&server.url()).unwrap(); |
| 141 | + let client = BlockingCheckClient::new(url, TEST_TIMEOUT_MILLIS, true); |
| 142 | + let prover = build_prover(MockRunner, Some(client)); |
| 143 | + |
| 144 | + // The MockRunner errors before producing a result, so the verbatim relay is |
| 145 | + // covered by the serde tests below; this confirms an allow carrying |
| 146 | + // additional_data routes to proving rather than blocking. |
| 147 | + let result = prove(&prover).await; |
| 148 | + assert_runner_error(&result); |
| 149 | +} |
| 150 | + |
| 151 | +fn sample_additional_data() -> Map<String, Value> { |
| 152 | + serde_json::from_value(json!({ |
| 153 | + "signature": { "issued_at": 1716579600, "sig_r": "0x6e6f63c8", "sig_s": "0x58a68a71" } |
| 154 | + })) |
| 155 | + .unwrap() |
| 156 | +} |
| 157 | + |
| 158 | +#[test] |
| 159 | +fn test_additional_data_relays_object_verbatim() { |
| 160 | + // The prover does not interpret additional_data; an arbitrary object, |
| 161 | + // including keys it has never heard of, round-trips unchanged. |
| 162 | + let additional_data: Map<String, Value> = |
| 163 | + serde_json::from_value(json!({ "signature": { "sig_r": "0x1" }, "future_key": [1, 2, 3] })) |
| 164 | + .unwrap(); |
| 165 | + let fixture = include_str!("../../resources/mock_proving_rpc/prove_transaction_result.json"); |
| 166 | + let mut result: ProveTransactionResult = serde_json::from_str(fixture).unwrap(); |
| 167 | + result.additional_data = Some(additional_data.clone()); |
| 168 | + |
| 169 | + let json = serde_json::to_value(&result).unwrap(); |
| 170 | + assert_eq!(json["additional_data"], Value::Object(additional_data)); |
| 171 | +} |
| 172 | + |
| 173 | +#[test] |
| 174 | +fn test_empty_additional_data_is_omitted_from_prove_result_json() { |
| 175 | + // The committed mock fixture carries no additional_data; the field must |
| 176 | + // deserialize to `None` and stay absent on re-serialization. |
| 177 | + let fixture = include_str!("../../resources/mock_proving_rpc/prove_transaction_result.json"); |
| 178 | + let result: ProveTransactionResult = serde_json::from_str(fixture).unwrap(); |
| 179 | + assert!(result.additional_data.is_none()); |
| 180 | + |
| 181 | + let json = serde_json::to_value(&result).unwrap(); |
| 182 | + // Must be absent, not serialized as `null`: `contains_key` is true for an explicit null. |
| 183 | + assert!(!json.as_object().unwrap().contains_key("additional_data")); |
| 184 | +} |
| 185 | + |
| 186 | +#[test] |
| 187 | +fn test_populated_additional_data_is_present_in_prove_result_json() { |
| 188 | + let fixture = include_str!("../../resources/mock_proving_rpc/prove_transaction_result.json"); |
| 189 | + let mut result: ProveTransactionResult = serde_json::from_str(fixture).unwrap(); |
| 190 | + result.additional_data = Some(sample_additional_data()); |
| 191 | + |
| 192 | + let json = serde_json::to_value(&result).unwrap(); |
| 193 | + assert_eq!(json["additional_data"]["signature"]["sig_r"], "0x6e6f63c8"); |
| 194 | +} |
| 195 | + |
127 | 196 | #[tokio::test] |
128 | 197 | async fn test_inconclusive_fail_open_proceeds_to_proving() { |
129 | 198 | let mut server = Server::new_async().await; |
|
0 commit comments