Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/anvil/tests/it/fork.rs
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,7 @@ async fn test_reset_fork_on_new_blocks() {

let anvil_provider = handle.http_provider();
let endpoint = next_http_rpc_endpoint();
let provider = Arc::new(get_http_provider(&endpoint));
let provider = Arc::new(get_http_provider(&endpoint, false));

let current_block = anvil_provider.get_block_number().await.unwrap();

Expand Down
2 changes: 1 addition & 1 deletion crates/anvil/tests/it/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use foundry_common::provider::{
};

pub fn http_provider(http_endpoint: &str) -> RetryProvider {
get_http_provider(http_endpoint)
get_http_provider(http_endpoint, false)
}

pub fn http_provider_with_signer(
Expand Down
12 changes: 12 additions & 0 deletions crates/cli/src/opts/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ use foundry_common::shell;
#[derive(Clone, Debug, Default, Serialize, Parser)]
#[command(next_help_heading = "EVM options", about = None, long_about = None)] // override doc
pub struct EvmArgs {
/// Allow insecure RPC connections (accept invalid HTTPS certificates).
///
/// When the provider's inner runtime transport variant is HTTP, this configures the reqwest
/// client to accept invalid certificates.
#[arg(short = 'k', long = "insecure", default_value = "false")]
#[serde(rename = "eth_rpc_accept_invalid_certs")]
pub accept_invalid_certs: bool,

/// Fetch state over a remote endpoint instead of starting from an empty state.
///
/// If you want to fetch state from a specific block number, see --fork-block-number.
Expand Down Expand Up @@ -190,6 +198,10 @@ impl Provider for EvmArgs {
dict.insert("eth_rpc_url".to_string(), fork_url.clone().into());
}

if self.accept_invalid_certs {
dict.insert("eth_rpc_accept_invalid_certs".to_string(), self.accept_invalid_certs.into());
}

Ok(Map::from([(Config::selected_profile(), dict)]))
}
}
Expand Down
8 changes: 4 additions & 4 deletions crates/common/src/provider/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,15 @@ pub type RetryProviderWithSigner<N = AnyNetwork> = FillProvider<
/// ```
#[inline]
#[track_caller]
pub fn get_http_provider(builder: impl AsRef<str>) -> RetryProvider {
try_get_http_provider(builder).unwrap()
pub fn get_http_provider(builder: impl AsRef<str>, accept_invalid_certs: bool) -> RetryProvider {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should not be there

try_get_http_provider(builder, accept_invalid_certs).unwrap()
}

/// Constructs a provider with a 100 millisecond interval poll if it's a localhost URL (most likely
/// an anvil or other dev node) and with the default, or 7 second otherwise.
#[inline]
pub fn try_get_http_provider(builder: impl AsRef<str>) -> Result<RetryProvider> {
ProviderBuilder::new(builder.as_ref()).build()
pub fn try_get_http_provider(builder: impl AsRef<str>, accept_invalid_certs: bool) -> Result<RetryProvider> {
ProviderBuilder::new(builder.as_ref()).accept_invalid_certs(accept_invalid_certs).build()
}

/// Helper type to construct a `RetryProvider`
Expand Down
2 changes: 1 addition & 1 deletion crates/evm/core/src/backend/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2044,7 +2044,7 @@ mod tests {
async fn can_read_write_cache() {
let Some(endpoint) = ENDPOINT else { return };

let provider = get_http_provider(endpoint);
let provider = get_http_provider(endpoint, false);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same


let block_num = provider.get_block_number().await.unwrap();

Expand Down
2 changes: 1 addition & 1 deletion crates/evm/core/src/fork/database.rs
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ mod tests {
#[tokio::test(flavor = "multi_thread")]
async fn fork_db_insert_basic_default() {
let rpc = foundry_test_utils::rpc::next_http_rpc_endpoint();
let provider = get_http_provider(rpc.clone());
let provider = get_http_provider(rpc.clone(), false);
let meta = BlockchainDbMeta::new(Default::default(), rpc);

let db = BlockchainDb::new(meta, None);
Expand Down
1 change: 1 addition & 0 deletions crates/evm/core/src/fork/multi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,7 @@ async fn create_fork(mut fork: CreateFork) -> eyre::Result<(ForkId, CreatedFork,
.maybe_initial_backoff(fork.evm_opts.fork_retry_backoff)
.maybe_headers(fork.evm_opts.fork_headers.clone())
.compute_units_per_second(fork.evm_opts.get_compute_units_per_second())
.accept_invalid_certs(fork.evm_opts.eth_rpc_accept_invalid_certs)
.build()?,
);

Expand Down
5 changes: 5 additions & 0 deletions crates/evm/core/src/opts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ pub struct EvmOpts {

/// The CREATE2 deployer's address.
pub create2_deployer: Address,

/// Whether to accept invalid certificates for the rpc server.
pub eth_rpc_accept_invalid_certs: bool,
}

impl Default for EvmOpts {
Expand All @@ -107,6 +110,7 @@ impl Default for EvmOpts {
enable_tx_gas_limit: false,
networks: NetworkConfigs::default(),
create2_deployer: DEFAULT_CREATE2_DEPLOYER,
eth_rpc_accept_invalid_certs: false,
}
}
}
Expand All @@ -129,6 +133,7 @@ impl EvmOpts {
pub async fn fork_evm_env(&self, fork_url: &str) -> eyre::Result<(crate::Env, AnyRpcBlock)> {
let provider = ProviderBuilder::new(fork_url)
.compute_units_per_second(self.get_compute_units_per_second())
.accept_invalid_certs(self.eth_rpc_accept_invalid_certs)
.build()?;
environment(
&provider,
Expand Down
7 changes: 4 additions & 3 deletions crates/script/src/broadcast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ pub async fn next_nonce(
caller: Address,
provider_url: &str,
block_number: Option<u64>,
accept_invalid_certs: bool,
) -> eyre::Result<u64> {
let provider = try_get_http_provider(provider_url)
let provider = try_get_http_provider(provider_url, accept_invalid_certs)
.wrap_err_with(|| format!("bad fork_url provider: {provider_url}"))?;

let block_id = block_number.map_or(BlockId::latest(), BlockId::number);
Expand Down Expand Up @@ -192,7 +193,7 @@ impl BundledState {
.enumerate()
.map(|(sequence_idx, sequence)| async move {
let rpc_url = sequence.rpc_url();
let provider = Arc::new(get_http_provider(rpc_url));
let provider = Arc::new(get_http_provider(rpc_url, self.args.evm.accept_invalid_certs));
progress_ref
.wait_for_pending(
sequence_idx,
Expand Down Expand Up @@ -268,7 +269,7 @@ impl BundledState {
for i in 0..self.sequence.sequences().len() {
let mut sequence = self.sequence.sequences_mut().get_mut(i).unwrap();

let provider = Arc::new(try_get_http_provider(sequence.rpc_url())?);
let provider = Arc::new(try_get_http_provider(sequence.rpc_url(),self.args.evm.accept_invalid_certs)?);
let already_broadcasted = sequence.receipts.len();

let seq_progress = progress.get_sequence_progress(i, sequence);
Expand Down
4 changes: 2 additions & 2 deletions crates/script/src/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ impl BuildData {
pub async fn link(self, script_config: &ScriptConfig) -> Result<LinkedBuildData> {
let create2_deployer = script_config.evm_opts.create2_deployer;
let can_use_create2 = if let Some(fork_url) = &script_config.evm_opts.fork_url {
let provider = try_get_http_provider(fork_url)?;
let provider = try_get_http_provider(fork_url, script_config.config.eth_rpc_accept_invalid_certs)?;
let deployer_code = provider.get_code_at(create2_deployer).await?;

!deployer_code.is_empty()
Expand Down Expand Up @@ -260,7 +260,7 @@ impl CompiledState {
None
} else {
let fork_url = self.script_config.evm_opts.fork_url.clone().ok_or_eyre("Missing --fork-url field, if you were trying to broadcast a multi-chain sequence, please use --multi flag")?;
let provider = Arc::new(try_get_http_provider(fork_url)?);
let provider = Arc::new(try_get_http_provider(fork_url, self.args.evm.accept_invalid_certs)?);
Some(provider.get_chain_id().await?)
};

Expand Down
6 changes: 3 additions & 3 deletions crates/script/src/execute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -234,9 +234,9 @@ impl RpcData {
}

/// Checks if all RPCs support EIP-3855. Prints a warning if not.
async fn check_shanghai_support(&self) -> Result<()> {
async fn check_shanghai_support(&self, accept_invalid_certs: bool) -> Result<()> {
let chain_ids = self.total_rpcs.iter().map(|rpc| async move {
let provider = get_http_provider(rpc);
let provider = get_http_provider(rpc, accept_invalid_certs);
let id = provider.get_chain_id().await.ok()?;
NamedChain::try_from(id).ok()
});
Expand Down Expand Up @@ -307,7 +307,7 @@ impl ExecutedState {
)
}
}
rpc_data.check_shanghai_support().await?;
rpc_data.check_shanghai_support(self.args.evm.accept_invalid_certs).await?;

Ok(PreSimulationState {
args: self.args,
Expand Down
6 changes: 3 additions & 3 deletions crates/script/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ impl ScriptArgs {
if let Some(sender) = self.maybe_load_private_key()? {
evm_opts.sender = sender;
}
evm_opts.eth_rpc_accept_invalid_certs = config.eth_rpc_accept_invalid_certs;

let script_config = ScriptConfig::new(config, evm_opts).await?;

Expand All @@ -243,7 +244,6 @@ impl ScriptArgs {
/// Executes the script
pub async fn run_script(self) -> Result<()> {
trace!(target: "script", "executing script command");

let state = self.preprocess().await?;
let create2_deployer = state.script_config.evm_opts.create2_deployer;
let compiled = state.compile()?;
Expand Down Expand Up @@ -584,7 +584,7 @@ pub struct ScriptConfig {
impl ScriptConfig {
pub async fn new(config: Config, evm_opts: EvmOpts) -> Result<Self> {
let sender_nonce = if let Some(fork_url) = evm_opts.fork_url.as_ref() {
next_nonce(evm_opts.sender, fork_url, evm_opts.fork_block_number).await?
next_nonce(evm_opts.sender, fork_url, evm_opts.fork_block_number, config.eth_rpc_accept_invalid_certs).await?
} else {
// dapptools compatibility
1
Expand All @@ -595,7 +595,7 @@ impl ScriptConfig {

pub async fn update_sender(&mut self, sender: Address) -> Result<()> {
self.sender_nonce = if let Some(fork_url) = self.evm_opts.fork_url.as_ref() {
next_nonce(sender, fork_url, None).await?
next_nonce(sender, fork_url, None, self.config.eth_rpc_accept_invalid_certs).await?
} else {
// dapptools compatibility
1
Expand Down
7 changes: 4 additions & 3 deletions crates/script/src/providers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ impl ProvidersManager {
&mut self,
rpc: &str,
is_legacy: bool,
accept_invalid_certs: bool,
) -> Result<&ProviderInfo> {
Ok(match self.inner.entry(rpc.to_string()) {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => {
let info = ProviderInfo::new(rpc, is_legacy).await?;
let info = ProviderInfo::new(rpc, is_legacy, accept_invalid_certs).await?;
entry.insert(info)
}
})
Expand Down Expand Up @@ -52,8 +53,8 @@ pub enum GasPrice {
}

impl ProviderInfo {
pub async fn new(rpc: &str, mut is_legacy: bool) -> Result<Self> {
let provider = Arc::new(get_http_provider(rpc));
pub async fn new(rpc: &str, mut is_legacy: bool, accept_invalid_certs: bool) -> Result<Self> {
let provider = Arc::new(get_http_provider(rpc, accept_invalid_certs));
let chain = provider.get_chain_id().await?;

if let Some(chain) = Chain::from(chain).named() {
Expand Down
2 changes: 1 addition & 1 deletion crates/script/src/simulate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ impl FilledTransactionsState {

while let Some(mut tx) = txes_iter.next() {
let tx_rpc = tx.rpc.to_owned();
let provider_info = manager.get_or_init_provider(&tx.rpc, self.args.legacy).await?;
let provider_info = manager.get_or_init_provider(&tx.rpc, self.args.legacy, self.args.evm.accept_invalid_certs).await?;

if let Some(tx) = tx.tx_mut().as_unsigned_mut() {
// Handles chain specific requirements for unsigned transactions.
Expand Down
2 changes: 1 addition & 1 deletion crates/test-utils/src/script.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ impl ScriptTester {

let mut provider = None;
if let Some(endpoint) = endpoint {
provider = Some(get_http_provider(endpoint))
provider = Some(get_http_provider(endpoint, false))
}

Self {
Expand Down