From e7fb424bec34ad5e8e8543c6602dd3baf1d34620 Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 22 Oct 2024 09:37:17 +0300 Subject: [PATCH] v2 fixes --- docs/zkapps/o1js/recursion.mdx | 28 ++++----- docs/zkapps/tutorials/09-recursion.mdx | 6 +- .../zkapps/01-hello-world/package-lock.json | 9 +-- examples/zkapps/01-hello-world/package.json | 2 +- .../package-lock.json | 9 +-- .../package.json | 2 +- .../contracts/package-lock.json | 9 +-- .../contracts/package.json | 2 +- .../package-lock.json | 9 +-- .../package.json | 2 +- .../zkapps/07-oracles/contracts/package.json | 2 +- .../zkapps/09-recursion/package-lock.json | 9 +-- examples/zkapps/09-recursion/package.json | 2 +- examples/zkapps/09-recursion/src/Add.ts | 6 +- examples/zkapps/09-recursion/src/rollup.ts | 8 ++- examples/zkapps/09-recursion/src/vote.ts | 6 +- package-lock.json | 58 +++++++++++++++++++ package.json | 1 + 18 files changed, 119 insertions(+), 51 deletions(-) diff --git a/docs/zkapps/o1js/recursion.mdx b/docs/zkapps/o1js/recursion.mdx index fda80b2c0..22734729d 100644 --- a/docs/zkapps/o1js/recursion.mdx +++ b/docs/zkapps/o1js/recursion.mdx @@ -35,9 +35,9 @@ zkProgram is available as a top-level import. `Experimental.ZkProgram` is deprec In o1js, you can use `ZkProgram()` to define the steps of a recursive program. Like `SmartContract()` methods, `ZkProgram()` methods execute off-chain. -After performing the desired recursive steps, you can settle the interaction on Mina's blockchain by embedding `ZkProgram` within a `SmartContract` method that verifies the underlying proof of execution and extracts the output that can be used elsewhere in the method (like storing the output in app-state, for example). +After performing the desired recursive steps, you can settle the interaction on Mina's blockchain by embedding `ZkProgram` within a `SmartContract` method that verifies the underlying proof of execution and extracts the output that can be used elsewhere in the method (like storing the output in app-state, for example). -Similar to methods within the `SmartContract` class, inputs to `ZkProgram` are _private by default_ and are never seen by the Mina network. Unlike `SmartContract` methods, as the zkApp developer you choose the shape of the public input to all methods within a `ZkProgram`. +Similar to methods within the `SmartContract` class, inputs to `ZkProgram` are _private by default_ and are never seen by the Mina network. Unlike `SmartContract` methods, as the zkApp developer you choose the shape of the public input to all methods within a `ZkProgram`. ## Example: Recursively verify a simple program in a zkApp @@ -47,18 +47,18 @@ This simple example has only one method that proves the public input it received import { Field, ZkProgram } from 'o1js'; const SimpleProgram = ZkProgram({ - name: "simple-program-example", + name: 'simple-program-example', publicInput: Field, methods: { - run: { + run: { privateInputs: [], async method(publicInput: Field) { publicInput.assertEquals(Field(0)); }, - } - } + }, + }, }); ``` @@ -71,7 +71,7 @@ const { verificationKey } = await SimpleProgram.compile(); Now, you can use it to create a proof: ```typescript -const proof = await SimpleProgram.run(Field(0)); +const { proof } = await SimpleProgram.run(Field(0)); ``` To verify this proof from within any method of your `SmartContract` class: @@ -98,7 +98,7 @@ This program describes a recursive operation of adding one repeatedly to a numbe import { SelfProof, Field, ZkProgram, verify } from 'o1js'; const AddOne = ZkProgram({ - name: "add-one-example", + name: 'add-one-example', publicInput: Field, methods: { @@ -129,19 +129,19 @@ First, compile this program and make the base proof as before: ```typescript const { verificationKey } = await AddOne.compile(); -const proof = await AddOne.baseCase(Field(0)); +const { proof } = await AddOne.baseCase(Field(0)); ``` This time, use this proof as input to recursively add one again: ```typescript -const proof1 = await AddOne.step(Field(1), proof); +const { proof: proof1 } = await AddOne.step(Field(1), proof); ``` Repeat this as many times as you want: ```typescript -const proof2 = await AddOne.step(Field(2), proof1); +const { proof: proof2 } = await AddOne.step(Field(2), proof1); ``` Finally, verify the proof from within a SmartContract like the earlier example: @@ -164,14 +164,14 @@ This example program describes a very simple rollup for adding numbers: import { SelfProof, Field, ZkProgram, verify } from 'o1js'; let RollupAdd = ZkProgram({ - name: "rollup-add-example", + name: 'rollup-add-example', publicInput: Field, methods: { baseCase: { privateInputs: [], - async method(publicInput: Field) { }, + async method(publicInput: Field) {}, }, step: { @@ -199,7 +199,7 @@ You can also use ZkProgram directly to prove and verify arbitrary zero knowledge ```typescript const { verificationKey } = await MyProgram.compile(); -const proof = await MyProgram.base(Field(0)); +const { proof } = await MyProgram.base(Field(0)); ``` Now you can directly verify a JSON-encoded version of the proof to get back a boolean value that tells you if the proof is valid: diff --git a/docs/zkapps/tutorials/09-recursion.mdx b/docs/zkapps/tutorials/09-recursion.mdx index 9c8e726c5..f698432ca 100644 --- a/docs/zkapps/tutorials/09-recursion.mdx +++ b/docs/zkapps/tutorials/09-recursion.mdx @@ -199,15 +199,15 @@ async function main() { console.log('making proof 0'); - const proof0 = await Add.init(Field(0)); + const { proof: proof0 } = await Add.init(Field(0)); console.log('making proof 1'); - const proof1 = await Add.addNumber(Field(4), proof0, Field(4)); + const { proof: proof1 } = await Add.addNumber(Field(4), proof0, Field(4)); console.log('making proof 2'); - const proof2 = await Add.add(Field(4), proof1, proof0); + const { proof: proof2 } = await Add.add(Field(4), proof1, proof0); console.log('verifying proof 2'); console.log('proof 2 data', proof2.publicInput.toString()); diff --git a/examples/zkapps/01-hello-world/package-lock.json b/examples/zkapps/01-hello-world/package-lock.json index de3d8fe08..9de766590 100644 --- a/examples/zkapps/01-hello-world/package-lock.json +++ b/examples/zkapps/01-hello-world/package-lock.json @@ -24,7 +24,7 @@ "typescript": "^5.6" }, "peerDependencies": { - "o1js": "1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } }, "node_modules/@ampproject/remapping": { @@ -7358,9 +7358,10 @@ } }, "node_modules/o1js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/o1js/-/o1js-1.8.0.tgz", - "integrity": "sha512-mN0aM4HW3kyl/Gx0irqKQSQ2JftbmsK2t5nSZpTuNgTOVl0wQ6KZumXXps6E5hGkCjRfk+FjlL7CBsmqKqzYzg==", + "version": "1.9.1", + "resolved": "https://pkg.pr.new/o1-labs/o1js@b04520d", + "integrity": "sha512-/yOZory+3Uo95A6uHxZQY0s3lZCKDwvdrnY/iNZkBhCde0rbI/KM9EjXa2jcZBHtbreUjHccs5g6pbj6PLR4wQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "blakejs": "1.2.1", diff --git a/examples/zkapps/01-hello-world/package.json b/examples/zkapps/01-hello-world/package.json index c09a06ee7..cdf1b61c3 100644 --- a/examples/zkapps/01-hello-world/package.json +++ b/examples/zkapps/01-hello-world/package.json @@ -43,6 +43,6 @@ "typescript": "^5.6" }, "peerDependencies": { - "o1js": "1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } } diff --git a/examples/zkapps/02-private-inputs-and-hash-functions/package-lock.json b/examples/zkapps/02-private-inputs-and-hash-functions/package-lock.json index 97c523d19..0aa929182 100644 --- a/examples/zkapps/02-private-inputs-and-hash-functions/package-lock.json +++ b/examples/zkapps/02-private-inputs-and-hash-functions/package-lock.json @@ -24,7 +24,7 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "o1js": "1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } }, "node_modules/@ampproject/remapping": { @@ -7358,9 +7358,10 @@ } }, "node_modules/o1js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/o1js/-/o1js-1.8.0.tgz", - "integrity": "sha512-mN0aM4HW3kyl/Gx0irqKQSQ2JftbmsK2t5nSZpTuNgTOVl0wQ6KZumXXps6E5hGkCjRfk+FjlL7CBsmqKqzYzg==", + "version": "1.9.1", + "resolved": "https://pkg.pr.new/o1-labs/o1js@b04520d", + "integrity": "sha512-/yOZory+3Uo95A6uHxZQY0s3lZCKDwvdrnY/iNZkBhCde0rbI/KM9EjXa2jcZBHtbreUjHccs5g6pbj6PLR4wQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "blakejs": "1.2.1", diff --git a/examples/zkapps/02-private-inputs-and-hash-functions/package.json b/examples/zkapps/02-private-inputs-and-hash-functions/package.json index 8b607bd62..fe10131c3 100644 --- a/examples/zkapps/02-private-inputs-and-hash-functions/package.json +++ b/examples/zkapps/02-private-inputs-and-hash-functions/package.json @@ -43,6 +43,6 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "o1js": "1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } } diff --git a/examples/zkapps/04-zkapp-browser-ui/contracts/package-lock.json b/examples/zkapps/04-zkapp-browser-ui/contracts/package-lock.json index c05cafac2..05a63b5b7 100644 --- a/examples/zkapps/04-zkapp-browser-ui/contracts/package-lock.json +++ b/examples/zkapps/04-zkapp-browser-ui/contracts/package-lock.json @@ -25,7 +25,7 @@ "node": ">=18.14.0" }, "peerDependencies": { - "o1js": "^1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } }, "node_modules/@ampproject/remapping": { @@ -6868,9 +6868,10 @@ } }, "node_modules/o1js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/o1js/-/o1js-1.8.0.tgz", - "integrity": "sha512-mN0aM4HW3kyl/Gx0irqKQSQ2JftbmsK2t5nSZpTuNgTOVl0wQ6KZumXXps6E5hGkCjRfk+FjlL7CBsmqKqzYzg==", + "version": "1.9.1", + "resolved": "https://pkg.pr.new/o1-labs/o1js@b04520d", + "integrity": "sha512-/yOZory+3Uo95A6uHxZQY0s3lZCKDwvdrnY/iNZkBhCde0rbI/KM9EjXa2jcZBHtbreUjHccs5g6pbj6PLR4wQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "blakejs": "1.2.1", diff --git a/examples/zkapps/04-zkapp-browser-ui/contracts/package.json b/examples/zkapps/04-zkapp-browser-ui/contracts/package.json index d5876976a..f364eeab2 100644 --- a/examples/zkapps/04-zkapp-browser-ui/contracts/package.json +++ b/examples/zkapps/04-zkapp-browser-ui/contracts/package.json @@ -36,7 +36,7 @@ "typescript": "^5.6" }, "peerDependencies": { - "o1js": "^1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" }, "engines": { "node": ">=18.14.0" diff --git a/examples/zkapps/05-common-types-and-functions/package-lock.json b/examples/zkapps/05-common-types-and-functions/package-lock.json index 6b66436a4..d77cd462f 100644 --- a/examples/zkapps/05-common-types-and-functions/package-lock.json +++ b/examples/zkapps/05-common-types-and-functions/package-lock.json @@ -24,7 +24,7 @@ "typescript": "^5.6.3" }, "peerDependencies": { - "o1js": "1.8.0" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } }, "node_modules/@ampproject/remapping": { @@ -7358,9 +7358,10 @@ } }, "node_modules/o1js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/o1js/-/o1js-1.8.0.tgz", - "integrity": "sha512-mN0aM4HW3kyl/Gx0irqKQSQ2JftbmsK2t5nSZpTuNgTOVl0wQ6KZumXXps6E5hGkCjRfk+FjlL7CBsmqKqzYzg==", + "version": "1.9.1", + "resolved": "https://pkg.pr.new/o1-labs/o1js@b04520d", + "integrity": "sha512-/yOZory+3Uo95A6uHxZQY0s3lZCKDwvdrnY/iNZkBhCde0rbI/KM9EjXa2jcZBHtbreUjHccs5g6pbj6PLR4wQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "blakejs": "1.2.1", diff --git a/examples/zkapps/05-common-types-and-functions/package.json b/examples/zkapps/05-common-types-and-functions/package.json index 37156d343..86d6e95a5 100644 --- a/examples/zkapps/05-common-types-and-functions/package.json +++ b/examples/zkapps/05-common-types-and-functions/package.json @@ -43,6 +43,6 @@ "typescript": "^5.6.3" }, "peerDependencies": { - "o1js": "1.8.0" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } } diff --git a/examples/zkapps/07-oracles/contracts/package.json b/examples/zkapps/07-oracles/contracts/package.json index 88821d0d8..a7977b7a7 100644 --- a/examples/zkapps/07-oracles/contracts/package.json +++ b/examples/zkapps/07-oracles/contracts/package.json @@ -43,6 +43,6 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "o1js": "1.0.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } } diff --git a/examples/zkapps/09-recursion/package-lock.json b/examples/zkapps/09-recursion/package-lock.json index 1e000ca7f..d4351f5ef 100644 --- a/examples/zkapps/09-recursion/package-lock.json +++ b/examples/zkapps/09-recursion/package-lock.json @@ -24,7 +24,7 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "o1js": "1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } }, "node_modules/@ampproject/remapping": { @@ -7358,9 +7358,10 @@ } }, "node_modules/o1js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/o1js/-/o1js-1.8.0.tgz", - "integrity": "sha512-mN0aM4HW3kyl/Gx0irqKQSQ2JftbmsK2t5nSZpTuNgTOVl0wQ6KZumXXps6E5hGkCjRfk+FjlL7CBsmqKqzYzg==", + "version": "1.9.1", + "resolved": "https://pkg.pr.new/o1-labs/o1js@b04520d", + "integrity": "sha512-/yOZory+3Uo95A6uHxZQY0s3lZCKDwvdrnY/iNZkBhCde0rbI/KM9EjXa2jcZBHtbreUjHccs5g6pbj6PLR4wQ==", + "license": "Apache-2.0", "peer": true, "dependencies": { "blakejs": "1.2.1", diff --git a/examples/zkapps/09-recursion/package.json b/examples/zkapps/09-recursion/package.json index 98010ddcb..a3ada9876 100644 --- a/examples/zkapps/09-recursion/package.json +++ b/examples/zkapps/09-recursion/package.json @@ -43,6 +43,6 @@ "typescript": "^5.6.2" }, "peerDependencies": { - "o1js": "1.*" + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d" } } diff --git a/examples/zkapps/09-recursion/src/Add.ts b/examples/zkapps/09-recursion/src/Add.ts index 9fd170ed8..c6531e433 100644 --- a/examples/zkapps/09-recursion/src/Add.ts +++ b/examples/zkapps/09-recursion/src/Add.ts @@ -51,15 +51,15 @@ async function main() { console.log('making proof 0'); - const proof0 = await Add.init(Field(0)); + const { proof: proof0 } = await Add.init(Field(0)); console.log('making proof 1'); - const proof1 = await Add.addNumber(Field(4), proof0, Field(4)); + const { proof: proof1 } = await Add.addNumber(Field(4), proof0, Field(4)); console.log('making proof 2'); - const proof2 = await Add.add(Field(4), proof1, proof0); + const { proof: proof2 } = await Add.add(Field(4), proof1, proof0); console.log('verifying proof 2'); console.log('proof 2 data', proof2.publicInput.toString()); diff --git a/examples/zkapps/09-recursion/src/rollup.ts b/examples/zkapps/09-recursion/src/rollup.ts index 2d4e4c94f..5423f0a7c 100644 --- a/examples/zkapps/09-recursion/src/rollup.ts +++ b/examples/zkapps/09-recursion/src/rollup.ts @@ -84,7 +84,7 @@ async function main() { increment, witness ); - const proof = await Rollup.oneStep( + const { proof } = await Rollup.oneStep( rollup, initialRoot, latestRoot, @@ -110,7 +110,11 @@ async function main() { proof.publicInput, rollupProofs[i].publicInput ); - let mergedProof = await Rollup.merge(rollup, proof, rollupProofs[i]); + let { proof: mergedProof } = await Rollup.merge( + rollup, + proof, + rollupProofs[i] + ); proof = mergedProof; } diff --git a/examples/zkapps/09-recursion/src/vote.ts b/examples/zkapps/09-recursion/src/vote.ts index def718d9e..9fc04366a 100644 --- a/examples/zkapps/09-recursion/src/vote.ts +++ b/examples/zkapps/09-recursion/src/vote.ts @@ -33,7 +33,7 @@ async function main() { ); const vote0 = VoteState.newVote(votersTree.getRoot()); - const proof0 = await Vote.create(vote0); + const { proof: proof0 } = await Vote.create(vote0); console.log('making proof 1'); @@ -51,7 +51,7 @@ async function main() { voterTreeWitness1, nullifierWitness1 ); - const proof1 = await Vote.applyVote( + const { proof: proof1 } = await Vote.applyVote( vote1, proof0, Bool(true), @@ -77,7 +77,7 @@ async function main() { voterTreeWitness2, nullifierWitness2 ); - const proof2 = await Vote.applyVote( + const { proof: proof2 } = await Vote.applyVote( vote2, proof1, Bool(false), diff --git a/package-lock.json b/package-lock.json index be3a6ac37..ce4f5426c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "dotenv": "^10.0.0", "file-loader": "^6.2.0", "hast-util-is-element": "1.1.0", + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d", "prism-react-renderer": "^1.2.1", "react": "^17.0.1", "react-dom": "^17.0.1", @@ -5020,6 +5021,11 @@ "node": ">=8" } }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -5212,6 +5218,14 @@ "node": ">=8" } }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -8967,6 +8981,15 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, "node_modules/jest-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", @@ -9031,6 +9054,11 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9775,6 +9803,26 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/o1js": { + "version": "1.9.1", + "resolved": "https://pkg.pr.new/o1-labs/o1js@b04520d", + "integrity": "sha512-/yOZory+3Uo95A6uHxZQY0s3lZCKDwvdrnY/iNZkBhCde0rbI/KM9EjXa2jcZBHtbreUjHccs5g6pbj6PLR4wQ==", + "license": "Apache-2.0", + "dependencies": { + "blakejs": "1.2.1", + "cachedir": "^2.4.0", + "isomorphic-fetch": "^3.0.0", + "js-sha256": "^0.9.0", + "reflect-metadata": "^0.1.13", + "tslib": "^2.3.0" + }, + "bin": { + "snarky-run": "src/build/run.js" + }, + "engines": { + "node": ">=18.14.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11529,6 +11577,11 @@ "node": ">=6.0.0" } }, + "node_modules/reflect-metadata": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14614,6 +14667,11 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", diff --git a/package.json b/package.json index 82617eb62..998b5ca9b 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "dotenv": "^10.0.0", "file-loader": "^6.2.0", "hast-util-is-element": "1.1.0", + "o1js": "https://pkg.pr.new/o1-labs/o1js@b04520d", "prism-react-renderer": "^1.2.1", "react": "^17.0.1", "react-dom": "^17.0.1",