diff --git a/.gitignore b/.gitignore index 6407522a..44bdd7de 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -*.nix *.pyc .idea/ __pycache__/ diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..3e8ec6f8 --- /dev/null +++ b/flake.lock @@ -0,0 +1,42 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1671636183, + "narHash": "sha256-dboEYqb7vnH9pVEwgaWz7dzVi7eh6N5tRuhJ/nluoCg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "60ff1ccd98a2f81347457a473c7a96b9b6166c88", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..db02fa03 --- /dev/null +++ b/flake.nix @@ -0,0 +1,161 @@ +{ + description = "Cross-platform smart-contract compiler"; + + # Flake inputs + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + # Flake outputs + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + version = "0.2.5"; + in + rec { + + # Provide packages for selected system types. + packages = { + + default = packages.crytic-compile; + + crytic-compile = pkgs.callPackage pkgs.python38Packages.buildPythonPackage rec { + pname = "crytic-compile"; + inherit version; + format = "pyproject"; + src = ./.; + propagatedBuildInputs = with pkgs.python38Packages; [ + cbor2 + pycryptodome + setuptools + wheel + ]; + pythonRelaxDeps = true; + doCheck = false; + }; + + # Custom derivations to set linters to specific versions + black = pkgs.callPackage pkgs.python38Packages.buildPythonPackage rec { + pname = "black"; + version = "22.3.0"; + src = pkgs.python38Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-NQILiIbAIs7ZKCtRtah1ttGrDDh7MaBluE23wzCFynk="; + }; + doCheck = false; + propagatedBuildInputs = with pkgs.python38Packages; [ + click + mypy-extensions + pathspec + platformdirs + setuptools_scm + tomli + typing-extensions + ]; + }; + + darglint = pkgs.callPackage pkgs.python38Packages.buildPythonPackage rec { + pname = "darglint"; + version = "1.8.0"; + src = pkgs.python38Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-qmBe9HgXptFHl9MrOQRm7atiF2jqTKXMDzxU9tjcrsg="; + }; + doCheck = false; + }; + + mypy = pkgs.python39.withPackages(ps: with ps; [ + types-setuptools + setuptools + (pkgs.python39Packages.buildPythonPackage rec { + pname = "mypy"; + version = "0.942"; + src = pkgs.python39Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-F+RGSf7JLp+CECtIo797SlUQrQzSL6IaEEgmtdtJA+I="; + }; + doCheck = false; + propagatedBuildInputs = with pkgs.python39Packages; [ + mypy-extensions + tomli + typing-extensions + ]; + }) + ]); + + pylint = pkgs.callPackage pkgs.python39Packages.buildPythonPackage rec { + pname = "pylint"; + version = "2.13.4"; + src = pkgs.python39Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-fMbQxPYd/0QPnti2V/Ts1hXc/jU0WVPrex3HSv6QHXo="; + }; + doCheck = false; + propagatedBuildInputs = with pkgs.python39Packages; [ + isort + tomli + mccabe + platformdirs + dill + (pkgs.python39Packages.buildPythonPackage rec { + pname = "astroid"; + version = "2.11.7"; + src = pkgs.python39Packages.fetchPypi { + inherit pname version; + sha256 = "sha256-uyRhXHf0g3xwdmnRaQczE3SuipZGUKZpmdo/XKaNyUY="; + }; + doCheck = false; + propagatedBuildInputs = with pkgs.python39Packages; [ + lazy-object-proxy + typing-extensions + wrapt + ]; + }) + ]; + }; + + }; + + apps = { + default = { + type = "app"; + program = "${self.packages.${system}.crytic-compile}/bin/crytic-compile"; + }; + }; + + # Development environment output + devShells = { + default = pkgs.mkShell { + # The Nix packages provided in the environment + src = ./crytic_compile; + packages = with pkgs; [ + packages.black + packages.darglint + packages.mypy + packages.pylint + # not-reloadable version of crytic-compile (not ideal!) + packages.crytic-compile + # # hot-reloadable version of crytic-compile (hopefully!) + # # currently broken bc crytic_compile/platform clobbers the platform module of the std lib + # (pkgs.python38Packages.buildPythonPackage rec { + # name = "crytic-compile"; + # src = ./crytic_compile; + # propagatedBuildInputs = with pkgs.python38Packages; [ + # cbor2 + # pycryptodome + # setuptools + # ]; + # }) + python38 + virtualenv + python38Packages.pip + python38Packages.pycryptodome + python38Packages.setuptools + ]; + }; + }; + + }); + } diff --git a/justfile b/justfile new file mode 100644 index 00000000..d7231b30 --- /dev/null +++ b/justfile @@ -0,0 +1,78 @@ + +dev: + nix develop + +build: + nix build .#crytic-compile + +install: + nix-env -e $(nix-env -q | grep "crytic-compile") + nix-env -i ./result + + +lint: black darglint mypy pylint + +black: + @echo + nix develop --command black --version + nix develop --command black crytic_compile --config pyproject.toml + +darglint: + @echo + nix develop --command darglint --version + nix develop --command darglint crytic_compile + +mypy: + @echo + nix develop --command mypy --version + nix develop --command mypy crytic_compile + +pylint: + @echo + nix develop --command pylint --version + nix develop --command pylint crytic_compile --rcfile pyproject.toml + + +test: test-hardhat test-monorepo + +test-brownie: + echo "brownie tests not supported yet" + +test-buidler: + echo "buidler tests not supported yet" + +test-dapp: + echo "dapp tests not supported yet" + +test-embark: + echo "embark tests not supported yet" + +test-etherlime: + echo "etherlime tests not supported yet" + +test-etherscan: + echo "etherscan tests not supported yet" + +test-foundry: + echo "foundry tests not supported yet" + +test-hardhat: + @echo + nix develop --command bash scripts/ci_test_hardhat.sh + +test-monorepo: + @echo + nix develop --command bash scripts/ci_test_monorepo.sh + +test-solc: + echo "solc tests not supported yet" + +test-standard: + echo "standard tests not supported yet" + +test-truffle: + echo "truffle tests not supported yet" + +test-waffle: + echo "waffle tests not supported yet" + diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..3032647d --- /dev/null +++ b/shell.nix @@ -0,0 +1,54 @@ +{ pkgs ? import {} }: + +pkgs.python38Packages.buildPythonPackage rec { + name = "crytic-compile"; + src = ./crytic_compile; + propagatedBuildInputs = with pkgs.python38Packages; [ pycryptodome setuptools ]; +} + +# let +# mach-nix = import (builtins.fetchGit { +# url = "https://github.com/DavHau/mach-nix"; +# ref = "refs/tags/3.5.0"; +# }) {}; +# in +# mach-nix.mkPythonShell { +# requirements = '' +# pycryptodome +# setuptools +# ''; +# } + +# pkgs.mkShell { +# python = pkgs.python38.withPackages (ps: with ps; [ +# pip +# ]); +# +# shellHook = '' +# echo hello crytic-compile shell +# ''; +# +# packages = [ +# +# # (pkgs.python38Packages.buildPythonPackage rec { +# # name = "crytic-compile"; +# # src = ./crytic_compile; +# # propagatedBuildInputs = with pkgs.python38Packages; [ pycryptodome setuptools ]; +# # }) +# +# # (pkgs.python38Packages.buildPythonPackage rec { +# # pname = "crytic-compile"; +# # version = "0.2.5"; +# # format = "setuptools"; +# # src = ./.; +# # propagatedBuildInputs = with pkgs.python38Packages; [ pycryptodome setuptools ]; +# # doCheck = false; +# # pythonRelaxDeps = true; +# # }) +# +# (pkgs.python38.withPackages (ps: with ps; [ pip ])) +# pkgs.black +# pkgs.pylint +# pkgs.solc-select +# ]; +# }