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