Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
In a few locations in code, we use
catch
expressions of the formcatch (bytes memory revertReason)
. This is error-prone, as it does not catch cases where the revert data is aPanic
or an error of typeError(string)
.Context:
h/t @howydev for leaving a reminder for this in a todo comment.
Solution
Convert all
catch (bytes memory ...) { ... }
expressions to justcatch { ... }
.Implement a helper function
collectReturnData()
that collects the contents of the return data buffer into abytes memory
type, using assembly to callreturndatacopy
.Use
collectReturnData()
in allcatch
bodies that need access to the revert data.Rationale
While we generally avoid inline assembly in the reference implementation, this is an unfortunate limitation of solidity itself, so it seems acceptable. Additionally, similar work is done in the ERC-4337 EntryPoint.
This approach is preferred over using multiple catch clauses due to that being more verbose, increasing codesize, and still being error-prone from abi-decoding issues.