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