1use crate::{eth::subscription::SubscriptionId, types::ReorgOptions};
2use alloy_primitives::{Address, B64, B256, Bytes, TxHash, U256};
3use alloy_rpc_types::{
4 BlockId, BlockNumberOrTag as BlockNumber, BlockOverrides, Filter, Index,
5 anvil::{Forking, MineOptions},
6 pubsub::{Params as SubscriptionParams, SubscriptionKind},
7 request::TransactionRequest,
8 simulate::SimulatePayload,
9 state::StateOverride,
10 trace::{
11 filter::TraceFilter,
12 geth::{GethDebugTracingCallOptions, GethDebugTracingOptions},
13 },
14};
15use alloy_serde::WithOtherFields;
16use foundry_common::serde_helpers::{
17 deserialize_number, deserialize_number_opt, deserialize_number_seq,
18};
19
20pub mod block;
21pub mod subscription;
22pub mod transaction;
23pub mod wallet;
24
25pub mod serde_helpers;
26use self::serde_helpers::*;
27
28#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)]
30pub struct Params<T: Default> {
31 #[serde(default)]
32 pub params: T,
33}
34
35#[derive(Clone, Debug, serde::Deserialize)]
37#[serde(tag = "method", content = "params")]
38#[allow(clippy::large_enum_variant)]
39pub enum EthRequest {
40 #[serde(rename = "web3_clientVersion", with = "empty_params")]
41 Web3ClientVersion(()),
42
43 #[serde(rename = "web3_sha3", with = "sequence")]
44 Web3Sha3(Bytes),
45
46 #[serde(rename = "eth_chainId", with = "empty_params")]
47 EthChainId(()),
48
49 #[serde(rename = "eth_networkId", alias = "net_version", with = "empty_params")]
50 EthNetworkId(()),
51
52 #[serde(rename = "net_listening", with = "empty_params")]
53 NetListening(()),
54
55 #[serde(rename = "eth_gasPrice", with = "empty_params")]
56 EthGasPrice(()),
57
58 #[serde(rename = "eth_maxPriorityFeePerGas", with = "empty_params")]
59 EthMaxPriorityFeePerGas(()),
60
61 #[serde(rename = "eth_blobBaseFee", with = "empty_params")]
62 EthBlobBaseFee(()),
63
64 #[serde(rename = "eth_accounts", alias = "eth_requestAccounts", with = "empty_params")]
65 EthAccounts(()),
66
67 #[serde(rename = "eth_blockNumber", with = "empty_params")]
68 EthBlockNumber(()),
69
70 #[serde(rename = "eth_getBalance")]
71 EthGetBalance(Address, Option<BlockId>),
72
73 #[serde(rename = "eth_getAccount")]
74 EthGetAccount(Address, Option<BlockId>),
75
76 #[serde(rename = "eth_getAccountInfo")]
77 EthGetAccountInfo(Address, Option<BlockId>),
78
79 #[serde(rename = "eth_getStorageAt")]
80 EthGetStorageAt(Address, U256, Option<BlockId>),
81
82 #[serde(rename = "eth_getBlockByHash")]
83 EthGetBlockByHash(B256, bool),
84
85 #[serde(rename = "eth_getBlockByNumber")]
86 EthGetBlockByNumber(
87 #[serde(deserialize_with = "lenient_block_number::lenient_block_number")] BlockNumber,
88 bool,
89 ),
90
91 #[serde(rename = "eth_getTransactionCount")]
92 EthGetTransactionCount(Address, Option<BlockId>),
93
94 #[serde(rename = "eth_getBlockTransactionCountByHash", with = "sequence")]
95 EthGetTransactionCountByHash(B256),
96
97 #[serde(
98 rename = "eth_getBlockTransactionCountByNumber",
99 deserialize_with = "lenient_block_number::lenient_block_number_seq"
100 )]
101 EthGetTransactionCountByNumber(BlockNumber),
102
103 #[serde(rename = "eth_getUncleCountByBlockHash", with = "sequence")]
104 EthGetUnclesCountByHash(B256),
105
106 #[serde(
107 rename = "eth_getUncleCountByBlockNumber",
108 deserialize_with = "lenient_block_number::lenient_block_number_seq"
109 )]
110 EthGetUnclesCountByNumber(BlockNumber),
111
112 #[serde(rename = "eth_getCode")]
113 EthGetCodeAt(Address, Option<BlockId>),
114
115 #[serde(rename = "eth_getProof")]
118 EthGetProof(Address, Vec<B256>, Option<BlockId>),
119
120 #[serde(rename = "eth_sign")]
122 EthSign(Address, Bytes),
123
124 #[serde(rename = "personal_sign")]
127 PersonalSign(Bytes, Address),
128
129 #[serde(rename = "eth_signTransaction", with = "sequence")]
130 EthSignTransaction(Box<WithOtherFields<TransactionRequest>>),
131
132 #[serde(rename = "eth_signTypedData")]
134 EthSignTypedData(Address, serde_json::Value),
135
136 #[serde(rename = "eth_signTypedData_v3")]
138 EthSignTypedDataV3(Address, serde_json::Value),
139
140 #[serde(rename = "eth_signTypedData_v4")]
142 EthSignTypedDataV4(Address, alloy_dyn_abi::TypedData),
143
144 #[serde(rename = "eth_sendTransaction", with = "sequence")]
145 EthSendTransaction(Box<WithOtherFields<TransactionRequest>>),
146
147 #[serde(rename = "eth_sendTransactionSync", with = "sequence")]
148 EthSendTransactionSync(Box<WithOtherFields<TransactionRequest>>),
149
150 #[serde(rename = "eth_sendRawTransaction", with = "sequence")]
151 EthSendRawTransaction(Bytes),
152
153 #[serde(rename = "eth_sendRawTransactionSync", with = "sequence")]
154 EthSendRawTransactionSync(Bytes),
155
156 #[serde(rename = "eth_call")]
157 EthCall(
158 WithOtherFields<TransactionRequest>,
159 #[serde(default)] Option<BlockId>,
160 #[serde(default)] Option<StateOverride>,
161 #[serde(default)] Option<Box<BlockOverrides>>,
162 ),
163
164 #[serde(rename = "eth_simulateV1")]
165 EthSimulateV1(SimulatePayload, #[serde(default)] Option<BlockId>),
166
167 #[serde(rename = "eth_createAccessList")]
168 EthCreateAccessList(WithOtherFields<TransactionRequest>, #[serde(default)] Option<BlockId>),
169
170 #[serde(rename = "eth_estimateGas")]
171 EthEstimateGas(
172 WithOtherFields<TransactionRequest>,
173 #[serde(default)] Option<BlockId>,
174 #[serde(default)] Option<StateOverride>,
175 #[serde(default)] Option<Box<BlockOverrides>>,
176 ),
177
178 #[serde(rename = "eth_getTransactionByHash", with = "sequence")]
179 EthGetTransactionByHash(TxHash),
180
181 #[serde(rename = "anvil_getBlobByHash", with = "sequence")]
183 GetBlobByHash(B256),
184
185 #[serde(rename = "anvil_getBlobsByTransactionHash", with = "sequence")]
187 GetBlobByTransactionHash(TxHash),
188
189 #[serde(rename = "eth_getTransactionByBlockHashAndIndex")]
190 EthGetTransactionByBlockHashAndIndex(TxHash, Index),
191
192 #[serde(rename = "eth_getTransactionByBlockNumberAndIndex")]
193 EthGetTransactionByBlockNumberAndIndex(BlockNumber, Index),
194
195 #[serde(rename = "eth_getRawTransactionByHash", with = "sequence")]
196 EthGetRawTransactionByHash(TxHash),
197
198 #[serde(rename = "eth_getRawTransactionByBlockHashAndIndex")]
199 EthGetRawTransactionByBlockHashAndIndex(TxHash, Index),
200
201 #[serde(rename = "eth_getRawTransactionByBlockNumberAndIndex")]
202 EthGetRawTransactionByBlockNumberAndIndex(BlockNumber, Index),
203
204 #[serde(rename = "eth_getTransactionReceipt", with = "sequence")]
205 EthGetTransactionReceipt(B256),
206
207 #[serde(rename = "eth_getBlockReceipts", with = "sequence")]
208 EthGetBlockReceipts(BlockId),
209
210 #[serde(rename = "eth_getUncleByBlockHashAndIndex")]
211 EthGetUncleByBlockHashAndIndex(B256, Index),
212
213 #[serde(rename = "eth_getUncleByBlockNumberAndIndex")]
214 EthGetUncleByBlockNumberAndIndex(
215 #[serde(deserialize_with = "lenient_block_number::lenient_block_number")] BlockNumber,
216 Index,
217 ),
218
219 #[serde(rename = "eth_getLogs", with = "sequence")]
220 EthGetLogs(Filter),
221
222 #[serde(rename = "eth_newFilter", with = "sequence")]
224 EthNewFilter(Filter),
225
226 #[serde(rename = "eth_getFilterChanges", with = "sequence")]
228 EthGetFilterChanges(String),
229
230 #[serde(rename = "eth_newBlockFilter", with = "empty_params")]
233 EthNewBlockFilter(()),
234
235 #[serde(rename = "eth_newPendingTransactionFilter", with = "empty_params")]
238 EthNewPendingTransactionFilter(()),
239
240 #[serde(rename = "eth_getFilterLogs", with = "sequence")]
242 EthGetFilterLogs(String),
243
244 #[serde(rename = "eth_uninstallFilter", with = "sequence")]
246 EthUninstallFilter(String),
247
248 #[serde(rename = "eth_getWork", with = "empty_params")]
249 EthGetWork(()),
250
251 #[serde(rename = "eth_submitWork")]
252 EthSubmitWork(B64, B256, B256),
253
254 #[serde(rename = "eth_submitHashrate")]
255 EthSubmitHashRate(U256, B256),
256
257 #[serde(rename = "eth_feeHistory")]
258 EthFeeHistory(
259 #[serde(deserialize_with = "deserialize_number")] U256,
260 BlockNumber,
261 #[serde(default)] Vec<f64>,
262 ),
263
264 #[serde(rename = "eth_syncing", with = "empty_params")]
265 EthSyncing(()),
266
267 #[serde(rename = "debug_getRawTransaction", with = "sequence")]
269 DebugGetRawTransaction(TxHash),
270
271 #[serde(rename = "debug_traceTransaction")]
273 DebugTraceTransaction(B256, #[serde(default)] GethDebugTracingOptions),
274
275 #[serde(rename = "debug_traceCall")]
277 DebugTraceCall(
278 WithOtherFields<TransactionRequest>,
279 #[serde(default)] Option<BlockId>,
280 #[serde(default)] GethDebugTracingCallOptions,
281 ),
282
283 #[serde(rename = "trace_transaction", with = "sequence")]
285 TraceTransaction(B256),
286
287 #[serde(
289 rename = "trace_block",
290 deserialize_with = "lenient_block_number::lenient_block_number_seq"
291 )]
292 TraceBlock(BlockNumber),
293
294 #[serde(rename = "trace_filter", with = "sequence")]
296 TraceFilter(TraceFilter),
297
298 #[serde(
301 rename = "anvil_impersonateAccount",
302 alias = "hardhat_impersonateAccount",
303 with = "sequence"
304 )]
305 ImpersonateAccount(Address),
306 #[serde(
308 rename = "anvil_stopImpersonatingAccount",
309 alias = "hardhat_stopImpersonatingAccount",
310 with = "sequence"
311 )]
312 StopImpersonatingAccount(Address),
313 #[serde(
315 rename = "anvil_autoImpersonateAccount",
316 alias = "hardhat_autoImpersonateAccount",
317 with = "sequence"
318 )]
319 AutoImpersonateAccount(bool),
320 #[serde(rename = "anvil_getAutomine", alias = "hardhat_getAutomine", with = "empty_params")]
322 GetAutoMine(()),
323 #[serde(rename = "anvil_mine", alias = "hardhat_mine")]
325 Mine(
326 #[serde(default, deserialize_with = "deserialize_number_opt")]
328 Option<U256>,
329 #[serde(default, deserialize_with = "deserialize_number_opt")]
333 Option<U256>,
334 ),
335
336 #[serde(rename = "anvil_setAutomine", alias = "evm_setAutomine", with = "sequence")]
339 SetAutomine(bool),
340
341 #[serde(rename = "anvil_setIntervalMining", alias = "evm_setIntervalMining", with = "sequence")]
343 SetIntervalMining(u64),
344
345 #[serde(rename = "anvil_getIntervalMining", with = "empty_params")]
347 GetIntervalMining(()),
348
349 #[serde(rename = "anvil_dropTransaction", alias = "hardhat_dropTransaction", with = "sequence")]
351 DropTransaction(B256),
352
353 #[serde(
355 rename = "anvil_dropAllTransactions",
356 alias = "hardhat_dropAllTransactions",
357 with = "empty_params"
358 )]
359 DropAllTransactions(),
360
361 #[serde(rename = "anvil_reset", alias = "hardhat_reset")]
363 Reset(#[serde(default)] Option<Params<Option<Forking>>>),
364
365 #[serde(rename = "anvil_setRpcUrl", with = "sequence")]
367 SetRpcUrl(String),
368
369 #[serde(
371 rename = "anvil_setBalance",
372 alias = "hardhat_setBalance",
373 alias = "tenderly_setBalance"
374 )]
375 SetBalance(Address, #[serde(deserialize_with = "deserialize_number")] U256),
376
377 #[serde(
379 rename = "anvil_addBalance",
380 alias = "hardhat_addBalance",
381 alias = "tenderly_addBalance"
382 )]
383 AddBalance(Address, #[serde(deserialize_with = "deserialize_number")] U256),
384
385 #[serde(
387 rename = "anvil_dealERC20",
388 alias = "hardhat_dealERC20",
389 alias = "anvil_setERC20Balance"
390 )]
391 DealERC20(Address, Address, #[serde(deserialize_with = "deserialize_number")] U256),
392
393 #[serde(rename = "anvil_setERC20Allowance")]
395 SetERC20Allowance(
396 Address,
397 Address,
398 Address,
399 #[serde(deserialize_with = "deserialize_number")] U256,
400 ),
401
402 #[serde(rename = "anvil_setCode", alias = "hardhat_setCode")]
404 SetCode(Address, Bytes),
405
406 #[serde(rename = "anvil_setNonce", alias = "hardhat_setNonce", alias = "evm_setAccountNonce")]
408 SetNonce(Address, #[serde(deserialize_with = "deserialize_number")] U256),
409
410 #[serde(rename = "anvil_setStorageAt", alias = "hardhat_setStorageAt")]
412 SetStorageAt(
413 Address,
414 U256,
416 B256,
418 ),
419
420 #[serde(rename = "anvil_setCoinbase", alias = "hardhat_setCoinbase", with = "sequence")]
422 SetCoinbase(Address),
423
424 #[serde(rename = "anvil_setChainId", with = "sequence")]
426 SetChainId(u64),
427
428 #[serde(
430 rename = "anvil_setLoggingEnabled",
431 alias = "hardhat_setLoggingEnabled",
432 with = "sequence"
433 )]
434 SetLogging(bool),
435
436 #[serde(
438 rename = "anvil_setMinGasPrice",
439 alias = "hardhat_setMinGasPrice",
440 deserialize_with = "deserialize_number_seq"
441 )]
442 SetMinGasPrice(U256),
443
444 #[serde(
446 rename = "anvil_setNextBlockBaseFeePerGas",
447 alias = "hardhat_setNextBlockBaseFeePerGas",
448 deserialize_with = "deserialize_number_seq"
449 )]
450 SetNextBlockBaseFeePerGas(U256),
451
452 #[serde(
456 rename = "anvil_setTime",
457 alias = "evm_setTime",
458 deserialize_with = "deserialize_number_seq"
459 )]
460 EvmSetTime(U256),
461
462 #[serde(rename = "anvil_dumpState", alias = "hardhat_dumpState")]
465 DumpState(#[serde(default)] Option<Params<Option<bool>>>),
466
467 #[serde(rename = "anvil_loadState", alias = "hardhat_loadState", with = "sequence")]
469 LoadState(Bytes),
470
471 #[serde(rename = "anvil_nodeInfo", with = "empty_params")]
473 NodeInfo(()),
474
475 #[serde(rename = "anvil_metadata", alias = "hardhat_metadata", with = "empty_params")]
477 AnvilMetadata(()),
478
479 #[serde(rename = "anvil_snapshot", alias = "evm_snapshot", with = "empty_params")]
484 EvmSnapshot(()),
485
486 #[serde(
491 rename = "anvil_revert",
492 alias = "evm_revert",
493 deserialize_with = "deserialize_number_seq"
494 )]
495 EvmRevert(U256),
496
497 #[serde(
499 rename = "anvil_increaseTime",
500 alias = "evm_increaseTime",
501 deserialize_with = "deserialize_number_seq"
502 )]
503 EvmIncreaseTime(U256),
504
505 #[serde(
507 rename = "anvil_setNextBlockTimestamp",
508 alias = "evm_setNextBlockTimestamp",
509 deserialize_with = "deserialize_number_seq"
510 )]
511 EvmSetNextBlockTimeStamp(U256),
512
513 #[serde(
515 rename = "anvil_setBlockGasLimit",
516 alias = "evm_setBlockGasLimit",
517 deserialize_with = "deserialize_number_seq"
518 )]
519 EvmSetBlockGasLimit(U256),
520
521 #[serde(rename = "anvil_setBlockTimestampInterval", with = "sequence")]
525 EvmSetBlockTimeStampInterval(u64),
526
527 #[serde(rename = "anvil_removeBlockTimestampInterval", with = "empty_params")]
529 EvmRemoveBlockTimeStampInterval(()),
530
531 #[serde(rename = "evm_mine")]
533 EvmMine(#[serde(default)] Option<Params<Option<MineOptions>>>),
534
535 #[serde(rename = "anvil_mine_detailed", alias = "evm_mine_detailed")]
540 EvmMineDetailed(#[serde(default)] Option<Params<Option<MineOptions>>>),
541
542 #[serde(rename = "eth_sendUnsignedTransaction", with = "sequence")]
544 EthSendUnsignedTransaction(Box<WithOtherFields<TransactionRequest>>),
545
546 #[serde(rename = "anvil_enableTraces", with = "empty_params")]
549 EnableTraces(()),
550
551 #[serde(rename = "txpool_status", with = "empty_params")]
555 TxPoolStatus(()),
556
557 #[serde(rename = "txpool_inspect", with = "empty_params")]
561 TxPoolInspect(()),
562
563 #[serde(rename = "txpool_content", with = "empty_params")]
567 TxPoolContent(()),
568
569 #[serde(rename = "erigon_getHeaderByNumber")]
574 ErigonGetHeaderByNumber(
575 #[serde(deserialize_with = "lenient_block_number::lenient_block_number_seq")] BlockNumber,
576 ),
577
578 #[serde(rename = "ots_getApiLevel", with = "empty_params")]
581 OtsGetApiLevel(()),
582
583 #[serde(rename = "ots_getInternalOperations", with = "sequence")]
587 OtsGetInternalOperations(B256),
588
589 #[serde(rename = "ots_hasCode")]
592 OtsHasCode(
593 Address,
594 #[serde(deserialize_with = "lenient_block_number::lenient_block_number", default)]
595 BlockNumber,
596 ),
597
598 #[serde(rename = "ots_traceTransaction", with = "sequence")]
601 OtsTraceTransaction(B256),
602
603 #[serde(rename = "ots_getTransactionError", with = "sequence")]
606 OtsGetTransactionError(B256),
607
608 #[serde(rename = "ots_getBlockDetails")]
613 OtsGetBlockDetails(
614 #[serde(deserialize_with = "lenient_block_number::lenient_block_number_seq", default)]
615 BlockNumber,
616 ),
617
618 #[serde(rename = "ots_getBlockDetailsByHash", with = "sequence")]
621 OtsGetBlockDetailsByHash(B256),
622
623 #[serde(rename = "ots_getBlockTransactions")]
627 OtsGetBlockTransactions(u64, usize, usize),
628
629 #[serde(rename = "ots_searchTransactionsBefore")]
632 OtsSearchTransactionsBefore(Address, u64, usize),
633
634 #[serde(rename = "ots_searchTransactionsAfter")]
637 OtsSearchTransactionsAfter(Address, u64, usize),
638
639 #[serde(rename = "ots_getTransactionBySenderAndNonce")]
644 OtsGetTransactionBySenderAndNonce(
645 Address,
646 #[serde(deserialize_with = "deserialize_number")] U256,
647 ),
648
649 #[serde(rename = "ots_getContractCreator", with = "sequence")]
653 OtsGetContractCreator(Address),
654
655 #[serde(rename = "anvil_removePoolTransactions", with = "sequence")]
657 RemovePoolTransactions(Address),
658
659 #[serde(rename = "anvil_reorg")]
661 Reorg(ReorgOptions),
662
663 #[serde(rename = "anvil_rollback", with = "sequence")]
665 Rollback(Option<u64>),
666
667 #[serde(rename = "wallet_getCapabilities", with = "empty_params")]
669 WalletGetCapabilities(()),
670
671 #[serde(
673 rename = "wallet_sendTransaction",
674 alias = "odyssey_sendTransaction",
675 with = "sequence"
676 )]
677 WalletSendTransaction(Box<WithOtherFields<TransactionRequest>>),
678
679 #[serde(rename = "anvil_addCapability", with = "sequence")]
683 AnvilAddCapability(Address),
684
685 #[serde(rename = "anvil_setExecutor", with = "sequence")]
687 AnvilSetExecutor(String),
688}
689
690#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)]
692#[serde(tag = "method", content = "params")]
693pub enum EthPubSub {
694 #[serde(rename = "eth_subscribe")]
696 EthSubscribe(SubscriptionKind, #[serde(default)] Box<SubscriptionParams>),
697
698 #[serde(rename = "eth_unsubscribe", with = "sequence")]
700 EthUnSubscribe(SubscriptionId),
701}
702
703#[derive(Clone, Debug, serde::Deserialize)]
705#[serde(untagged)]
706pub enum EthRpcCall {
707 Request(Box<EthRequest>),
708 PubSub(EthPubSub),
709}
710
711#[cfg(test)]
712mod tests {
713 use super::*;
714
715 #[test]
716 fn test_web3_client_version() {
717 let s = r#"{"method": "web3_clientVersion", "params":[]}"#;
718 let value: serde_json::Value = serde_json::from_str(s).unwrap();
719 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
720 }
721
722 #[test]
723 fn test_web3_sha3() {
724 let s = r#"{"method": "web3_sha3", "params":["0x68656c6c6f20776f726c64"]}"#;
725 let value: serde_json::Value = serde_json::from_str(s).unwrap();
726 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
727 }
728
729 #[test]
730 fn test_eth_accounts() {
731 let s = r#"{"method": "eth_accounts", "params":[]}"#;
732 let value: serde_json::Value = serde_json::from_str(s).unwrap();
733 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
734 }
735
736 #[test]
737 fn test_eth_network_id() {
738 let s = r#"{"method": "eth_networkId", "params":[]}"#;
739 let value: serde_json::Value = serde_json::from_str(s).unwrap();
740 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
741 }
742
743 #[test]
744 fn test_eth_get_proof() {
745 let s = r#"{"method":"eth_getProof","params":["0x7F0d15C7FAae65896648C8273B6d7E43f58Fa842",["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"],"latest"]}"#;
746 let value: serde_json::Value = serde_json::from_str(s).unwrap();
747 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
748 }
749
750 #[test]
751 fn test_eth_chain_id() {
752 let s = r#"{"method": "eth_chainId", "params":[]}"#;
753 let value: serde_json::Value = serde_json::from_str(s).unwrap();
754 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
755 }
756
757 #[test]
758 fn test_net_listening() {
759 let s = r#"{"method": "net_listening", "params":[]}"#;
760 let value: serde_json::Value = serde_json::from_str(s).unwrap();
761 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
762 }
763
764 #[test]
765 fn test_eth_block_number() {
766 let s = r#"{"method": "eth_blockNumber", "params":[]}"#;
767 let value: serde_json::Value = serde_json::from_str(s).unwrap();
768 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
769 }
770
771 #[test]
772 fn test_eth_max_priority_fee() {
773 let s = r#"{"method": "eth_maxPriorityFeePerGas", "params":[]}"#;
774 let value: serde_json::Value = serde_json::from_str(s).unwrap();
775 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
776 }
777
778 #[test]
779 fn test_eth_syncing() {
780 let s = r#"{"method": "eth_syncing", "params":[]}"#;
781 let value: serde_json::Value = serde_json::from_str(s).unwrap();
782 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
783 }
784
785 #[test]
786 fn test_custom_impersonate_account() {
787 let s = r#"{"method": "anvil_impersonateAccount", "params":
788["0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
789 let value: serde_json::Value = serde_json::from_str(s).unwrap();
790 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
791 }
792
793 #[test]
794 fn test_custom_stop_impersonate_account() {
795 let s = r#"{"method": "anvil_stopImpersonatingAccount", "params":
796["0x364d6D0333432C3Ac016Ca832fb8594A8cE43Ca6"]}"#;
797 let value: serde_json::Value = serde_json::from_str(s).unwrap();
798 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
799 }
800
801 #[test]
802 fn test_custom_auto_impersonate_account() {
803 let s = r#"{"method": "anvil_autoImpersonateAccount", "params": [true]}"#;
804 let value: serde_json::Value = serde_json::from_str(s).unwrap();
805 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
806 }
807
808 #[test]
809 fn test_custom_get_automine() {
810 let s = r#"{"method": "anvil_getAutomine", "params": []}"#;
811 let value: serde_json::Value = serde_json::from_str(s).unwrap();
812 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
813 }
814
815 #[test]
816 fn test_custom_mine() {
817 let s = r#"{"method": "anvil_mine", "params": []}"#;
818 let value: serde_json::Value = serde_json::from_str(s).unwrap();
819 let req = serde_json::from_value::<EthRequest>(value).unwrap();
820 match req {
821 EthRequest::Mine(num, time) => {
822 assert!(num.is_none());
823 assert!(time.is_none());
824 }
825 _ => unreachable!(),
826 }
827 let s = r#"{"method": "anvil_mine", "params":
828["0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
829 let value: serde_json::Value = serde_json::from_str(s).unwrap();
830 let req = serde_json::from_value::<EthRequest>(value).unwrap();
831 match req {
832 EthRequest::Mine(num, time) => {
833 assert!(num.is_some());
834 assert!(time.is_none());
835 }
836 _ => unreachable!(),
837 }
838 let s = r#"{"method": "anvil_mine", "params": ["0xd84de507f3fada7df80908082d3239466db55a71", "0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
839 let value: serde_json::Value = serde_json::from_str(s).unwrap();
840 let req = serde_json::from_value::<EthRequest>(value).unwrap();
841 match req {
842 EthRequest::Mine(num, time) => {
843 assert!(num.is_some());
844 assert!(time.is_some());
845 }
846 _ => unreachable!(),
847 }
848 }
849
850 #[test]
851 fn test_custom_auto_mine() {
852 let s = r#"{"method": "anvil_setAutomine", "params": [false]}"#;
853 let value: serde_json::Value = serde_json::from_str(s).unwrap();
854 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
855 let s = r#"{"method": "evm_setAutomine", "params": [false]}"#;
856 let value: serde_json::Value = serde_json::from_str(s).unwrap();
857 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
858 }
859
860 #[test]
861 fn test_custom_interval_mining() {
862 let s = r#"{"method": "anvil_setIntervalMining", "params": [100]}"#;
863 let value: serde_json::Value = serde_json::from_str(s).unwrap();
864 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
865 let s = r#"{"method": "evm_setIntervalMining", "params": [100]}"#;
866 let value: serde_json::Value = serde_json::from_str(s).unwrap();
867 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
868 }
869
870 #[test]
871 fn test_custom_drop_tx() {
872 let s = r#"{"method": "anvil_dropTransaction", "params":
873["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
874 let value: serde_json::Value = serde_json::from_str(s).unwrap();
875 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
876 }
877
878 #[test]
879 fn test_custom_reset() {
880 let s = r#"{"method": "anvil_reset", "params": [{"forking": {"jsonRpcUrl": "https://ethereumpublicnode.com",
881 "blockNumber": "18441649"
882 }
883 }]}"#;
884 let value: serde_json::Value = serde_json::from_str(s).unwrap();
885 let req = serde_json::from_value::<EthRequest>(value).unwrap();
886 match req {
887 EthRequest::Reset(forking) => {
888 let forking = forking.and_then(|f| f.params);
889 assert_eq!(
890 forking,
891 Some(Forking {
892 json_rpc_url: Some("https://ethereumpublicnode.com".into()),
893 block_number: Some(18441649)
894 })
895 )
896 }
897 _ => unreachable!(),
898 }
899
900 let s = r#"{"method": "anvil_reset", "params": [ { "forking": {
901 "jsonRpcUrl": "https://eth-mainnet.alchemyapi.io/v2/<key>",
902 "blockNumber": 11095000
903 }}]}"#;
904 let value: serde_json::Value = serde_json::from_str(s).unwrap();
905 let req = serde_json::from_value::<EthRequest>(value).unwrap();
906 match req {
907 EthRequest::Reset(forking) => {
908 let forking = forking.and_then(|f| f.params);
909 assert_eq!(
910 forking,
911 Some(Forking {
912 json_rpc_url: Some(
913 "https://eth-mainnet.alchemyapi.io/v2/<key>".to_string()
914 ),
915 block_number: Some(11095000)
916 })
917 )
918 }
919 _ => unreachable!(),
920 }
921
922 let s = r#"{"method": "anvil_reset", "params": [ { "forking": {
923 "jsonRpcUrl": "https://eth-mainnet.alchemyapi.io/v2/<key>"
924 }}]}"#;
925 let value: serde_json::Value = serde_json::from_str(s).unwrap();
926 let req = serde_json::from_value::<EthRequest>(value).unwrap();
927 match req {
928 EthRequest::Reset(forking) => {
929 let forking = forking.and_then(|f| f.params);
930 assert_eq!(
931 forking,
932 Some(Forking {
933 json_rpc_url: Some(
934 "https://eth-mainnet.alchemyapi.io/v2/<key>".to_string()
935 ),
936 block_number: None
937 })
938 )
939 }
940 _ => unreachable!(),
941 }
942
943 let s = r#"{"method":"anvil_reset","params":[{"jsonRpcUrl": "http://localhost:8545", "blockNumber": 14000000}]}"#;
944 let value: serde_json::Value = serde_json::from_str(s).unwrap();
945 let req = serde_json::from_value::<EthRequest>(value).unwrap();
946 match req {
947 EthRequest::Reset(forking) => {
948 let forking = forking.and_then(|f| f.params);
949 assert_eq!(
950 forking,
951 Some(Forking {
952 json_rpc_url: Some("http://localhost:8545".to_string()),
953 block_number: Some(14000000)
954 })
955 )
956 }
957 _ => unreachable!(),
958 }
959
960 let s = r#"{"method":"anvil_reset","params":[{ "blockNumber": 14000000}]}"#;
961 let value: serde_json::Value = serde_json::from_str(s).unwrap();
962 let req = serde_json::from_value::<EthRequest>(value).unwrap();
963 match req {
964 EthRequest::Reset(forking) => {
965 let forking = forking.and_then(|f| f.params);
966 assert_eq!(
967 forking,
968 Some(Forking { json_rpc_url: None, block_number: Some(14000000) })
969 )
970 }
971 _ => unreachable!(),
972 }
973
974 let s = r#"{"method":"anvil_reset","params":[{ "blockNumber": "14000000"}]}"#;
975 let value: serde_json::Value = serde_json::from_str(s).unwrap();
976 let req = serde_json::from_value::<EthRequest>(value).unwrap();
977 match req {
978 EthRequest::Reset(forking) => {
979 let forking = forking.and_then(|f| f.params);
980 assert_eq!(
981 forking,
982 Some(Forking { json_rpc_url: None, block_number: Some(14000000) })
983 )
984 }
985 _ => unreachable!(),
986 }
987
988 let s = r#"{"method":"anvil_reset","params":[{"jsonRpcUrl": "http://localhost:8545"}]}"#;
989 let value: serde_json::Value = serde_json::from_str(s).unwrap();
990 let req = serde_json::from_value::<EthRequest>(value).unwrap();
991 match req {
992 EthRequest::Reset(forking) => {
993 let forking = forking.and_then(|f| f.params);
994 assert_eq!(
995 forking,
996 Some(Forking {
997 json_rpc_url: Some("http://localhost:8545".to_string()),
998 block_number: None
999 })
1000 )
1001 }
1002 _ => unreachable!(),
1003 }
1004
1005 let s = r#"{"method": "anvil_reset"}"#;
1006 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1007 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1008 match req {
1009 EthRequest::Reset(forking) => {
1010 assert!(forking.is_none())
1011 }
1012 _ => unreachable!(),
1013 }
1014 }
1015
1016 #[test]
1017 fn test_custom_set_balance() {
1018 let s = r#"{"method": "anvil_setBalance", "params":
1019["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1020 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1021 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1022
1023 let s = r#"{"method": "anvil_setBalance", "params":
1024["0xd84de507f3fada7df80908082d3239466db55a71", 1337]}"#;
1025 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1026 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1027 }
1028
1029 #[test]
1030 fn test_custom_set_code() {
1031 let s = r#"{"method": "anvil_setCode", "params":
1032["0xd84de507f3fada7df80908082d3239466db55a71", "0x0123456789abcdef"]}"#;
1033 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1034 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1035
1036 let s = r#"{"method": "anvil_setCode", "params":
1037["0xd84de507f3fada7df80908082d3239466db55a71", "0x"]}"#;
1038 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1039 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1040
1041 let s = r#"{"method": "anvil_setCode", "params":
1042["0xd84de507f3fada7df80908082d3239466db55a71", ""]}"#;
1043 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1044 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1045 }
1046
1047 #[test]
1048 fn test_custom_set_nonce() {
1049 let s = r#"{"method": "anvil_setNonce", "params":
1050["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1051 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1052 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1053 let s = r#"{"method":
1054"hardhat_setNonce", "params": ["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1055 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1056 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1057 let s = r#"{"method": "evm_setAccountNonce", "params":
1058["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1059 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1060 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1061 }
1062
1063 #[test]
1064 fn test_serde_custom_set_storage_at() {
1065 let s = r#"{"method": "anvil_setStorageAt", "params":
1066["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0",
1067"0x0000000000000000000000000000000000000000000000000000000000003039"]}"#;
1068 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1069 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1070
1071 let s = r#"{"method": "hardhat_setStorageAt", "params":
1072["0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56",
1073"0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49",
1074"0x0000000000000000000000000000000000000000000000000000000000003039"]}"#;
1075 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1076 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1077 }
1078
1079 #[test]
1080 fn test_serde_custom_coinbase() {
1081 let s = r#"{"method": "anvil_setCoinbase", "params":
1082["0x295a70b2de5e3953354a6a8344e616ed314d7251"]}"#;
1083 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1084 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1085 }
1086
1087 #[test]
1088 fn test_serde_custom_logging() {
1089 let s = r#"{"method": "anvil_setLoggingEnabled", "params": [false]}"#;
1090 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1091 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1092 }
1093
1094 #[test]
1095 fn test_serde_custom_min_gas_price() {
1096 let s = r#"{"method": "anvil_setMinGasPrice", "params": ["0x0"]}"#;
1097 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1098 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1099 }
1100
1101 #[test]
1102 fn test_serde_custom_next_block_base_fee() {
1103 let s = r#"{"method": "anvil_setNextBlockBaseFeePerGas", "params": ["0x0"]}"#;
1104 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1105 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1106 }
1107
1108 #[test]
1109 fn test_serde_set_time() {
1110 let s = r#"{"method": "anvil_setTime", "params": ["0x0"]}"#;
1111 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1112 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1113
1114 let s = r#"{"method": "anvil_increaseTime", "params": 1}"#;
1115 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1116 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1117 }
1118
1119 #[test]
1120 fn test_serde_custom_dump_state() {
1121 let s = r#"{"method": "anvil_dumpState", "params": [true]}"#;
1122 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1123 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1124
1125 let s = r#"{"method": "anvil_dumpState"}"#;
1126 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1127 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1128 match req {
1129 EthRequest::DumpState(param) => {
1130 assert!(param.is_none());
1131 }
1132 _ => unreachable!(),
1133 }
1134 }
1135
1136 #[test]
1137 fn test_serde_custom_load_state() {
1138 let s = r#"{"method": "anvil_loadState", "params": ["0x0001"] }"#;
1139 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1140 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1141 }
1142
1143 #[test]
1144 fn test_serde_custom_snapshot() {
1145 let s = r#"{"method": "anvil_snapshot", "params": [] }"#;
1146 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1147 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1148
1149 let s = r#"{"method": "evm_snapshot", "params": [] }"#;
1150 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1151 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1152 }
1153
1154 #[test]
1155 fn test_serde_custom_revert() {
1156 let s = r#"{"method": "anvil_revert", "params": ["0x0"]}"#;
1157 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1158 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1159 }
1160
1161 #[test]
1162 fn test_serde_custom_increase_time() {
1163 let s = r#"{"method": "anvil_increaseTime", "params": ["0x0"]}"#;
1164 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1165 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1166
1167 let s = r#"{"method": "anvil_increaseTime", "params": [1]}"#;
1168 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1169 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1170
1171 let s = r#"{"method": "anvil_increaseTime", "params": 1}"#;
1172 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1173 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1174
1175 let s = r#"{"method": "evm_increaseTime", "params": ["0x0"]}"#;
1176 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1177 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1178
1179 let s = r#"{"method": "evm_increaseTime", "params": [1]}"#;
1180 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1181 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1182
1183 let s = r#"{"method": "evm_increaseTime", "params": 1}"#;
1184 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1185 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1186 }
1187
1188 #[test]
1189 fn test_serde_custom_next_timestamp() {
1190 let s = r#"{"method": "anvil_setNextBlockTimestamp", "params": [100]}"#;
1191 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1192 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1193 let s = r#"{"method": "evm_setNextBlockTimestamp", "params": [100]}"#;
1194 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1195 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1196 let s = r#"{"method": "evm_setNextBlockTimestamp", "params": ["0x64e0f308"]}"#;
1197 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1198 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1199 }
1200
1201 #[test]
1202 fn test_serde_custom_timestamp_interval() {
1203 let s = r#"{"method": "anvil_setBlockTimestampInterval", "params": [100]}"#;
1204 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1205 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1206 }
1207
1208 #[test]
1209 fn test_serde_custom_remove_timestamp_interval() {
1210 let s = r#"{"method": "anvil_removeBlockTimestampInterval", "params": []}"#;
1211 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1212 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1213 }
1214
1215 #[test]
1216 fn test_serde_custom_evm_mine() {
1217 let s = r#"{"method": "evm_mine", "params": [100]}"#;
1218 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1219 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1220 let s = r#"{"method": "evm_mine", "params": [{
1221 "timestamp": 100,
1222 "blocks": 100
1223 }]}"#;
1224 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1225 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1226 match req {
1227 EthRequest::EvmMine(params) => {
1228 assert_eq!(
1229 params.unwrap().params.unwrap_or_default(),
1230 MineOptions::Options { timestamp: Some(100), blocks: Some(100) }
1231 )
1232 }
1233 _ => unreachable!(),
1234 }
1235
1236 let s = r#"{"method": "evm_mine"}"#;
1237 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1238 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1239
1240 match req {
1241 EthRequest::EvmMine(params) => {
1242 assert!(params.is_none())
1243 }
1244 _ => unreachable!(),
1245 }
1246
1247 let s = r#"{"method": "evm_mine", "params": []}"#;
1248 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1249 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1250 }
1251
1252 #[test]
1253 fn test_serde_custom_evm_mine_detailed() {
1254 let s = r#"{"method": "anvil_mine_detailed", "params": [100]}"#;
1255 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1256 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1257 let s = r#"{"method": "anvil_mine_detailed", "params": [{
1258 "timestamp": 100,
1259 "blocks": 100
1260 }]}"#;
1261 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1262 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1263 match req {
1264 EthRequest::EvmMineDetailed(params) => {
1265 assert_eq!(
1266 params.unwrap().params.unwrap_or_default(),
1267 MineOptions::Options { timestamp: Some(100), blocks: Some(100) }
1268 )
1269 }
1270 _ => unreachable!(),
1271 }
1272
1273 let s = r#"{"method": "evm_mine_detailed"}"#;
1274 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1275 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1276
1277 match req {
1278 EthRequest::EvmMineDetailed(params) => {
1279 assert!(params.is_none())
1280 }
1281 _ => unreachable!(),
1282 }
1283
1284 let s = r#"{"method": "anvil_mine_detailed", "params": []}"#;
1285 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1286 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1287 }
1288
1289 #[test]
1290 fn test_serde_custom_evm_mine_hex() {
1291 let s = r#"{"method": "evm_mine", "params": ["0x63b6ff08"]}"#;
1292 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1293 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1294 match req {
1295 EthRequest::EvmMine(params) => {
1296 assert_eq!(
1297 params.unwrap().params.unwrap_or_default(),
1298 MineOptions::Timestamp(Some(1672937224))
1299 )
1300 }
1301 _ => unreachable!(),
1302 }
1303
1304 let s = r#"{"method": "evm_mine", "params": [{"timestamp": "0x63b6ff08"}]}"#;
1305 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1306 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1307 match req {
1308 EthRequest::EvmMine(params) => {
1309 assert_eq!(
1310 params.unwrap().params.unwrap_or_default(),
1311 MineOptions::Options { timestamp: Some(1672937224), blocks: None }
1312 )
1313 }
1314 _ => unreachable!(),
1315 }
1316 }
1317
1318 #[test]
1319 fn test_eth_uncle_count_by_block_hash() {
1320 let s = r#"{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
1321 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1322 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1323 }
1324
1325 #[test]
1326 fn test_eth_block_tx_count_by_block_hash() {
1327 let s = r#"{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
1328 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1329 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1330 }
1331
1332 #[test]
1333 fn test_eth_get_logs() {
1334 let s = r#"{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}"#;
1335 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1336 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1337 }
1338
1339 #[test]
1340 fn test_eth_new_filter() {
1341 let s = r#"{"method": "eth_newFilter", "params": [{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":73}"#;
1342 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1343 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1344 }
1345
1346 #[test]
1347 fn test_serde_eth_unsubscribe() {
1348 let s = r#"{"id": 1, "method": "eth_unsubscribe", "params":
1349["0x9cef478923ff08bf67fde6c64013158d"]}"#;
1350 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1351 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1352 }
1353
1354 #[test]
1355 fn test_serde_eth_subscribe() {
1356 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["newHeads"]}"#;
1357 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1358 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1359
1360 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["logs", {"address":
1361"0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics":
1362["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}"#;
1363 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1364 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1365
1366 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]}"#;
1367 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1368 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1369
1370 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["syncing"]}"#;
1371 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1372 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1373 }
1374
1375 #[test]
1376 fn test_serde_debug_raw_transaction() {
1377 let s = r#"{"jsonrpc":"2.0","method":"debug_getRawTransaction","params":["0x3ed3a89bc10115a321aee238c02de214009f8532a65368e5df5eaf732ee7167c"],"id":1}"#;
1378 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1379 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1380
1381 let s = r#"{"jsonrpc":"2.0","method":"eth_getRawTransactionByHash","params":["0x3ed3a89bc10115a321aee238c02de214009f8532a65368e5df5eaf732ee7167c"],"id":1}"#;
1382 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1383 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1384
1385 let s = r#"{"jsonrpc":"2.0","method":"eth_getRawTransactionByBlockHashAndIndex","params":["0x3ed3a89bc10115a321aee238c02de214009f8532a65368e5df5eaf732ee7167c",1],"id":1}"#;
1386 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1387 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1388
1389 let s = r#"{"jsonrpc":"2.0","method":"eth_getRawTransactionByBlockNumberAndIndex","params":["0x3ed3a89b",0],"id":1}"#;
1390 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1391 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1392 }
1393
1394 #[test]
1395 fn test_serde_debug_trace_transaction() {
1396 let s = r#"{"method": "debug_traceTransaction", "params":
1397["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
1398 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1399 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1400
1401 let s = r#"{"method": "debug_traceTransaction", "params":
1402["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff", {}]}"#;
1403 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1404 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1405
1406 let s = r#"{"method": "debug_traceTransaction", "params":
1407["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff", {"disableStorage":
1408true}]}"#;
1409 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1410 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1411 }
1412
1413 #[test]
1414 fn test_serde_debug_trace_call() {
1415 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}]}"#;
1416 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1417 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1418
1419 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "latest" }]}"#;
1420 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1421 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1422
1423 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "0x0" }]}"#;
1424 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1425 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1426
1427 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockHash": "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" }]}"#;
1428 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1429 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1430
1431 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "0x0" }, {"disableStorage": true}]}"#;
1432 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1433 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1434 }
1435
1436 #[test]
1437 fn test_serde_eth_storage() {
1438 let s = r#"{"method": "eth_getStorageAt", "params":
1439["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"]}"#;
1440 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1441 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1442 }
1443
1444 #[test]
1445 fn test_eth_call() {
1446 let req = r#"{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}"#;
1447 let _req = serde_json::from_str::<TransactionRequest>(req).unwrap();
1448
1449 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"},"latest"]}"#;
1450 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1451
1452 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}]}"#;
1453 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1454
1455 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "latest" }]}"#;
1456 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1457
1458 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "0x0" }]}"#;
1459 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1460
1461 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockHash":"0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" }]}"#;
1462 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1463 }
1464
1465 #[test]
1466 fn test_serde_eth_balance() {
1467 let s = r#"{"method": "eth_getBalance", "params":
1468["0x295a70b2de5e3953354a6a8344e616ed314d7251", "latest"]}"#;
1469 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1470
1471 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1472 }
1473
1474 #[test]
1475 fn test_serde_eth_block_by_number() {
1476 let s = r#"{"method": "eth_getBlockByNumber", "params": ["0x0", true]}"#;
1477 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1478 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1479 let s = r#"{"method": "eth_getBlockByNumber", "params": ["latest", true]}"#;
1480 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1481 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1482 let s = r#"{"method": "eth_getBlockByNumber", "params": ["earliest", true]}"#;
1483 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1484 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1485 let s = r#"{"method": "eth_getBlockByNumber", "params": ["pending", true]}"#;
1486 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1487 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1488
1489 let s = r#"{"method": "eth_getBlockByNumber", "params": [0, true]}"#;
1491 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1492 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1493 }
1494
1495 #[test]
1496 fn test_eth_sign() {
1497 let s = r#"{"method": "eth_sign", "params":
1498["0xd84de507f3fada7df80908082d3239466db55a71", "0x00"]}"#;
1499 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1500 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1501 let s = r#"{"method": "personal_sign", "params":
1502["0x00", "0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
1503 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1504 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1505 }
1506
1507 #[test]
1508 fn test_eth_sign_typed_data() {
1509 let s = r#"{"method":"eth_signTypedData_v4","params":["0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", {"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail","domain":{"name":"Ether Mail","version":"1","chainId":1,"verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"from":{"name":"Cow","wallet":"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"},"to":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"},"contents":"Hello, Bob!"}}]}"#;
1510 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1511 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1512 }
1513
1514 #[test]
1515 fn test_remove_pool_transactions() {
1516 let s = r#"{"method": "anvil_removePoolTransactions", "params":["0x364d6D0333432C3Ac016Ca832fb8594A8cE43Ca6"]}"#;
1517 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1518 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1519 }
1520
1521 #[test]
1522 fn test_serde_anvil_reorg() {
1523 let s = r#"
1525 {
1526 "method": "anvil_reorg",
1527 "params": [
1528 5,
1529 [
1530 [
1531 {
1532 "from": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
1533 "to": "0x1199bc69f16FDD6690DC40339EC445FaE1b6DD11",
1534 "value": 100
1535 },
1536 1
1537 ],
1538 [
1539 {
1540 "from": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
1541 "to": "0x1199bc69f16FDD6690DC40339EC445FaE1b6DD11",
1542 "value": 200
1543 },
1544 2
1545 ]
1546 ]
1547 ]
1548 }
1549 "#;
1550 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1551 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1552 let s = r#"
1554 {
1555 "method": "anvil_reorg",
1556 "params": [
1557 5,
1558 [
1559 [
1560 "0x19d55c67e1ba8f1bbdfed75f8ad524ebf087e4ecb848a2d19881d7a5e3d2c54e1732cb1b462da3b3fdb05bdf4c4d3c8e3c9fcebdc2ab5fa5d59a3f752888f27e1b",
1561 1
1562 ]
1563 ]
1564 ]
1565 }
1566 "#;
1567 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1568 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1569 let s = r#"
1571 {
1572 "method": "anvil_reorg",
1573 "params": [
1574 5,
1575 [
1576 [
1577 "0x19d55c67e1ba8f1bbdfed75f8ad524ebf087e4ecb848a2d19881d7a5e3d2c54e1732cb1b462da3b3fdb05bdf4c4d3c8e3c9fcebdc2ab5fa5d59a3f752888f27e1b",
1578 1
1579 ],
1580 [
1581 {
1582 "from": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
1583 "to": "0x1199bc69f16FDD6690DC40339EC445FaE1b6DD11",
1584 "value": 200
1585 },
1586 2
1587 ]
1588 ]
1589 ]
1590 }
1591 "#;
1592 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1593 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1594 }
1595}