slither icon indicating copy to clipboard operation
slither copied to clipboard

[Bug-Candidate]: Slither enable to run with echidna

Open 0xPhantom2 opened this issue 4 months ago • 2 comments

Describe the issue:

I am trying to use echidna but Slither always fail.

I tried to run slither . it works but when I run slither . --print echidna it failed to.

Code example to reproduce the issue:

I cannot share the code the command used is slither . --print echidna the command fail whatever I use --foundry-compile-all or not

Version:

0.11.3

Relevant log output:

Traceback (most recent call last):
  File "/opt/homebrew/bin/slither", line 8, in <module>
    sys.exit(main())
             ~~~~^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/__main__.py", line 776, in main
    main_impl(all_detector_classes=detectors, all_printer_classes=printers)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
        ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/__main__.py", line 107, in process_all
    ) = process_single(compilation, args, detector_classes, printer_classes)
        ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/__main__.py", line 87, in process_single
    return _process(slither, detector_classes, printer_classes)
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/__main__.py", line 143, in _process
    printer_results = slither.run_printers()
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/slither.py", line 302, in run_printers
    return [p.output(self._crytic_compile.target).data for p in self._printers]
            ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/printers/guidance/echidna.py", line 454, in output
    (cst_used, cst_used_in_binary) = _extract_constants(contracts)
                                     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/printers/guidance/echidna.py", line 285, in _extract_constants
    _extract_constants_from_irs(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        function.all_slithir_operations(),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        context_explored,
        ^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/printers/guidance/echidna.py", line 266, in _extract_constants_from_irs
    _extract_constant_from_read(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        ir, r, all_cst_used, all_cst_used_in_binary, context_explored
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/printers/guidance/echidna.py", line 199, in _extract_constant_from_read
    value = ConstantFolding(var_read.expression, value_type).result()
            ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/visitors/expression/constants_folding.py", line 60, in __init__
    super().__init__(expression)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/visitors/expression/expression.py", line 59, in __init__
    self._visit_expression(self.expression)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/visitors/expression/expression.py", line 78, in _visit_expression
    self._post_visit(expression)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/visitors/expression/expression.py", line 291, in _post_visit
    self._post_type_conversion(expression)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/visitors/expression/constants_folding.py", line 446, in _post_type_conversion
    value = convert_string_to_fraction(expr.converted_value)
  File "/opt/homebrew/Cellar/slither-analyzer/0.11.3_3/libexec/lib/python3.13/site-packages/slither/utils/integer_conversion.py", line 20, in convert_string_to_fraction
    base, expo = Fraction(base), int(expo)
                 ~~~~~~~~^^^^^^
  File "/opt/homebrew/Cellar/[email protected]/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/fractions.py", line 256, in __new__
    raise ValueError('Invalid literal for Fraction: %r' %
                     numerator)
ValueError: Invalid literal for Fraction: 'fail'

0xPhantom2 avatar Aug 24 '25 12:08 0xPhantom2

Hi, thanks for the report! This is likely a duplicate of #2721, do you have a string or bytes variable or value with the contents being something like "fail" or "failed"?

elopez avatar Aug 24 '25 14:08 elopez

Hi, no, I don’t think so. The word fail or failed only appears in error signatures or in comments. Here is the list of all the constant variables:

I think if it’s a duplicate of #2721, it might be due to the typehash variables.

 uint256 constant vaultPricePrecision = 10 ** 18;
    uint256 constant DOUBLE_BPS_MULTIPLIER = 20000;
    uint256 constant BPS_MULTIPLIER = 10000;

    uint256 constant MIN_LIQUIDITY = 10 ** 3;

 bytes32 private constant _FORWARD_TYPEHASH = keccak256(
        "ForwardRequest(address from,address market,uint256 value,uint256 nonce,uint256 deadline,bytes4 selector,bytes data)"
    );

    bytes32 private constant _PRICE_DEPENDENT_TYPEHASH = keccak256(
        "PriceDependentRequest(address from,address market,uint256 price,uint256 value,uint256 nonce,uint256 deadline,bool isBelowPrice,bytes4 selector,bytes data)"
    );

    bytes32 private constant _CANCEL_PRICE_DEPENDENT_TYPEHASH =
        keccak256("CancelPriceDependentRequest(address from,uint256 nonce,uint256 deadline)");

    bytes32 private constant _MARGIN_ACCOUNT_REQUEST_TYPEHASH = keccak256(
        "MarginAccountRequest(address from,address marginAccount,uint256 value,uint256 nonce,uint256 deadline,bytes4 selector,bytes data)");

    address private constant NATIVE = 0x0000000000000000000000000000000000000000;

   

    uint256 internal constant WAD = 1e18;

    uint40 constant NULL = 0;

0xPhantom2 avatar Aug 24 '25 14:08 0xPhantom2