{ lib, gccStdenv, fetchzip, pkgs, boost, cmake, jq, ncurses, python3, versionCheckHook, z3Support ? true, z3 ? null, cvc4Support ? gccStdenv.hostPlatform.isLinux, cvc4 ? null, cln ? null, gmp ? null, }: # compiling source/libsmtutil/CVC4Interface.cpp breaks on clang on Darwin, # general commandline tests fail at abiencoderv2_no_warning/ on clang on NixOS assert z3Support -> z3 != null && lib.versionAtLeast z3.version "4.11.0"; assert cvc4Support -> cvc4 != null && cln != null && gmp != null; let pname = "solc"; version = "0.8.33"; linuxHash = "sha256-sWCV0GOUW5GPNX1flk+UOrdwoHZHnx4MsZMGDDBxx6M="; darwinHash = "sha256-gyQoBZHOOY1+JyKEa8EOzxd5sToyjvl7aHySzZxwgBo="; nativeInstallCheckInputs = [ versionCheckHook ]; doInstallCheck = true; meta = { description = "Compiler for Ethereum smart contract language Solidity"; homepage = "https://github.com/ethereum/solidity"; changelog = "https://github.com/ethereum/solidity/releases/tag/v${version}"; license = lib.licenses.gpl3; maintainers = with lib.maintainers; [ dbrock akru lionello sifmelcara ]; }; solc = if gccStdenv.hostPlatform.isLinux then gccStdenv.mkDerivation rec { inherit pname version nativeInstallCheckInputs doInstallCheck meta ; # upstream suggests avoid using archive generated by github src = fetchzip { url = "https://github.com/ethereum/solidity/releases/download/v${version}/solidity_${version}.tar.gz"; hash = linuxHash; }; cmakeFlags = [ "-DBoost_USE_STATIC_LIBS=OFF" ] ++ ( if z3Support then [ "-DSTRICT_Z3_VERSION=OFF" ] else [ "-DUSE_Z3=OFF" ] ) ++ lib.optionals (!cvc4Support) [ "-DUSE_CVC4=OFF" ]; nativeBuildInputs = [ cmake ]; buildInputs = [ boost ] ++ lib.optionals z3Support [ z3 ] ++ lib.optionals cvc4Support [ cvc4 cln gmp ]; nativeCheckInputs = [ jq ncurses (python3.withPackages ( ps: with ps; [ colorama deepdiff devtools docopt docutils requests sphinx tabulate z3-solver ] )) ]; # contextlib2 glob2 textwrap3 traceback2 urllib3 enableParallelBuilding = true; # tests take 60+ minutes to complete, only run as part of passthru tests doCheck = false; checkPhase = '' pushd .. # IPC tests need aleth avaliable, so we disable it sed -i "s/IPC_ENABLED=true/IPC_ENABLED=false\nIPC_FLAGS=\"--no-ipc\"/" ./scripts/tests.sh for i in ./scripts/*.sh ./scripts/*.py ./test/*.sh ./test/*.py; do patchShebangs "$i" done ## TODO: reenable tests below after adding evmone and hera and their dependencies to nixpkgs #TERM=xterm ./scripts/tests.sh ${lib.optionalString z3Support "--no-smt"} popd ''; installCheckPhase = '' runHook preInstallCheck $out/bin/solc --version > /dev/null runHook postInstallCheck ''; passthru.tests = { solcWithTests = solc.overrideAttrs (attrs: { doCheck = true; }); }; } else gccStdenv.mkDerivation rec { inherit pname version nativeInstallCheckInputs doInstallCheck meta ; src = pkgs.fetchurl { url = "https://github.com/ethereum/solidity/releases/download/v${version}/solc-macos"; hash = darwinHash; }; dontUnpack = true; installPhase = '' runHook preInstall mkdir -p $out/bin cp ${src} $out/bin/solc chmod +x $out/bin/solc runHook postInstall ''; }; in solc