crytic / slither

Static Analyzer for Solidity and Vyper
https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/
GNU Affero General Public License v3.0
5.13k stars 943 forks source link

case sensitivity for foundry projects causes file to not be found #1421

Open kristovatlas opened 1 year ago

kristovatlas commented 1 year ago

Describe the issue:

Slither is unable to locate a library in my Foundry-based Solidity project.

% slither .
'forge build --extra-output abi --extra-output userdoc --extra-output devdoc --extra-output evm.methodIdentifiers --force' running
Compiling 110 files with 0.8.16
Solc 0.8.16 finished in 7.36s
Compiler run successful (with warnings)
...snip...
Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 826, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 97, in process_all
    ) = process_single(compilation, args, detector_classes, printer_classes)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 75, in process_single
    slither = Slither(target, ast_format=ast, **vars(args))
  File "/opt/homebrew/lib/python3.10/site-packages/slither/slither.py", line 102, in __init__
    parser.parse_top_level_from_loaded_json(ast, path)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 256, in parse_top_level_from_loaded_json
    get_imported_scope = self.compilation_unit.get_scope(import_directive.filename)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/core/compilation_unit.py", line 231, in get_scope
    filename = self._crytic_compile_compilation_unit.crytic_compile.filename_lookup(
  File "/opt/homebrew/lib/python3.10/site-packages/crytic_compile/crytic_compile.py", line 199, in filename_lookup
    raise ValueError(
ValueError: lib/forge-std/src/Console.sol does not exist in ['/Users/redacted/Documents/GitHub/redacted/lib/openzeppelin-contracts/contracts/access/AccessControl.sol', '/Users/redacted/Documents/GitHub/redacted/lib/openzeppelin-contracts/contracts/access/AccessControl.sol', '/Users/redacted/Documents/GitHub/redacted/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol' ...snip ...

...snip....
Error in .
Traceback (most recent call last):
  File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 826, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 97, in process_all
    ) = process_single(compilation, args, detector_classes, printer_classes)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 75, in process_single
    slither = Slither(target, ast_format=ast, **vars(args))
  File "/opt/homebrew/lib/python3.10/site-packages/slither/slither.py", line 102, in __init__
    parser.parse_top_level_from_loaded_json(ast, path)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 256, in parse_top_level_from_loaded_json
    get_imported_scope = self.compilation_unit.get_scope(import_directive.filename)
  File "/opt/homebrew/lib/python3.10/site-packages/slither/core/compilation_unit.py", line 231, in get_scope
    filename = self._crytic_compile_compilation_unit.crytic_compile.filename_lookup(
  File "/opt/homebrew/lib/python3.10/site-packages/crytic_compile/crytic_compile.py", line 199, in filename_lookup
    raise ValueError(
ValueError: lib/forge-std/src/Console.sol does not exist in ['/Users/redacted/Documents/GitHub/redacted/lib/openzeppelin-contracts/contracts/access/AccessControl.sol', '/Users/redacted/Documents/GitHub/redacted/lib/openzeppelin-contracts/contracts/access/AccessControl.sol', '/Users/redacted/Documents/GitHub/redacted/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol ...snip...

Code example to reproduce the issue:

Console.sol is referenced in the following source files:

contracts/redacted/contracts/governance/ClaimPool.sol:

//SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "forge-std/Console.sol";
...snip...
function isEligible(address _address) public view returns (bool) {
    console.log("Checking eligibility of", _address);
...snip...
function hasClaimed(address _address) public view returns (bool) {
    console.log("Checking if address has claimed", _address);
...snip...
function claimTokens() public {
    console.log("redacted %s", msg.sender);
    console.log("%s redacted %s", claimAmount, msg.sender);
...snip...

contracts/redacted/contracts/governance/ClaimPoolX.sol:

//SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.9;

import "forge-std/Console.sol";
...snip...
constructor(address _tokenAddress, address forwarder) {
    console.log("Deploying the claim pool", _tokenAddress);
...snip...

foundry.toml:

[profile.default]
solc = "0.8.16"
libs = ["node_modules", "lib"]
verbosity = 3
fs_permissions = [{ access = "write", path = "./packages"}]

Console can be found in: lib/forge-std/src/console.sol:

/ SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

library console {
....snip...

N.B. There seems to be a case mismatch involved Console.sol vs console.sol but it doesn't prevent Foundry from compiling; not sure if relevant.

Version:

0.9.0

Relevant log output:

No response

elopez commented 1 year ago

Hi @kristovatlas, thanks for the report! I see you are working on Mac, are you using a case-insensitive filesystem by any chance? From a glance, it looks like this could be a bug in the project code -- for the sake of building on case-sensitive filesystems, like most Linux systems, the import should be mentioning console.sol and not Console.sol if the file is really named console.sol.

kristovatlas commented 1 year ago

Indeed, the issue seems to be that Foundry is case insensitive but slither is not. Possibly worth documenting, but at least folks can read this issue now.

Reference: https://github.com/foundry-rs/forge-std/issues/104

elopez commented 1 year ago

@kristovatlas I just did a quick test on a Linux system and it appears that foundry does not do any special handling for case sensitiveness -- it fails to build if you have a file "foo.sol" and import "Foo.sol" instead. I'm thinking it just happens to work on macOS because of the filesystem behavior, which handles operations case-insensitively.

I agree it's worth documenting still!

PaulRBerg commented 1 year ago

I just bumped into a similar error .. attaching the logs below. This happened in a private Foundry project that uses PRBMath.

I double-checked the file names and the imports paths, and they look all right to me. As in, there's no mismatch between the actual file names stored in version control and the imports in Solidity - they are all the same case.

It looks like the problem is in particular with the sd1x18/Casting.sol file in PRBMath. But I can't figure out what's going on besides this.

For context, this is the Slither config file that I used:

{
  "filter_paths": "lib",
  "solc_remaps": [
    "@openzeppelin/contracts=lib/openzeppelin-contracts/contracts/",
    "@prb/contracts/=lib/prb-contracts/src/",
    "@prb/math/=lib/prb-math/src/",
    "@prb/test/=lib/prb-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solarray=lib/solarray/src",
    "src/=src/",
    "test/=test/"
  ]
}

Might the problem be that there is an SD1x18.sol file AND also a sd1x18 folder in lib/prb-math/src? If yes, then this looks like a bug in Slither to me. Slither should be able to differentiate between folders and files.

Error log slither . 'forge build --extra-output abi --extra-output userdoc --extra-output devdoc --extra-output evm.methodIdentifiers --force' running Compiling 187 files with 0.8.17 Solc 0.8.17 finished in 29.88s Compiler run successful Traceback (most recent call last): File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 826, in main_impl ) = process_all(filename, args, detector_classes, printer_classes) File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 97, in process_all ) = process_single(compilation, args, detector_classes, printer_classes) File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 75, in process_single slither = Slither(target, ast_format=ast, **vars(args)) File "/opt/homebrew/lib/python3.10/site-packages/slither/slither.py", line 102, in __init__ parser.parse_top_level_from_loaded_json(ast, path) File "/opt/homebrew/lib/python3.10/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 256, in parse_top_level_from_loaded_json get_imported_scope = self.compilation_unit.get_scope(import_directive.filename) File "/opt/homebrew/lib/python3.10/site-packages/slither/core/compilation_unit.py", line 231, in get_scope filename = self._crytic_compile_compilation_unit.crytic_compile.filename_lookup( File "/opt/homebrew/lib/python3.10/site-packages/crytic_compile/crytic_compile.py", line 199, in filename_lookup raise ValueError( ValueError: lib/prb-math/src/sd1x18/Casting.sol does not exist in ['/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/Common.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/Common.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/SharedTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/SharedTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdStorage.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdStorage.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/IAdminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/IAdminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdUtils.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdUtils.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/Pro.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/Pro.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Constants.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Constants.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-durations/createWithDurations.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-durations/createWithDurations.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Utils.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Utils.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/Lockup.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/Lockup.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdError.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdError.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Base.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Base.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint128.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint128.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD2x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD2x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-range/getRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-range/getRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployLinear.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployLinear.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-segments/getSegments.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-segments/getSegments.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-range/createWithRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-range/createWithRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-milestones/createWithMilestones.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-milestones/createWithMilestones.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD59x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD59x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-multipe/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-multipe/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/Base.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/Base.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Context.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Context.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Assertions.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Assertions.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Utils.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Utils.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-cliff-time/getCliffTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-cliff-time/getCliffTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Strings.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Strings.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/Adminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/Adminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/IERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/IERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint40.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint40.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdCheats.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdCheats.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/Empty.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/Empty.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/ValueType.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/ValueType.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupRecipient.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupRecipient.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdJson.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdJson.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/SafeERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/SafeERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Events.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Events.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/NonCompliantERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/NonCompliantERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdChains.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdChains.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/solarray/src/Solarray.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/solarray/src/Solarray.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/ComptrollerTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/ComptrollerTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/Linear.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/Linear.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/helpers/Common.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/helpers/Common.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/PRBTest.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/PRBTest.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD60x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD60x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-deltas/createWithDeltas.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-deltas/createWithDeltas.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD1x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD1x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20GodMode.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20GodMode.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Script.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Script.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployComptroller.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployComptroller.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/Unit.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/Unit.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console2.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console2.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdMath.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdMath.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/get-protocol-fee/getProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/get-protocol-fee/getProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployPro.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployPro.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Constants.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Constants.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Tokens.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Tokens.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupSender.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupSender.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Conversions.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Conversions.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/math/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/math/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Enums.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Enums.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployTestToken.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployTestToken.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployProtocol.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployProtocol.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud2x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud2x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/set-protocol-fee/setProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/set-protocol-fee/setProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd1x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd1x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Casting.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Casting.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Assertions.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Assertions.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Structs.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Structs.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-max/withdrawMax.t.sol'] Error in . Traceback (most recent call last): File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 826, in main_impl ) = process_all(filename, args, detector_classes, printer_classes) File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 97, in process_all ) = process_single(compilation, args, detector_classes, printer_classes) File "/opt/homebrew/lib/python3.10/site-packages/slither/__main__.py", line 75, in process_single slither = Slither(target, ast_format=ast, **vars(args)) File "/opt/homebrew/lib/python3.10/site-packages/slither/slither.py", line 102, in __init__ parser.parse_top_level_from_loaded_json(ast, path) File "/opt/homebrew/lib/python3.10/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 256, in parse_top_level_from_loaded_json get_imported_scope = self.compilation_unit.get_scope(import_directive.filename) File "/opt/homebrew/lib/python3.10/site-packages/slither/core/compilation_unit.py", line 231, in get_scope filename = self._crytic_compile_compilation_unit.crytic_compile.filename_lookup( File "/opt/homebrew/lib/python3.10/site-packages/crytic_compile/crytic_compile.py", line 199, in filename_lookup raise ValueError( ValueError: lib/prb-math/src/sd1x18/Casting.sol does not exist in ['/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/Common.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/Common.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/SharedTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/SharedTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdStorage.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdStorage.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/IAdminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/IAdminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdUtils.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdUtils.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-erc20-token/getERC20Token.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/Pro.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/Pro.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Constants.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Constants.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-durations/createWithDurations.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-durations/createWithDurations.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Utils.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Utils.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/Lockup.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/Lockup.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdError.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdError.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Address.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Base.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Base.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/renounce/renounce.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint128.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint128.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD2x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD2x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-range/getRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-range/getRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployLinear.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployLinear.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-segments/getSegments.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-segments/getSegments.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-range/createWithRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/create-with-range/createWithRange.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-milestones/createWithMilestones.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-milestones/createWithMilestones.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD59x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD59x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-multipe/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-multipe/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/Base.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/Base.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Context.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Context.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Assertions.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Assertions.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stream/getStream.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Utils.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Utils.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-cliff-time/getCliffTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-cliff-time/getCliffTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Strings.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/Strings.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/Adminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/access/Adminable.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/IERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/IERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupLinear.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/constructor/constructor.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-status/getStatus.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint40.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/casting/Uint40.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdCheats.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdCheats.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/Empty.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/Empty.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/ValueType.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/ValueType.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/ISablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupRecipient.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupRecipient.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdJson.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdJson.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Lockup.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel/cancel.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Helpers.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/SafeERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/SafeERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Events.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Events.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-streamed-amount/getStreamedAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/NonCompliantERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/NonCompliantERC20.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdChains.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdChains.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/RevertingSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Vm.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/solarray/src/Solarray.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/solarray/src/Solarray.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/ComptrollerTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/ComptrollerTest.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/Linear.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/Linear.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/helpers/Common.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/helpers/Common.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/PRBTest.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-test/src/PRBTest.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD60x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/UD60x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-deltas/createWithDeltas.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/create-with-deltas/createWithDeltas.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2LockupPro.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD1x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/SD1x18.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-recipient/getRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20GodMode.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-contracts/src/token/erc20/ERC20GodMode.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/libraries/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Script.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/Script.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployComptroller.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployComptroller.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/Unit.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/Unit.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console2.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/console2.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdMath.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/forge-std/src/StdMath.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/get-protocol-fee/getProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/get-protocol-fee/getProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployPro.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployPro.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Constants.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/Constants.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/token-uri/tokenURI.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Tokens.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Tokens.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupSender.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/interfaces/hooks/ISablierV2LockupSender.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Conversions.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Conversions.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/math/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/math/Math.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Enums.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Enums.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/burn/burn.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/set-comptroller/setComptroller.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-stop-time/getStopTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-returnable-amount/getReturnableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployTestToken.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployTestToken.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployProtocol.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/script/DeployProtocol.s.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud2x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud2x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/set-protocol-fee/setProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/comptroller/set-protocol-fee/setProtocolFee.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/is-cancelable/isCancelable.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/ReentrantSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/SablierV2Comptroller.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd1x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd1x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/sd59x18/Errors.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-start-time/getStartTime.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Casting.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/ud60x18/Casting.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/shared/get-sender/getSender.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-multiple/withdrawMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/withdraw/withdraw.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/get-withdrawable-amount/getWithdrawableAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Assertions.sol', '/Users/paulrberg/workspace/sablier/v2-core/lib/prb-math/src/test/Assertions.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/helpers/hooks/GoodRecipient.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/claim-protocol-revenues/claimProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Structs.sol', '/Users/paulrberg/workspace/sablier/v2-core/src/types/Structs.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-deposit-amount/getDepositAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-protocol-revenues/getProtocolRevenues.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/get-withdrawn-amount/getWithdrawnAmount.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/linear/cancel-multiple/cancelMultiple.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-max/withdrawMax.t.sol', '/Users/paulrberg/workspace/sablier/v2-core/test/unit/lockup/pro/withdraw-max/withdrawMax.t.sol']
elopez commented 1 year ago

Hi @PaulRBerg! I was able to reproduce the problem you describe using Slither 0.9.1 / crytic-compile 0.2.4 + two contracts on a foundry project. The issue seems to happen because there's "Casting.sol" in two different folders (ud60x18 and sd1x18):

A.sol:

pragma solidity ^0.8.17;

import "prb-math/ud60x18/Casting.sol";

contract A {}

B.sol:

pragma solidity ^0.8.17;

import "prb-math/sd1x18/Casting.sol";

contract B {}

However we recently updated the way that Foundry artifacts are parsed, and I'm unable to reproduce the issue any longer with Slither 0.9.2 & crytic-compile 0.3.0 (the latest releases, from a few days ago)

Could you update your local Slither and crytic-compile installations and let us know if that fixes the issue for you too? Thanks!

PS: there should be no need to specify any remappings in the slither config if you're using foundry to build.

PaulRBerg commented 1 year ago

Hey @elopez, thanks a lot for the quick answer (on a Sunday, nonetheless!).

I can confirm that upgrading to Slither 0.9.2 fixed the compilation issue, which in hindsight seems unrelated to the case sensitivity problem reported in this issue. Sorry for that.

However, I bumped into yet another bug related to user-defined value types .. I will try to report it and document it in #1352.