cfx_rpc_eth_types/
simulate.rs1use crate::{
2 Block, BlockOverrides, Log, RpcAccountOverride as StateOverride,
3 TransactionRequest,
4};
5use cfx_bytes::Bytes;
6use cfx_types::U64;
7
8pub const MAX_SIMULATE_BLOCKS: u64 = 256;
10
11#[derive(Clone, Debug, Default)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
17pub struct SimBlock {
18 #[cfg_attr(
20 feature = "serde",
21 serde(default, skip_serializing_if = "Option::is_none")
22 )]
23 pub block_overrides: Option<BlockOverrides>,
24 #[cfg_attr(
26 feature = "serde",
27 serde(default, skip_serializing_if = "Option::is_none")
28 )]
29 pub state_overrides: Option<StateOverride>,
30 #[cfg_attr(feature = "serde", serde(default))]
32 pub calls: Vec<TransactionRequest>,
33}
34
35impl SimBlock {
36 pub fn with_state_overrides(mut self, overrides: StateOverride) -> Self {
38 self.state_overrides = Some(overrides);
39 self
40 }
41
42 pub fn with_block_overrides(mut self, overrides: BlockOverrides) -> Self {
44 self.block_overrides = Some(overrides);
45 self
46 }
47
48 pub fn call(mut self, call: TransactionRequest) -> Self {
50 self.calls.push(call);
51 self
52 }
53
54 pub fn extend_calls(
56 mut self, calls: impl IntoIterator<Item = TransactionRequest>,
57 ) -> Self {
58 self.calls.extend(calls);
59 self
60 }
61}
62
63#[derive(Clone, Debug)]
65#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
66#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
67pub struct SimulatedBlock<B = Block> {
68 #[cfg_attr(feature = "serde", serde(flatten))]
70 pub inner: B,
71 pub calls: Vec<SimCallResult>,
73}
74
75#[derive(Clone, Debug)]
79#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
80#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
81pub struct SimCallResult {
82 pub return_data: Bytes,
84 #[cfg_attr(feature = "serde", serde(default))]
86 pub logs: Vec<Log>,
87 pub gas_used: U64,
89 pub status: U64,
92 #[cfg_attr(
94 feature = "serde",
95 serde(default, skip_serializing_if = "Option::is_none")
96 )]
97 pub error: Option<SimulateError>,
98}
99
100#[derive(Clone, Debug, Default)]
106#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
107#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
108pub struct SimulatePayload {
109 #[cfg_attr(feature = "serde", serde(default))]
112 pub block_state_calls: Vec<SimBlock>,
113 #[cfg_attr(feature = "serde", serde(default))]
116 pub trace_transfers: bool,
117 #[cfg_attr(feature = "serde", serde(default))]
120 pub validation: bool,
121 #[cfg_attr(feature = "serde", serde(default))]
124 pub return_full_transactions: bool,
125}
126
127impl SimulatePayload {
128 pub fn extend(mut self, block: SimBlock) -> Self {
130 self.block_state_calls.push(block);
131 self
132 }
133
134 pub fn extend_blocks(
136 mut self, blocks: impl IntoIterator<Item = SimBlock>,
137 ) -> Self {
138 self.block_state_calls.extend(blocks);
139 self
140 }
141
142 pub const fn with_trace_transfers(mut self) -> Self {
144 self.trace_transfers = true;
145 self
146 }
147
148 pub const fn with_validation(mut self) -> Self {
150 self.validation = true;
151 self
152 }
153
154 pub const fn with_full_transactions(mut self) -> Self {
156 self.return_full_transactions = true;
157 self
158 }
159}
160
161#[derive(Clone, Debug)]
163#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
164#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
165pub struct SimulateError {
166 pub code: i32,
170 pub message: String,
172}