alloy_provider/ext/
anvil.rs

1//! This module extends the Ethereum JSON-RPC provider with the Anvil namespace's RPC methods.
2
3use 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/// Anvil namespace rpc interface that gives access to several non-standard RPC methods.
11#[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    // Not implemented:
15    // - anvil_enable_traces: Not implemented in the Anvil RPC API.
16    // - anvil_set_block: Not implemented / wired correctly in the Anvil RPC API.
17
18    /// Send transactions impersonating specific account and contract addresses.
19    async fn anvil_impersonate_account(&self, address: Address) -> TransportResult<()>;
20
21    /// Stops impersonating an account if previously set with `anvil_impersonateAccount`.
22    async fn anvil_stop_impersonating_account(&self, address: Address) -> TransportResult<()>;
23
24    /// If set to true will make every account impersonated.
25    async fn anvil_auto_impersonate_account(&self, enabled: bool) -> TransportResult<()>;
26
27    /// Returns true if auto mining is enabled, and false.
28    async fn anvil_get_auto_mine(&self) -> TransportResult<bool>;
29
30    /// Enables or disables, based on the single boolean argument, the automatic mining of new
31    /// blocks with each new transaction submitted to the network.
32    async fn anvil_set_auto_mine(&self, enable_automine: bool) -> TransportResult<()>;
33
34    /// Mines a series of blocks.
35    async fn anvil_mine(
36        &self,
37        num_blocks: Option<u64>,
38        interval: Option<u64>,
39    ) -> TransportResult<()>;
40
41    /// Sets the mining behavior to interval with the given interval (seconds).
42    async fn anvil_set_interval_mining(&self, secs: u64) -> TransportResult<()>;
43
44    /// Removes transactions from the pool.
45    async fn anvil_drop_transaction(&self, tx_hash: TxHash) -> TransportResult<Option<TxHash>>;
46
47    /// Removes all transactions from the pool.
48    async fn anvil_drop_all_transactions(&self) -> TransportResult<()>;
49
50    /// Reset the fork to a fresh forked state, and optionally update the fork config.
51    ///
52    /// If `forking` is `None` then this will disable forking entirely.
53    async fn anvil_reset(&self, forking: Option<Forking>) -> TransportResult<()>;
54
55    /// Sets the chain ID.
56    async fn anvil_set_chain_id(&self, chain_id: u64) -> TransportResult<()>;
57
58    /// Modifies the balance of an account.
59    async fn anvil_set_balance(&self, address: Address, balance: U256) -> TransportResult<()>;
60
61    /// Sets the code of a contract.
62    async fn anvil_set_code(&self, address: Address, code: Bytes) -> TransportResult<()>;
63
64    /// Sets the nonce of an address.
65    async fn anvil_set_nonce(&self, address: Address, nonce: u64) -> TransportResult<()>;
66
67    /// Writes a single slot of the account's storage.
68    async fn anvil_set_storage_at(
69        &self,
70        address: Address,
71        slot: U256,
72        val: B256,
73    ) -> TransportResult<bool>;
74
75    /// Enable or disable logging.
76    async fn anvil_set_logging(&self, enable: bool) -> TransportResult<()>;
77
78    /// Set the minimum gas price for the node.
79    async fn anvil_set_min_gas_price(&self, gas: u128) -> TransportResult<()>;
80
81    /// Sets the base fee of the next block.
82    async fn anvil_set_next_block_base_fee_per_gas(&self, basefee: u128) -> TransportResult<()>;
83
84    /// Sets the coinbase address.
85    async fn anvil_set_coinbase(&self, address: Address) -> TransportResult<()>;
86
87    /// Create a buffer that represents all state on the chain, which can be loaded to separate
88    /// process by calling `anvil_loadState`
89    async fn anvil_dump_state(&self) -> TransportResult<Bytes>;
90
91    /// Append chain state buffer to current chain. Will overwrite any conflicting addresses or
92    /// storage.
93    async fn anvil_load_state(&self, buf: Bytes) -> TransportResult<bool>;
94
95    /// Retrieves the Anvil node configuration params.
96    async fn anvil_node_info(&self) -> TransportResult<NodeInfo>;
97
98    /// Retrieves metadata about the Anvil instance.
99    async fn anvil_metadata(&self) -> TransportResult<Metadata>;
100
101    /// Removes all transactions from the pool for a specific address.
102    async fn anvil_remove_pool_transactions(&self, address: Address) -> TransportResult<()>;
103
104    /// Snapshot the state of the blockchain at the current block.
105    async fn anvil_snapshot(&self) -> TransportResult<U256>;
106
107    /// Revert the state of the blockchain to a previous snapshot.
108    /// Takes a single parameter, which is the snapshot id to revert to.
109    async fn anvil_revert(&self, id: U256) -> TransportResult<bool>;
110
111    /// Jump forward in time by the given amount of time, in seconds.
112    async fn anvil_increase_time(&self, seconds: u64) -> TransportResult<i64>;
113
114    /// Similar to `evm_increaseTime` but takes the exact timestamp that you want in the next block.
115    async fn anvil_set_next_block_timestamp(&self, timestamp: u64) -> TransportResult<()>;
116
117    /// Sets the specific timestamp and returns the number of seconds between the given timestamp
118    /// and the current time.
119    async fn anvil_set_time(&self, timestamp: u64) -> TransportResult<u64>;
120
121    /// Set the next block gas limit.
122    async fn anvil_set_block_gas_limit(&self, gas_limit: u64) -> TransportResult<bool>;
123
124    /// Sets an interval for the block timestamp.
125    async fn anvil_set_block_timestamp_interval(&self, seconds: u64) -> TransportResult<()>;
126
127    /// Unsets the interval for the block timestamp.
128    async fn anvil_remove_block_timestamp_interval(&self) -> TransportResult<bool>;
129
130    /// Mine blocks, instantly.
131    /// This will mine the blocks regardless of the configured mining mode.
132    async fn evm_mine(&self, opts: Option<MineOptions>) -> TransportResult<String>;
133
134    /// Mine blocks, instantly and return the mined blocks.
135    /// This will mine the blocks regardless of the configured mining mode.
136    async fn anvil_mine_detailed(&self, opts: Option<MineOptions>) -> TransportResult<Vec<Block>>;
137
138    /// Sets the backend rpc url.
139    async fn anvil_set_rpc_url(&self, url: String) -> TransportResult<()>;
140
141    /// Reorg the chain
142    async fn anvil_reorg(&self, options: ReorgOptions) -> TransportResult<()>;
143
144    /// Rollback the chain  
145    async fn anvil_rollback(&self, depth: Option<u64>) -> TransportResult<()>;
146
147    /// Execute a transaction regardless of signature status.
148    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    // use alloy_node_bindings::Anvil; (to be used in `test_anvil_reset`)
338
339    #[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    // TODO: Fix this test, `chain_id` is not being set correctly.
514    // #[tokio::test]
515    // async fn test_anvil_reset() {
516    //     let fork1 = Anvil::default().chain_id(777).spawn();
517    //     let fork2 = Anvil::default().chain_id(888).spawn();
518
519    //     let provider = ProviderBuilder::new()
520    //         .on_anvil_with_config(|config| config.fork(fork1.endpoint_url().to_string()));
521
522    //     let chain_id = provider.get_chain_id().await.unwrap();
523    //     assert_eq!(chain_id, 777);
524
525    //     provider
526    //         .anvil_reset(Some(Forking {
527    //             json_rpc_url: Some(fork2.endpoint_url().to_string()),
528    //             block_number: Some(0),
529    //         }))
530    //         .await
531    //         .unwrap();
532
533    //     let chain_id = provider.get_chain_id().await.unwrap();
534    //     assert_eq!(chain_id, 888);
535    // }
536
537    #[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    // TODO: Fix this test, only a single block is being mined regardless of the `blocks` parameter.
872    // #[tokio::test]
873    // async fn test_evm_mine_with_configuration() {
874    //     let provider = ProviderBuilder::new().on_anvil();
875
876    //     let start_num = provider.get_block_number().await.unwrap();
877
878    //     provider
879    //         .evm_mine(Some(MineOptions::Options { timestamp: Some(100), blocks: Some(10) }))
880    //         .await
881    //         .unwrap();
882
883    //     let num = provider.get_block_number().await.unwrap();
884    //     assert_eq!(num, start_num + 10);
885    // }
886
887    #[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    // TODO: Fix this test, only a single block is being mined regardless of the `blocks` parameter.
904    // #[tokio::test]
905    // async fn test_anvil_mine_detailed_with_configuration() {
906    //     let provider = ProviderBuilder::new().on_anvil();
907
908    //     let start_num = provider.get_block_number().await.unwrap();
909
910    //     let blocks = provider
911    //         .anvil_mine_detailed(Some(MineOptions::Options {
912    //             timestamp: Some(100),
913    //             blocks: Some(10),
914    //         }))
915    //         .await
916    //         .unwrap();
917
918    //     let num = provider.get_block_number().await.unwrap();
919    //     assert_eq!(num, start_num + 10);
920
921    //     for (idx, block) in blocks.iter().enumerate() {
922    //         assert_eq!(block.header.number, Some(start_num + idx as u64 + 1));
923    //     }
924    // }
925
926    #[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        // Mine two blocks
939        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        // Mine two blocks
956        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}