1use crate::{eth::subscription::SubscriptionId, types::ReorgOptions};
2use alloy_primitives::{Address, Bytes, TxHash, B256, B64, U256};
3use alloy_rpc_types::{
4 anvil::{Forking, MineOptions},
5 pubsub::{Params as SubscriptionParams, SubscriptionKind},
6 request::TransactionRequest,
7 simulate::SimulatePayload,
8 state::StateOverride,
9 trace::{
10 filter::TraceFilter,
11 geth::{GethDebugTracingCallOptions, GethDebugTracingOptions},
12 },
13 BlockId, BlockNumberOrTag as BlockNumber, BlockOverrides, Filter, Index,
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_sendRawTransaction", with = "sequence")]
148 EthSendRawTransaction(Bytes),
149
150 #[serde(rename = "eth_call")]
151 EthCall(
152 WithOtherFields<TransactionRequest>,
153 #[serde(default)] Option<BlockId>,
154 #[serde(default)] Option<StateOverride>,
155 #[serde(default)] Option<Box<BlockOverrides>>,
156 ),
157
158 #[serde(rename = "eth_simulateV1")]
159 EthSimulateV1(SimulatePayload, #[serde(default)] Option<BlockId>),
160
161 #[serde(rename = "eth_createAccessList")]
162 EthCreateAccessList(WithOtherFields<TransactionRequest>, #[serde(default)] Option<BlockId>),
163
164 #[serde(rename = "eth_estimateGas")]
165 EthEstimateGas(
166 WithOtherFields<TransactionRequest>,
167 #[serde(default)] Option<BlockId>,
168 #[serde(default)] Option<StateOverride>,
169 #[serde(default)] Option<Box<BlockOverrides>>,
170 ),
171
172 #[serde(rename = "eth_getTransactionByHash", with = "sequence")]
173 EthGetTransactionByHash(TxHash),
174
175 #[serde(rename = "eth_getTransactionByBlockHashAndIndex")]
176 EthGetTransactionByBlockHashAndIndex(TxHash, Index),
177
178 #[serde(rename = "eth_getTransactionByBlockNumberAndIndex")]
179 EthGetTransactionByBlockNumberAndIndex(BlockNumber, Index),
180
181 #[serde(rename = "eth_getRawTransactionByHash", with = "sequence")]
182 EthGetRawTransactionByHash(TxHash),
183
184 #[serde(rename = "eth_getRawTransactionByBlockHashAndIndex")]
185 EthGetRawTransactionByBlockHashAndIndex(TxHash, Index),
186
187 #[serde(rename = "eth_getRawTransactionByBlockNumberAndIndex")]
188 EthGetRawTransactionByBlockNumberAndIndex(BlockNumber, Index),
189
190 #[serde(rename = "eth_getTransactionReceipt", with = "sequence")]
191 EthGetTransactionReceipt(B256),
192
193 #[serde(rename = "eth_getBlockReceipts", with = "sequence")]
194 EthGetBlockReceipts(BlockId),
195
196 #[serde(rename = "eth_getUncleByBlockHashAndIndex")]
197 EthGetUncleByBlockHashAndIndex(B256, Index),
198
199 #[serde(rename = "eth_getUncleByBlockNumberAndIndex")]
200 EthGetUncleByBlockNumberAndIndex(
201 #[serde(deserialize_with = "lenient_block_number::lenient_block_number")] BlockNumber,
202 Index,
203 ),
204
205 #[serde(rename = "eth_getLogs", with = "sequence")]
206 EthGetLogs(Filter),
207
208 #[serde(rename = "eth_newFilter", with = "sequence")]
210 EthNewFilter(Filter),
211
212 #[serde(rename = "eth_getFilterChanges", with = "sequence")]
214 EthGetFilterChanges(String),
215
216 #[serde(rename = "eth_newBlockFilter", with = "empty_params")]
219 EthNewBlockFilter(()),
220
221 #[serde(rename = "eth_newPendingTransactionFilter", with = "empty_params")]
224 EthNewPendingTransactionFilter(()),
225
226 #[serde(rename = "eth_getFilterLogs", with = "sequence")]
228 EthGetFilterLogs(String),
229
230 #[serde(rename = "eth_uninstallFilter", with = "sequence")]
232 EthUninstallFilter(String),
233
234 #[serde(rename = "eth_getWork", with = "empty_params")]
235 EthGetWork(()),
236
237 #[serde(rename = "eth_submitWork")]
238 EthSubmitWork(B64, B256, B256),
239
240 #[serde(rename = "eth_submitHashrate")]
241 EthSubmitHashRate(U256, B256),
242
243 #[serde(rename = "eth_feeHistory")]
244 EthFeeHistory(
245 #[serde(deserialize_with = "deserialize_number")] U256,
246 BlockNumber,
247 #[serde(default)] Vec<f64>,
248 ),
249
250 #[serde(rename = "eth_syncing", with = "empty_params")]
251 EthSyncing(()),
252
253 #[serde(rename = "debug_getRawTransaction", with = "sequence")]
255 DebugGetRawTransaction(TxHash),
256
257 #[serde(rename = "debug_traceTransaction")]
259 DebugTraceTransaction(B256, #[serde(default)] GethDebugTracingOptions),
260
261 #[serde(rename = "debug_traceCall")]
263 DebugTraceCall(
264 WithOtherFields<TransactionRequest>,
265 #[serde(default)] Option<BlockId>,
266 #[serde(default)] GethDebugTracingCallOptions,
267 ),
268
269 #[serde(rename = "trace_transaction", with = "sequence")]
271 TraceTransaction(B256),
272
273 #[serde(
275 rename = "trace_block",
276 deserialize_with = "lenient_block_number::lenient_block_number_seq"
277 )]
278 TraceBlock(BlockNumber),
279
280 #[serde(rename = "trace_filter", with = "sequence")]
282 TraceFilter(TraceFilter),
283
284 #[serde(
287 rename = "anvil_impersonateAccount",
288 alias = "hardhat_impersonateAccount",
289 with = "sequence"
290 )]
291 ImpersonateAccount(Address),
292 #[serde(
294 rename = "anvil_stopImpersonatingAccount",
295 alias = "hardhat_stopImpersonatingAccount",
296 with = "sequence"
297 )]
298 StopImpersonatingAccount(Address),
299 #[serde(
301 rename = "anvil_autoImpersonateAccount",
302 alias = "hardhat_autoImpersonateAccount",
303 with = "sequence"
304 )]
305 AutoImpersonateAccount(bool),
306 #[serde(rename = "anvil_getAutomine", alias = "hardhat_getAutomine", with = "empty_params")]
308 GetAutoMine(()),
309 #[serde(rename = "anvil_mine", alias = "hardhat_mine")]
311 Mine(
312 #[serde(default, deserialize_with = "deserialize_number_opt")]
314 Option<U256>,
315 #[serde(default, deserialize_with = "deserialize_number_opt")]
319 Option<U256>,
320 ),
321
322 #[serde(rename = "anvil_setAutomine", alias = "evm_setAutomine", with = "sequence")]
325 SetAutomine(bool),
326
327 #[serde(
329 rename = "anvil_setIntervalMining",
330 alias = "evm_setIntervalMining",
331 with = "sequence"
332 )]
333 SetIntervalMining(u64),
334
335 #[serde(rename = "anvil_getIntervalMining", with = "empty_params")]
337 GetIntervalMining(()),
338
339 #[serde(
341 rename = "anvil_dropTransaction",
342 alias = "hardhat_dropTransaction",
343 with = "sequence"
344 )]
345 DropTransaction(B256),
346
347 #[serde(
349 rename = "anvil_dropAllTransactions",
350 alias = "hardhat_dropAllTransactions",
351 with = "empty_params"
352 )]
353 DropAllTransactions(),
354
355 #[serde(rename = "anvil_reset", alias = "hardhat_reset")]
357 Reset(#[serde(default)] Option<Params<Option<Forking>>>),
358
359 #[serde(rename = "anvil_setRpcUrl", with = "sequence")]
361 SetRpcUrl(String),
362
363 #[serde(
365 rename = "anvil_setBalance",
366 alias = "hardhat_setBalance",
367 alias = "tenderly_setBalance"
368 )]
369 SetBalance(Address, #[serde(deserialize_with = "deserialize_number")] U256),
370
371 #[serde(
373 rename = "anvil_addBalance",
374 alias = "hardhat_addBalance",
375 alias = "tenderly_addBalance"
376 )]
377 AddBalance(Address, #[serde(deserialize_with = "deserialize_number")] U256),
378
379 #[serde(
381 rename = "anvil_dealERC20",
382 alias = "hardhat_dealERC20",
383 alias = "anvil_setERC20Balance",
384 alias = "tenderly_setErc20Balance"
385 )]
386 DealERC20(Address, Address, #[serde(deserialize_with = "deserialize_number")] U256),
387
388 #[serde(rename = "anvil_setCode", alias = "hardhat_setCode")]
390 SetCode(Address, Bytes),
391
392 #[serde(rename = "anvil_setNonce", alias = "hardhat_setNonce", alias = "evm_setAccountNonce")]
394 SetNonce(Address, #[serde(deserialize_with = "deserialize_number")] U256),
395
396 #[serde(rename = "anvil_setStorageAt", alias = "hardhat_setStorageAt")]
398 SetStorageAt(
399 Address,
400 U256,
402 B256,
404 ),
405
406 #[serde(rename = "anvil_setCoinbase", alias = "hardhat_setCoinbase", with = "sequence")]
408 SetCoinbase(Address),
409
410 #[serde(rename = "anvil_setChainId", with = "sequence")]
412 SetChainId(u64),
413
414 #[serde(
416 rename = "anvil_setLoggingEnabled",
417 alias = "hardhat_setLoggingEnabled",
418 with = "sequence"
419 )]
420 SetLogging(bool),
421
422 #[serde(
424 rename = "anvil_setMinGasPrice",
425 alias = "hardhat_setMinGasPrice",
426 deserialize_with = "deserialize_number_seq"
427 )]
428 SetMinGasPrice(U256),
429
430 #[serde(
432 rename = "anvil_setNextBlockBaseFeePerGas",
433 alias = "hardhat_setNextBlockBaseFeePerGas",
434 deserialize_with = "deserialize_number_seq"
435 )]
436 SetNextBlockBaseFeePerGas(U256),
437
438 #[serde(
442 rename = "anvil_setTime",
443 alias = "evm_setTime",
444 deserialize_with = "deserialize_number_seq"
445 )]
446 EvmSetTime(U256),
447
448 #[serde(rename = "anvil_dumpState", alias = "hardhat_dumpState")]
451 DumpState(#[serde(default)] Option<Params<Option<bool>>>),
452
453 #[serde(rename = "anvil_loadState", alias = "hardhat_loadState", with = "sequence")]
455 LoadState(Bytes),
456
457 #[serde(rename = "anvil_nodeInfo", with = "empty_params")]
459 NodeInfo(()),
460
461 #[serde(rename = "anvil_metadata", alias = "hardhat_metadata", with = "empty_params")]
463 AnvilMetadata(()),
464
465 #[serde(rename = "anvil_snapshot", alias = "evm_snapshot", with = "empty_params")]
470 EvmSnapshot(()),
471
472 #[serde(
477 rename = "anvil_revert",
478 alias = "evm_revert",
479 deserialize_with = "deserialize_number_seq"
480 )]
481 EvmRevert(U256),
482
483 #[serde(
485 rename = "anvil_increaseTime",
486 alias = "evm_increaseTime",
487 deserialize_with = "deserialize_number_seq"
488 )]
489 EvmIncreaseTime(U256),
490
491 #[serde(
493 rename = "anvil_setNextBlockTimestamp",
494 alias = "evm_setNextBlockTimestamp",
495 deserialize_with = "deserialize_number_seq"
496 )]
497 EvmSetNextBlockTimeStamp(U256),
498
499 #[serde(
501 rename = "anvil_setBlockGasLimit",
502 alias = "evm_setBlockGasLimit",
503 deserialize_with = "deserialize_number_seq"
504 )]
505 EvmSetBlockGasLimit(U256),
506
507 #[serde(rename = "anvil_setBlockTimestampInterval", with = "sequence")]
511 EvmSetBlockTimeStampInterval(u64),
512
513 #[serde(rename = "anvil_removeBlockTimestampInterval", with = "empty_params")]
515 EvmRemoveBlockTimeStampInterval(()),
516
517 #[serde(rename = "evm_mine")]
519 EvmMine(#[serde(default)] Option<Params<Option<MineOptions>>>),
520
521 #[serde(rename = "anvil_mine_detailed", alias = "evm_mine_detailed")]
526 EvmMineDetailed(#[serde(default)] Option<Params<Option<MineOptions>>>),
527
528 #[serde(rename = "eth_sendUnsignedTransaction", with = "sequence")]
530 EthSendUnsignedTransaction(Box<WithOtherFields<TransactionRequest>>),
531
532 #[serde(rename = "anvil_enableTraces", with = "empty_params")]
535 EnableTraces(()),
536
537 #[serde(rename = "txpool_status", with = "empty_params")]
541 TxPoolStatus(()),
542
543 #[serde(rename = "txpool_inspect", with = "empty_params")]
547 TxPoolInspect(()),
548
549 #[serde(rename = "txpool_content", with = "empty_params")]
553 TxPoolContent(()),
554
555 #[serde(rename = "erigon_getHeaderByNumber")]
560 ErigonGetHeaderByNumber(
561 #[serde(deserialize_with = "lenient_block_number::lenient_block_number_seq")] BlockNumber,
562 ),
563
564 #[serde(rename = "ots_getApiLevel", with = "empty_params")]
567 OtsGetApiLevel(()),
568
569 #[serde(rename = "ots_getInternalOperations", with = "sequence")]
573 OtsGetInternalOperations(B256),
574
575 #[serde(rename = "ots_hasCode")]
578 OtsHasCode(
579 Address,
580 #[serde(deserialize_with = "lenient_block_number::lenient_block_number", default)]
581 BlockNumber,
582 ),
583
584 #[serde(rename = "ots_traceTransaction", with = "sequence")]
587 OtsTraceTransaction(B256),
588
589 #[serde(rename = "ots_getTransactionError", with = "sequence")]
592 OtsGetTransactionError(B256),
593
594 #[serde(rename = "ots_getBlockDetails")]
599 OtsGetBlockDetails(
600 #[serde(deserialize_with = "lenient_block_number::lenient_block_number_seq", default)]
601 BlockNumber,
602 ),
603
604 #[serde(rename = "ots_getBlockDetailsByHash", with = "sequence")]
607 OtsGetBlockDetailsByHash(B256),
608
609 #[serde(rename = "ots_getBlockTransactions")]
613 OtsGetBlockTransactions(u64, usize, usize),
614
615 #[serde(rename = "ots_searchTransactionsBefore")]
618 OtsSearchTransactionsBefore(Address, u64, usize),
619
620 #[serde(rename = "ots_searchTransactionsAfter")]
623 OtsSearchTransactionsAfter(Address, u64, usize),
624
625 #[serde(rename = "ots_getTransactionBySenderAndNonce")]
630 OtsGetTransactionBySenderAndNonce(
631 Address,
632 #[serde(deserialize_with = "deserialize_number")] U256,
633 ),
634
635 #[serde(rename = "ots_getContractCreator", with = "sequence")]
639 OtsGetContractCreator(Address),
640
641 #[serde(rename = "anvil_removePoolTransactions", with = "sequence")]
643 RemovePoolTransactions(Address),
644
645 #[serde(rename = "anvil_reorg")]
647 Reorg(ReorgOptions),
648
649 #[serde(rename = "anvil_rollback", with = "sequence")]
651 Rollback(Option<u64>),
652
653 #[serde(rename = "wallet_getCapabilities", with = "empty_params")]
655 WalletGetCapabilities(()),
656
657 #[serde(
659 rename = "wallet_sendTransaction",
660 alias = "odyssey_sendTransaction",
661 with = "sequence"
662 )]
663 WalletSendTransaction(Box<WithOtherFields<TransactionRequest>>),
664
665 #[serde(rename = "anvil_addCapability", with = "sequence")]
669 AnvilAddCapability(Address),
670
671 #[serde(rename = "anvil_setExecutor", with = "sequence")]
673 AnvilSetExecutor(String),
674}
675
676#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize)]
678#[serde(tag = "method", content = "params")]
679pub enum EthPubSub {
680 #[serde(rename = "eth_subscribe")]
682 EthSubscribe(SubscriptionKind, #[serde(default)] Box<SubscriptionParams>),
683
684 #[serde(rename = "eth_unsubscribe", with = "sequence")]
686 EthUnSubscribe(SubscriptionId),
687}
688
689#[derive(Clone, Debug, serde::Deserialize)]
691#[serde(untagged)]
692pub enum EthRpcCall {
693 Request(Box<EthRequest>),
694 PubSub(EthPubSub),
695}
696
697#[cfg(test)]
698mod tests {
699 use super::*;
700
701 #[test]
702 fn test_web3_client_version() {
703 let s = r#"{"method": "web3_clientVersion", "params":[]}"#;
704 let value: serde_json::Value = serde_json::from_str(s).unwrap();
705 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
706 }
707
708 #[test]
709 fn test_web3_sha3() {
710 let s = r#"{"method": "web3_sha3", "params":["0x68656c6c6f20776f726c64"]}"#;
711 let value: serde_json::Value = serde_json::from_str(s).unwrap();
712 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
713 }
714
715 #[test]
716 fn test_eth_accounts() {
717 let s = r#"{"method": "eth_accounts", "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_eth_network_id() {
724 let s = r#"{"method": "eth_networkId", "params":[]}"#;
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_get_proof() {
731 let s = r#"{"method":"eth_getProof","params":["0x7F0d15C7FAae65896648C8273B6d7E43f58Fa842",["0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"],"latest"]}"#;
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_chain_id() {
738 let s = r#"{"method": "eth_chainId", "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_net_listening() {
745 let s = r#"{"method": "net_listening", "params":[]}"#;
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_block_number() {
752 let s = r#"{"method": "eth_blockNumber", "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_eth_max_priority_fee() {
759 let s = r#"{"method": "eth_maxPriorityFeePerGas", "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_syncing() {
766 let s = r#"{"method": "eth_syncing", "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_custom_impersonate_account() {
773 let s = r#"{"method": "anvil_impersonateAccount", "params":
774["0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
775 let value: serde_json::Value = serde_json::from_str(s).unwrap();
776 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
777 }
778
779 #[test]
780 fn test_custom_stop_impersonate_account() {
781 let s = r#"{"method": "anvil_stopImpersonatingAccount", "params":
782["0x364d6D0333432C3Ac016Ca832fb8594A8cE43Ca6"]}"#;
783 let value: serde_json::Value = serde_json::from_str(s).unwrap();
784 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
785 }
786
787 #[test]
788 fn test_custom_auto_impersonate_account() {
789 let s = r#"{"method": "anvil_autoImpersonateAccount", "params": [true]}"#;
790 let value: serde_json::Value = serde_json::from_str(s).unwrap();
791 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
792 }
793
794 #[test]
795 fn test_custom_get_automine() {
796 let s = r#"{"method": "anvil_getAutomine", "params": []}"#;
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_mine() {
803 let s = r#"{"method": "anvil_mine", "params": []}"#;
804 let value: serde_json::Value = serde_json::from_str(s).unwrap();
805 let req = serde_json::from_value::<EthRequest>(value).unwrap();
806 match req {
807 EthRequest::Mine(num, time) => {
808 assert!(num.is_none());
809 assert!(time.is_none());
810 }
811 _ => unreachable!(),
812 }
813 let s = r#"{"method": "anvil_mine", "params":
814["0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
815 let value: serde_json::Value = serde_json::from_str(s).unwrap();
816 let req = serde_json::from_value::<EthRequest>(value).unwrap();
817 match req {
818 EthRequest::Mine(num, time) => {
819 assert!(num.is_some());
820 assert!(time.is_none());
821 }
822 _ => unreachable!(),
823 }
824 let s = r#"{"method": "anvil_mine", "params": ["0xd84de507f3fada7df80908082d3239466db55a71", "0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
825 let value: serde_json::Value = serde_json::from_str(s).unwrap();
826 let req = serde_json::from_value::<EthRequest>(value).unwrap();
827 match req {
828 EthRequest::Mine(num, time) => {
829 assert!(num.is_some());
830 assert!(time.is_some());
831 }
832 _ => unreachable!(),
833 }
834 }
835
836 #[test]
837 fn test_custom_auto_mine() {
838 let s = r#"{"method": "anvil_setAutomine", "params": [false]}"#;
839 let value: serde_json::Value = serde_json::from_str(s).unwrap();
840 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
841 let s = r#"{"method": "evm_setAutomine", "params": [false]}"#;
842 let value: serde_json::Value = serde_json::from_str(s).unwrap();
843 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
844 }
845
846 #[test]
847 fn test_custom_interval_mining() {
848 let s = r#"{"method": "anvil_setIntervalMining", "params": [100]}"#;
849 let value: serde_json::Value = serde_json::from_str(s).unwrap();
850 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
851 let s = r#"{"method": "evm_setIntervalMining", "params": [100]}"#;
852 let value: serde_json::Value = serde_json::from_str(s).unwrap();
853 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
854 }
855
856 #[test]
857 fn test_custom_drop_tx() {
858 let s = r#"{"method": "anvil_dropTransaction", "params":
859["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
860 let value: serde_json::Value = serde_json::from_str(s).unwrap();
861 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
862 }
863
864 #[test]
865 fn test_custom_reset() {
866 let s = r#"{"method": "anvil_reset", "params": [{"forking": {"jsonRpcUrl": "https://ethereumpublicnode.com",
867 "blockNumber": "18441649"
868 }
869 }]}"#;
870 let value: serde_json::Value = serde_json::from_str(s).unwrap();
871 let req = serde_json::from_value::<EthRequest>(value).unwrap();
872 match req {
873 EthRequest::Reset(forking) => {
874 let forking = forking.and_then(|f| f.params);
875 assert_eq!(
876 forking,
877 Some(Forking {
878 json_rpc_url: Some("https://ethereumpublicnode.com".into()),
879 block_number: Some(18441649)
880 })
881 )
882 }
883 _ => unreachable!(),
884 }
885
886 let s = r#"{"method": "anvil_reset", "params": [ { "forking": {
887 "jsonRpcUrl": "https://eth-mainnet.alchemyapi.io/v2/<key>",
888 "blockNumber": 11095000
889 }}]}"#;
890 let value: serde_json::Value = serde_json::from_str(s).unwrap();
891 let req = serde_json::from_value::<EthRequest>(value).unwrap();
892 match req {
893 EthRequest::Reset(forking) => {
894 let forking = forking.and_then(|f| f.params);
895 assert_eq!(
896 forking,
897 Some(Forking {
898 json_rpc_url: Some(
899 "https://eth-mainnet.alchemyapi.io/v2/<key>".to_string()
900 ),
901 block_number: Some(11095000)
902 })
903 )
904 }
905 _ => unreachable!(),
906 }
907
908 let s = r#"{"method": "anvil_reset", "params": [ { "forking": {
909 "jsonRpcUrl": "https://eth-mainnet.alchemyapi.io/v2/<key>"
910 }}]}"#;
911 let value: serde_json::Value = serde_json::from_str(s).unwrap();
912 let req = serde_json::from_value::<EthRequest>(value).unwrap();
913 match req {
914 EthRequest::Reset(forking) => {
915 let forking = forking.and_then(|f| f.params);
916 assert_eq!(
917 forking,
918 Some(Forking {
919 json_rpc_url: Some(
920 "https://eth-mainnet.alchemyapi.io/v2/<key>".to_string()
921 ),
922 block_number: None
923 })
924 )
925 }
926 _ => unreachable!(),
927 }
928
929 let s = r#"{"method":"anvil_reset","params":[{"jsonRpcUrl": "http://localhost:8545", "blockNumber": 14000000}]}"#;
930 let value: serde_json::Value = serde_json::from_str(s).unwrap();
931 let req = serde_json::from_value::<EthRequest>(value).unwrap();
932 match req {
933 EthRequest::Reset(forking) => {
934 let forking = forking.and_then(|f| f.params);
935 assert_eq!(
936 forking,
937 Some(Forking {
938 json_rpc_url: Some("http://localhost:8545".to_string()),
939 block_number: Some(14000000)
940 })
941 )
942 }
943 _ => unreachable!(),
944 }
945
946 let s = r#"{"method":"anvil_reset","params":[{ "blockNumber": 14000000}]}"#;
947 let value: serde_json::Value = serde_json::from_str(s).unwrap();
948 let req = serde_json::from_value::<EthRequest>(value).unwrap();
949 match req {
950 EthRequest::Reset(forking) => {
951 let forking = forking.and_then(|f| f.params);
952 assert_eq!(
953 forking,
954 Some(Forking { json_rpc_url: None, block_number: Some(14000000) })
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":[{"jsonRpcUrl": "http://localhost:8545"}]}"#;
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 {
983 json_rpc_url: Some("http://localhost:8545".to_string()),
984 block_number: None
985 })
986 )
987 }
988 _ => unreachable!(),
989 }
990
991 let s = r#"{"method": "anvil_reset"}"#;
992 let value: serde_json::Value = serde_json::from_str(s).unwrap();
993 let req = serde_json::from_value::<EthRequest>(value).unwrap();
994 match req {
995 EthRequest::Reset(forking) => {
996 assert!(forking.is_none())
997 }
998 _ => unreachable!(),
999 }
1000 }
1001
1002 #[test]
1003 fn test_custom_set_balance() {
1004 let s = r#"{"method": "anvil_setBalance", "params":
1005["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1006 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1007 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1008
1009 let s = r#"{"method": "anvil_setBalance", "params":
1010["0xd84de507f3fada7df80908082d3239466db55a71", 1337]}"#;
1011 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1012 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1013 }
1014
1015 #[test]
1016 fn test_custom_set_code() {
1017 let s = r#"{"method": "anvil_setCode", "params":
1018["0xd84de507f3fada7df80908082d3239466db55a71", "0x0123456789abcdef"]}"#;
1019 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1020 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1021
1022 let s = r#"{"method": "anvil_setCode", "params":
1023["0xd84de507f3fada7df80908082d3239466db55a71", "0x"]}"#;
1024 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1025 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1026
1027 let s = r#"{"method": "anvil_setCode", "params":
1028["0xd84de507f3fada7df80908082d3239466db55a71", ""]}"#;
1029 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1030 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1031 }
1032
1033 #[test]
1034 fn test_custom_set_nonce() {
1035 let s = r#"{"method": "anvil_setNonce", "params":
1036["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1037 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1038 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1039 let s = r#"{"method":
1040"hardhat_setNonce", "params": ["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1041 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1042 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1043 let s = r#"{"method": "evm_setAccountNonce", "params":
1044["0xd84de507f3fada7df80908082d3239466db55a71", "0x0"]}"#;
1045 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1046 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1047 }
1048
1049 #[test]
1050 fn test_serde_custom_set_storage_at() {
1051 let s = r#"{"method": "anvil_setStorageAt", "params":
1052["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0",
1053"0x0000000000000000000000000000000000000000000000000000000000003039"]}"#;
1054 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1055 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1056
1057 let s = r#"{"method": "hardhat_setStorageAt", "params":
1058["0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56",
1059"0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49",
1060"0x0000000000000000000000000000000000000000000000000000000000003039"]}"#;
1061 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1062 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1063 }
1064
1065 #[test]
1066 fn test_serde_custom_coinbase() {
1067 let s = r#"{"method": "anvil_setCoinbase", "params":
1068["0x295a70b2de5e3953354a6a8344e616ed314d7251"]}"#;
1069 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1070 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1071 }
1072
1073 #[test]
1074 fn test_serde_custom_logging() {
1075 let s = r#"{"method": "anvil_setLoggingEnabled", "params": [false]}"#;
1076 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1077 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1078 }
1079
1080 #[test]
1081 fn test_serde_custom_min_gas_price() {
1082 let s = r#"{"method": "anvil_setMinGasPrice", "params": ["0x0"]}"#;
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_next_block_base_fee() {
1089 let s = r#"{"method": "anvil_setNextBlockBaseFeePerGas", "params": ["0x0"]}"#;
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_set_time() {
1096 let s = r#"{"method": "anvil_setTime", "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 let s = r#"{"method": "anvil_increaseTime", "params": 1}"#;
1101 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1102 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1103 }
1104
1105 #[test]
1106 fn test_serde_custom_dump_state() {
1107 let s = r#"{"method": "anvil_dumpState", "params": [true]}"#;
1108 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1109 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1110
1111 let s = r#"{"method": "anvil_dumpState"}"#;
1112 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1113 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1114 match req {
1115 EthRequest::DumpState(param) => {
1116 assert!(param.is_none());
1117 }
1118 _ => unreachable!(),
1119 }
1120 }
1121
1122 #[test]
1123 fn test_serde_custom_load_state() {
1124 let s = r#"{"method": "anvil_loadState", "params": ["0x0001"] }"#;
1125 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1126 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1127 }
1128
1129 #[test]
1130 fn test_serde_custom_snapshot() {
1131 let s = r#"{"method": "anvil_snapshot", "params": [] }"#;
1132 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1133 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1134
1135 let s = r#"{"method": "evm_snapshot", "params": [] }"#;
1136 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1137 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1138 }
1139
1140 #[test]
1141 fn test_serde_custom_revert() {
1142 let s = r#"{"method": "anvil_revert", "params": ["0x0"]}"#;
1143 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1144 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1145 }
1146
1147 #[test]
1148 fn test_serde_custom_increase_time() {
1149 let s = r#"{"method": "anvil_increaseTime", "params": ["0x0"]}"#;
1150 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1151 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1152
1153 let s = r#"{"method": "anvil_increaseTime", "params": [1]}"#;
1154 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1155 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1156
1157 let s = r#"{"method": "anvil_increaseTime", "params": 1}"#;
1158 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1159 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1160
1161 let s = r#"{"method": "evm_increaseTime", "params": ["0x0"]}"#;
1162 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1163 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1164
1165 let s = r#"{"method": "evm_increaseTime", "params": [1]}"#;
1166 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1167 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1168
1169 let s = r#"{"method": "evm_increaseTime", "params": 1}"#;
1170 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1171 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1172 }
1173
1174 #[test]
1175 fn test_serde_custom_next_timestamp() {
1176 let s = r#"{"method": "anvil_setNextBlockTimestamp", "params": [100]}"#;
1177 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1178 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1179 let s = r#"{"method": "evm_setNextBlockTimestamp", "params": [100]}"#;
1180 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1181 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1182 let s = r#"{"method": "evm_setNextBlockTimestamp", "params": ["0x64e0f308"]}"#;
1183 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1184 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1185 }
1186
1187 #[test]
1188 fn test_serde_custom_timestamp_interval() {
1189 let s = r#"{"method": "anvil_setBlockTimestampInterval", "params": [100]}"#;
1190 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1191 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1192 }
1193
1194 #[test]
1195 fn test_serde_custom_remove_timestamp_interval() {
1196 let s = r#"{"method": "anvil_removeBlockTimestampInterval", "params": []}"#;
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_evm_mine() {
1203 let s = r#"{"method": "evm_mine", "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 let s = r#"{"method": "evm_mine", "params": [{
1207 "timestamp": 100,
1208 "blocks": 100
1209 }]}"#;
1210 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1211 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1212 match req {
1213 EthRequest::EvmMine(params) => {
1214 assert_eq!(
1215 params.unwrap().params.unwrap_or_default(),
1216 MineOptions::Options { timestamp: Some(100), blocks: Some(100) }
1217 )
1218 }
1219 _ => unreachable!(),
1220 }
1221
1222 let s = r#"{"method": "evm_mine"}"#;
1223 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1224 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1225
1226 match req {
1227 EthRequest::EvmMine(params) => {
1228 assert!(params.is_none())
1229 }
1230 _ => unreachable!(),
1231 }
1232
1233 let s = r#"{"method": "evm_mine", "params": []}"#;
1234 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1235 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1236 }
1237
1238 #[test]
1239 fn test_serde_custom_evm_mine_detailed() {
1240 let s = r#"{"method": "anvil_mine_detailed", "params": [100]}"#;
1241 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1242 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1243 let s = r#"{"method": "anvil_mine_detailed", "params": [{
1244 "timestamp": 100,
1245 "blocks": 100
1246 }]}"#;
1247 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1248 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1249 match req {
1250 EthRequest::EvmMineDetailed(params) => {
1251 assert_eq!(
1252 params.unwrap().params.unwrap_or_default(),
1253 MineOptions::Options { timestamp: Some(100), blocks: Some(100) }
1254 )
1255 }
1256 _ => unreachable!(),
1257 }
1258
1259 let s = r#"{"method": "evm_mine_detailed"}"#;
1260 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1261 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1262
1263 match req {
1264 EthRequest::EvmMineDetailed(params) => {
1265 assert!(params.is_none())
1266 }
1267 _ => unreachable!(),
1268 }
1269
1270 let s = r#"{"method": "anvil_mine_detailed", "params": []}"#;
1271 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1272 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1273 }
1274
1275 #[test]
1276 fn test_serde_custom_evm_mine_hex() {
1277 let s = r#"{"method": "evm_mine", "params": ["0x63b6ff08"]}"#;
1278 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1279 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1280 match req {
1281 EthRequest::EvmMine(params) => {
1282 assert_eq!(
1283 params.unwrap().params.unwrap_or_default(),
1284 MineOptions::Timestamp(Some(1672937224))
1285 )
1286 }
1287 _ => unreachable!(),
1288 }
1289
1290 let s = r#"{"method": "evm_mine", "params": [{"timestamp": "0x63b6ff08"}]}"#;
1291 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1292 let req = serde_json::from_value::<EthRequest>(value).unwrap();
1293 match req {
1294 EthRequest::EvmMine(params) => {
1295 assert_eq!(
1296 params.unwrap().params.unwrap_or_default(),
1297 MineOptions::Options { timestamp: Some(1672937224), blocks: None }
1298 )
1299 }
1300 _ => unreachable!(),
1301 }
1302 }
1303
1304 #[test]
1305 fn test_eth_uncle_count_by_block_hash() {
1306 let s = r#"{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
1307 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1308 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1309 }
1310
1311 #[test]
1312 fn test_eth_block_tx_count_by_block_hash() {
1313 let s = r#"{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
1314 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1315 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1316 }
1317
1318 #[test]
1319 fn test_eth_get_logs() {
1320 let s = r#"{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}"#;
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_new_filter() {
1327 let s = r#"{"method": "eth_newFilter", "params": [{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":73}"#;
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_serde_eth_unsubscribe() {
1334 let s = r#"{"id": 1, "method": "eth_unsubscribe", "params":
1335["0x9cef478923ff08bf67fde6c64013158d"]}"#;
1336 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1337 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1338 }
1339
1340 #[test]
1341 fn test_serde_eth_subscribe() {
1342 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["newHeads"]}"#;
1343 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1344 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1345
1346 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["logs", {"address":
1347"0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics":
1348["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}"#;
1349 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1350 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1351
1352 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]}"#;
1353 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1354 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1355
1356 let s = r#"{"id": 1, "method": "eth_subscribe", "params": ["syncing"]}"#;
1357 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1358 let _req = serde_json::from_value::<EthPubSub>(value).unwrap();
1359 }
1360
1361 #[test]
1362 fn test_serde_debug_raw_transaction() {
1363 let s = r#"{"jsonrpc":"2.0","method":"debug_getRawTransaction","params":["0x3ed3a89bc10115a321aee238c02de214009f8532a65368e5df5eaf732ee7167c"],"id":1}"#;
1364 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1365 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1366
1367 let s = r#"{"jsonrpc":"2.0","method":"eth_getRawTransactionByHash","params":["0x3ed3a89bc10115a321aee238c02de214009f8532a65368e5df5eaf732ee7167c"],"id":1}"#;
1368 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1369 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1370
1371 let s = r#"{"jsonrpc":"2.0","method":"eth_getRawTransactionByBlockHashAndIndex","params":["0x3ed3a89bc10115a321aee238c02de214009f8532a65368e5df5eaf732ee7167c",1],"id":1}"#;
1372 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1373 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1374
1375 let s = r#"{"jsonrpc":"2.0","method":"eth_getRawTransactionByBlockNumberAndIndex","params":["0x3ed3a89b",0],"id":1}"#;
1376 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1377 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1378 }
1379
1380 #[test]
1381 fn test_serde_debug_trace_transaction() {
1382 let s = r#"{"method": "debug_traceTransaction", "params":
1383["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff"]}"#;
1384 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1385 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1386
1387 let s = r#"{"method": "debug_traceTransaction", "params":
1388["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff", {}]}"#;
1389 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1390 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1391
1392 let s = r#"{"method": "debug_traceTransaction", "params":
1393["0x4a3b0fce2cb9707b0baa68640cf2fe858c8bb4121b2a8cb904ff369d38a560ff", {"disableStorage":
1394true}]}"#;
1395 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1396 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1397 }
1398
1399 #[test]
1400 fn test_serde_debug_trace_call() {
1401 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}]}"#;
1402 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1403 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1404
1405 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "latest" }]}"#;
1406 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1407 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1408
1409 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "0x0" }]}"#;
1410 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1411 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1412
1413 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockHash": "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" }]}"#;
1414 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1415 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1416
1417 let s = r#"{"method": "debug_traceCall", "params": [{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "0x0" }, {"disableStorage": true}]}"#;
1418 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1419 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1420 }
1421
1422 #[test]
1423 fn test_serde_eth_storage() {
1424 let s = r#"{"method": "eth_getStorageAt", "params":
1425["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"]}"#;
1426 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1427 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1428 }
1429
1430 #[test]
1431 fn test_eth_call() {
1432 let req = r#"{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}"#;
1433 let _req = serde_json::from_str::<TransactionRequest>(req).unwrap();
1434
1435 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"},"latest"]}"#;
1436 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1437
1438 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}]}"#;
1439 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1440
1441 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "latest" }]}"#;
1442 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1443
1444 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockNumber": "0x0" }]}"#;
1445 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1446
1447 let s = r#"{"method": "eth_call", "params":[{"data":"0xcfae3217","from":"0xd84de507f3fada7df80908082d3239466db55a71","to":"0xcbe828fdc46e3b1c351ec90b1a5e7d9742c0398d"}, { "blockHash":"0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" }]}"#;
1448 let _req = serde_json::from_str::<EthRequest>(s).unwrap();
1449 }
1450
1451 #[test]
1452 fn test_serde_eth_balance() {
1453 let s = r#"{"method": "eth_getBalance", "params":
1454["0x295a70b2de5e3953354a6a8344e616ed314d7251", "latest"]}"#;
1455 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1456
1457 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1458 }
1459
1460 #[test]
1461 fn test_serde_eth_block_by_number() {
1462 let s = r#"{"method": "eth_getBlockByNumber", "params": ["0x0", true]}"#;
1463 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1464 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1465 let s = r#"{"method": "eth_getBlockByNumber", "params": ["latest", true]}"#;
1466 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1467 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1468 let s = r#"{"method": "eth_getBlockByNumber", "params": ["earliest", true]}"#;
1469 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1470 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1471 let s = r#"{"method": "eth_getBlockByNumber", "params": ["pending", true]}"#;
1472 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1473 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1474
1475 let s = r#"{"method": "eth_getBlockByNumber", "params": [0, true]}"#;
1477 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1478 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1479 }
1480
1481 #[test]
1482 fn test_eth_sign() {
1483 let s = r#"{"method": "eth_sign", "params":
1484["0xd84de507f3fada7df80908082d3239466db55a71", "0x00"]}"#;
1485 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1486 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1487 let s = r#"{"method": "personal_sign", "params":
1488["0x00", "0xd84de507f3fada7df80908082d3239466db55a71"]}"#;
1489 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1490 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1491 }
1492
1493 #[test]
1494 fn test_eth_sign_typed_data() {
1495 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!"}}]}"#;
1496 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1497 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1498 }
1499
1500 #[test]
1501 fn test_remove_pool_transactions() {
1502 let s = r#"{"method": "anvil_removePoolTransactions", "params":["0x364d6D0333432C3Ac016Ca832fb8594A8cE43Ca6"]}"#;
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_serde_anvil_reorg() {
1509 let s = r#"
1511 {
1512 "method": "anvil_reorg",
1513 "params": [
1514 5,
1515 [
1516 [
1517 {
1518 "from": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
1519 "to": "0x1199bc69f16FDD6690DC40339EC445FaE1b6DD11",
1520 "value": 100
1521 },
1522 1
1523 ],
1524 [
1525 {
1526 "from": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
1527 "to": "0x1199bc69f16FDD6690DC40339EC445FaE1b6DD11",
1528 "value": 200
1529 },
1530 2
1531 ]
1532 ]
1533 ]
1534 }
1535 "#;
1536 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1537 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1538 let s = r#"
1540 {
1541 "method": "anvil_reorg",
1542 "params": [
1543 5,
1544 [
1545 [
1546 "0x19d55c67e1ba8f1bbdfed75f8ad524ebf087e4ecb848a2d19881d7a5e3d2c54e1732cb1b462da3b3fdb05bdf4c4d3c8e3c9fcebdc2ab5fa5d59a3f752888f27e1b",
1547 1
1548 ]
1549 ]
1550 ]
1551 }
1552 "#;
1553 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1554 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1555 let s = r#"
1557 {
1558 "method": "anvil_reorg",
1559 "params": [
1560 5,
1561 [
1562 [
1563 "0x19d55c67e1ba8f1bbdfed75f8ad524ebf087e4ecb848a2d19881d7a5e3d2c54e1732cb1b462da3b3fdb05bdf4c4d3c8e3c9fcebdc2ab5fa5d59a3f752888f27e1b",
1564 1
1565 ],
1566 [
1567 {
1568 "from": "0x976EA74026E726554dB657fA54763abd0C3a0aa9",
1569 "to": "0x1199bc69f16FDD6690DC40339EC445FaE1b6DD11",
1570 "value": 200
1571 },
1572 2
1573 ]
1574 ]
1575 ]
1576 }
1577 "#;
1578 let value: serde_json::Value = serde_json::from_str(s).unwrap();
1579 let _req = serde_json::from_value::<EthRequest>(value).unwrap();
1580 }
1581}