Skip to content

fix(fmt): don't break var assignments when callee fits (foundry-rs#12323) #219

Merged
Dargon789 merged 22 commits into
Dargon789:dargon789/gamefifrom
foundry-rs:master
Oct 28, 2025
Merged

fix(fmt): don't break var assignments when callee fits (foundry-rs#12323) #219
Dargon789 merged 22 commits into
Dargon789:dargon789/gamefifrom
foundry-rs:master

Conversation

@Dargon789
Copy link
Copy Markdown
Owner

@Dargon789 Dargon789 commented Oct 28, 2025

Motivation

Solution

PR Checklist

  • Added Tests
  • Added Documentation
  • Breaking changes

Summary by Sourcery

Introduce ERC20 subcommands to cast and enhance the solidity formatter with a new single_line_imports option, refined formatting logic, and CI workflow updates, while fixing transaction type constants in anvil and RPC endpoint resolution

New Features:

  • Add ERC20 token operations (balance, allowance, transfer, approve) commands to the cast CLI and implement corresponding methods
  • Introduce single_line_imports option to formatter config to keep single import statements on one line even if they exceed line length

Bug Fixes:

  • Correct transaction type constants in anvil PendingTransaction builder and MinedTransactionReceipt output mapping
  • Fix Arbitrum RPC endpoint resolution in test-utils and use proper operator for snapshot increment in state_snapshot

Enhancements:

  • Refactor solidity formatter to avoid breaking variable assignments when the callee fits, improve binary and ternary expression printing, import and Yul block formatting, and comment wrapping
  • Extract documentation build into a separate GitHub Actions workflow and update CI pipelines to use the latest action versions

Documentation:

  • Update formatter README to document the single_line_imports option

Tests:

  • Add CLI tests for new ERC20 commands and formatting testcases covering import directives, binary expressions, Yul blocks, and comment wrapping

CreeptoGengar and others added 20 commits October 27, 2025 16:59
* Update transaction types to use constants

* Update mod.rs

* Update mod.rs
)

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.62.33 to 2.62.39.
- [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@e43a502...0ed4032)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.62.39
  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 [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  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>
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  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>
…e, allowance (#12258)

* create new subcomands for erc20

* implement operations

* Add deprecation warning on --erc20 usage

* formatting

* Add unit tests

* Assert balance in test

* Update crates/cast/src/args.rs

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

* Update crates/cast/src/cmd/erc20.rs

Co-authored-by: onbjerg <onbjerg@users.noreply.github.com>

* Nits: account -> owner, remove todo

---------

Co-authored-by: grandizzy <grandizzy.the.egg@gmail.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
Co-authored-by: 0xrusowsky <90208954+0xrusowsky@users.noreply.github.com>
Co-authored-by: onbjerg <onbjerg@users.noreply.github.com>
…ne line (#12303)

* add single_line_imports option to keep single imports on one line

* update readme

* add tests for single_line_imports feature + fmt

* fix clippy and simplify the code

* fix test failed

* fix: simplify

---------

Co-authored-by: 0xrusowsky <0xrusowsky@proton.me>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
* fix(fmt): only indent wrapped trailing cmnts which are line cmnts

* style: flip

---------

Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
* ci: don't run most CI on push

Merge group status checks are reported on push. I believe there is
no point in re-running everything again after the merge group is
committed.

* ci: fix nested concurrency
* fix(fmt): don't break var assignments when callee fits

* fix: deindent calls (exception)
We can't use GHA cache since it gets evicted every day
@codesandbox
Copy link
Copy Markdown

codesandbox Bot commented Oct 28, 2025

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented Oct 28, 2025

Reviewer's Guide

This PR implements ERC20 token operations in cast via new subcommands and provider methods, refines Solidity and Yul formatting (particularly import spacing and binary-expression breaks to avoid splitting var assignments when the callee fits), adds support for single-line imports, adjusts Yul block inlining based on prefix length, and streamlines GitHub Actions workflows (including a dedicated docs workflow and updated action versions).

Sequence diagram for ERC20 token transfer CLI command

sequenceDiagram
    actor User
    participant CLI as "cast CLI"
    participant Provider
    participant Contract as "IERC20 contract"
    User->>CLI: cast erc20 transfer <token> <to> <amount>
    CLI->>Provider: Connect
    CLI->>Contract: transfer(to, amount)
    Contract-->>Provider: Transaction sent
    Provider-->>CLI: Return TxHash
    CLI-->>User: Print TxHash
Loading

Sequence diagram for ERC20 token balance CLI command

sequenceDiagram
    actor User
    participant CLI as "cast CLI"
    participant Provider
    participant Contract as "IERC20 contract"
    User->>CLI: cast erc20 balance <token> <owner>
    CLI->>Provider: Connect
    CLI->>Contract: balanceOf(owner)
    Contract-->>Provider: Return balance
    Provider-->>CLI: Return balance
    CLI-->>User: Print balance
Loading

Sequence diagram for ERC20 token approve CLI command

sequenceDiagram
    actor User
    participant CLI as "cast CLI"
    participant Provider
    participant Contract as "IERC20 contract"
    User->>CLI: cast erc20 approve <token> <spender> <amount>
    CLI->>Provider: Connect
    CLI->>Contract: approve(spender, amount)
    Contract-->>Provider: Transaction sent
    Provider-->>CLI: Return TxHash
    CLI-->>User: Print TxHash
Loading

Sequence diagram for ERC20 token allowance CLI command

sequenceDiagram
    actor User
    participant CLI as "cast CLI"
    participant Provider
    participant Contract as "IERC20 contract"
    User->>CLI: cast erc20 allowance <token> <owner> <spender>
    CLI->>Provider: Connect
    CLI->>Contract: allowance(owner, spender)
    Contract-->>Provider: Return allowance
    Provider-->>CLI: Return allowance
    CLI-->>User: Print allowance
Loading

Class diagram for new ERC20 CLI subcommands and provider methods

classDiagram
    class Cast {
        +erc20_balance(token: Address, owner: Address, block: Option<BlockId>) Result<U256>
        +erc20_allowance(token: Address, owner: Address, spender: Address, block: Option<BlockId>) Result<U256>
        +erc20_transfer(token: Address, to: Address, amount: U256, signer: Option<WalletSigner>) Result<TxHash>
        +erc20_approve(token: Address, spender: Address, amount: U256, signer: Option<WalletSigner>) Result<TxHash>
    }
    class Erc20Subcommand {
        +Balance
        +Transfer
        +Approve
        +Allowance
        +run()
    }
    Cast <|-- Erc20Subcommand: uses
    class WalletSigner
    class Address
    class BlockId
    class U256
    class TxHash
    Erc20Subcommand --> WalletSigner
    Erc20Subcommand --> Address
    Erc20Subcommand --> BlockId
    Erc20Subcommand --> U256
    Erc20Subcommand --> TxHash
Loading

Class diagram for FormatterConfig with new single_line_imports option

classDiagram
    class FormatterConfig {
        +single_line_imports: bool
        +prefer_compact: PreferCompact
        +docs_style: DocCommentStyle
        ...
    }
    FormatterConfig --> PreferCompact
    FormatterConfig --> DocCommentStyle
Loading

Class diagram for updated Solidity/Yul formatter logic

classDiagram
    class State {
        +print_expr()
        +print_yul_block(..., prefix_len)
        +space_left()
        +max_space_left(prefix_len)
        +single_line_imports: bool
        ...
    }
    State --> FormatterConfig
    class FormatterConfig {
        +single_line_imports: bool
    }
Loading

File-Level Changes

Change Details Files
Add ERC20 commands to cast
  • New methods erc20_allowance, erc20_transfer, erc20_approve in Cast implementation
  • CLI enum Erc20Subcommand in opts and new cmd/erc20.rs with Balance, Transfer, Approve, Allowance actions
  • Deprecation warning for old --erc20 flag and subcommand wiring in args.rs
  • Comprehensive CLI tests for erc20 balance, erc20 allowance, erc20 transfer, erc20 approve
  • Fixture TestToken.sol added for end-to-end testing
crates/cast/src/lib.rs
crates/cast/src/opts.rs
crates/cast/src/args.rs
crates/cast/src/cmd/erc20.rs
crates/cast/tests/cli/main.rs
crates/cast/tests/fixtures/TestToken.sol
Support single-line imports in formatter
  • Introduce single_line_imports config flag in FormatterConfig and defaults
  • Adjust import-alias handling in state/sol.rs to respect single-line imports and bracket spacing
  • Add single_line_imports option to foundry.toml schema and README
  • New test data under ImportDirective covering single import behavior
crates/config/src/fmt.rs
crates/fmt/src/state/sol.rs
crates/fmt/testdata/ImportDirective/*
crates/forge/tests/cli/config.rs
README.md
Refine binary expression breaking to not split var assignments when callee fits
  • Revamp ExprKind::Binary logic in state/sol.rs using helper closures for inline vs break printing
  • Introduce get_callee_head_size, space_left, and max_space_left helpers in state
  • Handle complex successors and call heads to decide inline printing
  • Add new test cases for long indexed calls and complex binary expressions in variable assignments
crates/fmt/src/state/sol.rs
crates/fmt/src/state/mod.rs
crates/fmt/src/state/common.rs
crates/fmt/testdata/VariableAssignment/*
crates/fmt/testdata/IfStatement2/*
Enhance Yul block formatting with prefix length awareness
  • Extend print_yul_block signature to accept a prefix_len parameter
  • Adjust inline-block heuristics in state/yul.rs based on prefix_len and line length
  • Use print_word consistently for Yul keywords and manage cursor advancement
  • Add Yul test cases for assembly functions and prefix-based inlining
crates/fmt/src/state/yul.rs
crates/fmt/testdata/Yul/*
Streamline CI workflows and bump GitHub Actions versions
  • Extract docs generation into .github/workflows/docs.yml and simplify ci.yml
  • Update release.yml, test.yml, benchmarks.yml, npm.yml with newer action versions and conditional steps
  • Remove redundant steps in CI and consolidate secrets
  • Adjust workflow names, permissions, and caching actions
.github/workflows/ci.yml
.github/workflows/docs.yml
.github/workflows/release.yml
.github/workflows/test.yml
.github/workflows/benchmarks.yml
.github/workflows/npm.yml

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

@vercel
Copy link
Copy Markdown

vercel Bot commented Oct 28, 2025

@DaniPopes is attempting to deploy a commit to the Foundry development Team on Vercel.

A member of the Team first needs to authorize it.

@snyk-io
Copy link
Copy Markdown

snyk-io Bot commented Oct 28, 2025

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

Status Scanner 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.

Repository owner deleted a comment from vercel Bot Oct 28, 2025
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @Dargon789, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces significant improvements to the Solidity formatter, addressing issues with line breaks in variable assignments and offering more control over import statement formatting. It also expands the cast CLI tool with a new, dedicated subcommand for ERC20 token interactions, enhancing developer utility. Furthermore, the Yul formatter has been refined for better code presentation, alongside various internal refactorings and expanded test coverage to bolster overall stability and maintainability.

Highlights

  • Solidity Formatter Improvements: The Solidity formatter has been enhanced to prevent unnecessary line breaks in variable assignments where the right-hand side expression (callee) would fit on a single line. A new configuration option, single_line_imports, has been introduced to allow single import statements to remain on one line, even if they exceed the line length limit. Additionally, comment wrapping and indentation logic have been refined for better readability.
  • New cast erc20 CLI Subcommand: A dedicated cast erc20 subcommand has been added to the cast CLI tool, providing comprehensive functionality for interacting with ERC20 tokens. Users can now easily check balances, transfer tokens, approve spending, and query allowances directly from the command line. The old --erc20 flag has been deprecated in favor of this new, more structured subcommand.
  • Yul Formatter Enhancements: The Yul formatter has received updates to its line wrapping and inlining logic for Yul blocks, particularly within if and for statements. These improvements consider prefix lengths for more accurate space calculation, leading to better-formatted Yul code.
  • Internal Refactoring and Test Coverage: Internal code clarity has been improved by replacing magic numbers with named constants for transaction types in Anvil. Transaction receipt output handling in Anvil has been simplified. Comprehensive test coverage has been added for the new cast erc20 commands and the Solidity formatter improvements, ensuring reliability. RPC URL resolution for the Arbitrum chain in test utilities has also been improved.
Ignored Files
  • Ignored by pattern: .github/workflows/** (6)
    • .github/workflows/benchmarks.yml
    • .github/workflows/ci.yml
    • .github/workflows/docs.yml
    • .github/workflows/npm.yml
    • .github/workflows/release.yml
    • .github/workflows/test.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

sourcery-ai[bot]
sourcery-ai Bot previously approved these changes Oct 28, 2025
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 there - I've reviewed your changes and they look great!

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location> `crates/fmt/src/state/sol.rs:217` </location>
<code_context>
             }

             ast::ImportItems::Aliases(aliases) => {
-                self.s.cbox(self.ind);
-                self.word("{");
</code_context>

<issue_to_address>
**issue (complexity):** Consider extracting complex closure logic into small helper methods to flatten match arms and improve readability.

```markdown
You’re right that most of the complexity comes from large nested blocks and closures. You can pull each into a small helper, flatten the `match` arms, and get rid of the closures. For example:

1) Extract the import‐alias logic:

```rust
// NEW HELPER
fn print_braced_aliases<I>(&mut self, aliases: I)
where
    I: IntoIterator<Item = (&Ident, &Option<Ident>)>,
{
    let single = self.config.single_line_imports && aliases.into_iter().count() == 1;
    if single {
        self.word("{");
        if self.config.bracket_spacing { self.nbsp() }
    } else {
        self.s.cbox(self.ind);
        self.word("{");
        self.braces_break();
    }

    if self.config.sort_imports {
        let mut sorted: Vec<_> = aliases.into_iter().collect();
        sorted.sort_by_key(|(ident, _)| ident.name.as_str());
        self.print_commasep_aliases(sorted.into_iter())
    } else {
        self.print_commasep_aliases(aliases.into_iter())
    }

    if single {
        if self.config.bracket_spacing { self.nbsp() }
        self.word("}");
    } else {
        self.braces_break();
        self.s.offset(-self.ind);
        self.word("}");
        self.end();
    }
}
```

Then in your `match items` arm:

```rust
ast::ImportItems::Aliases(aliases) => {
    self.print_braced_aliases(aliases.iter());
    self.word(" from ");
    self.print_ast_str_lit(path);
}
```

2) Pull out binary‐expr printing into two small methods:

```rust
// NEW HELPERS
fn binary_inline(&mut self, rhs: &ast::Expr<'_>) {
    self.print_sep(Separator::Nbsp);
    self.neverbreak();
    self.print_expr(rhs);
}

fn binary_break(&mut self, rhs: &ast::Expr<'_>, hard: bool) {
    if !self.is_bol_or_only_ind() {
        self.print_sep(if hard { Separator::Hardbreak } else { Separator::Space });
    }
    self.s.offset(self.ind);
    self.s.ibox(self.ind);
    self.print_expr(rhs);
    self.end();
}
```

And simplify your match arm:

```rust
ast::ExprKind::Binary(lhs, op, _) => {
    let size = self.estimate_lhs_size(rhs, op) + lhs_size;
    let needs_break = force_break || size > space_left;

    if needs_break {
        self.binary_break(rhs, force_break);
    } else {
        self.binary_inline(rhs);
    }
}
```

This keeps all behavior but removes closures and deep nesting.
</issue_to_address>

### Comment 2
<location> `crates/cast/src/lib.rs:1146` </location>
<code_context>
+            .await?)
+    }
+
+    pub async fn erc20_transfer(
+        &self,
+        token: Address,
</code_context>

<issue_to_address>
**issue (complexity):** Consider refactoring the duplicate signer and send logic into a helper function to simplify the transfer and approve methods.

Here’s one way to collapse the duplicate signer/`send()` logic into a small helper. It preserves 100% of the behavior, but cuts your two functions down to a one-liner each:

```rust
/// Helper: attach optional signer and `.send().await`, returning the hash.
async fn send_with_opt_signer<B>(
    builder: B,
    signer: Option<foundry_wallets::WalletSigner>
) -> eyre::Result<TxHash>
where
    B: Into<alloy_provider::PendingTransactionBuilder> // or whatever your builder type is
{
    // convert to the concrete builder type
    let mut tx_builder = builder.into();
    if let Some(wallet) = signer {
        tx_builder = tx_builder.from(wallet.address());
    }
    let pending = tx_builder.send().await?;
    Ok(*pending.tx_hash())
}
```

Then your two methods shrink to:

```rust
pub async fn erc20_transfer(
    &self,
    token: Address,
    to: Address,
    amount: U256,
    signer: Option<foundry_wallets::WalletSigner>,
) -> Result<TxHash> {
    let builder = IERC20::new(token, &self.provider).transfer(to, amount);
    send_with_opt_signer(builder, signer).await
}

pub async fn erc20_approve(
    &self,
    token: Address,
    spender: Address,
    amount: U256,
    signer: Option<foundry_wallets::WalletSigner>,
) -> Result<TxHash> {
    let builder = IERC20::new(token, &self.provider).approve(spender, amount);
    send_with_opt_signer(builder, signer).await
}
```

This removes all the duplication but keeps the exact same behavior.
</issue_to_address>

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 crates/fmt/src/state/sol.rs
Comment thread crates/cast/src/lib.rs
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 several valuable changes, including new ERC20 subcommands for cast, a single_line_imports option for the formatter, and various bug fixes and enhancements. The code is generally well-structured and includes appropriate tests for the new functionality.

I've identified a couple of areas with code duplication in the new cast functionality. Refactoring these sections would improve the maintainability and readability of the code. My review includes specific suggestions for these improvements.

Comment thread crates/cast/src/cmd/erc20.rs
Comment thread crates/cast/src/lib.rs
Comment thread crates/cast/src/lib.rs
Repository owner deleted a comment from vercel Bot Oct 28, 2025
Repository owner deleted a comment from vercel Bot Oct 28, 2025
…ation (#12309)

* fix(cheats): correct impersonate() return semantics to match documentation

* clean

---------

Co-authored-by: 0xrusowsky <90208954+0xrusowsky@users.noreply.github.com>
Co-authored-by: grandizzy <38490174+grandizzy@users.noreply.github.com>
Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
Repository owner deleted a comment from vercel Bot Oct 28, 2025
Repository owner deleted a comment from vercel Bot Oct 28, 2025
@Dargon789 Dargon789 merged commit 4cd6ad4 into Dargon789:dargon789/gamefi Oct 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix: Bug from Sequence Contracts Standard Library (ERC20, ERC721, ERC1155) #### Sequence diagram for decoding a revert reason

10 participants