Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 22 additions & 19 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
{
description = "o1js - TypeScript framework for zk-SNARKs and zkApps";
inputs = {
nixpkgs-mina.url = "github:nixos/nixpkgs/nixos-24.11-small";

Check warning on line 4 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixos)

Check warning on line 4 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixpkgs)

Check warning on line 4 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixos)

Check warning on line 4 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixpkgs)
mina.url = "git+file:src/mina?submodules=1";
nixpkgs-mozilla.url = "github:mozilla/nixpkgs-mozilla";

Check warning on line 6 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixpkgs)

Check warning on line 6 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixpkgs)
nixpkgs-mozilla.flake = false;

Check warning on line 7 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (nixpkgs)
describe-dune.url = "github:o1-labs/describe-dune";
describe-dune.inputs.nixpkgs.follows = "nixpkgs-mina";
describe-dune.inputs.flake-utils.follows = "flake-utils";
dune-nix.url = "github:o1-labs/dune-nix";
dune-nix.inputs.nixpkgs.follows = "nixpkgs-mina";
dune-nix.inputs.flake-utils.follows = "flake-utils";
flake-utils.url = "github:numtide/flake-utils";

Check warning on line 14 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (numtide)
};
nixConfig = {
auto-optimize-store = true;
max-jobs = "auto";
# taken from flake.nix in mina
allow-import-from-derivation = "true";
extra-substituters =

Check warning on line 21 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (substituters)
[ "https://storage.googleapis.com/mina-nix-cache"
];
extra-trusted-public-keys =
[ "mina-nix-cache-1:djtioLfv2oxuK2lqPUgmZbf8bY8sK/BnYZCU2iU5Q10="
"nix-cache.minaprotocol.org:fdcuDzmnM0Kbf7yU4yywBuUEJWClySc1WIF6t6Mm8h4="

Check warning on line 26 in flake.nix

View workflow job for this annotation

GitHub Actions / Lint-Format-and-TypoCheck

Unknown word (minaprotocol)
"nix-cache.minaprotocol.org:D3B1W+V7ND1Fmfii8EhbAbF1JXoe2Ct4N34OKChwk2c="
];
};
Expand Down Expand Up @@ -237,6 +237,7 @@
root = ./.;
fileset = unions [
./src/mina
./scripts
./src/bindings/scripts
./src/bindings/js
./src/bindings/crypto
Expand Down Expand Up @@ -281,6 +282,7 @@
patchPhase = ''
patchShebangs ./src/bindings/scripts/
patchShebangs ./src/bindings/crypto/test-vectors/
patchShebangs ./scripts/
'';
buildPhase =
''
Expand Down
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@
"build:web": "./scripts/build/build-web.sh",
"build:examples": "./scripts/build/build-examples.sh",
"check:bindings": "./scripts/build/check-for-bindings.sh",
"build:wasm": "npm run build:wasm:web && npm run build:wasm:node",
"build:wasm:web": "./scripts/build/wasm/build-web.sh",
"build:wasm:node": "./scripts/build/wasm/build-node.sh",
"build:jsoo": "npm run build:jsoo:web && npm run build:jsoo:node",
"build:jsoo:web": "./scripts/build/jsoo/build-web.sh",
"build:jsoo:node": "./scripts/build/jsoo/build-node.sh",
"build:docs": "typedoc",
"prepublish:web": "./scripts/prepublish/prepublish-web.sh",
"prepublish:node": "./scripts/prepublish/prepublish-node.sh",
Expand Down
4 changes: 3 additions & 1 deletion scripts/build/build-dev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ npx tsc -p tsconfig.test.json
ok "TypeScript compilation complete"

info "Copying artifacts to dist..."
node src/build/copy-to-dist.js
mkdir -p dist/node/bindings/compiled/node_bindings/
cp -r src/bindings/compiled/node_bindings/* dist/node/bindings/compiled/node_bindings/
cp src/bindings.d.ts dist/node/
ok "Artifacts copied"

success "Development build complete"
47 changes: 47 additions & 0 deletions scripts/build/jsoo/build-node.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/usr/bin/env bash

set -Eeuo pipefail

source ./scripts/lib/ux.sh

JSOO_PATH=./src/bindings/ocaml/jsoo_exports/
BUILT_PATH=./_build/default/$JSOO_PATH
BINDINGS_PATH=./src/bindings/compiled/node_bindings/

setup_script "jsoo-build-node" "JSOO build node"

mkdir -p $BINDINGS_PATH

info "building JSOO artifacts for node..."
TARGETS=(\
o1js_node.bc.js \
)
dune build ${TARGETS[@]/#/$JSOO_PATH/}
ok "JSOO artifacts built successfully"

info "copying artifacts into the right place..."
for target in ${TARGETS[@]}; do
cp $BUILT_PATH/$target $BINDINGS_PATH/$target
chmod 660 $BINDINGS_PATH/$target
done

info "setting up TS declaration files..."
echo '// this file intentionally left blank' > $BINDINGS_PATH/o1js_node.bc.d.cts
ok "TS declaration created"

info "moving some files to CommonJS format..."
run_cmd mv -f $BINDINGS_PATH/o1js_node.bc.js $BINDINGS_PATH/o1js_node.bc.cjs
ok "Node.js bindings copied"

info "Updating WASM references in bindings..."
run_cmd sed -i 's/plonk_wasm.js/plonk_wasm.cjs/' $BINDINGS_PATH/o1js_node.bc.cjs
ok "WASM references updated"

info "fixing JS bindings for better error handling..."
run_cmd sed -i 's/function failwith(s){throw \[0,Failure,s\]/function failwith(s){throw globalThis.Error(s.c)/' "${BINDINGS_PATH}"/o1js_node.bc.cjs
run_cmd sed -i 's/function invalid_arg(s){throw \[0,Invalid_argument,s\]/function invalid_arg(s){throw globalThis.Error(s.c)/' "${BINDINGS_PATH}"/o1js_node.bc.cjs
run_cmd sed -i 's/return \[0,Exn,t\]/return globalThis.Error(t.c)/' "${BINDINGS_PATH}"/o1js_node.bc.cjs
run_cmd sed -i 's/function raise(t){throw caml_call1(to_exn$0,t)}/function raise(t){throw Error(t?.[1]?.c ?? "Unknown error thrown by raise")}/' "${BINDINGS_PATH}"/o1js_node.bc.cjs
ok "JS bindings fixed"

success "JSOO node build complete!"
40 changes: 40 additions & 0 deletions scripts/build/jsoo/build-web.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
set -Eeuo pipefail

source ./scripts/lib/ux.sh

JSOO_PATH=./src/bindings/ocaml/jsoo_exports/
BUILT_PATH=./_build/default/$JSOO_PATH
BINDINGS_PATH=./src/bindings/compiled/web_bindings/

setup_script "jsoo-build-web" "JSOO build web"

mkdir -p $BINDINGS_PATH

info "building JSOO artifacts for web..."
TARGETS=(\
o1js_web.bc.js\
)
dune build ${TARGETS[@]/#/$JSOO_PATH/}
ok "initial artifacts built successfully!"

info "copying artifacts into the right place..."
for target in ${TARGETS[@]}; do
cp $BUILT_PATH/$target $BINDINGS_PATH/$target
chmod 660 $BINDINGS_PATH/$target
done

info "improving error messages in web bindings..."
# Transform OCaml-style exceptions to JavaScript Error objects
run_cmd sed -i 's/function failwith(s){throw \[0,Failure,s\]/function failwith(s){throw globalThis.Error(s.c)/' $BINDINGS_PATH/o1js_web.bc.js
run_cmd sed -i 's/function invalid_arg(s){throw \[0,Invalid_argument,s\]/function invalid_arg(s){throw globalThis.Error(s.c)/' $BINDINGS_PATH/o1js_web.bc.js
run_cmd sed -i 's/return \[0,Exn,t\]/return globalThis.Error(t.c)/' $BINDINGS_PATH/o1js_web.bc.js
run_cmd sed -i 's/function raise(t){throw caml_call1(to_exn$0,t)}/function raise(t){throw Error(t?.[1]?.c ?? "Unknown error thrown by raise")}/' $BINDINGS_PATH/o1js_web.bc.js
ok "error messages improved"

info "minifying JS with esbuild..."
run_cmd npx esbuild --minify --log-level=error $BINDINGS_PATH/o1js_web.bc.js > $BINDINGS_PATH/o1js_web.bc.min.js
run_cmd mv $BINDINGS_PATH/o1js_web.bc.min.js $BINDINGS_PATH/o1js_web.bc.js
ok "JS minified"

success "JSOO artifacts built for web"
41 changes: 41 additions & 0 deletions scripts/build/wasm/build-node.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/usr/bin/env bash

set -Eeuo pipefail

source ./scripts/lib/ux.sh

setup_script "wasm-node-build" "wasm node build"

MINA_PATH=./src/mina
KIMCHI_PATH=$MINA_PATH/src/lib/crypto/kimchi_bindings/js/node_js/
BUILT_PATH=./_build/default/$KIMCHI_PATH
BINDINGS_PATH=./src/bindings/compiled/node_bindings/

mkdir -p $BINDINGS_PATH

info "building Kimchi bindings for node..."

TARGETS=(\
plonk_wasm_bg.wasm \
plonk_wasm_bg.wasm.d.ts \
plonk_wasm.js \
plonk_wasm.d.ts \
)
dune build ${TARGETS[@]/#/$KIMCHI_PATH/}

info "copying artifacts into the right place..."

for target in "${TARGETS[@]}"; do
cp $BUILT_PATH/$target $BINDINGS_PATH/$target
chmod 660 $BINDINGS_PATH/$target
done

info "moving some files to CommonJS format..."

mv $BINDINGS_PATH/plonk_wasm.js $BINDINGS_PATH/plonk_wasm.cjs
mv $BINDINGS_PATH/plonk_wasm.d.ts $BINDINGS_PATH/plonk_wasm.d.cts

info "autofixing wasm bindings for Node.JS..."
run_cmd node src/build/fix-wasm-bindings-node.js $BINDINGS_PATH/plonk_wasm.cjs

success "WASM node build success!"
51 changes: 51 additions & 0 deletions scripts/build/wasm/build-web.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env bash

set -Eeuo pipefail

source ./scripts/lib/ux.sh

setup_script "wasm-web-build" "wasm web build"

if ! command -v wasm-opt >/dev/null 2>&1; then
error "wasm-opt is required for web bindings optimization"
exit 1
fi

MINA_PATH=./src/mina
KIMCHI_PATH=$MINA_PATH/src/lib/crypto/kimchi_bindings/js/web/
BUILT_PATH=./_build/default/$KIMCHI_PATH
BINDINGS_PATH=./src/bindings/compiled/web_bindings/

mkdir -p $BINDINGS_PATH


info "building Kimchi bindings for web..."

TARGETS=(\
plonk_wasm_bg.wasm \
plonk_wasm_bg.wasm.d.ts \
plonk_wasm.js \
plonk_wasm.d.ts\
)
dune build ${TARGETS[@]/#/$KIMCHI_PATH/}

info "copying artifacts into the right place..."

for target in "${TARGETS[@]}"; do
cp $BUILT_PATH/$target $BINDINGS_PATH/$target
done

info "optimizing wasm with wasm-opt..."
run_cmd wasm-opt \
--detect-features \
--enable-mutable-globals \
-O4 \
-o $BINDINGS_PATH/plonk_wasm_bg.wasm.opt \
$BINDINGS_PATH/plonk_wasm_bg.wasm
run_cmd mv $BINDINGS_PATH/plonk_wasm_bg.wasm.opt $BINDINGS_PATH/plonk_wasm_bg.wasm

ok "wasm optimized"

chmod 660 ${TARGETS[@]/#/$BINDINGS_PATH/}

success "WASM web build success!"
8 changes: 3 additions & 5 deletions scripts/prepublish/prepublish-node.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ info "Ensuring bindings are available..."
run_cmd npm run check:bindings
ok "Bindings ready"

info "Copying binding artifacts..."
run_cmd node src/build/copy-artifacts.js
ok "Artifacts copied"

info "Cleaning node dist directory..."
run_cmd rimraf "$DIST_NODE_DIR"
ok "Node dist directory cleaned"
Expand All @@ -34,7 +30,9 @@ run_cmd tsc -p tsconfig.node.json
ok "TypeScript compilation finished"

info "Copying compiled output to dist..."
run_cmd node src/build/copy-to-dist.js
mkdir -p dist/node/bindings/compiled/node_bindings/
cp -r src/bindings/compiled/node_bindings/* dist/node/bindings/compiled/node_bindings/
cp src/bindings.d.ts dist/node/
ok "Copied compiled output"

info "Building production node bundle..."
Expand Down
17 changes: 8 additions & 9 deletions src/bindings.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ async function initializeBindings() {
// this dynamic import makes jest respect the import order
// otherwise the cjs file gets imported before its implicit esm dependencies and fails
CJS: if (typeof require !== 'undefined') {
snarky = require('./bindings/compiled/_node_bindings/o1js_node.bc.cjs');
snarky = require('./bindings/compiled/node_bindings/o1js_node.bc.cjs');
}
ESM: snarky = (await import('./bindings/compiled/_node_bindings/o1js_node.bc.cjs')).default;
ESM: snarky = (await import('./bindings/compiled/node_bindings/o1js_node.bc.cjs')).default;
({ Snarky, Ledger, Pickles, Test: Test_ } = snarky);
resolve();
initializingPromise = undefined;
Expand All @@ -33,12 +33,11 @@ async function Test() {
}

export {
Snarky,
Ledger,
Pickles,
Test,
withThreadPool,
wasm,
initializeBindings,
isInitialized as areBindingsInitialized,
initializeBindings, Ledger,
Pickles,
Snarky,
Test, wasm,
withThreadPool
};

10 changes: 5 additions & 5 deletions src/bindings/crypto/constants.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// @gen this file is generated from `bindings/ocaml/o1js_constants.ml` - don't edit it directly
export {
prefixes,
mocks,
poseidonParamsKimchiFp,
poseidonParamsLegacyFp,
prefixHashes,
prefixHashesLegacy,
versionBytes,
prefixes,
protocolVersions,
poseidonParamsKimchiFp,
poseidonParamsLegacyFp,
mocks,
versionBytes,
};

let prefixes = {
Expand Down
Loading
Loading