diff --git a/crates/anvil-polkadot/src/lib.rs b/crates/anvil-polkadot/src/lib.rs index aaafffdfe7b39..ab89a57985dab 100644 --- a/crates/anvil-polkadot/src/lib.rs +++ b/crates/anvil-polkadot/src/lib.rs @@ -1,6 +1,6 @@ //! Anvil is a fast local Ethereum development node. -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] use crate::{ api_server::ApiHandle, diff --git a/crates/anvil/core/src/lib.rs b/crates/anvil/core/src/lib.rs index 5d51d4691da7c..82412439ddb7f 100644 --- a/crates/anvil/core/src/lib.rs +++ b/crates/anvil/core/src/lib.rs @@ -3,7 +3,7 @@ //! Core Ethereum types for Anvil. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] /// Various Ethereum types pub mod eth; diff --git a/crates/anvil/rpc/src/lib.rs b/crates/anvil/rpc/src/lib.rs index bd5382cee17ad..328f5f8564ee1 100644 --- a/crates/anvil/rpc/src/lib.rs +++ b/crates/anvil/rpc/src/lib.rs @@ -3,7 +3,7 @@ //! JSON-RPC types. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] /// JSON-RPC request bindings pub mod request; diff --git a/crates/anvil/server/src/lib.rs b/crates/anvil/server/src/lib.rs index 7d3c5b1d2cafe..5ff7501bdbe1f 100644 --- a/crates/anvil/server/src/lib.rs +++ b/crates/anvil/server/src/lib.rs @@ -1,7 +1,7 @@ //! Bootstrap [axum] RPC servers. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing; diff --git a/crates/anvil/src/lib.rs b/crates/anvil/src/lib.rs index a23b414ef01cc..4fdc61c7b013e 100644 --- a/crates/anvil/src/lib.rs +++ b/crates/anvil/src/lib.rs @@ -1,6 +1,6 @@ //! Anvil is a fast local Ethereum development node. -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(not(test), warn(unused_crate_dependencies))] use crate::{ diff --git a/crates/cast/src/cmd/artifact.rs b/crates/cast/src/cmd/artifact.rs index 42a0609262e2e..53cc4a473a534 100644 --- a/crates/cast/src/cmd/artifact.rs +++ b/crates/cast/src/cmd/artifact.rs @@ -4,7 +4,7 @@ use super::{ }; use alloy_primitives::Address; use alloy_provider::Provider; -use clap::{Parser, command}; +use clap::Parser; use eyre::Result; use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, diff --git a/crates/cast/src/cmd/constructor_args.rs b/crates/cast/src/cmd/constructor_args.rs index 38f324de5270d..e86f51cf4bcc3 100644 --- a/crates/cast/src/cmd/constructor_args.rs +++ b/crates/cast/src/cmd/constructor_args.rs @@ -5,7 +5,7 @@ use super::{ use alloy_dyn_abi::DynSolType; use alloy_primitives::{Address, Bytes}; use alloy_provider::Provider; -use clap::{Parser, command}; +use clap::Parser; use eyre::{OptionExt, Result, eyre}; use foundry_cli::{ opts::{EtherscanOpts, RpcOpts}, diff --git a/crates/cast/src/cmd/creation_code.rs b/crates/cast/src/cmd/creation_code.rs index cf0847eaa69eb..4a23886b56a7a 100644 --- a/crates/cast/src/cmd/creation_code.rs +++ b/crates/cast/src/cmd/creation_code.rs @@ -4,7 +4,7 @@ use alloy_consensus::Transaction; use alloy_primitives::{Address, Bytes}; use alloy_provider::{Provider, ext::TraceApi}; use alloy_rpc_types::trace::parity::{Action, CreateAction, CreateOutput, TraceOutput}; -use clap::{Parser, command}; +use clap::Parser; use eyre::{OptionExt, Result, eyre}; use foundry_block_explorers::Client; use foundry_cli::{ diff --git a/crates/cast/src/lib.rs b/crates/cast/src/lib.rs index bd118d89206a6..a239b790ac588 100644 --- a/crates/cast/src/lib.rs +++ b/crates/cast/src/lib.rs @@ -1,6 +1,6 @@ //! Cast is a Swiss Army knife for interacting with Ethereum applications from the command line. -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(not(test), warn(unused_crate_dependencies))] use alloy_consensus::{Header, TxEnvelope}; diff --git a/crates/cheatcodes/spec/src/lib.rs b/crates/cheatcodes/spec/src/lib.rs index b6d4e9e75aa2e..5ee5c03dea2b6 100644 --- a/crates/cheatcodes/spec/src/lib.rs +++ b/crates/cheatcodes/spec/src/lib.rs @@ -1,7 +1,7 @@ //! Cheatcode specification for Foundry. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] use serde::{Deserialize, Serialize}; use std::{borrow::Cow, fmt}; diff --git a/crates/cheatcodes/src/lib.rs b/crates/cheatcodes/src/lib.rs index 461781a6e7a67..69b1520750248 100644 --- a/crates/cheatcodes/src/lib.rs +++ b/crates/cheatcodes/src/lib.rs @@ -3,7 +3,7 @@ //! Foundry cheatcodes implementations. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![allow(elided_lifetimes_in_paths)] // Cheats context uses 3 lifetimes #[macro_use] diff --git a/crates/chisel/src/lib.rs b/crates/chisel/src/lib.rs index 32a29caefc1b8..8b2b7074854e9 100644 --- a/crates/chisel/src/lib.rs +++ b/crates/chisel/src/lib.rs @@ -1,6 +1,6 @@ //! Chisel is a fast, utilitarian, and verbose Solidity REPL. -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(not(test), warn(unused_crate_dependencies))] #[macro_use] diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 9c1fb848edaa9..97b1c14d8ab13 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -3,7 +3,7 @@ //! Common CLI utilities. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index c672f014df226..a72d5defed729 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -3,7 +3,7 @@ //! Common utilities for building and using foundry's tools. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[expect(unused_extern_crates)] // Used by `ConsoleFmt`. extern crate self as foundry_common; diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs index 3987eb127f2df..d916276fddd01 100644 --- a/crates/config/src/lib.rs +++ b/crates/config/src/lib.rs @@ -3,7 +3,7 @@ //! Foundry configuration. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing; diff --git a/crates/debugger/src/lib.rs b/crates/debugger/src/lib.rs index 1c1bf9614ee2e..322320af3c5fa 100644 --- a/crates/debugger/src/lib.rs +++ b/crates/debugger/src/lib.rs @@ -3,7 +3,7 @@ //! Interactive Solidity TUI debugger and debugger data file dumper #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/doc/src/lib.rs b/crates/doc/src/lib.rs index c5201e73efb0d..7914771619d48 100644 --- a/crates/doc/src/lib.rs +++ b/crates/doc/src/lib.rs @@ -3,7 +3,7 @@ //! See [`DocBuilder`]. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/evm/abi/src/lib.rs b/crates/evm/abi/src/lib.rs index 8e9313c2f516e..0887a4a1c2cc6 100644 --- a/crates/evm/abi/src/lib.rs +++ b/crates/evm/abi/src/lib.rs @@ -1,6 +1,6 @@ //! Solidity ABI-related utilities and [`sol!`](alloy_sol_types::sol) definitions. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] pub mod console; diff --git a/crates/evm/core/src/lib.rs b/crates/evm/core/src/lib.rs index 3f2ec812bb67d..128862e1a61c1 100644 --- a/crates/evm/core/src/lib.rs +++ b/crates/evm/core/src/lib.rs @@ -3,7 +3,7 @@ //! Core EVM abstractions. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] use crate::constants::DEFAULT_CREATE2_DEPLOYER; use alloy_evm::eth::EthEvmContext; diff --git a/crates/evm/coverage/src/lib.rs b/crates/evm/coverage/src/lib.rs index dfcea24549095..32d15d818b8f4 100644 --- a/crates/evm/coverage/src/lib.rs +++ b/crates/evm/coverage/src/lib.rs @@ -3,7 +3,7 @@ //! EVM bytecode coverage analysis. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing; diff --git a/crates/evm/evm/src/lib.rs b/crates/evm/evm/src/lib.rs index bdca9d2eaa6ce..9607d7d9ded0a 100644 --- a/crates/evm/evm/src/lib.rs +++ b/crates/evm/evm/src/lib.rs @@ -3,7 +3,7 @@ //! Main Foundry EVM backend abstractions. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing; diff --git a/crates/evm/fuzz/src/lib.rs b/crates/evm/fuzz/src/lib.rs index 7067c1f6f54cd..f1dde45e95600 100644 --- a/crates/evm/fuzz/src/lib.rs +++ b/crates/evm/fuzz/src/lib.rs @@ -3,7 +3,7 @@ //! EVM fuzzing implementation using [`proptest`]. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing; diff --git a/crates/evm/traces/src/lib.rs b/crates/evm/traces/src/lib.rs index 5417f47e90f0c..02ae6dd9e924e 100644 --- a/crates/evm/traces/src/lib.rs +++ b/crates/evm/traces/src/lib.rs @@ -3,7 +3,7 @@ //! EVM trace identifying and decoding. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/fmt/src/lib.rs b/crates/fmt/src/lib.rs index 0ad3e336f7af2..a35ce60f00e3e 100644 --- a/crates/fmt/src/lib.rs +++ b/crates/fmt/src/lib.rs @@ -1,6 +1,6 @@ #![doc = include_str!("../README.md")] #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing; diff --git a/crates/forge/src/lib.rs b/crates/forge/src/lib.rs index fdbad8e4e6b2e..23879df9156f6 100644 --- a/crates/forge/src/lib.rs +++ b/crates/forge/src/lib.rs @@ -1,7 +1,7 @@ //! Forge is a fast and flexible Ethereum testing framework. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/forge/tests/cli/revive_vm.rs b/crates/forge/tests/cli/revive_vm.rs index ff6c817e3c760..a1f55871702db 100644 --- a/crates/forge/tests/cli/revive_vm.rs +++ b/crates/forge/tests/cli/revive_vm.rs @@ -392,3 +392,71 @@ Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) "#]]); }); + +forgetest!(vm_load, |prj, cmd| { + prj.insert_ds_test(); + prj.insert_vm(); + prj.insert_console(); + prj.add_source( + "Counter.sol", + r#" + // SPDX-License-Identifier: UNLICENSED + pragma solidity ^0.8.13; + + contract Counter { + uint256 public number; + + constructor (uint256 number_) { + number = number_; + } + } + "#, + ) + .unwrap(); + prj.add_source( + "Load.t.sol", + r#" +import "./test.sol"; +import "./Vm.sol"; +import {console} from "./console.sol"; +import {Counter} from "./Counter.sol"; + +contract Load is DSTest { +Vm constant vm = Vm(HEVM_ADDRESS); + +function testFuzz_Load(uint256 x) public { + vm.pvm(true); + Counter counter = new Counter(x); + bytes32 res = vm.load(address(counter), bytes32(uint256(0))); + assertEq(uint256(res), x); +} +} +"#, + ) + .unwrap(); + + let res = cmd.args(["test", "--resolc", "-vvv"]).assert_success(); + res.stderr_eq(str![""]).stdout_eq(str![[r#" +[COMPILING_FILES] with [SOLC_VERSION] +[SOLC_VERSION] [ELAPSED] +Compiler run successful! +[COMPILING_FILES] with [RESOLC_VERSION] +[RESOLC_VERSION] [ELAPSED] +Compiler run successful with warnings: +Warning: Warning: Your code or one of its dependencies uses the 'extcodesize' instruction, which is +usually needed in the following cases: + 1. To detect whether an address belongs to a smart contract. + 2. To detect whether the deploy code execution has finished. +Polkadot comes with native account abstraction support (so smart contracts are just accounts +coverned by code), and you should avoid differentiating between contracts and non-contract +addresses. +[FILE] + +Ran 1 test for src/Load.t.sol:Load +[PASS] testFuzz_Load(uint256) (runs: 256, [AVG_GAS]) +Suite result: ok. 1 passed; 0 failed; 0 skipped; [ELAPSED] + +Ran 1 test suite [ELAPSED]: 1 tests passed, 0 failed, 0 skipped (1 total tests) + +"#]]); +}); diff --git a/crates/linking/src/lib.rs b/crates/linking/src/lib.rs index 35e4de4e02307..15f5ed73c7ce4 100644 --- a/crates/linking/src/lib.rs +++ b/crates/linking/src/lib.rs @@ -3,7 +3,7 @@ //! EVM bytecode linker. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] use alloy_primitives::{Address, B256, Bytes}; use foundry_compilers::{ diff --git a/crates/lint/src/lib.rs b/crates/lint/src/lib.rs index 14d34cc30b306..41d332fcb18c7 100644 --- a/crates/lint/src/lib.rs +++ b/crates/lint/src/lib.rs @@ -1,6 +1,6 @@ #![doc = include_str!("../README.md")] #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] pub mod inline_config; pub mod linter; diff --git a/crates/macros/src/lib.rs b/crates/macros/src/lib.rs index bbe24e6f1f049..4d8b922437b13 100644 --- a/crates/macros/src/lib.rs +++ b/crates/macros/src/lib.rs @@ -3,7 +3,7 @@ //! Internal Foundry proc-macros. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate proc_macro_error2; diff --git a/crates/revive-env/src/runtime.rs b/crates/revive-env/src/runtime.rs index cba968a51bd10..c272286685de3 100644 --- a/crates/revive-env/src/runtime.rs +++ b/crates/revive-env/src/runtime.rs @@ -4,11 +4,7 @@ use frame_support::{runtime, traits::FindAuthor, weights::constants::WEIGHT_REF_TIME_PER_SECOND}; use pallet_revive::AccountId32Mapper; -use polkadot_sdk::{ - polkadot_sdk_frame::{log, runtime::prelude::*}, - sp_runtime::AccountId32, - *, -}; +use polkadot_sdk::{polkadot_sdk_frame::runtime::prelude::*, sp_runtime::AccountId32, *}; pub type Balance = u128; pub type AccountId = pallet_revive::AccountId32Mapper; diff --git a/crates/revive-strategy/src/cheatcodes/mod.rs b/crates/revive-strategy/src/cheatcodes/mod.rs index 906ad04f1ddcc..c7cabe1911893 100644 --- a/crates/revive-strategy/src/cheatcodes/mod.rs +++ b/crates/revive-strategy/src/cheatcodes/mod.rs @@ -11,7 +11,10 @@ use foundry_cheatcodes::{ Broadcast, BroadcastableTransactions, CheatcodeInspectorStrategy, CheatcodeInspectorStrategyContext, CheatcodeInspectorStrategyRunner, CheatsConfig, CheatsCtxt, CommonCreateInput, DealRecord, Ecx, EvmCheatcodeInspectorStrategyRunner, Result, - Vm::{dealCall, getNonce_0Call, pvmCall, rollCall, setNonceCall, setNonceUnsafeCall, warpCall}, + Vm::{ + dealCall, getNonce_0Call, loadCall, pvmCall, rollCall, setNonceCall, setNonceUnsafeCall, + warpCall, + }, }; use foundry_common::sh_err; use foundry_compilers::resolc::dual_compiled_contracts::DualCompiledContracts; @@ -246,6 +249,22 @@ impl CheatcodeInspectorStrategyRunner for PvmCheatcodeInspectorStrategyRunner { Ok(Default::default()) } + t if using_pvm && is::(t) => { + tracing::info!(cheatcode = ?cheatcode.as_debug() , using_pvm = ?using_pvm); + let &loadCall { target, slot } = cheatcode.as_any().downcast_ref().unwrap(); + let target_address_h160 = H160::from_slice(target.as_slice()); + let storage_value = execute_with_externalities(|externalities| { + externalities.execute_with(|| { + Pallet::::get_storage(target_address_h160, slot.into()) + }) + }); + let result = storage_value + .ok() + .flatten() + .map(|b| B256::from_slice(&b)) + .unwrap_or(B256::ZERO); + Ok(result.abi_encode()) + } // Not custom, just invoke the default behavior _ => cheatcode.dyn_apply(ccx, executor), } diff --git a/crates/script/src/lib.rs b/crates/script/src/lib.rs index 3a93bc2357120..07fc2ea2f0ad8 100644 --- a/crates/script/src/lib.rs +++ b/crates/script/src/lib.rs @@ -3,7 +3,7 @@ //! Smart contract scripting. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/test-utils/src/lib.rs b/crates/test-utils/src/lib.rs index 522a67332627f..4def8b8e171c0 100644 --- a/crates/test-utils/src/lib.rs +++ b/crates/test-utils/src/lib.rs @@ -3,7 +3,7 @@ //! Internal Foundry testing utilities. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] // Shouldn't use sh_* macros here, as they don't get captured by the test runner. #![allow(clippy::disallowed_macros)] diff --git a/crates/verify/src/lib.rs b/crates/verify/src/lib.rs index a46fdba901550..85f8a7a1c830e 100644 --- a/crates/verify/src/lib.rs +++ b/crates/verify/src/lib.rs @@ -1,7 +1,7 @@ //! Smart contract verification. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate foundry_common; diff --git a/crates/wallets/src/lib.rs b/crates/wallets/src/lib.rs index e3be0971e47a9..4f4c55ae39642 100644 --- a/crates/wallets/src/lib.rs +++ b/crates/wallets/src/lib.rs @@ -3,7 +3,7 @@ //! Utilities for working with multiple signers. #![cfg_attr(not(test), warn(unused_crate_dependencies))] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[macro_use] extern crate tracing;