{ description = "o1js - TypeScript framework for zk-SNARKs and zkApps"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11-small"; mina.url = "path:src/mina"; nixpkgs-mozilla.url = "github:mozilla/nixpkgs-mozilla"; nixpkgs-mozilla.flake = false; describe-dune.url = "github:o1-labs/describe-dune"; describe-dune.inputs.nixpkgs.follows = "nixpkgs"; describe-dune.inputs.flake-utils.follows = "flake-utils"; dune-nix.url = "github:o1-labs/dune-nix"; dune-nix.inputs.nixpkgs.follows = "nixpkgs"; dune-nix.inputs.flake-utils.follows = "flake-utils"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, ... }@inputs: flake-utils.lib.eachDefaultSystem (system: let pkgs= (nixpkgs.legacyPackages."${system}".extend (import inputs.nixpkgs-mozilla) ).extend inputs.mina.overlays.rust; dune-nix = inputs.dune-nix.lib.${system}; describe-dune = inputs.describe-dune.defaultPackage.${system}; dune-description = pkgs.stdenv.mkDerivation { pname = "dune-description"; version = "dev"; src = with pkgs.lib.fileset; (toSource { root = ./src/bindings; fileset = unions [ ./src/bindings/ocaml/dune ./src/bindings/ocaml/lib/dune ./src/bindings/ocaml/dune-project ./src/bindings/ocaml/jsoo_exports/dune ]; }); phases = [ "unpackPhase" "buildPhase" ]; buildPhase = '' ${describe-dune}/bin/describe-dune > $out ''; }; desc = builtins.fromJSON (builtins.readFile dune-description); allOcamlDeps_ = pkgs.lib.concatMap (duneSpec: pkgs.lib.concatMap (unitSpec: unitSpec.deps or [ ]) (duneSpec.units or [ ])) desc; allOcamlDeps = builtins.map (d: builtins.head (pkgs.lib.splitString "." d)) allOcamlDeps_; mina = inputs.mina.packages."${system}"; minaDeps_ = builtins.intersectAttrs (pkgs.lib.genAttrs allOcamlDeps (_: { })) mina.info.raw.deps.units; minaDeps = builtins.attrNames (builtins.foldl' (acc: pkg: acc // dune-nix.deps.packageDeps minaDeps_ "pkgs" pkg) minaDeps_ (builtins.attrNames minaDeps_)); commonOverrides = { DUNE_PROFILE = "dev"; buildInputs = [ mina.base-libs ] ++ mina.external-libs ++ pkgs.lib.attrVals minaDeps mina.pkgs; }; info = dune-nix.info desc; allDeps = dune-nix.allDeps info; noTestSkipping = _: false; prj_ = dune-nix.outputs' commonOverrides (pkgs.lib.fileset.toSource { root = ./src/bindings; fileset = ./src/bindings/ocaml; }) allDeps info noTestSkipping prj; prj = prj_ // { pkgs = prj_.pkgs // { __ocaml-js__ = prj_.pkgs.__ocaml-js__.overrideAttrs { PREBUILT_KIMCHI_BINDINGS_JS_WEB = "${mina.files.src-lib-crypto-kimchi_bindings-js-web}/src/lib/crypto/kimchi_bindings/js/web"; PREBUILT_KIMCHI_BINDINGS_JS_NODE_JS = "${mina.files.src-lib-crypto-kimchi_bindings-js-node_js}/src/lib/crypto/kimchi_bindings/js/node_js"; }; }; }; rust-channel = ((pkgs.rustChannelOf { channel = "nightly"; date = "2023-09-01"; sha256 = "sha256-zek9JAnRaoX8V0U2Y5ssXVe9tvoQ0ERGXfUCUGYdrMA="; }).rust.override { targets = ["wasm32-unknown-unknown" "x86_64-unknown-linux-gnu" ]; extensions = [ "rust-src" ]; }); in { formatter = pkgs.nixfmt; inherit mina; devShells = { # This seems to work better for macos mina-shell = inputs.mina.devShells."${system}".with-lsp; default = pkgs.mkShell { shellHook = '' RUSTUP_HOME=$(pwd)/.rustup export RUSTUP_HOME rustup toolchain link nix ${rust-channel} ''; packages = with pkgs; [ nodejs nodePackages.npm typescript nodePackages.typescript-language-server #Rustup doesn't allow local toolchains to contain 'nightly' in the name #so the toolchain is linked with the name nix and rustup is wrapped in a shellscript #which calls the nix toolchain instead of the nightly one (writeShellApplication { name = "rustup"; text = '' if [ "$1" = run ] && [ "$2" = nightly-2023-09-01 ] then ${rustup}/bin/rustup run nix "''${@:3}" else ${rustup}/bin/rustup "$@" fi ''; } ) rustup wasm-pack binaryen # provides wasm-opt dune_3 ] ++ commonOverrides.buildInputs ; }; }; # TODO build from ./ocaml root, not ./. (after fixing a bug in dune-nix) packages = { kim = pkgs.kimchi-rust-wasm; inherit dune-description; bindings = prj.pkgs.o1js_bindings; ocaml-js = prj.pkgs.__ocaml-js__; default = pkgs.buildNpmPackage { name = "o1js"; src = ./.; npmDepsHash = "sha256-++MTGDUVBccYN8LA2Xb0FkbrZ14ZyVCrDPESXa52AwQ="; # TODO ideally re-build bindings here }; }; }); }