Merge pull request #2550 from crytic/dev-require-error

Add support custom errors in require
pull/2568/head
alpharush 2 months ago committed by GitHub
commit 29ca19a613
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      slither/core/cfg/node.py
  2. 1
      slither/core/declarations/solidity_variables.py
  3. 1
      slither/printers/summary/require_calls.py
  4. 1
      tests/e2e/solc_parsing/test_ast_parsing.py
  5. BIN
      tests/e2e/solc_parsing/test_data/compile/require-error.sol-0.8.27-compact.zip
  6. 5
      tests/e2e/solc_parsing/test_data/expected/require-error.sol-0.8.27-compact.json
  7. 20
      tests/e2e/solc_parsing/test_data/require-error.sol

@ -529,7 +529,8 @@ class Node(SourceMapping): # pylint: disable=too-many-public-methods
bool: True if the node has a require or assert call
"""
return any(
c.name in ["require(bool)", "require(bool,string)", "assert(bool)"]
c.name
in ["require(bool)", "require(bool,string)", "require(bool,error)", "assert(bool)"]
for c in self.internal_calls
)

@ -50,6 +50,7 @@ SOLIDITY_FUNCTIONS: Dict[str, List[str]] = {
"assert(bool)": [],
"require(bool)": [],
"require(bool,string)": [],
"require(bool,error)": [], # Solidity 0.8.26 via-ir and Solidity >= 0.8.27
"revert()": [],
"revert(string)": [],
"revert ": [],

@ -11,6 +11,7 @@ require_or_assert = [
SolidityFunction("assert(bool)"),
SolidityFunction("require(bool)"),
SolidityFunction("require(bool,string)"),
SolidityFunction("require(bool,error)"),
]

@ -475,6 +475,7 @@ ALL_TESTS = [
Test("solidity-0.8.24.sol", ["0.8.24"], solc_args="--evm-version cancun"),
Test("scope/inherited_function_scope.sol", ["0.8.24"]),
Test("using_for_global_user_defined_operator_1.sol", ["0.8.24"]),
Test("require-error.sol", ["0.8.27"]),
]
# create the output folder if needed
try:

@ -0,0 +1,5 @@
{
"TestToken": {
"transferWithRequireError(address,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n"
}
}

@ -0,0 +1,20 @@
pragma solidity 0.8.27;
/// Insufficient balance for transfer. Needed `required` but only
/// `available` available.
/// @param available balance available.
/// @param required requested amount to transfer.
error InsufficientBalance(uint256 available, uint256 required);
contract TestToken {
mapping(address => uint) balance;
function transferWithRequireError(address to, uint256 amount) public {
require(
balance[msg.sender] >= amount,
InsufficientBalance(balance[msg.sender], amount)
);
balance[msg.sender] -= amount;
balance[to] += amount;
}
// ...
}
Loading…
Cancel
Save