starknet_core/types/
codegen.rs

1// AUTO-GENERATED CODE. DO NOT EDIT
2// To change the code generated, modify the codegen tool instead:
3//     https://github.com/xJonathanLEI/starknet-jsonrpc-codegen
4
5// Code generated with version:
6//     https://github.com/xJonathanLEI/starknet-jsonrpc-codegen#8cc23b8c0e8ae0a4c6c5ba50a20d274bc0fc9c2a
7
8// These types are ignored from code generation. Implement them manually:
9// - `RECEIPT_BLOCK`
10// - `TXN_STATUS_RESULT`
11// - `SUBSCRIPTION_BLOCK_TAG`
12
13// Code generation requested but not implemented for these types:
14// - `BLOCK_ID`
15// - `BROADCASTED_TXN`
16// - `CONFIRMED_BLOCK_ID`
17// - `CONTRACT_ABI_ENTRY`
18// - `CONTRACT_CLASS`
19// - `CONTRACT_EXECUTION_ERROR`
20// - `DECLARE_TXN`
21// - `DECLARE_TXN_CONTENT`
22// - `DEPLOY_ACCOUNT_TXN`
23// - `DEPLOY_ACCOUNT_TXN_CONTENT`
24// - `EXECUTE_INVOCATION`
25// - `INVOKE_TXN`
26// - `INVOKE_TXN_CONTENT`
27// - `MERKLE_NODE`
28// - `TRANSACTION_TRACE`
29// - `TXN`
30// - `TXN_CONTENT`
31// - `TXN_OR_HASH`
32// - `TXN_RECEIPT`
33
34#![allow(missing_docs)]
35#![allow(clippy::doc_markdown)]
36#![allow(clippy::missing_const_for_fn)]
37
38use alloc::{format, string::*, vec::*};
39
40use indexmap::IndexMap;
41use serde::{Deserialize, Deserializer, Serialize, Serializer};
42use serde_with::serde_as;
43
44use crate::serde::byte_array::base64;
45
46use super::{
47    serde_impls::{MerkleNodeMap, NumAsHex, OwnedContractExecutionError},
48    *,
49};
50
51#[cfg(target_has_atomic = "ptr")]
52pub type OwnedPtr<T> = alloc::sync::Arc<T>;
53#[cfg(not(target_has_atomic = "ptr"))]
54pub type OwnedPtr<T> = alloc::boxed::Box<T>;
55
56#[cfg(feature = "std")]
57type RandomState = std::hash::RandomState;
58#[cfg(not(feature = "std"))]
59type RandomState = foldhash::fast::RandomState;
60
61const QUERY_VERSION_OFFSET: Felt = Felt::from_raw([
62    576460752142434320,
63    18446744073709551584,
64    17407,
65    18446744073700081665,
66]);
67
68pub type BroadcastedInvokeTransaction = BroadcastedInvokeTransactionV3;
69pub type BroadcastedDeployAccountTransaction = BroadcastedDeployAccountTransactionV3;
70pub type BroadcastedDeclareTransaction = BroadcastedDeclareTransactionV3;
71
72/// An internal node whose both children are non-zero.
73#[serde_as]
74#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
75#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
76pub struct BinaryNode {
77    /// The hash of the left child
78    #[serde_as(as = "UfeHex")]
79    pub left: Felt,
80    /// The hash of the right child
81    #[serde_as(as = "UfeHex")]
82    pub right: Felt,
83}
84
85/// Block header.
86#[serde_as]
87#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
88#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
89pub struct BlockHeader {
90    /// Block hash
91    #[serde_as(as = "UfeHex")]
92    pub block_hash: Felt,
93    /// The hash of this block's parent
94    #[serde_as(as = "UfeHex")]
95    pub parent_hash: Felt,
96    /// The block number (its height)
97    pub block_number: u64,
98    /// The new global state root
99    #[serde_as(as = "UfeHex")]
100    pub new_root: Felt,
101    /// The time in which the block was created, encoded in Unix time
102    pub timestamp: u64,
103    /// The Starknet identity of the sequencer submitting this block
104    #[serde_as(as = "UfeHex")]
105    pub sequencer_address: Felt,
106    /// The price of L1 gas in the block
107    pub l1_gas_price: ResourcePrice,
108    /// The price of L2 gas in the block
109    pub l2_gas_price: ResourcePrice,
110    /// The price of L1 data gas in the block
111    pub l1_data_gas_price: ResourcePrice,
112    /// Specifies whether the data of this block is published via blob data or calldata
113    pub l1_da_mode: L1DataAvailabilityMode,
114    /// Semver of the current Starknet protocol
115    pub starknet_version: String,
116}
117
118/// Block status.
119///
120/// The status of the block.
121#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
122pub enum BlockStatus {
123    #[serde(rename = "PENDING")]
124    Pending,
125    #[serde(rename = "ACCEPTED_ON_L2")]
126    AcceptedOnL2,
127    #[serde(rename = "ACCEPTED_ON_L1")]
128    AcceptedOnL1,
129    #[serde(rename = "REJECTED")]
130    Rejected,
131}
132
133/// Block tag.
134///
135/// A tag specifying a dynamic reference to a block.
136#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
137pub enum BlockTag {
138    #[serde(rename = "latest")]
139    Latest,
140    #[serde(rename = "pending")]
141    Pending,
142}
143
144/// Block with transactions and receipts.
145///
146/// The block object.
147#[serde_as]
148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
149#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
150pub struct BlockWithReceipts {
151    /// Status
152    pub status: BlockStatus,
153    /// Block hash
154    #[serde_as(as = "UfeHex")]
155    pub block_hash: Felt,
156    /// The hash of this block's parent
157    #[serde_as(as = "UfeHex")]
158    pub parent_hash: Felt,
159    /// The block number (its height)
160    pub block_number: u64,
161    /// The new global state root
162    #[serde_as(as = "UfeHex")]
163    pub new_root: Felt,
164    /// The time in which the block was created, encoded in Unix time
165    pub timestamp: u64,
166    /// The Starknet identity of the sequencer submitting this block
167    #[serde_as(as = "UfeHex")]
168    pub sequencer_address: Felt,
169    /// The price of L1 gas in the block
170    pub l1_gas_price: ResourcePrice,
171    /// The price of L2 gas in the block
172    pub l2_gas_price: ResourcePrice,
173    /// The price of L1 data gas in the block
174    pub l1_data_gas_price: ResourcePrice,
175    /// Specifies whether the data of this block is published via blob data or calldata
176    pub l1_da_mode: L1DataAvailabilityMode,
177    /// Semver of the current Starknet protocol
178    pub starknet_version: String,
179    /// The transactions in this block
180    pub transactions: Vec<TransactionWithReceipt>,
181}
182
183/// Block with transaction hashes.
184///
185/// The block object.
186#[serde_as]
187#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
188#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
189pub struct BlockWithTxHashes {
190    /// Status
191    pub status: BlockStatus,
192    /// Block hash
193    #[serde_as(as = "UfeHex")]
194    pub block_hash: Felt,
195    /// The hash of this block's parent
196    #[serde_as(as = "UfeHex")]
197    pub parent_hash: Felt,
198    /// The block number (its height)
199    pub block_number: u64,
200    /// The new global state root
201    #[serde_as(as = "UfeHex")]
202    pub new_root: Felt,
203    /// The time in which the block was created, encoded in Unix time
204    pub timestamp: u64,
205    /// The Starknet identity of the sequencer submitting this block
206    #[serde_as(as = "UfeHex")]
207    pub sequencer_address: Felt,
208    /// The price of L1 gas in the block
209    pub l1_gas_price: ResourcePrice,
210    /// The price of L2 gas in the block
211    pub l2_gas_price: ResourcePrice,
212    /// The price of L1 data gas in the block
213    pub l1_data_gas_price: ResourcePrice,
214    /// Specifies whether the data of this block is published via blob data or calldata
215    pub l1_da_mode: L1DataAvailabilityMode,
216    /// Semver of the current Starknet protocol
217    pub starknet_version: String,
218    /// The hashes of the transactions included in this block
219    #[serde_as(as = "Vec<UfeHex>")]
220    pub transactions: Vec<Felt>,
221}
222
223/// Block with transactions.
224///
225/// The block object.
226#[serde_as]
227#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
228#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
229pub struct BlockWithTxs {
230    /// Status
231    pub status: BlockStatus,
232    /// Block hash
233    #[serde_as(as = "UfeHex")]
234    pub block_hash: Felt,
235    /// The hash of this block's parent
236    #[serde_as(as = "UfeHex")]
237    pub parent_hash: Felt,
238    /// The block number (its height)
239    pub block_number: u64,
240    /// The new global state root
241    #[serde_as(as = "UfeHex")]
242    pub new_root: Felt,
243    /// The time in which the block was created, encoded in Unix time
244    pub timestamp: u64,
245    /// The Starknet identity of the sequencer submitting this block
246    #[serde_as(as = "UfeHex")]
247    pub sequencer_address: Felt,
248    /// The price of L1 gas in the block
249    pub l1_gas_price: ResourcePrice,
250    /// The price of L2 gas in the block
251    pub l2_gas_price: ResourcePrice,
252    /// The price of L1 data gas in the block
253    pub l1_data_gas_price: ResourcePrice,
254    /// Specifies whether the data of this block is published via blob data or calldata
255    pub l1_da_mode: L1DataAvailabilityMode,
256    /// Semver of the current Starknet protocol
257    pub starknet_version: String,
258    /// The transactions in this block
259    pub transactions: Vec<Transaction>,
260}
261
262/// Broadcasted declare transaction v3.
263///
264/// Broadcasted declare contract transaction v3.
265#[derive(Debug, Clone, PartialEq, Eq)]
266pub struct BroadcastedDeclareTransactionV3 {
267    /// The address of the account contract sending the declaration transaction
268    pub sender_address: Felt,
269    /// The hash of the cairo assembly resulting from the sierra compilation
270    pub compiled_class_hash: Felt,
271    /// Signature
272    pub signature: Vec<Felt>,
273    /// Nonce
274    pub nonce: Felt,
275    /// The class to be declared
276    pub contract_class: OwnedPtr<FlattenedSierraClass>,
277    /// Resource bounds for the transaction execution
278    pub resource_bounds: ResourceBoundsMapping,
279    /// The tip for the transaction
280    pub tip: u64,
281    /// Data needed to allow the paymaster to pay for the transaction in native tokens
282    pub paymaster_data: Vec<Felt>,
283    /// Data needed to deploy the account contract from which this tx will be initiated
284    pub account_deployment_data: Vec<Felt>,
285    /// The storage domain of the account's nonce (an account has a nonce per da mode)
286    pub nonce_data_availability_mode: DataAvailabilityMode,
287    /// The storage domain of the account's balance from which fee will be charged
288    pub fee_data_availability_mode: DataAvailabilityMode,
289    /// If set to `true`, uses a query-only transaction version that's invalid for execution
290    pub is_query: bool,
291}
292
293#[derive(Debug, Clone, PartialEq, Eq)]
294pub struct BroadcastedDeployAccountTransactionV3 {
295    /// Signature
296    pub signature: Vec<Felt>,
297    /// Nonce
298    pub nonce: Felt,
299    /// The salt for the address of the deployed contract
300    pub contract_address_salt: Felt,
301    /// The parameters passed to the constructor
302    pub constructor_calldata: Vec<Felt>,
303    /// The hash of the deployed contract's class
304    pub class_hash: Felt,
305    /// Resource bounds for the transaction execution
306    pub resource_bounds: ResourceBoundsMapping,
307    /// The tip for the transaction
308    pub tip: u64,
309    /// Data needed to allow the paymaster to pay for the transaction in native tokens
310    pub paymaster_data: Vec<Felt>,
311    /// The storage domain of the account's nonce (an account has a nonce per da mode)
312    pub nonce_data_availability_mode: DataAvailabilityMode,
313    /// The storage domain of the account's balance from which fee will be charged
314    pub fee_data_availability_mode: DataAvailabilityMode,
315    /// If set to `true`, uses a query-only transaction version that's invalid for execution
316    pub is_query: bool,
317}
318
319#[derive(Debug, Clone, PartialEq, Eq)]
320pub struct BroadcastedInvokeTransactionV3 {
321    /// Sender address
322    pub sender_address: Felt,
323    /// The data expected by the account's `execute` function (in most usecases, this includes the
324    /// called contract address and a function selector)
325    pub calldata: Vec<Felt>,
326    /// Signature
327    pub signature: Vec<Felt>,
328    /// Nonce
329    pub nonce: Felt,
330    /// Resource bounds for the transaction execution
331    pub resource_bounds: ResourceBoundsMapping,
332    /// The tip for the transaction
333    pub tip: u64,
334    /// Data needed to allow the paymaster to pay for the transaction in native tokens
335    pub paymaster_data: Vec<Felt>,
336    /// Data needed to deploy the account contract from which this tx will be initiated
337    pub account_deployment_data: Vec<Felt>,
338    /// The storage domain of the account's nonce (an account has a nonce per da mode)
339    pub nonce_data_availability_mode: DataAvailabilityMode,
340    /// The storage domain of the account's balance from which fee will be charged
341    pub fee_data_availability_mode: DataAvailabilityMode,
342    /// If set to `true`, uses a query-only transaction version that's invalid for execution
343    pub is_query: bool,
344}
345
346#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
347pub enum CallType {
348    #[serde(rename = "LIBRARY_CALL")]
349    LibraryCall,
350    #[serde(rename = "CALL")]
351    Call,
352    #[serde(rename = "DELEGATE")]
353    Delegate,
354}
355
356/// Deprecated contract class.
357///
358/// The definition of a Starknet contract class.
359#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
360#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
361pub struct CompressedLegacyContractClass {
362    /// A base64 representation of the compressed program code
363    #[serde(with = "base64")]
364    pub program: Vec<u8>,
365    /// Deprecated entry points by type
366    pub entry_points_by_type: LegacyEntryPointsByType,
367    /// Contract abi
368    #[serde(skip_serializing_if = "Option::is_none")]
369    pub abi: Option<Vec<LegacyContractAbiEntry>>,
370}
371
372/// More data about the execution failure.
373#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
374#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
375pub struct ContractErrorData {
376    /// The execution trace up to the point of failure
377    pub revert_error: ContractExecutionError,
378}
379
380/// The nonce and class hash for each requested contract address, in the order in which they appear
381/// in the request. These values are needed to construct the associated leaf node.
382#[serde_as]
383#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
384#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
385pub struct ContractLeafData {
386    #[serde_as(as = "UfeHex")]
387    pub nonce: Felt,
388    #[serde_as(as = "UfeHex")]
389    pub class_hash: Felt,
390    #[serde(skip_serializing_if = "Option::is_none")]
391    #[serde_as(as = "Option<UfeHex>")]
392    pub storage_root: Option<Felt>,
393}
394
395/// Contract storage diff item.
396#[serde_as]
397#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
398#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
399pub struct ContractStorageDiffItem {
400    /// The contract address for which the storage changed
401    #[serde_as(as = "UfeHex")]
402    pub address: Felt,
403    /// The changes in the storage of the contract
404    pub storage_entries: Vec<StorageEntry>,
405}
406
407#[serde_as]
408#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
409#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
410pub struct ContractStorageKeys {
411    #[serde_as(as = "UfeHex")]
412    pub contract_address: Felt,
413    #[serde_as(as = "Vec<UfeHex>")]
414    pub storage_keys: Vec<Felt>,
415}
416
417#[serde_as]
418#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
419#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
420pub struct ContractsProof {
421    /// The nodes in the union of the paths from the contracts tree root to the requested leaves
422    #[serde_as(as = "MerkleNodeMap")]
423    pub nodes: IndexMap<Felt, MerkleNode, RandomState>,
424    pub contract_leaves_data: Vec<ContractLeafData>,
425}
426
427/// Da mode.
428///
429/// Specifies a storage domain in Starknet. Each domain has different guarantees regarding
430/// availability.
431#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
432pub enum DataAvailabilityMode {
433    #[serde(rename = "L1")]
434    L1,
435    #[serde(rename = "L2")]
436    L2,
437}
438
439/// Declare transaction receipt.
440#[derive(Debug, Clone, PartialEq, Eq)]
441pub struct DeclareTransactionReceipt {
442    /// The hash identifying the transaction
443    pub transaction_hash: Felt,
444    /// The fee that was charged by the sequencer
445    pub actual_fee: FeePayment,
446    /// Finality status of the tx
447    pub finality_status: TransactionFinalityStatus,
448    /// Messages sent
449    pub messages_sent: Vec<MsgToL1>,
450    /// The events emitted as part of this transaction
451    pub events: Vec<Event>,
452    /// The resources consumed by the transaction
453    pub execution_resources: ExecutionResources,
454    pub execution_result: ExecutionResult,
455}
456
457/// The execution trace of a declare transaction.
458#[derive(Debug, Clone, PartialEq, Eq)]
459pub struct DeclareTransactionTrace {
460    pub validate_invocation: Option<FunctionInvocation>,
461    pub fee_transfer_invocation: Option<FunctionInvocation>,
462    /// The state diffs induced by the transaction
463    pub state_diff: Option<StateDiff>,
464    /// The resources consumed by the transaction, includes both computation and data
465    pub execution_resources: ExecutionResources,
466}
467
468/// Declare contract transaction v0.
469///
470/// Declare contract transaction v0.
471#[derive(Debug, Clone, PartialEq, Eq)]
472pub struct DeclareTransactionV0 {
473    /// Transaction hash
474    pub transaction_hash: Felt,
475    /// The address of the account contract sending the declaration transaction
476    pub sender_address: Felt,
477    /// The maximal fee that can be charged for including the transaction
478    pub max_fee: Felt,
479    /// Signature
480    pub signature: Vec<Felt>,
481    /// The hash of the declared class
482    pub class_hash: Felt,
483}
484
485/// Declare txn v0.
486#[derive(Debug, Clone, PartialEq, Eq)]
487pub struct DeclareTransactionV0Content {
488    /// The address of the account contract sending the declaration transaction
489    pub sender_address: Felt,
490    /// The maximal fee that can be charged for including the transaction
491    pub max_fee: Felt,
492    /// Signature
493    pub signature: Vec<Felt>,
494    /// The hash of the declared class
495    pub class_hash: Felt,
496}
497
498/// Declare contract transaction v1.
499///
500/// Declare contract transaction v1.
501#[derive(Debug, Clone, PartialEq, Eq)]
502pub struct DeclareTransactionV1 {
503    /// Transaction hash
504    pub transaction_hash: Felt,
505    /// The address of the account contract sending the declaration transaction
506    pub sender_address: Felt,
507    /// The maximal fee that can be charged for including the transaction
508    pub max_fee: Felt,
509    /// Signature
510    pub signature: Vec<Felt>,
511    /// Nonce
512    pub nonce: Felt,
513    /// The hash of the declared class
514    pub class_hash: Felt,
515}
516
517/// Declare txn v1.
518#[derive(Debug, Clone, PartialEq, Eq)]
519pub struct DeclareTransactionV1Content {
520    /// The address of the account contract sending the declaration transaction
521    pub sender_address: Felt,
522    /// The maximal fee that can be charged for including the transaction
523    pub max_fee: Felt,
524    /// Signature
525    pub signature: Vec<Felt>,
526    /// Nonce
527    pub nonce: Felt,
528    /// The hash of the declared class
529    pub class_hash: Felt,
530}
531
532/// Declare transaction v2.
533///
534/// Declare contract transaction v2.
535#[derive(Debug, Clone, PartialEq, Eq)]
536pub struct DeclareTransactionV2 {
537    /// Transaction hash
538    pub transaction_hash: Felt,
539    /// The address of the account contract sending the declaration transaction
540    pub sender_address: Felt,
541    /// The hash of the cairo assembly resulting from the sierra compilation
542    pub compiled_class_hash: Felt,
543    /// The maximal fee that can be charged for including the transaction
544    pub max_fee: Felt,
545    /// Signature
546    pub signature: Vec<Felt>,
547    /// Nonce
548    pub nonce: Felt,
549    /// The hash of the declared class
550    pub class_hash: Felt,
551}
552
553/// Declare txn v2.
554#[derive(Debug, Clone, PartialEq, Eq)]
555pub struct DeclareTransactionV2Content {
556    /// The address of the account contract sending the declaration transaction
557    pub sender_address: Felt,
558    /// The hash of the cairo assembly resulting from the sierra compilation
559    pub compiled_class_hash: Felt,
560    /// The maximal fee that can be charged for including the transaction
561    pub max_fee: Felt,
562    /// Signature
563    pub signature: Vec<Felt>,
564    /// Nonce
565    pub nonce: Felt,
566    /// The hash of the declared class
567    pub class_hash: Felt,
568}
569
570/// Declare transaction v3.
571///
572/// Declare contract transaction v3.
573#[derive(Debug, Clone, PartialEq, Eq)]
574pub struct DeclareTransactionV3 {
575    /// Transaction hash
576    pub transaction_hash: Felt,
577    /// The address of the account contract sending the declaration transaction
578    pub sender_address: Felt,
579    /// The hash of the cairo assembly resulting from the sierra compilation
580    pub compiled_class_hash: Felt,
581    /// Signature
582    pub signature: Vec<Felt>,
583    /// Nonce
584    pub nonce: Felt,
585    /// The hash of the declared class
586    pub class_hash: Felt,
587    /// Resource bounds for the transaction execution
588    pub resource_bounds: ResourceBoundsMapping,
589    /// The tip for the transaction
590    pub tip: u64,
591    /// Data needed to allow the paymaster to pay for the transaction in native tokens
592    pub paymaster_data: Vec<Felt>,
593    /// Data needed to deploy the account contract from which this tx will be initiated
594    pub account_deployment_data: Vec<Felt>,
595    /// The storage domain of the account's nonce (an account has a nonce per da mode)
596    pub nonce_data_availability_mode: DataAvailabilityMode,
597    /// The storage domain of the account's balance from which fee will be charged
598    pub fee_data_availability_mode: DataAvailabilityMode,
599}
600
601/// Declare txn v3.
602#[derive(Debug, Clone, PartialEq, Eq)]
603pub struct DeclareTransactionV3Content {
604    /// The address of the account contract sending the declaration transaction
605    pub sender_address: Felt,
606    /// The hash of the cairo assembly resulting from the sierra compilation
607    pub compiled_class_hash: Felt,
608    /// Signature
609    pub signature: Vec<Felt>,
610    /// Nonce
611    pub nonce: Felt,
612    /// The hash of the declared class
613    pub class_hash: Felt,
614    /// Resource bounds for the transaction execution
615    pub resource_bounds: ResourceBoundsMapping,
616    /// The tip for the transaction
617    pub tip: u64,
618    /// Data needed to allow the paymaster to pay for the transaction in native tokens
619    pub paymaster_data: Vec<Felt>,
620    /// Data needed to deploy the account contract from which this tx will be initiated
621    pub account_deployment_data: Vec<Felt>,
622    /// The storage domain of the account's nonce (an account has a nonce per da mode)
623    pub nonce_data_availability_mode: DataAvailabilityMode,
624    /// The storage domain of the account's balance from which fee will be charged
625    pub fee_data_availability_mode: DataAvailabilityMode,
626}
627
628/// New classes.
629///
630/// The declared class hash and compiled class hash.
631#[serde_as]
632#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
633#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
634pub struct DeclaredClassItem {
635    /// The hash of the declared class
636    #[serde_as(as = "UfeHex")]
637    pub class_hash: Felt,
638    /// The cairo assembly hash corresponding to the declared class
639    #[serde_as(as = "UfeHex")]
640    pub compiled_class_hash: Felt,
641}
642
643/// Deploy account transaction receipt.
644#[derive(Debug, Clone, PartialEq, Eq)]
645pub struct DeployAccountTransactionReceipt {
646    /// The hash identifying the transaction
647    pub transaction_hash: Felt,
648    /// The fee that was charged by the sequencer
649    pub actual_fee: FeePayment,
650    /// Finality status of the tx
651    pub finality_status: TransactionFinalityStatus,
652    /// Messages sent
653    pub messages_sent: Vec<MsgToL1>,
654    /// The events emitted as part of this transaction
655    pub events: Vec<Event>,
656    /// The resources consumed by the transaction
657    pub execution_resources: ExecutionResources,
658    pub execution_result: ExecutionResult,
659    /// The address of the deployed contract
660    pub contract_address: Felt,
661}
662
663/// The execution trace of a deploy account transaction.
664#[derive(Debug, Clone, PartialEq, Eq)]
665pub struct DeployAccountTransactionTrace {
666    pub validate_invocation: Option<FunctionInvocation>,
667    /// The trace of the __execute__ call or constructor call, depending on the transaction type
668    /// (none for declare transactions)
669    pub constructor_invocation: FunctionInvocation,
670    pub fee_transfer_invocation: Option<FunctionInvocation>,
671    /// The state diffs induced by the transaction
672    pub state_diff: Option<StateDiff>,
673    /// The resources consumed by the transaction, includes both computation and data
674    pub execution_resources: ExecutionResources,
675}
676
677/// Deploy account transaction.
678///
679/// Deploys an account contract, charges fee from the pre-funded account addresses.
680#[derive(Debug, Clone, PartialEq, Eq)]
681pub struct DeployAccountTransactionV1 {
682    /// Transaction hash
683    pub transaction_hash: Felt,
684    /// The maximal fee that can be charged for including the transaction
685    pub max_fee: Felt,
686    /// Signature
687    pub signature: Vec<Felt>,
688    /// Nonce
689    pub nonce: Felt,
690    /// The salt for the address of the deployed contract
691    pub contract_address_salt: Felt,
692    /// The parameters passed to the constructor
693    pub constructor_calldata: Vec<Felt>,
694    /// The hash of the deployed contract's class
695    pub class_hash: Felt,
696}
697
698/// Deploy account transaction.
699///
700/// Deploys an account contract, charges fee from the pre-funded account addresses.
701#[derive(Debug, Clone, PartialEq, Eq)]
702pub struct DeployAccountTransactionV1Content {
703    /// The maximal fee that can be charged for including the transaction
704    pub max_fee: Felt,
705    /// Signature
706    pub signature: Vec<Felt>,
707    /// Nonce
708    pub nonce: Felt,
709    /// The salt for the address of the deployed contract
710    pub contract_address_salt: Felt,
711    /// The parameters passed to the constructor
712    pub constructor_calldata: Vec<Felt>,
713    /// The hash of the deployed contract's class
714    pub class_hash: Felt,
715}
716
717/// Deploy account transaction.
718///
719/// Deploys an account contract, charges fee from the pre-funded account addresses.
720#[derive(Debug, Clone, PartialEq, Eq)]
721pub struct DeployAccountTransactionV3 {
722    /// Transaction hash
723    pub transaction_hash: Felt,
724    /// Signature
725    pub signature: Vec<Felt>,
726    /// Nonce
727    pub nonce: Felt,
728    /// The salt for the address of the deployed contract
729    pub contract_address_salt: Felt,
730    /// The parameters passed to the constructor
731    pub constructor_calldata: Vec<Felt>,
732    /// The hash of the deployed contract's class
733    pub class_hash: Felt,
734    /// Resource bounds for the transaction execution
735    pub resource_bounds: ResourceBoundsMapping,
736    /// The tip for the transaction
737    pub tip: u64,
738    /// Data needed to allow the paymaster to pay for the transaction in native tokens
739    pub paymaster_data: Vec<Felt>,
740    /// The storage domain of the account's nonce (an account has a nonce per da mode)
741    pub nonce_data_availability_mode: DataAvailabilityMode,
742    /// The storage domain of the account's balance from which fee will be charged
743    pub fee_data_availability_mode: DataAvailabilityMode,
744}
745
746/// Deploy account transaction.
747///
748/// Deploys an account contract, charges fee from the pre-funded account addresses.
749#[derive(Debug, Clone, PartialEq, Eq)]
750pub struct DeployAccountTransactionV3Content {
751    /// Signature
752    pub signature: Vec<Felt>,
753    /// Nonce
754    pub nonce: Felt,
755    /// The salt for the address of the deployed contract
756    pub contract_address_salt: Felt,
757    /// The parameters passed to the constructor
758    pub constructor_calldata: Vec<Felt>,
759    /// The hash of the deployed contract's class
760    pub class_hash: Felt,
761    /// Resource bounds for the transaction execution
762    pub resource_bounds: ResourceBoundsMapping,
763    /// The tip for the transaction
764    pub tip: u64,
765    /// Data needed to allow the paymaster to pay for the transaction in native tokens
766    pub paymaster_data: Vec<Felt>,
767    /// The storage domain of the account's nonce (an account has a nonce per da mode)
768    pub nonce_data_availability_mode: DataAvailabilityMode,
769    /// The storage domain of the account's balance from which fee will be charged
770    pub fee_data_availability_mode: DataAvailabilityMode,
771}
772
773/// Deploy contract transaction.
774///
775/// The structure of a deploy transaction. Note that this transaction type is deprecated and will no
776/// longer be supported in future versions.
777#[derive(Debug, Clone, PartialEq, Eq)]
778pub struct DeployTransaction {
779    /// Transaction hash
780    pub transaction_hash: Felt,
781    /// Version of the transaction scheme
782    pub version: Felt,
783    /// The salt for the address of the deployed contract
784    pub contract_address_salt: Felt,
785    /// The parameters passed to the constructor
786    pub constructor_calldata: Vec<Felt>,
787    /// The hash of the deployed contract's class
788    pub class_hash: Felt,
789}
790
791/// Deploy txn.
792#[derive(Debug, Clone, PartialEq, Eq)]
793pub struct DeployTransactionContent {
794    /// Version of the transaction scheme
795    pub version: Felt,
796    /// The salt for the address of the deployed contract
797    pub contract_address_salt: Felt,
798    /// The parameters passed to the constructor
799    pub constructor_calldata: Vec<Felt>,
800    /// The hash of the deployed contract's class
801    pub class_hash: Felt,
802}
803
804/// Deploy transaction receipt.
805#[derive(Debug, Clone, PartialEq, Eq)]
806pub struct DeployTransactionReceipt {
807    /// The hash identifying the transaction
808    pub transaction_hash: Felt,
809    /// The fee that was charged by the sequencer
810    pub actual_fee: FeePayment,
811    /// Finality status of the tx
812    pub finality_status: TransactionFinalityStatus,
813    /// Messages sent
814    pub messages_sent: Vec<MsgToL1>,
815    /// The events emitted as part of this transaction
816    pub events: Vec<Event>,
817    /// The resources consumed by the transaction
818    pub execution_resources: ExecutionResources,
819    pub execution_result: ExecutionResult,
820    /// The address of the deployed contract
821    pub contract_address: Felt,
822}
823
824/// Deployed contract item.
825#[serde_as]
826#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
827#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
828pub struct DeployedContractItem {
829    /// The address of the contract
830    #[serde_as(as = "UfeHex")]
831    pub address: Felt,
832    /// The hash of the contract code
833    #[serde_as(as = "UfeHex")]
834    pub class_hash: Felt,
835}
836
837/// Represents a path to the highest non-zero descendant node.
838#[serde_as]
839#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
840#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
841pub struct EdgeNode {
842    /// An integer whose binary representation represents the path from the current node to its
843    /// highest non-zero descendant (bounded by 2^251)
844    #[serde_as(as = "UfeHex")]
845    pub path: Felt,
846    /// The length of the path (bounded by 251)
847    pub length: u64,
848    /// The hash of the unique non-zero maximal-height descendant node
849    #[serde_as(as = "UfeHex")]
850    pub child: Felt,
851}
852
853/// Emitted event.
854///
855/// Event information decorated with metadata on where it was emitted / an event emitted as a result
856/// of transaction execution.
857#[serde_as]
858#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
859#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
860pub struct EmittedEvent {
861    /// From address
862    #[serde_as(as = "UfeHex")]
863    pub from_address: Felt,
864    /// Keys
865    #[serde_as(as = "Vec<UfeHex>")]
866    pub keys: Vec<Felt>,
867    /// Data
868    #[serde_as(as = "Vec<UfeHex>")]
869    pub data: Vec<Felt>,
870    /// The hash of the block in which the event was emitted
871    #[serde(skip_serializing_if = "Option::is_none")]
872    #[serde_as(as = "Option<UfeHex>")]
873    pub block_hash: Option<Felt>,
874    /// The number of the block in which the event was emitted
875    #[serde(skip_serializing_if = "Option::is_none")]
876    pub block_number: Option<u64>,
877    /// The transaction that emitted the event
878    #[serde_as(as = "UfeHex")]
879    pub transaction_hash: Felt,
880}
881
882#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
883pub enum EntryPointType {
884    #[serde(rename = "EXTERNAL")]
885    External,
886    #[serde(rename = "L1_HANDLER")]
887    L1Handler,
888    #[serde(rename = "CONSTRUCTOR")]
889    Constructor,
890}
891
892/// Entry points by type.
893#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
894#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
895pub struct EntryPointsByType {
896    /// Constructor
897    #[serde(rename = "CONSTRUCTOR")]
898    pub constructor: Vec<SierraEntryPoint>,
899    /// External
900    #[serde(rename = "EXTERNAL")]
901    pub external: Vec<SierraEntryPoint>,
902    /// L1 handler
903    #[serde(rename = "L1_HANDLER")]
904    pub l1_handler: Vec<SierraEntryPoint>,
905}
906
907/// Event.
908///
909/// A Starknet event.
910#[serde_as]
911#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
912#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
913pub struct Event {
914    /// From address
915    #[serde_as(as = "UfeHex")]
916    pub from_address: Felt,
917    /// Keys
918    #[serde_as(as = "Vec<UfeHex>")]
919    pub keys: Vec<Felt>,
920    /// Data
921    #[serde_as(as = "Vec<UfeHex>")]
922    pub data: Vec<Felt>,
923}
924
925/// Event filter.
926///
927/// An event filter/query.
928#[serde_as]
929#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
930#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
931pub struct EventFilter {
932    /// From block
933    #[serde(skip_serializing_if = "Option::is_none")]
934    pub from_block: Option<BlockId>,
935    /// To block
936    #[serde(skip_serializing_if = "Option::is_none")]
937    pub to_block: Option<BlockId>,
938    /// From contract
939    #[serde(skip_serializing_if = "Option::is_none")]
940    #[serde_as(as = "Option<UfeHex>")]
941    pub address: Option<Felt>,
942    /// The keys to filter over
943    #[serde(skip_serializing_if = "Option::is_none")]
944    #[serde_as(as = "Option<Vec<Vec<UfeHex>>>")]
945    pub keys: Option<Vec<Vec<Felt>>>,
946}
947
948/// Events request.
949#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
950#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
951pub struct EventFilterWithPage {
952    #[serde(flatten)]
953    pub event_filter: EventFilter,
954    #[serde(flatten)]
955    pub result_page_request: ResultPageRequest,
956}
957
958/// Events chunk.
959#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
960#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
961pub struct EventsChunk {
962    /// Matching events
963    pub events: Vec<EmittedEvent>,
964    /// Use this token in a subsequent query to obtain the next page. Should not appear if there are
965    /// no more pages.
966    #[serde(skip_serializing_if = "Option::is_none")]
967    pub continuation_token: Option<String>,
968}
969
970/// Execution resources.
971///
972/// The resources consumed by the transaction.
973#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
974#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
975pub struct ExecutionResources {
976    /// L1 gas consumed by this transaction, used for L2-->L1 messages and state updates if blobs
977    /// are not used
978    pub l1_gas: u64,
979    /// Data gas consumed by this transaction, 0 if blobs are not used
980    pub l1_data_gas: u64,
981    /// L2 gas consumed by this transaction, used for computation and calldata
982    pub l2_gas: u64,
983}
984
985/// Fee estimation.
986#[serde_as]
987#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
988#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
989pub struct FeeEstimate {
990    /// The Ethereum gas consumption of the transaction, charged for L1->L2 messages and, depending
991    /// on the block's da_mode, state diffs
992    #[serde_as(as = "NumAsHex")]
993    pub l1_gas_consumed: u64,
994    /// The gas price (in wei or fri, depending on the tx version) that was used in the cost
995    /// estimation
996    #[serde_as(as = "NumAsHex")]
997    pub l1_gas_price: u128,
998    /// The L2 gas consumption of the transaction
999    #[serde_as(as = "NumAsHex")]
1000    pub l2_gas_consumed: u64,
1001    /// The L2 gas price (in wei or fri, depending on the tx version) that was used in the cost
1002    /// estimation
1003    #[serde_as(as = "NumAsHex")]
1004    pub l2_gas_price: u128,
1005    /// The Ethereum data gas consumption of the transaction
1006    #[serde_as(as = "NumAsHex")]
1007    pub l1_data_gas_consumed: u64,
1008    /// The data gas price (in wei or fri, depending on the tx version) that was used in the cost
1009    /// estimation
1010    #[serde_as(as = "NumAsHex")]
1011    pub l1_data_gas_price: u128,
1012    /// The estimated fee for the transaction (in wei or fri, depending on the tx version), equals
1013    /// to l1_gas_consumed*l1_gas_price + l1_data_gas_consumed*l1_data_gas_price +
1014    /// l2_gas_consumed*l2_gas_price
1015    #[serde_as(as = "NumAsHex")]
1016    pub overall_fee: u128,
1017    /// Units in which the fee is given
1018    pub unit: PriceUnit,
1019}
1020
1021/// Fee payment.
1022///
1023/// Fee payment info as it appears in receipts.
1024#[serde_as]
1025#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1026#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1027pub struct FeePayment {
1028    /// Amount paid
1029    #[serde_as(as = "UfeHex")]
1030    pub amount: Felt,
1031    /// Units in which the fee is given
1032    pub unit: PriceUnit,
1033}
1034
1035/// The definition of a sierra Starknet contract class.
1036#[serde_as]
1037#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1038#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1039pub struct FlattenedSierraClass {
1040    /// The list of sierra instructions of which the program consists
1041    #[serde_as(as = "Vec<UfeHex>")]
1042    pub sierra_program: Vec<Felt>,
1043    /// The version of the contract class object. Currently, the Starknet os supports version 0.1.0
1044    pub contract_class_version: String,
1045    /// Entry points by type
1046    pub entry_points_by_type: EntryPointsByType,
1047    /// The class abi, as supplied by the user declaring the class
1048    pub abi: String,
1049}
1050
1051/// Function call.
1052///
1053/// Function call information.
1054#[serde_as]
1055#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1056#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1057pub struct FunctionCall {
1058    /// Contract address
1059    #[serde_as(as = "UfeHex")]
1060    pub contract_address: Felt,
1061    /// Entry point selector
1062    #[serde_as(as = "UfeHex")]
1063    pub entry_point_selector: Felt,
1064    /// The parameters passed to the function
1065    #[serde_as(as = "Vec<UfeHex>")]
1066    pub calldata: Vec<Felt>,
1067}
1068
1069#[serde_as]
1070#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1071#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1072pub struct FunctionInvocation {
1073    /// Contract address
1074    #[serde_as(as = "UfeHex")]
1075    pub contract_address: Felt,
1076    /// Entry point selector
1077    #[serde_as(as = "UfeHex")]
1078    pub entry_point_selector: Felt,
1079    /// The parameters passed to the function
1080    #[serde_as(as = "Vec<UfeHex>")]
1081    pub calldata: Vec<Felt>,
1082    /// The address of the invoking contract. 0 for the root invocation
1083    #[serde_as(as = "UfeHex")]
1084    pub caller_address: Felt,
1085    /// The hash of the class being called
1086    #[serde_as(as = "UfeHex")]
1087    pub class_hash: Felt,
1088    pub entry_point_type: EntryPointType,
1089    pub call_type: CallType,
1090    /// The value returned from the function invocation
1091    #[serde_as(as = "Vec<UfeHex>")]
1092    pub result: Vec<Felt>,
1093    /// The calls made by this invocation
1094    pub calls: Vec<FunctionInvocation>,
1095    /// The events emitted in this invocation
1096    pub events: Vec<OrderedEvent>,
1097    /// The messages sent by this invocation to L1
1098    pub messages: Vec<OrderedMessage>,
1099    /// Resources consumed by the call tree rooted at this given call (including the root)
1100    pub execution_resources: InnerCallExecutionResources,
1101    /// True if this inner call panicked
1102    pub is_reverted: bool,
1103}
1104
1105/// Function state mutability type.
1106#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1107pub enum FunctionStateMutability {
1108    #[serde(rename = "view")]
1109    View,
1110}
1111
1112#[serde_as]
1113#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1114#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1115pub struct GlobalRoots {
1116    #[serde_as(as = "UfeHex")]
1117    pub contracts_tree_root: Felt,
1118    #[serde_as(as = "UfeHex")]
1119    pub classes_tree_root: Felt,
1120    /// The associated block hash (needed in case the caller used a block tag for the block_id
1121    /// parameter)
1122    #[serde_as(as = "UfeHex")]
1123    pub block_hash: Felt,
1124}
1125
1126/// Execution resources.
1127///
1128/// The resources consumed by an inner call (does not account for state diffs since data is squashed
1129/// across the transaction).
1130#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1131#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1132pub struct InnerCallExecutionResources {
1133    /// L1 gas consumed by this transaction, used for L2-->L1 messages and state updates if blobs
1134    /// are not used
1135    pub l1_gas: u64,
1136    /// L2 gas consumed by this transaction, used for computation and calldata
1137    pub l2_gas: u64,
1138}
1139
1140#[serde_as]
1141#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1142#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1143pub struct InnerContractExecutionError {
1144    #[serde_as(as = "UfeHex")]
1145    pub contract_address: Felt,
1146    #[serde_as(as = "UfeHex")]
1147    pub class_hash: Felt,
1148    #[serde_as(as = "UfeHex")]
1149    pub selector: Felt,
1150    #[serde_as(as = "OwnedContractExecutionError")]
1151    pub error: OwnedPtr<ContractExecutionError>,
1152}
1153
1154/// Invoke transaction receipt.
1155#[derive(Debug, Clone, PartialEq, Eq)]
1156pub struct InvokeTransactionReceipt {
1157    /// The hash identifying the transaction
1158    pub transaction_hash: Felt,
1159    /// The fee that was charged by the sequencer
1160    pub actual_fee: FeePayment,
1161    /// Finality status of the tx
1162    pub finality_status: TransactionFinalityStatus,
1163    /// Messages sent
1164    pub messages_sent: Vec<MsgToL1>,
1165    /// The events emitted as part of this transaction
1166    pub events: Vec<Event>,
1167    /// The resources consumed by the transaction
1168    pub execution_resources: ExecutionResources,
1169    pub execution_result: ExecutionResult,
1170}
1171
1172/// The execution trace of an invoke transaction.
1173#[derive(Debug, Clone, PartialEq, Eq)]
1174pub struct InvokeTransactionTrace {
1175    pub validate_invocation: Option<FunctionInvocation>,
1176    pub execute_invocation: ExecuteInvocation,
1177    pub fee_transfer_invocation: Option<FunctionInvocation>,
1178    /// The state diffs induced by the transaction
1179    pub state_diff: Option<StateDiff>,
1180    /// The resources consumed by the transaction, includes both computation and data
1181    pub execution_resources: ExecutionResources,
1182}
1183
1184/// Invoke transaction v0.
1185///
1186/// Invokes a specific function in the desired contract (not necessarily an account).
1187#[derive(Debug, Clone, PartialEq, Eq)]
1188pub struct InvokeTransactionV0 {
1189    /// Transaction hash
1190    pub transaction_hash: Felt,
1191    /// The maximal fee that can be charged for including the transaction
1192    pub max_fee: Felt,
1193    /// Signature
1194    pub signature: Vec<Felt>,
1195    /// Contract address
1196    pub contract_address: Felt,
1197    /// Entry point selector
1198    pub entry_point_selector: Felt,
1199    /// The parameters passed to the function
1200    pub calldata: Vec<Felt>,
1201}
1202
1203/// Invoke transaction v0.
1204///
1205/// Invokes a specific function in the desired contract (not necessarily an account).
1206#[derive(Debug, Clone, PartialEq, Eq)]
1207pub struct InvokeTransactionV0Content {
1208    /// The maximal fee that can be charged for including the transaction
1209    pub max_fee: Felt,
1210    /// Signature
1211    pub signature: Vec<Felt>,
1212    /// Contract address
1213    pub contract_address: Felt,
1214    /// Entry point selector
1215    pub entry_point_selector: Felt,
1216    /// The parameters passed to the function
1217    pub calldata: Vec<Felt>,
1218}
1219
1220/// Invoke transaction v1.
1221///
1222/// Initiates a transaction from a given account.
1223#[derive(Debug, Clone, PartialEq, Eq)]
1224pub struct InvokeTransactionV1 {
1225    /// Transaction hash
1226    pub transaction_hash: Felt,
1227    /// Sender address
1228    pub sender_address: Felt,
1229    /// The data expected by the account's `execute` function (in most usecases, this includes the
1230    /// called contract address and a function selector)
1231    pub calldata: Vec<Felt>,
1232    /// The maximal fee that can be charged for including the transaction
1233    pub max_fee: Felt,
1234    /// Signature
1235    pub signature: Vec<Felt>,
1236    /// Nonce
1237    pub nonce: Felt,
1238}
1239
1240/// Invoke transaction v1.
1241///
1242/// Initiates a transaction from a given account.
1243#[derive(Debug, Clone, PartialEq, Eq)]
1244pub struct InvokeTransactionV1Content {
1245    /// Sender address
1246    pub sender_address: Felt,
1247    /// The data expected by the account's `execute` function (in most usecases, this includes the
1248    /// called contract address and a function selector)
1249    pub calldata: Vec<Felt>,
1250    /// The maximal fee that can be charged for including the transaction
1251    pub max_fee: Felt,
1252    /// Signature
1253    pub signature: Vec<Felt>,
1254    /// Nonce
1255    pub nonce: Felt,
1256}
1257
1258/// Invoke transaction v3.
1259///
1260/// Initiates a transaction from a given account.
1261#[derive(Debug, Clone, PartialEq, Eq)]
1262pub struct InvokeTransactionV3 {
1263    /// Transaction hash
1264    pub transaction_hash: Felt,
1265    /// Sender address
1266    pub sender_address: Felt,
1267    /// The data expected by the account's `execute` function (in most usecases, this includes the
1268    /// called contract address and a function selector)
1269    pub calldata: Vec<Felt>,
1270    /// Signature
1271    pub signature: Vec<Felt>,
1272    /// Nonce
1273    pub nonce: Felt,
1274    /// Resource bounds for the transaction execution
1275    pub resource_bounds: ResourceBoundsMapping,
1276    /// The tip for the transaction
1277    pub tip: u64,
1278    /// Data needed to allow the paymaster to pay for the transaction in native tokens
1279    pub paymaster_data: Vec<Felt>,
1280    /// Data needed to deploy the account contract from which this tx will be initiated
1281    pub account_deployment_data: Vec<Felt>,
1282    /// The storage domain of the account's nonce (an account has a nonce per da mode)
1283    pub nonce_data_availability_mode: DataAvailabilityMode,
1284    /// The storage domain of the account's balance from which fee will be charged
1285    pub fee_data_availability_mode: DataAvailabilityMode,
1286}
1287
1288/// Invoke transaction v3.
1289///
1290/// Initiates a transaction from a given account.
1291#[derive(Debug, Clone, PartialEq, Eq)]
1292pub struct InvokeTransactionV3Content {
1293    /// Sender address
1294    pub sender_address: Felt,
1295    /// The data expected by the account's `execute` function (in most usecases, this includes the
1296    /// called contract address and a function selector)
1297    pub calldata: Vec<Felt>,
1298    /// Signature
1299    pub signature: Vec<Felt>,
1300    /// Nonce
1301    pub nonce: Felt,
1302    /// Resource bounds for the transaction execution
1303    pub resource_bounds: ResourceBoundsMapping,
1304    /// The tip for the transaction
1305    pub tip: u64,
1306    /// Data needed to allow the paymaster to pay for the transaction in native tokens
1307    pub paymaster_data: Vec<Felt>,
1308    /// Data needed to deploy the account contract from which this tx will be initiated
1309    pub account_deployment_data: Vec<Felt>,
1310    /// The storage domain of the account's nonce (an account has a nonce per da mode)
1311    pub nonce_data_availability_mode: DataAvailabilityMode,
1312    /// The storage domain of the account's balance from which fee will be charged
1313    pub fee_data_availability_mode: DataAvailabilityMode,
1314}
1315
1316/// L1 da mode.
1317#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1318pub enum L1DataAvailabilityMode {
1319    #[serde(rename = "BLOB")]
1320    Blob,
1321    #[serde(rename = "CALLDATA")]
1322    Calldata,
1323}
1324
1325/// L1 handler transaction.
1326///
1327/// A call to an l1_handler on an L2 contract induced by a message from L1.
1328#[derive(Debug, Clone, PartialEq, Eq)]
1329pub struct L1HandlerTransaction {
1330    /// Transaction hash
1331    pub transaction_hash: Felt,
1332    /// Version of the transaction scheme
1333    pub version: Felt,
1334    /// The L1->L2 message nonce field of the sn core L1 contract at the time the transaction was
1335    /// sent
1336    pub nonce: u64,
1337    /// Contract address
1338    pub contract_address: Felt,
1339    /// Entry point selector
1340    pub entry_point_selector: Felt,
1341    /// The parameters passed to the function
1342    pub calldata: Vec<Felt>,
1343}
1344
1345/// L1 handler transaction.
1346///
1347/// A call to an l1_handler on an L2 contract induced by a message from L1.
1348#[derive(Debug, Clone, PartialEq, Eq)]
1349pub struct L1HandlerTransactionContent {
1350    /// Version of the transaction scheme
1351    pub version: Felt,
1352    /// The L1->L2 message nonce field of the sn core L1 contract at the time the transaction was
1353    /// sent
1354    pub nonce: u64,
1355    /// Contract address
1356    pub contract_address: Felt,
1357    /// Entry point selector
1358    pub entry_point_selector: Felt,
1359    /// The parameters passed to the function
1360    pub calldata: Vec<Felt>,
1361}
1362
1363/// L1 handler transaction receipt.
1364///
1365/// Receipt for L1 handler transaction.
1366#[derive(Debug, Clone, PartialEq, Eq)]
1367pub struct L1HandlerTransactionReceipt {
1368    /// The message hash as it appears on the L1 core contract
1369    pub message_hash: Hash256,
1370    /// The hash identifying the transaction
1371    pub transaction_hash: Felt,
1372    /// The fee that was charged by the sequencer
1373    pub actual_fee: FeePayment,
1374    /// Finality status of the tx
1375    pub finality_status: TransactionFinalityStatus,
1376    /// Messages sent
1377    pub messages_sent: Vec<MsgToL1>,
1378    /// The events emitted as part of this transaction
1379    pub events: Vec<Event>,
1380    /// The resources consumed by the transaction
1381    pub execution_resources: ExecutionResources,
1382    pub execution_result: ExecutionResult,
1383}
1384
1385/// The execution trace of an L1 handler transaction.
1386#[derive(Debug, Clone, PartialEq, Eq)]
1387pub struct L1HandlerTransactionTrace {
1388    /// The trace of the __execute__ call or constructor call, depending on the transaction type
1389    /// (none for declare transactions)
1390    pub function_invocation: FunctionInvocation,
1391    /// The state diffs induced by the transaction
1392    pub state_diff: Option<StateDiff>,
1393    /// The resources consumed by the transaction, includes both computation and data
1394    pub execution_resources: ExecutionResources,
1395}
1396
1397/// Deprecated cairo entry point.
1398#[serde_as]
1399#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1400#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1401pub struct LegacyContractEntryPoint {
1402    /// The offset of the entry point in the program
1403    #[serde_as(as = "NumAsHex")]
1404    pub offset: u64,
1405    /// A unique identifier of the entry point (function) in the program
1406    #[serde_as(as = "UfeHex")]
1407    pub selector: Felt,
1408}
1409
1410/// Deprecated entry points by type.
1411#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1412#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1413pub struct LegacyEntryPointsByType {
1414    /// Deprecated constructor
1415    #[serde(rename = "CONSTRUCTOR")]
1416    pub constructor: Vec<LegacyContractEntryPoint>,
1417    /// Deprecated external
1418    #[serde(rename = "EXTERNAL")]
1419    pub external: Vec<LegacyContractEntryPoint>,
1420    /// Deprecated L1 handler
1421    #[serde(rename = "L1_HANDLER")]
1422    pub l1_handler: Vec<LegacyContractEntryPoint>,
1423}
1424
1425/// Event abi entry.
1426#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1427#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1428pub struct LegacyEventAbiEntry {
1429    /// Event abi type
1430    pub r#type: LegacyEventAbiType,
1431    /// The event name
1432    pub name: String,
1433    /// Typed parameter
1434    pub keys: Vec<LegacyTypedParameter>,
1435    /// Typed parameter
1436    pub data: Vec<LegacyTypedParameter>,
1437}
1438
1439/// Event abi type.
1440#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1441pub enum LegacyEventAbiType {
1442    #[serde(rename = "event")]
1443    Event,
1444}
1445
1446/// Function abi entry.
1447#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1448#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1449pub struct LegacyFunctionAbiEntry {
1450    /// Function abi type
1451    pub r#type: LegacyFunctionAbiType,
1452    /// The function name
1453    pub name: String,
1454    /// Typed parameter
1455    pub inputs: Vec<LegacyTypedParameter>,
1456    /// Typed parameter
1457    pub outputs: Vec<LegacyTypedParameter>,
1458    /// Function state mutability
1459    #[serde(skip_serializing_if = "Option::is_none")]
1460    #[serde(rename = "stateMutability")]
1461    pub state_mutability: Option<FunctionStateMutability>,
1462}
1463
1464/// Function abi type.
1465#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1466pub enum LegacyFunctionAbiType {
1467    #[serde(rename = "function")]
1468    Function,
1469    #[serde(rename = "l1_handler")]
1470    L1Handler,
1471    #[serde(rename = "constructor")]
1472    Constructor,
1473}
1474
1475/// Struct abi entry.
1476#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1477#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1478pub struct LegacyStructAbiEntry {
1479    /// Struct abi type
1480    pub r#type: LegacyStructAbiType,
1481    /// The struct name
1482    pub name: String,
1483    /// Size
1484    pub size: u64,
1485    /// Members
1486    pub members: Vec<LegacyStructMember>,
1487}
1488
1489/// Struct abi type.
1490#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1491pub enum LegacyStructAbiType {
1492    #[serde(rename = "struct")]
1493    Struct,
1494}
1495
1496/// Struct member.
1497#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1498#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1499pub struct LegacyStructMember {
1500    /// The parameter's name
1501    pub name: String,
1502    /// The parameter's type
1503    pub r#type: String,
1504    /// Offset of this property within the struct
1505    pub offset: u64,
1506}
1507
1508/// Typed parameter.
1509#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1510#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1511pub struct LegacyTypedParameter {
1512    /// The parameter's name
1513    pub name: String,
1514    /// The parameter's type
1515    pub r#type: String,
1516}
1517
1518/// Message from L1.
1519#[serde_as]
1520#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1521#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1522pub struct MsgFromL1 {
1523    /// The address of the L1 contract sending the message
1524    pub from_address: EthAddress,
1525    /// The target L2 address the message is sent to
1526    #[serde_as(as = "UfeHex")]
1527    pub to_address: Felt,
1528    /// The selector of the l1_handler in invoke in the target contract
1529    #[serde_as(as = "UfeHex")]
1530    pub entry_point_selector: Felt,
1531    /// The payload of the message
1532    #[serde_as(as = "Vec<UfeHex>")]
1533    pub payload: Vec<Felt>,
1534}
1535
1536/// Message to L1.
1537#[serde_as]
1538#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1539#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1540pub struct MsgToL1 {
1541    /// The address of the L2 contract sending the message
1542    #[serde_as(as = "UfeHex")]
1543    pub from_address: Felt,
1544    /// The target L1 address the message is sent to
1545    #[serde_as(as = "UfeHex")]
1546    pub to_address: Felt,
1547    /// The payload of the message
1548    #[serde_as(as = "Vec<UfeHex>")]
1549    pub payload: Vec<Felt>,
1550}
1551
1552/// New transaction status.
1553#[serde_as]
1554#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1555#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1556pub struct NewTransactionStatus {
1557    #[serde_as(as = "UfeHex")]
1558    pub transaction_hash: Felt,
1559    pub status: TransactionStatus,
1560}
1561
1562/// Extra information on why trace is not available. Either it wasn't executed yet (received), or
1563/// the transaction failed (rejected).
1564#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1565#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1566pub struct NoTraceAvailableErrorData {
1567    pub status: SequencerTransactionStatus,
1568}
1569
1570/// Nonce update.
1571///
1572/// The updated nonce per contract address.
1573#[serde_as]
1574#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1575#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1576pub struct NonceUpdate {
1577    /// The address of the contract
1578    #[serde_as(as = "UfeHex")]
1579    pub contract_address: Felt,
1580    /// The nonce for the given address at the end of the block
1581    #[serde_as(as = "UfeHex")]
1582    pub nonce: Felt,
1583}
1584
1585/// Orderedevent.
1586///
1587/// An event alongside its order within the transaction.
1588#[serde_as]
1589#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1590#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1591pub struct OrderedEvent {
1592    /// The order of the event within the transaction
1593    pub order: u64,
1594    /// Keys
1595    #[serde_as(as = "Vec<UfeHex>")]
1596    pub keys: Vec<Felt>,
1597    /// Data
1598    #[serde_as(as = "Vec<UfeHex>")]
1599    pub data: Vec<Felt>,
1600}
1601
1602/// Orderedmessage.
1603///
1604/// A message alongside its order within the transaction.
1605#[serde_as]
1606#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1607#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1608pub struct OrderedMessage {
1609    /// The order of the message within the transaction
1610    pub order: u64,
1611    /// The address of the L2 contract sending the message
1612    #[serde_as(as = "UfeHex")]
1613    pub from_address: Felt,
1614    /// The target L1 address the message is sent to
1615    #[serde_as(as = "UfeHex")]
1616    pub to_address: Felt,
1617    /// The payload of the message
1618    #[serde_as(as = "Vec<UfeHex>")]
1619    pub payload: Vec<Felt>,
1620}
1621
1622/// Pending block with transactions and receipts.
1623///
1624/// The dynamic block being constructed by the sequencer. Note that this object will be deprecated
1625/// upon decentralization.
1626#[serde_as]
1627#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1628#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1629pub struct PendingBlockWithReceipts {
1630    /// The transactions in this block
1631    pub transactions: Vec<TransactionWithReceipt>,
1632    /// The hash of this block's parent
1633    #[serde_as(as = "UfeHex")]
1634    pub parent_hash: Felt,
1635    /// The time in which the block was created, encoded in Unix time
1636    pub timestamp: u64,
1637    /// The Starknet identity of the sequencer submitting this block
1638    #[serde_as(as = "UfeHex")]
1639    pub sequencer_address: Felt,
1640    /// The price of L1 gas in the block
1641    pub l1_gas_price: ResourcePrice,
1642    /// The price of L2 gas in the block
1643    pub l2_gas_price: ResourcePrice,
1644    /// The price of L1 data gas in the block
1645    pub l1_data_gas_price: ResourcePrice,
1646    /// Specifies whether the data of this block is published via blob data or calldata
1647    pub l1_da_mode: L1DataAvailabilityMode,
1648    /// Semver of the current Starknet protocol
1649    pub starknet_version: String,
1650}
1651
1652/// Pending block with transaction hashes.
1653///
1654/// The dynamic block being constructed by the sequencer. Note that this object will be deprecated
1655/// upon decentralization.
1656#[serde_as]
1657#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1658#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1659pub struct PendingBlockWithTxHashes {
1660    /// The hashes of the transactions included in this block
1661    #[serde_as(as = "Vec<UfeHex>")]
1662    pub transactions: Vec<Felt>,
1663    /// The hash of this block's parent
1664    #[serde_as(as = "UfeHex")]
1665    pub parent_hash: Felt,
1666    /// The time in which the block was created, encoded in Unix time
1667    pub timestamp: u64,
1668    /// The Starknet identity of the sequencer submitting this block
1669    #[serde_as(as = "UfeHex")]
1670    pub sequencer_address: Felt,
1671    /// The price of L1 gas in the block
1672    pub l1_gas_price: ResourcePrice,
1673    /// The price of L2 gas in the block
1674    pub l2_gas_price: ResourcePrice,
1675    /// The price of L1 data gas in the block
1676    pub l1_data_gas_price: ResourcePrice,
1677    /// Specifies whether the data of this block is published via blob data or calldata
1678    pub l1_da_mode: L1DataAvailabilityMode,
1679    /// Semver of the current Starknet protocol
1680    pub starknet_version: String,
1681}
1682
1683/// Pending block with transactions.
1684///
1685/// The dynamic block being constructed by the sequencer. Note that this object will be deprecated
1686/// upon decentralization.
1687#[serde_as]
1688#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1689#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1690pub struct PendingBlockWithTxs {
1691    /// The transactions in this block
1692    pub transactions: Vec<Transaction>,
1693    /// The hash of this block's parent
1694    #[serde_as(as = "UfeHex")]
1695    pub parent_hash: Felt,
1696    /// The time in which the block was created, encoded in Unix time
1697    pub timestamp: u64,
1698    /// The Starknet identity of the sequencer submitting this block
1699    #[serde_as(as = "UfeHex")]
1700    pub sequencer_address: Felt,
1701    /// The price of L1 gas in the block
1702    pub l1_gas_price: ResourcePrice,
1703    /// The price of L2 gas in the block
1704    pub l2_gas_price: ResourcePrice,
1705    /// The price of L1 data gas in the block
1706    pub l1_data_gas_price: ResourcePrice,
1707    /// Specifies whether the data of this block is published via blob data or calldata
1708    pub l1_da_mode: L1DataAvailabilityMode,
1709    /// Semver of the current Starknet protocol
1710    pub starknet_version: String,
1711}
1712
1713/// Pending state update.
1714///
1715/// Pending state update.
1716#[serde_as]
1717#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1718#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1719pub struct PendingStateUpdate {
1720    /// The previous global state root
1721    #[serde_as(as = "UfeHex")]
1722    pub old_root: Felt,
1723    /// State diff
1724    pub state_diff: StateDiff,
1725}
1726
1727/// Price unit.
1728#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1729pub enum PriceUnit {
1730    #[serde(rename = "WEI")]
1731    Wei,
1732    #[serde(rename = "FRI")]
1733    Fri,
1734}
1735
1736/// Reorg data.
1737///
1738/// Data about reorganized blocks, starting and ending block number and hash.
1739#[serde_as]
1740#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1741#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1742pub struct ReorgData {
1743    /// Hash of the first known block of the orphaned chain
1744    #[serde_as(as = "UfeHex")]
1745    pub starting_block_hash: Felt,
1746    /// Number of the first known block of the orphaned chain
1747    pub starting_block_number: u64,
1748    /// The last known block of the orphaned chain
1749    #[serde_as(as = "UfeHex")]
1750    pub ending_block_hash: Felt,
1751    /// Number of the last known block of the orphaned chain
1752    pub ending_block_number: u64,
1753}
1754
1755/// Replaced class.
1756///
1757/// The list of contracts whose class was replaced.
1758#[serde_as]
1759#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1760#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1761pub struct ReplacedClassItem {
1762    /// The address of the contract whose class was replaced
1763    #[serde_as(as = "UfeHex")]
1764    pub contract_address: Felt,
1765    /// The new class hash
1766    #[serde_as(as = "UfeHex")]
1767    pub class_hash: Felt,
1768}
1769
1770#[serde_as]
1771#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1772#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1773pub struct ResourceBounds {
1774    /// The max amount of the resource that can be used in the tx
1775    #[serde_as(as = "NumAsHex")]
1776    pub max_amount: u64,
1777    /// The max price per unit of this resource for this tx
1778    #[serde_as(as = "NumAsHex")]
1779    pub max_price_per_unit: u128,
1780}
1781
1782#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1783#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1784pub struct ResourceBoundsMapping {
1785    /// The max amount and max price per unit of L1 gas used in this tx
1786    pub l1_gas: ResourceBounds,
1787    /// The max amount and max price per unit of L1 blob gas used in this tx
1788    pub l1_data_gas: ResourceBounds,
1789    /// The max amount and max price per unit of L2 gas used in this tx
1790    pub l2_gas: ResourceBounds,
1791}
1792
1793#[serde_as]
1794#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1795#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1796pub struct ResourcePrice {
1797    /// The price of one unit of the given resource, denominated in fri (10^-18 strk)
1798    #[serde_as(as = "UfeHex")]
1799    pub price_in_fri: Felt,
1800    /// The price of one unit of the given resource, denominated in wei
1801    #[serde_as(as = "UfeHex")]
1802    pub price_in_wei: Felt,
1803}
1804
1805/// Result page request.
1806#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1807#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1808pub struct ResultPageRequest {
1809    /// The token returned from the previous query. If no token is provided the first page is
1810    /// returned.
1811    #[serde(skip_serializing_if = "Option::is_none")]
1812    pub continuation_token: Option<String>,
1813    /// Chunk size
1814    pub chunk_size: u64,
1815}
1816
1817#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1818#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1819pub struct RevertedInvocation {
1820    /// The revert reason for the failed execution
1821    pub revert_reason: String,
1822}
1823
1824/// Transaction status.
1825///
1826/// The finality status of the transaction, including the case the txn is still in the mempool or
1827/// failed validation during the block construction phase.
1828#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1829pub enum SequencerTransactionStatus {
1830    #[serde(rename = "RECEIVED")]
1831    Received,
1832    #[serde(rename = "REJECTED")]
1833    Rejected,
1834    #[serde(rename = "ACCEPTED_ON_L2")]
1835    AcceptedOnL2,
1836    #[serde(rename = "ACCEPTED_ON_L1")]
1837    AcceptedOnL1,
1838}
1839
1840/// Sierra entry point.
1841#[serde_as]
1842#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1843#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1844pub struct SierraEntryPoint {
1845    /// A unique identifier of the entry point (function) in the program
1846    #[serde_as(as = "UfeHex")]
1847    pub selector: Felt,
1848    /// The index of the function in the program
1849    pub function_idx: u64,
1850}
1851
1852#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1853#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
1854pub struct SimulatedTransaction {
1855    /// The transaction's trace
1856    pub transaction_trace: TransactionTrace,
1857    /// The transaction's resources and fee
1858    pub fee_estimation: FeeEstimate,
1859}
1860
1861/// Flags that indicate how to simulate a given transaction. By default, the sequencer behavior is
1862/// replicated locally (enough funds are expected to be in the account, and fee will be deducted
1863/// from the balance before the simulation of the next transaction). To skip the fee charge, use the
1864/// skip_fee_charge flag.
1865#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1866pub enum SimulationFlag {
1867    #[serde(rename = "SKIP_VALIDATE")]
1868    SkipValidate,
1869    #[serde(rename = "SKIP_FEE_CHARGE")]
1870    SkipFeeCharge,
1871}
1872
1873/// Flags that indicate how to simulate a given transaction. By default, the sequencer behavior is
1874/// replicated locally.
1875#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1876pub enum SimulationFlagForEstimateFee {
1877    #[serde(rename = "SKIP_VALIDATE")]
1878    SkipValidate,
1879}
1880
1881/// JSON-RPC error codes
1882#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1883pub enum StarknetError {
1884    /// Failed to write transaction
1885    FailedToReceiveTransaction,
1886    /// Contract not found
1887    ContractNotFound,
1888    /// Requested entrypoint does not exist in the contract
1889    EntrypointNotFound,
1890    /// Block not found
1891    BlockNotFound,
1892    /// Invalid transaction index in a block
1893    InvalidTransactionIndex,
1894    /// Class hash not found
1895    ClassHashNotFound,
1896    /// Transaction hash not found
1897    TransactionHashNotFound,
1898    /// Requested page size is too big
1899    PageSizeTooBig,
1900    /// There are no blocks
1901    NoBlocks,
1902    /// The supplied continuation token is invalid or unknown
1903    InvalidContinuationToken,
1904    /// Too many keys provided in a filter
1905    TooManyKeysInFilter,
1906    /// Contract error
1907    ContractError(ContractErrorData),
1908    /// Transaction execution error
1909    TransactionExecutionError(TransactionExecutionErrorData),
1910    /// the node doesn't support storage proofs for blocks that are too far in the past
1911    StorageProofNotSupported,
1912    /// Class already declared
1913    ClassAlreadyDeclared,
1914    /// Invalid transaction nonce
1915    InvalidTransactionNonce,
1916    /// The transaction's resources don't cover validation or the minimal transaction fee
1917    InsufficientResourcesForValidate,
1918    /// Account balance is smaller than the transaction's maximal fee (calculated as the sum of each
1919    /// resource's limit x max price)
1920    InsufficientAccountBalance,
1921    /// Account validation failed
1922    ValidationFailure(String),
1923    /// Compilation failed
1924    CompilationFailed(String),
1925    /// Contract class size it too large
1926    ContractClassSizeIsTooLarge,
1927    /// Sender address in not an account contract
1928    NonAccount,
1929    /// A transaction with the same hash already exists in the mempool
1930    DuplicateTx,
1931    /// the compiled class hash did not match the one supplied in the transaction
1932    CompiledClassHashMismatch,
1933    /// the transaction version is not supported
1934    UnsupportedTxVersion,
1935    /// the contract class version is not supported
1936    UnsupportedContractClassVersion,
1937    /// An unexpected error occurred
1938    UnexpectedError(String),
1939    /// No trace available for transaction
1940    NoTraceAvailable(NoTraceAvailableErrorData),
1941    /// Invalid subscription id
1942    InvalidSubscriptionId,
1943    /// Too many addresses in filter sender_address filter
1944    TooManyAddressesInFilter,
1945    /// Cannot go back more than 1024 blocks
1946    TooManyBlocksBack,
1947}
1948
1949#[cfg(feature = "std")]
1950impl std::error::Error for StarknetError {}
1951
1952impl core::fmt::Display for StarknetError {
1953    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1954        match self {
1955            Self::FailedToReceiveTransaction => write!(f, "FailedToReceiveTransaction"),
1956            Self::ContractNotFound => write!(f, "ContractNotFound"),
1957            Self::EntrypointNotFound => write!(f, "EntrypointNotFound"),
1958            Self::BlockNotFound => write!(f, "BlockNotFound"),
1959            Self::InvalidTransactionIndex => write!(f, "InvalidTransactionIndex"),
1960            Self::ClassHashNotFound => write!(f, "ClassHashNotFound"),
1961            Self::TransactionHashNotFound => write!(f, "TransactionHashNotFound"),
1962            Self::PageSizeTooBig => write!(f, "PageSizeTooBig"),
1963            Self::NoBlocks => write!(f, "NoBlocks"),
1964            Self::InvalidContinuationToken => write!(f, "InvalidContinuationToken"),
1965            Self::TooManyKeysInFilter => write!(f, "TooManyKeysInFilter"),
1966            Self::ContractError(e) => write!(f, "ContractError: {e:?}"),
1967            Self::TransactionExecutionError(e) => write!(f, "TransactionExecutionError: {e:?}"),
1968            Self::StorageProofNotSupported => write!(f, "StorageProofNotSupported"),
1969            Self::ClassAlreadyDeclared => write!(f, "ClassAlreadyDeclared"),
1970            Self::InvalidTransactionNonce => write!(f, "InvalidTransactionNonce"),
1971            Self::InsufficientResourcesForValidate => write!(f, "InsufficientResourcesForValidate"),
1972            Self::InsufficientAccountBalance => write!(f, "InsufficientAccountBalance"),
1973            Self::ValidationFailure(e) => write!(f, "ValidationFailure: {e:?}"),
1974            Self::CompilationFailed(e) => write!(f, "CompilationFailed: {e:?}"),
1975            Self::ContractClassSizeIsTooLarge => write!(f, "ContractClassSizeIsTooLarge"),
1976            Self::NonAccount => write!(f, "NonAccount"),
1977            Self::DuplicateTx => write!(f, "DuplicateTx"),
1978            Self::CompiledClassHashMismatch => write!(f, "CompiledClassHashMismatch"),
1979            Self::UnsupportedTxVersion => write!(f, "UnsupportedTxVersion"),
1980            Self::UnsupportedContractClassVersion => write!(f, "UnsupportedContractClassVersion"),
1981            Self::UnexpectedError(e) => write!(f, "UnexpectedError: {e:?}"),
1982            Self::NoTraceAvailable(e) => write!(f, "NoTraceAvailable: {e:?}"),
1983            Self::InvalidSubscriptionId => write!(f, "InvalidSubscriptionId"),
1984            Self::TooManyAddressesInFilter => write!(f, "TooManyAddressesInFilter"),
1985            Self::TooManyBlocksBack => write!(f, "TooManyBlocksBack"),
1986        }
1987    }
1988}
1989
1990impl StarknetError {
1991    pub const fn code(&self) -> u32 {
1992        match self {
1993            Self::FailedToReceiveTransaction => 1,
1994            Self::ContractNotFound => 20,
1995            Self::EntrypointNotFound => 21,
1996            Self::BlockNotFound => 24,
1997            Self::InvalidTransactionIndex => 27,
1998            Self::ClassHashNotFound => 28,
1999            Self::TransactionHashNotFound => 29,
2000            Self::PageSizeTooBig => 31,
2001            Self::NoBlocks => 32,
2002            Self::InvalidContinuationToken => 33,
2003            Self::TooManyKeysInFilter => 34,
2004            Self::ContractError(_) => 40,
2005            Self::TransactionExecutionError(_) => 41,
2006            Self::StorageProofNotSupported => 42,
2007            Self::ClassAlreadyDeclared => 51,
2008            Self::InvalidTransactionNonce => 52,
2009            Self::InsufficientResourcesForValidate => 53,
2010            Self::InsufficientAccountBalance => 54,
2011            Self::ValidationFailure(_) => 55,
2012            Self::CompilationFailed(_) => 56,
2013            Self::ContractClassSizeIsTooLarge => 57,
2014            Self::NonAccount => 58,
2015            Self::DuplicateTx => 59,
2016            Self::CompiledClassHashMismatch => 60,
2017            Self::UnsupportedTxVersion => 61,
2018            Self::UnsupportedContractClassVersion => 62,
2019            Self::UnexpectedError(_) => 63,
2020            Self::NoTraceAvailable(_) => 10,
2021            Self::InvalidSubscriptionId => 66,
2022            Self::TooManyAddressesInFilter => 67,
2023            Self::TooManyBlocksBack => 68,
2024        }
2025    }
2026
2027    pub fn message(&self) -> &'static str {
2028        match self {
2029            Self::FailedToReceiveTransaction => "Failed to write transaction",
2030            Self::ContractNotFound => "Contract not found",
2031            Self::EntrypointNotFound => "Requested entrypoint does not exist in the contract",
2032            Self::BlockNotFound => "Block not found",
2033            Self::InvalidTransactionIndex => "Invalid transaction index in a block",
2034            Self::ClassHashNotFound => "Class hash not found",
2035            Self::TransactionHashNotFound => "Transaction hash not found",
2036            Self::PageSizeTooBig => "Requested page size is too big",
2037            Self::NoBlocks => "There are no blocks",
2038            Self::InvalidContinuationToken => {
2039                "The supplied continuation token is invalid or unknown"
2040            }
2041            Self::TooManyKeysInFilter => "Too many keys provided in a filter",
2042            Self::ContractError(_) => "Contract error",
2043            Self::TransactionExecutionError(_) => "Transaction execution error",
2044            Self::StorageProofNotSupported => {
2045                "the node doesn't support storage proofs for blocks that are too far in the past"
2046            }
2047            Self::ClassAlreadyDeclared => "Class already declared",
2048            Self::InvalidTransactionNonce => "Invalid transaction nonce",
2049            Self::InsufficientResourcesForValidate => {
2050                "The transaction's resources don't cover validation or the minimal transaction fee"
2051            }
2052            Self::InsufficientAccountBalance => {
2053                "Account balance is smaller than the transaction's maximal fee (calculated as the sum of each resource's limit x max price)"
2054            }
2055            Self::ValidationFailure(_) => "Account validation failed",
2056            Self::CompilationFailed(_) => "Compilation failed",
2057            Self::ContractClassSizeIsTooLarge => "Contract class size it too large",
2058            Self::NonAccount => "Sender address in not an account contract",
2059            Self::DuplicateTx => "A transaction with the same hash already exists in the mempool",
2060            Self::CompiledClassHashMismatch => {
2061                "the compiled class hash did not match the one supplied in the transaction"
2062            }
2063            Self::UnsupportedTxVersion => "the transaction version is not supported",
2064            Self::UnsupportedContractClassVersion => "the contract class version is not supported",
2065            Self::UnexpectedError(_) => "An unexpected error occurred",
2066            Self::NoTraceAvailable(_) => "No trace available for transaction",
2067            Self::InvalidSubscriptionId => "Invalid subscription id",
2068            Self::TooManyAddressesInFilter => "Too many addresses in filter sender_address filter",
2069            Self::TooManyBlocksBack => "Cannot go back more than 1024 blocks",
2070        }
2071    }
2072}
2073
2074/// The change in state applied in this block, given as a mapping of addresses to the new values
2075/// and/or new contracts.
2076#[serde_as]
2077#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2078#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2079pub struct StateDiff {
2080    /// Storage diffs
2081    pub storage_diffs: Vec<ContractStorageDiffItem>,
2082    /// Deprecated declared classes
2083    #[serde_as(as = "Vec<UfeHex>")]
2084    pub deprecated_declared_classes: Vec<Felt>,
2085    /// Declared classes
2086    pub declared_classes: Vec<DeclaredClassItem>,
2087    /// Deployed contracts
2088    pub deployed_contracts: Vec<DeployedContractItem>,
2089    /// Replaced classes
2090    pub replaced_classes: Vec<ReplacedClassItem>,
2091    /// Nonces
2092    pub nonces: Vec<NonceUpdate>,
2093}
2094
2095/// State update.
2096#[serde_as]
2097#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2098#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2099pub struct StateUpdate {
2100    /// Block hash
2101    #[serde_as(as = "UfeHex")]
2102    pub block_hash: Felt,
2103    /// The previous global state root
2104    #[serde_as(as = "UfeHex")]
2105    pub old_root: Felt,
2106    /// The new global state root
2107    #[serde_as(as = "UfeHex")]
2108    pub new_root: Felt,
2109    /// State diff
2110    pub state_diff: StateDiff,
2111}
2112
2113/// Storage diff item.
2114#[serde_as]
2115#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2116#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2117pub struct StorageEntry {
2118    /// The key of the changed value
2119    #[serde_as(as = "UfeHex")]
2120    pub key: Felt,
2121    /// The new value applied to the given address
2122    #[serde_as(as = "UfeHex")]
2123    pub value: Felt,
2124}
2125
2126#[serde_as]
2127#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2128#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2129pub struct StorageProof {
2130    #[serde_as(as = "MerkleNodeMap")]
2131    pub classes_proof: IndexMap<Felt, MerkleNode, RandomState>,
2132    pub contracts_proof: ContractsProof,
2133    #[serde_as(as = "Vec<MerkleNodeMap>")]
2134    pub contracts_storage_proofs: Vec<IndexMap<Felt, MerkleNode, RandomState>>,
2135    pub global_roots: GlobalRoots,
2136}
2137
2138/// Subscription id.
2139///
2140/// An identifier for this subscription stream used to associate events with this subscription.
2141#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
2142pub struct SubscriptionId(pub String);
2143
2144/// Sync status.
2145///
2146/// An object describing the node synchronization status.
2147#[serde_as]
2148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2149#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2150pub struct SyncStatus {
2151    /// The hash of the block from which the sync started
2152    #[serde_as(as = "UfeHex")]
2153    pub starting_block_hash: Felt,
2154    /// The number (height) of the block from which the sync started
2155    pub starting_block_num: u64,
2156    /// The hash of the current block being synchronized
2157    #[serde_as(as = "UfeHex")]
2158    pub current_block_hash: Felt,
2159    /// The number (height) of the current block being synchronized
2160    pub current_block_num: u64,
2161    /// The hash of the estimated highest block to be synchronized
2162    #[serde_as(as = "UfeHex")]
2163    pub highest_block_hash: Felt,
2164    /// The number (height) of the estimated highest block to be synchronized
2165    pub highest_block_num: u64,
2166}
2167
2168/// More data about the execution failure.
2169#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2170#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2171pub struct TransactionExecutionErrorData {
2172    /// The index of the first transaction failing in a sequence of given transactions
2173    pub transaction_index: u64,
2174    /// The execution trace up to the point of failure
2175    pub execution_error: ContractExecutionError,
2176}
2177
2178/// Execution status.
2179///
2180/// The execution status of the transaction.
2181#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
2182pub enum TransactionExecutionStatus {
2183    #[serde(rename = "SUCCEEDED")]
2184    Succeeded,
2185    #[serde(rename = "REVERTED")]
2186    Reverted,
2187}
2188
2189/// Finality status.
2190///
2191/// The finality status of the transaction.
2192#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
2193pub enum TransactionFinalityStatus {
2194    #[serde(rename = "ACCEPTED_ON_L2")]
2195    AcceptedOnL2,
2196    #[serde(rename = "ACCEPTED_ON_L1")]
2197    AcceptedOnL1,
2198}
2199
2200/// Transaction receipt with block info.
2201#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2202pub struct TransactionReceiptWithBlockInfo {
2203    #[serde(flatten)]
2204    pub receipt: TransactionReceipt,
2205    #[serde(flatten)]
2206    pub block: ReceiptBlock,
2207}
2208
2209/// A single pair of transaction hash and corresponding trace.
2210#[serde_as]
2211#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2212#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2213pub struct TransactionTraceWithHash {
2214    #[serde_as(as = "UfeHex")]
2215    pub transaction_hash: Felt,
2216    pub trace_root: TransactionTrace,
2217}
2218
2219/// Transaction and receipt.
2220#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
2221#[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2222pub struct TransactionWithReceipt {
2223    /// Transaction
2224    pub transaction: TransactionContent,
2225    /// Receipt
2226    pub receipt: TransactionReceipt,
2227}
2228
2229/// Request for method starknet_addDeclareTransaction
2230#[derive(Debug, Clone, PartialEq, Eq)]
2231pub struct AddDeclareTransactionRequest {
2232    /// Declare transaction required to declare a new class on Starknet
2233    pub declare_transaction: BroadcastedDeclareTransaction,
2234}
2235
2236/// Reference version of [AddDeclareTransactionRequest].
2237#[derive(Debug, Clone, PartialEq, Eq)]
2238pub struct AddDeclareTransactionRequestRef<'a> {
2239    pub declare_transaction: &'a BroadcastedDeclareTransaction,
2240}
2241
2242/// Request for method starknet_addDeployAccountTransaction
2243#[derive(Debug, Clone, PartialEq, Eq)]
2244pub struct AddDeployAccountTransactionRequest {
2245    /// The deploy account transaction
2246    pub deploy_account_transaction: BroadcastedDeployAccountTransaction,
2247}
2248
2249/// Reference version of [AddDeployAccountTransactionRequest].
2250#[derive(Debug, Clone, PartialEq, Eq)]
2251pub struct AddDeployAccountTransactionRequestRef<'a> {
2252    pub deploy_account_transaction: &'a BroadcastedDeployAccountTransaction,
2253}
2254
2255/// Request for method starknet_addInvokeTransaction
2256#[derive(Debug, Clone, PartialEq, Eq)]
2257pub struct AddInvokeTransactionRequest {
2258    /// The information needed to invoke the function (or account, for version 1 transactions)
2259    pub invoke_transaction: BroadcastedInvokeTransaction,
2260}
2261
2262/// Reference version of [AddInvokeTransactionRequest].
2263#[derive(Debug, Clone, PartialEq, Eq)]
2264pub struct AddInvokeTransactionRequestRef<'a> {
2265    pub invoke_transaction: &'a BroadcastedInvokeTransaction,
2266}
2267
2268/// Request for method starknet_blockHashAndNumber
2269#[derive(Debug, Clone, PartialEq, Eq)]
2270pub struct BlockHashAndNumberRequest;
2271
2272/// Request for method starknet_blockNumber
2273#[derive(Debug, Clone, PartialEq, Eq)]
2274pub struct BlockNumberRequest;
2275
2276/// Request for method starknet_call
2277#[derive(Debug, Clone, PartialEq, Eq)]
2278pub struct CallRequest {
2279    pub request: FunctionCall,
2280    /// The hash of the requested block, or number (height) of the requested block, or a block tag,
2281    /// for the block referencing the state or call the transaction on.
2282    pub block_id: BlockId,
2283}
2284
2285/// Reference version of [CallRequest].
2286#[derive(Debug, Clone, PartialEq, Eq)]
2287pub struct CallRequestRef<'a> {
2288    pub request: &'a FunctionCall,
2289    pub block_id: &'a BlockId,
2290}
2291
2292/// Request for method starknet_chainId
2293#[derive(Debug, Clone, PartialEq, Eq)]
2294pub struct ChainIdRequest;
2295
2296/// Request for method starknet_estimateFee
2297#[derive(Debug, Clone, PartialEq, Eq)]
2298pub struct EstimateFeeRequest {
2299    pub request: Vec<BroadcastedTransaction>,
2300    /// describes what parts of the transaction should be executed
2301    pub simulation_flags: Vec<SimulationFlagForEstimateFee>,
2302    /// The hash of the requested block, or number (height) of the requested block, or a block tag,
2303    /// for the block referencing the state or call the transaction on.
2304    pub block_id: BlockId,
2305}
2306
2307/// Reference version of [EstimateFeeRequest].
2308#[derive(Debug, Clone, PartialEq, Eq)]
2309pub struct EstimateFeeRequestRef<'a> {
2310    pub request: &'a [BroadcastedTransaction],
2311    pub simulation_flags: &'a [SimulationFlagForEstimateFee],
2312    pub block_id: &'a BlockId,
2313}
2314
2315/// Request for method starknet_estimateMessageFee
2316#[derive(Debug, Clone, PartialEq, Eq)]
2317pub struct EstimateMessageFeeRequest {
2318    /// the message's parameters
2319    pub message: MsgFromL1,
2320    /// The hash of the requested block, or number (height) of the requested block, or a block tag,
2321    /// for the block referencing the state or call the transaction on.
2322    pub block_id: BlockId,
2323}
2324
2325/// Reference version of [EstimateMessageFeeRequest].
2326#[derive(Debug, Clone, PartialEq, Eq)]
2327pub struct EstimateMessageFeeRequestRef<'a> {
2328    pub message: &'a MsgFromL1,
2329    pub block_id: &'a BlockId,
2330}
2331
2332/// Request for method starknet_getBlockTransactionCount
2333#[derive(Debug, Clone, PartialEq, Eq)]
2334pub struct GetBlockTransactionCountRequest {
2335    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2336    pub block_id: BlockId,
2337}
2338
2339/// Reference version of [GetBlockTransactionCountRequest].
2340#[derive(Debug, Clone, PartialEq, Eq)]
2341pub struct GetBlockTransactionCountRequestRef<'a> {
2342    pub block_id: &'a BlockId,
2343}
2344
2345/// Request for method starknet_getBlockWithReceipts
2346#[derive(Debug, Clone, PartialEq, Eq)]
2347pub struct GetBlockWithReceiptsRequest {
2348    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2349    pub block_id: BlockId,
2350}
2351
2352/// Reference version of [GetBlockWithReceiptsRequest].
2353#[derive(Debug, Clone, PartialEq, Eq)]
2354pub struct GetBlockWithReceiptsRequestRef<'a> {
2355    pub block_id: &'a BlockId,
2356}
2357
2358/// Request for method starknet_getBlockWithTxHashes
2359#[derive(Debug, Clone, PartialEq, Eq)]
2360pub struct GetBlockWithTxHashesRequest {
2361    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2362    pub block_id: BlockId,
2363}
2364
2365/// Reference version of [GetBlockWithTxHashesRequest].
2366#[derive(Debug, Clone, PartialEq, Eq)]
2367pub struct GetBlockWithTxHashesRequestRef<'a> {
2368    pub block_id: &'a BlockId,
2369}
2370
2371/// Request for method starknet_getBlockWithTxs
2372#[derive(Debug, Clone, PartialEq, Eq)]
2373pub struct GetBlockWithTxsRequest {
2374    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2375    pub block_id: BlockId,
2376}
2377
2378/// Reference version of [GetBlockWithTxsRequest].
2379#[derive(Debug, Clone, PartialEq, Eq)]
2380pub struct GetBlockWithTxsRequestRef<'a> {
2381    pub block_id: &'a BlockId,
2382}
2383
2384/// Request for method starknet_getClassAt
2385#[derive(Debug, Clone, PartialEq, Eq)]
2386pub struct GetClassAtRequest {
2387    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2388    pub block_id: BlockId,
2389    /// The address of the contract whose class definition will be returned
2390    pub contract_address: Felt,
2391}
2392
2393/// Reference version of [GetClassAtRequest].
2394#[derive(Debug, Clone, PartialEq, Eq)]
2395pub struct GetClassAtRequestRef<'a> {
2396    pub block_id: &'a BlockId,
2397    pub contract_address: &'a Felt,
2398}
2399
2400/// Request for method starknet_getClassHashAt
2401#[derive(Debug, Clone, PartialEq, Eq)]
2402pub struct GetClassHashAtRequest {
2403    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2404    pub block_id: BlockId,
2405    /// The address of the contract whose class hash will be returned
2406    pub contract_address: Felt,
2407}
2408
2409/// Reference version of [GetClassHashAtRequest].
2410#[derive(Debug, Clone, PartialEq, Eq)]
2411pub struct GetClassHashAtRequestRef<'a> {
2412    pub block_id: &'a BlockId,
2413    pub contract_address: &'a Felt,
2414}
2415
2416/// Request for method starknet_getClass
2417#[derive(Debug, Clone, PartialEq, Eq)]
2418pub struct GetClassRequest {
2419    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2420    pub block_id: BlockId,
2421    /// The hash of the requested contract class
2422    pub class_hash: Felt,
2423}
2424
2425/// Reference version of [GetClassRequest].
2426#[derive(Debug, Clone, PartialEq, Eq)]
2427pub struct GetClassRequestRef<'a> {
2428    pub block_id: &'a BlockId,
2429    pub class_hash: &'a Felt,
2430}
2431
2432/// Request for method starknet_getEvents
2433#[derive(Debug, Clone, PartialEq, Eq)]
2434pub struct GetEventsRequest {
2435    pub filter: EventFilterWithPage,
2436}
2437
2438/// Reference version of [GetEventsRequest].
2439#[derive(Debug, Clone, PartialEq, Eq)]
2440pub struct GetEventsRequestRef<'a> {
2441    pub filter: &'a EventFilterWithPage,
2442}
2443
2444/// Request for method starknet_getMessagesStatus
2445#[derive(Debug, Clone, PartialEq, Eq)]
2446pub struct GetMessagesStatusRequest {
2447    pub transaction_hash: Hash256,
2448}
2449
2450/// Reference version of [GetMessagesStatusRequest].
2451#[derive(Debug, Clone, PartialEq, Eq)]
2452pub struct GetMessagesStatusRequestRef<'a> {
2453    pub transaction_hash: &'a Hash256,
2454}
2455
2456/// Request for method starknet_getNonce
2457#[derive(Debug, Clone, PartialEq, Eq)]
2458pub struct GetNonceRequest {
2459    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2460    pub block_id: BlockId,
2461    /// The address of the contract whose nonce we're seeking
2462    pub contract_address: Felt,
2463}
2464
2465/// Reference version of [GetNonceRequest].
2466#[derive(Debug, Clone, PartialEq, Eq)]
2467pub struct GetNonceRequestRef<'a> {
2468    pub block_id: &'a BlockId,
2469    pub contract_address: &'a Felt,
2470}
2471
2472/// Request for method starknet_getStateUpdate
2473#[derive(Debug, Clone, PartialEq, Eq)]
2474pub struct GetStateUpdateRequest {
2475    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2476    pub block_id: BlockId,
2477}
2478
2479/// Reference version of [GetStateUpdateRequest].
2480#[derive(Debug, Clone, PartialEq, Eq)]
2481pub struct GetStateUpdateRequestRef<'a> {
2482    pub block_id: &'a BlockId,
2483}
2484
2485/// Request for method starknet_getStorageAt
2486#[derive(Debug, Clone, PartialEq, Eq)]
2487pub struct GetStorageAtRequest {
2488    /// The address of the contract to read from
2489    pub contract_address: Felt,
2490    /// The key to the storage value for the given contract
2491    pub key: Felt,
2492    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2493    pub block_id: BlockId,
2494}
2495
2496/// Reference version of [GetStorageAtRequest].
2497#[derive(Debug, Clone, PartialEq, Eq)]
2498pub struct GetStorageAtRequestRef<'a> {
2499    pub contract_address: &'a Felt,
2500    pub key: &'a Felt,
2501    pub block_id: &'a BlockId,
2502}
2503
2504/// Request for method starknet_getStorageProof
2505#[derive(Debug, Clone, PartialEq, Eq)]
2506pub struct GetStorageProofRequest {
2507    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2508    pub block_id: ConfirmedBlockId,
2509    /// a list of the class hashes for which we want to prove membership in the classes trie
2510    pub class_hashes: Option<Vec<Felt>>,
2511    /// a list of contracts for which we want to prove membership in the global state trie
2512    pub contract_addresses: Option<Vec<Felt>>,
2513    /// a list of (contract_address, storage_keys) pairs
2514    pub contracts_storage_keys: Option<Vec<ContractStorageKeys>>,
2515}
2516
2517/// Reference version of [GetStorageProofRequest].
2518#[derive(Debug, Clone, PartialEq, Eq)]
2519pub struct GetStorageProofRequestRef<'a> {
2520    pub block_id: &'a ConfirmedBlockId,
2521    pub class_hashes: Option<&'a [Felt]>,
2522    pub contract_addresses: Option<&'a [Felt]>,
2523    pub contracts_storage_keys: Option<&'a [ContractStorageKeys]>,
2524}
2525
2526/// Request for method starknet_getTransactionByBlockIdAndIndex
2527#[derive(Debug, Clone, PartialEq, Eq)]
2528pub struct GetTransactionByBlockIdAndIndexRequest {
2529    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2530    pub block_id: BlockId,
2531    pub index: u64,
2532}
2533
2534/// Reference version of [GetTransactionByBlockIdAndIndexRequest].
2535#[derive(Debug, Clone, PartialEq, Eq)]
2536pub struct GetTransactionByBlockIdAndIndexRequestRef<'a> {
2537    pub block_id: &'a BlockId,
2538    pub index: &'a u64,
2539}
2540
2541/// Request for method starknet_getTransactionByHash
2542#[derive(Debug, Clone, PartialEq, Eq)]
2543pub struct GetTransactionByHashRequest {
2544    pub transaction_hash: Felt,
2545}
2546
2547/// Reference version of [GetTransactionByHashRequest].
2548#[derive(Debug, Clone, PartialEq, Eq)]
2549pub struct GetTransactionByHashRequestRef<'a> {
2550    pub transaction_hash: &'a Felt,
2551}
2552
2553/// Request for method starknet_getTransactionReceipt
2554#[derive(Debug, Clone, PartialEq, Eq)]
2555pub struct GetTransactionReceiptRequest {
2556    pub transaction_hash: Felt,
2557}
2558
2559/// Reference version of [GetTransactionReceiptRequest].
2560#[derive(Debug, Clone, PartialEq, Eq)]
2561pub struct GetTransactionReceiptRequestRef<'a> {
2562    pub transaction_hash: &'a Felt,
2563}
2564
2565/// Request for method starknet_getTransactionStatus
2566#[derive(Debug, Clone, PartialEq, Eq)]
2567pub struct GetTransactionStatusRequest {
2568    pub transaction_hash: Felt,
2569}
2570
2571/// Reference version of [GetTransactionStatusRequest].
2572#[derive(Debug, Clone, PartialEq, Eq)]
2573pub struct GetTransactionStatusRequestRef<'a> {
2574    pub transaction_hash: &'a Felt,
2575}
2576
2577/// Request for method starknet_simulateTransactions
2578#[derive(Debug, Clone, PartialEq, Eq)]
2579pub struct SimulateTransactionsRequest {
2580    /// The hash of the requested block, or number (height) of the requested block, or a block tag,
2581    /// for the block referencing the state or call the transaction on.
2582    pub block_id: BlockId,
2583    /// The transactions to simulate
2584    pub transactions: Vec<BroadcastedTransaction>,
2585    /// describes what parts of the transaction should be executed
2586    pub simulation_flags: Vec<SimulationFlag>,
2587}
2588
2589/// Reference version of [SimulateTransactionsRequest].
2590#[derive(Debug, Clone, PartialEq, Eq)]
2591pub struct SimulateTransactionsRequestRef<'a> {
2592    pub block_id: &'a BlockId,
2593    pub transactions: &'a [BroadcastedTransaction],
2594    pub simulation_flags: &'a [SimulationFlag],
2595}
2596
2597/// Request for method starknet_specVersion
2598#[derive(Debug, Clone, PartialEq, Eq)]
2599pub struct SpecVersionRequest;
2600
2601/// Request for method starknet_subscribeEvents
2602#[derive(Debug, Clone, PartialEq, Eq)]
2603pub struct SubscribeEventsRequest {
2604    pub from_address: Option<Felt>,
2605    pub keys: Option<Vec<Vec<Felt>>>,
2606    pub block_id: Option<ConfirmedBlockId>,
2607}
2608
2609/// Reference version of [SubscribeEventsRequest].
2610#[derive(Debug, Clone, PartialEq, Eq)]
2611pub struct SubscribeEventsRequestRef<'a> {
2612    pub from_address: &'a Option<Felt>,
2613    pub keys: Option<&'a [Vec<Felt>]>,
2614    pub block_id: &'a Option<ConfirmedBlockId>,
2615}
2616
2617/// Request for method starknet_subscribeNewHeads
2618#[derive(Debug, Clone, PartialEq, Eq)]
2619pub struct SubscribeNewHeadsRequest {
2620    pub block_id: Option<ConfirmedBlockId>,
2621}
2622
2623/// Reference version of [SubscribeNewHeadsRequest].
2624#[derive(Debug, Clone, PartialEq, Eq)]
2625pub struct SubscribeNewHeadsRequestRef<'a> {
2626    pub block_id: &'a Option<ConfirmedBlockId>,
2627}
2628
2629/// Request for method starknet_subscribePendingTransactions
2630#[derive(Debug, Clone, PartialEq, Eq)]
2631pub struct SubscribePendingTransactionsRequest {
2632    pub transaction_details: Option<bool>,
2633    pub sender_address: Option<Vec<Felt>>,
2634}
2635
2636/// Reference version of [SubscribePendingTransactionsRequest].
2637#[derive(Debug, Clone, PartialEq, Eq)]
2638pub struct SubscribePendingTransactionsRequestRef<'a> {
2639    pub transaction_details: &'a Option<bool>,
2640    pub sender_address: Option<&'a [Felt]>,
2641}
2642
2643/// Request for method starknet_subscribeTransactionStatus
2644#[derive(Debug, Clone, PartialEq, Eq)]
2645pub struct SubscribeTransactionStatusRequest {
2646    pub transaction_hash: Felt,
2647}
2648
2649/// Reference version of [SubscribeTransactionStatusRequest].
2650#[derive(Debug, Clone, PartialEq, Eq)]
2651pub struct SubscribeTransactionStatusRequestRef<'a> {
2652    pub transaction_hash: &'a Felt,
2653}
2654
2655/// Request for method starknet_subscriptionEvents
2656#[derive(Debug, Clone, PartialEq, Eq)]
2657pub struct SubscriptionEventsRequest {
2658    pub subscription_id: SubscriptionId,
2659    pub result: EmittedEvent,
2660}
2661
2662/// Reference version of [SubscriptionEventsRequest].
2663#[derive(Debug, Clone, PartialEq, Eq)]
2664pub struct SubscriptionEventsRequestRef<'a> {
2665    pub subscription_id: &'a SubscriptionId,
2666    pub result: &'a EmittedEvent,
2667}
2668
2669/// Request for method starknet_subscriptionNewHeads
2670#[derive(Debug, Clone, PartialEq, Eq)]
2671pub struct SubscriptionNewHeadsRequest {
2672    pub subscription_id: SubscriptionId,
2673    pub result: BlockHeader,
2674}
2675
2676/// Reference version of [SubscriptionNewHeadsRequest].
2677#[derive(Debug, Clone, PartialEq, Eq)]
2678pub struct SubscriptionNewHeadsRequestRef<'a> {
2679    pub subscription_id: &'a SubscriptionId,
2680    pub result: &'a BlockHeader,
2681}
2682
2683/// Request for method starknet_subscriptionPendingTransactions
2684#[derive(Debug, Clone, PartialEq, Eq)]
2685pub struct SubscriptionPendingTransactionsRequest {
2686    pub subscription_id: SubscriptionId,
2687    /// Either a tranasaction hash or full transaction details, based on subscription
2688    pub result: TransactionOrHash,
2689}
2690
2691/// Reference version of [SubscriptionPendingTransactionsRequest].
2692#[derive(Debug, Clone, PartialEq, Eq)]
2693pub struct SubscriptionPendingTransactionsRequestRef<'a> {
2694    pub subscription_id: &'a SubscriptionId,
2695    pub result: &'a TransactionOrHash,
2696}
2697
2698/// Request for method starknet_subscriptionReorg
2699#[derive(Debug, Clone, PartialEq, Eq)]
2700pub struct SubscriptionReorgRequest {
2701    pub subscription_id: SubscriptionId,
2702    pub result: ReorgData,
2703}
2704
2705/// Reference version of [SubscriptionReorgRequest].
2706#[derive(Debug, Clone, PartialEq, Eq)]
2707pub struct SubscriptionReorgRequestRef<'a> {
2708    pub subscription_id: &'a SubscriptionId,
2709    pub result: &'a ReorgData,
2710}
2711
2712/// Request for method starknet_subscriptionTransactionStatus
2713#[derive(Debug, Clone, PartialEq, Eq)]
2714pub struct SubscriptionTransactionStatusRequest {
2715    pub subscription_id: SubscriptionId,
2716    pub result: NewTransactionStatus,
2717}
2718
2719/// Reference version of [SubscriptionTransactionStatusRequest].
2720#[derive(Debug, Clone, PartialEq, Eq)]
2721pub struct SubscriptionTransactionStatusRequestRef<'a> {
2722    pub subscription_id: &'a SubscriptionId,
2723    pub result: &'a NewTransactionStatus,
2724}
2725
2726/// Request for method starknet_syncing
2727#[derive(Debug, Clone, PartialEq, Eq)]
2728pub struct SyncingRequest;
2729
2730/// Request for method starknet_traceBlockTransactions
2731#[derive(Debug, Clone, PartialEq, Eq)]
2732pub struct TraceBlockTransactionsRequest {
2733    /// The hash of the requested block, or number (height) of the requested block, or a block tag
2734    pub block_id: BlockId,
2735}
2736
2737/// Reference version of [TraceBlockTransactionsRequest].
2738#[derive(Debug, Clone, PartialEq, Eq)]
2739pub struct TraceBlockTransactionsRequestRef<'a> {
2740    pub block_id: &'a BlockId,
2741}
2742
2743/// Request for method starknet_traceTransaction
2744#[derive(Debug, Clone, PartialEq, Eq)]
2745pub struct TraceTransactionRequest {
2746    pub transaction_hash: Felt,
2747}
2748
2749/// Reference version of [TraceTransactionRequest].
2750#[derive(Debug, Clone, PartialEq, Eq)]
2751pub struct TraceTransactionRequestRef<'a> {
2752    pub transaction_hash: &'a Felt,
2753}
2754
2755/// Request for method starknet_unsubscribe
2756#[derive(Debug, Clone, PartialEq, Eq)]
2757pub struct UnsubscribeRequest {
2758    pub subscription_id: SubscriptionId,
2759}
2760
2761/// Reference version of [UnsubscribeRequest].
2762#[derive(Debug, Clone, PartialEq, Eq)]
2763pub struct UnsubscribeRequestRef<'a> {
2764    pub subscription_id: &'a SubscriptionId,
2765}
2766
2767impl Serialize for BroadcastedDeclareTransactionV3 {
2768    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2769        #[serde_as]
2770        #[derive(Serialize)]
2771        struct Tagged<'a> {
2772            pub r#type: &'a str,
2773            #[serde_as(as = "UfeHex")]
2774            pub sender_address: &'a Felt,
2775            #[serde_as(as = "UfeHex")]
2776            pub compiled_class_hash: &'a Felt,
2777            #[serde_as(as = "UfeHex")]
2778            pub version: &'a Felt,
2779            #[serde_as(as = "[UfeHex]")]
2780            pub signature: &'a [Felt],
2781            #[serde_as(as = "UfeHex")]
2782            pub nonce: &'a Felt,
2783            pub contract_class: &'a FlattenedSierraClass,
2784            pub resource_bounds: &'a ResourceBoundsMapping,
2785            #[serde_as(as = "NumAsHex")]
2786            pub tip: &'a u64,
2787            #[serde_as(as = "[UfeHex]")]
2788            pub paymaster_data: &'a [Felt],
2789            #[serde_as(as = "[UfeHex]")]
2790            pub account_deployment_data: &'a [Felt],
2791            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
2792            pub fee_data_availability_mode: &'a DataAvailabilityMode,
2793        }
2794
2795        let r#type = "DECLARE";
2796
2797        let version = &(if self.is_query {
2798            Felt::THREE + QUERY_VERSION_OFFSET
2799        } else {
2800            Felt::THREE
2801        });
2802
2803        let tagged = Tagged {
2804            r#type,
2805            sender_address: &self.sender_address,
2806            compiled_class_hash: &self.compiled_class_hash,
2807            version,
2808            signature: &self.signature,
2809            nonce: &self.nonce,
2810            contract_class: &self.contract_class,
2811            resource_bounds: &self.resource_bounds,
2812            tip: &self.tip,
2813            paymaster_data: &self.paymaster_data,
2814            account_deployment_data: &self.account_deployment_data,
2815            nonce_data_availability_mode: &self.nonce_data_availability_mode,
2816            fee_data_availability_mode: &self.fee_data_availability_mode,
2817        };
2818
2819        Tagged::serialize(&tagged, serializer)
2820    }
2821}
2822
2823impl<'de> Deserialize<'de> for BroadcastedDeclareTransactionV3 {
2824    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2825        #[serde_as]
2826        #[derive(Deserialize)]
2827        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2828        struct Tagged {
2829            pub r#type: Option<String>,
2830            #[serde_as(as = "UfeHex")]
2831            pub sender_address: Felt,
2832            #[serde_as(as = "UfeHex")]
2833            pub compiled_class_hash: Felt,
2834            #[serde_as(as = "UfeHex")]
2835            pub version: Felt,
2836            #[serde_as(as = "Vec<UfeHex>")]
2837            pub signature: Vec<Felt>,
2838            #[serde_as(as = "UfeHex")]
2839            pub nonce: Felt,
2840            pub contract_class: FlattenedSierraClass,
2841            pub resource_bounds: ResourceBoundsMapping,
2842            #[serde_as(as = "NumAsHex")]
2843            pub tip: u64,
2844            #[serde_as(as = "Vec<UfeHex>")]
2845            pub paymaster_data: Vec<Felt>,
2846            #[serde_as(as = "Vec<UfeHex>")]
2847            pub account_deployment_data: Vec<Felt>,
2848            pub nonce_data_availability_mode: DataAvailabilityMode,
2849            pub fee_data_availability_mode: DataAvailabilityMode,
2850        }
2851
2852        let tagged = Tagged::deserialize(deserializer)?;
2853
2854        if let Some(tag_field) = &tagged.r#type {
2855            if tag_field != "DECLARE" {
2856                return Err(serde::de::Error::custom("invalid `type` value"));
2857            }
2858        }
2859
2860        let is_query = if tagged.version == Felt::THREE {
2861            false
2862        } else if tagged.version == Felt::THREE + QUERY_VERSION_OFFSET {
2863            true
2864        } else {
2865            return Err(serde::de::Error::custom("invalid `version` value"));
2866        };
2867
2868        Ok(Self {
2869            sender_address: tagged.sender_address,
2870            compiled_class_hash: tagged.compiled_class_hash,
2871            signature: tagged.signature,
2872            nonce: tagged.nonce,
2873            contract_class: OwnedPtr::new(tagged.contract_class),
2874            resource_bounds: tagged.resource_bounds,
2875            tip: tagged.tip,
2876            paymaster_data: tagged.paymaster_data,
2877            account_deployment_data: tagged.account_deployment_data,
2878            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
2879            fee_data_availability_mode: tagged.fee_data_availability_mode,
2880            is_query,
2881        })
2882    }
2883}
2884
2885impl Serialize for BroadcastedDeployAccountTransactionV3 {
2886    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2887        #[serde_as]
2888        #[derive(Serialize)]
2889        struct Tagged<'a> {
2890            pub r#type: &'a str,
2891            #[serde_as(as = "UfeHex")]
2892            pub version: &'a Felt,
2893            #[serde_as(as = "[UfeHex]")]
2894            pub signature: &'a [Felt],
2895            #[serde_as(as = "UfeHex")]
2896            pub nonce: &'a Felt,
2897            #[serde_as(as = "UfeHex")]
2898            pub contract_address_salt: &'a Felt,
2899            #[serde_as(as = "[UfeHex]")]
2900            pub constructor_calldata: &'a [Felt],
2901            #[serde_as(as = "UfeHex")]
2902            pub class_hash: &'a Felt,
2903            pub resource_bounds: &'a ResourceBoundsMapping,
2904            #[serde_as(as = "NumAsHex")]
2905            pub tip: &'a u64,
2906            #[serde_as(as = "[UfeHex]")]
2907            pub paymaster_data: &'a [Felt],
2908            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
2909            pub fee_data_availability_mode: &'a DataAvailabilityMode,
2910        }
2911
2912        let r#type = "DEPLOY_ACCOUNT";
2913
2914        let version = &(if self.is_query {
2915            Felt::THREE + QUERY_VERSION_OFFSET
2916        } else {
2917            Felt::THREE
2918        });
2919
2920        let tagged = Tagged {
2921            r#type,
2922            version,
2923            signature: &self.signature,
2924            nonce: &self.nonce,
2925            contract_address_salt: &self.contract_address_salt,
2926            constructor_calldata: &self.constructor_calldata,
2927            class_hash: &self.class_hash,
2928            resource_bounds: &self.resource_bounds,
2929            tip: &self.tip,
2930            paymaster_data: &self.paymaster_data,
2931            nonce_data_availability_mode: &self.nonce_data_availability_mode,
2932            fee_data_availability_mode: &self.fee_data_availability_mode,
2933        };
2934
2935        Tagged::serialize(&tagged, serializer)
2936    }
2937}
2938
2939impl<'de> Deserialize<'de> for BroadcastedDeployAccountTransactionV3 {
2940    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2941        #[serde_as]
2942        #[derive(Deserialize)]
2943        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
2944        struct Tagged {
2945            pub r#type: Option<String>,
2946            #[serde_as(as = "UfeHex")]
2947            pub version: Felt,
2948            #[serde_as(as = "Vec<UfeHex>")]
2949            pub signature: Vec<Felt>,
2950            #[serde_as(as = "UfeHex")]
2951            pub nonce: Felt,
2952            #[serde_as(as = "UfeHex")]
2953            pub contract_address_salt: Felt,
2954            #[serde_as(as = "Vec<UfeHex>")]
2955            pub constructor_calldata: Vec<Felt>,
2956            #[serde_as(as = "UfeHex")]
2957            pub class_hash: Felt,
2958            pub resource_bounds: ResourceBoundsMapping,
2959            #[serde_as(as = "NumAsHex")]
2960            pub tip: u64,
2961            #[serde_as(as = "Vec<UfeHex>")]
2962            pub paymaster_data: Vec<Felt>,
2963            pub nonce_data_availability_mode: DataAvailabilityMode,
2964            pub fee_data_availability_mode: DataAvailabilityMode,
2965        }
2966
2967        let tagged = Tagged::deserialize(deserializer)?;
2968
2969        if let Some(tag_field) = &tagged.r#type {
2970            if tag_field != "DEPLOY_ACCOUNT" {
2971                return Err(serde::de::Error::custom("invalid `type` value"));
2972            }
2973        }
2974
2975        let is_query = if tagged.version == Felt::THREE {
2976            false
2977        } else if tagged.version == Felt::THREE + QUERY_VERSION_OFFSET {
2978            true
2979        } else {
2980            return Err(serde::de::Error::custom("invalid `version` value"));
2981        };
2982
2983        Ok(Self {
2984            signature: tagged.signature,
2985            nonce: tagged.nonce,
2986            contract_address_salt: tagged.contract_address_salt,
2987            constructor_calldata: tagged.constructor_calldata,
2988            class_hash: tagged.class_hash,
2989            resource_bounds: tagged.resource_bounds,
2990            tip: tagged.tip,
2991            paymaster_data: tagged.paymaster_data,
2992            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
2993            fee_data_availability_mode: tagged.fee_data_availability_mode,
2994            is_query,
2995        })
2996    }
2997}
2998
2999impl Serialize for BroadcastedInvokeTransactionV3 {
3000    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3001        #[serde_as]
3002        #[derive(Serialize)]
3003        struct Tagged<'a> {
3004            pub r#type: &'a str,
3005            #[serde_as(as = "UfeHex")]
3006            pub sender_address: &'a Felt,
3007            #[serde_as(as = "[UfeHex]")]
3008            pub calldata: &'a [Felt],
3009            #[serde_as(as = "UfeHex")]
3010            pub version: &'a Felt,
3011            #[serde_as(as = "[UfeHex]")]
3012            pub signature: &'a [Felt],
3013            #[serde_as(as = "UfeHex")]
3014            pub nonce: &'a Felt,
3015            pub resource_bounds: &'a ResourceBoundsMapping,
3016            #[serde_as(as = "NumAsHex")]
3017            pub tip: &'a u64,
3018            #[serde_as(as = "[UfeHex]")]
3019            pub paymaster_data: &'a [Felt],
3020            #[serde_as(as = "[UfeHex]")]
3021            pub account_deployment_data: &'a [Felt],
3022            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
3023            pub fee_data_availability_mode: &'a DataAvailabilityMode,
3024        }
3025
3026        let r#type = "INVOKE";
3027
3028        let version = &(if self.is_query {
3029            Felt::THREE + QUERY_VERSION_OFFSET
3030        } else {
3031            Felt::THREE
3032        });
3033
3034        let tagged = Tagged {
3035            r#type,
3036            sender_address: &self.sender_address,
3037            calldata: &self.calldata,
3038            version,
3039            signature: &self.signature,
3040            nonce: &self.nonce,
3041            resource_bounds: &self.resource_bounds,
3042            tip: &self.tip,
3043            paymaster_data: &self.paymaster_data,
3044            account_deployment_data: &self.account_deployment_data,
3045            nonce_data_availability_mode: &self.nonce_data_availability_mode,
3046            fee_data_availability_mode: &self.fee_data_availability_mode,
3047        };
3048
3049        Tagged::serialize(&tagged, serializer)
3050    }
3051}
3052
3053impl<'de> Deserialize<'de> for BroadcastedInvokeTransactionV3 {
3054    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3055        #[serde_as]
3056        #[derive(Deserialize)]
3057        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3058        struct Tagged {
3059            pub r#type: Option<String>,
3060            #[serde_as(as = "UfeHex")]
3061            pub sender_address: Felt,
3062            #[serde_as(as = "Vec<UfeHex>")]
3063            pub calldata: Vec<Felt>,
3064            #[serde_as(as = "UfeHex")]
3065            pub version: Felt,
3066            #[serde_as(as = "Vec<UfeHex>")]
3067            pub signature: Vec<Felt>,
3068            #[serde_as(as = "UfeHex")]
3069            pub nonce: Felt,
3070            pub resource_bounds: ResourceBoundsMapping,
3071            #[serde_as(as = "NumAsHex")]
3072            pub tip: u64,
3073            #[serde_as(as = "Vec<UfeHex>")]
3074            pub paymaster_data: Vec<Felt>,
3075            #[serde_as(as = "Vec<UfeHex>")]
3076            pub account_deployment_data: Vec<Felt>,
3077            pub nonce_data_availability_mode: DataAvailabilityMode,
3078            pub fee_data_availability_mode: DataAvailabilityMode,
3079        }
3080
3081        let tagged = Tagged::deserialize(deserializer)?;
3082
3083        if let Some(tag_field) = &tagged.r#type {
3084            if tag_field != "INVOKE" {
3085                return Err(serde::de::Error::custom("invalid `type` value"));
3086            }
3087        }
3088
3089        let is_query = if tagged.version == Felt::THREE {
3090            false
3091        } else if tagged.version == Felt::THREE + QUERY_VERSION_OFFSET {
3092            true
3093        } else {
3094            return Err(serde::de::Error::custom("invalid `version` value"));
3095        };
3096
3097        Ok(Self {
3098            sender_address: tagged.sender_address,
3099            calldata: tagged.calldata,
3100            signature: tagged.signature,
3101            nonce: tagged.nonce,
3102            resource_bounds: tagged.resource_bounds,
3103            tip: tagged.tip,
3104            paymaster_data: tagged.paymaster_data,
3105            account_deployment_data: tagged.account_deployment_data,
3106            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
3107            fee_data_availability_mode: tagged.fee_data_availability_mode,
3108            is_query,
3109        })
3110    }
3111}
3112
3113impl Serialize for DeclareTransactionReceipt {
3114    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3115        #[serde_as]
3116        #[derive(Serialize)]
3117        struct Tagged<'a> {
3118            pub r#type: &'a str,
3119            #[serde_as(as = "UfeHex")]
3120            pub transaction_hash: &'a Felt,
3121            pub actual_fee: &'a FeePayment,
3122            pub finality_status: &'a TransactionFinalityStatus,
3123            pub messages_sent: &'a [MsgToL1],
3124            pub events: &'a [Event],
3125            pub execution_resources: &'a ExecutionResources,
3126            #[serde(flatten)]
3127            pub execution_result: &'a ExecutionResult,
3128        }
3129
3130        let r#type = "DECLARE";
3131
3132        let tagged = Tagged {
3133            r#type,
3134            transaction_hash: &self.transaction_hash,
3135            actual_fee: &self.actual_fee,
3136            finality_status: &self.finality_status,
3137            messages_sent: &self.messages_sent,
3138            events: &self.events,
3139            execution_resources: &self.execution_resources,
3140            execution_result: &self.execution_result,
3141        };
3142
3143        Tagged::serialize(&tagged, serializer)
3144    }
3145}
3146
3147impl<'de> Deserialize<'de> for DeclareTransactionReceipt {
3148    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3149        #[serde_as]
3150        #[derive(Deserialize)]
3151        struct Tagged {
3152            pub r#type: Option<String>,
3153            #[serde_as(as = "UfeHex")]
3154            pub transaction_hash: Felt,
3155            pub actual_fee: FeePayment,
3156            pub finality_status: TransactionFinalityStatus,
3157            pub messages_sent: Vec<MsgToL1>,
3158            pub events: Vec<Event>,
3159            pub execution_resources: ExecutionResources,
3160            #[serde(flatten)]
3161            pub execution_result: ExecutionResult,
3162        }
3163
3164        let tagged = Tagged::deserialize(deserializer)?;
3165
3166        if let Some(tag_field) = &tagged.r#type {
3167            if tag_field != "DECLARE" {
3168                return Err(serde::de::Error::custom("invalid `type` value"));
3169            }
3170        }
3171
3172        Ok(Self {
3173            transaction_hash: tagged.transaction_hash,
3174            actual_fee: tagged.actual_fee,
3175            finality_status: tagged.finality_status,
3176            messages_sent: tagged.messages_sent,
3177            events: tagged.events,
3178            execution_resources: tagged.execution_resources,
3179            execution_result: tagged.execution_result,
3180        })
3181    }
3182}
3183
3184impl Serialize for DeclareTransactionTrace {
3185    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3186        #[derive(Serialize)]
3187        struct Tagged<'a> {
3188            #[serde(skip_serializing_if = "Option::is_none")]
3189            pub validate_invocation: &'a Option<FunctionInvocation>,
3190            #[serde(skip_serializing_if = "Option::is_none")]
3191            pub fee_transfer_invocation: &'a Option<FunctionInvocation>,
3192            #[serde(skip_serializing_if = "Option::is_none")]
3193            pub state_diff: &'a Option<StateDiff>,
3194            pub execution_resources: &'a ExecutionResources,
3195            pub r#type: &'a str,
3196        }
3197
3198        let r#type = "DECLARE";
3199
3200        let tagged = Tagged {
3201            validate_invocation: &self.validate_invocation,
3202            fee_transfer_invocation: &self.fee_transfer_invocation,
3203            state_diff: &self.state_diff,
3204            execution_resources: &self.execution_resources,
3205            r#type,
3206        };
3207
3208        Tagged::serialize(&tagged, serializer)
3209    }
3210}
3211
3212impl<'de> Deserialize<'de> for DeclareTransactionTrace {
3213    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3214        #[derive(Deserialize)]
3215        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3216        struct Tagged {
3217            #[serde(skip_serializing_if = "Option::is_none")]
3218            pub validate_invocation: Option<FunctionInvocation>,
3219            #[serde(skip_serializing_if = "Option::is_none")]
3220            pub fee_transfer_invocation: Option<FunctionInvocation>,
3221            #[serde(skip_serializing_if = "Option::is_none")]
3222            pub state_diff: Option<StateDiff>,
3223            pub execution_resources: ExecutionResources,
3224            pub r#type: Option<String>,
3225        }
3226
3227        let tagged = Tagged::deserialize(deserializer)?;
3228
3229        if let Some(tag_field) = &tagged.r#type {
3230            if tag_field != "DECLARE" {
3231                return Err(serde::de::Error::custom("invalid `type` value"));
3232            }
3233        }
3234
3235        Ok(Self {
3236            validate_invocation: tagged.validate_invocation,
3237            fee_transfer_invocation: tagged.fee_transfer_invocation,
3238            state_diff: tagged.state_diff,
3239            execution_resources: tagged.execution_resources,
3240        })
3241    }
3242}
3243
3244impl Serialize for DeclareTransactionV0 {
3245    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3246        #[serde_as]
3247        #[derive(Serialize)]
3248        struct Tagged<'a> {
3249            #[serde_as(as = "UfeHex")]
3250            pub transaction_hash: &'a Felt,
3251            pub r#type: &'a str,
3252            #[serde_as(as = "UfeHex")]
3253            pub sender_address: &'a Felt,
3254            #[serde_as(as = "UfeHex")]
3255            pub max_fee: &'a Felt,
3256            #[serde_as(as = "NumAsHex")]
3257            pub version: &'a u64,
3258            #[serde_as(as = "[UfeHex]")]
3259            pub signature: &'a [Felt],
3260            #[serde_as(as = "UfeHex")]
3261            pub class_hash: &'a Felt,
3262        }
3263
3264        let r#type = "DECLARE";
3265
3266        let version = &0;
3267
3268        let tagged = Tagged {
3269            transaction_hash: &self.transaction_hash,
3270            r#type,
3271            sender_address: &self.sender_address,
3272            max_fee: &self.max_fee,
3273            version,
3274            signature: &self.signature,
3275            class_hash: &self.class_hash,
3276        };
3277
3278        Tagged::serialize(&tagged, serializer)
3279    }
3280}
3281
3282impl<'de> Deserialize<'de> for DeclareTransactionV0 {
3283    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3284        #[serde_as]
3285        #[derive(Deserialize)]
3286        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3287        struct Tagged {
3288            #[serde_as(as = "UfeHex")]
3289            pub transaction_hash: Felt,
3290            pub r#type: Option<String>,
3291            #[serde_as(as = "UfeHex")]
3292            pub sender_address: Felt,
3293            #[serde_as(as = "UfeHex")]
3294            pub max_fee: Felt,
3295            #[serde_as(as = "Option<NumAsHex>")]
3296            pub version: Option<u64>,
3297            #[serde_as(as = "Vec<UfeHex>")]
3298            pub signature: Vec<Felt>,
3299            #[serde_as(as = "UfeHex")]
3300            pub class_hash: Felt,
3301        }
3302
3303        let tagged = Tagged::deserialize(deserializer)?;
3304
3305        if let Some(tag_field) = &tagged.r#type {
3306            if tag_field != "DECLARE" {
3307                return Err(serde::de::Error::custom("invalid `type` value"));
3308            }
3309        }
3310
3311        if let Some(tag_field) = &tagged.version {
3312            if tag_field != &0 {
3313                return Err(serde::de::Error::custom("invalid `version` value"));
3314            }
3315        }
3316
3317        Ok(Self {
3318            transaction_hash: tagged.transaction_hash,
3319            sender_address: tagged.sender_address,
3320            max_fee: tagged.max_fee,
3321            signature: tagged.signature,
3322            class_hash: tagged.class_hash,
3323        })
3324    }
3325}
3326
3327impl Serialize for DeclareTransactionV0Content {
3328    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3329        #[serde_as]
3330        #[derive(Serialize)]
3331        struct Tagged<'a> {
3332            pub r#type: &'a str,
3333            #[serde_as(as = "UfeHex")]
3334            pub sender_address: &'a Felt,
3335            #[serde_as(as = "UfeHex")]
3336            pub max_fee: &'a Felt,
3337            #[serde_as(as = "NumAsHex")]
3338            pub version: &'a u64,
3339            #[serde_as(as = "[UfeHex]")]
3340            pub signature: &'a [Felt],
3341            #[serde_as(as = "UfeHex")]
3342            pub class_hash: &'a Felt,
3343        }
3344
3345        let r#type = "DECLARE";
3346
3347        let version = &0;
3348
3349        let tagged = Tagged {
3350            r#type,
3351            sender_address: &self.sender_address,
3352            max_fee: &self.max_fee,
3353            version,
3354            signature: &self.signature,
3355            class_hash: &self.class_hash,
3356        };
3357
3358        Tagged::serialize(&tagged, serializer)
3359    }
3360}
3361
3362impl<'de> Deserialize<'de> for DeclareTransactionV0Content {
3363    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3364        #[serde_as]
3365        #[derive(Deserialize)]
3366        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3367        struct Tagged {
3368            pub r#type: Option<String>,
3369            #[serde_as(as = "UfeHex")]
3370            pub sender_address: Felt,
3371            #[serde_as(as = "UfeHex")]
3372            pub max_fee: Felt,
3373            #[serde_as(as = "Option<NumAsHex>")]
3374            pub version: Option<u64>,
3375            #[serde_as(as = "Vec<UfeHex>")]
3376            pub signature: Vec<Felt>,
3377            #[serde_as(as = "UfeHex")]
3378            pub class_hash: Felt,
3379        }
3380
3381        let tagged = Tagged::deserialize(deserializer)?;
3382
3383        if let Some(tag_field) = &tagged.r#type {
3384            if tag_field != "DECLARE" {
3385                return Err(serde::de::Error::custom("invalid `type` value"));
3386            }
3387        }
3388
3389        if let Some(tag_field) = &tagged.version {
3390            if tag_field != &0 {
3391                return Err(serde::de::Error::custom("invalid `version` value"));
3392            }
3393        }
3394
3395        Ok(Self {
3396            sender_address: tagged.sender_address,
3397            max_fee: tagged.max_fee,
3398            signature: tagged.signature,
3399            class_hash: tagged.class_hash,
3400        })
3401    }
3402}
3403
3404impl Serialize for DeclareTransactionV1 {
3405    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3406        #[serde_as]
3407        #[derive(Serialize)]
3408        struct Tagged<'a> {
3409            #[serde_as(as = "UfeHex")]
3410            pub transaction_hash: &'a Felt,
3411            pub r#type: &'a str,
3412            #[serde_as(as = "UfeHex")]
3413            pub sender_address: &'a Felt,
3414            #[serde_as(as = "UfeHex")]
3415            pub max_fee: &'a Felt,
3416            #[serde_as(as = "NumAsHex")]
3417            pub version: &'a u64,
3418            #[serde_as(as = "[UfeHex]")]
3419            pub signature: &'a [Felt],
3420            #[serde_as(as = "UfeHex")]
3421            pub nonce: &'a Felt,
3422            #[serde_as(as = "UfeHex")]
3423            pub class_hash: &'a Felt,
3424        }
3425
3426        let r#type = "DECLARE";
3427
3428        let version = &1;
3429
3430        let tagged = Tagged {
3431            transaction_hash: &self.transaction_hash,
3432            r#type,
3433            sender_address: &self.sender_address,
3434            max_fee: &self.max_fee,
3435            version,
3436            signature: &self.signature,
3437            nonce: &self.nonce,
3438            class_hash: &self.class_hash,
3439        };
3440
3441        Tagged::serialize(&tagged, serializer)
3442    }
3443}
3444
3445impl<'de> Deserialize<'de> for DeclareTransactionV1 {
3446    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3447        #[serde_as]
3448        #[derive(Deserialize)]
3449        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3450        struct Tagged {
3451            #[serde_as(as = "UfeHex")]
3452            pub transaction_hash: Felt,
3453            pub r#type: Option<String>,
3454            #[serde_as(as = "UfeHex")]
3455            pub sender_address: Felt,
3456            #[serde_as(as = "UfeHex")]
3457            pub max_fee: Felt,
3458            #[serde_as(as = "Option<NumAsHex>")]
3459            pub version: Option<u64>,
3460            #[serde_as(as = "Vec<UfeHex>")]
3461            pub signature: Vec<Felt>,
3462            #[serde_as(as = "UfeHex")]
3463            pub nonce: Felt,
3464            #[serde_as(as = "UfeHex")]
3465            pub class_hash: Felt,
3466        }
3467
3468        let tagged = Tagged::deserialize(deserializer)?;
3469
3470        if let Some(tag_field) = &tagged.r#type {
3471            if tag_field != "DECLARE" {
3472                return Err(serde::de::Error::custom("invalid `type` value"));
3473            }
3474        }
3475
3476        if let Some(tag_field) = &tagged.version {
3477            if tag_field != &1 {
3478                return Err(serde::de::Error::custom("invalid `version` value"));
3479            }
3480        }
3481
3482        Ok(Self {
3483            transaction_hash: tagged.transaction_hash,
3484            sender_address: tagged.sender_address,
3485            max_fee: tagged.max_fee,
3486            signature: tagged.signature,
3487            nonce: tagged.nonce,
3488            class_hash: tagged.class_hash,
3489        })
3490    }
3491}
3492
3493impl Serialize for DeclareTransactionV1Content {
3494    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3495        #[serde_as]
3496        #[derive(Serialize)]
3497        struct Tagged<'a> {
3498            pub r#type: &'a str,
3499            #[serde_as(as = "UfeHex")]
3500            pub sender_address: &'a Felt,
3501            #[serde_as(as = "UfeHex")]
3502            pub max_fee: &'a Felt,
3503            #[serde_as(as = "NumAsHex")]
3504            pub version: &'a u64,
3505            #[serde_as(as = "[UfeHex]")]
3506            pub signature: &'a [Felt],
3507            #[serde_as(as = "UfeHex")]
3508            pub nonce: &'a Felt,
3509            #[serde_as(as = "UfeHex")]
3510            pub class_hash: &'a Felt,
3511        }
3512
3513        let r#type = "DECLARE";
3514
3515        let version = &1;
3516
3517        let tagged = Tagged {
3518            r#type,
3519            sender_address: &self.sender_address,
3520            max_fee: &self.max_fee,
3521            version,
3522            signature: &self.signature,
3523            nonce: &self.nonce,
3524            class_hash: &self.class_hash,
3525        };
3526
3527        Tagged::serialize(&tagged, serializer)
3528    }
3529}
3530
3531impl<'de> Deserialize<'de> for DeclareTransactionV1Content {
3532    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3533        #[serde_as]
3534        #[derive(Deserialize)]
3535        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3536        struct Tagged {
3537            pub r#type: Option<String>,
3538            #[serde_as(as = "UfeHex")]
3539            pub sender_address: Felt,
3540            #[serde_as(as = "UfeHex")]
3541            pub max_fee: Felt,
3542            #[serde_as(as = "Option<NumAsHex>")]
3543            pub version: Option<u64>,
3544            #[serde_as(as = "Vec<UfeHex>")]
3545            pub signature: Vec<Felt>,
3546            #[serde_as(as = "UfeHex")]
3547            pub nonce: Felt,
3548            #[serde_as(as = "UfeHex")]
3549            pub class_hash: Felt,
3550        }
3551
3552        let tagged = Tagged::deserialize(deserializer)?;
3553
3554        if let Some(tag_field) = &tagged.r#type {
3555            if tag_field != "DECLARE" {
3556                return Err(serde::de::Error::custom("invalid `type` value"));
3557            }
3558        }
3559
3560        if let Some(tag_field) = &tagged.version {
3561            if tag_field != &1 {
3562                return Err(serde::de::Error::custom("invalid `version` value"));
3563            }
3564        }
3565
3566        Ok(Self {
3567            sender_address: tagged.sender_address,
3568            max_fee: tagged.max_fee,
3569            signature: tagged.signature,
3570            nonce: tagged.nonce,
3571            class_hash: tagged.class_hash,
3572        })
3573    }
3574}
3575
3576impl Serialize for DeclareTransactionV2 {
3577    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3578        #[serde_as]
3579        #[derive(Serialize)]
3580        struct Tagged<'a> {
3581            #[serde_as(as = "UfeHex")]
3582            pub transaction_hash: &'a Felt,
3583            pub r#type: &'a str,
3584            #[serde_as(as = "UfeHex")]
3585            pub sender_address: &'a Felt,
3586            #[serde_as(as = "UfeHex")]
3587            pub compiled_class_hash: &'a Felt,
3588            #[serde_as(as = "UfeHex")]
3589            pub max_fee: &'a Felt,
3590            #[serde_as(as = "NumAsHex")]
3591            pub version: &'a u64,
3592            #[serde_as(as = "[UfeHex]")]
3593            pub signature: &'a [Felt],
3594            #[serde_as(as = "UfeHex")]
3595            pub nonce: &'a Felt,
3596            #[serde_as(as = "UfeHex")]
3597            pub class_hash: &'a Felt,
3598        }
3599
3600        let r#type = "DECLARE";
3601
3602        let version = &2;
3603
3604        let tagged = Tagged {
3605            transaction_hash: &self.transaction_hash,
3606            r#type,
3607            sender_address: &self.sender_address,
3608            compiled_class_hash: &self.compiled_class_hash,
3609            max_fee: &self.max_fee,
3610            version,
3611            signature: &self.signature,
3612            nonce: &self.nonce,
3613            class_hash: &self.class_hash,
3614        };
3615
3616        Tagged::serialize(&tagged, serializer)
3617    }
3618}
3619
3620impl<'de> Deserialize<'de> for DeclareTransactionV2 {
3621    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3622        #[serde_as]
3623        #[derive(Deserialize)]
3624        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3625        struct Tagged {
3626            #[serde_as(as = "UfeHex")]
3627            pub transaction_hash: Felt,
3628            pub r#type: Option<String>,
3629            #[serde_as(as = "UfeHex")]
3630            pub sender_address: Felt,
3631            #[serde_as(as = "UfeHex")]
3632            pub compiled_class_hash: Felt,
3633            #[serde_as(as = "UfeHex")]
3634            pub max_fee: Felt,
3635            #[serde_as(as = "Option<NumAsHex>")]
3636            pub version: Option<u64>,
3637            #[serde_as(as = "Vec<UfeHex>")]
3638            pub signature: Vec<Felt>,
3639            #[serde_as(as = "UfeHex")]
3640            pub nonce: Felt,
3641            #[serde_as(as = "UfeHex")]
3642            pub class_hash: Felt,
3643        }
3644
3645        let tagged = Tagged::deserialize(deserializer)?;
3646
3647        if let Some(tag_field) = &tagged.r#type {
3648            if tag_field != "DECLARE" {
3649                return Err(serde::de::Error::custom("invalid `type` value"));
3650            }
3651        }
3652
3653        if let Some(tag_field) = &tagged.version {
3654            if tag_field != &2 {
3655                return Err(serde::de::Error::custom("invalid `version` value"));
3656            }
3657        }
3658
3659        Ok(Self {
3660            transaction_hash: tagged.transaction_hash,
3661            sender_address: tagged.sender_address,
3662            compiled_class_hash: tagged.compiled_class_hash,
3663            max_fee: tagged.max_fee,
3664            signature: tagged.signature,
3665            nonce: tagged.nonce,
3666            class_hash: tagged.class_hash,
3667        })
3668    }
3669}
3670
3671impl Serialize for DeclareTransactionV2Content {
3672    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3673        #[serde_as]
3674        #[derive(Serialize)]
3675        struct Tagged<'a> {
3676            pub r#type: &'a str,
3677            #[serde_as(as = "UfeHex")]
3678            pub sender_address: &'a Felt,
3679            #[serde_as(as = "UfeHex")]
3680            pub compiled_class_hash: &'a Felt,
3681            #[serde_as(as = "UfeHex")]
3682            pub max_fee: &'a Felt,
3683            #[serde_as(as = "NumAsHex")]
3684            pub version: &'a u64,
3685            #[serde_as(as = "[UfeHex]")]
3686            pub signature: &'a [Felt],
3687            #[serde_as(as = "UfeHex")]
3688            pub nonce: &'a Felt,
3689            #[serde_as(as = "UfeHex")]
3690            pub class_hash: &'a Felt,
3691        }
3692
3693        let r#type = "DECLARE";
3694
3695        let version = &2;
3696
3697        let tagged = Tagged {
3698            r#type,
3699            sender_address: &self.sender_address,
3700            compiled_class_hash: &self.compiled_class_hash,
3701            max_fee: &self.max_fee,
3702            version,
3703            signature: &self.signature,
3704            nonce: &self.nonce,
3705            class_hash: &self.class_hash,
3706        };
3707
3708        Tagged::serialize(&tagged, serializer)
3709    }
3710}
3711
3712impl<'de> Deserialize<'de> for DeclareTransactionV2Content {
3713    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3714        #[serde_as]
3715        #[derive(Deserialize)]
3716        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3717        struct Tagged {
3718            pub r#type: Option<String>,
3719            #[serde_as(as = "UfeHex")]
3720            pub sender_address: Felt,
3721            #[serde_as(as = "UfeHex")]
3722            pub compiled_class_hash: Felt,
3723            #[serde_as(as = "UfeHex")]
3724            pub max_fee: Felt,
3725            #[serde_as(as = "Option<NumAsHex>")]
3726            pub version: Option<u64>,
3727            #[serde_as(as = "Vec<UfeHex>")]
3728            pub signature: Vec<Felt>,
3729            #[serde_as(as = "UfeHex")]
3730            pub nonce: Felt,
3731            #[serde_as(as = "UfeHex")]
3732            pub class_hash: Felt,
3733        }
3734
3735        let tagged = Tagged::deserialize(deserializer)?;
3736
3737        if let Some(tag_field) = &tagged.r#type {
3738            if tag_field != "DECLARE" {
3739                return Err(serde::de::Error::custom("invalid `type` value"));
3740            }
3741        }
3742
3743        if let Some(tag_field) = &tagged.version {
3744            if tag_field != &2 {
3745                return Err(serde::de::Error::custom("invalid `version` value"));
3746            }
3747        }
3748
3749        Ok(Self {
3750            sender_address: tagged.sender_address,
3751            compiled_class_hash: tagged.compiled_class_hash,
3752            max_fee: tagged.max_fee,
3753            signature: tagged.signature,
3754            nonce: tagged.nonce,
3755            class_hash: tagged.class_hash,
3756        })
3757    }
3758}
3759
3760impl Serialize for DeclareTransactionV3 {
3761    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3762        #[serde_as]
3763        #[derive(Serialize)]
3764        struct Tagged<'a> {
3765            #[serde_as(as = "UfeHex")]
3766            pub transaction_hash: &'a Felt,
3767            pub r#type: &'a str,
3768            #[serde_as(as = "UfeHex")]
3769            pub sender_address: &'a Felt,
3770            #[serde_as(as = "UfeHex")]
3771            pub compiled_class_hash: &'a Felt,
3772            #[serde_as(as = "NumAsHex")]
3773            pub version: &'a u64,
3774            #[serde_as(as = "[UfeHex]")]
3775            pub signature: &'a [Felt],
3776            #[serde_as(as = "UfeHex")]
3777            pub nonce: &'a Felt,
3778            #[serde_as(as = "UfeHex")]
3779            pub class_hash: &'a Felt,
3780            pub resource_bounds: &'a ResourceBoundsMapping,
3781            #[serde_as(as = "NumAsHex")]
3782            pub tip: &'a u64,
3783            #[serde_as(as = "[UfeHex]")]
3784            pub paymaster_data: &'a [Felt],
3785            #[serde_as(as = "[UfeHex]")]
3786            pub account_deployment_data: &'a [Felt],
3787            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
3788            pub fee_data_availability_mode: &'a DataAvailabilityMode,
3789        }
3790
3791        let r#type = "DECLARE";
3792
3793        let version = &3;
3794
3795        let tagged = Tagged {
3796            transaction_hash: &self.transaction_hash,
3797            r#type,
3798            sender_address: &self.sender_address,
3799            compiled_class_hash: &self.compiled_class_hash,
3800            version,
3801            signature: &self.signature,
3802            nonce: &self.nonce,
3803            class_hash: &self.class_hash,
3804            resource_bounds: &self.resource_bounds,
3805            tip: &self.tip,
3806            paymaster_data: &self.paymaster_data,
3807            account_deployment_data: &self.account_deployment_data,
3808            nonce_data_availability_mode: &self.nonce_data_availability_mode,
3809            fee_data_availability_mode: &self.fee_data_availability_mode,
3810        };
3811
3812        Tagged::serialize(&tagged, serializer)
3813    }
3814}
3815
3816impl<'de> Deserialize<'de> for DeclareTransactionV3 {
3817    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3818        #[serde_as]
3819        #[derive(Deserialize)]
3820        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3821        struct Tagged {
3822            #[serde_as(as = "UfeHex")]
3823            pub transaction_hash: Felt,
3824            pub r#type: Option<String>,
3825            #[serde_as(as = "UfeHex")]
3826            pub sender_address: Felt,
3827            #[serde_as(as = "UfeHex")]
3828            pub compiled_class_hash: Felt,
3829            #[serde_as(as = "Option<NumAsHex>")]
3830            pub version: Option<u64>,
3831            #[serde_as(as = "Vec<UfeHex>")]
3832            pub signature: Vec<Felt>,
3833            #[serde_as(as = "UfeHex")]
3834            pub nonce: Felt,
3835            #[serde_as(as = "UfeHex")]
3836            pub class_hash: Felt,
3837            pub resource_bounds: ResourceBoundsMapping,
3838            #[serde_as(as = "NumAsHex")]
3839            pub tip: u64,
3840            #[serde_as(as = "Vec<UfeHex>")]
3841            pub paymaster_data: Vec<Felt>,
3842            #[serde_as(as = "Vec<UfeHex>")]
3843            pub account_deployment_data: Vec<Felt>,
3844            pub nonce_data_availability_mode: DataAvailabilityMode,
3845            pub fee_data_availability_mode: DataAvailabilityMode,
3846        }
3847
3848        let tagged = Tagged::deserialize(deserializer)?;
3849
3850        if let Some(tag_field) = &tagged.r#type {
3851            if tag_field != "DECLARE" {
3852                return Err(serde::de::Error::custom("invalid `type` value"));
3853            }
3854        }
3855
3856        if let Some(tag_field) = &tagged.version {
3857            if tag_field != &3 {
3858                return Err(serde::de::Error::custom("invalid `version` value"));
3859            }
3860        }
3861
3862        Ok(Self {
3863            transaction_hash: tagged.transaction_hash,
3864            sender_address: tagged.sender_address,
3865            compiled_class_hash: tagged.compiled_class_hash,
3866            signature: tagged.signature,
3867            nonce: tagged.nonce,
3868            class_hash: tagged.class_hash,
3869            resource_bounds: tagged.resource_bounds,
3870            tip: tagged.tip,
3871            paymaster_data: tagged.paymaster_data,
3872            account_deployment_data: tagged.account_deployment_data,
3873            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
3874            fee_data_availability_mode: tagged.fee_data_availability_mode,
3875        })
3876    }
3877}
3878
3879impl Serialize for DeclareTransactionV3Content {
3880    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3881        #[serde_as]
3882        #[derive(Serialize)]
3883        struct Tagged<'a> {
3884            pub r#type: &'a str,
3885            #[serde_as(as = "UfeHex")]
3886            pub sender_address: &'a Felt,
3887            #[serde_as(as = "UfeHex")]
3888            pub compiled_class_hash: &'a Felt,
3889            #[serde_as(as = "NumAsHex")]
3890            pub version: &'a u64,
3891            #[serde_as(as = "[UfeHex]")]
3892            pub signature: &'a [Felt],
3893            #[serde_as(as = "UfeHex")]
3894            pub nonce: &'a Felt,
3895            #[serde_as(as = "UfeHex")]
3896            pub class_hash: &'a Felt,
3897            pub resource_bounds: &'a ResourceBoundsMapping,
3898            #[serde_as(as = "NumAsHex")]
3899            pub tip: &'a u64,
3900            #[serde_as(as = "[UfeHex]")]
3901            pub paymaster_data: &'a [Felt],
3902            #[serde_as(as = "[UfeHex]")]
3903            pub account_deployment_data: &'a [Felt],
3904            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
3905            pub fee_data_availability_mode: &'a DataAvailabilityMode,
3906        }
3907
3908        let r#type = "DECLARE";
3909
3910        let version = &3;
3911
3912        let tagged = Tagged {
3913            r#type,
3914            sender_address: &self.sender_address,
3915            compiled_class_hash: &self.compiled_class_hash,
3916            version,
3917            signature: &self.signature,
3918            nonce: &self.nonce,
3919            class_hash: &self.class_hash,
3920            resource_bounds: &self.resource_bounds,
3921            tip: &self.tip,
3922            paymaster_data: &self.paymaster_data,
3923            account_deployment_data: &self.account_deployment_data,
3924            nonce_data_availability_mode: &self.nonce_data_availability_mode,
3925            fee_data_availability_mode: &self.fee_data_availability_mode,
3926        };
3927
3928        Tagged::serialize(&tagged, serializer)
3929    }
3930}
3931
3932impl<'de> Deserialize<'de> for DeclareTransactionV3Content {
3933    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3934        #[serde_as]
3935        #[derive(Deserialize)]
3936        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
3937        struct Tagged {
3938            pub r#type: Option<String>,
3939            #[serde_as(as = "UfeHex")]
3940            pub sender_address: Felt,
3941            #[serde_as(as = "UfeHex")]
3942            pub compiled_class_hash: Felt,
3943            #[serde_as(as = "Option<NumAsHex>")]
3944            pub version: Option<u64>,
3945            #[serde_as(as = "Vec<UfeHex>")]
3946            pub signature: Vec<Felt>,
3947            #[serde_as(as = "UfeHex")]
3948            pub nonce: Felt,
3949            #[serde_as(as = "UfeHex")]
3950            pub class_hash: Felt,
3951            pub resource_bounds: ResourceBoundsMapping,
3952            #[serde_as(as = "NumAsHex")]
3953            pub tip: u64,
3954            #[serde_as(as = "Vec<UfeHex>")]
3955            pub paymaster_data: Vec<Felt>,
3956            #[serde_as(as = "Vec<UfeHex>")]
3957            pub account_deployment_data: Vec<Felt>,
3958            pub nonce_data_availability_mode: DataAvailabilityMode,
3959            pub fee_data_availability_mode: DataAvailabilityMode,
3960        }
3961
3962        let tagged = Tagged::deserialize(deserializer)?;
3963
3964        if let Some(tag_field) = &tagged.r#type {
3965            if tag_field != "DECLARE" {
3966                return Err(serde::de::Error::custom("invalid `type` value"));
3967            }
3968        }
3969
3970        if let Some(tag_field) = &tagged.version {
3971            if tag_field != &3 {
3972                return Err(serde::de::Error::custom("invalid `version` value"));
3973            }
3974        }
3975
3976        Ok(Self {
3977            sender_address: tagged.sender_address,
3978            compiled_class_hash: tagged.compiled_class_hash,
3979            signature: tagged.signature,
3980            nonce: tagged.nonce,
3981            class_hash: tagged.class_hash,
3982            resource_bounds: tagged.resource_bounds,
3983            tip: tagged.tip,
3984            paymaster_data: tagged.paymaster_data,
3985            account_deployment_data: tagged.account_deployment_data,
3986            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
3987            fee_data_availability_mode: tagged.fee_data_availability_mode,
3988        })
3989    }
3990}
3991
3992impl Serialize for DeployAccountTransactionReceipt {
3993    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3994        #[serde_as]
3995        #[derive(Serialize)]
3996        struct Tagged<'a> {
3997            #[serde_as(as = "UfeHex")]
3998            pub transaction_hash: &'a Felt,
3999            pub actual_fee: &'a FeePayment,
4000            pub finality_status: &'a TransactionFinalityStatus,
4001            pub messages_sent: &'a [MsgToL1],
4002            pub events: &'a [Event],
4003            pub execution_resources: &'a ExecutionResources,
4004            #[serde(flatten)]
4005            pub execution_result: &'a ExecutionResult,
4006            pub r#type: &'a str,
4007            #[serde_as(as = "UfeHex")]
4008            pub contract_address: &'a Felt,
4009        }
4010
4011        let r#type = "DEPLOY_ACCOUNT";
4012
4013        let tagged = Tagged {
4014            transaction_hash: &self.transaction_hash,
4015            actual_fee: &self.actual_fee,
4016            finality_status: &self.finality_status,
4017            messages_sent: &self.messages_sent,
4018            events: &self.events,
4019            execution_resources: &self.execution_resources,
4020            execution_result: &self.execution_result,
4021            r#type,
4022            contract_address: &self.contract_address,
4023        };
4024
4025        Tagged::serialize(&tagged, serializer)
4026    }
4027}
4028
4029impl<'de> Deserialize<'de> for DeployAccountTransactionReceipt {
4030    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4031        #[serde_as]
4032        #[derive(Deserialize)]
4033        struct Tagged {
4034            #[serde_as(as = "UfeHex")]
4035            pub transaction_hash: Felt,
4036            pub actual_fee: FeePayment,
4037            pub finality_status: TransactionFinalityStatus,
4038            pub messages_sent: Vec<MsgToL1>,
4039            pub events: Vec<Event>,
4040            pub execution_resources: ExecutionResources,
4041            #[serde(flatten)]
4042            pub execution_result: ExecutionResult,
4043            pub r#type: Option<String>,
4044            #[serde_as(as = "UfeHex")]
4045            pub contract_address: Felt,
4046        }
4047
4048        let tagged = Tagged::deserialize(deserializer)?;
4049
4050        if let Some(tag_field) = &tagged.r#type {
4051            if tag_field != "DEPLOY_ACCOUNT" {
4052                return Err(serde::de::Error::custom("invalid `type` value"));
4053            }
4054        }
4055
4056        Ok(Self {
4057            transaction_hash: tagged.transaction_hash,
4058            actual_fee: tagged.actual_fee,
4059            finality_status: tagged.finality_status,
4060            messages_sent: tagged.messages_sent,
4061            events: tagged.events,
4062            execution_resources: tagged.execution_resources,
4063            execution_result: tagged.execution_result,
4064            contract_address: tagged.contract_address,
4065        })
4066    }
4067}
4068
4069impl Serialize for DeployAccountTransactionTrace {
4070    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4071        #[derive(Serialize)]
4072        struct Tagged<'a> {
4073            #[serde(skip_serializing_if = "Option::is_none")]
4074            pub validate_invocation: &'a Option<FunctionInvocation>,
4075            pub constructor_invocation: &'a FunctionInvocation,
4076            #[serde(skip_serializing_if = "Option::is_none")]
4077            pub fee_transfer_invocation: &'a Option<FunctionInvocation>,
4078            #[serde(skip_serializing_if = "Option::is_none")]
4079            pub state_diff: &'a Option<StateDiff>,
4080            pub execution_resources: &'a ExecutionResources,
4081            pub r#type: &'a str,
4082        }
4083
4084        let r#type = "DEPLOY_ACCOUNT";
4085
4086        let tagged = Tagged {
4087            validate_invocation: &self.validate_invocation,
4088            constructor_invocation: &self.constructor_invocation,
4089            fee_transfer_invocation: &self.fee_transfer_invocation,
4090            state_diff: &self.state_diff,
4091            execution_resources: &self.execution_resources,
4092            r#type,
4093        };
4094
4095        Tagged::serialize(&tagged, serializer)
4096    }
4097}
4098
4099impl<'de> Deserialize<'de> for DeployAccountTransactionTrace {
4100    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4101        #[derive(Deserialize)]
4102        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4103        struct Tagged {
4104            #[serde(skip_serializing_if = "Option::is_none")]
4105            pub validate_invocation: Option<FunctionInvocation>,
4106            pub constructor_invocation: FunctionInvocation,
4107            #[serde(skip_serializing_if = "Option::is_none")]
4108            pub fee_transfer_invocation: Option<FunctionInvocation>,
4109            #[serde(skip_serializing_if = "Option::is_none")]
4110            pub state_diff: Option<StateDiff>,
4111            pub execution_resources: ExecutionResources,
4112            pub r#type: Option<String>,
4113        }
4114
4115        let tagged = Tagged::deserialize(deserializer)?;
4116
4117        if let Some(tag_field) = &tagged.r#type {
4118            if tag_field != "DEPLOY_ACCOUNT" {
4119                return Err(serde::de::Error::custom("invalid `type` value"));
4120            }
4121        }
4122
4123        Ok(Self {
4124            validate_invocation: tagged.validate_invocation,
4125            constructor_invocation: tagged.constructor_invocation,
4126            fee_transfer_invocation: tagged.fee_transfer_invocation,
4127            state_diff: tagged.state_diff,
4128            execution_resources: tagged.execution_resources,
4129        })
4130    }
4131}
4132
4133impl Serialize for DeployAccountTransactionV1 {
4134    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4135        #[serde_as]
4136        #[derive(Serialize)]
4137        struct Tagged<'a> {
4138            #[serde_as(as = "UfeHex")]
4139            pub transaction_hash: &'a Felt,
4140            pub r#type: &'a str,
4141            #[serde_as(as = "UfeHex")]
4142            pub max_fee: &'a Felt,
4143            #[serde_as(as = "NumAsHex")]
4144            pub version: &'a u64,
4145            #[serde_as(as = "[UfeHex]")]
4146            pub signature: &'a [Felt],
4147            #[serde_as(as = "UfeHex")]
4148            pub nonce: &'a Felt,
4149            #[serde_as(as = "UfeHex")]
4150            pub contract_address_salt: &'a Felt,
4151            #[serde_as(as = "[UfeHex]")]
4152            pub constructor_calldata: &'a [Felt],
4153            #[serde_as(as = "UfeHex")]
4154            pub class_hash: &'a Felt,
4155        }
4156
4157        let r#type = "DEPLOY_ACCOUNT";
4158
4159        let version = &1;
4160
4161        let tagged = Tagged {
4162            transaction_hash: &self.transaction_hash,
4163            r#type,
4164            max_fee: &self.max_fee,
4165            version,
4166            signature: &self.signature,
4167            nonce: &self.nonce,
4168            contract_address_salt: &self.contract_address_salt,
4169            constructor_calldata: &self.constructor_calldata,
4170            class_hash: &self.class_hash,
4171        };
4172
4173        Tagged::serialize(&tagged, serializer)
4174    }
4175}
4176
4177impl<'de> Deserialize<'de> for DeployAccountTransactionV1 {
4178    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4179        #[serde_as]
4180        #[derive(Deserialize)]
4181        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4182        struct Tagged {
4183            #[serde_as(as = "UfeHex")]
4184            pub transaction_hash: Felt,
4185            pub r#type: Option<String>,
4186            #[serde_as(as = "UfeHex")]
4187            pub max_fee: Felt,
4188            #[serde_as(as = "Option<NumAsHex>")]
4189            pub version: Option<u64>,
4190            #[serde_as(as = "Vec<UfeHex>")]
4191            pub signature: Vec<Felt>,
4192            #[serde_as(as = "UfeHex")]
4193            pub nonce: Felt,
4194            #[serde_as(as = "UfeHex")]
4195            pub contract_address_salt: Felt,
4196            #[serde_as(as = "Vec<UfeHex>")]
4197            pub constructor_calldata: Vec<Felt>,
4198            #[serde_as(as = "UfeHex")]
4199            pub class_hash: Felt,
4200        }
4201
4202        let tagged = Tagged::deserialize(deserializer)?;
4203
4204        if let Some(tag_field) = &tagged.r#type {
4205            if tag_field != "DEPLOY_ACCOUNT" {
4206                return Err(serde::de::Error::custom("invalid `type` value"));
4207            }
4208        }
4209
4210        if let Some(tag_field) = &tagged.version {
4211            if tag_field != &1 {
4212                return Err(serde::de::Error::custom("invalid `version` value"));
4213            }
4214        }
4215
4216        Ok(Self {
4217            transaction_hash: tagged.transaction_hash,
4218            max_fee: tagged.max_fee,
4219            signature: tagged.signature,
4220            nonce: tagged.nonce,
4221            contract_address_salt: tagged.contract_address_salt,
4222            constructor_calldata: tagged.constructor_calldata,
4223            class_hash: tagged.class_hash,
4224        })
4225    }
4226}
4227
4228impl Serialize for DeployAccountTransactionV1Content {
4229    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4230        #[serde_as]
4231        #[derive(Serialize)]
4232        struct Tagged<'a> {
4233            pub r#type: &'a str,
4234            #[serde_as(as = "UfeHex")]
4235            pub max_fee: &'a Felt,
4236            #[serde_as(as = "NumAsHex")]
4237            pub version: &'a u64,
4238            #[serde_as(as = "[UfeHex]")]
4239            pub signature: &'a [Felt],
4240            #[serde_as(as = "UfeHex")]
4241            pub nonce: &'a Felt,
4242            #[serde_as(as = "UfeHex")]
4243            pub contract_address_salt: &'a Felt,
4244            #[serde_as(as = "[UfeHex]")]
4245            pub constructor_calldata: &'a [Felt],
4246            #[serde_as(as = "UfeHex")]
4247            pub class_hash: &'a Felt,
4248        }
4249
4250        let r#type = "DEPLOY_ACCOUNT";
4251
4252        let version = &1;
4253
4254        let tagged = Tagged {
4255            r#type,
4256            max_fee: &self.max_fee,
4257            version,
4258            signature: &self.signature,
4259            nonce: &self.nonce,
4260            contract_address_salt: &self.contract_address_salt,
4261            constructor_calldata: &self.constructor_calldata,
4262            class_hash: &self.class_hash,
4263        };
4264
4265        Tagged::serialize(&tagged, serializer)
4266    }
4267}
4268
4269impl<'de> Deserialize<'de> for DeployAccountTransactionV1Content {
4270    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4271        #[serde_as]
4272        #[derive(Deserialize)]
4273        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4274        struct Tagged {
4275            pub r#type: Option<String>,
4276            #[serde_as(as = "UfeHex")]
4277            pub max_fee: Felt,
4278            #[serde_as(as = "Option<NumAsHex>")]
4279            pub version: Option<u64>,
4280            #[serde_as(as = "Vec<UfeHex>")]
4281            pub signature: Vec<Felt>,
4282            #[serde_as(as = "UfeHex")]
4283            pub nonce: Felt,
4284            #[serde_as(as = "UfeHex")]
4285            pub contract_address_salt: Felt,
4286            #[serde_as(as = "Vec<UfeHex>")]
4287            pub constructor_calldata: Vec<Felt>,
4288            #[serde_as(as = "UfeHex")]
4289            pub class_hash: Felt,
4290        }
4291
4292        let tagged = Tagged::deserialize(deserializer)?;
4293
4294        if let Some(tag_field) = &tagged.r#type {
4295            if tag_field != "DEPLOY_ACCOUNT" {
4296                return Err(serde::de::Error::custom("invalid `type` value"));
4297            }
4298        }
4299
4300        if let Some(tag_field) = &tagged.version {
4301            if tag_field != &1 {
4302                return Err(serde::de::Error::custom("invalid `version` value"));
4303            }
4304        }
4305
4306        Ok(Self {
4307            max_fee: tagged.max_fee,
4308            signature: tagged.signature,
4309            nonce: tagged.nonce,
4310            contract_address_salt: tagged.contract_address_salt,
4311            constructor_calldata: tagged.constructor_calldata,
4312            class_hash: tagged.class_hash,
4313        })
4314    }
4315}
4316
4317impl Serialize for DeployAccountTransactionV3 {
4318    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4319        #[serde_as]
4320        #[derive(Serialize)]
4321        struct Tagged<'a> {
4322            #[serde_as(as = "UfeHex")]
4323            pub transaction_hash: &'a Felt,
4324            pub r#type: &'a str,
4325            #[serde_as(as = "NumAsHex")]
4326            pub version: &'a u64,
4327            #[serde_as(as = "[UfeHex]")]
4328            pub signature: &'a [Felt],
4329            #[serde_as(as = "UfeHex")]
4330            pub nonce: &'a Felt,
4331            #[serde_as(as = "UfeHex")]
4332            pub contract_address_salt: &'a Felt,
4333            #[serde_as(as = "[UfeHex]")]
4334            pub constructor_calldata: &'a [Felt],
4335            #[serde_as(as = "UfeHex")]
4336            pub class_hash: &'a Felt,
4337            pub resource_bounds: &'a ResourceBoundsMapping,
4338            #[serde_as(as = "NumAsHex")]
4339            pub tip: &'a u64,
4340            #[serde_as(as = "[UfeHex]")]
4341            pub paymaster_data: &'a [Felt],
4342            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
4343            pub fee_data_availability_mode: &'a DataAvailabilityMode,
4344        }
4345
4346        let r#type = "DEPLOY_ACCOUNT";
4347
4348        let version = &3;
4349
4350        let tagged = Tagged {
4351            transaction_hash: &self.transaction_hash,
4352            r#type,
4353            version,
4354            signature: &self.signature,
4355            nonce: &self.nonce,
4356            contract_address_salt: &self.contract_address_salt,
4357            constructor_calldata: &self.constructor_calldata,
4358            class_hash: &self.class_hash,
4359            resource_bounds: &self.resource_bounds,
4360            tip: &self.tip,
4361            paymaster_data: &self.paymaster_data,
4362            nonce_data_availability_mode: &self.nonce_data_availability_mode,
4363            fee_data_availability_mode: &self.fee_data_availability_mode,
4364        };
4365
4366        Tagged::serialize(&tagged, serializer)
4367    }
4368}
4369
4370impl<'de> Deserialize<'de> for DeployAccountTransactionV3 {
4371    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4372        #[serde_as]
4373        #[derive(Deserialize)]
4374        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4375        struct Tagged {
4376            #[serde_as(as = "UfeHex")]
4377            pub transaction_hash: Felt,
4378            pub r#type: Option<String>,
4379            #[serde_as(as = "Option<NumAsHex>")]
4380            pub version: Option<u64>,
4381            #[serde_as(as = "Vec<UfeHex>")]
4382            pub signature: Vec<Felt>,
4383            #[serde_as(as = "UfeHex")]
4384            pub nonce: Felt,
4385            #[serde_as(as = "UfeHex")]
4386            pub contract_address_salt: Felt,
4387            #[serde_as(as = "Vec<UfeHex>")]
4388            pub constructor_calldata: Vec<Felt>,
4389            #[serde_as(as = "UfeHex")]
4390            pub class_hash: Felt,
4391            pub resource_bounds: ResourceBoundsMapping,
4392            #[serde_as(as = "NumAsHex")]
4393            pub tip: u64,
4394            #[serde_as(as = "Vec<UfeHex>")]
4395            pub paymaster_data: Vec<Felt>,
4396            pub nonce_data_availability_mode: DataAvailabilityMode,
4397            pub fee_data_availability_mode: DataAvailabilityMode,
4398        }
4399
4400        let tagged = Tagged::deserialize(deserializer)?;
4401
4402        if let Some(tag_field) = &tagged.r#type {
4403            if tag_field != "DEPLOY_ACCOUNT" {
4404                return Err(serde::de::Error::custom("invalid `type` value"));
4405            }
4406        }
4407
4408        if let Some(tag_field) = &tagged.version {
4409            if tag_field != &3 {
4410                return Err(serde::de::Error::custom("invalid `version` value"));
4411            }
4412        }
4413
4414        Ok(Self {
4415            transaction_hash: tagged.transaction_hash,
4416            signature: tagged.signature,
4417            nonce: tagged.nonce,
4418            contract_address_salt: tagged.contract_address_salt,
4419            constructor_calldata: tagged.constructor_calldata,
4420            class_hash: tagged.class_hash,
4421            resource_bounds: tagged.resource_bounds,
4422            tip: tagged.tip,
4423            paymaster_data: tagged.paymaster_data,
4424            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
4425            fee_data_availability_mode: tagged.fee_data_availability_mode,
4426        })
4427    }
4428}
4429
4430impl Serialize for DeployAccountTransactionV3Content {
4431    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4432        #[serde_as]
4433        #[derive(Serialize)]
4434        struct Tagged<'a> {
4435            pub r#type: &'a str,
4436            #[serde_as(as = "NumAsHex")]
4437            pub version: &'a u64,
4438            #[serde_as(as = "[UfeHex]")]
4439            pub signature: &'a [Felt],
4440            #[serde_as(as = "UfeHex")]
4441            pub nonce: &'a Felt,
4442            #[serde_as(as = "UfeHex")]
4443            pub contract_address_salt: &'a Felt,
4444            #[serde_as(as = "[UfeHex]")]
4445            pub constructor_calldata: &'a [Felt],
4446            #[serde_as(as = "UfeHex")]
4447            pub class_hash: &'a Felt,
4448            pub resource_bounds: &'a ResourceBoundsMapping,
4449            #[serde_as(as = "NumAsHex")]
4450            pub tip: &'a u64,
4451            #[serde_as(as = "[UfeHex]")]
4452            pub paymaster_data: &'a [Felt],
4453            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
4454            pub fee_data_availability_mode: &'a DataAvailabilityMode,
4455        }
4456
4457        let r#type = "DEPLOY_ACCOUNT";
4458
4459        let version = &3;
4460
4461        let tagged = Tagged {
4462            r#type,
4463            version,
4464            signature: &self.signature,
4465            nonce: &self.nonce,
4466            contract_address_salt: &self.contract_address_salt,
4467            constructor_calldata: &self.constructor_calldata,
4468            class_hash: &self.class_hash,
4469            resource_bounds: &self.resource_bounds,
4470            tip: &self.tip,
4471            paymaster_data: &self.paymaster_data,
4472            nonce_data_availability_mode: &self.nonce_data_availability_mode,
4473            fee_data_availability_mode: &self.fee_data_availability_mode,
4474        };
4475
4476        Tagged::serialize(&tagged, serializer)
4477    }
4478}
4479
4480impl<'de> Deserialize<'de> for DeployAccountTransactionV3Content {
4481    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4482        #[serde_as]
4483        #[derive(Deserialize)]
4484        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4485        struct Tagged {
4486            pub r#type: Option<String>,
4487            #[serde_as(as = "Option<NumAsHex>")]
4488            pub version: Option<u64>,
4489            #[serde_as(as = "Vec<UfeHex>")]
4490            pub signature: Vec<Felt>,
4491            #[serde_as(as = "UfeHex")]
4492            pub nonce: Felt,
4493            #[serde_as(as = "UfeHex")]
4494            pub contract_address_salt: Felt,
4495            #[serde_as(as = "Vec<UfeHex>")]
4496            pub constructor_calldata: Vec<Felt>,
4497            #[serde_as(as = "UfeHex")]
4498            pub class_hash: Felt,
4499            pub resource_bounds: ResourceBoundsMapping,
4500            #[serde_as(as = "NumAsHex")]
4501            pub tip: u64,
4502            #[serde_as(as = "Vec<UfeHex>")]
4503            pub paymaster_data: Vec<Felt>,
4504            pub nonce_data_availability_mode: DataAvailabilityMode,
4505            pub fee_data_availability_mode: DataAvailabilityMode,
4506        }
4507
4508        let tagged = Tagged::deserialize(deserializer)?;
4509
4510        if let Some(tag_field) = &tagged.r#type {
4511            if tag_field != "DEPLOY_ACCOUNT" {
4512                return Err(serde::de::Error::custom("invalid `type` value"));
4513            }
4514        }
4515
4516        if let Some(tag_field) = &tagged.version {
4517            if tag_field != &3 {
4518                return Err(serde::de::Error::custom("invalid `version` value"));
4519            }
4520        }
4521
4522        Ok(Self {
4523            signature: tagged.signature,
4524            nonce: tagged.nonce,
4525            contract_address_salt: tagged.contract_address_salt,
4526            constructor_calldata: tagged.constructor_calldata,
4527            class_hash: tagged.class_hash,
4528            resource_bounds: tagged.resource_bounds,
4529            tip: tagged.tip,
4530            paymaster_data: tagged.paymaster_data,
4531            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
4532            fee_data_availability_mode: tagged.fee_data_availability_mode,
4533        })
4534    }
4535}
4536
4537impl Serialize for DeployTransaction {
4538    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4539        #[serde_as]
4540        #[derive(Serialize)]
4541        struct Tagged<'a> {
4542            #[serde_as(as = "UfeHex")]
4543            pub transaction_hash: &'a Felt,
4544            #[serde_as(as = "UfeHex")]
4545            pub version: &'a Felt,
4546            pub r#type: &'a str,
4547            #[serde_as(as = "UfeHex")]
4548            pub contract_address_salt: &'a Felt,
4549            #[serde_as(as = "[UfeHex]")]
4550            pub constructor_calldata: &'a [Felt],
4551            #[serde_as(as = "UfeHex")]
4552            pub class_hash: &'a Felt,
4553        }
4554
4555        let r#type = "DEPLOY";
4556
4557        let tagged = Tagged {
4558            transaction_hash: &self.transaction_hash,
4559            version: &self.version,
4560            r#type,
4561            contract_address_salt: &self.contract_address_salt,
4562            constructor_calldata: &self.constructor_calldata,
4563            class_hash: &self.class_hash,
4564        };
4565
4566        Tagged::serialize(&tagged, serializer)
4567    }
4568}
4569
4570impl<'de> Deserialize<'de> for DeployTransaction {
4571    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4572        #[serde_as]
4573        #[derive(Deserialize)]
4574        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4575        struct Tagged {
4576            #[serde_as(as = "UfeHex")]
4577            pub transaction_hash: Felt,
4578            #[serde_as(as = "UfeHex")]
4579            pub version: Felt,
4580            pub r#type: Option<String>,
4581            #[serde_as(as = "UfeHex")]
4582            pub contract_address_salt: Felt,
4583            #[serde_as(as = "Vec<UfeHex>")]
4584            pub constructor_calldata: Vec<Felt>,
4585            #[serde_as(as = "UfeHex")]
4586            pub class_hash: Felt,
4587        }
4588
4589        let tagged = Tagged::deserialize(deserializer)?;
4590
4591        if let Some(tag_field) = &tagged.r#type {
4592            if tag_field != "DEPLOY" {
4593                return Err(serde::de::Error::custom("invalid `type` value"));
4594            }
4595        }
4596
4597        Ok(Self {
4598            transaction_hash: tagged.transaction_hash,
4599            version: tagged.version,
4600            contract_address_salt: tagged.contract_address_salt,
4601            constructor_calldata: tagged.constructor_calldata,
4602            class_hash: tagged.class_hash,
4603        })
4604    }
4605}
4606
4607impl Serialize for DeployTransactionContent {
4608    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4609        #[serde_as]
4610        #[derive(Serialize)]
4611        struct Tagged<'a> {
4612            #[serde_as(as = "UfeHex")]
4613            pub version: &'a Felt,
4614            pub r#type: &'a str,
4615            #[serde_as(as = "UfeHex")]
4616            pub contract_address_salt: &'a Felt,
4617            #[serde_as(as = "[UfeHex]")]
4618            pub constructor_calldata: &'a [Felt],
4619            #[serde_as(as = "UfeHex")]
4620            pub class_hash: &'a Felt,
4621        }
4622
4623        let r#type = "DEPLOY";
4624
4625        let tagged = Tagged {
4626            version: &self.version,
4627            r#type,
4628            contract_address_salt: &self.contract_address_salt,
4629            constructor_calldata: &self.constructor_calldata,
4630            class_hash: &self.class_hash,
4631        };
4632
4633        Tagged::serialize(&tagged, serializer)
4634    }
4635}
4636
4637impl<'de> Deserialize<'de> for DeployTransactionContent {
4638    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4639        #[serde_as]
4640        #[derive(Deserialize)]
4641        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4642        struct Tagged {
4643            #[serde_as(as = "UfeHex")]
4644            pub version: Felt,
4645            pub r#type: Option<String>,
4646            #[serde_as(as = "UfeHex")]
4647            pub contract_address_salt: Felt,
4648            #[serde_as(as = "Vec<UfeHex>")]
4649            pub constructor_calldata: Vec<Felt>,
4650            #[serde_as(as = "UfeHex")]
4651            pub class_hash: Felt,
4652        }
4653
4654        let tagged = Tagged::deserialize(deserializer)?;
4655
4656        if let Some(tag_field) = &tagged.r#type {
4657            if tag_field != "DEPLOY" {
4658                return Err(serde::de::Error::custom("invalid `type` value"));
4659            }
4660        }
4661
4662        Ok(Self {
4663            version: tagged.version,
4664            contract_address_salt: tagged.contract_address_salt,
4665            constructor_calldata: tagged.constructor_calldata,
4666            class_hash: tagged.class_hash,
4667        })
4668    }
4669}
4670
4671impl Serialize for DeployTransactionReceipt {
4672    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4673        #[serde_as]
4674        #[derive(Serialize)]
4675        struct Tagged<'a> {
4676            #[serde_as(as = "UfeHex")]
4677            pub transaction_hash: &'a Felt,
4678            pub actual_fee: &'a FeePayment,
4679            pub finality_status: &'a TransactionFinalityStatus,
4680            pub messages_sent: &'a [MsgToL1],
4681            pub events: &'a [Event],
4682            pub execution_resources: &'a ExecutionResources,
4683            #[serde(flatten)]
4684            pub execution_result: &'a ExecutionResult,
4685            pub r#type: &'a str,
4686            #[serde_as(as = "UfeHex")]
4687            pub contract_address: &'a Felt,
4688        }
4689
4690        let r#type = "DEPLOY";
4691
4692        let tagged = Tagged {
4693            transaction_hash: &self.transaction_hash,
4694            actual_fee: &self.actual_fee,
4695            finality_status: &self.finality_status,
4696            messages_sent: &self.messages_sent,
4697            events: &self.events,
4698            execution_resources: &self.execution_resources,
4699            execution_result: &self.execution_result,
4700            r#type,
4701            contract_address: &self.contract_address,
4702        };
4703
4704        Tagged::serialize(&tagged, serializer)
4705    }
4706}
4707
4708impl<'de> Deserialize<'de> for DeployTransactionReceipt {
4709    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4710        #[serde_as]
4711        #[derive(Deserialize)]
4712        struct Tagged {
4713            #[serde_as(as = "UfeHex")]
4714            pub transaction_hash: Felt,
4715            pub actual_fee: FeePayment,
4716            pub finality_status: TransactionFinalityStatus,
4717            pub messages_sent: Vec<MsgToL1>,
4718            pub events: Vec<Event>,
4719            pub execution_resources: ExecutionResources,
4720            #[serde(flatten)]
4721            pub execution_result: ExecutionResult,
4722            pub r#type: Option<String>,
4723            #[serde_as(as = "UfeHex")]
4724            pub contract_address: Felt,
4725        }
4726
4727        let tagged = Tagged::deserialize(deserializer)?;
4728
4729        if let Some(tag_field) = &tagged.r#type {
4730            if tag_field != "DEPLOY" {
4731                return Err(serde::de::Error::custom("invalid `type` value"));
4732            }
4733        }
4734
4735        Ok(Self {
4736            transaction_hash: tagged.transaction_hash,
4737            actual_fee: tagged.actual_fee,
4738            finality_status: tagged.finality_status,
4739            messages_sent: tagged.messages_sent,
4740            events: tagged.events,
4741            execution_resources: tagged.execution_resources,
4742            execution_result: tagged.execution_result,
4743            contract_address: tagged.contract_address,
4744        })
4745    }
4746}
4747
4748impl Serialize for InvokeTransactionReceipt {
4749    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4750        #[serde_as]
4751        #[derive(Serialize)]
4752        struct Tagged<'a> {
4753            pub r#type: &'a str,
4754            #[serde_as(as = "UfeHex")]
4755            pub transaction_hash: &'a Felt,
4756            pub actual_fee: &'a FeePayment,
4757            pub finality_status: &'a TransactionFinalityStatus,
4758            pub messages_sent: &'a [MsgToL1],
4759            pub events: &'a [Event],
4760            pub execution_resources: &'a ExecutionResources,
4761            #[serde(flatten)]
4762            pub execution_result: &'a ExecutionResult,
4763        }
4764
4765        let r#type = "INVOKE";
4766
4767        let tagged = Tagged {
4768            r#type,
4769            transaction_hash: &self.transaction_hash,
4770            actual_fee: &self.actual_fee,
4771            finality_status: &self.finality_status,
4772            messages_sent: &self.messages_sent,
4773            events: &self.events,
4774            execution_resources: &self.execution_resources,
4775            execution_result: &self.execution_result,
4776        };
4777
4778        Tagged::serialize(&tagged, serializer)
4779    }
4780}
4781
4782impl<'de> Deserialize<'de> for InvokeTransactionReceipt {
4783    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4784        #[serde_as]
4785        #[derive(Deserialize)]
4786        struct Tagged {
4787            pub r#type: Option<String>,
4788            #[serde_as(as = "UfeHex")]
4789            pub transaction_hash: Felt,
4790            pub actual_fee: FeePayment,
4791            pub finality_status: TransactionFinalityStatus,
4792            pub messages_sent: Vec<MsgToL1>,
4793            pub events: Vec<Event>,
4794            pub execution_resources: ExecutionResources,
4795            #[serde(flatten)]
4796            pub execution_result: ExecutionResult,
4797        }
4798
4799        let tagged = Tagged::deserialize(deserializer)?;
4800
4801        if let Some(tag_field) = &tagged.r#type {
4802            if tag_field != "INVOKE" {
4803                return Err(serde::de::Error::custom("invalid `type` value"));
4804            }
4805        }
4806
4807        Ok(Self {
4808            transaction_hash: tagged.transaction_hash,
4809            actual_fee: tagged.actual_fee,
4810            finality_status: tagged.finality_status,
4811            messages_sent: tagged.messages_sent,
4812            events: tagged.events,
4813            execution_resources: tagged.execution_resources,
4814            execution_result: tagged.execution_result,
4815        })
4816    }
4817}
4818
4819impl Serialize for InvokeTransactionTrace {
4820    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4821        #[derive(Serialize)]
4822        struct Tagged<'a> {
4823            #[serde(skip_serializing_if = "Option::is_none")]
4824            pub validate_invocation: &'a Option<FunctionInvocation>,
4825            pub execute_invocation: &'a ExecuteInvocation,
4826            #[serde(skip_serializing_if = "Option::is_none")]
4827            pub fee_transfer_invocation: &'a Option<FunctionInvocation>,
4828            #[serde(skip_serializing_if = "Option::is_none")]
4829            pub state_diff: &'a Option<StateDiff>,
4830            pub execution_resources: &'a ExecutionResources,
4831            pub r#type: &'a str,
4832        }
4833
4834        let r#type = "INVOKE";
4835
4836        let tagged = Tagged {
4837            validate_invocation: &self.validate_invocation,
4838            execute_invocation: &self.execute_invocation,
4839            fee_transfer_invocation: &self.fee_transfer_invocation,
4840            state_diff: &self.state_diff,
4841            execution_resources: &self.execution_resources,
4842            r#type,
4843        };
4844
4845        Tagged::serialize(&tagged, serializer)
4846    }
4847}
4848
4849impl<'de> Deserialize<'de> for InvokeTransactionTrace {
4850    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4851        #[derive(Deserialize)]
4852        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4853        struct Tagged {
4854            #[serde(skip_serializing_if = "Option::is_none")]
4855            pub validate_invocation: Option<FunctionInvocation>,
4856            pub execute_invocation: ExecuteInvocation,
4857            #[serde(skip_serializing_if = "Option::is_none")]
4858            pub fee_transfer_invocation: Option<FunctionInvocation>,
4859            #[serde(skip_serializing_if = "Option::is_none")]
4860            pub state_diff: Option<StateDiff>,
4861            pub execution_resources: ExecutionResources,
4862            pub r#type: Option<String>,
4863        }
4864
4865        let tagged = Tagged::deserialize(deserializer)?;
4866
4867        if let Some(tag_field) = &tagged.r#type {
4868            if tag_field != "INVOKE" {
4869                return Err(serde::de::Error::custom("invalid `type` value"));
4870            }
4871        }
4872
4873        Ok(Self {
4874            validate_invocation: tagged.validate_invocation,
4875            execute_invocation: tagged.execute_invocation,
4876            fee_transfer_invocation: tagged.fee_transfer_invocation,
4877            state_diff: tagged.state_diff,
4878            execution_resources: tagged.execution_resources,
4879        })
4880    }
4881}
4882
4883impl Serialize for InvokeTransactionV0 {
4884    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4885        #[serde_as]
4886        #[derive(Serialize)]
4887        struct Tagged<'a> {
4888            #[serde_as(as = "UfeHex")]
4889            pub transaction_hash: &'a Felt,
4890            pub r#type: &'a str,
4891            #[serde_as(as = "UfeHex")]
4892            pub max_fee: &'a Felt,
4893            #[serde_as(as = "NumAsHex")]
4894            pub version: &'a u64,
4895            #[serde_as(as = "[UfeHex]")]
4896            pub signature: &'a [Felt],
4897            #[serde_as(as = "UfeHex")]
4898            pub contract_address: &'a Felt,
4899            #[serde_as(as = "UfeHex")]
4900            pub entry_point_selector: &'a Felt,
4901            #[serde_as(as = "[UfeHex]")]
4902            pub calldata: &'a [Felt],
4903        }
4904
4905        let r#type = "INVOKE";
4906
4907        let version = &0;
4908
4909        let tagged = Tagged {
4910            transaction_hash: &self.transaction_hash,
4911            r#type,
4912            max_fee: &self.max_fee,
4913            version,
4914            signature: &self.signature,
4915            contract_address: &self.contract_address,
4916            entry_point_selector: &self.entry_point_selector,
4917            calldata: &self.calldata,
4918        };
4919
4920        Tagged::serialize(&tagged, serializer)
4921    }
4922}
4923
4924impl<'de> Deserialize<'de> for InvokeTransactionV0 {
4925    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4926        #[serde_as]
4927        #[derive(Deserialize)]
4928        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
4929        struct Tagged {
4930            #[serde_as(as = "UfeHex")]
4931            pub transaction_hash: Felt,
4932            pub r#type: Option<String>,
4933            #[serde_as(as = "UfeHex")]
4934            pub max_fee: Felt,
4935            #[serde_as(as = "Option<NumAsHex>")]
4936            pub version: Option<u64>,
4937            #[serde_as(as = "Vec<UfeHex>")]
4938            pub signature: Vec<Felt>,
4939            #[serde_as(as = "UfeHex")]
4940            pub contract_address: Felt,
4941            #[serde_as(as = "UfeHex")]
4942            pub entry_point_selector: Felt,
4943            #[serde_as(as = "Vec<UfeHex>")]
4944            pub calldata: Vec<Felt>,
4945        }
4946
4947        let tagged = Tagged::deserialize(deserializer)?;
4948
4949        if let Some(tag_field) = &tagged.r#type {
4950            if tag_field != "INVOKE" {
4951                return Err(serde::de::Error::custom("invalid `type` value"));
4952            }
4953        }
4954
4955        if let Some(tag_field) = &tagged.version {
4956            if tag_field != &0 {
4957                return Err(serde::de::Error::custom("invalid `version` value"));
4958            }
4959        }
4960
4961        Ok(Self {
4962            transaction_hash: tagged.transaction_hash,
4963            max_fee: tagged.max_fee,
4964            signature: tagged.signature,
4965            contract_address: tagged.contract_address,
4966            entry_point_selector: tagged.entry_point_selector,
4967            calldata: tagged.calldata,
4968        })
4969    }
4970}
4971
4972impl Serialize for InvokeTransactionV0Content {
4973    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4974        #[serde_as]
4975        #[derive(Serialize)]
4976        struct Tagged<'a> {
4977            pub r#type: &'a str,
4978            #[serde_as(as = "UfeHex")]
4979            pub max_fee: &'a Felt,
4980            #[serde_as(as = "NumAsHex")]
4981            pub version: &'a u64,
4982            #[serde_as(as = "[UfeHex]")]
4983            pub signature: &'a [Felt],
4984            #[serde_as(as = "UfeHex")]
4985            pub contract_address: &'a Felt,
4986            #[serde_as(as = "UfeHex")]
4987            pub entry_point_selector: &'a Felt,
4988            #[serde_as(as = "[UfeHex]")]
4989            pub calldata: &'a [Felt],
4990        }
4991
4992        let r#type = "INVOKE";
4993
4994        let version = &0;
4995
4996        let tagged = Tagged {
4997            r#type,
4998            max_fee: &self.max_fee,
4999            version,
5000            signature: &self.signature,
5001            contract_address: &self.contract_address,
5002            entry_point_selector: &self.entry_point_selector,
5003            calldata: &self.calldata,
5004        };
5005
5006        Tagged::serialize(&tagged, serializer)
5007    }
5008}
5009
5010impl<'de> Deserialize<'de> for InvokeTransactionV0Content {
5011    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5012        #[serde_as]
5013        #[derive(Deserialize)]
5014        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5015        struct Tagged {
5016            pub r#type: Option<String>,
5017            #[serde_as(as = "UfeHex")]
5018            pub max_fee: Felt,
5019            #[serde_as(as = "Option<NumAsHex>")]
5020            pub version: Option<u64>,
5021            #[serde_as(as = "Vec<UfeHex>")]
5022            pub signature: Vec<Felt>,
5023            #[serde_as(as = "UfeHex")]
5024            pub contract_address: Felt,
5025            #[serde_as(as = "UfeHex")]
5026            pub entry_point_selector: Felt,
5027            #[serde_as(as = "Vec<UfeHex>")]
5028            pub calldata: Vec<Felt>,
5029        }
5030
5031        let tagged = Tagged::deserialize(deserializer)?;
5032
5033        if let Some(tag_field) = &tagged.r#type {
5034            if tag_field != "INVOKE" {
5035                return Err(serde::de::Error::custom("invalid `type` value"));
5036            }
5037        }
5038
5039        if let Some(tag_field) = &tagged.version {
5040            if tag_field != &0 {
5041                return Err(serde::de::Error::custom("invalid `version` value"));
5042            }
5043        }
5044
5045        Ok(Self {
5046            max_fee: tagged.max_fee,
5047            signature: tagged.signature,
5048            contract_address: tagged.contract_address,
5049            entry_point_selector: tagged.entry_point_selector,
5050            calldata: tagged.calldata,
5051        })
5052    }
5053}
5054
5055impl Serialize for InvokeTransactionV1 {
5056    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5057        #[serde_as]
5058        #[derive(Serialize)]
5059        struct Tagged<'a> {
5060            #[serde_as(as = "UfeHex")]
5061            pub transaction_hash: &'a Felt,
5062            pub r#type: &'a str,
5063            #[serde_as(as = "UfeHex")]
5064            pub sender_address: &'a Felt,
5065            #[serde_as(as = "[UfeHex]")]
5066            pub calldata: &'a [Felt],
5067            #[serde_as(as = "UfeHex")]
5068            pub max_fee: &'a Felt,
5069            #[serde_as(as = "NumAsHex")]
5070            pub version: &'a u64,
5071            #[serde_as(as = "[UfeHex]")]
5072            pub signature: &'a [Felt],
5073            #[serde_as(as = "UfeHex")]
5074            pub nonce: &'a Felt,
5075        }
5076
5077        let r#type = "INVOKE";
5078
5079        let version = &1;
5080
5081        let tagged = Tagged {
5082            transaction_hash: &self.transaction_hash,
5083            r#type,
5084            sender_address: &self.sender_address,
5085            calldata: &self.calldata,
5086            max_fee: &self.max_fee,
5087            version,
5088            signature: &self.signature,
5089            nonce: &self.nonce,
5090        };
5091
5092        Tagged::serialize(&tagged, serializer)
5093    }
5094}
5095
5096impl<'de> Deserialize<'de> for InvokeTransactionV1 {
5097    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5098        #[serde_as]
5099        #[derive(Deserialize)]
5100        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5101        struct Tagged {
5102            #[serde_as(as = "UfeHex")]
5103            pub transaction_hash: Felt,
5104            pub r#type: Option<String>,
5105            #[serde_as(as = "UfeHex")]
5106            pub sender_address: Felt,
5107            #[serde_as(as = "Vec<UfeHex>")]
5108            pub calldata: Vec<Felt>,
5109            #[serde_as(as = "UfeHex")]
5110            pub max_fee: Felt,
5111            #[serde_as(as = "Option<NumAsHex>")]
5112            pub version: Option<u64>,
5113            #[serde_as(as = "Vec<UfeHex>")]
5114            pub signature: Vec<Felt>,
5115            #[serde_as(as = "UfeHex")]
5116            pub nonce: Felt,
5117        }
5118
5119        let tagged = Tagged::deserialize(deserializer)?;
5120
5121        if let Some(tag_field) = &tagged.r#type {
5122            if tag_field != "INVOKE" {
5123                return Err(serde::de::Error::custom("invalid `type` value"));
5124            }
5125        }
5126
5127        if let Some(tag_field) = &tagged.version {
5128            if tag_field != &1 {
5129                return Err(serde::de::Error::custom("invalid `version` value"));
5130            }
5131        }
5132
5133        Ok(Self {
5134            transaction_hash: tagged.transaction_hash,
5135            sender_address: tagged.sender_address,
5136            calldata: tagged.calldata,
5137            max_fee: tagged.max_fee,
5138            signature: tagged.signature,
5139            nonce: tagged.nonce,
5140        })
5141    }
5142}
5143
5144impl Serialize for InvokeTransactionV1Content {
5145    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5146        #[serde_as]
5147        #[derive(Serialize)]
5148        struct Tagged<'a> {
5149            pub r#type: &'a str,
5150            #[serde_as(as = "UfeHex")]
5151            pub sender_address: &'a Felt,
5152            #[serde_as(as = "[UfeHex]")]
5153            pub calldata: &'a [Felt],
5154            #[serde_as(as = "UfeHex")]
5155            pub max_fee: &'a Felt,
5156            #[serde_as(as = "NumAsHex")]
5157            pub version: &'a u64,
5158            #[serde_as(as = "[UfeHex]")]
5159            pub signature: &'a [Felt],
5160            #[serde_as(as = "UfeHex")]
5161            pub nonce: &'a Felt,
5162        }
5163
5164        let r#type = "INVOKE";
5165
5166        let version = &1;
5167
5168        let tagged = Tagged {
5169            r#type,
5170            sender_address: &self.sender_address,
5171            calldata: &self.calldata,
5172            max_fee: &self.max_fee,
5173            version,
5174            signature: &self.signature,
5175            nonce: &self.nonce,
5176        };
5177
5178        Tagged::serialize(&tagged, serializer)
5179    }
5180}
5181
5182impl<'de> Deserialize<'de> for InvokeTransactionV1Content {
5183    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5184        #[serde_as]
5185        #[derive(Deserialize)]
5186        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5187        struct Tagged {
5188            pub r#type: Option<String>,
5189            #[serde_as(as = "UfeHex")]
5190            pub sender_address: Felt,
5191            #[serde_as(as = "Vec<UfeHex>")]
5192            pub calldata: Vec<Felt>,
5193            #[serde_as(as = "UfeHex")]
5194            pub max_fee: Felt,
5195            #[serde_as(as = "Option<NumAsHex>")]
5196            pub version: Option<u64>,
5197            #[serde_as(as = "Vec<UfeHex>")]
5198            pub signature: Vec<Felt>,
5199            #[serde_as(as = "UfeHex")]
5200            pub nonce: Felt,
5201        }
5202
5203        let tagged = Tagged::deserialize(deserializer)?;
5204
5205        if let Some(tag_field) = &tagged.r#type {
5206            if tag_field != "INVOKE" {
5207                return Err(serde::de::Error::custom("invalid `type` value"));
5208            }
5209        }
5210
5211        if let Some(tag_field) = &tagged.version {
5212            if tag_field != &1 {
5213                return Err(serde::de::Error::custom("invalid `version` value"));
5214            }
5215        }
5216
5217        Ok(Self {
5218            sender_address: tagged.sender_address,
5219            calldata: tagged.calldata,
5220            max_fee: tagged.max_fee,
5221            signature: tagged.signature,
5222            nonce: tagged.nonce,
5223        })
5224    }
5225}
5226
5227impl Serialize for InvokeTransactionV3 {
5228    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5229        #[serde_as]
5230        #[derive(Serialize)]
5231        struct Tagged<'a> {
5232            #[serde_as(as = "UfeHex")]
5233            pub transaction_hash: &'a Felt,
5234            pub r#type: &'a str,
5235            #[serde_as(as = "UfeHex")]
5236            pub sender_address: &'a Felt,
5237            #[serde_as(as = "[UfeHex]")]
5238            pub calldata: &'a [Felt],
5239            #[serde_as(as = "NumAsHex")]
5240            pub version: &'a u64,
5241            #[serde_as(as = "[UfeHex]")]
5242            pub signature: &'a [Felt],
5243            #[serde_as(as = "UfeHex")]
5244            pub nonce: &'a Felt,
5245            pub resource_bounds: &'a ResourceBoundsMapping,
5246            #[serde_as(as = "NumAsHex")]
5247            pub tip: &'a u64,
5248            #[serde_as(as = "[UfeHex]")]
5249            pub paymaster_data: &'a [Felt],
5250            #[serde_as(as = "[UfeHex]")]
5251            pub account_deployment_data: &'a [Felt],
5252            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
5253            pub fee_data_availability_mode: &'a DataAvailabilityMode,
5254        }
5255
5256        let r#type = "INVOKE";
5257
5258        let version = &3;
5259
5260        let tagged = Tagged {
5261            transaction_hash: &self.transaction_hash,
5262            r#type,
5263            sender_address: &self.sender_address,
5264            calldata: &self.calldata,
5265            version,
5266            signature: &self.signature,
5267            nonce: &self.nonce,
5268            resource_bounds: &self.resource_bounds,
5269            tip: &self.tip,
5270            paymaster_data: &self.paymaster_data,
5271            account_deployment_data: &self.account_deployment_data,
5272            nonce_data_availability_mode: &self.nonce_data_availability_mode,
5273            fee_data_availability_mode: &self.fee_data_availability_mode,
5274        };
5275
5276        Tagged::serialize(&tagged, serializer)
5277    }
5278}
5279
5280impl<'de> Deserialize<'de> for InvokeTransactionV3 {
5281    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5282        #[serde_as]
5283        #[derive(Deserialize)]
5284        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5285        struct Tagged {
5286            #[serde_as(as = "UfeHex")]
5287            pub transaction_hash: Felt,
5288            pub r#type: Option<String>,
5289            #[serde_as(as = "UfeHex")]
5290            pub sender_address: Felt,
5291            #[serde_as(as = "Vec<UfeHex>")]
5292            pub calldata: Vec<Felt>,
5293            #[serde_as(as = "Option<NumAsHex>")]
5294            pub version: Option<u64>,
5295            #[serde_as(as = "Vec<UfeHex>")]
5296            pub signature: Vec<Felt>,
5297            #[serde_as(as = "UfeHex")]
5298            pub nonce: Felt,
5299            pub resource_bounds: ResourceBoundsMapping,
5300            #[serde_as(as = "NumAsHex")]
5301            pub tip: u64,
5302            #[serde_as(as = "Vec<UfeHex>")]
5303            pub paymaster_data: Vec<Felt>,
5304            #[serde_as(as = "Vec<UfeHex>")]
5305            pub account_deployment_data: Vec<Felt>,
5306            pub nonce_data_availability_mode: DataAvailabilityMode,
5307            pub fee_data_availability_mode: DataAvailabilityMode,
5308        }
5309
5310        let tagged = Tagged::deserialize(deserializer)?;
5311
5312        if let Some(tag_field) = &tagged.r#type {
5313            if tag_field != "INVOKE" {
5314                return Err(serde::de::Error::custom("invalid `type` value"));
5315            }
5316        }
5317
5318        if let Some(tag_field) = &tagged.version {
5319            if tag_field != &3 {
5320                return Err(serde::de::Error::custom("invalid `version` value"));
5321            }
5322        }
5323
5324        Ok(Self {
5325            transaction_hash: tagged.transaction_hash,
5326            sender_address: tagged.sender_address,
5327            calldata: tagged.calldata,
5328            signature: tagged.signature,
5329            nonce: tagged.nonce,
5330            resource_bounds: tagged.resource_bounds,
5331            tip: tagged.tip,
5332            paymaster_data: tagged.paymaster_data,
5333            account_deployment_data: tagged.account_deployment_data,
5334            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
5335            fee_data_availability_mode: tagged.fee_data_availability_mode,
5336        })
5337    }
5338}
5339
5340impl Serialize for InvokeTransactionV3Content {
5341    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5342        #[serde_as]
5343        #[derive(Serialize)]
5344        struct Tagged<'a> {
5345            pub r#type: &'a str,
5346            #[serde_as(as = "UfeHex")]
5347            pub sender_address: &'a Felt,
5348            #[serde_as(as = "[UfeHex]")]
5349            pub calldata: &'a [Felt],
5350            #[serde_as(as = "NumAsHex")]
5351            pub version: &'a u64,
5352            #[serde_as(as = "[UfeHex]")]
5353            pub signature: &'a [Felt],
5354            #[serde_as(as = "UfeHex")]
5355            pub nonce: &'a Felt,
5356            pub resource_bounds: &'a ResourceBoundsMapping,
5357            #[serde_as(as = "NumAsHex")]
5358            pub tip: &'a u64,
5359            #[serde_as(as = "[UfeHex]")]
5360            pub paymaster_data: &'a [Felt],
5361            #[serde_as(as = "[UfeHex]")]
5362            pub account_deployment_data: &'a [Felt],
5363            pub nonce_data_availability_mode: &'a DataAvailabilityMode,
5364            pub fee_data_availability_mode: &'a DataAvailabilityMode,
5365        }
5366
5367        let r#type = "INVOKE";
5368
5369        let version = &3;
5370
5371        let tagged = Tagged {
5372            r#type,
5373            sender_address: &self.sender_address,
5374            calldata: &self.calldata,
5375            version,
5376            signature: &self.signature,
5377            nonce: &self.nonce,
5378            resource_bounds: &self.resource_bounds,
5379            tip: &self.tip,
5380            paymaster_data: &self.paymaster_data,
5381            account_deployment_data: &self.account_deployment_data,
5382            nonce_data_availability_mode: &self.nonce_data_availability_mode,
5383            fee_data_availability_mode: &self.fee_data_availability_mode,
5384        };
5385
5386        Tagged::serialize(&tagged, serializer)
5387    }
5388}
5389
5390impl<'de> Deserialize<'de> for InvokeTransactionV3Content {
5391    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5392        #[serde_as]
5393        #[derive(Deserialize)]
5394        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5395        struct Tagged {
5396            pub r#type: Option<String>,
5397            #[serde_as(as = "UfeHex")]
5398            pub sender_address: Felt,
5399            #[serde_as(as = "Vec<UfeHex>")]
5400            pub calldata: Vec<Felt>,
5401            #[serde_as(as = "Option<NumAsHex>")]
5402            pub version: Option<u64>,
5403            #[serde_as(as = "Vec<UfeHex>")]
5404            pub signature: Vec<Felt>,
5405            #[serde_as(as = "UfeHex")]
5406            pub nonce: Felt,
5407            pub resource_bounds: ResourceBoundsMapping,
5408            #[serde_as(as = "NumAsHex")]
5409            pub tip: u64,
5410            #[serde_as(as = "Vec<UfeHex>")]
5411            pub paymaster_data: Vec<Felt>,
5412            #[serde_as(as = "Vec<UfeHex>")]
5413            pub account_deployment_data: Vec<Felt>,
5414            pub nonce_data_availability_mode: DataAvailabilityMode,
5415            pub fee_data_availability_mode: DataAvailabilityMode,
5416        }
5417
5418        let tagged = Tagged::deserialize(deserializer)?;
5419
5420        if let Some(tag_field) = &tagged.r#type {
5421            if tag_field != "INVOKE" {
5422                return Err(serde::de::Error::custom("invalid `type` value"));
5423            }
5424        }
5425
5426        if let Some(tag_field) = &tagged.version {
5427            if tag_field != &3 {
5428                return Err(serde::de::Error::custom("invalid `version` value"));
5429            }
5430        }
5431
5432        Ok(Self {
5433            sender_address: tagged.sender_address,
5434            calldata: tagged.calldata,
5435            signature: tagged.signature,
5436            nonce: tagged.nonce,
5437            resource_bounds: tagged.resource_bounds,
5438            tip: tagged.tip,
5439            paymaster_data: tagged.paymaster_data,
5440            account_deployment_data: tagged.account_deployment_data,
5441            nonce_data_availability_mode: tagged.nonce_data_availability_mode,
5442            fee_data_availability_mode: tagged.fee_data_availability_mode,
5443        })
5444    }
5445}
5446
5447impl Serialize for L1HandlerTransaction {
5448    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5449        #[serde_as]
5450        #[derive(Serialize)]
5451        struct Tagged<'a> {
5452            #[serde_as(as = "UfeHex")]
5453            pub transaction_hash: &'a Felt,
5454            #[serde_as(as = "UfeHex")]
5455            pub version: &'a Felt,
5456            pub r#type: &'a str,
5457            #[serde_as(as = "NumAsHex")]
5458            pub nonce: &'a u64,
5459            #[serde_as(as = "UfeHex")]
5460            pub contract_address: &'a Felt,
5461            #[serde_as(as = "UfeHex")]
5462            pub entry_point_selector: &'a Felt,
5463            #[serde_as(as = "[UfeHex]")]
5464            pub calldata: &'a [Felt],
5465        }
5466
5467        let r#type = "L1_HANDLER";
5468
5469        let tagged = Tagged {
5470            transaction_hash: &self.transaction_hash,
5471            version: &self.version,
5472            r#type,
5473            nonce: &self.nonce,
5474            contract_address: &self.contract_address,
5475            entry_point_selector: &self.entry_point_selector,
5476            calldata: &self.calldata,
5477        };
5478
5479        Tagged::serialize(&tagged, serializer)
5480    }
5481}
5482
5483impl<'de> Deserialize<'de> for L1HandlerTransaction {
5484    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5485        #[serde_as]
5486        #[derive(Deserialize)]
5487        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5488        struct Tagged {
5489            #[serde_as(as = "UfeHex")]
5490            pub transaction_hash: Felt,
5491            #[serde_as(as = "UfeHex")]
5492            pub version: Felt,
5493            pub r#type: Option<String>,
5494            #[serde_as(as = "NumAsHex")]
5495            pub nonce: u64,
5496            #[serde_as(as = "UfeHex")]
5497            pub contract_address: Felt,
5498            #[serde_as(as = "UfeHex")]
5499            pub entry_point_selector: Felt,
5500            #[serde_as(as = "Vec<UfeHex>")]
5501            pub calldata: Vec<Felt>,
5502        }
5503
5504        let tagged = Tagged::deserialize(deserializer)?;
5505
5506        if let Some(tag_field) = &tagged.r#type {
5507            if tag_field != "L1_HANDLER" {
5508                return Err(serde::de::Error::custom("invalid `type` value"));
5509            }
5510        }
5511
5512        Ok(Self {
5513            transaction_hash: tagged.transaction_hash,
5514            version: tagged.version,
5515            nonce: tagged.nonce,
5516            contract_address: tagged.contract_address,
5517            entry_point_selector: tagged.entry_point_selector,
5518            calldata: tagged.calldata,
5519        })
5520    }
5521}
5522
5523impl Serialize for L1HandlerTransactionContent {
5524    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5525        #[serde_as]
5526        #[derive(Serialize)]
5527        struct Tagged<'a> {
5528            #[serde_as(as = "UfeHex")]
5529            pub version: &'a Felt,
5530            pub r#type: &'a str,
5531            #[serde_as(as = "NumAsHex")]
5532            pub nonce: &'a u64,
5533            #[serde_as(as = "UfeHex")]
5534            pub contract_address: &'a Felt,
5535            #[serde_as(as = "UfeHex")]
5536            pub entry_point_selector: &'a Felt,
5537            #[serde_as(as = "[UfeHex]")]
5538            pub calldata: &'a [Felt],
5539        }
5540
5541        let r#type = "L1_HANDLER";
5542
5543        let tagged = Tagged {
5544            version: &self.version,
5545            r#type,
5546            nonce: &self.nonce,
5547            contract_address: &self.contract_address,
5548            entry_point_selector: &self.entry_point_selector,
5549            calldata: &self.calldata,
5550        };
5551
5552        Tagged::serialize(&tagged, serializer)
5553    }
5554}
5555
5556impl<'de> Deserialize<'de> for L1HandlerTransactionContent {
5557    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5558        #[serde_as]
5559        #[derive(Deserialize)]
5560        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5561        struct Tagged {
5562            #[serde_as(as = "UfeHex")]
5563            pub version: Felt,
5564            pub r#type: Option<String>,
5565            #[serde_as(as = "NumAsHex")]
5566            pub nonce: u64,
5567            #[serde_as(as = "UfeHex")]
5568            pub contract_address: Felt,
5569            #[serde_as(as = "UfeHex")]
5570            pub entry_point_selector: Felt,
5571            #[serde_as(as = "Vec<UfeHex>")]
5572            pub calldata: Vec<Felt>,
5573        }
5574
5575        let tagged = Tagged::deserialize(deserializer)?;
5576
5577        if let Some(tag_field) = &tagged.r#type {
5578            if tag_field != "L1_HANDLER" {
5579                return Err(serde::de::Error::custom("invalid `type` value"));
5580            }
5581        }
5582
5583        Ok(Self {
5584            version: tagged.version,
5585            nonce: tagged.nonce,
5586            contract_address: tagged.contract_address,
5587            entry_point_selector: tagged.entry_point_selector,
5588            calldata: tagged.calldata,
5589        })
5590    }
5591}
5592
5593impl Serialize for L1HandlerTransactionReceipt {
5594    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5595        #[serde_as]
5596        #[derive(Serialize)]
5597        struct Tagged<'a> {
5598            pub r#type: &'a str,
5599            pub message_hash: &'a Hash256,
5600            #[serde_as(as = "UfeHex")]
5601            pub transaction_hash: &'a Felt,
5602            pub actual_fee: &'a FeePayment,
5603            pub finality_status: &'a TransactionFinalityStatus,
5604            pub messages_sent: &'a [MsgToL1],
5605            pub events: &'a [Event],
5606            pub execution_resources: &'a ExecutionResources,
5607            #[serde(flatten)]
5608            pub execution_result: &'a ExecutionResult,
5609        }
5610
5611        let r#type = "L1_HANDLER";
5612
5613        let tagged = Tagged {
5614            r#type,
5615            message_hash: &self.message_hash,
5616            transaction_hash: &self.transaction_hash,
5617            actual_fee: &self.actual_fee,
5618            finality_status: &self.finality_status,
5619            messages_sent: &self.messages_sent,
5620            events: &self.events,
5621            execution_resources: &self.execution_resources,
5622            execution_result: &self.execution_result,
5623        };
5624
5625        Tagged::serialize(&tagged, serializer)
5626    }
5627}
5628
5629impl<'de> Deserialize<'de> for L1HandlerTransactionReceipt {
5630    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5631        #[serde_as]
5632        #[derive(Deserialize)]
5633        struct Tagged {
5634            pub r#type: Option<String>,
5635            pub message_hash: Hash256,
5636            #[serde_as(as = "UfeHex")]
5637            pub transaction_hash: Felt,
5638            pub actual_fee: FeePayment,
5639            pub finality_status: TransactionFinalityStatus,
5640            pub messages_sent: Vec<MsgToL1>,
5641            pub events: Vec<Event>,
5642            pub execution_resources: ExecutionResources,
5643            #[serde(flatten)]
5644            pub execution_result: ExecutionResult,
5645        }
5646
5647        let tagged = Tagged::deserialize(deserializer)?;
5648
5649        if let Some(tag_field) = &tagged.r#type {
5650            if tag_field != "L1_HANDLER" {
5651                return Err(serde::de::Error::custom("invalid `type` value"));
5652            }
5653        }
5654
5655        Ok(Self {
5656            message_hash: tagged.message_hash,
5657            transaction_hash: tagged.transaction_hash,
5658            actual_fee: tagged.actual_fee,
5659            finality_status: tagged.finality_status,
5660            messages_sent: tagged.messages_sent,
5661            events: tagged.events,
5662            execution_resources: tagged.execution_resources,
5663            execution_result: tagged.execution_result,
5664        })
5665    }
5666}
5667
5668impl Serialize for L1HandlerTransactionTrace {
5669    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5670        #[derive(Serialize)]
5671        struct Tagged<'a> {
5672            pub function_invocation: &'a FunctionInvocation,
5673            #[serde(skip_serializing_if = "Option::is_none")]
5674            pub state_diff: &'a Option<StateDiff>,
5675            pub execution_resources: &'a ExecutionResources,
5676            pub r#type: &'a str,
5677        }
5678
5679        let r#type = "L1_HANDLER";
5680
5681        let tagged = Tagged {
5682            function_invocation: &self.function_invocation,
5683            state_diff: &self.state_diff,
5684            execution_resources: &self.execution_resources,
5685            r#type,
5686        };
5687
5688        Tagged::serialize(&tagged, serializer)
5689    }
5690}
5691
5692impl<'de> Deserialize<'de> for L1HandlerTransactionTrace {
5693    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5694        #[derive(Deserialize)]
5695        #[cfg_attr(feature = "no_unknown_fields", serde(deny_unknown_fields))]
5696        struct Tagged {
5697            pub function_invocation: FunctionInvocation,
5698            #[serde(skip_serializing_if = "Option::is_none")]
5699            pub state_diff: Option<StateDiff>,
5700            pub execution_resources: ExecutionResources,
5701            pub r#type: Option<String>,
5702        }
5703
5704        let tagged = Tagged::deserialize(deserializer)?;
5705
5706        if let Some(tag_field) = &tagged.r#type {
5707            if tag_field != "L1_HANDLER" {
5708                return Err(serde::de::Error::custom("invalid `type` value"));
5709            }
5710        }
5711
5712        Ok(Self {
5713            function_invocation: tagged.function_invocation,
5714            state_diff: tagged.state_diff,
5715            execution_resources: tagged.execution_resources,
5716        })
5717    }
5718}
5719
5720impl Serialize for AddDeclareTransactionRequest {
5721    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5722        #[derive(Serialize)]
5723        struct AsObject<'a> {
5724            declare_transaction: Field0<'a>,
5725        }
5726
5727        #[derive(Serialize)]
5728        #[serde(transparent)]
5729        struct Field0<'a> {
5730            pub value: &'a BroadcastedDeclareTransaction,
5731        }
5732
5733        AsObject::serialize(
5734            &AsObject {
5735                declare_transaction: Field0 {
5736                    value: &self.declare_transaction,
5737                },
5738            },
5739            serializer,
5740        )
5741    }
5742}
5743
5744impl Serialize for AddDeclareTransactionRequestRef<'_> {
5745    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5746        #[derive(Serialize)]
5747        struct AsObject<'a> {
5748            declare_transaction: Field0<'a>,
5749        }
5750
5751        #[derive(Serialize)]
5752        #[serde(transparent)]
5753        struct Field0<'a> {
5754            pub value: &'a BroadcastedDeclareTransaction,
5755        }
5756
5757        AsObject::serialize(
5758            &AsObject {
5759                declare_transaction: Field0 {
5760                    value: self.declare_transaction,
5761                },
5762            },
5763            serializer,
5764        )
5765    }
5766}
5767
5768impl<'de> Deserialize<'de> for AddDeclareTransactionRequest {
5769    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5770        #[derive(Deserialize)]
5771        struct AsObject {
5772            declare_transaction: Field0,
5773        }
5774
5775        #[derive(Deserialize)]
5776        #[serde(transparent)]
5777        struct Field0 {
5778            pub value: BroadcastedDeclareTransaction,
5779        }
5780
5781        let temp = serde_json::Value::deserialize(deserializer)?;
5782
5783        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
5784            let field0 = serde_json::from_value::<Field0>(
5785                elements
5786                    .pop()
5787                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
5788            )
5789            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
5790
5791            Ok(Self {
5792                declare_transaction: field0.value,
5793            })
5794        } else if let Ok(object) = AsObject::deserialize(&temp) {
5795            Ok(Self {
5796                declare_transaction: object.declare_transaction.value,
5797            })
5798        } else {
5799            Err(serde::de::Error::custom("invalid sequence length"))
5800        }
5801    }
5802}
5803
5804impl Serialize for AddDeployAccountTransactionRequest {
5805    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5806        #[derive(Serialize)]
5807        struct AsObject<'a> {
5808            deploy_account_transaction: Field0<'a>,
5809        }
5810
5811        #[derive(Serialize)]
5812        #[serde(transparent)]
5813        struct Field0<'a> {
5814            pub value: &'a BroadcastedDeployAccountTransaction,
5815        }
5816
5817        AsObject::serialize(
5818            &AsObject {
5819                deploy_account_transaction: Field0 {
5820                    value: &self.deploy_account_transaction,
5821                },
5822            },
5823            serializer,
5824        )
5825    }
5826}
5827
5828impl Serialize for AddDeployAccountTransactionRequestRef<'_> {
5829    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5830        #[derive(Serialize)]
5831        struct AsObject<'a> {
5832            deploy_account_transaction: Field0<'a>,
5833        }
5834
5835        #[derive(Serialize)]
5836        #[serde(transparent)]
5837        struct Field0<'a> {
5838            pub value: &'a BroadcastedDeployAccountTransaction,
5839        }
5840
5841        AsObject::serialize(
5842            &AsObject {
5843                deploy_account_transaction: Field0 {
5844                    value: self.deploy_account_transaction,
5845                },
5846            },
5847            serializer,
5848        )
5849    }
5850}
5851
5852impl<'de> Deserialize<'de> for AddDeployAccountTransactionRequest {
5853    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5854        #[derive(Deserialize)]
5855        struct AsObject {
5856            deploy_account_transaction: Field0,
5857        }
5858
5859        #[derive(Deserialize)]
5860        #[serde(transparent)]
5861        struct Field0 {
5862            pub value: BroadcastedDeployAccountTransaction,
5863        }
5864
5865        let temp = serde_json::Value::deserialize(deserializer)?;
5866
5867        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
5868            let field0 = serde_json::from_value::<Field0>(
5869                elements
5870                    .pop()
5871                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
5872            )
5873            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
5874
5875            Ok(Self {
5876                deploy_account_transaction: field0.value,
5877            })
5878        } else if let Ok(object) = AsObject::deserialize(&temp) {
5879            Ok(Self {
5880                deploy_account_transaction: object.deploy_account_transaction.value,
5881            })
5882        } else {
5883            Err(serde::de::Error::custom("invalid sequence length"))
5884        }
5885    }
5886}
5887
5888impl Serialize for AddInvokeTransactionRequest {
5889    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5890        #[derive(Serialize)]
5891        struct AsObject<'a> {
5892            invoke_transaction: Field0<'a>,
5893        }
5894
5895        #[derive(Serialize)]
5896        #[serde(transparent)]
5897        struct Field0<'a> {
5898            pub value: &'a BroadcastedInvokeTransaction,
5899        }
5900
5901        AsObject::serialize(
5902            &AsObject {
5903                invoke_transaction: Field0 {
5904                    value: &self.invoke_transaction,
5905                },
5906            },
5907            serializer,
5908        )
5909    }
5910}
5911
5912impl Serialize for AddInvokeTransactionRequestRef<'_> {
5913    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5914        #[derive(Serialize)]
5915        struct AsObject<'a> {
5916            invoke_transaction: Field0<'a>,
5917        }
5918
5919        #[derive(Serialize)]
5920        #[serde(transparent)]
5921        struct Field0<'a> {
5922            pub value: &'a BroadcastedInvokeTransaction,
5923        }
5924
5925        AsObject::serialize(
5926            &AsObject {
5927                invoke_transaction: Field0 {
5928                    value: self.invoke_transaction,
5929                },
5930            },
5931            serializer,
5932        )
5933    }
5934}
5935
5936impl<'de> Deserialize<'de> for AddInvokeTransactionRequest {
5937    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5938        #[derive(Deserialize)]
5939        struct AsObject {
5940            invoke_transaction: Field0,
5941        }
5942
5943        #[derive(Deserialize)]
5944        #[serde(transparent)]
5945        struct Field0 {
5946            pub value: BroadcastedInvokeTransaction,
5947        }
5948
5949        let temp = serde_json::Value::deserialize(deserializer)?;
5950
5951        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
5952            let field0 = serde_json::from_value::<Field0>(
5953                elements
5954                    .pop()
5955                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
5956            )
5957            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
5958
5959            Ok(Self {
5960                invoke_transaction: field0.value,
5961            })
5962        } else if let Ok(object) = AsObject::deserialize(&temp) {
5963            Ok(Self {
5964                invoke_transaction: object.invoke_transaction.value,
5965            })
5966        } else {
5967            Err(serde::de::Error::custom("invalid sequence length"))
5968        }
5969    }
5970}
5971
5972impl Serialize for BlockHashAndNumberRequest {
5973    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5974        use serde::ser::SerializeSeq;
5975
5976        let seq = serializer.serialize_seq(Some(0))?;
5977        seq.end()
5978    }
5979}
5980
5981impl<'de> Deserialize<'de> for BlockHashAndNumberRequest {
5982    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
5983        let elements = Vec::<()>::deserialize(deserializer)?;
5984        if !elements.is_empty() {
5985            return Err(serde::de::Error::custom("invalid sequence length"));
5986        }
5987        Ok(Self)
5988    }
5989}
5990
5991impl Serialize for BlockNumberRequest {
5992    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
5993        use serde::ser::SerializeSeq;
5994
5995        let seq = serializer.serialize_seq(Some(0))?;
5996        seq.end()
5997    }
5998}
5999
6000impl<'de> Deserialize<'de> for BlockNumberRequest {
6001    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6002        let elements = Vec::<()>::deserialize(deserializer)?;
6003        if !elements.is_empty() {
6004            return Err(serde::de::Error::custom("invalid sequence length"));
6005        }
6006        Ok(Self)
6007    }
6008}
6009
6010impl Serialize for CallRequest {
6011    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6012        #[derive(Serialize)]
6013        struct AsObject<'a> {
6014            request: Field0<'a>,
6015            block_id: Field1<'a>,
6016        }
6017
6018        #[derive(Serialize)]
6019        #[serde(transparent)]
6020        struct Field0<'a> {
6021            pub value: &'a FunctionCall,
6022        }
6023
6024        #[derive(Serialize)]
6025        #[serde(transparent)]
6026        struct Field1<'a> {
6027            pub value: &'a BlockId,
6028        }
6029
6030        AsObject::serialize(
6031            &AsObject {
6032                request: Field0 {
6033                    value: &self.request,
6034                },
6035                block_id: Field1 {
6036                    value: &self.block_id,
6037                },
6038            },
6039            serializer,
6040        )
6041    }
6042}
6043
6044impl Serialize for CallRequestRef<'_> {
6045    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6046        #[derive(Serialize)]
6047        struct AsObject<'a> {
6048            request: Field0<'a>,
6049            block_id: Field1<'a>,
6050        }
6051
6052        #[derive(Serialize)]
6053        #[serde(transparent)]
6054        struct Field0<'a> {
6055            pub value: &'a FunctionCall,
6056        }
6057
6058        #[derive(Serialize)]
6059        #[serde(transparent)]
6060        struct Field1<'a> {
6061            pub value: &'a BlockId,
6062        }
6063
6064        AsObject::serialize(
6065            &AsObject {
6066                request: Field0 {
6067                    value: self.request,
6068                },
6069                block_id: Field1 {
6070                    value: self.block_id,
6071                },
6072            },
6073            serializer,
6074        )
6075    }
6076}
6077
6078impl<'de> Deserialize<'de> for CallRequest {
6079    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6080        #[derive(Deserialize)]
6081        struct AsObject {
6082            request: Field0,
6083            block_id: Field1,
6084        }
6085
6086        #[derive(Deserialize)]
6087        #[serde(transparent)]
6088        struct Field0 {
6089            pub value: FunctionCall,
6090        }
6091
6092        #[derive(Deserialize)]
6093        #[serde(transparent)]
6094        struct Field1 {
6095            pub value: BlockId,
6096        }
6097
6098        let temp = serde_json::Value::deserialize(deserializer)?;
6099
6100        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6101            let field1 = serde_json::from_value::<Field1>(
6102                elements
6103                    .pop()
6104                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6105            )
6106            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6107            let field0 = serde_json::from_value::<Field0>(
6108                elements
6109                    .pop()
6110                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6111            )
6112            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6113
6114            Ok(Self {
6115                request: field0.value,
6116                block_id: field1.value,
6117            })
6118        } else if let Ok(object) = AsObject::deserialize(&temp) {
6119            Ok(Self {
6120                request: object.request.value,
6121                block_id: object.block_id.value,
6122            })
6123        } else {
6124            Err(serde::de::Error::custom("invalid sequence length"))
6125        }
6126    }
6127}
6128
6129impl Serialize for ChainIdRequest {
6130    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6131        use serde::ser::SerializeSeq;
6132
6133        let seq = serializer.serialize_seq(Some(0))?;
6134        seq.end()
6135    }
6136}
6137
6138impl<'de> Deserialize<'de> for ChainIdRequest {
6139    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6140        let elements = Vec::<()>::deserialize(deserializer)?;
6141        if !elements.is_empty() {
6142            return Err(serde::de::Error::custom("invalid sequence length"));
6143        }
6144        Ok(Self)
6145    }
6146}
6147
6148impl Serialize for EstimateFeeRequest {
6149    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6150        #[derive(Serialize)]
6151        struct AsObject<'a> {
6152            request: Field0<'a>,
6153            simulation_flags: Field1<'a>,
6154            block_id: Field2<'a>,
6155        }
6156
6157        #[derive(Serialize)]
6158        #[serde(transparent)]
6159        struct Field0<'a> {
6160            pub value: &'a [BroadcastedTransaction],
6161        }
6162
6163        #[derive(Serialize)]
6164        #[serde(transparent)]
6165        struct Field1<'a> {
6166            pub value: &'a [SimulationFlagForEstimateFee],
6167        }
6168
6169        #[derive(Serialize)]
6170        #[serde(transparent)]
6171        struct Field2<'a> {
6172            pub value: &'a BlockId,
6173        }
6174
6175        AsObject::serialize(
6176            &AsObject {
6177                request: Field0 {
6178                    value: &self.request,
6179                },
6180                simulation_flags: Field1 {
6181                    value: &self.simulation_flags,
6182                },
6183                block_id: Field2 {
6184                    value: &self.block_id,
6185                },
6186            },
6187            serializer,
6188        )
6189    }
6190}
6191
6192impl Serialize for EstimateFeeRequestRef<'_> {
6193    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6194        #[derive(Serialize)]
6195        struct AsObject<'a> {
6196            request: Field0<'a>,
6197            simulation_flags: Field1<'a>,
6198            block_id: Field2<'a>,
6199        }
6200
6201        #[derive(Serialize)]
6202        #[serde(transparent)]
6203        struct Field0<'a> {
6204            pub value: &'a [BroadcastedTransaction],
6205        }
6206
6207        #[derive(Serialize)]
6208        #[serde(transparent)]
6209        struct Field1<'a> {
6210            pub value: &'a [SimulationFlagForEstimateFee],
6211        }
6212
6213        #[derive(Serialize)]
6214        #[serde(transparent)]
6215        struct Field2<'a> {
6216            pub value: &'a BlockId,
6217        }
6218
6219        AsObject::serialize(
6220            &AsObject {
6221                request: Field0 {
6222                    value: self.request,
6223                },
6224                simulation_flags: Field1 {
6225                    value: self.simulation_flags,
6226                },
6227                block_id: Field2 {
6228                    value: self.block_id,
6229                },
6230            },
6231            serializer,
6232        )
6233    }
6234}
6235
6236impl<'de> Deserialize<'de> for EstimateFeeRequest {
6237    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6238        #[derive(Deserialize)]
6239        struct AsObject {
6240            request: Field0,
6241            simulation_flags: Field1,
6242            block_id: Field2,
6243        }
6244
6245        #[derive(Deserialize)]
6246        #[serde(transparent)]
6247        struct Field0 {
6248            pub value: Vec<BroadcastedTransaction>,
6249        }
6250
6251        #[derive(Deserialize)]
6252        #[serde(transparent)]
6253        struct Field1 {
6254            pub value: Vec<SimulationFlagForEstimateFee>,
6255        }
6256
6257        #[derive(Deserialize)]
6258        #[serde(transparent)]
6259        struct Field2 {
6260            pub value: BlockId,
6261        }
6262
6263        let temp = serde_json::Value::deserialize(deserializer)?;
6264
6265        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6266            let field2 = serde_json::from_value::<Field2>(
6267                elements
6268                    .pop()
6269                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6270            )
6271            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6272            let field1 = serde_json::from_value::<Field1>(
6273                elements
6274                    .pop()
6275                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6276            )
6277            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6278            let field0 = serde_json::from_value::<Field0>(
6279                elements
6280                    .pop()
6281                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6282            )
6283            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6284
6285            Ok(Self {
6286                request: field0.value,
6287                simulation_flags: field1.value,
6288                block_id: field2.value,
6289            })
6290        } else if let Ok(object) = AsObject::deserialize(&temp) {
6291            Ok(Self {
6292                request: object.request.value,
6293                simulation_flags: object.simulation_flags.value,
6294                block_id: object.block_id.value,
6295            })
6296        } else {
6297            Err(serde::de::Error::custom("invalid sequence length"))
6298        }
6299    }
6300}
6301
6302impl Serialize for EstimateMessageFeeRequest {
6303    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6304        #[derive(Serialize)]
6305        struct AsObject<'a> {
6306            message: Field0<'a>,
6307            block_id: Field1<'a>,
6308        }
6309
6310        #[derive(Serialize)]
6311        #[serde(transparent)]
6312        struct Field0<'a> {
6313            pub value: &'a MsgFromL1,
6314        }
6315
6316        #[derive(Serialize)]
6317        #[serde(transparent)]
6318        struct Field1<'a> {
6319            pub value: &'a BlockId,
6320        }
6321
6322        AsObject::serialize(
6323            &AsObject {
6324                message: Field0 {
6325                    value: &self.message,
6326                },
6327                block_id: Field1 {
6328                    value: &self.block_id,
6329                },
6330            },
6331            serializer,
6332        )
6333    }
6334}
6335
6336impl Serialize for EstimateMessageFeeRequestRef<'_> {
6337    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6338        #[derive(Serialize)]
6339        struct AsObject<'a> {
6340            message: Field0<'a>,
6341            block_id: Field1<'a>,
6342        }
6343
6344        #[derive(Serialize)]
6345        #[serde(transparent)]
6346        struct Field0<'a> {
6347            pub value: &'a MsgFromL1,
6348        }
6349
6350        #[derive(Serialize)]
6351        #[serde(transparent)]
6352        struct Field1<'a> {
6353            pub value: &'a BlockId,
6354        }
6355
6356        AsObject::serialize(
6357            &AsObject {
6358                message: Field0 {
6359                    value: self.message,
6360                },
6361                block_id: Field1 {
6362                    value: self.block_id,
6363                },
6364            },
6365            serializer,
6366        )
6367    }
6368}
6369
6370impl<'de> Deserialize<'de> for EstimateMessageFeeRequest {
6371    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6372        #[derive(Deserialize)]
6373        struct AsObject {
6374            message: Field0,
6375            block_id: Field1,
6376        }
6377
6378        #[derive(Deserialize)]
6379        #[serde(transparent)]
6380        struct Field0 {
6381            pub value: MsgFromL1,
6382        }
6383
6384        #[derive(Deserialize)]
6385        #[serde(transparent)]
6386        struct Field1 {
6387            pub value: BlockId,
6388        }
6389
6390        let temp = serde_json::Value::deserialize(deserializer)?;
6391
6392        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6393            let field1 = serde_json::from_value::<Field1>(
6394                elements
6395                    .pop()
6396                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6397            )
6398            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6399            let field0 = serde_json::from_value::<Field0>(
6400                elements
6401                    .pop()
6402                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6403            )
6404            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6405
6406            Ok(Self {
6407                message: field0.value,
6408                block_id: field1.value,
6409            })
6410        } else if let Ok(object) = AsObject::deserialize(&temp) {
6411            Ok(Self {
6412                message: object.message.value,
6413                block_id: object.block_id.value,
6414            })
6415        } else {
6416            Err(serde::de::Error::custom("invalid sequence length"))
6417        }
6418    }
6419}
6420
6421impl Serialize for GetBlockTransactionCountRequest {
6422    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6423        #[derive(Serialize)]
6424        struct AsObject<'a> {
6425            block_id: Field0<'a>,
6426        }
6427
6428        #[derive(Serialize)]
6429        #[serde(transparent)]
6430        struct Field0<'a> {
6431            pub value: &'a BlockId,
6432        }
6433
6434        AsObject::serialize(
6435            &AsObject {
6436                block_id: Field0 {
6437                    value: &self.block_id,
6438                },
6439            },
6440            serializer,
6441        )
6442    }
6443}
6444
6445impl Serialize for GetBlockTransactionCountRequestRef<'_> {
6446    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6447        #[derive(Serialize)]
6448        struct AsObject<'a> {
6449            block_id: Field0<'a>,
6450        }
6451
6452        #[derive(Serialize)]
6453        #[serde(transparent)]
6454        struct Field0<'a> {
6455            pub value: &'a BlockId,
6456        }
6457
6458        AsObject::serialize(
6459            &AsObject {
6460                block_id: Field0 {
6461                    value: self.block_id,
6462                },
6463            },
6464            serializer,
6465        )
6466    }
6467}
6468
6469impl<'de> Deserialize<'de> for GetBlockTransactionCountRequest {
6470    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6471        #[derive(Deserialize)]
6472        struct AsObject {
6473            block_id: Field0,
6474        }
6475
6476        #[derive(Deserialize)]
6477        #[serde(transparent)]
6478        struct Field0 {
6479            pub value: BlockId,
6480        }
6481
6482        let temp = serde_json::Value::deserialize(deserializer)?;
6483
6484        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6485            let field0 = serde_json::from_value::<Field0>(
6486                elements
6487                    .pop()
6488                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6489            )
6490            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6491
6492            Ok(Self {
6493                block_id: field0.value,
6494            })
6495        } else if let Ok(object) = AsObject::deserialize(&temp) {
6496            Ok(Self {
6497                block_id: object.block_id.value,
6498            })
6499        } else {
6500            Err(serde::de::Error::custom("invalid sequence length"))
6501        }
6502    }
6503}
6504
6505impl Serialize for GetBlockWithReceiptsRequest {
6506    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6507        #[derive(Serialize)]
6508        struct AsObject<'a> {
6509            block_id: Field0<'a>,
6510        }
6511
6512        #[derive(Serialize)]
6513        #[serde(transparent)]
6514        struct Field0<'a> {
6515            pub value: &'a BlockId,
6516        }
6517
6518        AsObject::serialize(
6519            &AsObject {
6520                block_id: Field0 {
6521                    value: &self.block_id,
6522                },
6523            },
6524            serializer,
6525        )
6526    }
6527}
6528
6529impl Serialize for GetBlockWithReceiptsRequestRef<'_> {
6530    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6531        #[derive(Serialize)]
6532        struct AsObject<'a> {
6533            block_id: Field0<'a>,
6534        }
6535
6536        #[derive(Serialize)]
6537        #[serde(transparent)]
6538        struct Field0<'a> {
6539            pub value: &'a BlockId,
6540        }
6541
6542        AsObject::serialize(
6543            &AsObject {
6544                block_id: Field0 {
6545                    value: self.block_id,
6546                },
6547            },
6548            serializer,
6549        )
6550    }
6551}
6552
6553impl<'de> Deserialize<'de> for GetBlockWithReceiptsRequest {
6554    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6555        #[derive(Deserialize)]
6556        struct AsObject {
6557            block_id: Field0,
6558        }
6559
6560        #[derive(Deserialize)]
6561        #[serde(transparent)]
6562        struct Field0 {
6563            pub value: BlockId,
6564        }
6565
6566        let temp = serde_json::Value::deserialize(deserializer)?;
6567
6568        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6569            let field0 = serde_json::from_value::<Field0>(
6570                elements
6571                    .pop()
6572                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6573            )
6574            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6575
6576            Ok(Self {
6577                block_id: field0.value,
6578            })
6579        } else if let Ok(object) = AsObject::deserialize(&temp) {
6580            Ok(Self {
6581                block_id: object.block_id.value,
6582            })
6583        } else {
6584            Err(serde::de::Error::custom("invalid sequence length"))
6585        }
6586    }
6587}
6588
6589impl Serialize for GetBlockWithTxHashesRequest {
6590    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6591        #[derive(Serialize)]
6592        struct AsObject<'a> {
6593            block_id: Field0<'a>,
6594        }
6595
6596        #[derive(Serialize)]
6597        #[serde(transparent)]
6598        struct Field0<'a> {
6599            pub value: &'a BlockId,
6600        }
6601
6602        AsObject::serialize(
6603            &AsObject {
6604                block_id: Field0 {
6605                    value: &self.block_id,
6606                },
6607            },
6608            serializer,
6609        )
6610    }
6611}
6612
6613impl Serialize for GetBlockWithTxHashesRequestRef<'_> {
6614    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6615        #[derive(Serialize)]
6616        struct AsObject<'a> {
6617            block_id: Field0<'a>,
6618        }
6619
6620        #[derive(Serialize)]
6621        #[serde(transparent)]
6622        struct Field0<'a> {
6623            pub value: &'a BlockId,
6624        }
6625
6626        AsObject::serialize(
6627            &AsObject {
6628                block_id: Field0 {
6629                    value: self.block_id,
6630                },
6631            },
6632            serializer,
6633        )
6634    }
6635}
6636
6637impl<'de> Deserialize<'de> for GetBlockWithTxHashesRequest {
6638    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6639        #[derive(Deserialize)]
6640        struct AsObject {
6641            block_id: Field0,
6642        }
6643
6644        #[derive(Deserialize)]
6645        #[serde(transparent)]
6646        struct Field0 {
6647            pub value: BlockId,
6648        }
6649
6650        let temp = serde_json::Value::deserialize(deserializer)?;
6651
6652        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6653            let field0 = serde_json::from_value::<Field0>(
6654                elements
6655                    .pop()
6656                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6657            )
6658            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6659
6660            Ok(Self {
6661                block_id: field0.value,
6662            })
6663        } else if let Ok(object) = AsObject::deserialize(&temp) {
6664            Ok(Self {
6665                block_id: object.block_id.value,
6666            })
6667        } else {
6668            Err(serde::de::Error::custom("invalid sequence length"))
6669        }
6670    }
6671}
6672
6673impl Serialize for GetBlockWithTxsRequest {
6674    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6675        #[derive(Serialize)]
6676        struct AsObject<'a> {
6677            block_id: Field0<'a>,
6678        }
6679
6680        #[derive(Serialize)]
6681        #[serde(transparent)]
6682        struct Field0<'a> {
6683            pub value: &'a BlockId,
6684        }
6685
6686        AsObject::serialize(
6687            &AsObject {
6688                block_id: Field0 {
6689                    value: &self.block_id,
6690                },
6691            },
6692            serializer,
6693        )
6694    }
6695}
6696
6697impl Serialize for GetBlockWithTxsRequestRef<'_> {
6698    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6699        #[derive(Serialize)]
6700        struct AsObject<'a> {
6701            block_id: Field0<'a>,
6702        }
6703
6704        #[derive(Serialize)]
6705        #[serde(transparent)]
6706        struct Field0<'a> {
6707            pub value: &'a BlockId,
6708        }
6709
6710        AsObject::serialize(
6711            &AsObject {
6712                block_id: Field0 {
6713                    value: self.block_id,
6714                },
6715            },
6716            serializer,
6717        )
6718    }
6719}
6720
6721impl<'de> Deserialize<'de> for GetBlockWithTxsRequest {
6722    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6723        #[derive(Deserialize)]
6724        struct AsObject {
6725            block_id: Field0,
6726        }
6727
6728        #[derive(Deserialize)]
6729        #[serde(transparent)]
6730        struct Field0 {
6731            pub value: BlockId,
6732        }
6733
6734        let temp = serde_json::Value::deserialize(deserializer)?;
6735
6736        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6737            let field0 = serde_json::from_value::<Field0>(
6738                elements
6739                    .pop()
6740                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6741            )
6742            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6743
6744            Ok(Self {
6745                block_id: field0.value,
6746            })
6747        } else if let Ok(object) = AsObject::deserialize(&temp) {
6748            Ok(Self {
6749                block_id: object.block_id.value,
6750            })
6751        } else {
6752            Err(serde::de::Error::custom("invalid sequence length"))
6753        }
6754    }
6755}
6756
6757impl Serialize for GetClassAtRequest {
6758    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6759        #[derive(Serialize)]
6760        struct AsObject<'a> {
6761            block_id: Field0<'a>,
6762            contract_address: Field1<'a>,
6763        }
6764
6765        #[derive(Serialize)]
6766        #[serde(transparent)]
6767        struct Field0<'a> {
6768            pub value: &'a BlockId,
6769        }
6770
6771        #[serde_as]
6772        #[derive(Serialize)]
6773        #[serde(transparent)]
6774        struct Field1<'a> {
6775            #[serde_as(as = "UfeHex")]
6776            pub value: &'a Felt,
6777        }
6778
6779        AsObject::serialize(
6780            &AsObject {
6781                block_id: Field0 {
6782                    value: &self.block_id,
6783                },
6784                contract_address: Field1 {
6785                    value: &self.contract_address,
6786                },
6787            },
6788            serializer,
6789        )
6790    }
6791}
6792
6793impl Serialize for GetClassAtRequestRef<'_> {
6794    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6795        #[derive(Serialize)]
6796        struct AsObject<'a> {
6797            block_id: Field0<'a>,
6798            contract_address: Field1<'a>,
6799        }
6800
6801        #[derive(Serialize)]
6802        #[serde(transparent)]
6803        struct Field0<'a> {
6804            pub value: &'a BlockId,
6805        }
6806
6807        #[serde_as]
6808        #[derive(Serialize)]
6809        #[serde(transparent)]
6810        struct Field1<'a> {
6811            #[serde_as(as = "UfeHex")]
6812            pub value: &'a Felt,
6813        }
6814
6815        AsObject::serialize(
6816            &AsObject {
6817                block_id: Field0 {
6818                    value: self.block_id,
6819                },
6820                contract_address: Field1 {
6821                    value: self.contract_address,
6822                },
6823            },
6824            serializer,
6825        )
6826    }
6827}
6828
6829impl<'de> Deserialize<'de> for GetClassAtRequest {
6830    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6831        #[derive(Deserialize)]
6832        struct AsObject {
6833            block_id: Field0,
6834            contract_address: Field1,
6835        }
6836
6837        #[derive(Deserialize)]
6838        #[serde(transparent)]
6839        struct Field0 {
6840            pub value: BlockId,
6841        }
6842
6843        #[serde_as]
6844        #[derive(Deserialize)]
6845        #[serde(transparent)]
6846        struct Field1 {
6847            #[serde_as(as = "UfeHex")]
6848            pub value: Felt,
6849        }
6850
6851        let temp = serde_json::Value::deserialize(deserializer)?;
6852
6853        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6854            let field1 = serde_json::from_value::<Field1>(
6855                elements
6856                    .pop()
6857                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6858            )
6859            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6860            let field0 = serde_json::from_value::<Field0>(
6861                elements
6862                    .pop()
6863                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6864            )
6865            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6866
6867            Ok(Self {
6868                block_id: field0.value,
6869                contract_address: field1.value,
6870            })
6871        } else if let Ok(object) = AsObject::deserialize(&temp) {
6872            Ok(Self {
6873                block_id: object.block_id.value,
6874                contract_address: object.contract_address.value,
6875            })
6876        } else {
6877            Err(serde::de::Error::custom("invalid sequence length"))
6878        }
6879    }
6880}
6881
6882impl Serialize for GetClassHashAtRequest {
6883    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6884        #[derive(Serialize)]
6885        struct AsObject<'a> {
6886            block_id: Field0<'a>,
6887            contract_address: Field1<'a>,
6888        }
6889
6890        #[derive(Serialize)]
6891        #[serde(transparent)]
6892        struct Field0<'a> {
6893            pub value: &'a BlockId,
6894        }
6895
6896        #[serde_as]
6897        #[derive(Serialize)]
6898        #[serde(transparent)]
6899        struct Field1<'a> {
6900            #[serde_as(as = "UfeHex")]
6901            pub value: &'a Felt,
6902        }
6903
6904        AsObject::serialize(
6905            &AsObject {
6906                block_id: Field0 {
6907                    value: &self.block_id,
6908                },
6909                contract_address: Field1 {
6910                    value: &self.contract_address,
6911                },
6912            },
6913            serializer,
6914        )
6915    }
6916}
6917
6918impl Serialize for GetClassHashAtRequestRef<'_> {
6919    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
6920        #[derive(Serialize)]
6921        struct AsObject<'a> {
6922            block_id: Field0<'a>,
6923            contract_address: Field1<'a>,
6924        }
6925
6926        #[derive(Serialize)]
6927        #[serde(transparent)]
6928        struct Field0<'a> {
6929            pub value: &'a BlockId,
6930        }
6931
6932        #[serde_as]
6933        #[derive(Serialize)]
6934        #[serde(transparent)]
6935        struct Field1<'a> {
6936            #[serde_as(as = "UfeHex")]
6937            pub value: &'a Felt,
6938        }
6939
6940        AsObject::serialize(
6941            &AsObject {
6942                block_id: Field0 {
6943                    value: self.block_id,
6944                },
6945                contract_address: Field1 {
6946                    value: self.contract_address,
6947                },
6948            },
6949            serializer,
6950        )
6951    }
6952}
6953
6954impl<'de> Deserialize<'de> for GetClassHashAtRequest {
6955    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
6956        #[derive(Deserialize)]
6957        struct AsObject {
6958            block_id: Field0,
6959            contract_address: Field1,
6960        }
6961
6962        #[derive(Deserialize)]
6963        #[serde(transparent)]
6964        struct Field0 {
6965            pub value: BlockId,
6966        }
6967
6968        #[serde_as]
6969        #[derive(Deserialize)]
6970        #[serde(transparent)]
6971        struct Field1 {
6972            #[serde_as(as = "UfeHex")]
6973            pub value: Felt,
6974        }
6975
6976        let temp = serde_json::Value::deserialize(deserializer)?;
6977
6978        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
6979            let field1 = serde_json::from_value::<Field1>(
6980                elements
6981                    .pop()
6982                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6983            )
6984            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6985            let field0 = serde_json::from_value::<Field0>(
6986                elements
6987                    .pop()
6988                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
6989            )
6990            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
6991
6992            Ok(Self {
6993                block_id: field0.value,
6994                contract_address: field1.value,
6995            })
6996        } else if let Ok(object) = AsObject::deserialize(&temp) {
6997            Ok(Self {
6998                block_id: object.block_id.value,
6999                contract_address: object.contract_address.value,
7000            })
7001        } else {
7002            Err(serde::de::Error::custom("invalid sequence length"))
7003        }
7004    }
7005}
7006
7007impl Serialize for GetClassRequest {
7008    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7009        #[derive(Serialize)]
7010        struct AsObject<'a> {
7011            block_id: Field0<'a>,
7012            class_hash: Field1<'a>,
7013        }
7014
7015        #[derive(Serialize)]
7016        #[serde(transparent)]
7017        struct Field0<'a> {
7018            pub value: &'a BlockId,
7019        }
7020
7021        #[serde_as]
7022        #[derive(Serialize)]
7023        #[serde(transparent)]
7024        struct Field1<'a> {
7025            #[serde_as(as = "UfeHex")]
7026            pub value: &'a Felt,
7027        }
7028
7029        AsObject::serialize(
7030            &AsObject {
7031                block_id: Field0 {
7032                    value: &self.block_id,
7033                },
7034                class_hash: Field1 {
7035                    value: &self.class_hash,
7036                },
7037            },
7038            serializer,
7039        )
7040    }
7041}
7042
7043impl Serialize for GetClassRequestRef<'_> {
7044    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7045        #[derive(Serialize)]
7046        struct AsObject<'a> {
7047            block_id: Field0<'a>,
7048            class_hash: Field1<'a>,
7049        }
7050
7051        #[derive(Serialize)]
7052        #[serde(transparent)]
7053        struct Field0<'a> {
7054            pub value: &'a BlockId,
7055        }
7056
7057        #[serde_as]
7058        #[derive(Serialize)]
7059        #[serde(transparent)]
7060        struct Field1<'a> {
7061            #[serde_as(as = "UfeHex")]
7062            pub value: &'a Felt,
7063        }
7064
7065        AsObject::serialize(
7066            &AsObject {
7067                block_id: Field0 {
7068                    value: self.block_id,
7069                },
7070                class_hash: Field1 {
7071                    value: self.class_hash,
7072                },
7073            },
7074            serializer,
7075        )
7076    }
7077}
7078
7079impl<'de> Deserialize<'de> for GetClassRequest {
7080    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7081        #[derive(Deserialize)]
7082        struct AsObject {
7083            block_id: Field0,
7084            class_hash: Field1,
7085        }
7086
7087        #[derive(Deserialize)]
7088        #[serde(transparent)]
7089        struct Field0 {
7090            pub value: BlockId,
7091        }
7092
7093        #[serde_as]
7094        #[derive(Deserialize)]
7095        #[serde(transparent)]
7096        struct Field1 {
7097            #[serde_as(as = "UfeHex")]
7098            pub value: Felt,
7099        }
7100
7101        let temp = serde_json::Value::deserialize(deserializer)?;
7102
7103        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7104            let field1 = serde_json::from_value::<Field1>(
7105                elements
7106                    .pop()
7107                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7108            )
7109            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7110            let field0 = serde_json::from_value::<Field0>(
7111                elements
7112                    .pop()
7113                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7114            )
7115            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7116
7117            Ok(Self {
7118                block_id: field0.value,
7119                class_hash: field1.value,
7120            })
7121        } else if let Ok(object) = AsObject::deserialize(&temp) {
7122            Ok(Self {
7123                block_id: object.block_id.value,
7124                class_hash: object.class_hash.value,
7125            })
7126        } else {
7127            Err(serde::de::Error::custom("invalid sequence length"))
7128        }
7129    }
7130}
7131
7132impl Serialize for GetEventsRequest {
7133    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7134        #[derive(Serialize)]
7135        struct AsObject<'a> {
7136            filter: Field0<'a>,
7137        }
7138
7139        #[derive(Serialize)]
7140        #[serde(transparent)]
7141        struct Field0<'a> {
7142            pub value: &'a EventFilterWithPage,
7143        }
7144
7145        AsObject::serialize(
7146            &AsObject {
7147                filter: Field0 {
7148                    value: &self.filter,
7149                },
7150            },
7151            serializer,
7152        )
7153    }
7154}
7155
7156impl Serialize for GetEventsRequestRef<'_> {
7157    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7158        #[derive(Serialize)]
7159        struct AsObject<'a> {
7160            filter: Field0<'a>,
7161        }
7162
7163        #[derive(Serialize)]
7164        #[serde(transparent)]
7165        struct Field0<'a> {
7166            pub value: &'a EventFilterWithPage,
7167        }
7168
7169        AsObject::serialize(
7170            &AsObject {
7171                filter: Field0 { value: self.filter },
7172            },
7173            serializer,
7174        )
7175    }
7176}
7177
7178impl<'de> Deserialize<'de> for GetEventsRequest {
7179    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7180        #[derive(Deserialize)]
7181        struct AsObject {
7182            filter: Field0,
7183        }
7184
7185        #[derive(Deserialize)]
7186        #[serde(transparent)]
7187        struct Field0 {
7188            pub value: EventFilterWithPage,
7189        }
7190
7191        let temp = serde_json::Value::deserialize(deserializer)?;
7192
7193        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7194            let field0 = serde_json::from_value::<Field0>(
7195                elements
7196                    .pop()
7197                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7198            )
7199            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7200
7201            Ok(Self {
7202                filter: field0.value,
7203            })
7204        } else if let Ok(object) = AsObject::deserialize(&temp) {
7205            Ok(Self {
7206                filter: object.filter.value,
7207            })
7208        } else {
7209            Err(serde::de::Error::custom("invalid sequence length"))
7210        }
7211    }
7212}
7213
7214impl Serialize for GetMessagesStatusRequest {
7215    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7216        #[derive(Serialize)]
7217        struct AsObject<'a> {
7218            transaction_hash: Field0<'a>,
7219        }
7220
7221        #[derive(Serialize)]
7222        #[serde(transparent)]
7223        struct Field0<'a> {
7224            pub value: &'a Hash256,
7225        }
7226
7227        AsObject::serialize(
7228            &AsObject {
7229                transaction_hash: Field0 {
7230                    value: &self.transaction_hash,
7231                },
7232            },
7233            serializer,
7234        )
7235    }
7236}
7237
7238impl Serialize for GetMessagesStatusRequestRef<'_> {
7239    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7240        #[derive(Serialize)]
7241        struct AsObject<'a> {
7242            transaction_hash: Field0<'a>,
7243        }
7244
7245        #[derive(Serialize)]
7246        #[serde(transparent)]
7247        struct Field0<'a> {
7248            pub value: &'a Hash256,
7249        }
7250
7251        AsObject::serialize(
7252            &AsObject {
7253                transaction_hash: Field0 {
7254                    value: self.transaction_hash,
7255                },
7256            },
7257            serializer,
7258        )
7259    }
7260}
7261
7262impl<'de> Deserialize<'de> for GetMessagesStatusRequest {
7263    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7264        #[derive(Deserialize)]
7265        struct AsObject {
7266            transaction_hash: Field0,
7267        }
7268
7269        #[derive(Deserialize)]
7270        #[serde(transparent)]
7271        struct Field0 {
7272            pub value: Hash256,
7273        }
7274
7275        let temp = serde_json::Value::deserialize(deserializer)?;
7276
7277        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7278            let field0 = serde_json::from_value::<Field0>(
7279                elements
7280                    .pop()
7281                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7282            )
7283            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7284
7285            Ok(Self {
7286                transaction_hash: field0.value,
7287            })
7288        } else if let Ok(object) = AsObject::deserialize(&temp) {
7289            Ok(Self {
7290                transaction_hash: object.transaction_hash.value,
7291            })
7292        } else {
7293            Err(serde::de::Error::custom("invalid sequence length"))
7294        }
7295    }
7296}
7297
7298impl Serialize for GetNonceRequest {
7299    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7300        #[derive(Serialize)]
7301        struct AsObject<'a> {
7302            block_id: Field0<'a>,
7303            contract_address: Field1<'a>,
7304        }
7305
7306        #[derive(Serialize)]
7307        #[serde(transparent)]
7308        struct Field0<'a> {
7309            pub value: &'a BlockId,
7310        }
7311
7312        #[serde_as]
7313        #[derive(Serialize)]
7314        #[serde(transparent)]
7315        struct Field1<'a> {
7316            #[serde_as(as = "UfeHex")]
7317            pub value: &'a Felt,
7318        }
7319
7320        AsObject::serialize(
7321            &AsObject {
7322                block_id: Field0 {
7323                    value: &self.block_id,
7324                },
7325                contract_address: Field1 {
7326                    value: &self.contract_address,
7327                },
7328            },
7329            serializer,
7330        )
7331    }
7332}
7333
7334impl Serialize for GetNonceRequestRef<'_> {
7335    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7336        #[derive(Serialize)]
7337        struct AsObject<'a> {
7338            block_id: Field0<'a>,
7339            contract_address: Field1<'a>,
7340        }
7341
7342        #[derive(Serialize)]
7343        #[serde(transparent)]
7344        struct Field0<'a> {
7345            pub value: &'a BlockId,
7346        }
7347
7348        #[serde_as]
7349        #[derive(Serialize)]
7350        #[serde(transparent)]
7351        struct Field1<'a> {
7352            #[serde_as(as = "UfeHex")]
7353            pub value: &'a Felt,
7354        }
7355
7356        AsObject::serialize(
7357            &AsObject {
7358                block_id: Field0 {
7359                    value: self.block_id,
7360                },
7361                contract_address: Field1 {
7362                    value: self.contract_address,
7363                },
7364            },
7365            serializer,
7366        )
7367    }
7368}
7369
7370impl<'de> Deserialize<'de> for GetNonceRequest {
7371    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7372        #[derive(Deserialize)]
7373        struct AsObject {
7374            block_id: Field0,
7375            contract_address: Field1,
7376        }
7377
7378        #[derive(Deserialize)]
7379        #[serde(transparent)]
7380        struct Field0 {
7381            pub value: BlockId,
7382        }
7383
7384        #[serde_as]
7385        #[derive(Deserialize)]
7386        #[serde(transparent)]
7387        struct Field1 {
7388            #[serde_as(as = "UfeHex")]
7389            pub value: Felt,
7390        }
7391
7392        let temp = serde_json::Value::deserialize(deserializer)?;
7393
7394        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7395            let field1 = serde_json::from_value::<Field1>(
7396                elements
7397                    .pop()
7398                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7399            )
7400            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7401            let field0 = serde_json::from_value::<Field0>(
7402                elements
7403                    .pop()
7404                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7405            )
7406            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7407
7408            Ok(Self {
7409                block_id: field0.value,
7410                contract_address: field1.value,
7411            })
7412        } else if let Ok(object) = AsObject::deserialize(&temp) {
7413            Ok(Self {
7414                block_id: object.block_id.value,
7415                contract_address: object.contract_address.value,
7416            })
7417        } else {
7418            Err(serde::de::Error::custom("invalid sequence length"))
7419        }
7420    }
7421}
7422
7423impl Serialize for GetStateUpdateRequest {
7424    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7425        #[derive(Serialize)]
7426        struct AsObject<'a> {
7427            block_id: Field0<'a>,
7428        }
7429
7430        #[derive(Serialize)]
7431        #[serde(transparent)]
7432        struct Field0<'a> {
7433            pub value: &'a BlockId,
7434        }
7435
7436        AsObject::serialize(
7437            &AsObject {
7438                block_id: Field0 {
7439                    value: &self.block_id,
7440                },
7441            },
7442            serializer,
7443        )
7444    }
7445}
7446
7447impl Serialize for GetStateUpdateRequestRef<'_> {
7448    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7449        #[derive(Serialize)]
7450        struct AsObject<'a> {
7451            block_id: Field0<'a>,
7452        }
7453
7454        #[derive(Serialize)]
7455        #[serde(transparent)]
7456        struct Field0<'a> {
7457            pub value: &'a BlockId,
7458        }
7459
7460        AsObject::serialize(
7461            &AsObject {
7462                block_id: Field0 {
7463                    value: self.block_id,
7464                },
7465            },
7466            serializer,
7467        )
7468    }
7469}
7470
7471impl<'de> Deserialize<'de> for GetStateUpdateRequest {
7472    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7473        #[derive(Deserialize)]
7474        struct AsObject {
7475            block_id: Field0,
7476        }
7477
7478        #[derive(Deserialize)]
7479        #[serde(transparent)]
7480        struct Field0 {
7481            pub value: BlockId,
7482        }
7483
7484        let temp = serde_json::Value::deserialize(deserializer)?;
7485
7486        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7487            let field0 = serde_json::from_value::<Field0>(
7488                elements
7489                    .pop()
7490                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7491            )
7492            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7493
7494            Ok(Self {
7495                block_id: field0.value,
7496            })
7497        } else if let Ok(object) = AsObject::deserialize(&temp) {
7498            Ok(Self {
7499                block_id: object.block_id.value,
7500            })
7501        } else {
7502            Err(serde::de::Error::custom("invalid sequence length"))
7503        }
7504    }
7505}
7506
7507impl Serialize for GetStorageAtRequest {
7508    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7509        #[derive(Serialize)]
7510        struct AsObject<'a> {
7511            contract_address: Field0<'a>,
7512            key: Field1<'a>,
7513            block_id: Field2<'a>,
7514        }
7515
7516        #[serde_as]
7517        #[derive(Serialize)]
7518        #[serde(transparent)]
7519        struct Field0<'a> {
7520            #[serde_as(as = "UfeHex")]
7521            pub value: &'a Felt,
7522        }
7523
7524        #[serde_as]
7525        #[derive(Serialize)]
7526        #[serde(transparent)]
7527        struct Field1<'a> {
7528            #[serde_as(as = "UfeHex")]
7529            pub value: &'a Felt,
7530        }
7531
7532        #[derive(Serialize)]
7533        #[serde(transparent)]
7534        struct Field2<'a> {
7535            pub value: &'a BlockId,
7536        }
7537
7538        AsObject::serialize(
7539            &AsObject {
7540                contract_address: Field0 {
7541                    value: &self.contract_address,
7542                },
7543                key: Field1 { value: &self.key },
7544                block_id: Field2 {
7545                    value: &self.block_id,
7546                },
7547            },
7548            serializer,
7549        )
7550    }
7551}
7552
7553impl Serialize for GetStorageAtRequestRef<'_> {
7554    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7555        #[derive(Serialize)]
7556        struct AsObject<'a> {
7557            contract_address: Field0<'a>,
7558            key: Field1<'a>,
7559            block_id: Field2<'a>,
7560        }
7561
7562        #[serde_as]
7563        #[derive(Serialize)]
7564        #[serde(transparent)]
7565        struct Field0<'a> {
7566            #[serde_as(as = "UfeHex")]
7567            pub value: &'a Felt,
7568        }
7569
7570        #[serde_as]
7571        #[derive(Serialize)]
7572        #[serde(transparent)]
7573        struct Field1<'a> {
7574            #[serde_as(as = "UfeHex")]
7575            pub value: &'a Felt,
7576        }
7577
7578        #[derive(Serialize)]
7579        #[serde(transparent)]
7580        struct Field2<'a> {
7581            pub value: &'a BlockId,
7582        }
7583
7584        AsObject::serialize(
7585            &AsObject {
7586                contract_address: Field0 {
7587                    value: self.contract_address,
7588                },
7589                key: Field1 { value: self.key },
7590                block_id: Field2 {
7591                    value: self.block_id,
7592                },
7593            },
7594            serializer,
7595        )
7596    }
7597}
7598
7599impl<'de> Deserialize<'de> for GetStorageAtRequest {
7600    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7601        #[derive(Deserialize)]
7602        struct AsObject {
7603            contract_address: Field0,
7604            key: Field1,
7605            block_id: Field2,
7606        }
7607
7608        #[serde_as]
7609        #[derive(Deserialize)]
7610        #[serde(transparent)]
7611        struct Field0 {
7612            #[serde_as(as = "UfeHex")]
7613            pub value: Felt,
7614        }
7615
7616        #[serde_as]
7617        #[derive(Deserialize)]
7618        #[serde(transparent)]
7619        struct Field1 {
7620            #[serde_as(as = "UfeHex")]
7621            pub value: Felt,
7622        }
7623
7624        #[derive(Deserialize)]
7625        #[serde(transparent)]
7626        struct Field2 {
7627            pub value: BlockId,
7628        }
7629
7630        let temp = serde_json::Value::deserialize(deserializer)?;
7631
7632        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7633            let field2 = serde_json::from_value::<Field2>(
7634                elements
7635                    .pop()
7636                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7637            )
7638            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7639            let field1 = serde_json::from_value::<Field1>(
7640                elements
7641                    .pop()
7642                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7643            )
7644            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7645            let field0 = serde_json::from_value::<Field0>(
7646                elements
7647                    .pop()
7648                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7649            )
7650            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7651
7652            Ok(Self {
7653                contract_address: field0.value,
7654                key: field1.value,
7655                block_id: field2.value,
7656            })
7657        } else if let Ok(object) = AsObject::deserialize(&temp) {
7658            Ok(Self {
7659                contract_address: object.contract_address.value,
7660                key: object.key.value,
7661                block_id: object.block_id.value,
7662            })
7663        } else {
7664            Err(serde::de::Error::custom("invalid sequence length"))
7665        }
7666    }
7667}
7668
7669impl Serialize for GetStorageProofRequest {
7670    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7671        #[derive(Serialize)]
7672        struct AsObject<'a> {
7673            block_id: Field0<'a>,
7674            #[serde(skip_serializing_if = "Option::is_none")]
7675            class_hashes: Option<Field1<'a>>,
7676            #[serde(skip_serializing_if = "Option::is_none")]
7677            contract_addresses: Option<Field2<'a>>,
7678            #[serde(skip_serializing_if = "Option::is_none")]
7679            contracts_storage_keys: Option<Field3<'a>>,
7680        }
7681
7682        #[derive(Serialize)]
7683        #[serde(transparent)]
7684        struct Field0<'a> {
7685            pub value: &'a ConfirmedBlockId,
7686        }
7687
7688        #[serde_as]
7689        #[derive(Serialize)]
7690        #[serde(transparent)]
7691        struct Field1<'a> {
7692            #[serde_as(as = "[UfeHex]")]
7693            pub value: &'a [Felt],
7694        }
7695
7696        #[serde_as]
7697        #[derive(Serialize)]
7698        #[serde(transparent)]
7699        struct Field2<'a> {
7700            #[serde_as(as = "[UfeHex]")]
7701            pub value: &'a [Felt],
7702        }
7703
7704        #[derive(Serialize)]
7705        #[serde(transparent)]
7706        struct Field3<'a> {
7707            pub value: &'a [ContractStorageKeys],
7708        }
7709
7710        AsObject::serialize(
7711            &AsObject {
7712                block_id: Field0 {
7713                    value: &self.block_id,
7714                },
7715                class_hashes: self.class_hashes.as_ref().map(|f| Field1 { value: f }),
7716                contract_addresses: self
7717                    .contract_addresses
7718                    .as_ref()
7719                    .map(|f| Field2 { value: f }),
7720                contracts_storage_keys: self
7721                    .contracts_storage_keys
7722                    .as_ref()
7723                    .map(|f| Field3 { value: f }),
7724            },
7725            serializer,
7726        )
7727    }
7728}
7729
7730impl Serialize for GetStorageProofRequestRef<'_> {
7731    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7732        #[derive(Serialize)]
7733        struct AsObject<'a> {
7734            block_id: Field0<'a>,
7735            #[serde(skip_serializing_if = "Option::is_none")]
7736            class_hashes: Option<Field1<'a>>,
7737            #[serde(skip_serializing_if = "Option::is_none")]
7738            contract_addresses: Option<Field2<'a>>,
7739            #[serde(skip_serializing_if = "Option::is_none")]
7740            contracts_storage_keys: Option<Field3<'a>>,
7741        }
7742
7743        #[derive(Serialize)]
7744        #[serde(transparent)]
7745        struct Field0<'a> {
7746            pub value: &'a ConfirmedBlockId,
7747        }
7748
7749        #[serde_as]
7750        #[derive(Serialize)]
7751        #[serde(transparent)]
7752        struct Field1<'a> {
7753            #[serde_as(as = "[UfeHex]")]
7754            pub value: &'a [Felt],
7755        }
7756
7757        #[serde_as]
7758        #[derive(Serialize)]
7759        #[serde(transparent)]
7760        struct Field2<'a> {
7761            #[serde_as(as = "[UfeHex]")]
7762            pub value: &'a [Felt],
7763        }
7764
7765        #[derive(Serialize)]
7766        #[serde(transparent)]
7767        struct Field3<'a> {
7768            pub value: &'a [ContractStorageKeys],
7769        }
7770
7771        AsObject::serialize(
7772            &AsObject {
7773                block_id: Field0 {
7774                    value: self.block_id,
7775                },
7776                class_hashes: self.class_hashes.as_ref().map(|f| Field1 { value: f }),
7777                contract_addresses: self
7778                    .contract_addresses
7779                    .as_ref()
7780                    .map(|f| Field2 { value: f }),
7781                contracts_storage_keys: self
7782                    .contracts_storage_keys
7783                    .as_ref()
7784                    .map(|f| Field3 { value: f }),
7785            },
7786            serializer,
7787        )
7788    }
7789}
7790
7791impl<'de> Deserialize<'de> for GetStorageProofRequest {
7792    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7793        #[derive(Deserialize)]
7794        struct AsObject {
7795            block_id: Field0,
7796            #[serde(skip_serializing_if = "Option::is_none")]
7797            class_hashes: Option<Field1>,
7798            #[serde(skip_serializing_if = "Option::is_none")]
7799            contract_addresses: Option<Field2>,
7800            #[serde(skip_serializing_if = "Option::is_none")]
7801            contracts_storage_keys: Option<Field3>,
7802        }
7803
7804        #[derive(Deserialize)]
7805        #[serde(transparent)]
7806        struct Field0 {
7807            pub value: ConfirmedBlockId,
7808        }
7809
7810        #[serde_as]
7811        #[derive(Deserialize)]
7812        #[serde(transparent)]
7813        struct Field1 {
7814            #[serde_as(as = "Vec<UfeHex>")]
7815            pub value: Vec<Felt>,
7816        }
7817
7818        #[serde_as]
7819        #[derive(Deserialize)]
7820        #[serde(transparent)]
7821        struct Field2 {
7822            #[serde_as(as = "Vec<UfeHex>")]
7823            pub value: Vec<Felt>,
7824        }
7825
7826        #[derive(Deserialize)]
7827        #[serde(transparent)]
7828        struct Field3 {
7829            pub value: Vec<ContractStorageKeys>,
7830        }
7831
7832        let temp = serde_json::Value::deserialize(deserializer)?;
7833
7834        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7835            let element_count = elements.len();
7836
7837            let field3 = if element_count > 3 {
7838                Some(
7839                    serde_json::from_value::<Field3>(elements.pop().unwrap()).map_err(|err| {
7840                        serde::de::Error::custom(format!("failed to parse element: {}", err))
7841                    })?,
7842                )
7843            } else {
7844                None
7845            };
7846            let field2 = if element_count > 2 {
7847                Some(
7848                    serde_json::from_value::<Field2>(elements.pop().unwrap()).map_err(|err| {
7849                        serde::de::Error::custom(format!("failed to parse element: {}", err))
7850                    })?,
7851                )
7852            } else {
7853                None
7854            };
7855            let field1 = if element_count > 1 {
7856                Some(
7857                    serde_json::from_value::<Field1>(elements.pop().unwrap()).map_err(|err| {
7858                        serde::de::Error::custom(format!("failed to parse element: {}", err))
7859                    })?,
7860                )
7861            } else {
7862                None
7863            };
7864            let field0 = serde_json::from_value::<Field0>(
7865                elements
7866                    .pop()
7867                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7868            )
7869            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7870
7871            Ok(Self {
7872                block_id: field0.value,
7873                class_hashes: field1.map(|f| f.value),
7874                contract_addresses: field2.map(|f| f.value),
7875                contracts_storage_keys: field3.map(|f| f.value),
7876            })
7877        } else if let Ok(object) = AsObject::deserialize(&temp) {
7878            Ok(Self {
7879                block_id: object.block_id.value,
7880                class_hashes: object.class_hashes.map(|f| f.value),
7881                contract_addresses: object.contract_addresses.map(|f| f.value),
7882                contracts_storage_keys: object.contracts_storage_keys.map(|f| f.value),
7883            })
7884        } else {
7885            Err(serde::de::Error::custom("invalid sequence length"))
7886        }
7887    }
7888}
7889
7890impl Serialize for GetTransactionByBlockIdAndIndexRequest {
7891    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7892        #[derive(Serialize)]
7893        struct AsObject<'a> {
7894            block_id: Field0<'a>,
7895            index: Field1<'a>,
7896        }
7897
7898        #[derive(Serialize)]
7899        #[serde(transparent)]
7900        struct Field0<'a> {
7901            pub value: &'a BlockId,
7902        }
7903
7904        #[derive(Serialize)]
7905        #[serde(transparent)]
7906        struct Field1<'a> {
7907            pub value: &'a u64,
7908        }
7909
7910        AsObject::serialize(
7911            &AsObject {
7912                block_id: Field0 {
7913                    value: &self.block_id,
7914                },
7915                index: Field1 { value: &self.index },
7916            },
7917            serializer,
7918        )
7919    }
7920}
7921
7922impl Serialize for GetTransactionByBlockIdAndIndexRequestRef<'_> {
7923    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7924        #[derive(Serialize)]
7925        struct AsObject<'a> {
7926            block_id: Field0<'a>,
7927            index: Field1<'a>,
7928        }
7929
7930        #[derive(Serialize)]
7931        #[serde(transparent)]
7932        struct Field0<'a> {
7933            pub value: &'a BlockId,
7934        }
7935
7936        #[derive(Serialize)]
7937        #[serde(transparent)]
7938        struct Field1<'a> {
7939            pub value: &'a u64,
7940        }
7941
7942        AsObject::serialize(
7943            &AsObject {
7944                block_id: Field0 {
7945                    value: self.block_id,
7946                },
7947                index: Field1 { value: self.index },
7948            },
7949            serializer,
7950        )
7951    }
7952}
7953
7954impl<'de> Deserialize<'de> for GetTransactionByBlockIdAndIndexRequest {
7955    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
7956        #[derive(Deserialize)]
7957        struct AsObject {
7958            block_id: Field0,
7959            index: Field1,
7960        }
7961
7962        #[derive(Deserialize)]
7963        #[serde(transparent)]
7964        struct Field0 {
7965            pub value: BlockId,
7966        }
7967
7968        #[derive(Deserialize)]
7969        #[serde(transparent)]
7970        struct Field1 {
7971            pub value: u64,
7972        }
7973
7974        let temp = serde_json::Value::deserialize(deserializer)?;
7975
7976        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
7977            let field1 = serde_json::from_value::<Field1>(
7978                elements
7979                    .pop()
7980                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7981            )
7982            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7983            let field0 = serde_json::from_value::<Field0>(
7984                elements
7985                    .pop()
7986                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
7987            )
7988            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
7989
7990            Ok(Self {
7991                block_id: field0.value,
7992                index: field1.value,
7993            })
7994        } else if let Ok(object) = AsObject::deserialize(&temp) {
7995            Ok(Self {
7996                block_id: object.block_id.value,
7997                index: object.index.value,
7998            })
7999        } else {
8000            Err(serde::de::Error::custom("invalid sequence length"))
8001        }
8002    }
8003}
8004
8005impl Serialize for GetTransactionByHashRequest {
8006    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8007        #[derive(Serialize)]
8008        struct AsObject<'a> {
8009            transaction_hash: Field0<'a>,
8010        }
8011
8012        #[serde_as]
8013        #[derive(Serialize)]
8014        #[serde(transparent)]
8015        struct Field0<'a> {
8016            #[serde_as(as = "UfeHex")]
8017            pub value: &'a Felt,
8018        }
8019
8020        AsObject::serialize(
8021            &AsObject {
8022                transaction_hash: Field0 {
8023                    value: &self.transaction_hash,
8024                },
8025            },
8026            serializer,
8027        )
8028    }
8029}
8030
8031impl Serialize for GetTransactionByHashRequestRef<'_> {
8032    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8033        #[derive(Serialize)]
8034        struct AsObject<'a> {
8035            transaction_hash: Field0<'a>,
8036        }
8037
8038        #[serde_as]
8039        #[derive(Serialize)]
8040        #[serde(transparent)]
8041        struct Field0<'a> {
8042            #[serde_as(as = "UfeHex")]
8043            pub value: &'a Felt,
8044        }
8045
8046        AsObject::serialize(
8047            &AsObject {
8048                transaction_hash: Field0 {
8049                    value: self.transaction_hash,
8050                },
8051            },
8052            serializer,
8053        )
8054    }
8055}
8056
8057impl<'de> Deserialize<'de> for GetTransactionByHashRequest {
8058    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8059        #[derive(Deserialize)]
8060        struct AsObject {
8061            transaction_hash: Field0,
8062        }
8063
8064        #[serde_as]
8065        #[derive(Deserialize)]
8066        #[serde(transparent)]
8067        struct Field0 {
8068            #[serde_as(as = "UfeHex")]
8069            pub value: Felt,
8070        }
8071
8072        let temp = serde_json::Value::deserialize(deserializer)?;
8073
8074        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8075            let field0 = serde_json::from_value::<Field0>(
8076                elements
8077                    .pop()
8078                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8079            )
8080            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8081
8082            Ok(Self {
8083                transaction_hash: field0.value,
8084            })
8085        } else if let Ok(object) = AsObject::deserialize(&temp) {
8086            Ok(Self {
8087                transaction_hash: object.transaction_hash.value,
8088            })
8089        } else {
8090            Err(serde::de::Error::custom("invalid sequence length"))
8091        }
8092    }
8093}
8094
8095impl Serialize for GetTransactionReceiptRequest {
8096    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8097        #[derive(Serialize)]
8098        struct AsObject<'a> {
8099            transaction_hash: Field0<'a>,
8100        }
8101
8102        #[serde_as]
8103        #[derive(Serialize)]
8104        #[serde(transparent)]
8105        struct Field0<'a> {
8106            #[serde_as(as = "UfeHex")]
8107            pub value: &'a Felt,
8108        }
8109
8110        AsObject::serialize(
8111            &AsObject {
8112                transaction_hash: Field0 {
8113                    value: &self.transaction_hash,
8114                },
8115            },
8116            serializer,
8117        )
8118    }
8119}
8120
8121impl Serialize for GetTransactionReceiptRequestRef<'_> {
8122    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8123        #[derive(Serialize)]
8124        struct AsObject<'a> {
8125            transaction_hash: Field0<'a>,
8126        }
8127
8128        #[serde_as]
8129        #[derive(Serialize)]
8130        #[serde(transparent)]
8131        struct Field0<'a> {
8132            #[serde_as(as = "UfeHex")]
8133            pub value: &'a Felt,
8134        }
8135
8136        AsObject::serialize(
8137            &AsObject {
8138                transaction_hash: Field0 {
8139                    value: self.transaction_hash,
8140                },
8141            },
8142            serializer,
8143        )
8144    }
8145}
8146
8147impl<'de> Deserialize<'de> for GetTransactionReceiptRequest {
8148    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8149        #[derive(Deserialize)]
8150        struct AsObject {
8151            transaction_hash: Field0,
8152        }
8153
8154        #[serde_as]
8155        #[derive(Deserialize)]
8156        #[serde(transparent)]
8157        struct Field0 {
8158            #[serde_as(as = "UfeHex")]
8159            pub value: Felt,
8160        }
8161
8162        let temp = serde_json::Value::deserialize(deserializer)?;
8163
8164        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8165            let field0 = serde_json::from_value::<Field0>(
8166                elements
8167                    .pop()
8168                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8169            )
8170            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8171
8172            Ok(Self {
8173                transaction_hash: field0.value,
8174            })
8175        } else if let Ok(object) = AsObject::deserialize(&temp) {
8176            Ok(Self {
8177                transaction_hash: object.transaction_hash.value,
8178            })
8179        } else {
8180            Err(serde::de::Error::custom("invalid sequence length"))
8181        }
8182    }
8183}
8184
8185impl Serialize for GetTransactionStatusRequest {
8186    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8187        #[derive(Serialize)]
8188        struct AsObject<'a> {
8189            transaction_hash: Field0<'a>,
8190        }
8191
8192        #[serde_as]
8193        #[derive(Serialize)]
8194        #[serde(transparent)]
8195        struct Field0<'a> {
8196            #[serde_as(as = "UfeHex")]
8197            pub value: &'a Felt,
8198        }
8199
8200        AsObject::serialize(
8201            &AsObject {
8202                transaction_hash: Field0 {
8203                    value: &self.transaction_hash,
8204                },
8205            },
8206            serializer,
8207        )
8208    }
8209}
8210
8211impl Serialize for GetTransactionStatusRequestRef<'_> {
8212    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8213        #[derive(Serialize)]
8214        struct AsObject<'a> {
8215            transaction_hash: Field0<'a>,
8216        }
8217
8218        #[serde_as]
8219        #[derive(Serialize)]
8220        #[serde(transparent)]
8221        struct Field0<'a> {
8222            #[serde_as(as = "UfeHex")]
8223            pub value: &'a Felt,
8224        }
8225
8226        AsObject::serialize(
8227            &AsObject {
8228                transaction_hash: Field0 {
8229                    value: self.transaction_hash,
8230                },
8231            },
8232            serializer,
8233        )
8234    }
8235}
8236
8237impl<'de> Deserialize<'de> for GetTransactionStatusRequest {
8238    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8239        #[derive(Deserialize)]
8240        struct AsObject {
8241            transaction_hash: Field0,
8242        }
8243
8244        #[serde_as]
8245        #[derive(Deserialize)]
8246        #[serde(transparent)]
8247        struct Field0 {
8248            #[serde_as(as = "UfeHex")]
8249            pub value: Felt,
8250        }
8251
8252        let temp = serde_json::Value::deserialize(deserializer)?;
8253
8254        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8255            let field0 = serde_json::from_value::<Field0>(
8256                elements
8257                    .pop()
8258                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8259            )
8260            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8261
8262            Ok(Self {
8263                transaction_hash: field0.value,
8264            })
8265        } else if let Ok(object) = AsObject::deserialize(&temp) {
8266            Ok(Self {
8267                transaction_hash: object.transaction_hash.value,
8268            })
8269        } else {
8270            Err(serde::de::Error::custom("invalid sequence length"))
8271        }
8272    }
8273}
8274
8275impl Serialize for SimulateTransactionsRequest {
8276    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8277        #[derive(Serialize)]
8278        struct AsObject<'a> {
8279            block_id: Field0<'a>,
8280            transactions: Field1<'a>,
8281            simulation_flags: Field2<'a>,
8282        }
8283
8284        #[derive(Serialize)]
8285        #[serde(transparent)]
8286        struct Field0<'a> {
8287            pub value: &'a BlockId,
8288        }
8289
8290        #[derive(Serialize)]
8291        #[serde(transparent)]
8292        struct Field1<'a> {
8293            pub value: &'a [BroadcastedTransaction],
8294        }
8295
8296        #[derive(Serialize)]
8297        #[serde(transparent)]
8298        struct Field2<'a> {
8299            pub value: &'a [SimulationFlag],
8300        }
8301
8302        AsObject::serialize(
8303            &AsObject {
8304                block_id: Field0 {
8305                    value: &self.block_id,
8306                },
8307                transactions: Field1 {
8308                    value: &self.transactions,
8309                },
8310                simulation_flags: Field2 {
8311                    value: &self.simulation_flags,
8312                },
8313            },
8314            serializer,
8315        )
8316    }
8317}
8318
8319impl Serialize for SimulateTransactionsRequestRef<'_> {
8320    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8321        #[derive(Serialize)]
8322        struct AsObject<'a> {
8323            block_id: Field0<'a>,
8324            transactions: Field1<'a>,
8325            simulation_flags: Field2<'a>,
8326        }
8327
8328        #[derive(Serialize)]
8329        #[serde(transparent)]
8330        struct Field0<'a> {
8331            pub value: &'a BlockId,
8332        }
8333
8334        #[derive(Serialize)]
8335        #[serde(transparent)]
8336        struct Field1<'a> {
8337            pub value: &'a [BroadcastedTransaction],
8338        }
8339
8340        #[derive(Serialize)]
8341        #[serde(transparent)]
8342        struct Field2<'a> {
8343            pub value: &'a [SimulationFlag],
8344        }
8345
8346        AsObject::serialize(
8347            &AsObject {
8348                block_id: Field0 {
8349                    value: self.block_id,
8350                },
8351                transactions: Field1 {
8352                    value: self.transactions,
8353                },
8354                simulation_flags: Field2 {
8355                    value: self.simulation_flags,
8356                },
8357            },
8358            serializer,
8359        )
8360    }
8361}
8362
8363impl<'de> Deserialize<'de> for SimulateTransactionsRequest {
8364    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8365        #[derive(Deserialize)]
8366        struct AsObject {
8367            block_id: Field0,
8368            transactions: Field1,
8369            simulation_flags: Field2,
8370        }
8371
8372        #[derive(Deserialize)]
8373        #[serde(transparent)]
8374        struct Field0 {
8375            pub value: BlockId,
8376        }
8377
8378        #[derive(Deserialize)]
8379        #[serde(transparent)]
8380        struct Field1 {
8381            pub value: Vec<BroadcastedTransaction>,
8382        }
8383
8384        #[derive(Deserialize)]
8385        #[serde(transparent)]
8386        struct Field2 {
8387            pub value: Vec<SimulationFlag>,
8388        }
8389
8390        let temp = serde_json::Value::deserialize(deserializer)?;
8391
8392        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8393            let field2 = serde_json::from_value::<Field2>(
8394                elements
8395                    .pop()
8396                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8397            )
8398            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8399            let field1 = serde_json::from_value::<Field1>(
8400                elements
8401                    .pop()
8402                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8403            )
8404            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8405            let field0 = serde_json::from_value::<Field0>(
8406                elements
8407                    .pop()
8408                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8409            )
8410            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8411
8412            Ok(Self {
8413                block_id: field0.value,
8414                transactions: field1.value,
8415                simulation_flags: field2.value,
8416            })
8417        } else if let Ok(object) = AsObject::deserialize(&temp) {
8418            Ok(Self {
8419                block_id: object.block_id.value,
8420                transactions: object.transactions.value,
8421                simulation_flags: object.simulation_flags.value,
8422            })
8423        } else {
8424            Err(serde::de::Error::custom("invalid sequence length"))
8425        }
8426    }
8427}
8428
8429impl Serialize for SpecVersionRequest {
8430    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8431        use serde::ser::SerializeSeq;
8432
8433        let seq = serializer.serialize_seq(Some(0))?;
8434        seq.end()
8435    }
8436}
8437
8438impl<'de> Deserialize<'de> for SpecVersionRequest {
8439    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8440        let elements = Vec::<()>::deserialize(deserializer)?;
8441        if !elements.is_empty() {
8442            return Err(serde::de::Error::custom("invalid sequence length"));
8443        }
8444        Ok(Self)
8445    }
8446}
8447
8448impl Serialize for SubscribeEventsRequest {
8449    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8450        #[derive(Serialize)]
8451        struct AsObject<'a> {
8452            #[serde(skip_serializing_if = "Option::is_none")]
8453            from_address: Option<Field0<'a>>,
8454            #[serde(skip_serializing_if = "Option::is_none")]
8455            keys: Option<Field1<'a>>,
8456            #[serde(skip_serializing_if = "Option::is_none")]
8457            block_id: Option<Field2<'a>>,
8458        }
8459
8460        #[serde_as]
8461        #[derive(Serialize)]
8462        #[serde(transparent)]
8463        struct Field0<'a> {
8464            #[serde_as(as = "UfeHex")]
8465            pub value: &'a Felt,
8466        }
8467
8468        #[serde_as]
8469        #[derive(Serialize)]
8470        #[serde(transparent)]
8471        struct Field1<'a> {
8472            #[serde_as(as = "[Vec<UfeHex>]")]
8473            pub value: &'a [Vec<Felt>],
8474        }
8475
8476        #[derive(Serialize)]
8477        #[serde(transparent)]
8478        struct Field2<'a> {
8479            pub value: &'a ConfirmedBlockId,
8480        }
8481
8482        AsObject::serialize(
8483            &AsObject {
8484                from_address: self.from_address.as_ref().map(|f| Field0 { value: f }),
8485                keys: self.keys.as_ref().map(|f| Field1 { value: f }),
8486                block_id: self.block_id.as_ref().map(|f| Field2 { value: f }),
8487            },
8488            serializer,
8489        )
8490    }
8491}
8492
8493impl Serialize for SubscribeEventsRequestRef<'_> {
8494    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8495        #[derive(Serialize)]
8496        struct AsObject<'a> {
8497            #[serde(skip_serializing_if = "Option::is_none")]
8498            from_address: Option<Field0<'a>>,
8499            #[serde(skip_serializing_if = "Option::is_none")]
8500            keys: Option<Field1<'a>>,
8501            #[serde(skip_serializing_if = "Option::is_none")]
8502            block_id: Option<Field2<'a>>,
8503        }
8504
8505        #[serde_as]
8506        #[derive(Serialize)]
8507        #[serde(transparent)]
8508        struct Field0<'a> {
8509            #[serde_as(as = "UfeHex")]
8510            pub value: &'a Felt,
8511        }
8512
8513        #[serde_as]
8514        #[derive(Serialize)]
8515        #[serde(transparent)]
8516        struct Field1<'a> {
8517            #[serde_as(as = "[Vec<UfeHex>]")]
8518            pub value: &'a [Vec<Felt>],
8519        }
8520
8521        #[derive(Serialize)]
8522        #[serde(transparent)]
8523        struct Field2<'a> {
8524            pub value: &'a ConfirmedBlockId,
8525        }
8526
8527        AsObject::serialize(
8528            &AsObject {
8529                from_address: self.from_address.as_ref().map(|f| Field0 { value: f }),
8530                keys: self.keys.as_ref().map(|f| Field1 { value: f }),
8531                block_id: self.block_id.as_ref().map(|f| Field2 { value: f }),
8532            },
8533            serializer,
8534        )
8535    }
8536}
8537
8538impl<'de> Deserialize<'de> for SubscribeEventsRequest {
8539    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8540        #[derive(Deserialize)]
8541        struct AsObject {
8542            #[serde(skip_serializing_if = "Option::is_none")]
8543            from_address: Option<Field0>,
8544            #[serde(skip_serializing_if = "Option::is_none")]
8545            keys: Option<Field1>,
8546            #[serde(skip_serializing_if = "Option::is_none")]
8547            block_id: Option<Field2>,
8548        }
8549
8550        #[serde_as]
8551        #[derive(Deserialize)]
8552        #[serde(transparent)]
8553        struct Field0 {
8554            #[serde_as(as = "UfeHex")]
8555            pub value: Felt,
8556        }
8557
8558        #[serde_as]
8559        #[derive(Deserialize)]
8560        #[serde(transparent)]
8561        struct Field1 {
8562            #[serde_as(as = "Vec<Vec<UfeHex>>")]
8563            pub value: Vec<Vec<Felt>>,
8564        }
8565
8566        #[derive(Deserialize)]
8567        #[serde(transparent)]
8568        struct Field2 {
8569            pub value: ConfirmedBlockId,
8570        }
8571
8572        let temp = serde_json::Value::deserialize(deserializer)?;
8573
8574        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8575            let element_count = elements.len();
8576
8577            let field2 = if element_count > 2 {
8578                Some(
8579                    serde_json::from_value::<Field2>(elements.pop().unwrap()).map_err(|err| {
8580                        serde::de::Error::custom(format!("failed to parse element: {}", err))
8581                    })?,
8582                )
8583            } else {
8584                None
8585            };
8586            let field1 = if element_count > 1 {
8587                Some(
8588                    serde_json::from_value::<Field1>(elements.pop().unwrap()).map_err(|err| {
8589                        serde::de::Error::custom(format!("failed to parse element: {}", err))
8590                    })?,
8591                )
8592            } else {
8593                None
8594            };
8595            let field0 = if element_count > 0 {
8596                Some(
8597                    serde_json::from_value::<Field0>(elements.pop().unwrap()).map_err(|err| {
8598                        serde::de::Error::custom(format!("failed to parse element: {}", err))
8599                    })?,
8600                )
8601            } else {
8602                None
8603            };
8604
8605            Ok(Self {
8606                from_address: field0.map(|f| f.value),
8607                keys: field1.map(|f| f.value),
8608                block_id: field2.map(|f| f.value),
8609            })
8610        } else if let Ok(object) = AsObject::deserialize(&temp) {
8611            Ok(Self {
8612                from_address: object.from_address.map(|f| f.value),
8613                keys: object.keys.map(|f| f.value),
8614                block_id: object.block_id.map(|f| f.value),
8615            })
8616        } else {
8617            Err(serde::de::Error::custom("invalid sequence length"))
8618        }
8619    }
8620}
8621
8622impl Serialize for SubscribeNewHeadsRequest {
8623    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8624        #[derive(Serialize)]
8625        struct AsObject<'a> {
8626            #[serde(skip_serializing_if = "Option::is_none")]
8627            block_id: Option<Field0<'a>>,
8628        }
8629
8630        #[derive(Serialize)]
8631        #[serde(transparent)]
8632        struct Field0<'a> {
8633            pub value: &'a ConfirmedBlockId,
8634        }
8635
8636        AsObject::serialize(
8637            &AsObject {
8638                block_id: self.block_id.as_ref().map(|f| Field0 { value: f }),
8639            },
8640            serializer,
8641        )
8642    }
8643}
8644
8645impl Serialize for SubscribeNewHeadsRequestRef<'_> {
8646    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8647        #[derive(Serialize)]
8648        struct AsObject<'a> {
8649            #[serde(skip_serializing_if = "Option::is_none")]
8650            block_id: Option<Field0<'a>>,
8651        }
8652
8653        #[derive(Serialize)]
8654        #[serde(transparent)]
8655        struct Field0<'a> {
8656            pub value: &'a ConfirmedBlockId,
8657        }
8658
8659        AsObject::serialize(
8660            &AsObject {
8661                block_id: self.block_id.as_ref().map(|f| Field0 { value: f }),
8662            },
8663            serializer,
8664        )
8665    }
8666}
8667
8668impl<'de> Deserialize<'de> for SubscribeNewHeadsRequest {
8669    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8670        #[derive(Deserialize)]
8671        struct AsObject {
8672            #[serde(skip_serializing_if = "Option::is_none")]
8673            block_id: Option<Field0>,
8674        }
8675
8676        #[derive(Deserialize)]
8677        #[serde(transparent)]
8678        struct Field0 {
8679            pub value: ConfirmedBlockId,
8680        }
8681
8682        let temp = serde_json::Value::deserialize(deserializer)?;
8683
8684        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8685            let element_count = elements.len();
8686
8687            let field0 = if element_count > 0 {
8688                Some(
8689                    serde_json::from_value::<Field0>(elements.pop().unwrap()).map_err(|err| {
8690                        serde::de::Error::custom(format!("failed to parse element: {}", err))
8691                    })?,
8692                )
8693            } else {
8694                None
8695            };
8696
8697            Ok(Self {
8698                block_id: field0.map(|f| f.value),
8699            })
8700        } else if let Ok(object) = AsObject::deserialize(&temp) {
8701            Ok(Self {
8702                block_id: object.block_id.map(|f| f.value),
8703            })
8704        } else {
8705            Err(serde::de::Error::custom("invalid sequence length"))
8706        }
8707    }
8708}
8709
8710impl Serialize for SubscribePendingTransactionsRequest {
8711    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8712        #[derive(Serialize)]
8713        struct AsObject<'a> {
8714            #[serde(skip_serializing_if = "Option::is_none")]
8715            transaction_details: Option<Field0<'a>>,
8716            #[serde(skip_serializing_if = "Option::is_none")]
8717            sender_address: Option<Field1<'a>>,
8718        }
8719
8720        #[derive(Serialize)]
8721        #[serde(transparent)]
8722        struct Field0<'a> {
8723            pub value: &'a bool,
8724        }
8725
8726        #[serde_as]
8727        #[derive(Serialize)]
8728        #[serde(transparent)]
8729        struct Field1<'a> {
8730            #[serde_as(as = "[UfeHex]")]
8731            pub value: &'a [Felt],
8732        }
8733
8734        AsObject::serialize(
8735            &AsObject {
8736                transaction_details: self
8737                    .transaction_details
8738                    .as_ref()
8739                    .map(|f| Field0 { value: f }),
8740                sender_address: self.sender_address.as_ref().map(|f| Field1 { value: f }),
8741            },
8742            serializer,
8743        )
8744    }
8745}
8746
8747impl Serialize for SubscribePendingTransactionsRequestRef<'_> {
8748    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8749        #[derive(Serialize)]
8750        struct AsObject<'a> {
8751            #[serde(skip_serializing_if = "Option::is_none")]
8752            transaction_details: Option<Field0<'a>>,
8753            #[serde(skip_serializing_if = "Option::is_none")]
8754            sender_address: Option<Field1<'a>>,
8755        }
8756
8757        #[derive(Serialize)]
8758        #[serde(transparent)]
8759        struct Field0<'a> {
8760            pub value: &'a bool,
8761        }
8762
8763        #[serde_as]
8764        #[derive(Serialize)]
8765        #[serde(transparent)]
8766        struct Field1<'a> {
8767            #[serde_as(as = "[UfeHex]")]
8768            pub value: &'a [Felt],
8769        }
8770
8771        AsObject::serialize(
8772            &AsObject {
8773                transaction_details: self
8774                    .transaction_details
8775                    .as_ref()
8776                    .map(|f| Field0 { value: f }),
8777                sender_address: self.sender_address.as_ref().map(|f| Field1 { value: f }),
8778            },
8779            serializer,
8780        )
8781    }
8782}
8783
8784impl<'de> Deserialize<'de> for SubscribePendingTransactionsRequest {
8785    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8786        #[derive(Deserialize)]
8787        struct AsObject {
8788            #[serde(skip_serializing_if = "Option::is_none")]
8789            transaction_details: Option<Field0>,
8790            #[serde(skip_serializing_if = "Option::is_none")]
8791            sender_address: Option<Field1>,
8792        }
8793
8794        #[derive(Deserialize)]
8795        #[serde(transparent)]
8796        struct Field0 {
8797            pub value: bool,
8798        }
8799
8800        #[serde_as]
8801        #[derive(Deserialize)]
8802        #[serde(transparent)]
8803        struct Field1 {
8804            #[serde_as(as = "Vec<UfeHex>")]
8805            pub value: Vec<Felt>,
8806        }
8807
8808        let temp = serde_json::Value::deserialize(deserializer)?;
8809
8810        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8811            let element_count = elements.len();
8812
8813            let field1 = if element_count > 1 {
8814                Some(
8815                    serde_json::from_value::<Field1>(elements.pop().unwrap()).map_err(|err| {
8816                        serde::de::Error::custom(format!("failed to parse element: {}", err))
8817                    })?,
8818                )
8819            } else {
8820                None
8821            };
8822            let field0 = if element_count > 0 {
8823                Some(
8824                    serde_json::from_value::<Field0>(elements.pop().unwrap()).map_err(|err| {
8825                        serde::de::Error::custom(format!("failed to parse element: {}", err))
8826                    })?,
8827                )
8828            } else {
8829                None
8830            };
8831
8832            Ok(Self {
8833                transaction_details: field0.map(|f| f.value),
8834                sender_address: field1.map(|f| f.value),
8835            })
8836        } else if let Ok(object) = AsObject::deserialize(&temp) {
8837            Ok(Self {
8838                transaction_details: object.transaction_details.map(|f| f.value),
8839                sender_address: object.sender_address.map(|f| f.value),
8840            })
8841        } else {
8842            Err(serde::de::Error::custom("invalid sequence length"))
8843        }
8844    }
8845}
8846
8847impl Serialize for SubscribeTransactionStatusRequest {
8848    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8849        #[derive(Serialize)]
8850        struct AsObject<'a> {
8851            transaction_hash: Field0<'a>,
8852        }
8853
8854        #[serde_as]
8855        #[derive(Serialize)]
8856        #[serde(transparent)]
8857        struct Field0<'a> {
8858            #[serde_as(as = "UfeHex")]
8859            pub value: &'a Felt,
8860        }
8861
8862        AsObject::serialize(
8863            &AsObject {
8864                transaction_hash: Field0 {
8865                    value: &self.transaction_hash,
8866                },
8867            },
8868            serializer,
8869        )
8870    }
8871}
8872
8873impl Serialize for SubscribeTransactionStatusRequestRef<'_> {
8874    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8875        #[derive(Serialize)]
8876        struct AsObject<'a> {
8877            transaction_hash: Field0<'a>,
8878        }
8879
8880        #[serde_as]
8881        #[derive(Serialize)]
8882        #[serde(transparent)]
8883        struct Field0<'a> {
8884            #[serde_as(as = "UfeHex")]
8885            pub value: &'a Felt,
8886        }
8887
8888        AsObject::serialize(
8889            &AsObject {
8890                transaction_hash: Field0 {
8891                    value: self.transaction_hash,
8892                },
8893            },
8894            serializer,
8895        )
8896    }
8897}
8898
8899impl<'de> Deserialize<'de> for SubscribeTransactionStatusRequest {
8900    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
8901        #[derive(Deserialize)]
8902        struct AsObject {
8903            transaction_hash: Field0,
8904        }
8905
8906        #[serde_as]
8907        #[derive(Deserialize)]
8908        #[serde(transparent)]
8909        struct Field0 {
8910            #[serde_as(as = "UfeHex")]
8911            pub value: Felt,
8912        }
8913
8914        let temp = serde_json::Value::deserialize(deserializer)?;
8915
8916        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
8917            let field0 = serde_json::from_value::<Field0>(
8918                elements
8919                    .pop()
8920                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
8921            )
8922            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
8923
8924            Ok(Self {
8925                transaction_hash: field0.value,
8926            })
8927        } else if let Ok(object) = AsObject::deserialize(&temp) {
8928            Ok(Self {
8929                transaction_hash: object.transaction_hash.value,
8930            })
8931        } else {
8932            Err(serde::de::Error::custom("invalid sequence length"))
8933        }
8934    }
8935}
8936
8937impl Serialize for SubscriptionEventsRequest {
8938    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8939        #[derive(Serialize)]
8940        struct AsObject<'a> {
8941            subscription_id: Field0<'a>,
8942            result: Field1<'a>,
8943        }
8944
8945        #[derive(Serialize)]
8946        #[serde(transparent)]
8947        struct Field0<'a> {
8948            pub value: &'a SubscriptionId,
8949        }
8950
8951        #[derive(Serialize)]
8952        #[serde(transparent)]
8953        struct Field1<'a> {
8954            pub value: &'a EmittedEvent,
8955        }
8956
8957        AsObject::serialize(
8958            &AsObject {
8959                subscription_id: Field0 {
8960                    value: &self.subscription_id,
8961                },
8962                result: Field1 {
8963                    value: &self.result,
8964                },
8965            },
8966            serializer,
8967        )
8968    }
8969}
8970
8971impl Serialize for SubscriptionEventsRequestRef<'_> {
8972    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
8973        #[derive(Serialize)]
8974        struct AsObject<'a> {
8975            subscription_id: Field0<'a>,
8976            result: Field1<'a>,
8977        }
8978
8979        #[derive(Serialize)]
8980        #[serde(transparent)]
8981        struct Field0<'a> {
8982            pub value: &'a SubscriptionId,
8983        }
8984
8985        #[derive(Serialize)]
8986        #[serde(transparent)]
8987        struct Field1<'a> {
8988            pub value: &'a EmittedEvent,
8989        }
8990
8991        AsObject::serialize(
8992            &AsObject {
8993                subscription_id: Field0 {
8994                    value: self.subscription_id,
8995                },
8996                result: Field1 { value: self.result },
8997            },
8998            serializer,
8999        )
9000    }
9001}
9002
9003impl<'de> Deserialize<'de> for SubscriptionEventsRequest {
9004    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9005        #[derive(Deserialize)]
9006        struct AsObject {
9007            subscription_id: Field0,
9008            result: Field1,
9009        }
9010
9011        #[derive(Deserialize)]
9012        #[serde(transparent)]
9013        struct Field0 {
9014            pub value: SubscriptionId,
9015        }
9016
9017        #[derive(Deserialize)]
9018        #[serde(transparent)]
9019        struct Field1 {
9020            pub value: EmittedEvent,
9021        }
9022
9023        let temp = serde_json::Value::deserialize(deserializer)?;
9024
9025        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9026            let field1 = serde_json::from_value::<Field1>(
9027                elements
9028                    .pop()
9029                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9030            )
9031            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9032            let field0 = serde_json::from_value::<Field0>(
9033                elements
9034                    .pop()
9035                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9036            )
9037            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9038
9039            Ok(Self {
9040                subscription_id: field0.value,
9041                result: field1.value,
9042            })
9043        } else if let Ok(object) = AsObject::deserialize(&temp) {
9044            Ok(Self {
9045                subscription_id: object.subscription_id.value,
9046                result: object.result.value,
9047            })
9048        } else {
9049            Err(serde::de::Error::custom("invalid sequence length"))
9050        }
9051    }
9052}
9053
9054impl Serialize for SubscriptionNewHeadsRequest {
9055    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9056        #[derive(Serialize)]
9057        struct AsObject<'a> {
9058            subscription_id: Field0<'a>,
9059            result: Field1<'a>,
9060        }
9061
9062        #[derive(Serialize)]
9063        #[serde(transparent)]
9064        struct Field0<'a> {
9065            pub value: &'a SubscriptionId,
9066        }
9067
9068        #[derive(Serialize)]
9069        #[serde(transparent)]
9070        struct Field1<'a> {
9071            pub value: &'a BlockHeader,
9072        }
9073
9074        AsObject::serialize(
9075            &AsObject {
9076                subscription_id: Field0 {
9077                    value: &self.subscription_id,
9078                },
9079                result: Field1 {
9080                    value: &self.result,
9081                },
9082            },
9083            serializer,
9084        )
9085    }
9086}
9087
9088impl Serialize for SubscriptionNewHeadsRequestRef<'_> {
9089    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9090        #[derive(Serialize)]
9091        struct AsObject<'a> {
9092            subscription_id: Field0<'a>,
9093            result: Field1<'a>,
9094        }
9095
9096        #[derive(Serialize)]
9097        #[serde(transparent)]
9098        struct Field0<'a> {
9099            pub value: &'a SubscriptionId,
9100        }
9101
9102        #[derive(Serialize)]
9103        #[serde(transparent)]
9104        struct Field1<'a> {
9105            pub value: &'a BlockHeader,
9106        }
9107
9108        AsObject::serialize(
9109            &AsObject {
9110                subscription_id: Field0 {
9111                    value: self.subscription_id,
9112                },
9113                result: Field1 { value: self.result },
9114            },
9115            serializer,
9116        )
9117    }
9118}
9119
9120impl<'de> Deserialize<'de> for SubscriptionNewHeadsRequest {
9121    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9122        #[derive(Deserialize)]
9123        struct AsObject {
9124            subscription_id: Field0,
9125            result: Field1,
9126        }
9127
9128        #[derive(Deserialize)]
9129        #[serde(transparent)]
9130        struct Field0 {
9131            pub value: SubscriptionId,
9132        }
9133
9134        #[derive(Deserialize)]
9135        #[serde(transparent)]
9136        struct Field1 {
9137            pub value: BlockHeader,
9138        }
9139
9140        let temp = serde_json::Value::deserialize(deserializer)?;
9141
9142        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9143            let field1 = serde_json::from_value::<Field1>(
9144                elements
9145                    .pop()
9146                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9147            )
9148            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9149            let field0 = serde_json::from_value::<Field0>(
9150                elements
9151                    .pop()
9152                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9153            )
9154            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9155
9156            Ok(Self {
9157                subscription_id: field0.value,
9158                result: field1.value,
9159            })
9160        } else if let Ok(object) = AsObject::deserialize(&temp) {
9161            Ok(Self {
9162                subscription_id: object.subscription_id.value,
9163                result: object.result.value,
9164            })
9165        } else {
9166            Err(serde::de::Error::custom("invalid sequence length"))
9167        }
9168    }
9169}
9170
9171impl Serialize for SubscriptionPendingTransactionsRequest {
9172    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9173        #[derive(Serialize)]
9174        struct AsObject<'a> {
9175            subscription_id: Field0<'a>,
9176            result: Field1<'a>,
9177        }
9178
9179        #[derive(Serialize)]
9180        #[serde(transparent)]
9181        struct Field0<'a> {
9182            pub value: &'a SubscriptionId,
9183        }
9184
9185        #[derive(Serialize)]
9186        #[serde(transparent)]
9187        struct Field1<'a> {
9188            pub value: &'a TransactionOrHash,
9189        }
9190
9191        AsObject::serialize(
9192            &AsObject {
9193                subscription_id: Field0 {
9194                    value: &self.subscription_id,
9195                },
9196                result: Field1 {
9197                    value: &self.result,
9198                },
9199            },
9200            serializer,
9201        )
9202    }
9203}
9204
9205impl Serialize for SubscriptionPendingTransactionsRequestRef<'_> {
9206    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9207        #[derive(Serialize)]
9208        struct AsObject<'a> {
9209            subscription_id: Field0<'a>,
9210            result: Field1<'a>,
9211        }
9212
9213        #[derive(Serialize)]
9214        #[serde(transparent)]
9215        struct Field0<'a> {
9216            pub value: &'a SubscriptionId,
9217        }
9218
9219        #[derive(Serialize)]
9220        #[serde(transparent)]
9221        struct Field1<'a> {
9222            pub value: &'a TransactionOrHash,
9223        }
9224
9225        AsObject::serialize(
9226            &AsObject {
9227                subscription_id: Field0 {
9228                    value: self.subscription_id,
9229                },
9230                result: Field1 { value: self.result },
9231            },
9232            serializer,
9233        )
9234    }
9235}
9236
9237impl<'de> Deserialize<'de> for SubscriptionPendingTransactionsRequest {
9238    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9239        #[derive(Deserialize)]
9240        struct AsObject {
9241            subscription_id: Field0,
9242            result: Field1,
9243        }
9244
9245        #[derive(Deserialize)]
9246        #[serde(transparent)]
9247        struct Field0 {
9248            pub value: SubscriptionId,
9249        }
9250
9251        #[derive(Deserialize)]
9252        #[serde(transparent)]
9253        struct Field1 {
9254            pub value: TransactionOrHash,
9255        }
9256
9257        let temp = serde_json::Value::deserialize(deserializer)?;
9258
9259        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9260            let field1 = serde_json::from_value::<Field1>(
9261                elements
9262                    .pop()
9263                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9264            )
9265            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9266            let field0 = serde_json::from_value::<Field0>(
9267                elements
9268                    .pop()
9269                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9270            )
9271            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9272
9273            Ok(Self {
9274                subscription_id: field0.value,
9275                result: field1.value,
9276            })
9277        } else if let Ok(object) = AsObject::deserialize(&temp) {
9278            Ok(Self {
9279                subscription_id: object.subscription_id.value,
9280                result: object.result.value,
9281            })
9282        } else {
9283            Err(serde::de::Error::custom("invalid sequence length"))
9284        }
9285    }
9286}
9287
9288impl Serialize for SubscriptionReorgRequest {
9289    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9290        #[derive(Serialize)]
9291        struct AsObject<'a> {
9292            subscription_id: Field0<'a>,
9293            result: Field1<'a>,
9294        }
9295
9296        #[derive(Serialize)]
9297        #[serde(transparent)]
9298        struct Field0<'a> {
9299            pub value: &'a SubscriptionId,
9300        }
9301
9302        #[derive(Serialize)]
9303        #[serde(transparent)]
9304        struct Field1<'a> {
9305            pub value: &'a ReorgData,
9306        }
9307
9308        AsObject::serialize(
9309            &AsObject {
9310                subscription_id: Field0 {
9311                    value: &self.subscription_id,
9312                },
9313                result: Field1 {
9314                    value: &self.result,
9315                },
9316            },
9317            serializer,
9318        )
9319    }
9320}
9321
9322impl Serialize for SubscriptionReorgRequestRef<'_> {
9323    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9324        #[derive(Serialize)]
9325        struct AsObject<'a> {
9326            subscription_id: Field0<'a>,
9327            result: Field1<'a>,
9328        }
9329
9330        #[derive(Serialize)]
9331        #[serde(transparent)]
9332        struct Field0<'a> {
9333            pub value: &'a SubscriptionId,
9334        }
9335
9336        #[derive(Serialize)]
9337        #[serde(transparent)]
9338        struct Field1<'a> {
9339            pub value: &'a ReorgData,
9340        }
9341
9342        AsObject::serialize(
9343            &AsObject {
9344                subscription_id: Field0 {
9345                    value: self.subscription_id,
9346                },
9347                result: Field1 { value: self.result },
9348            },
9349            serializer,
9350        )
9351    }
9352}
9353
9354impl<'de> Deserialize<'de> for SubscriptionReorgRequest {
9355    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9356        #[derive(Deserialize)]
9357        struct AsObject {
9358            subscription_id: Field0,
9359            result: Field1,
9360        }
9361
9362        #[derive(Deserialize)]
9363        #[serde(transparent)]
9364        struct Field0 {
9365            pub value: SubscriptionId,
9366        }
9367
9368        #[derive(Deserialize)]
9369        #[serde(transparent)]
9370        struct Field1 {
9371            pub value: ReorgData,
9372        }
9373
9374        let temp = serde_json::Value::deserialize(deserializer)?;
9375
9376        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9377            let field1 = serde_json::from_value::<Field1>(
9378                elements
9379                    .pop()
9380                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9381            )
9382            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9383            let field0 = serde_json::from_value::<Field0>(
9384                elements
9385                    .pop()
9386                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9387            )
9388            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9389
9390            Ok(Self {
9391                subscription_id: field0.value,
9392                result: field1.value,
9393            })
9394        } else if let Ok(object) = AsObject::deserialize(&temp) {
9395            Ok(Self {
9396                subscription_id: object.subscription_id.value,
9397                result: object.result.value,
9398            })
9399        } else {
9400            Err(serde::de::Error::custom("invalid sequence length"))
9401        }
9402    }
9403}
9404
9405impl Serialize for SubscriptionTransactionStatusRequest {
9406    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9407        #[derive(Serialize)]
9408        struct AsObject<'a> {
9409            subscription_id: Field0<'a>,
9410            result: Field1<'a>,
9411        }
9412
9413        #[derive(Serialize)]
9414        #[serde(transparent)]
9415        struct Field0<'a> {
9416            pub value: &'a SubscriptionId,
9417        }
9418
9419        #[derive(Serialize)]
9420        #[serde(transparent)]
9421        struct Field1<'a> {
9422            pub value: &'a NewTransactionStatus,
9423        }
9424
9425        AsObject::serialize(
9426            &AsObject {
9427                subscription_id: Field0 {
9428                    value: &self.subscription_id,
9429                },
9430                result: Field1 {
9431                    value: &self.result,
9432                },
9433            },
9434            serializer,
9435        )
9436    }
9437}
9438
9439impl Serialize for SubscriptionTransactionStatusRequestRef<'_> {
9440    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9441        #[derive(Serialize)]
9442        struct AsObject<'a> {
9443            subscription_id: Field0<'a>,
9444            result: Field1<'a>,
9445        }
9446
9447        #[derive(Serialize)]
9448        #[serde(transparent)]
9449        struct Field0<'a> {
9450            pub value: &'a SubscriptionId,
9451        }
9452
9453        #[derive(Serialize)]
9454        #[serde(transparent)]
9455        struct Field1<'a> {
9456            pub value: &'a NewTransactionStatus,
9457        }
9458
9459        AsObject::serialize(
9460            &AsObject {
9461                subscription_id: Field0 {
9462                    value: self.subscription_id,
9463                },
9464                result: Field1 { value: self.result },
9465            },
9466            serializer,
9467        )
9468    }
9469}
9470
9471impl<'de> Deserialize<'de> for SubscriptionTransactionStatusRequest {
9472    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9473        #[derive(Deserialize)]
9474        struct AsObject {
9475            subscription_id: Field0,
9476            result: Field1,
9477        }
9478
9479        #[derive(Deserialize)]
9480        #[serde(transparent)]
9481        struct Field0 {
9482            pub value: SubscriptionId,
9483        }
9484
9485        #[derive(Deserialize)]
9486        #[serde(transparent)]
9487        struct Field1 {
9488            pub value: NewTransactionStatus,
9489        }
9490
9491        let temp = serde_json::Value::deserialize(deserializer)?;
9492
9493        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9494            let field1 = serde_json::from_value::<Field1>(
9495                elements
9496                    .pop()
9497                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9498            )
9499            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9500            let field0 = serde_json::from_value::<Field0>(
9501                elements
9502                    .pop()
9503                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9504            )
9505            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9506
9507            Ok(Self {
9508                subscription_id: field0.value,
9509                result: field1.value,
9510            })
9511        } else if let Ok(object) = AsObject::deserialize(&temp) {
9512            Ok(Self {
9513                subscription_id: object.subscription_id.value,
9514                result: object.result.value,
9515            })
9516        } else {
9517            Err(serde::de::Error::custom("invalid sequence length"))
9518        }
9519    }
9520}
9521
9522impl Serialize for SyncingRequest {
9523    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9524        use serde::ser::SerializeSeq;
9525
9526        let seq = serializer.serialize_seq(Some(0))?;
9527        seq.end()
9528    }
9529}
9530
9531impl<'de> Deserialize<'de> for SyncingRequest {
9532    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9533        let elements = Vec::<()>::deserialize(deserializer)?;
9534        if !elements.is_empty() {
9535            return Err(serde::de::Error::custom("invalid sequence length"));
9536        }
9537        Ok(Self)
9538    }
9539}
9540
9541impl Serialize for TraceBlockTransactionsRequest {
9542    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9543        #[derive(Serialize)]
9544        struct AsObject<'a> {
9545            block_id: Field0<'a>,
9546        }
9547
9548        #[derive(Serialize)]
9549        #[serde(transparent)]
9550        struct Field0<'a> {
9551            pub value: &'a BlockId,
9552        }
9553
9554        AsObject::serialize(
9555            &AsObject {
9556                block_id: Field0 {
9557                    value: &self.block_id,
9558                },
9559            },
9560            serializer,
9561        )
9562    }
9563}
9564
9565impl Serialize for TraceBlockTransactionsRequestRef<'_> {
9566    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9567        #[derive(Serialize)]
9568        struct AsObject<'a> {
9569            block_id: Field0<'a>,
9570        }
9571
9572        #[derive(Serialize)]
9573        #[serde(transparent)]
9574        struct Field0<'a> {
9575            pub value: &'a BlockId,
9576        }
9577
9578        AsObject::serialize(
9579            &AsObject {
9580                block_id: Field0 {
9581                    value: self.block_id,
9582                },
9583            },
9584            serializer,
9585        )
9586    }
9587}
9588
9589impl<'de> Deserialize<'de> for TraceBlockTransactionsRequest {
9590    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9591        #[derive(Deserialize)]
9592        struct AsObject {
9593            block_id: Field0,
9594        }
9595
9596        #[derive(Deserialize)]
9597        #[serde(transparent)]
9598        struct Field0 {
9599            pub value: BlockId,
9600        }
9601
9602        let temp = serde_json::Value::deserialize(deserializer)?;
9603
9604        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9605            let field0 = serde_json::from_value::<Field0>(
9606                elements
9607                    .pop()
9608                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9609            )
9610            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9611
9612            Ok(Self {
9613                block_id: field0.value,
9614            })
9615        } else if let Ok(object) = AsObject::deserialize(&temp) {
9616            Ok(Self {
9617                block_id: object.block_id.value,
9618            })
9619        } else {
9620            Err(serde::de::Error::custom("invalid sequence length"))
9621        }
9622    }
9623}
9624
9625impl Serialize for TraceTransactionRequest {
9626    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9627        #[derive(Serialize)]
9628        struct AsObject<'a> {
9629            transaction_hash: Field0<'a>,
9630        }
9631
9632        #[serde_as]
9633        #[derive(Serialize)]
9634        #[serde(transparent)]
9635        struct Field0<'a> {
9636            #[serde_as(as = "UfeHex")]
9637            pub value: &'a Felt,
9638        }
9639
9640        AsObject::serialize(
9641            &AsObject {
9642                transaction_hash: Field0 {
9643                    value: &self.transaction_hash,
9644                },
9645            },
9646            serializer,
9647        )
9648    }
9649}
9650
9651impl Serialize for TraceTransactionRequestRef<'_> {
9652    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9653        #[derive(Serialize)]
9654        struct AsObject<'a> {
9655            transaction_hash: Field0<'a>,
9656        }
9657
9658        #[serde_as]
9659        #[derive(Serialize)]
9660        #[serde(transparent)]
9661        struct Field0<'a> {
9662            #[serde_as(as = "UfeHex")]
9663            pub value: &'a Felt,
9664        }
9665
9666        AsObject::serialize(
9667            &AsObject {
9668                transaction_hash: Field0 {
9669                    value: self.transaction_hash,
9670                },
9671            },
9672            serializer,
9673        )
9674    }
9675}
9676
9677impl<'de> Deserialize<'de> for TraceTransactionRequest {
9678    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9679        #[derive(Deserialize)]
9680        struct AsObject {
9681            transaction_hash: Field0,
9682        }
9683
9684        #[serde_as]
9685        #[derive(Deserialize)]
9686        #[serde(transparent)]
9687        struct Field0 {
9688            #[serde_as(as = "UfeHex")]
9689            pub value: Felt,
9690        }
9691
9692        let temp = serde_json::Value::deserialize(deserializer)?;
9693
9694        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9695            let field0 = serde_json::from_value::<Field0>(
9696                elements
9697                    .pop()
9698                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9699            )
9700            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9701
9702            Ok(Self {
9703                transaction_hash: field0.value,
9704            })
9705        } else if let Ok(object) = AsObject::deserialize(&temp) {
9706            Ok(Self {
9707                transaction_hash: object.transaction_hash.value,
9708            })
9709        } else {
9710            Err(serde::de::Error::custom("invalid sequence length"))
9711        }
9712    }
9713}
9714
9715impl Serialize for UnsubscribeRequest {
9716    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9717        #[derive(Serialize)]
9718        struct AsObject<'a> {
9719            subscription_id: Field0<'a>,
9720        }
9721
9722        #[derive(Serialize)]
9723        #[serde(transparent)]
9724        struct Field0<'a> {
9725            pub value: &'a SubscriptionId,
9726        }
9727
9728        AsObject::serialize(
9729            &AsObject {
9730                subscription_id: Field0 {
9731                    value: &self.subscription_id,
9732                },
9733            },
9734            serializer,
9735        )
9736    }
9737}
9738
9739impl Serialize for UnsubscribeRequestRef<'_> {
9740    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9741        #[derive(Serialize)]
9742        struct AsObject<'a> {
9743            subscription_id: Field0<'a>,
9744        }
9745
9746        #[derive(Serialize)]
9747        #[serde(transparent)]
9748        struct Field0<'a> {
9749            pub value: &'a SubscriptionId,
9750        }
9751
9752        AsObject::serialize(
9753            &AsObject {
9754                subscription_id: Field0 {
9755                    value: self.subscription_id,
9756                },
9757            },
9758            serializer,
9759        )
9760    }
9761}
9762
9763impl<'de> Deserialize<'de> for UnsubscribeRequest {
9764    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
9765        #[derive(Deserialize)]
9766        struct AsObject {
9767            subscription_id: Field0,
9768        }
9769
9770        #[derive(Deserialize)]
9771        #[serde(transparent)]
9772        struct Field0 {
9773            pub value: SubscriptionId,
9774        }
9775
9776        let temp = serde_json::Value::deserialize(deserializer)?;
9777
9778        if let Ok(mut elements) = Vec::<serde_json::Value>::deserialize(&temp) {
9779            let field0 = serde_json::from_value::<Field0>(
9780                elements
9781                    .pop()
9782                    .ok_or_else(|| serde::de::Error::custom("invalid sequence length"))?,
9783            )
9784            .map_err(|err| serde::de::Error::custom(format!("failed to parse element: {}", err)))?;
9785
9786            Ok(Self {
9787                subscription_id: field0.value,
9788            })
9789        } else if let Ok(object) = AsObject::deserialize(&temp) {
9790            Ok(Self {
9791                subscription_id: object.subscription_id.value,
9792            })
9793        } else {
9794            Err(serde::de::Error::custom("invalid sequence length"))
9795        }
9796    }
9797}