1use crate::Provider;
4use alloy_network::Network;
5use alloy_primitives::{Address, Bytes, TxHash, B256, U128, U256, U64};
6use alloy_rpc_types_anvil::{Forking, Metadata, MineOptions, NodeInfo, ReorgOptions};
7use alloy_rpc_types_eth::Block;
8use alloy_transport::TransportResult;
9
10#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
12#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
13pub trait AnvilApi<N: Network>: Send + Sync {
14 async fn anvil_impersonate_account(&self, address: Address) -> TransportResult<()>;
20
21 async fn anvil_stop_impersonating_account(&self, address: Address) -> TransportResult<()>;
23
24 async fn anvil_auto_impersonate_account(&self, enabled: bool) -> TransportResult<()>;
26
27 async fn anvil_get_auto_mine(&self) -> TransportResult<bool>;
29
30 async fn anvil_set_auto_mine(&self, enable_automine: bool) -> TransportResult<()>;
33
34 async fn anvil_mine(
36 &self,
37 num_blocks: Option<u64>,
38 interval: Option<u64>,
39 ) -> TransportResult<()>;
40
41 async fn anvil_set_interval_mining(&self, secs: u64) -> TransportResult<()>;
43
44 async fn anvil_drop_transaction(&self, tx_hash: TxHash) -> TransportResult<Option<TxHash>>;
46
47 async fn anvil_drop_all_transactions(&self) -> TransportResult<()>;
49
50 async fn anvil_reset(&self, forking: Option<Forking>) -> TransportResult<()>;
54
55 async fn anvil_set_chain_id(&self, chain_id: u64) -> TransportResult<()>;
57
58 async fn anvil_set_balance(&self, address: Address, balance: U256) -> TransportResult<()>;
60
61 async fn anvil_set_code(&self, address: Address, code: Bytes) -> TransportResult<()>;
63
64 async fn anvil_set_nonce(&self, address: Address, nonce: u64) -> TransportResult<()>;
66
67 async fn anvil_set_storage_at(
69 &self,
70 address: Address,
71 slot: U256,
72 val: B256,
73 ) -> TransportResult<bool>;
74
75 async fn anvil_set_logging(&self, enable: bool) -> TransportResult<()>;
77
78 async fn anvil_set_min_gas_price(&self, gas: u128) -> TransportResult<()>;
80
81 async fn anvil_set_next_block_base_fee_per_gas(&self, basefee: u128) -> TransportResult<()>;
83
84 async fn anvil_set_coinbase(&self, address: Address) -> TransportResult<()>;
86
87 async fn anvil_dump_state(&self) -> TransportResult<Bytes>;
90
91 async fn anvil_load_state(&self, buf: Bytes) -> TransportResult<bool>;
94
95 async fn anvil_node_info(&self) -> TransportResult<NodeInfo>;
97
98 async fn anvil_metadata(&self) -> TransportResult<Metadata>;
100
101 async fn anvil_remove_pool_transactions(&self, address: Address) -> TransportResult<()>;
103
104 async fn anvil_snapshot(&self) -> TransportResult<U256>;
106
107 async fn anvil_revert(&self, id: U256) -> TransportResult<bool>;
110
111 async fn anvil_increase_time(&self, seconds: u64) -> TransportResult<i64>;
113
114 async fn anvil_set_next_block_timestamp(&self, timestamp: u64) -> TransportResult<()>;
116
117 async fn anvil_set_time(&self, timestamp: u64) -> TransportResult<u64>;
120
121 async fn anvil_set_block_gas_limit(&self, gas_limit: u64) -> TransportResult<bool>;
123
124 async fn anvil_set_block_timestamp_interval(&self, seconds: u64) -> TransportResult<()>;
126
127 async fn anvil_remove_block_timestamp_interval(&self) -> TransportResult<bool>;
129
130 async fn evm_mine(&self, opts: Option<MineOptions>) -> TransportResult<String>;
133
134 async fn anvil_mine_detailed(&self, opts: Option<MineOptions>) -> TransportResult<Vec<Block>>;
137
138 async fn anvil_set_rpc_url(&self, url: String) -> TransportResult<()>;
140
141 async fn anvil_reorg(&self, options: ReorgOptions) -> TransportResult<()>;
143
144 async fn anvil_rollback(&self, depth: Option<u64>) -> TransportResult<()>;
146
147 async fn eth_send_unsigned_transaction(
149 &self,
150 request: N::TransactionRequest,
151 ) -> TransportResult<TxHash>;
152}
153
154#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
155#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
156impl<N, P> AnvilApi<N> for P
157where
158 N: Network,
159 P: Provider<N>,
160{
161 async fn anvil_impersonate_account(&self, address: Address) -> TransportResult<()> {
162 self.client().request("anvil_impersonateAccount", (address,)).await
163 }
164
165 async fn anvil_stop_impersonating_account(&self, address: Address) -> TransportResult<()> {
166 self.client().request("anvil_stopImpersonatingAccount", (address,)).await
167 }
168
169 async fn anvil_auto_impersonate_account(&self, enabled: bool) -> TransportResult<()> {
170 self.client().request("anvil_autoImpersonateAccount", (enabled,)).await
171 }
172
173 async fn anvil_get_auto_mine(&self) -> TransportResult<bool> {
174 self.client().request_noparams("anvil_getAutomine").await
175 }
176
177 async fn anvil_set_auto_mine(&self, enabled: bool) -> TransportResult<()> {
178 self.client().request("anvil_setAutomine", (enabled,)).await
179 }
180
181 async fn anvil_mine(
182 &self,
183 num_blocks: Option<u64>,
184 interval: Option<u64>,
185 ) -> TransportResult<()> {
186 self.client()
187 .request("anvil_mine", (num_blocks.map(U64::from), interval.map(U64::from)))
188 .await
189 }
190
191 async fn anvil_set_interval_mining(&self, secs: u64) -> TransportResult<()> {
192 self.client().request("anvil_setIntervalMining", (secs,)).await
193 }
194
195 async fn anvil_drop_transaction(&self, tx_hash: TxHash) -> TransportResult<Option<TxHash>> {
196 self.client().request("anvil_dropTransaction", (tx_hash,)).await
197 }
198
199 async fn anvil_drop_all_transactions(&self) -> TransportResult<()> {
200 self.client().request_noparams("anvil_dropAllTransactions").await
201 }
202
203 async fn anvil_reset(&self, forking: Option<Forking>) -> TransportResult<()> {
204 self.client().request("anvil_reset", (forking,)).await
205 }
206
207 async fn anvil_set_chain_id(&self, chain_id: u64) -> TransportResult<()> {
208 self.client().request("anvil_setChainId", (chain_id,)).await
209 }
210
211 async fn anvil_set_balance(&self, address: Address, balance: U256) -> TransportResult<()> {
212 self.client().request("anvil_setBalance", (address, balance)).await
213 }
214
215 async fn anvil_set_code(&self, address: Address, code: Bytes) -> TransportResult<()> {
216 self.client().request("anvil_setCode", (address, code)).await
217 }
218
219 async fn anvil_set_nonce(&self, address: Address, nonce: u64) -> TransportResult<()> {
220 self.client().request("anvil_setNonce", (address, U64::from(nonce))).await
221 }
222
223 async fn anvil_set_storage_at(
224 &self,
225 address: Address,
226 slot: U256,
227 val: B256,
228 ) -> TransportResult<bool> {
229 self.client().request("anvil_setStorageAt", (address, slot, val)).await
230 }
231
232 async fn anvil_set_logging(&self, enable: bool) -> TransportResult<()> {
233 self.client().request("anvil_setLoggingEnabled", (enable,)).await
234 }
235
236 async fn anvil_set_min_gas_price(&self, gas: u128) -> TransportResult<()> {
237 self.client().request("anvil_setMinGasPrice", (U128::from(gas),)).await
238 }
239
240 async fn anvil_set_next_block_base_fee_per_gas(&self, basefee: u128) -> TransportResult<()> {
241 self.client().request("anvil_setNextBlockBaseFeePerGas", (U128::from(basefee),)).await
242 }
243
244 async fn anvil_set_coinbase(&self, address: Address) -> TransportResult<()> {
245 self.client().request("anvil_setCoinbase", (address,)).await
246 }
247
248 async fn anvil_dump_state(&self) -> TransportResult<Bytes> {
249 self.client().request_noparams("anvil_dumpState").await
250 }
251
252 async fn anvil_load_state(&self, buf: Bytes) -> TransportResult<bool> {
253 self.client().request("anvil_loadState", (buf,)).await
254 }
255
256 async fn anvil_node_info(&self) -> TransportResult<NodeInfo> {
257 self.client().request_noparams("anvil_nodeInfo").await
258 }
259
260 async fn anvil_metadata(&self) -> TransportResult<Metadata> {
261 self.client().request_noparams("anvil_metadata").await
262 }
263
264 async fn anvil_remove_pool_transactions(&self, address: Address) -> TransportResult<()> {
265 self.client().request("anvil_removePoolTransactions", (address,)).await
266 }
267
268 async fn anvil_snapshot(&self) -> TransportResult<U256> {
269 self.client().request_noparams("evm_snapshot").await
270 }
271
272 async fn anvil_revert(&self, id: U256) -> TransportResult<bool> {
273 self.client().request("evm_revert", (id,)).await
274 }
275
276 async fn anvil_increase_time(&self, seconds: u64) -> TransportResult<i64> {
277 self.client().request("evm_increaseTime", (U64::from(seconds),)).await
278 }
279
280 async fn anvil_set_next_block_timestamp(&self, seconds: u64) -> TransportResult<()> {
281 self.client().request("evm_setNextBlockTimestamp", (seconds,)).await
282 }
283
284 async fn anvil_set_time(&self, timestamp: u64) -> TransportResult<u64> {
285 self.client().request("evm_setTime", (timestamp,)).await
286 }
287
288 async fn anvil_set_block_gas_limit(&self, gas_limit: u64) -> TransportResult<bool> {
289 self.client().request("evm_setBlockGasLimit", (U64::from(gas_limit),)).await
290 }
291
292 async fn anvil_set_block_timestamp_interval(&self, seconds: u64) -> TransportResult<()> {
293 self.client().request("anvil_setBlockTimestampInterval", (seconds,)).await
294 }
295
296 async fn anvil_remove_block_timestamp_interval(&self) -> TransportResult<bool> {
297 self.client().request_noparams("anvil_removeBlockTimestampInterval").await
298 }
299
300 async fn evm_mine(&self, opts: Option<MineOptions>) -> TransportResult<String> {
301 self.client().request("evm_mine", (opts,)).await
302 }
303
304 async fn anvil_mine_detailed(&self, opts: Option<MineOptions>) -> TransportResult<Vec<Block>> {
305 self.client().request("evm_mine_detailed", (opts,)).await
306 }
307
308 async fn anvil_set_rpc_url(&self, url: String) -> TransportResult<()> {
309 self.client().request("anvil_setRpcUrl", (url,)).await
310 }
311
312 async fn anvil_reorg(&self, options: ReorgOptions) -> TransportResult<()> {
313 self.client().request("anvil_reorg", options).await
314 }
315
316 async fn anvil_rollback(&self, depth: Option<u64>) -> TransportResult<()> {
317 self.client().request("anvil_rollback", (depth,)).await
318 }
319
320 async fn eth_send_unsigned_transaction(
321 &self,
322 request: N::TransactionRequest,
323 ) -> TransportResult<TxHash> {
324 self.client().request("eth_sendUnsignedTransaction", (request,)).await
325 }
326}
327
328#[cfg(test)]
329mod tests {
330 use super::*;
331 use crate::ProviderBuilder;
332 use alloy_eips::BlockNumberOrTag;
333 use alloy_network::TransactionBuilder;
334 use alloy_primitives::B256;
335 use alloy_rpc_types_eth::TransactionRequest;
336
337 #[tokio::test]
340 async fn test_anvil_impersonate_account_stop_impersonating_account() {
341 let provider = ProviderBuilder::new().on_anvil();
342
343 let impersonate = Address::random();
344 let to = Address::random();
345 let val = U256::from(1337);
346 let funding = U256::from(1e18 as u64);
347
348 provider.anvil_set_balance(impersonate, funding).await.unwrap();
349
350 let balance = provider.get_balance(impersonate).await.unwrap();
351 assert_eq!(balance, funding);
352
353 let tx = TransactionRequest::default().with_from(impersonate).with_to(to).with_value(val);
354
355 let res = provider.send_transaction(tx.clone()).await;
356 res.unwrap_err();
357
358 provider.anvil_impersonate_account(impersonate).await.unwrap();
359 assert!(provider.get_accounts().await.unwrap().contains(&impersonate));
360
361 let res = provider.send_transaction(tx.clone()).await.unwrap().get_receipt().await.unwrap();
362 assert_eq!(res.from, impersonate);
363
364 let nonce = provider.get_transaction_count(impersonate).await.unwrap();
365 assert_eq!(nonce, 1);
366
367 let balance = provider.get_balance(to).await.unwrap();
368 assert_eq!(balance, val);
369
370 provider.anvil_stop_impersonating_account(impersonate).await.unwrap();
371 let res = provider.send_transaction(tx).await;
372 res.unwrap_err();
373 }
374
375 #[tokio::test]
376 async fn test_anvil_auto_impersonate_account() {
377 let provider = ProviderBuilder::new().on_anvil();
378
379 let impersonate = Address::random();
380 let to = Address::random();
381 let val = U256::from(1337);
382 let funding = U256::from(1e18 as u64);
383
384 provider.anvil_set_balance(impersonate, funding).await.unwrap();
385
386 let balance = provider.get_balance(impersonate).await.unwrap();
387 assert_eq!(balance, funding);
388
389 let tx = TransactionRequest::default().with_from(impersonate).with_to(to).with_value(val);
390
391 let res = provider.send_transaction(tx.clone()).await;
392 res.unwrap_err();
393
394 provider.anvil_auto_impersonate_account(true).await.unwrap();
395
396 let res = provider.send_transaction(tx.clone()).await.unwrap().get_receipt().await.unwrap();
397 assert_eq!(res.from, impersonate);
398
399 let nonce = provider.get_transaction_count(impersonate).await.unwrap();
400 assert_eq!(nonce, 1);
401
402 let balance = provider.get_balance(to).await.unwrap();
403 assert_eq!(balance, val);
404
405 provider.anvil_auto_impersonate_account(false).await.unwrap();
406 let res = provider.send_transaction(tx).await;
407 res.unwrap_err();
408
409 provider.anvil_impersonate_account(impersonate).await.unwrap();
410 assert!(provider.get_accounts().await.unwrap().contains(&impersonate));
411 }
412
413 #[tokio::test]
414 async fn test_anvil_get_auto_mine_set_auto_mine() {
415 let provider = ProviderBuilder::new().on_anvil();
416
417 provider.anvil_set_auto_mine(false).await.unwrap();
418
419 let enabled = provider.anvil_get_auto_mine().await.unwrap();
420 assert!(!enabled);
421
422 provider.anvil_set_auto_mine(true).await.unwrap();
423
424 let enabled = provider.anvil_get_auto_mine().await.unwrap();
425 assert!(enabled);
426 }
427
428 #[tokio::test]
429 async fn test_anvil_mine() {
430 let provider = ProviderBuilder::new().on_anvil();
431
432 let start_num = provider.get_block_number().await.unwrap();
433
434 provider.anvil_mine(Some(10), None).await.unwrap();
435
436 let num = provider.get_block_number().await.unwrap();
437
438 assert_eq!(num, start_num + 10);
439 }
440
441 #[tokio::test]
442 async fn test_anvil_set_interval_mining() {
443 let provider = ProviderBuilder::new().on_anvil();
444
445 provider.anvil_set_interval_mining(1).await.unwrap();
446
447 let start_num = provider.get_block_number().await.unwrap();
448
449 tokio::time::sleep(tokio::time::Duration::from_millis(1500)).await;
450
451 let num = provider.get_block_number().await.unwrap();
452
453 assert_eq!(num, start_num + 1);
454 }
455
456 #[tokio::test]
457 async fn test_anvil_drop_transaction() {
458 let provider = ProviderBuilder::new().on_anvil_with_wallet();
459
460 provider.anvil_set_auto_mine(false).await.unwrap();
461
462 let alice = provider.get_accounts().await.unwrap()[0];
463 let bob = provider.get_accounts().await.unwrap()[1];
464 let chain_id = provider.get_chain_id().await.unwrap();
465
466 let tx = TransactionRequest::default()
467 .with_from(alice)
468 .with_to(bob)
469 .with_nonce(0)
470 .with_chain_id(chain_id)
471 .with_value(U256::from(100))
472 .with_gas_limit(21_000)
473 .with_max_priority_fee_per_gas(1_000_000_000)
474 .with_max_fee_per_gas(20_000_000_000);
475
476 let tx_hash =
477 provider.send_transaction(tx).await.unwrap().register().await.unwrap().tx_hash;
478
479 let res = provider.anvil_drop_transaction(tx_hash).await.unwrap();
480
481 assert_eq!(res, Some(tx_hash));
482 }
483
484 #[tokio::test]
485 async fn test_anvil_drop_all_transactions() {
486 let provider = ProviderBuilder::new().on_anvil_with_wallet();
487
488 provider.anvil_set_auto_mine(false).await.unwrap();
489
490 let alice = provider.get_accounts().await.unwrap()[0];
491 let bob = provider.get_accounts().await.unwrap()[1];
492 let chain_id = provider.get_chain_id().await.unwrap();
493
494 let tx = TransactionRequest::default()
495 .with_from(alice)
496 .with_to(bob)
497 .with_nonce(0)
498 .with_chain_id(chain_id)
499 .with_value(U256::from(100))
500 .with_gas_limit(21_000)
501 .with_max_priority_fee_per_gas(1_000_000_000)
502 .with_max_fee_per_gas(20_000_000_000);
503
504 provider.send_transaction(tx.clone()).await.unwrap().register().await.unwrap();
505
506 let tx = tx.clone().with_nonce(1);
507
508 provider.send_transaction(tx).await.unwrap().register().await.unwrap();
509
510 provider.anvil_drop_all_transactions().await.unwrap();
511 }
512
513 #[tokio::test]
538 async fn test_anvil_set_chain_id() {
539 let provider = ProviderBuilder::new().on_anvil();
540
541 let chain_id = 1337;
542 provider.anvil_set_chain_id(chain_id).await.unwrap();
543
544 let new_chain_id = provider.get_chain_id().await.unwrap();
545 assert_eq!(new_chain_id, chain_id);
546 }
547
548 #[tokio::test]
549 async fn test_anvil_set_balance() {
550 let provider = ProviderBuilder::new().on_anvil();
551
552 let address = Address::random();
553 let balance = U256::from(1337);
554 provider.anvil_set_balance(address, balance).await.unwrap();
555
556 let new_balance = provider.get_balance(address).await.unwrap();
557 assert_eq!(new_balance, balance);
558 }
559
560 #[tokio::test]
561 async fn test_anvil_set_code() {
562 let provider = ProviderBuilder::new().on_anvil();
563
564 let address = Address::random();
565 provider.anvil_set_code(address, Bytes::from("0xbeef")).await.unwrap();
566
567 let code = provider.get_code_at(address).await.unwrap();
568 assert_eq!(code, Bytes::from("0xbeef"));
569 }
570
571 #[tokio::test]
572 async fn test_anvil_set_nonce() {
573 let provider = ProviderBuilder::new().on_anvil();
574
575 let address = Address::random();
576 let nonce = 1337;
577 provider.anvil_set_nonce(address, nonce).await.unwrap();
578
579 let new_nonce = provider.get_transaction_count(address).await.unwrap();
580 assert_eq!(new_nonce, nonce);
581 }
582
583 #[tokio::test]
584 async fn test_anvil_set_storage_at() {
585 let provider = ProviderBuilder::new().on_anvil();
586
587 let address = Address::random();
588 let slot = U256::from(1337);
589 let val = B256::from(U256::from(1337));
590 provider.anvil_set_storage_at(address, slot, val).await.unwrap();
591
592 let storage = provider.get_storage_at(address, slot).await.unwrap();
593 assert_eq!(B256::from(storage), val);
594 }
595
596 #[tokio::test]
597 async fn test_anvil_set_logging() {
598 let provider = ProviderBuilder::new().on_anvil();
599
600 provider.anvil_set_logging(true).await.unwrap();
601 }
602
603 #[tokio::test]
604 async fn test_anvil_set_min_gas_price() {
605 let provider = ProviderBuilder::new().on_anvil();
606
607 let gas = U256::from(1337);
608
609 if let Err(e) = provider.anvil_set_min_gas_price(gas.try_into().unwrap()).await {
610 assert_eq!(
611 e.to_string(),
612 "server returned an error response: error code -32602: anvil_setMinGasPrice is not supported when EIP-1559 is active"
613 );
614 }
615 }
616
617 #[tokio::test]
618 async fn test_anvil_set_next_block_base_fee_per_gas() {
619 let provider = ProviderBuilder::new().on_anvil();
620
621 let basefee = 1337;
622 provider.anvil_set_next_block_base_fee_per_gas(basefee).await.unwrap();
623
624 provider.evm_mine(None).await.unwrap();
625
626 let block = provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
627
628 assert_eq!(block.header.base_fee_per_gas, Some(basefee as u64));
629 }
630
631 #[tokio::test]
632 async fn test_anvil_set_coinbase() {
633 let provider = ProviderBuilder::new().on_anvil();
634
635 let coinbase = Address::random();
636 provider.anvil_set_coinbase(coinbase).await.unwrap();
637
638 provider.evm_mine(None).await.unwrap();
639
640 let block = provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
641 assert_eq!(block.header.beneficiary, coinbase);
642 }
643
644 #[tokio::test]
645 async fn test_anvil_dump_state_load_state() {
646 let provider = ProviderBuilder::new().on_anvil();
647
648 let state = provider.anvil_dump_state().await.unwrap();
649
650 assert!(!state.is_empty());
651
652 let res = provider.anvil_load_state(state).await.unwrap();
653
654 assert!(res);
655 }
656
657 #[tokio::test]
658 async fn test_anvil_node_info() {
659 let provider = ProviderBuilder::new().on_anvil();
660
661 let latest_block =
662 provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
663
664 provider.evm_mine(None).await.unwrap();
665
666 let node_info = provider.anvil_node_info().await.unwrap();
667
668 assert_eq!(node_info.current_block_number, latest_block.header.number + 1);
669 }
670
671 #[tokio::test]
672 async fn test_anvil_metadata() {
673 let provider = ProviderBuilder::new().on_anvil();
674
675 let client_version = provider.get_client_version().await.unwrap();
676 let chain_id = provider.get_chain_id().await.unwrap();
677
678 let metadata = provider.anvil_metadata().await.unwrap();
679
680 assert_eq!(metadata.client_version, client_version);
681 assert_eq!(metadata.chain_id, chain_id);
682 }
683
684 #[tokio::test]
685 async fn test_anvil_remove_pool_transactions() {
686 let provider = ProviderBuilder::new().on_anvil_with_wallet();
687
688 provider.anvil_set_auto_mine(false).await.unwrap();
689
690 let alice = provider.get_accounts().await.unwrap()[0];
691 let bob = provider.get_accounts().await.unwrap()[1];
692 let chain_id = provider.get_chain_id().await.unwrap();
693
694 let tx = TransactionRequest::default()
695 .with_from(alice)
696 .with_to(bob)
697 .with_nonce(0)
698 .with_chain_id(chain_id)
699 .with_value(U256::from(100))
700 .with_gas_limit(21_000)
701 .with_max_priority_fee_per_gas(1_000_000_000)
702 .with_max_fee_per_gas(20_000_000_000);
703
704 provider.send_transaction(tx.clone()).await.unwrap().register().await.unwrap();
705
706 let tx = tx.clone().with_nonce(1);
707
708 provider.send_transaction(tx).await.unwrap().register().await.unwrap();
709
710 provider.anvil_remove_pool_transactions(alice).await.unwrap();
711 }
712
713 #[tokio::test]
714 async fn test_anvil_snapshot_revert() {
715 let provider = ProviderBuilder::new().on_anvil();
716
717 let snapshot_id = provider.anvil_snapshot().await.unwrap();
718
719 let alice = provider.get_accounts().await.unwrap()[0];
720 let bob = provider.get_accounts().await.unwrap()[1];
721 let chain_id = provider.get_chain_id().await.unwrap();
722
723 let tx = TransactionRequest::default()
724 .with_from(alice)
725 .with_to(bob)
726 .with_nonce(0)
727 .with_chain_id(chain_id)
728 .with_value(U256::from(100))
729 .with_gas_limit(21_000)
730 .with_max_priority_fee_per_gas(1_000_000_000)
731 .with_max_fee_per_gas(20_000_000_000);
732
733 provider.send_transaction(tx.clone()).await.unwrap().get_receipt().await.unwrap();
734
735 let tx = tx.clone().with_nonce(1);
736
737 provider.send_transaction(tx).await.unwrap().get_receipt().await.unwrap();
738
739 let tx_count = provider.get_transaction_count(alice).await.unwrap();
740 assert_eq!(tx_count, 2);
741
742 let res = provider.anvil_revert(snapshot_id).await.unwrap();
743 assert!(res);
744
745 let tx_count = provider.get_transaction_count(alice).await.unwrap();
746 assert_eq!(tx_count, 0);
747 }
748
749 #[tokio::test]
750 async fn test_anvil_increase_time() {
751 let provider = ProviderBuilder::new().on_anvil();
752
753 let timestamp = provider
754 .get_block_by_number(BlockNumberOrTag::Latest)
755 .await
756 .unwrap()
757 .unwrap()
758 .header
759 .timestamp;
760
761 let seconds = provider.anvil_increase_time(1337).await.unwrap();
762
763 assert_eq!(timestamp as i64 + seconds, timestamp as i64 + 1337_i64);
764 }
765
766 #[tokio::test]
767 async fn test_anvil_set_next_block_timestamp() {
768 let provider = ProviderBuilder::new().on_anvil();
769
770 let timestamp = provider
771 .get_block_by_number(BlockNumberOrTag::Latest)
772 .await
773 .unwrap()
774 .unwrap()
775 .header
776 .timestamp;
777
778 provider.anvil_set_next_block_timestamp(timestamp + 1337).await.unwrap();
779
780 provider.evm_mine(None).await.unwrap();
781
782 let latest_block =
783 provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
784 assert_eq!(latest_block.header.timestamp, timestamp + 1337);
785 }
786
787 #[tokio::test]
788 async fn test_anvil_set_time() {
789 let provider = ProviderBuilder::new().on_anvil();
790
791 provider.anvil_set_time(0).await.unwrap();
792
793 let seconds = provider.anvil_set_time(1001).await.unwrap();
794
795 assert_eq!(seconds, 1);
796 }
797
798 #[tokio::test]
799 async fn test_anvil_set_block_gas_limit() {
800 let provider = ProviderBuilder::new().on_anvil();
801
802 let block_gas_limit = 1337;
803 assert!(provider.anvil_set_block_gas_limit(block_gas_limit).await.unwrap());
804
805 provider.evm_mine(None).await.unwrap();
806
807 let latest_block =
808 provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
809 assert_eq!(block_gas_limit, latest_block.header.gas_limit);
810 }
811
812 #[tokio::test]
813 async fn test_anvil_block_timestamp_interval() {
814 let provider = ProviderBuilder::new().on_anvil();
815
816 provider.anvil_set_block_timestamp_interval(1).await.unwrap();
817
818 let start_timestamp = provider
819 .get_block_by_number(BlockNumberOrTag::Latest)
820 .await
821 .unwrap()
822 .unwrap()
823 .header
824 .timestamp;
825
826 tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
827
828 provider.evm_mine(None).await.unwrap();
829
830 let latest_block =
831 provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
832
833 assert_eq!(latest_block.header.timestamp, start_timestamp + 1);
834
835 provider.anvil_remove_block_timestamp_interval().await.unwrap();
836
837 provider.evm_mine(None).await.unwrap();
838
839 let start_timestamp = provider
840 .get_block_by_number(BlockNumberOrTag::Latest)
841 .await
842 .unwrap()
843 .unwrap()
844 .header
845 .timestamp;
846
847 tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
848
849 let latest_block =
850 provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
851
852 assert_eq!(latest_block.header.timestamp, start_timestamp);
853 }
854
855 #[tokio::test]
856 async fn test_evm_mine_single_block() {
857 let provider = ProviderBuilder::new().on_anvil();
858
859 let start_num = provider.get_block_number().await.unwrap();
860
861 for (idx, _) in std::iter::repeat(()).take(10).enumerate() {
862 provider.evm_mine(None).await.unwrap();
863 let num = provider.get_block_number().await.unwrap();
864 assert_eq!(num, start_num + idx as u64 + 1);
865 }
866
867 let num = provider.get_block_number().await.unwrap();
868 assert_eq!(num, start_num + 10);
869 }
870
871 #[tokio::test]
888 async fn test_anvil_mine_detailed_single_block() {
889 let provider = ProviderBuilder::new().on_anvil();
890
891 let start_num = provider.get_block_number().await.unwrap();
892
893 for (idx, _) in std::iter::repeat(()).take(10).enumerate() {
894 provider.anvil_mine_detailed(None).await.unwrap();
895 let num = provider.get_block_number().await.unwrap();
896 assert_eq!(num, start_num + idx as u64 + 1);
897 }
898
899 let num = provider.get_block_number().await.unwrap();
900 assert_eq!(num, start_num + 10);
901 }
902
903 #[tokio::test]
927 async fn test_anvil_set_rpc_url() {
928 let provider = ProviderBuilder::new().on_anvil();
929
930 let url = "https://example.com".to_string();
931 provider.anvil_set_rpc_url(url.clone()).await.unwrap();
932 }
933
934 #[tokio::test]
935 async fn test_anvil_reorg() {
936 let provider = ProviderBuilder::new().on_anvil();
937
938 provider.anvil_mine(Some(2), None).await.unwrap();
940
941 let reorged_block = provider.get_block_by_number(2.into()).await.unwrap().unwrap();
942 provider.anvil_reorg(ReorgOptions { depth: 1, tx_block_pairs: Vec::new() }).await.unwrap();
943
944 let new_block = provider.get_block_by_number(2.into()).await.unwrap().unwrap();
945
946 assert_eq!(reorged_block.header.number, new_block.header.number);
947 assert_ne!(reorged_block.header.hash, new_block.header.hash);
948 }
949
950 #[tokio::test]
951 #[ignore]
952 async fn test_anvil_rollback() {
953 let provider = ProviderBuilder::new().on_anvil();
954
955 provider.anvil_mine(Some(2), None).await.unwrap();
957
958 let target_height = provider.get_block_by_number(1.into()).await.unwrap().unwrap();
959
960 provider.anvil_rollback(Some(1)).await.unwrap();
961
962 let new_head =
963 provider.get_block_by_number(BlockNumberOrTag::Latest).await.unwrap().unwrap();
964
965 assert_eq!(target_height, new_head);
966 }
967
968 #[tokio::test]
969 async fn test_eth_send_unsigned_transaction() {
970 let provider = ProviderBuilder::new().on_anvil();
971
972 let alice = Address::random();
973 let bob = Address::random();
974 let chain_id = provider.get_chain_id().await.unwrap();
975
976 provider.anvil_set_balance(alice, U256::from(1e18 as u64)).await.unwrap();
977
978 let tx = TransactionRequest::default()
979 .with_from(alice)
980 .with_to(bob)
981 .with_nonce(0)
982 .with_chain_id(chain_id)
983 .with_value(U256::from(100))
984 .with_gas_limit(21_000)
985 .with_max_priority_fee_per_gas(1_000_000_000)
986 .with_max_fee_per_gas(20_000_000_000);
987
988 let tx_hash = provider.eth_send_unsigned_transaction(tx).await.unwrap();
989
990 provider.evm_mine(None).await.unwrap();
991
992 let res = provider.get_transaction_receipt(tx_hash).await.unwrap().unwrap();
993 assert_eq!(res.from, alice);
994 assert_eq!(res.to, Some(bob));
995 }
996}