Skip to content

Tempo signer lookup and access key signing#523

Merged
Dargon789 merged 397 commits into
hardhat-projectfrom
edr-reth
May 7, 2026
Merged

Tempo signer lookup and access key signing#523
Dargon789 merged 397 commits into
hardhat-projectfrom
edr-reth

Conversation

@Dargon789
Copy link
Copy Markdown
Owner

@Dargon789 Dargon789 commented May 6, 2026

Motivation

Solution

PR Checklist

  • Added Tests
  • Added Documentation
  • Breaking changes

Summary by Sourcery

Harden filesystem, artifact, and configuration handling across test utilities and npm tooling, introduce Tempo wallet and linting integrations, extend EVM/forge/cast functionality and dependencies, and add multiple CI/CD workflows, templates, and an example counter project.

New Features:

  • Add Tempo wallet lookup and access-key signing support for Tempo AA transactions.
  • Introduce a generic linting framework over Solar AST with early lint pass support.
  • Add a new cast CLI test covering beacon block root traces on Cancun.
  • Add a sample Foundry counter project with contract, script, tests, and CI configuration.

Bug Fixes:

  • Prevent test utility directory copying and benchmark cleanup from escaping a constrained base directory and avoid following unsafe paths or symlinks.
  • Ensure forge create warns and ignores constructor arguments when the target contract has no constructor.
  • Fix conditional compilation in Anvil tests by gating the state tests behind the appropriate feature flag.
  • Adjust optimism deposit handling in the Anvil in-memory backend to use the correct default value type.

Enhancements:

  • Record whether stdout is a TTY in test utilities and refine compile error handling and file locking patterns.
  • Strengthen npm registry URL handling by validating, normalizing, and restricting registry URLs to secure, non-loopback hosts.
  • Tighten npm artifact staging argument validation by constraining tool, platform, arch, and release identifiers to a safe character set.
  • Improve benchmark project cleanup to use canonicalized paths and skip suspicious entries.
  • Extend Comments utilities with a Vec-to-Comments conversion for easier usage.
  • Wire additional alloy and foundry crates into common, EVM, forge, and script crates to support new functionality.
  • Update deny configuration to allow additional internal git dependencies and adjust reth-related allowlist entries.

Build:

  • Add GitHub Actions workflows for Docker builds, Google GKE deployment, CodeQL analysis, Snyk container scans, APIsec scanning, and Foundry build/test/deploy.
  • Add multiple CircleCI configurations for Rust builds/tests, simple hello-world jobs, and example web3/game-fi workflows.
  • Add npm workflow steps to validate downloaded artifacts for suspicious paths before use.
  • Add a dedicated CI matrix job for building with no default features.

CI:

  • Introduce issue templates for bug reports, feature requests, and custom issues to standardize GitHub issue creation.
  • Add a Codesandbox tasks stub, git submodule definitions, and placeholder configs to support additional tooling.

Documentation:

  • Add a README describing usage of the example Foundry counter project.

Tests:

  • Add forge and cast CLI tests for the counter example project and Cancun beacon block traces.

Chores:

  • Vendor Remix testing Solidity libraries for assertions and accounts into the repository.

Dargon789 and others added 30 commits October 16, 2025 16:58
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.62.21 to 2.62.31.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](taiki-e/install-action@v2.62.21...0005e01)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.62.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [snyk/actions](https://github.com/snyk/actions) from 14818c4695ecc4045f33c9cee9e795a788711ca4 to 9adf32b1121593767fc3c057af55b55db032dc04.
- [Release notes](https://github.com/snyk/actions/releases)
- [Commits](snyk/actions@14818c4...9adf32b)

---
updated-dependencies:
- dependency-name: snyk/actions
  dependency-version: 9adf32b1121593767fc3c057af55b55db032dc04
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.62.31 to 2.62.33.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](taiki-e/install-action@0005e01...e43a502)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.62.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Dargon789 and others added 9 commits April 16, 2026 18:27
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
next Ready Ready Preview, Comment May 7, 2026 1:13am
react Ready Ready Preview, Comment May 7, 2026 1:13am

@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented May 6, 2026

Reviewer's Guide

Introduces security-hardening and ecosystem integration changes across test utilities, npm tooling, wallets, linting, CI workflows, and dependency configuration, plus a sample counter project and Remix artifacts.

Sequence diagram for Tempo signer lookup and access key signing

sequenceDiagram
    actor User
    participant WalletApi
    participant FileSystem
    participant TempoModule
    participant Signer

    User->>WalletApi: send_transaction(from, tx_request)
    WalletApi->>TempoModule: lookup_signer(from)
    TempoModule->>FileSystem: keys_path()
    FileSystem-->>TempoModule: keys_toml_path
    TempoModule->>FileSystem: read_to_string(path)
    FileSystem-->>TempoModule: contents
    TempoModule->>TempoModule: parse KeysFile and iterate KeyEntry
    alt matching_direct_entry
        TempoModule-->>WalletApi: TempoLookup_Direct(WalletSigner)
        WalletApi->>Signer: sign_standard(tx_request)
        Signer-->>WalletApi: signed_tx_bytes
    else matching_keychain_entry
        TempoModule->>TempoModule: decode_key_authorization(optional_hex)
        TempoModule-->>WalletApi: TempoLookup_Keychain(WalletSigner, TempoAccessKeyConfig)
        WalletApi->>TempoModule: sign_with_access_key(tx_request, signer, wallet_address)
        TempoModule->>TempoModule: build_aa(TempoTransactionRequest)
        TempoModule->>TempoModule: sig_hash = tempo_tx.signature_hash()
        TempoModule->>TempoModule: signing_hash = KeychainSignature.signing_hash(sig_hash, wallet_address)
        TempoModule->>Signer: sign_hash(signing_hash)
        Signer-->>TempoModule: raw_sig
        TempoModule->>TempoModule: keychain_sig = KeychainSignature.new(wallet_address, raw_sig)
        TempoModule->>TempoModule: aa_signed = tempo_tx.into_signed(Keychain(keychain_sig))
        TempoModule-->>WalletApi: encoded_eip2718_bytes
    end
    WalletApi-->>User: submit_signed_transaction_result
Loading

Class diagram for Tempo wallets integration module

classDiagram
    class KeysFile {
        +Vec~KeyEntry~ keys
    }

    class KeyEntry {
        +WalletType wallet_type
        +Address wallet_address
        +u64 chain_id
        +KeyType key_type
        +Option~Address~ key_address
        +Option~String~ key
        +Option~String~ key_authorization
        +Option~u64~ expiry
        +Vec~StoredTokenLimit~ limits
    }

    class StoredTokenLimit {
        +Address currency
        +String limit
    }

    class WalletType {
        <<enum>>
        +Local
        +Passkey
    }

    class KeyType {
        <<enum>>
        +Secp256k1
        +P256
        +WebAuthn
    }

    class TempoAccessKeyConfig {
        +Address wallet_address
        +Address key_address
        +Option~SignedKeyAuthorization~ key_authorization
    }

    class TempoLookup {
        <<enum>>
        +Direct(wallet_signer WalletSigner)
        +Keychain(wallet_signer WalletSigner, config TempoAccessKeyConfig)
        +NotFound
    }

    class TempoModule {
        <<module>>
        +Option~PathBuf~ keys_path()
        +SignedKeyAuthorization decode_key_authorization(hex_str String) Result
        +TempoLookup lookup_signer(from Address) Result
        +Vec~u8~ sign_with_access_key(tx_request TempoTransactionRequest, signer Signer, wallet_address Address) Result
    }

    class WalletSigner {
    }

    class Signer {
        <<trait>>
        +sign_hash(hash PrimitiveSignature) Future~Result~
    }

    class TempoTransactionRequest {
        +TempoTransactionRequest build_aa() Result
    }

    class KeychainSignature {
        +Hash signing_hash(sig_hash PrimitiveSignature, wallet_address Address)
        +KeychainSignature new(wallet_address Address, primitive PrimitiveSignature)
    }

    class PrimitiveSignature {
        <<enum>>
        +Secp256k1(raw_sig PrimitiveSignature)
    }

    class TempoSignature {
        <<enum>>
        +Keychain(keychain_sig KeychainSignature)
    }

    class SignedKeyAuthorization {
    }

    class Address {
    }

    class PathBuf {
    }

    class Result {
    }

    class Vec_u8 {
    }

    KeysFile "1" o-- "*" KeyEntry : contains
    KeyEntry "1" o-- "*" StoredTokenLimit : has

    TempoLookup ..> WalletSigner : variant_uses
    TempoLookup ..> TempoAccessKeyConfig : variant_uses

    TempoAccessKeyConfig ..> SignedKeyAuthorization : optional

    TempoModule ..> KeysFile : parses
    TempoModule ..> TempoLookup : returns
    TempoModule ..> TempoAccessKeyConfig : constructs
    TempoModule ..> KeychainSignature : signs_with
    TempoModule ..> TempoTransactionRequest : builds_from
    TempoModule ..> Signer : uses
    TempoModule ..> Address : identifies_wallet

    KeyEntry ..> WalletType : uses
    KeyEntry ..> KeyType : uses
Loading

Class diagram for linting framework abstractions

classDiagram
    class Linter {
        <<trait>>
        +Language Language
        +Lint Lint
        +lint(input Vec~PathBuf~) void
    }

    class Lint {
        <<trait>>
        +id() String
        +severity() Severity
        +description() String
        +help() String
    }

    class LintContext {
        -Session sess
        -bool desc
        +new(sess Session, with_description bool) LintContext
        +emit(lint Lint, span Span) void
    }

    class EarlyLintPass {
        <<trait>>
        +check_expr(ctx LintContext, expr Expr) void
        +check_item_struct(ctx LintContext, strukt ItemStruct) void
        +check_item_function(ctx LintContext, func ItemFunction) void
        +check_variable_definition(ctx LintContext, var VariableDefinition) void
    }

    class EarlyLintVisitor {
        +LintContext ctx
        +Vec~EarlyLintPass~ passes
        +visit_expr(expr Expr) ControlFlow
        +visit_variable_definition(var VariableDefinition) ControlFlow
        +visit_item_struct(strukt ItemStruct) ControlFlow
        +visit_item_function(func ItemFunction) ControlFlow
        +walk_expr(expr Expr) ControlFlow
        +walk_variable_definition(var VariableDefinition) ControlFlow
        +walk_item_struct(strukt ItemStruct) ControlFlow
        +walk_item_function(func ItemFunction) ControlFlow
    }

    class Visit {
        <<trait>>
        +visit_expr(expr Expr) ControlFlow
        +visit_variable_definition(var VariableDefinition) ControlFlow
        +visit_item_struct(strukt ItemStruct) ControlFlow
        +visit_item_function(func ItemFunction) ControlFlow
    }

    class Expr {
    }

    class ItemStruct {
    }

    class ItemFunction {
    }

    class VariableDefinition {
    }

    class Session {
        +dcx DiagnosticContext
    }

    class Severity {
        <<enum>>
    }

    class Span {
    }

    class PathBuf {
    }

    class DiagBuilder {
        +diag(severity Severity, message String) DiagBuilder
        +code(id DiagId) DiagBuilder
        +span(multi MultiSpan) DiagBuilder
        +help(message String) DiagBuilder
        +emit() void
    }

    class DiagnosticContext {
        +diag(severity Severity, message String) DiagBuilder
    }

    class MultiSpan {
        +from_span(span Span) MultiSpan
    }

    class DiagId {
        +new_str(id String) DiagId
    }

    class ControlFlow {
    }

    Linter ..> Lint : associated_type
    Linter ..> Language : associated_type

    LintContext ..> Session : holds
    LintContext ..> Lint : emits
    LintContext ..> Span : targets
    LintContext ..> DiagBuilder : builds
    LintContext ..> MultiSpan : wraps_span

    EarlyLintPass <|.. EarlyLintVisitor : uses_trait

    EarlyLintVisitor ..|> Visit : implements
    EarlyLintVisitor ..> EarlyLintPass : owns_passes
    EarlyLintVisitor ..> LintContext : holds

    Visit ..> Expr : visits
    Visit ..> ItemStruct : visits
    Visit ..> ItemFunction : visits
    Visit ..> VariableDefinition : visits
Loading

File-Level Changes

Change Details Files
Constrain test-utils filesystem operations to a fixed temp-based workspace and expose terminal detection flag.
  • Introduce TEST_UTIL_BASE to anchor all test utility filesystem paths under the system temp directory and pre-create the directory.
  • Add resolve_and_validate_under_base helper to canonicalize input paths, remap absolute paths under the base, and reject paths escaping the base.
  • Wrap copy_dir_filtered and its recursive helper to always operate on validated, canonicalized paths while still skipping build-artifact directories.
  • Expose IS_TTY LazyLock boolean for stdout is_terminal detection and adjust compiler error handling to use explicit panic instead of assert.
crates/test-utils/src/util.rs
Harden file copying in script tests against symlink traversal and path tricks.
  • Filter directory entries to operate only on regular files using symlink_metadata.
  • Skip entries with invalid or traversal-like file names containing .. or path separators.
  • Canonicalize candidate files and ensure they reside under from_dir before copying into the destination utilities directory.
crates/test-utils/src/script.rs
Tighten npm artifact and registry handling plus argument validation for staging scripts.
  • Add GitHub workflow step to validate downloaded artifacts directories, ensure they exist and are non-empty, and reject files with absolute or parent-traversal paths.
  • Wrap registry URL resolution to parse and validate as a URL, enforce https scheme, block obvious loopback hosts, and normalize the base URL without trailing slashes.
  • Introduce requireSafeIdentifier helper and use it for tool/platform/arch/release arguments in stage-from-artifact to restrict values to a safe identifier character set.
.github/workflows/npm.yml
npm/src/const.mjs
npm/scripts/stage-from-artifact.mjs
Integrate Tempo wallet/keychain support and signing path.
  • Add Tempo keys.toml parsing types and helpers to locate Tempo wallets under TEMPO_HOME or ~/.tempo.
  • Implement TempoLookup to distinguish direct EOA keys from keychain (access key) entries, creating WalletSigner instances for each.
  • Define TempoAccessKeyConfig to carry wallet/key addresses and optional decoded SignedKeyAuthorization from hex RLP.
  • Provide sign_with_access_key helper to build AA transactions, compute the keychain V2 signing hash, sign with the underlying signer, wrap into KeychainSignature/TempoSignature, and output EIP-2718-encoded bytes.
crates/wallets/src/tempo.rs
Introduce a generic linting infrastructure built on solar AST visitors.
  • Define a Linter trait parameterized by language and lint types with a lint entry point over paths.
  • Add Lint trait describing id, severity, description, and help for individual lint rules.
  • Provide LintContext wrapper over solar Session to emit diagnostics with lint metadata and optional descriptions.
  • Implement EarlyLintPass trait that mirrors solar_ast::visit::Visit hooks and an EarlyLintVisitor that dispatches those hooks to all registered passes while walking the AST.
crates/lint/src/linter.rs
Add a Cancun beacon block trace regression test and minor fixes in EVM/Anvil.
  • Add cast CLI test that exercises a Cancun beacon block root and asserts on the expected textual trace output for a specific mainnet transaction.
  • Adjust evm env tests imports to move Sealed under an optimism-gated module and add missing alloy-network dependency in Cargo.
  • Change Anvil in-memory backend to construct OpCallDepositInfo without default() in OP feature path.
crates/cast/tests/cli/main.rs
crates/evm/core/src/env.rs
crates/evm/evm/Cargo.toml
crates/anvil/src/eth/backend/mem/mod.rs
Tighten cleanup and constructor handling plus add convenience conversions in core Rust code.
  • Harden benchmark project cleanup by canonicalizing entries, ensuring they stay under the root path, and skipping suspicious paths before deleting.
  • Warn when forge create is given constructor args for a contract without a constructor and ignore the extraneous arguments.
  • Provide From<Vec> for doc Comments for easier construction from collected comment vectors.
  • Gate an anvil state integration test behind the cmd feature.
  • Remove an unnecessary cfg guard in a forge optimizer test and adjust other minor imports or types.
benches/src/lib.rs
crates/forge/src/cmd/create.rs
crates/doc/src/parser/comment.rs
crates/anvil/tests/it/main.rs
crates/forge/tests/cli/test_optimizer.rs
crates/common/Cargo.toml
crates/forge/Cargo.toml
Update dependency/deny configuration to support new Foundry and Reth forks.
  • Extend cargo-deny allow-git list to include new foundry-* and optimism repositories and a forked reth repository while dropping older entries.
  • Wire foundry-primitives, alloy-network, alloy-hardforks, and tempo-alloy into the appropriate Cargo crates to reflect new integrations.
deny.toml
crates/common/Cargo.toml
crates/evm/evm/Cargo.toml
crates/forge/Cargo.toml
crates/script/Cargo.toml
Add a small sample Foundry counter project and Remix test support artifacts.
  • Add a counter/ Foundry subproject including Counter.sol, deployment script, tests, config, and README.
  • Include forge-std and openzeppelin-contracts as submodules under the counter project libs.
  • Vendor Remix testing support contracts (remix_tests.sol and remix_accounts.sol) in .deps for potential integration.
counter/src/Counter.sol
counter/script/Counter.s.sol
counter/test/Counter.t.sol
counter/foundry.toml
counter/README.md
counter/.gitignore
counter/lib/forge-std
counter/lib/openzeppelin-contracts
.deps/remix-tests/remix_tests.sol
.deps/remix-tests/remix_accounts.sol
Introduce or expand CI/CD pipelines and security scanning across GitHub Actions and CircleCI.
  • Add multiple GitHub workflows for Docker builds, Snyk container scanning, CodeQL analysis, APIsec scanning, Foundry CI for the counter project, npm publish artifact validation, and a basic cargo build/test deploy workflow.
  • Introduce various CircleCI configs for Rust cargo CI, deployment examples, and web3-related sample jobs, albeit some appear templated or redundant.
  • Add a Google GKE build-and-deploy workflow for containerized deployment using Workload Identity Federation.
.github/workflows/npm.yml
.github/workflows/Docker.yml
.github/workflows/docker.yml
.github/workflows/snyk-container.yml
.github/workflows/codeql.yml
.github/workflows/apisec-scan.yml
.github/workflows/deploy.yml
.github/workflows/google.yml
counter/.github/workflows/test.yml
.circleci/config.yml
.circleci/ci.yml
.circleci/ci_v1.yml
.circleci/ci_cargo.yml
.circleci/cargo.yml
.circleci/ci_deploy.yml
.circleci/dev_stage.yml
.circleci/ci-web3-gamefi.yml
.circleci/web3_defi_gamefi.yml
Add generic GitHub issue templates and a few misc repo files.
  • Introduce GitHub issue templates for bug reports, feature requests, and a custom template placeholder.
  • Add sleep.json, .codesandbox/tasks.json, .gitmodules, and ensure CI jobs cover no-default-features in main workflow matrix.
  • Minor tweaks like adding IS_TTY and workflow matrix entry for no-default-features.
.github/ISSUE_TEMPLATE/bug_report.md
.github/ISSUE_TEMPLATE/feature_request.md
.github/ISSUE_TEMPLATE/custom.md
.github/workflows/ci.yml
.codesandbox/tasks.json
.gitmodules
sleep.json
crates/test-utils/src/util.rs

Possibly linked issues

  • Foundry/ethereum ux (#284) #289 #290 #291: The PR delivers the AST-based keccak256 gas lint infrastructure, path hardening, CI workflows, and counter sample requested.
  • Wagmi (e604566) #413: The PR is the concrete implementation of the AST-based keccak256 linting and associated refactors described in the issue.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@snyk-io
Copy link
Copy Markdown

snyk-io Bot commented May 6, 2026

Snyk checks have passed. No issues have been found so far.

Status Scan Engine Critical High Medium Low Total (0)
Open Source Security 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

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

Hey - I've found 3 issues, and left some high level feedback:

  • There are many new CI configs added (multiple CircleCI files and multiple Docker workflows, plus deploy/google/apisec/snyk pipelines) that look largely boilerplate or duplicated; consider consolidating these into a minimal, intentional set to avoid confusion and accidental coverage gaps.
  • The CircleCI configs under .circleci/ contain repeated workflows and jobs sections and some structurally invalid/unused blocks (e.g. jobs: nested under a workflows: key, stray - run: at top level in ci_deploy.yml), which will likely be ignored or break parsing; it would be better to normalize these into a single valid config.yml-style file.
  • In .github/workflows/google.yml, the branch filters use values like - '"main"'/'"master"' and the kustomize setup step curls a .tar.gz directly into an executable without extraction; please remove the extra quoting on branches and either unpack the tarball correctly or switch to a proper binary download URL.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- There are many new CI configs added (multiple CircleCI files and multiple Docker workflows, plus deploy/google/apisec/snyk pipelines) that look largely boilerplate or duplicated; consider consolidating these into a minimal, intentional set to avoid confusion and accidental coverage gaps.
- The CircleCI configs under `.circleci/` contain repeated `workflows` and `jobs` sections and some structurally invalid/unused blocks (e.g. `jobs:` nested under a `workflows:` key, stray `- run:` at top level in `ci_deploy.yml`), which will likely be ignored or break parsing; it would be better to normalize these into a single valid `config.yml`-style file.
- In `.github/workflows/google.yml`, the branch filters use values like `- '"main"'`/`'"master"'` and the kustomize setup step curls a `.tar.gz` directly into an executable without extraction; please remove the extra quoting on branches and either unpack the tarball correctly or switch to a proper binary download URL.

## Individual Comments

### Comment 1
<location path=".github/workflows/docker.yml" line_range="1" />
<code_context>
+name: Docker
+
+on:
</code_context>
<issue_to_address>
**issue (performance):** Having both `Docker.yml` and `docker.yml` with the same workflow name and triggers will cause duplicated runs.

Both `.github/workflows/Docker.yml` and `.github/workflows/docker.yml` define a `Docker` workflow with identical triggers, so each event will run the same build twice, wasting CI resources. Please consolidate into a single workflow file or differentiate them (name, triggers, or purpose) if both are needed.
</issue_to_address>

### Comment 2
<location path="crates/lint/src/linter.rs" line_range="22" />
<code_context>
+///
+/// # Required Methods
+///
+/// - `lint`: Scans the provided source files emitting a daignostic for lints found.
+pub trait Linter: Send + Sync + Clone {
+    type Language: Language;
</code_context>
<issue_to_address>
**nitpick (typo):** There are typos in the documentation (`daignostic`, `LintCotext`) that can hurt readability.

Please correct these spellings in the trait docs and related comments so the linter API documentation remains clear and consistent for users.

Suggested implementation:

```rust
    /// - `lint`: Scans the provided source files emitting a diagnostic for lints found.

```

Search the rest of `crates/lint/src/linter.rs` (and any closely related linter API files) for the misspelling `LintCotext` and replace it with `LintContext` in:
1. Trait and struct names (e.g., `trait LintCotext``trait LintContext`).
2. Type usages (e.g., function parameters, associated types, generics).
3. Documentation comments and inline comments.

Be careful to update both the definition and all references to avoid type mismatches.
</issue_to_address>

### Comment 3
<location path=".github/ISSUE_TEMPLATE/bug_report.md" line_range="27" />
<code_context>
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Browser [e.g. Chrome, safari]
+ - Version [e.g. 22]
+
</code_context>
<issue_to_address>
**nitpick (typo):** Capitalize "Safari" for consistency with proper noun usage.

Here, capitalize "Safari" to use the correct proper noun and keep browser names consistent.

```suggestion
 - OS: [e.g. iOS]
 - Browser [e.g. Chrome, Safari]
 - Version [e.g. 22]
```
</issue_to_address>

Fix all in Cursor


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread .github/workflows/docker.yml
Comment thread crates/lint/src/linter.rs
Comment thread .github/ISSUE_TEMPLATE/bug_report.md
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces various CI configurations, Solidity test libraries, and a sample Foundry project, alongside significant security hardening for filesystem and network operations to prevent directory traversal and SSRF. Feedback focuses on correcting invalid YAML syntax and duplicate keys in CircleCI files, removing redundant test steps, and addressing maintenance concerns regarding personal forks in the dependency policy. Additionally, the review points out unused imports, duplicate dependencies, and opportunities for minor code cleanup across the repository.

Comment thread .circleci/ci_deploy.yml
Comment thread .circleci/dev_stage.yml
Comment thread deny.toml
Comment thread .circleci/web3_defi_gamefi.yml
Comment thread .circleci/ci_cargo.yml
Comment thread .github/ISSUE_TEMPLATE/custom.md
Comment thread counter/script/Counter.s.sol
Comment thread crates/cli/src/utils/suggestions.rs
Comment thread crates/script/Cargo.toml
Comment thread .circleci/ci-web3-gamefi.yml
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>
@Dargon789 Dargon789 changed the title Edr reth Tempo signer lookup and access key signing May 7, 2026
@Dargon789 Dargon789 merged commit fc617f4 into hardhat-project May 7, 2026
16 of 19 checks passed
Dargon789 added a commit that referenced this pull request May 7, 2026
* chore(deps): bump strum from 0.27.2 to 0.28.0

Bumps [strum](https://github.com/Peternator7/strum) from 0.27.2 to 0.28.0.
- [Release notes](https://github.com/Peternator7/strum/releases)
- [Changelog](https://github.com/Peternator7/strum/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Peternator7/strum/compare/v0.27.2...v0.28.0)

---
updated-dependencies:
- dependency-name: strum
  dependency-version: 0.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update crates/script/src/simulate.rs

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>

* Update crates/anvil/server/src/handler.rs

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>

* fix(forge): adjust gas assertion CounterWithFallback (foundry-rs#14465 ) (#498)

* chore(deps): bump rui314/setup-mold from 725a8794d15fc7563f59595bd9556495c0564878 to 9c9c13bf4c3f1adef0cc596abc155580bcb04444 (#14442)

chore(deps): bump rui314/setup-mold

Bumps [rui314/setup-mold](https://github.com/rui314/setup-mold) from 725a8794d15fc7563f59595bd9556495c0564878 to 9c9c13bf4c3f1adef0cc596abc155580bcb04444.
- [Commits](https://github.com/rui314/setup-mold/compare/725a8794d15fc7563f59595bd9556495c0564878...9c9c13bf4c3f1adef0cc596abc155580bcb04444)

---
updated-dependencies:
- dependency-name: rui314/setup-mold
  dependency-version: 9c9c13bf4c3f1adef0cc596abc155580bcb04444
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Update flake.lock (#14458)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* fix(forge): adjust gas assertion `CounterWithFallback` (#14465)

* chore: update latest benchmarks (#14467)

* ci: split MPP e2e into its own workflow (#14468)

* ci: split MPP e2e into its own workflow

Move the MPP e2e step from ci-tempo.yml into a standalone ci-mpp.yml
workflow so transient HTTP 402 failures from the MPP RPC do not block
the Tempo CI workflow.

Amp-Thread-ID: https://ampcode.com/threads/T-019dceb8-61e5-734f-b047-17665b4ea7d3
Co-authored-by: Amp <amp@ampcode.com>

* ci: rename sanity-check job to tempo-check

Amp-Thread-ID: https://ampcode.com/threads/T-019dceb8-61e5-734f-b047-17665b4ea7d3
Co-authored-by: Amp <amp@ampcode.com>

* ci: rename mpp-e2e job to mpp-check

Amp-Thread-ID: https://ampcode.com/threads/T-019dceb8-61e5-734f-b047-17665b4ea7d3
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

* Improve GH actions (#14473)

* fix(benches): add repos + extra args support to prevent blocking errors (#14470)

* fix(benches): add repos + extra args support to prevent blocking errors

* fix(ci): set `inputs.repos` default to empty

* fix: remove `--verbose` flags

* fix: exclude `uniswap/v4-core` `TickMathTestTest`

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>

* chore(deps): bump strum from 0.27.2 to 0.28.0 (#509)

Bumps [strum](https://github.com/Peternator7/strum) from 0.27.2 to 0.28.0.
- [Release notes](https://github.com/Peternator7/strum/releases)
- [Changelog](https://github.com/Peternator7/strum/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Peternator7/strum/compare/v0.27.2...v0.28.0)

---
updated-dependencies:
- dependency-name: strum
  dependency-version: 0.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>

* gas-snapshot

* chore(deps): bump similar-asserts from 1.7.0 to 2.0.0 (#508)

Bumps [similar-asserts](https://github.com/mitsuhiko/similar-asserts) from 1.7.0 to 2.0.0.
- [Changelog](https://github.com/mitsuhiko/similar-asserts/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mitsuhiko/similar-asserts/compare/1.7.0...2.0.0)

---
updated-dependencies:
- dependency-name: similar-asserts
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* ci: sign release archives, docker images, and publish SBOMs  (#520)

* anvil: unify Tempo nonce markers across send RPCs (#14536)

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: steven <corderosteven6@gmail.com>
Co-authored-by: stevencartavia <112043913+stevencartavia@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fix(forge): `flaky_gas_report_fallback_with_calldata` deployment cost (#14545)

* chore(lint): add missing lints to README (#14551)

* chore(bench): update `benchmark.sh` (#14548)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* chore(clippy): fix for_kv_map and useless_borrows_in_formatting (#14554)

* chore(clippy): fix for_kv_map and useless_borrows_in_formatting

Amp-Thread-ID: https://ampcode.com/threads/T-019df0f9-62e7-74b8-bd5e-da2acce678fb
Co-authored-by: Amp <amp@ampcode.com>

* chore(clippy): drop redundant borrows in cheatcodes assert formatters

Amp-Thread-ID: https://ampcode.com/threads/T-019df0f9-62e7-74b8-bd5e-da2acce678fb
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

* fix(ci): use `PATH_USD` fallback fee token in Mail templates (#14546)

* chore(deps): bump the actions-weekly group with 3 updates (#14497)

* refactor(chisel): migrate to solar (#14532)

* feat(lint): add too-many-digits lint (#14549)

* feat: feature-gate optimism deps in common-fmt, common, cast (#14539)

* feat(forge): support per-test network selection via inline config (#14530)

* feat(cli): `--tempo.expires` retry-safe mode (TIP-1009 expiring nonces) (#14521)

* fix(forge): `per_test_network_routing` match undeterministic order (#14557)

output

* chore(ci): run tempo mainnet and testnet checks before devnet (#14556)

* Update flake.lock (#14553)

flake.lock: Update

Flake lock file updates:

• Updated input 'fenix':
    'github:nix-community/fenix/f374034' (2026-04-25)
  → 'github:nix-community/fenix/74c1591' (2026-05-02)
• Updated input 'fenix/rust-analyzer-src':
    'github:rust-lang/rust-analyzer/8954b66' (2026-04-21)
  → 'github:rust-lang/rust-analyzer/64cdaeb' (2026-05-01)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/01fbdee' (2026-04-23)
  → 'github:NixOS/nixpkgs/c6d6588' (2026-05-01)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* chore(bench): update benchmark results (#14552)

* fix(forge): ignore ETH_RPC_URL for test forking (#14555)

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* feat(cast): add Tempo keychain policy commands (#14531)

* feat(cast): add tempo keychain policy commands

* fix(cast): address keychain policy review

* fix(cli): fix jsonwebtoken panic (#14562)

`cast` panicked with this message coming from jsonwebtoken:

```
Call CryptoProvider::install_default() before this point to select a provider manually, or make sure exactly one of the
'rust_crypto' and 'aws_lc_rs' features is enabled.
See the documentation of the CryptoProvider type for more information.
```

This seemingly was introduced with the bump of jsonwebtoken to 10. Now
it requires you to pick one backend used by default controlled by the
compile time cargo features or call `CryptoProvider::install_default()`
at the beginning.

I realized that probably it would be better to just select the feature
and I picked `aws_lc_rs` as it seems to be increasingly a default and
we already are using the C toolchain.

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* chore(cli): tidy ETH_RPC_URL handling and add forge regression test (#14559)

Follow-up to #14555:

- Drop the redundant flashbots branch in RpcOpts::dict; self.url(None)
  already returns FLASHBOTS_URL when --flashbots is set, so the
  subsequent overwrite was dead code.
- Inline the resolve_rpc_url helper back into RpcCommonOpts::url; it
  was only called from one place and added unneeded surface area.
- Restore the doc comment on RpcCommonOpts and document why
  ETH_RPC_URL is intentionally not a clap env on the shared field
  (so EvmArgs cannot inherit it).
- Add an integration test that runs forge config with ETH_RPC_URL set
  in the environment and asserts that eth_rpc_url stays None,
  directly exercising the regression scenario from #14538.

Amp-Thread-ID: https://ampcode.com/threads/T-019df243-267f-7779-93e1-5d6686082444

Co-authored-by: zerosnacks <zerosnacks@protonmail.com>
Co-authored-by: Amp <amp@ampcode.com>

* feat(cast): open Tempo wallet fund flow for MPP failures (#14505)

* feat(cast): open Tempo wallet fund flow for MPP failures

* ci(tempo): skip network checks without rpc secrets

* Revert "ci(tempo): skip network checks without rpc secrets"

This reverts commit f8dd70163f850b854888fd1c962174e1663284f4.

* fix(common): address mpp funding review

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* ci: sign release archives, docker images, and publish SBOMs (#14563)

- release.yml: emit per-archive sha256 + SPDX SBOM (Syft), cosign
  keyless sign-blob of the archive, and use actions/attest@v4 for both
  build provenance and SBOM attestations. Upload all artifacts to the
  draft release.
- docker-publish.yml: enable BuildKit SBOM, capture the build digest,
  cosign keyless sign each pushed tag, and publish a Sigstore-signed
  SLSA provenance attestation via actions/attest with push-to-registry.
- SECURITY.md: document how external users verify archives and the
  docker image (gh attestation, cosign, plain sha256, buildx imagetools).
- README.md: link to the new verification section.

* perf(common): short-circuit `find_by_name_or_identifier` instead of `collect` (#14514)

* feat(foundryup): retry GitHub API fetches on transient errors (#14566)

GitHub api.github.com occasionally returns transient 403s on certain VMs
(per-IP rate limiting / WAF hiccups), causing foundryup to fail to
resolve the latest stable / nightly release tag, e.g.:

  foundryup: fetching latest nightly releases from foundry-rs/foundry...
  Error: curl: (56) The requested URL returned error: 403
  foundryup: failed to fetch releases from GitHub API

Add curl/wget retry logic to the `fetch` helper (used exclusively for
GitHub API releases endpoints):

- curl: --retry 5 --retry-delay 2 --retry-max-time 60, plus
  --retry-all-errors when supported (curl 7.71+, feature-detected so
  older curl does not hard-fail). --retry-all-errors is required to
  retry HTTP 403, which is not in curl's default retryable set.
- wget fallback: --tries=5 --waitretry=2
  --retry-on-http-error=403,408,429,5xx.

`fetch` now buffers to a temp file before emitting to stdout, since
curl's --retry-all-errors is unsafe with piped consumers (mid-stream
retries can duplicate bytes). Existing callers pipe into awk/grep.

Tunable via FOUNDRYUP_MAX_RETRIES (default 5).

`download` (binary tarballs, attestations, manpages) is intentionally
left unchanged — those rarely fail and changing them affects the
attestation existence check semantics.

Bumps installer version 1.8.1 -> 1.8.2.


Amp-Thread-ID: https://ampcode.com/threads/T-019df2f5-9b97-717a-b959-cf7cbc7ca3bb

Co-authored-by: Amp <amp@ampcode.com>

* feat(lint): project-wide passes + pragma-inconsistent (#14543)

* feat(lint): project-wide passes + pragma-inconsistent

* rm hashset, msg

* test(lint): exhaustive pragma-inconsistent coverage + clearer testdata names (#14561)

* test(lint): exhaustive coverage for pragma-inconsistent

Follow-up to #14543 expanding test coverage for the cross-file
`pragma-inconsistent` lint across the syntax variants users encounter
in real Solidity projects.

Multi-file scenarios (added as `forgetest!` cases in
`crates/forge/tests/cli/lint.rs`, since they cannot be expressed in a
single `.sol` testdata file):

- Negative (must NOT warn):
  - all files use the same exact pragma (`0.8.20`)
  - all files use the same caret pragma (`^0.8.20`)
  - single file in the project
- Positive (must warn):
  - duplicates among a conflict -- two identical files plus one
    different pragma still emits three warnings
- Mixed:
  - file without an explicit pragma uses the test-utils default
    (`add_raw_source` is used to bypass the auto-injected pragma)

Source bodies are pulled out into module-level `const` raw strings so
rustfmt does not collapse the inline `\n`-escaped strings into wide
horizontal blobs.

Single-file scenarios (added as `.sol` files under
`crates/lint/testdata/` in the existing `//~NOTE:` annotation style):

- `PragmaInconsistentCaretVsTilde.sol`: `^0.8.20` vs `~0.8.20`
- `PragmaInconsistentRangeVsExact.sol`: `>=0.8.0 <0.9.0` vs `0.8.20`
  -- range satisfies exact but lint is intentionally string-based,
  matching SLITHER-W1078
- `PragmaInconsistentOrVsExact.sol`: `0.8.20 || 0.8.21` vs `0.8.20`
- `PragmaInconsistentThreeDistinct.sol`: `>=0.8.0`, `^0.8.0`, `~0.8.0`
  -- verifies the `others` list contains every other variant

* test(lint): rename pragma-inconsistent testdata to describe the case under test

The two testdata files added in #14543 were named `PragmaInconsistent.sol`
and `PragmaInconsistent2.sol`, which made them look like duplicates. They
actually exercise distinct edge cases of the same string-based detection:

- `PragmaInconsistentCaretAboveExact.sol` (was `PragmaInconsistent.sol`):
  caret range whose lower bound is strictly below the exact version
  (`^0.8.0` + `0.8.18`).
- `PragmaInconsistentCaretMatchesExact.sol` (was `PragmaInconsistent2.sol`):
  caret range whose lower bound equals the exact version
  (`^0.8.20` + `0.8.20`) -- the looks-the-same-but-still-distinct case
  that guards SLITHER-W1078 parity (no semver intersection).

Amp-Thread-ID: https://ampcode.com/threads/T-019df243-267f-7779-93e1-5d6686082444
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

* refactor(script): reuse shared Tempo CLI opts (#14558)

* deps: bump tempo to 6bf9903 (T6 hardfork) + fix alloy-evm 0.34 compat (#14567)

* deps: bump tempo to 6bf9903 (T6 hardfork)

Bumps tempo crates to 6bf9903d, adding the T6 hardfork variant to
TempoHardfork. Without this, cast's tempo_forkSchedule lookup parses
the chain's reported active fork ("T6") into TempoHardfork::FromStr,
fails because T6 was unknown to the enum, and silently returns
is_hardfork_active(T3) = false. That made 'cast keychain auth' fall
back to the legacy authorizeKey selector and revert with
LegacyAuthorizeKeySelectorChanged on any T6 chain.

Also bumps alloy-evm to 0.34 and the optimism git pin to develop
(e3b59e7) so alloy-op-evm picks up an EvmFactory impl built against
alloy-evm 0.34. Removes the now-unused paradigmxyz/reth-core [patch]
entries.

No source changes; lockfile churn is transitive only.

* fix: adapt AnvilBlockExecutor to alloy-evm 0.34.0 breaking changes

- Add Send + 'static bounds to TxResult impl for AnvilTxResult<H>
- Change commit_transaction return type from Result<GasOutput, BlockExecutionError> to GasOutput
- Remove .expect() on commit_transaction call site

Amp-Thread-ID: https://ampcode.com/threads/T-019df322-c0f1-73e7-858c-5ca2d242ddb4

* style: rustfmt commit_transaction signature

Amp-Thread-ID: https://ampcode.com/threads/T-019df322-c0f1-73e7-858c-5ca2d242ddb4

---------

Co-authored-by: Centaur AI <ai@centaur.local>

* docs: add forge lint rule docs (#14571)

* feat(forge): add fuzz run selection (#14522)

* feat(forge): add fuzz run selection

* fix(fuzz): make metadata builder const

* test(fuzz): cover generated seed replay

* fix(forge): persist fuzz worker for run replay

* fix(evm): satisfy clippy in fuzz replay

* fix(fuzz): reuse fuzz run metadata

* forge(lint/docs): validate deployed forge lint docs (#14573)

test: validate deployed forge lint docs

* feat: gate foundry-primitives behind optimism feature (#14572)

* fix(ci): increase permissions for the enhanced attestation writing (#14584)

* increase permissions for artifact writing

* apply write permissions to release-docker

* feat(hardforks, networks): gate optimism behind cargo feature (#14581)

* fix(forge): encode Tempo creates as AA calls (#14585)

* feat(anvil): gate optimism behind cargo feature (#14577)

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* feat(cast): introduce `vaddr` cmd for TIP-1022 (#14508)

* feat(cast): introduce `vaddr` cmd for tip-1022

* fix: doc

* chore: touch-ups

* add tests

* chore: move tests to tempo ci

* feat: add vaddr watch test

* feat: count 0 hadling, add `no_register` flag

* fix: remove sweep subcommand

* fix: make clippy happy

* feat(bench): nightly regression tracking workflow (#14586)

* fix(cli): fix release version strings for immutable tags, bump to 1.7.1 (#14496)

* Fix release version metadata for immutable tags

Amp-Thread-ID: https://ampcode.com/threads/T-019dd617-b29f-7409-8523-9858a1504f17
Co-authored-by: Amp <amp@ampcode.com>

* Derive nightly release suffix from commit SHA

Amp-Thread-ID: https://ampcode.com/threads/T-019dd617-b29f-7409-8523-9858a1504f17
Co-authored-by: Amp <amp@ampcode.com>

* Apply suggestion from @zerosnacks

* Apply suggestion from @zerosnacks

* Apply suggestion from @zerosnacks

* bump to v1.7.1

* avoid appending whole sha hash, not necessary, handle version cmp correctly. after v1.7.1 release we need to bump to v1.7.2 for nightlies following it to compare correctly

* Make foundryVersionCmp tolerate new version format and add tests

- Strip both pre-release ('-nightly', '-dev') and build metadata ('+<sha>.<ts>.<profile>') from SEMVER_VERSION before comparison so the cheatcode keeps working for tagged releases (which have no '-' separator).
- Extract strip_semver_metadata helper and add Rust unit tests covering all SEMVER_VERSION shapes, version_cmp ordering, and parse_version rejection of pre-release/build/garbage input.
- Extend the Solidity test suite for vm.getFoundryVersion()/foundryVersionCmp/foundryVersionAtLeast: validate MAJOR.MINOR.PATCH parseability, build profile value, cmp/atLeast invariant, and error paths for invalid user-supplied versions.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd971-fcb7-7149-9680-f0134130844c
Co-authored-by: Amp <amp@ampcode.com>

* fix(test): drop view from solidity tests using assert helpers and fix fmt

- assertTrue/assertEq aren't view, so testGetFoundryVersionBuildProfile and testFoundryVersionCmpAndAtLeastAreConsistent can't be view either.
- Collapse the buildType assertion onto one line to satisfy forge fmt.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd971-fcb7-7149-9680-f0134130844c
Co-authored-by: Amp <amp@ampcode.com>

* test(version): assert build profile is non-empty instead of debug|release

The dist profile (used for distributed release binaries) is also valid; just require non-empty so any future profile works.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd971-fcb7-7149-9680-f0134130844c
Co-authored-by: Amp <amp@ampcode.com>

* Normalize nightly-<sha> to nightly in release_version

Ensures tarball and Docker nightly artifacts produce the same version
string. The commit identifier is already included in the SemVer build
metadata (after `+`), so collapsing `nightly-<sha>` to `nightly`
avoids duplicating the SHA in the pre-release tag.

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019df79e-d4c9-707c-85eb-2efbf59160b3

---------

Co-authored-by: Centaur AI <ai@centaur.local>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: zerosnacks <zerosnacks@protonmail.com>

* fix(evm): query `state_snapshot.storage` in `ForkDbStateSnapshot::storage_ref` (#14007)

* fix(evm): query `state_snapshot.storage` in `ForkDbStateSnapshot::storage_ref`

* test(evm): cover `ForkDbStateSnapshot::storage_ref` snapshot lookup

* fix(cast): consistent `--json` output for `keychain` subcommands (#14590)

- `keychain rl`: wrap remaining limit in `{"remaining":"..."}` object
  instead of emitting a bare JSON string
- `keychain policy add-call`: emit
  `{"status":"already_present","target":"..."}`
  when the rule already exists, instead of plain text
- `send_keychain_tx`: wrap sponsor hash in `{"sponsor_hash":"0x..."}`
  object when --tempo.print-sponsor-hash is used with --json

Add CLI tests covering the rl and sponsor-hash JSON output shapes.

* feat(tempo): add sponsored transaction plumbing (#14560)

* feat(tempo): add sponsored transaction plumbing

* addressing mablr comments

* fix tempo sponsor signer future layout

* preserve json output for tempo sponsor preview

* fix(cast): `--json` output support for `vaddr` (#14591)

* feat(tempo): add named nonce lanes (#14527)

* fix(cheatcodes): transfer value for payable mock calls (#14547)

* test: updated tests

* fix: execute value transfer

* test: improve

* imp: review item

* test: vm.prank test

* imp: moved mocked-call handling after prank application

---------

Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* feat(lint): add inline-assembly lint (#14575)

* feat(lint): add inline-assembly lint

* lint(inline-assembly): also recognize `/// @solidity memory-safe-assembly` NatSpec

Amp-Thread-ID: https://ampcode.com/threads/T-019df4b6-1b76-734c-9a9b-29db9fb7d461
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

* refactor(script): remove `ScriptConfig::{fee_token,expires_at}` in favour of `TempoOpts` (#14594)

* feat(evm-core): gate optimism behind cargo feature (#14593)

* fix(cli): resolve Tempo expires once (#14595)

fix(cli): resolve tempo expires once

* feat(cli): gate optimism behind cargo feature (#14596)

* fix(anvil): classify EVM halts as transaction rejections (#14592)

Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* feat: drop optimism deps under no-default-features (#14600)

* fix(forge): `--fuzz-seed` parameter is not effective in `forge coverage` (#14610)

fix --fuzz-seed not effective in forge coverage

* fix(foundryup): mirror tag resolution for install & use (#14611)

* fix(foundryup): mirror tag resolution for install & use

* fix(foundryup): mirror semver version normalization in `use`

`install` auto-prepends `v` to bare semver versions (e.g. `1.7.0` ->
`v1.7.0`) so the on-disk directory is always `v`-prefixed. `use` was
doing a literal lookup, so `foundryup -u 1.7.0` failed even though
`foundryup -i 1.7.0` had succeeded.

Broaden the channel `case` in `use()` to also match bare semver inputs
(`MAJOR.MINOR.PATCH[-prerelease]`) so they go through the same
`resolve_version_and_tag` normalizer. The pattern is intentionally
tighter than `install`'s `[[:digit:]]*` so locally-built versions whose
names happen to start with a digit are still looked up literally.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfc78-8557-712b-9944-bbff9a4a3b76
Co-authored-by: Amp <amp@ampcode.com>

* chore(foundryup): clarify tag-resolution log and error messages

Distinguish the GitHub API tag-resolution phase from the actual binary
download by consistently referring to "release tag(s)" in the
`resolve_version_and_tag` helper's `say` and `err` messages.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfc78-8557-712b-9944-bbff9a4a3b76
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

* fix(ci): keep no-default builds free of op deps (#14612)

* feat: cast unauthorized flow → wallet.tempo access-key authorization (#14517)

* feat: cast unauthorized flow → wallet.tempo access-key authorization

Amp-Thread-ID: https://ampcode.com/threads/T-019df174-9538-713b-b8c9-5001b1ad4719
Co-authored-by: Amp <amp@ampcode.com>

* fmt

* feat(cast): replace TEMPO_NO_BROWSER env with  flag

* revert token addresses

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* docs(expect-emit): clarify next-call semantics and warn about caught-revert leak (#14620)

docs(cheatcodes): clarify expectEmit next-call semantics and caught-revert leak

expectEmit is a 'next call' assertion. If the call immediately after expectEmit
reverts and the revert is swallowed by the caller (low-level call or try/catch),
the unmatched expectation can leak forward and be satisfied by a later unrelated
emission, silently turning a broken test green.

Document the constraint on the natspec for both no-arg and topic-checking
overloads, and regenerate cheatcodes.json.

Refs: https://github.com/foundry-rs/foundry/issues/14618

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd96-7a03-7249-8c10-af20ee2729f5

Co-authored-by: Amp <amp@ampcode.com>

* fix(cheatcodes): enforce `expectRevert` reverter address for CREATE frames (#14615)

* fix(cheatcodes): enforce `expectRevert` reverter address for CREATE
frames

The reverter address argument to `vm.expectRevert` was silently ignored
when the innermost reverting frame was a CREATE (top-level or nested),
because create_end never populated `expected_revert.reverted_by`.

Mirror call_end's logic in create_end: when the outcome reverts and a
reverter address is expected, record outcome.address (revm guarantees
this is Some(would-be address) whenever the constructor executed).

Adds positive regression tests for top-level and nested-CREATE reverts,
and a negative regression test asserting wrong-reverter now fails.

Co-authored-by: Amp <amp@ampcode.com>

* improve coverage

* add Derek's suggested test cases

* fix: forge fmt for ExpectRevert.t.sol

Amp-Thread-ID: https://ampcode.com/threads/T-019dfdc5-5414-70b6-9f49-cb5797a37a29
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* fix(script): keep plain Tempo broadcasts non-AA (#14616)

* fix(script): don't force Tempo AA fee_token from --network tempo alone

Plain --network tempo (or any selection that just sets the network to
Tempo) does not by itself imply a Tempo AA / type 0x76 transaction.
Defaulting tempo.common.fee_token to PATH_USD_ADDRESS solely from
evm_opts.networks.is_tempo() caused every unsigned broadcast tx to flow
through TempoOpts::apply, which set fee_token on the request and
promoted it to the Tempo AA tx envelope. Signers that only know how to
sign ordinary Ethereum transactions (e.g. the Ledger Ethereum app)
then rejected the transaction with 'received an unexpected empty
response'.

Gate the default on an actual Tempo AA opt-in:

  - --batch (Tempo batch txs are themselves AA and need a fee token), or
  - any explicit --tempo.* flag (sponsor, expiring nonce, nonce key/lane,
    ...) which already forces an AA tx and benefits from a default fee
    token.

Explicit --tempo.fee-token continues to win over the default in all
cases, and non-Tempo networks never default the fee token.

Add unit tests for each scenario.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd37-2354-712f-95b1-2584fd47ad5e
Co-authored-by: Amp <amp@ampcode.com>

* fix(script): don't force eth_estimateGas on plain Tempo broadcasts

Plain --network tempo produces an ordinary EIP-1559/legacy transaction
(see tempo-alloy::TempoTransactionRequest::output_tx_type), so the local
simulation gas estimate is sufficient. Forcing RPC re-estimation in this
case can surface node-side errors such as 'gas required exceeds
allowance (0)' (Geth-style balance/gasPrice cap from eth_estimateGas)
on flows that previously worked, including Ledger-signed broadcasts
that just got unblocked from the type 0x76 regression.

Match tempo-foundry's behaviour: only force eth_estimateGas on Tempo
when the user has actually opted into Tempo AA semantics (--batch or
any explicit --tempo.* flag).

Extract the gating into needs_tempo_aa_rpc_estimate(...) and add
focused unit tests mirroring the fee-token gating tests.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd37-2354-712f-95b1-2584fd47ad5e
Co-authored-by: Amp <amp@ampcode.com>

* fix(script): don't re-estimate plain Tempo chain broadcasts

---------

Co-authored-by: Amp <amp@ampcode.com>

* fix(cheatcodes): preserve reverts with `expectEmit` (#14619)

* test: added regression test

* fix: re-order revert handling

* refactor: simplify

* lint: fmt

* polish: tighten comment, extend test with revert reason and custom error

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd96-7a03-7249-8c10-af20ee2729f5
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

* feat(lint): add tx-origin detector (#14589)

* feat(lint): add tx-origin detector

* test(lint): address tx-origin review feedback

* fix: ui bless

* fix(lint): cover tx-origin index and ternary predicates

* test(lint): bless tx-origin snapshot

---------

Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* refactor(tempo): prepare batch access key txs w/ helper (#14597)

fix(tempo): prepare batch access key txs before estimation

* fix(anvil): respect non-zero genesis block in Otterscan APIs  (#14490)

fix(anvil): respect non-zero genesis block in Otterscan APIs

The three Otterscan address-history endpoints (`ots_searchTransactionsBefore`/`After`, `ots_getTransactionBySenderAndNonce`) hardcoded `unwrap_or(1)` / `unwrap_or_default()` as the lower bound of their block scan, which breaks when `genesis_block_number` is non-zero (e.g. `genesis.json` `number: 73`). Expose `Backend::genesis_number()` and fall back to `genesis_number() + 1` in non-fork mode, mirroring the existing post-fork `f.block_number() + 1` convention.

---------

Co-authored-by: Isagi Yates <isagiyates@gmail.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: steven <corderosteven6@gmail.com>
Co-authored-by: stevencartavia <112043913+stevencartavia@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: figtracer <me@figtracer.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Sergei Shulepov <s.pepyakin@gmail.com>
Co-authored-by: zerosnacks <zerosnacks@protonmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
Co-authored-by: cui <cuiweixie@gmail.com>
Co-authored-by: Centaur AI <ai@centaur.local>
Co-authored-by: Derek Cofausper <256792747+decofe@users.noreply.github.com>
Co-authored-by: Nikki <gutonosa@protonmail.com>
Co-authored-by: srdtrk <59252793+srdtrk@users.noreply.github.com>
Co-authored-by: Mikhail Mikheev <16622558+mmv08@users.noreply.github.com>
Co-authored-by: lazymio <mio@lazym.io>
Co-authored-by: Emma Jamieson-Hoare <emmajam@users.noreply.github.com>
Co-authored-by: VIkions <99107287+vikions@users.noreply.github.com>
Co-authored-by: Aïssata <mikeslowcoder@proton.me>

* ci: sign release archives, docker images, and publish SBOMs (#519)

* anvil: unify Tempo nonce markers across send RPCs (#14536)

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: steven <corderosteven6@gmail.com>
Co-authored-by: stevencartavia <112043913+stevencartavia@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* fix(forge): `flaky_gas_report_fallback_with_calldata` deployment cost (#14545)

* chore(lint): add missing lints to README (#14551)

* chore(bench): update `benchmark.sh` (#14548)

Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>

* chore(clippy): fix for_kv_map and useless_borrows_in_formatting (#14554)

* chore(clippy): fix for_kv_map and useless_borrows_in_formatting

Amp-Thread-ID: https://ampcode.com/threads/T-019df0f9-62e7-74b8-bd5e-da2acce678fb
Co-authored-by: Amp <amp@ampcode.com>

* chore(clippy): drop redundant borrows in cheatcodes assert formatters

Amp-Thread-ID: https://ampcode.com/threads/T-019df0f9-62e7-74b8-bd5e-da2acce678fb
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

* fix(ci): use `PATH_USD` fallback fee token in Mail templates (#14546)

* chore(deps): bump the actions-weekly group with 3 updates (#14497)

* refactor(chisel): migrate to solar (#14532)

* feat(lint): add too-many-digits lint (#14549)

* feat: feature-gate optimism deps in common-fmt, common, cast (#14539)

* feat(forge): support per-test network selection via inline config (#14530)

* feat(cli): `--tempo.expires` retry-safe mode (TIP-1009 expiring nonces) (#14521)

* fix(forge): `per_test_network_routing` match undeterministic order (#14557)

output

* chore(ci): run tempo mainnet and testnet checks before devnet (#14556)

* Update flake.lock (#14553)

flake.lock: Update

Flake lock file updates:

• Updated input 'fenix':
    'github:nix-community/fenix/f374034' (2026-04-25)
  → 'github:nix-community/fenix/74c1591' (2026-05-02)
• Updated input 'fenix/rust-analyzer-src':
    'github:rust-lang/rust-analyzer/8954b66' (2026-04-21)
  → 'github:rust-lang/rust-analyzer/64cdaeb' (2026-05-01)
• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/01fbdee' (2026-04-23)
  → 'github:NixOS/nixpkgs/c6d6588' (2026-05-01)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* chore(bench): update benchmark results (#14552)

* fix(forge): ignore ETH_RPC_URL for test forking (#14555)

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* feat(cast): add Tempo keychain policy commands (#14531)

* feat(cast): add tempo keychain policy commands

* fix(cast): address keychain policy review

* fix(cli): fix jsonwebtoken panic (#14562)

`cast` panicked with this message coming from jsonwebtoken:

```
Call CryptoProvider::install_default() before this point to select a provider manually, or make sure exactly one of the
'rust_crypto' and 'aws_lc_rs' features is enabled.
See the documentation of the CryptoProvider type for more information.
```

This seemingly was introduced with the bump of jsonwebtoken to 10. Now
it requires you to pick one backend used by default controlled by the
compile time cargo features or call `CryptoProvider::install_default()`
at the beginning.

I realized that probably it would be better to just select the feature
and I picked `aws_lc_rs` as it seems to be increasingly a default and
we already are using the C toolchain.

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* chore(cli): tidy ETH_RPC_URL handling and add forge regression test (#14559)

Follow-up to #14555:

- Drop the redundant flashbots branch in RpcOpts::dict; self.url(None)
  already returns FLASHBOTS_URL when --flashbots is set, so the
  subsequent overwrite was dead code.
- Inline the resolve_rpc_url helper back into RpcCommonOpts::url; it
  was only called from one place and added unneeded surface area.
- Restore the doc comment on RpcCommonOpts and document why
  ETH_RPC_URL is intentionally not a clap env on the shared field
  (so EvmArgs cannot inherit it).
- Add an integration test that runs forge config with ETH_RPC_URL set
  in the environment and asserts that eth_rpc_url stays None,
  directly exercising the regression scenario from #14538.

Amp-Thread-ID: https://ampcode.com/threads/T-019df243-267f-7779-93e1-5d6686082444

Co-authored-by: zerosnacks <zerosnacks@protonmail.com>
Co-authored-by: Amp <amp@ampcode.com>

* feat(cast): open Tempo wallet fund flow for MPP failures (#14505)

* feat(cast): open Tempo wallet fund flow for MPP failures

* ci(tempo): skip network checks without rpc secrets

* Revert "ci(tempo): skip network checks without rpc secrets"

This reverts commit f8dd70163f850b854888fd1c962174e1663284f4.

* fix(common): address mpp funding review

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* ci: sign release archives, docker images, and publish SBOMs (#14563)

- release.yml: emit per-archive sha256 + SPDX SBOM (Syft), cosign
  keyless sign-blob of the archive, and use actions/attest@v4 for both
  build provenance and SBOM attestations. Upload all artifacts to the
  draft release.
- docker-publish.yml: enable BuildKit SBOM, capture the build digest,
  cosign keyless sign each pushed tag, and publish a Sigstore-signed
  SLSA provenance attestation via actions/attest with push-to-registry.
- SECURITY.md: document how external users verify archives and the
  docker image (gh attestation, cosign, plain sha256, buildx imagetools).
- README.md: link to the new verification section.

* perf(common): short-circuit `find_by_name_or_identifier` instead of `collect` (#14514)

* feat(foundryup): retry GitHub API fetches on transient errors (#14566)

GitHub api.github.com occasionally returns transient 403s on certain VMs
(per-IP rate limiting / WAF hiccups), causing foundryup to fail to
resolve the latest stable / nightly release tag, e.g.:

  foundryup: fetching latest nightly releases from foundry-rs/foundry...
  Error: curl: (56) The requested URL returned error: 403
  foundryup: failed to fetch releases from GitHub API

Add curl/wget retry logic to the `fetch` helper (used exclusively for
GitHub API releases endpoints):

- curl: --retry 5 --retry-delay 2 --retry-max-time 60, plus
  --retry-all-errors when supported (curl 7.71+, feature-detected so
  older curl does not hard-fail). --retry-all-errors is required to
  retry HTTP 403, which is not in curl's default retryable set.
- wget fallback: --tries=5 --waitretry=2
  --retry-on-http-error=403,408,429,5xx.

`fetch` now buffers to a temp file before emitting to stdout, since
curl's --retry-all-errors is unsafe with piped consumers (mid-stream
retries can duplicate bytes). Existing callers pipe into awk/grep.

Tunable via FOUNDRYUP_MAX_RETRIES (default 5).

`download` (binary tarballs, attestations, manpages) is intentionally
left unchanged — those rarely fail and changing them affects the
attestation existence check semantics.

Bumps installer version 1.8.1 -> 1.8.2.


Amp-Thread-ID: https://ampcode.com/threads/T-019df2f5-9b97-717a-b959-cf7cbc7ca3bb

Co-authored-by: Amp <amp@ampcode.com>

* feat(lint): project-wide passes + pragma-inconsistent (#14543)

* feat(lint): project-wide passes + pragma-inconsistent

* rm hashset, msg

* test(lint): exhaustive pragma-inconsistent coverage + clearer testdata names (#14561)

* test(lint): exhaustive coverage for pragma-inconsistent

Follow-up to #14543 expanding test coverage for the cross-file
`pragma-inconsistent` lint across the syntax variants users encounter
in real Solidity projects.

Multi-file scenarios (added as `forgetest!` cases in
`crates/forge/tests/cli/lint.rs`, since they cannot be expressed in a
single `.sol` testdata file):

- Negative (must NOT warn):
  - all files use the same exact pragma (`0.8.20`)
  - all files use the same caret pragma (`^0.8.20`)
  - single file in the project
- Positive (must warn):
  - duplicates among a conflict -- two identical files plus one
    different pragma still emits three warnings
- Mixed:
  - file without an explicit pragma uses the test-utils default
    (`add_raw_source` is used to bypass the auto-injected pragma)

Source bodies are pulled out into module-level `const` raw strings so
rustfmt does not collapse the inline `\n`-escaped strings into wide
horizontal blobs.

Single-file scenarios (added as `.sol` files under
`crates/lint/testdata/` in the existing `//~NOTE:` annotation style):

- `PragmaInconsistentCaretVsTilde.sol`: `^0.8.20` vs `~0.8.20`
- `PragmaInconsistentRangeVsExact.sol`: `>=0.8.0 <0.9.0` vs `0.8.20`
  -- range satisfies exact but lint is intentionally string-based,
  matching SLITHER-W1078
- `PragmaInconsistentOrVsExact.sol`: `0.8.20 || 0.8.21` vs `0.8.20`
- `PragmaInconsistentThreeDistinct.sol`: `>=0.8.0`, `^0.8.0`, `~0.8.0`
  -- verifies the `others` list contains every other variant

* test(lint): rename pragma-inconsistent testdata to describe the case under test

The two testdata files added in #14543 were named `PragmaInconsistent.sol`
and `PragmaInconsistent2.sol`, which made them look like duplicates. They
actually exercise distinct edge cases of the same string-based detection:

- `PragmaInconsistentCaretAboveExact.sol` (was `PragmaInconsistent.sol`):
  caret range whose lower bound is strictly below the exact version
  (`^0.8.0` + `0.8.18`).
- `PragmaInconsistentCaretMatchesExact.sol` (was `PragmaInconsistent2.sol`):
  caret range whose lower bound equals the exact version
  (`^0.8.20` + `0.8.20`) -- the looks-the-same-but-still-distinct case
  that guards SLITHER-W1078 parity (no semver intersection).

Amp-Thread-ID: https://ampcode.com/threads/T-019df243-267f-7779-93e1-5d6686082444
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

* refactor(script): reuse shared Tempo CLI opts (#14558)

* deps: bump tempo to 6bf9903 (T6 hardfork) + fix alloy-evm 0.34 compat (#14567)

* deps: bump tempo to 6bf9903 (T6 hardfork)

Bumps tempo crates to 6bf9903d, adding the T6 hardfork variant to
TempoHardfork. Without this, cast's tempo_forkSchedule lookup parses
the chain's reported active fork ("T6") into TempoHardfork::FromStr,
fails because T6 was unknown to the enum, and silently returns
is_hardfork_active(T3) = false. That made 'cast keychain auth' fall
back to the legacy authorizeKey selector and revert with
LegacyAuthorizeKeySelectorChanged on any T6 chain.

Also bumps alloy-evm to 0.34 and the optimism git pin to develop
(e3b59e7) so alloy-op-evm picks up an EvmFactory impl built against
alloy-evm 0.34. Removes the now-unused paradigmxyz/reth-core [patch]
entries.

No source changes; lockfile churn is transitive only.

* fix: adapt AnvilBlockExecutor to alloy-evm 0.34.0 breaking changes

- Add Send + 'static bounds to TxResult impl for AnvilTxResult<H>
- Change commit_transaction return type from Result<GasOutput, BlockExecutionError> to GasOutput
- Remove .expect() on commit_transaction call site

Amp-Thread-ID: https://ampcode.com/threads/T-019df322-c0f1-73e7-858c-5ca2d242ddb4

* style: rustfmt commit_transaction signature

Amp-Thread-ID: https://ampcode.com/threads/T-019df322-c0f1-73e7-858c-5ca2d242ddb4

---------

Co-authored-by: Centaur AI <ai@centaur.local>

* docs: add forge lint rule docs (#14571)

* feat(forge): add fuzz run selection (#14522)

* feat(forge): add fuzz run selection

* fix(fuzz): make metadata builder const

* test(fuzz): cover generated seed replay

* fix(forge): persist fuzz worker for run replay

* fix(evm): satisfy clippy in fuzz replay

* fix(fuzz): reuse fuzz run metadata

* forge(lint/docs): validate deployed forge lint docs (#14573)

test: validate deployed forge lint docs

* feat: gate foundry-primitives behind optimism feature (#14572)

* fix(ci): increase permissions for the enhanced attestation writing (#14584)

* increase permissions for artifact writing

* apply write permissions to release-docker

* feat(hardforks, networks): gate optimism behind cargo feature (#14581)

* fix(forge): encode Tempo creates as AA calls (#14585)

* feat(anvil): gate optimism behind cargo feature (#14577)

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* feat(cast): introduce `vaddr` cmd for TIP-1022 (#14508)

* feat(cast): introduce `vaddr` cmd for tip-1022

* fix: doc

* chore: touch-ups

* add tests

* chore: move tests to tempo ci

* feat: add vaddr watch test

* feat: count 0 hadling, add `no_register` flag

* fix: remove sweep subcommand

* fix: make clippy happy

* feat(bench): nightly regression tracking workflow (#14586)

* fix(cli): fix release version strings for immutable tags, bump to 1.7.1 (#14496)

* Fix release version metadata for immutable tags

Amp-Thread-ID: https://ampcode.com/threads/T-019dd617-b29f-7409-8523-9858a1504f17
Co-authored-by: Amp <amp@ampcode.com>

* Derive nightly release suffix from commit SHA

Amp-Thread-ID: https://ampcode.com/threads/T-019dd617-b29f-7409-8523-9858a1504f17
Co-authored-by: Amp <amp@ampcode.com>

* Apply suggestion from @zerosnacks

* Apply suggestion from @zerosnacks

* Apply suggestion from @zerosnacks

* bump to v1.7.1

* avoid appending whole sha hash, not necessary, handle version cmp correctly. after v1.7.1 release we need to bump to v1.7.2 for nightlies following it to compare correctly

* Make foundryVersionCmp tolerate new version format and add tests

- Strip both pre-release ('-nightly', '-dev') and build metadata ('+<sha>.<ts>.<profile>') from SEMVER_VERSION before comparison so the cheatcode keeps working for tagged releases (which have no '-' separator).
- Extract strip_semver_metadata helper and add Rust unit tests covering all SEMVER_VERSION shapes, version_cmp ordering, and parse_version rejection of pre-release/build/garbage input.
- Extend the Solidity test suite for vm.getFoundryVersion()/foundryVersionCmp/foundryVersionAtLeast: validate MAJOR.MINOR.PATCH parseability, build profile value, cmp/atLeast invariant, and error paths for invalid user-supplied versions.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd971-fcb7-7149-9680-f0134130844c
Co-authored-by: Amp <amp@ampcode.com>

* fix(test): drop view from solidity tests using assert helpers and fix fmt

- assertTrue/assertEq aren't view, so testGetFoundryVersionBuildProfile and testFoundryVersionCmpAndAtLeastAreConsistent can't be view either.
- Collapse the buildType assertion onto one line to satisfy forge fmt.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd971-fcb7-7149-9680-f0134130844c
Co-authored-by: Amp <amp@ampcode.com>

* test(version): assert build profile is non-empty instead of debug|release

The dist profile (used for distributed release binaries) is also valid; just require non-empty so any future profile works.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd971-fcb7-7149-9680-f0134130844c
Co-authored-by: Amp <amp@ampcode.com>

* Normalize nightly-<sha> to nightly in release_version

Ensures tarball and Docker nightly artifacts produce the same version
string. The commit identifier is already included in the SemVer build
metadata (after `+`), so collapsing `nightly-<sha>` to `nightly`
avoids duplicating the SHA in the pre-release tag.

Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-019df79e-d4c9-707c-85eb-2efbf59160b3

---------

Co-authored-by: Centaur AI <ai@centaur.local>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: zerosnacks <zerosnacks@protonmail.com>

* fix(evm): query `state_snapshot.storage` in `ForkDbStateSnapshot::storage_ref` (#14007)

* fix(evm): query `state_snapshot.storage` in `ForkDbStateSnapshot::storage_ref`

* test(evm): cover `ForkDbStateSnapshot::storage_ref` snapshot lookup

* fix(cast): consistent `--json` output for `keychain` subcommands (#14590)

- `keychain rl`: wrap remaining limit in `{"remaining":"..."}` object
  instead of emitting a bare JSON string
- `keychain policy add-call`: emit
  `{"status":"already_present","target":"..."}`
  when the rule already exists, instead of plain text
- `send_keychain_tx`: wrap sponsor hash in `{"sponsor_hash":"0x..."}`
  object when --tempo.print-sponsor-hash is used with --json

Add CLI tests covering the rl and sponsor-hash JSON output shapes.

* feat(tempo): add sponsored transaction plumbing (#14560)

* feat(tempo): add sponsored transaction plumbing

* addressing mablr comments

* fix tempo sponsor signer future layout

* preserve json output for tempo sponsor preview

* fix(cast): `--json` output support for `vaddr` (#14591)

* feat(tempo): add named nonce lanes (#14527)

* fix(cheatcodes): transfer value for payable mock calls (#14547)

* test: updated tests

* fix: execute value transfer

* test: improve

* imp: review item

* test: vm.prank test

* imp: moved mocked-call handling after prank application

---------

Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* feat(lint): add inline-assembly lint (#14575)

* feat(lint): add inline-assembly lint

* lint(inline-assembly): also recognize `/// @solidity memory-safe-assembly` NatSpec

Amp-Thread-ID: https://ampcode.com/threads/T-019df4b6-1b76-734c-9a9b-29db9fb7d461
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>

* refactor(script): remove `ScriptConfig::{fee_token,expires_at}` in favour of `TempoOpts` (#14594)

* feat(evm-core): gate optimism behind cargo feature (#14593)

* fix(cli): resolve Tempo expires once (#14595)

fix(cli): resolve tempo expires once

* feat(cli): gate optimism behind cargo feature (#14596)

* fix(anvil): classify EVM halts as transaction rejections (#14592)

Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* feat: drop optimism deps under no-default-features (#14600)

* fix(forge): `--fuzz-seed` parameter is not effective in `forge coverage` (#14610)

fix --fuzz-seed not effective in forge coverage

* fix(foundryup): mirror tag resolution for install & use (#14611)

* fix(foundryup): mirror tag resolution for install & use

* fix(foundryup): mirror semver version normalization in `use`

`install` auto-prepends `v` to bare semver versions (e.g. `1.7.0` ->
`v1.7.0`) so the on-disk directory is always `v`-prefixed. `use` was
doing a literal lookup, so `foundryup -u 1.7.0` failed even though
`foundryup -i 1.7.0` had succeeded.

Broaden the channel `case` in `use()` to also match bare semver inputs
(`MAJOR.MINOR.PATCH[-prerelease]`) so they go through the same
`resolve_version_and_tag` normalizer. The pattern is intentionally
tighter than `install`'s `[[:digit:]]*` so locally-built versions whose
names happen to start with a digit are still looked up literally.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfc78-8557-712b-9944-bbff9a4a3b76
Co-authored-by: Amp <amp@ampcode.com>

* chore(foundryup): clarify tag-resolution log and error messages

Distinguish the GitHub API tag-resolution phase from the actual binary
download by consistently referring to "release tag(s)" in the
`resolve_version_and_tag` helper's `say` and `err` messages.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfc78-8557-712b-9944-bbff9a4a3b76
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

* fix(ci): keep no-default builds free of op deps (#14612)

* feat: cast unauthorized flow → wallet.tempo access-key authorization (#14517)

* feat: cast unauthorized flow → wallet.tempo access-key authorization

Amp-Thread-ID: https://ampcode.com/threads/T-019df174-9538-713b-b8c9-5001b1ad4719
Co-authored-by: Amp <amp@ampcode.com>

* fmt

* feat(cast): replace TEMPO_NO_BROWSER env with  flag

* revert token addresses

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* docs(expect-emit): clarify next-call semantics and warn about caught-revert leak (#14620)

docs(cheatcodes): clarify expectEmit next-call semantics and caught-revert leak

expectEmit is a 'next call' assertion. If the call immediately after expectEmit
reverts and the revert is swallowed by the caller (low-level call or try/catch),
the unmatched expectation can leak forward and be satisfied by a later unrelated
emission, silently turning a broken test green.

Document the constraint on the natspec for both no-arg and topic-checking
overloads, and regenerate cheatcodes.json.

Refs: https://github.com/foundry-rs/foundry/issues/14618

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd96-7a03-7249-8c10-af20ee2729f5

Co-authored-by: Amp <amp@ampcode.com>

* fix(cheatcodes): enforce `expectRevert` reverter address for CREATE frames (#14615)

* fix(cheatcodes): enforce `expectRevert` reverter address for CREATE
frames

The reverter address argument to `vm.expectRevert` was silently ignored
when the innermost reverting frame was a CREATE (top-level or nested),
because create_end never populated `expected_revert.reverted_by`.

Mirror call_end's logic in create_end: when the outcome reverts and a
reverter address is expected, record outcome.address (revm guarantees
this is Some(would-be address) whenever the constructor executed).

Adds positive regression tests for top-level and nested-CREATE reverts,
and a negative regression test asserting wrong-reverter now fails.

Co-authored-by: Amp <amp@ampcode.com>

* improve coverage

* add Derek's suggested test cases

* fix: forge fmt for ExpectRevert.t.sol

Amp-Thread-ID: https://ampcode.com/threads/T-019dfdc5-5414-70b6-9f49-cb5797a37a29
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>

* fix(script): keep plain Tempo broadcasts non-AA (#14616)

* fix(script): don't force Tempo AA fee_token from --network tempo alone

Plain --network tempo (or any selection that just sets the network to
Tempo) does not by itself imply a Tempo AA / type 0x76 transaction.
Defaulting tempo.common.fee_token to PATH_USD_ADDRESS solely from
evm_opts.networks.is_tempo() caused every unsigned broadcast tx to flow
through TempoOpts::apply, which set fee_token on the request and
promoted it to the Tempo AA tx envelope. Signers that only know how to
sign ordinary Ethereum transactions (e.g. the Ledger Ethereum app)
then rejected the transaction with 'received an unexpected empty
response'.

Gate the default on an actual Tempo AA opt-in:

  - --batch (Tempo batch txs are themselves AA and need a fee token), or
  - any explicit --tempo.* flag (sponsor, expiring nonce, nonce key/lane,
    ...) which already forces an AA tx and benefits from a default fee
    token.

Explicit --tempo.fee-token continues to win over the default in all
cases, and non-Tempo networks never default the fee token.

Add unit tests for each scenario.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd37-2354-712f-95b1-2584fd47ad5e
Co-authored-by: Amp <amp@ampcode.com>

* fix(script): don't force eth_estimateGas on plain Tempo broadcasts

Plain --network tempo produces an ordinary EIP-1559/legacy transaction
(see tempo-alloy::TempoTransactionRequest::output_tx_type), so the local
simulation gas estimate is sufficient. Forcing RPC re-estimation in this
case can surface node-side errors such as 'gas required exceeds
allowance (0)' (Geth-style balance/gasPrice cap from eth_estimateGas)
on flows that previously worked, including Ledger-signed broadcasts
that just got unblocked from the type 0x76 regression.

Match tempo-foundry's behaviour: only force eth_estimateGas on Tempo
when the user has actually opted into Tempo AA semantics (--batch or
any explicit --tempo.* flag).

Extract the gating into needs_tempo_aa_rpc_estimate(...) and add
focused unit tests mirroring the fee-token gating tests.

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd37-2354-712f-95b1-2584fd47ad5e
Co-authored-by: Amp <amp@ampcode.com>

* fix(script): don't re-estimate plain Tempo chain broadcasts

---------

Co-authored-by: Amp <amp@ampcode.com>

* fix(cheatcodes): preserve reverts with `expectEmit` (#14619)

* test: added regression test

* fix: re-order revert handling

* refactor: simplify

* lint: fmt

* polish: tighten comment, extend test with revert reason and custom error

Amp-Thread-ID: https://ampcode.com/threads/T-019dfd96-7a03-7249-8c10-af20ee2729f5
Co-authored-by: Amp <amp@ampcode.com>

---------

Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

* feat(lint): add tx-origin detector (#14589)

* feat(lint): add tx-origin detector

* test(lint): address tx-origin review feedback

* fix: ui bless

* fix(lint): cover tx-origin index and ternary predicates

* test(lint): bless tx-origin snapshot

---------

Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>

* refactor(tempo): prepare batch access key txs w/ helper (#14597)

fix(tempo): prepare batch access key txs before estimation

* fix(anvil): respect non-zero genesis block in Otterscan APIs  (#14490)

fix(anvil): respect non-zero genesis block in Otterscan APIs

The three Otterscan address-history endpoints (`ots_searchTransactionsBefore`/`After`, `ots_getTransactionBySenderAndNonce`) hardcoded `unwrap_or(1)` / `unwrap_or_default()` as the lower bound of their block scan, which breaks when `genesis_block_number` is non-zero (e.g. `genesis.json` `number: 73`). Expose `Backend::genesis_number()` and fall back to `genesis_number() + 1` in non-fork mode, mirroring the existing post-fork `f.block_number() + 1` convention.

---------

Co-authored-by: Isagi Yates <isagiyates@gmail.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: steven <corderosteven6@gmail.com>
Co-authored-by: stevencartavia <112043913+stevencartavia@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Mablr <59505383+mablr@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: figtracer <me@figtracer.com>
Co-authored-by: zerosnacks <95942363+zerosnacks@users.noreply.github.com>
Co-authored-by: Sergei Shulepov <s.pepyakin@gmail.com>
Co-authored-by: zerosnacks <zerosnacks@protonmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
Co-authored-by: cui <cuiweixie@gmail.com>
Co-authored-by: Centaur AI <ai@centaur.local>
Co-authored-by: Derek Cofausper <256792747+decofe@users.noreply.github.com>
Co-authored-by: Nikki <gutonosa@protonmail.com>
Co-authored-by: srdtrk <59252793+srdtrk@users.noreply.github.com>
Co-authored-by: Mikhail Mikheev <16622558+mmv08@users.noreply.github.com>
Co-authored-by: lazymio <mio@lazym.io>
Co-authored-by: Emma Jamieson-Hoare <emmajam@users.noreply.github.com>
Co-authored-by: VIkions <99107287+vikions@users.noreply.github.com>
Co-authored-by: Aïssata <mikeslowcoder@proton.me>

* Update .github/ISSUE_TEMPLATE/bug_report.md

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com>

* Tempo signer lookup and access key signing (#523)

* Fix formatting in cargo.yml

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Fix indentation for on_fail condition in CI config

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Fix indentation in CircleCI configuration

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* chore(deps): bump taiki-e/install-action from 2.62.21 to 2.62.31 (#139)

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.62.21 to 2.62.31.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/v2.62.21...0005e0116e92d8489d8d96fbff83f061c79ba95a)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.62.31
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump github/codeql-action from 3 to 4 (#138)

Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump snyk/actions

Bumps [snyk/actions](https://github.com/snyk/actions) from 14818c4695ecc4045f33c9cee9e795a788711ca4 to 9adf32b1121593767fc3c057af55b55db032dc04.
- [Release notes](https://github.com/snyk/actions/releases)
- [Commits](https://github.com/snyk/actions/compare/14818c4695ecc4045f33c9cee9e795a788711ca4...9adf32b1121593767fc3c057af55b55db032dc04)

---
updated-dependencies:
- dependency-name: snyk/actions
  dependency-version: 9adf32b1121593767fc3c057af55b55db032dc04
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update CircleCI config with comments and formatting

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Update config.yml

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Update and rename ci-say-hello.yml to ci-web3-defi-gamefi.yml (#154)

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Delete .circleci/ci-web3-defi-gamefi.yml (#155)

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Delete .circleci/ci_deploy.yml (#158)

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Delete .circleci/cargo.yml (#159)

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* chore(deps): bump taiki-e/install-action from 2.62.31 to 2.62.33 (#162)

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.62.31 to 2.62.33.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/0005e0116e92d8489d8d96fbff83f061c79ba95a...e43a5023a747770bfcb71ae048541a681714b951)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.62.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/checkout from 4 to 5 (#163)

Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Merge branch 'foundry-rs:master'  (#164)

* Create ci_cargo.yml (#72)

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Create config.yml

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* Rename ci_cargo.yml to cargo.yml

Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com>

* fix(fmt): handle trailing coments between base contracts (#12127)

* fix(fmt): account for ternary operators when estimating size

* fix(fmt): handle comments between inherited base contracts

* test: layout + base inheritance

* feat(forge): add bypass prevrandao (#12125)

* feat(forge): add bypass prevrandao

* Update crates/evm/networks/src/lib.rs

Co-authored-by: 0xrusowsky <90208954+0xrusowsky@users.noreply.github.com>

* changes after review: remove duped code

---------

Co-authored-by: 0xrusowsky <90208954+0xrusowsky@users.noreply.github.com>

* fix(fmt): filter libs wh…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

9 participants