{
  stdenv,
  lib,
  fetchpatch,
  mkDerivation,
  fetchFromGitHub,
  haskellPackages,
  slither-analyzer,
}:

mkDerivation (
  rec {
    pname = "echidna";
    version = "2.2.3";

    src = fetchFromGitHub {
      owner = "crytic";
      repo = "echidna";
      rev = "v${version}";
      sha256 = "sha256-NJ2G6EkexYE4P3GD7PZ+lLEs1dqnoqIB2zfAOD5SQ8M=";
    };

    patches = [
      # Support cross platform vty 6.x with vty-crossplatform
      # https://github.com/crytic/echidna/pull/1290
      (fetchpatch {
        url = "https://github.com/crytic/echidna/commit/2913b027d7e793390ed489ef6a47d23ec9b3c800.patch";
        hash = "sha256-5CGD9nDbDUTG869xUybWYSvGRsrm7JP7n0WMBNYfayw=";
      })
    ];

    isExecutable = true;

    libraryToolDepends = with haskellPackages; [ haskellPackages.hpack ];

    executableHaskellDepends = with haskellPackages; [
      # package.yaml - dependencies
      base
      aeson
      async
      base16-bytestring
      binary
      bytestring
      code-page
      containers
      data-bword
      data-dword
      deepseq
      extra
      directory
      exceptions
      filepath
      hashable
      hevm
      html-entities
      ListLike
      MonadRandom
      mtl
      optparse-applicative
      optics
      optics-core
      process
      random
      rosezipper
      semver
      split
      text
      transformers
      time
      unliftio
      utf8-string
      vector
      with-utf8
      word-wrap
      yaml
      http-conduit
      html-conduit
      warp
      wai-extra
      xml-conduit
      strip-ansi-escape
      # package.yaml - dependencies when "!os(windows)"
      brick
      unix
      vty
    ];

    # Note: there is also a runtime dependency of slither-analyzer. So, let's include it.
    executableSystemDepends = [ slither-analyzer ];

    preConfigure = ''
      hpack
    '';

    shellHook = "hpack";

    doHaddock = false;

    # tests depend on a specific version of solc
    doCheck = false;

    description = "Ethereum smart contract fuzzer";
    homepage = "https://github.com/crytic/echidna";
    license = lib.licenses.agpl3Plus;
    maintainers = with lib.maintainers; [
      arturcygan
      hellwolf
    ];
    platforms = lib.platforms.unix;
    mainProgram = "echidna-test";

  }
  // lib.optionalAttrs (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) {

    # https://github.com/NixOS/nixpkgs/pull/304352
    postInstall = with haskellPackages; ''
      remove-references-to -t ${warp.out} "$out/bin/echidna"
      remove-references-to -t ${wreq.out} "$out/bin/echidna"
    '';
  }
)