starknet_devnet_server/api/models/
json_rpc_response.rs

1#[cfg(test)]
2use serde::Deserialize;
3use serde::Serialize;
4use starknet_core::CasmContractClass;
5use starknet_rs_core::types::{ContractClass as CodegenContractClass, Felt};
6use starknet_types::rpc::block::{Block, PreConfirmedBlock};
7use starknet_types::rpc::estimate_message_fee::FeeEstimateWrapper;
8use starknet_types::rpc::gas_modification::GasModification;
9use starknet_types::rpc::state::{PreConfirmedStateUpdate, StateUpdate};
10use starknet_types::rpc::transaction_receipt::TransactionReceipt;
11use starknet_types::rpc::transactions::{
12    BlockTransactionTrace, EventsChunk, L1HandlerTransactionStatus, SimulatedTransaction,
13    TransactionStatus, TransactionTrace, TransactionWithHash,
14};
15use starknet_types::starknet_api::block::BlockNumber;
16
17use crate::api::models::{
18    AbortedBlocks, AcceptedOnL1Blocks, AccountBalanceResponse, BlockHashAndNumberOutput,
19    CreatedBlock, DeclareTransactionOutput, DeployAccountTransactionOutput, DumpResponseBody,
20    FlushedMessages, IncreaseTimeResponse, MessageHash, MessagingLoadAddress, MintTokensResponse,
21    SerializableAccount, SetTimeResponse, SyncingOutput, TransactionHashOutput,
22};
23use crate::config::DevnetConfig;
24
25#[derive(Serialize)]
26#[serde(untagged)]
27#[allow(clippy::large_enum_variant)]
28pub enum JsonRpcResponse {
29    Starknet(StarknetResponse),
30    Devnet(DevnetResponse),
31    Empty,
32}
33
34impl From<StarknetResponse> for JsonRpcResponse {
35    fn from(resp: StarknetResponse) -> Self {
36        JsonRpcResponse::Starknet(resp)
37    }
38}
39
40impl From<DevnetResponse> for JsonRpcResponse {
41    fn from(resp: DevnetResponse) -> Self {
42        JsonRpcResponse::Devnet(resp)
43    }
44}
45
46#[derive(Serialize)]
47#[cfg_attr(test, derive(Deserialize))]
48#[serde(untagged)]
49#[allow(clippy::large_enum_variant)]
50pub enum StarknetResponse {
51    Block(Block),
52    PreConfirmedBlock(PreConfirmedBlock),
53    StateUpdate(StateUpdate),
54    PreConfirmedStateUpdate(PreConfirmedStateUpdate),
55    Felt(Felt),
56    Transaction(TransactionWithHash),
57    TransactionReceiptByTransactionHash(Box<TransactionReceipt>),
58    TransactionStatusByHash(TransactionStatus),
59    ContractClass(CodegenContractClass),
60    CompiledCasm(CasmContractClass),
61    BlockTransactionCount(u64),
62    Call(Vec<Felt>),
63    EstimateFee(Vec<FeeEstimateWrapper>),
64    BlockNumber(BlockNumber),
65    BlockHashAndNumber(BlockHashAndNumberOutput),
66    String(String),
67    Syncing(SyncingOutput),
68    Events(EventsChunk),
69    AddDeclareTransaction(DeclareTransactionOutput),
70    AddDeployAccountTransaction(DeployAccountTransactionOutput),
71    TransactionHash(TransactionHashOutput),
72    EstimateMessageFee(FeeEstimateWrapper),
73    SimulateTransactions(Vec<SimulatedTransaction>),
74    TraceTransaction(TransactionTrace),
75    BlockTransactionTraces(Vec<BlockTransactionTrace>),
76    MessagesStatusByL1Hash(Vec<L1HandlerTransactionStatus>),
77}
78
79#[derive(Serialize)]
80#[serde(untagged)]
81#[allow(clippy::large_enum_variant)]
82pub enum DevnetResponse {
83    MessagingContractAddress(MessagingLoadAddress),
84    FlushedMessages(FlushedMessages),
85    MessageHash(MessageHash),
86    CreatedBlock(CreatedBlock),
87    AbortedBlocks(AbortedBlocks),
88    AcceptedOnL1Blocks(AcceptedOnL1Blocks),
89    GasModification(GasModification),
90    SetTime(SetTimeResponse),
91    IncreaseTime(IncreaseTimeResponse),
92    TransactionHash(TransactionHashOutput),
93    PredeployedAccounts(Vec<SerializableAccount>),
94    AccountBalance(AccountBalanceResponse),
95    MintTokens(MintTokensResponse),
96    DevnetConfig(DevnetConfig),
97    DevnetDump(DumpResponseBody),
98}
99
100#[cfg(test)]
101mod response_tests {
102    use crate::api::error::StrictRpcResult;
103    use crate::api::models::{JsonRpcResponse, ToRpcResponseResult};
104
105    #[test]
106    fn serializing_starknet_response_empty_variant_yields_empty_json_on_conversion_to_rpc_result() {
107        assert_eq!(
108            r#"{"result":{}}"#,
109            serde_json::to_string(&StrictRpcResult::Ok(JsonRpcResponse::Empty).to_rpc_result())
110                .unwrap()
111        );
112    }
113}