fix(Multicall): use correct assembly for revert bubbling #98
+3
−10
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.
Related Issue
N/A
Description of changes
The implementation taken from stackoverflow uses incorrect assembly.
Since the first 32 bytes of
bytes memory result
will be the length as uint256, only adding 4 to the pointer makes theError(string)
signature (0x6408c379a0) as the length, which is incorrect. See tests hereThis medium article by @0xdeadbeef0x goes over the possible things that can go wrong with this exact implementation:
https://medium.com/@0xdeadbeef0x/the-double-edged-sword-of-abi-decode-f81529e62bcc
Therefore the correct way is to add 32 and revert the data with the length specified.
Also this solution works for both string style (
revert("reason")
,require(false, "reason")
) and custom error stylerevert CustomError()
, making the code cleaner.