{
  lib,
  nix-update-script,
  buildPythonPackage,
  crytic-compile,
  fetchFromGitHub,
  makeWrapper,
  packaging,
  prettytable,
  pythonOlder,
  setuptools-scm,
  solc,
  web3,
  withSolc ? false,
  testers,
  slither-analyzer,
}:

buildPythonPackage rec {
  pname = "slither-analyzer";
  version = "0.10.3";
  pyproject = true;

  disabled = pythonOlder "3.8";

  src = fetchFromGitHub {
    owner = "crytic";
    repo = "slither";
    rev = "refs/tags/${version}";
    hash = "sha256-KWLv0tpd1FHZ9apipVPWw6VjtfYpngsH7XDQQ3luBZA=";
  };

  nativeBuildInputs = [
    makeWrapper
    setuptools-scm
  ];

  propagatedBuildInputs = [
    crytic-compile
    packaging
    prettytable
    web3
  ];

  postFixup = lib.optionalString withSolc ''
    wrapProgram $out/bin/slither \
      --prefix PATH : "${lib.makeBinPath [ solc ]}"
  '';

  # required for pythonImportsCheck
  postInstall = ''
    export HOME="$TEMP"
  '';

  pythonImportsCheck = [
    "slither"
    "slither.all_exceptions"
    "slither.analyses"
    "slither.core"
    "slither.detectors"
    "slither.exceptions"
    "slither.formatters"
    "slither.printers"
    "slither.slither"
    "slither.slithir"
    "slither.solc_parsing"
    "slither.utils"
    "slither.visitors"
    "slither.vyper_parsing"
  ];

  # Test if the binary works during the build phase.
  checkPhase = ''
    runHook preCheck

    HOME="$TEMP" $out/bin/slither --version

    runHook postCheck
  '';

  passthru.tests.version = testers.testVersion {
    package = slither-analyzer;
    command = "HOME=$TMPDIR slither --version";
    version = "${version}";
  };

  passthru.updateScript = nix-update-script { };

  meta = with lib; {
    description = "Static Analyzer for Solidity";
    longDescription = ''
      Slither is a Solidity static analysis framework written in Python 3. It
      runs a suite of vulnerability detectors, prints visual information about
      contract details, and provides an API to easily write custom analyses.
    '';
    homepage = "https://github.com/trailofbits/slither";
    changelog = "https://github.com/crytic/slither/releases/tag/${version}";
    license = licenses.agpl3Plus;
    mainProgram = "slither";
    maintainers = with maintainers; [
      arturcygan
      fab
      hellwolf
    ];
  };
}
