Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
b0ac83f
chore(deps): bump the cargo group across 1 directory with 2 updates
dependabot[bot] Oct 16, 2025
b8cc959
Update crates/verify/src/provider.rs
Dargon789 Oct 21, 2025
6516b9d
Update crates/doc/src/writer/as_doc.rs
Dargon789 Oct 21, 2025
75202d5
Update as_doc.rs (#235)
Dargon789 Nov 5, 2025
60f2af5
Merge branch 'master' into foundry/main
Dargon789 Jan 1, 2026
7ee8b93
Merge remote-tracking branch 'upstream/master' into foundry/main
googleworkspace-bot Apr 14, 2026
b68fd5c
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 Apr 21, 2026
84370ca
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 Apr 22, 2026
c03610c
Update crates/cli/src/utils/suggestions.rs
Dargon789 Apr 28, 2026
923a3cf
Update crates/common/src/contracts.rs
Dargon789 Apr 28, 2026
be84951
fix(forge): adjust gas assertion CounterWithFallback (foundry-rs#1446…
Dargon789 Apr 28, 2026
39c9da4
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 Apr 28, 2026
c29ac8a
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 Apr 29, 2026
9a1e90c
Merge remote-tracking branch 'upstream/master' into foundry/main
googleworkspace-bot May 2, 2026
316cffe
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 May 7, 2026
5bf3167
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 May 13, 2026
8b158fc
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 May 20, 2026
435c0ca
Merge branch 'foundry-rs:master' into foundry/main
Dargon789 Jun 11, 2026
df4f3be
Merge branch 'master' into foundry/main
googleworkspace-bot Jun 16, 2026
2de52dc
Update benches/src/lib.rs
Dargon789 Jun 16, 2026
c8f1a72
Update crates/lint/src/linter.rs
Dargon789 Jun 16, 2026
b02f1b5
Update crates/lint/src/linter.rs
Dargon789 Jun 16, 2026
d0dd93e
Update .github/ISSUE_TEMPLATE/bug_report.md
Dargon789 Jun 16, 2026
694b35f
fix(debugger): identify forked script contracts (#15185)
figtracer Jun 16, 2026
92eba24
test: clarify expect emit mismatch output (#15194)
decofe Jun 16, 2026
4b0f1f4
chore(script): remove redundant debug bytecode guard (#15196)
mablr Jun 16, 2026
27717f4
feat(lint): add `incorrect_modifier` (#15201)
mablr Jun 16, 2026
1b68c86
fix(chisel): remove unused `latest` variable in next_cached_session (…
strmfos Jun 17, 2026
0e52657
feat(fuzz): update invariant pulse metrics (#15198)
mablr Jun 17, 2026
de46fff
fix(debugger): match internal variables by signature (#15200)
figtracer Jun 17, 2026
e389837
fix(anvil): support onlyTopLevelCall tracer config (#15199)
figtracer Jun 17, 2026
7edb97e
chore: pin Tempo main (#15209)
decofe Jun 17, 2026
11c72ae
feat(debugger): add opcode search to TUI (#15211)
figtracer Jun 17, 2026
3f449c3
fix(verify): print Sourcify job UI URL instead of status API URL on s…
manuelwedler Jun 17, 2026
0874730
feat(cast): add Tempo receive policy cast tooling (#15195)
figtracer Jun 17, 2026
46ba762
feat: add T6 admin access key authorization tooling (#15193)
stevencartavia Jun 17, 2026
10e906c
feat(common): resolve fee token on chain (#15161)
mablr Jun 17, 2026
40495e3
Merge branch 'master' into foundry/main
googleworkspace-bot Jun 18, 2026
e496db4
Merge branch 'main' into foundry/main
googleworkspace-bot Jun 18, 2026
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
93 changes: 47 additions & 46 deletions Cargo.lock

Large diffs are not rendered by default.

20 changes: 10 additions & 10 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -507,17 +507,17 @@ mpp = { git = "https://github.com/tempoxyz/mpp-rs", rev = "9de5344a961c13dd4b201
"reqwest-rustls-tls",
"ws",
] }
tempo-chainspec = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38", default-features = false }
tempo-primitives = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38", default-features = false, features = [
tempo-chainspec = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c", default-features = false }
tempo-primitives = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c", default-features = false, features = [
"serde",
] }
tempo-alloy = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38", default-features = false }
tempo-evm = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38", default-features = false }
tempo-revm = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38", default-features = false, features = [
tempo-alloy = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c", default-features = false }
tempo-evm = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c", default-features = false }
tempo-revm = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c", default-features = false, features = [
"serde",
] }
tempo-contracts = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38" }
tempo-precompiles = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38" }
tempo-contracts = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c" }
tempo-precompiles = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c" }

## Pinned dependencies. Enabled for the workspace in crates/test-utils.

Expand Down Expand Up @@ -594,9 +594,9 @@ alloy-op-hardforks = { git = "https://github.com/foundry-rs/optimism", branch =
foundry-fork-db = { git = "https://github.com/foundry-rs/foundry-core", rev = "ba6246789fc12cf8fe78aa74aadf31d663f08c1f" }

## tempo — unify crates.io versions (pulled by mpp/foundry-wallets) with git rev
tempo-primitives = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38" }
tempo-alloy = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38" }
tempo-contracts = { git = "https://github.com/tempoxyz/tempo", rev = "563fc42578a9920067d129b0f191250e3a616a38" }
tempo-primitives = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c" }
tempo-alloy = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c" }
tempo-contracts = { git = "https://github.com/tempoxyz/tempo", rev = "2cf84002140367ff6de3268e5bf39972b8a0dc6c" }

# solar
solar = { package = "solar-compiler", git = "https://github.com/paradigmxyz/solar", rev = "da6b0c3a8c0edd23f8b1414c61418ba78d6c4670" }
Expand Down
29 changes: 21 additions & 8 deletions crates/anvil/src/eth/backend/mem/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ use alloy_rpc_types::{
trace::{
filter::TraceFilter,
geth::{
FourByteFrame, GethDebugBuiltInTracerType, GethDebugTracerType,
GethDebugTracingCallOptions, GethDebugTracingOptions, GethTrace, NoopFrame,
TraceResult,
CallConfig, FourByteFrame, GethDebugBuiltInTracerType, GethDebugTracerConfig,
GethDebugTracerType, GethDebugTracingCallOptions, GethDebugTracingOptions, GethTrace,
NoopFrame, TraceResult,
},
parity::{LocalizedTransactionTrace, TraceResultsWithTransactionHash, TraceType},
},
Expand Down Expand Up @@ -184,7 +184,7 @@ use tempo_chainspec::hardfork::TempoHardfork;
use tempo_evm::evm::TempoEvmFactory;
use tempo_precompiles::{
TIP_FEE_MANAGER_ADDRESS, extend_tempo_precompiles,
storage::StorageCtx,
storage::{StorageActions, StorageCtx},
tip_fee_manager::{IFeeManager, TipFeeManager},
tip20::{ISSUER_ROLE, ITIP20, TIP20Token},
};
Expand Down Expand Up @@ -216,6 +216,20 @@ pub const MIN_TRANSACTION_GAS: u128 = 21000;
// Gas per transaction creating a contract.
pub const MIN_CREATE_GAS: u128 = 53000;

fn call_config_from_tracer_config(
tracer_config: GethDebugTracerConfig,
) -> Result<CallConfig, serde_json::Error> {
let mut tracer_config = tracer_config.into_json();
if let Some(config) = tracer_config.as_object_mut()
&& !config.contains_key("onlyTopCall")
&& let Some(only_top_level_call) = config.remove("onlyTopLevelCall")
{
config.insert("onlyTopCall".to_string(), only_top_level_call);
}

GethDebugTracerConfig(tracer_config).into_call_config()
}

pub type State = foundry_evm::utils::StateChangeset;

/// A block request, which includes the Pool Transactions if it's Pending
Expand Down Expand Up @@ -1177,7 +1191,7 @@ impl<N: Network> Backend<N> {
cfg_env: &CfgEnv<TempoHardfork>,
) {
self.inject_precompiles(precompiles);
extend_tempo_precompiles(precompiles, cfg_env);
extend_tempo_precompiles(precompiles, cfg_env, StorageActions::disabled());
}

/// Creates a concrete EVM, injects precompiles, transacts, and returns the result mapped
Expand Down Expand Up @@ -2975,8 +2989,7 @@ where
return match tracer {
GethDebugTracerType::BuiltInTracer(tracer) => match tracer {
GethDebugBuiltInTracerType::CallTracer => {
let call_config = tracer_config
.into_call_config()
let call_config = call_config_from_tracer_config(tracer_config)
.map_err(|e| RpcError::invalid_params(e.to_string()))?;

let mut inspector = self.build_inspector().with_tracing_config(
Expand Down Expand Up @@ -3640,7 +3653,7 @@ where
return Ok(res);
}
GethDebugBuiltInTracerType::CallTracer => {
return match tracer_config.into_call_config() {
return match call_config_from_tracer_config(tracer_config) {
Ok(call_config) => {
let inspector = TracingInspector::new(
TracingInspectorConfig::from_geth_call_config(&call_config),
Expand Down
6 changes: 6 additions & 0 deletions crates/anvil/src/eth/backend/tempo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ pub struct AnvilStorageProvider<'a> {
gas_used: u64,
gas_refunded: i64,
reservoir: u64,
tip1060_storage_credits_enabled: bool,
transient: HashMap<(Address, U256), U256>,
hardfork: TempoHardfork,
}
Expand All @@ -66,6 +67,7 @@ impl<'a> AnvilStorageProvider<'a> {
gas_used: 0,
gas_refunded: 0,
reservoir: 0,
tip1060_storage_credits_enabled: hardfork.is_t7(),
transient: HashMap::new(),
hardfork,
}
Expand Down Expand Up @@ -205,6 +207,10 @@ impl PrecompileStorageProvider for AnvilStorageProvider<'_> {
fn amsterdam_eip8037_enabled(&self) -> bool {
false
}

fn set_tip1060_storage_credits(&mut self, enabled: bool) {
self.tip1060_storage_credits_enabled = enabled && self.hardfork.is_t7();
}
}

/// Initialize Tempo precompiles and fee tokens for Anvil.
Expand Down
59 changes: 59 additions & 0 deletions crates/anvil/tests/it/traces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,65 @@ async fn test_call_tracer_debug_trace_call() {
}
}

let receipt = internal_call_tx_builder.send().await.unwrap().get_receipt().await.unwrap();
let internal_call_tx_hash = receipt.transaction_hash;
let trace_provider = handle.http_provider();

let internal_call_tx_traces: GethTrace = trace_provider
.raw_request(
"debug_traceTransaction".into(),
(
internal_call_tx_hash,
serde_json::json!({
"tracer": "callTracer",
"tracerConfig": {
"withLog": true
}
}),
),
)
.await
.unwrap();

match internal_call_tx_traces {
GethTrace::CallTracer(call_frame) => {
assert_eq!(call_frame.calls.len(), 1);
assert_eq!(
call_frame.calls.first().unwrap().to.unwrap(),
*simple_storage_contract.address()
);
}
_ => {
unreachable!()
}
}

let internal_call_only_top_level_call_tx_traces: GethTrace = trace_provider
.raw_request(
"debug_traceTransaction".into(),
(
internal_call_tx_hash,
serde_json::json!({
"tracer": "callTracer",
"tracerConfig": {
"onlyTopLevelCall": true,
"withLog": true
}
}),
),
)
.await
.unwrap();

match internal_call_only_top_level_call_tx_traces {
GethTrace::CallTracer(call_frame) => {
assert!(call_frame.calls.is_empty());
}
_ => {
unreachable!()
}
}

// directly calling the SimpleStorage contract should not result in any internal calls
let direct_call_tx = TransactionRequest::default()
.from(wallets[1].address())
Expand Down
1 change: 1 addition & 0 deletions crates/cast/src/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,7 @@ pub async fn run_command(args: CastArgs) -> Result<()> {
CastSubcommand::TxPool { command } => command.run().await?,
CastSubcommand::Erc20Token { command } => command.run().await?,
CastSubcommand::Tip20Token { command } => command.run().await?,
CastSubcommand::ReceivePolicy { command } => command.run().await?,
CastSubcommand::Keychain { command } => command.run().await?,
CastSubcommand::KeyAuthorization { command } => command.run().await?,
CastSubcommand::Tempo { command } => command.run().await?,
Expand Down
36 changes: 23 additions & 13 deletions crates/cast/src/cmd/batch_mktx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ use foundry_cli::{
utils::{self, LoadConfig, maybe_print_resolved_lane, resolve_lane},
};
use foundry_common::{
FoundryTransactionBuilder, provider::ProviderBuilder, tempo::maybe_print_resolved_fee_token,
FoundryTransactionBuilder,
provider::ProviderBuilder,
tempo::{maybe_print_fee_token, resolve_and_set_fee_token},
};
use foundry_wallets::{TempoAccessKeyConfig, WalletOpts, WalletSigner};
use tempo_alloy::TempoNetwork;
Expand Down Expand Up @@ -133,29 +135,33 @@ impl BatchMakeTxArgs {
}

let from = eth.wallet.from.unwrap_or(Address::ZERO);
let (tx, _) = tx_builder.build(from).await?;
let (mut tx, _) = tx_builder.build(from).await?;
maybe_print_resolved_lane(resolved_lane.as_ref(), tx.nonce().unwrap_or_default())?;
maybe_print_resolved_fee_token(
let fee_token = resolve_and_set_fee_token(
(!config.eth_rpc_curl).then_some(&provider),
Some(chain),
tx.fee_token(),
&mut tx,
Some(from),
)
.await?;
maybe_print_fee_token((!config.eth_rpc_curl).then_some(&provider), fee_token).await?;
let raw_tx =
alloy_primitives::hex::encode_prefixed(tx.build_unsigned()?.encoded_for_signing());
sh_println!("{raw_tx}")?;
return Ok(());
}

if ethsign {
let (tx, _) = tx_builder.build(config.sender).await?;
let (mut tx, _) = tx_builder.build(config.sender).await?;
maybe_print_resolved_lane(resolved_lane.as_ref(), tx.nonce().unwrap_or_default())?;
maybe_print_resolved_fee_token(
let fee_token = resolve_and_set_fee_token(
(!config.eth_rpc_curl).then_some(&provider),
Some(chain),
tx.fee_token(),
&mut tx,
Some(config.sender),
)
.await?;
maybe_print_fee_token((!config.eth_rpc_curl).then_some(&provider), fee_token).await?;
let signed_tx = provider.sign_transaction(tx).await?;
sh_println!("{signed_tx}")?;
return Ok(());
Expand All @@ -168,15 +174,17 @@ impl BatchMakeTxArgs {
};

let signed_tx = if let Some(ref access_key) = tempo_access_key {
let (tx, _) =
let (mut tx, _) =
tx_builder.build_with_access_key(access_key.wallet_address, access_key).await?;
maybe_print_resolved_lane(resolved_lane.as_ref(), tx.nonce().unwrap_or_default())?;
maybe_print_resolved_fee_token(
let fee_token = resolve_and_set_fee_token(
(!config.eth_rpc_curl).then_some(&provider),
Some(chain),
tx.fee_token(),
&mut tx,
Some(access_key.wallet_address),
)
.await?;
maybe_print_fee_token((!config.eth_rpc_curl).then_some(&provider), fee_token).await?;
let raw_tx = tx
.sign_with_access_key(
&provider,
Expand All @@ -189,14 +197,16 @@ impl BatchMakeTxArgs {
alloy_primitives::hex::encode(raw_tx)
} else {
tx::validate_from_address(eth.wallet.from, Signer::address(&signer))?;
let (tx, _) = tx_builder.build(&signer).await?;
let (mut tx, _) = tx_builder.build(&signer).await?;
maybe_print_resolved_lane(resolved_lane.as_ref(), tx.nonce().unwrap_or_default())?;
maybe_print_resolved_fee_token(
let fee_token = resolve_and_set_fee_token(
(!config.eth_rpc_curl).then_some(&provider),
Some(chain),
tx.fee_token(),
&mut tx,
Some(Signer::address(&signer)),
)
.await?;
maybe_print_fee_token((!config.eth_rpc_curl).then_some(&provider), fee_token).await?;
let envelope = tx.build(&EthereumWallet::new(signer)).await?;
alloy_primitives::hex::encode(envelope.encoded_2718())
};
Expand Down
3 changes: 3 additions & 0 deletions crates/cast/src/cmd/batch_send.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ impl BatchSendArgs {
provider,
tx,
Some(chain),
None,
send_tx.cast_async,
send_tx.sync,
send_tx.confirmations,
Expand Down Expand Up @@ -174,6 +175,7 @@ impl BatchSendArgs {
&signer,
access_key,
Some(chain),
None,
send_tx.cast_async,
send_tx.confirmations,
timeout,
Expand All @@ -196,6 +198,7 @@ impl BatchSendArgs {
provider,
tx_request,
Some(chain),
None,
send_tx.cast_async,
send_tx.sync,
send_tx.confirmations,
Expand Down
Loading