From b8972e0f3f616be89471fc7b5d9d34ead032085a Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 22 Dec 2025 11:35:38 +0100 Subject: [PATCH 1/3] refactor: simplify crisp sdk api --- examples/CRISP/client/libs/crispSDKWorker.js | 2 - .../tests/crisp.contracts.test.ts | 6 - examples/CRISP/packages/crisp-sdk/README.md | 165 ++++++++++++++++-- examples/CRISP/packages/crisp-sdk/src/sdk.ts | 27 ++- .../CRISP/packages/crisp-sdk/src/types.ts | 22 +-- examples/CRISP/packages/crisp-sdk/src/vote.ts | 10 +- .../previous-ciphertext.json} | 0 .../packages/crisp-sdk/tests/vote.test.ts | 66 +++---- 8 files changed, 194 insertions(+), 104 deletions(-) rename examples/CRISP/packages/crisp-sdk/tests/{previous.json => fixtures/previous-ciphertext.json} (100%) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index 7f1812faba..cf47c6135f 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -26,7 +26,6 @@ self.onmessage = async function (event) { if (isMasking) { proof = await sdk.generateMaskVoteProof({ - serverUrl: crispServer, e3Id, publicKey, balance, @@ -35,7 +34,6 @@ self.onmessage = async function (event) { }) } else { proof = await sdk.generateVoteProof({ - serverUrl: crispServer, vote, e3Id, publicKey, diff --git a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts index 09f7fa8caf..59bf2650ef 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts @@ -14,13 +14,11 @@ import { encodeSolidityProof, generateMerkleTree, SIGNATURE_MESSAGE_HASH, - encryptVote, } from '@crisp-e3/sdk' import { expect } from 'chai' import { deployCRISPProgram, deployHonkVerifier, deployMockEnclave, ethers } from './utils' let publicKey = generatePublicKey() -const previousCiphertext = encryptVote({ yes: 0n, no: 0n }, publicKey) describe('CRISP Contracts', function () { describe('decode tally', () => { @@ -61,8 +59,6 @@ describe('CRISP Contracts', function () { merkleLeaves: leaves, balance, messageHash: SIGNATURE_MESSAGE_HASH, - isFirstVote: true, - previousCiphertext, slotAddress: address, }) @@ -94,8 +90,6 @@ describe('CRISP Contracts', function () { merkleLeaves: leaves, balance, messageHash: SIGNATURE_MESSAGE_HASH, - isFirstVote: true, - previousCiphertext, slotAddress: address, }) diff --git a/examples/CRISP/packages/crisp-sdk/README.md b/examples/CRISP/packages/crisp-sdk/README.md index 993584c7ab..06e6011322 100644 --- a/examples/CRISP/packages/crisp-sdk/README.md +++ b/examples/CRISP/packages/crisp-sdk/README.md @@ -19,23 +19,60 @@ npm install @crisp-e3/sdk ## Usage -### Get Round Details +### CrispSDK Class (Recommended) + +The `CrispSDK` class provides a convenient interface that automatically handles server communication +for fetching previous ciphertexts and checking slot status. + +```typescript +import { CrispSDK } from '@crisp-e3/sdk' + +const sdk = new CrispSDK(serverUrl) + +// Generate a vote proof (automatically fetches previous ciphertext if needed) +const voteProof = await sdk.generateVoteProof({ + e3Id: 1, + vote: { yes: 100n, no: 0n }, + publicKey: publicKeyBytes, + signature: '0x...', + messageHash: '0x...', + balance: 1000n, + slotAddress: '0x...', + merkleLeaves: [...], +}) + +// Generate a mask vote proof (automatically fetches previous ciphertext if needed) +const maskProof = await sdk.generateMaskVoteProof({ + e3Id: 1, + balance: 1000n, + slotAddress: '0x...', + publicKey: publicKeyBytes, + merkleLeaves: [...], +}) +``` + +### Standalone Functions + +#### Get Round Details ```typescript -import { getRoundDetails } from '@crisp-e3/sdk' +import { getRoundDetails, getRoundTokenDetails } from '@crisp-e3/sdk' const roundDetails = await getRoundDetails(serverUrl, e3Id) +const tokenDetails = await getRoundTokenDetails(serverUrl, e3Id) ``` -### Get Token Balance +#### Get Token Balance and Supply ```typescript -import { getBalanceAt } from '@crisp-e3/sdk' +import { getBalanceAt, getTotalSupplyAt, getTreeData } from '@crisp-e3/sdk' const balance = await getBalanceAt(voterAddress, tokenAddress, snapshotBlock, chainId) +const totalSupply = await getTotalSupplyAt(tokenAddress, snapshotBlock, chainId) +const merkleLeaves = await getTreeData(serverUrl, e3Id) ``` -### Generate Vote Proof +#### Generate Vote Proof (Low-level) ```typescript import { generateVoteProof } from '@crisp-e3/sdk' @@ -44,12 +81,15 @@ const proof = await generateVoteProof({ vote: { yes: 100n, no: 0n }, publicKey: publicKeyBytes, signature: '0x...', + messageHash: '0x...', balance: 1000n, + slotAddress: '0x...', merkleLeaves: [...], + previousCiphertext: previousCiphertextBytes, // optional }) ``` -### Generate Mask Vote Proof +#### Generate Mask Vote Proof (Low-level) ```typescript import { generateMaskVoteProof } from '@crisp-e3/sdk' @@ -63,7 +103,7 @@ const maskProof = await generateMaskVoteProof({ }) ``` -### Verify Proof +#### Verify Proof ```typescript import { verifyProof } from '@crisp-e3/sdk' @@ -71,9 +111,112 @@ import { verifyProof } from '@crisp-e3/sdk' const isValid = await verifyProof(proof) ``` +#### Decode Tally + +```typescript +import { decodeTally } from '@crisp-e3/sdk' + +const tally = decodeTally(tallyBytes) +// Returns: { yes: bigint, no: bigint } +``` + +#### Cryptographic Utilities + +```typescript +import { generatePublicKey, encryptVote, encodeSolidityProof } from '@crisp-e3/sdk' + +const publicKey = generatePublicKey() +const encryptedVote = encryptVote(vote, publicKey) +const encodedProof = encodeSolidityProof(proof) +``` + +#### Merkle Tree Utilities + +```typescript +import { + generateMerkleProof, + generateMerkleTree, + hashLeaf, + getAddressFromSignature, +} from '@crisp-e3/sdk' + +const leaf = hashLeaf(address, balance) +const tree = generateMerkleTree(leaves) +const proof = generateMerkleProof(balance, address, merkleLeaves) +const address = await getAddressFromSignature(signature, messageHash) +``` + +#### State Utilities + +```typescript +import { getPreviousCiphertext, getIsSlotEmpty } from '@crisp-e3/sdk' + +const previousCiphertext = await getPreviousCiphertext(serverUrl, e3Id, slotAddress) +const isEmpty = await getIsSlotEmpty(serverUrl, e3Id, slotAddress) +``` + ## API -- **State**: `getRoundDetails`, `getRoundTokenDetails` -- **Token**: `getBalanceAt`, `getTotalSupplyAt`, `getTreeData` -- **Vote**: `generateVoteProof`, `generateMaskVoteProof`, `verifyProof`, `decodeTally` -- **Utils**: `generateMerkleProof`, `generateMerkleTree`, `hashLeaf`, `getAddressFromSignature` +### CrispSDK Class + +- `constructor(serverUrl: string)` - Create a new SDK instance +- `generateVoteProof(voteProofRequest: VoteProofRequest): Promise` - Generate a vote + proof (automatically handles previous ciphertext) +- `generateMaskVoteProof(maskVoteProofRequest: MaskVoteProofRequest): Promise` - Generate + a mask vote proof (automatically handles previous ciphertext) + +### State Functions + +- `getRoundDetails(serverUrl: string, e3Id: number): Promise` - Get round details +- `getRoundTokenDetails(serverUrl: string, e3Id: number): Promise` - Get token details + for a round +- `getPreviousCiphertext(serverUrl: string, e3Id: number, address: string): Promise` - + Get previous ciphertext for a slot +- `getIsSlotEmpty(serverUrl: string, e3Id: number, address: string): Promise` - Check if a + slot is empty + +### Token Functions + +- `getBalanceAt(voterAddress: string, tokenAddress: string, snapshotBlock: number, chainId: number): Promise` - + Get token balance at a specific block +- `getTotalSupplyAt(tokenAddress: string, snapshotBlock: number, chainId: number): Promise` - + Get total supply at a specific block +- `getTreeData(serverUrl: string, e3Id: number): Promise` - Get merkle tree leaves from + server + +### Vote Functions + +- `generateVoteProof(voteProofInputs: VoteProofInputs): Promise` - Generate a vote proof + (low-level) +- `generateMaskVoteProof(maskVoteProofInputs: MaskVoteProofInputs): Promise` - Generate a + mask vote proof (low-level) +- `verifyProof(proof: ProofData): Promise` - Verify a proof locally +- `decodeTally(tallyBytes: string): Vote` - Decode an encoded tally +- `generatePublicKey(): Uint8Array` - Generate a random public key +- `encryptVote(vote: Vote, publicKey: Uint8Array): Uint8Array` - Encrypt a vote +- `encodeSolidityProof(proof: ProofData): Hex` - Encode proof for Solidity contract + +### Utility Functions + +- `generateMerkleProof(balance: bigint, address: string, leaves: bigint[] | string[]): MerkleProof` - + Generate merkle proof +- `generateMerkleTree(leaves: bigint[]): LeanIMT` - Generate merkle tree +- `hashLeaf(address: string, balance: bigint): bigint` - Hash a leaf node +- `getAddressFromSignature(signature: \`0x${string}\`, messageHash?: \`0x${string}\`): + Promise` - Extract address from signature + +### Constants + +- `MERKLE_TREE_MAX_DEPTH` - Maximum depth of the merkle tree +- `SIGNATURE_MESSAGE` - Message used for signature verification +- `MAXIMUM_VOTE_VALUE` - Maximum allowed vote value +- `SIGNATURE_MESSAGE_HASH` - Hash of the signature message + +### Types + +- `RoundDetails` - Round details type +- `RoundDetailsResponse` - Server response type for round details +- `TokenDetails` - Token details type +- `Vote` - Vote type with `yes` and `no` bigint fields +- `MaskVoteProofInputs` - Inputs for mask vote proof generation +- `VoteProofInputs` - Inputs for vote proof generation diff --git a/examples/CRISP/packages/crisp-sdk/src/sdk.ts b/examples/CRISP/packages/crisp-sdk/src/sdk.ts index f4a2b24e63..729e1dd9cf 100644 --- a/examples/CRISP/packages/crisp-sdk/src/sdk.ts +++ b/examples/CRISP/packages/crisp-sdk/src/sdk.ts @@ -5,24 +5,23 @@ // or FITNESS FOR A PARTICULAR PURPOSE. import { getIsSlotEmpty, getPreviousCiphertext } from './state' -import { encryptVote, generateMaskVoteProof, generateVoteProof } from './vote' -import { ZERO_VOTE } from './constants' +import { generateMaskVoteProof, generateVoteProof } from './vote' import type { ProofData } from '@aztec/bb.js' import type { MaskVoteProofRequest, VoteProofRequest } from './types' /** - * A class representing the Crisp SDK. + * A class representing the CRISP SDK. */ export class CrispSDK { /** - * The server URL for the Crisp SDK. - * It's used by methods that communicate directly with the Crisp server. + * The server URL for the CRISP SDK. + * It's used by methods that communicate directly with the CRISP server. */ private serverUrl: string /** - * Create a new instance + * Create a new instance. * @param serverUrl */ constructor(serverUrl: string) { @@ -31,22 +30,21 @@ export class CrispSDK { /** * Generate a proof for a vote masking. + * @param maskProofInputs - The inputs required to generate the mask vote proof. + * @returns A promise that resolves to the generated proof data. */ async generateMaskVoteProof(maskProofInputs: MaskVoteProofRequest): Promise { - // check if the slot is empty first const isSlotEmpty = await getIsSlotEmpty(this.serverUrl, maskProofInputs.e3Id, maskProofInputs.slotAddress) - let previousCiphertext: Uint8Array + let previousCiphertext + if (!isSlotEmpty) { previousCiphertext = await getPreviousCiphertext(this.serverUrl, maskProofInputs.e3Id, maskProofInputs.slotAddress) - } else { - previousCiphertext = encryptVote(ZERO_VOTE, maskProofInputs.publicKey) } return generateMaskVoteProof({ ...maskProofInputs, previousCiphertext, - isFirstVote: isSlotEmpty, }) } @@ -56,20 +54,17 @@ export class CrispSDK { * @returns A promise that resolves to the generated proof data. */ async generateVoteProof(voteProofInputs: VoteProofRequest): Promise { - // check if the slot is empty first const isSlotEmpty = await getIsSlotEmpty(this.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) - let previousCiphertext: Uint8Array + let previousCiphertext + if (!isSlotEmpty) { previousCiphertext = await getPreviousCiphertext(this.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) - } else { - previousCiphertext = encryptVote(ZERO_VOTE, voteProofInputs.publicKey) } return generateVoteProof({ ...voteProofInputs, previousCiphertext, - isFirstVote: isSlotEmpty, }) } } diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index 3ccc55867d..1d79061fc3 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -170,7 +170,7 @@ export type ExecuteCircuitResult = { } export type ProofInputs = { - previousCiphertext: Uint8Array + previousCiphertext?: Uint8Array vote: Vote publicKey: Uint8Array signature: `0x${string}` @@ -178,7 +178,6 @@ export type ProofInputs = { balance: bigint slotAddress: string merkleProof: MerkleProof - isFirstVote: boolean } export type MaskVoteProofInputs = { @@ -186,8 +185,7 @@ export type MaskVoteProofInputs = { balance: bigint slotAddress: string merkleLeaves: string[] | bigint[] - isFirstVote: boolean - previousCiphertext: Uint8Array + previousCiphertext?: Uint8Array } export type MaskVoteProofRequest = { @@ -198,8 +196,7 @@ export type MaskVoteProofRequest = { merkleLeaves: string[] | bigint[] } -export type VoteProofRequest = { - e3Id: number +export type VoteProofInputs = { merkleLeaves: string[] | bigint[] publicKey: Uint8Array balance: bigint @@ -207,9 +204,11 @@ export type VoteProofRequest = { signature: `0x${string}` messageHash: `0x${string}` slotAddress: string + previousCiphertext?: Uint8Array } -export type VoteProofInputs = { +export type VoteProofRequest = { + e3Id: number merkleLeaves: string[] | bigint[] publicKey: Uint8Array balance: bigint @@ -217,13 +216,4 @@ export type VoteProofInputs = { signature: `0x${string}` messageHash: `0x${string}` slotAddress: string - isFirstVote: boolean - previousCiphertext: Uint8Array -} - -export type Signature = { - publicKeyX: Uint8Array - publicKeyY: Uint8Array - signature: Uint8Array - messageHash: Uint8Array } diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index e3577be926..e43bbff6e0 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -147,7 +147,7 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise b.toString()) crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() crispInputs.balance = proofInputs.balance.toString() - crispInputs.is_first_vote = proofInputs.isFirstVote + crispInputs.is_first_vote = !proofInputs.previousCiphertext crispInputs.merkle_root = proofInputs.merkleProof.proof.root.toString() crispInputs.merkle_proof_length = proofInputs.merkleProof.length.toString() crispInputs.merkle_proof_indices = proofInputs.merkleProof.indices.map((i) => i.toString()) @@ -234,7 +231,6 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { ...voteProofInputs, slotAddress: address, merkleProof, - isFirstVote: voteProofInputs.isFirstVote, previousCiphertext: voteProofInputs.previousCiphertext, signature: voteProofInputs.signature, messageHash: voteProofInputs.messageHash, @@ -253,8 +249,6 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn const crispInputs = await generateCircuitInputs({ ...maskVoteProofInputs, - previousCiphertext: maskVoteProofInputs.previousCiphertext, - isFirstVote: maskVoteProofInputs.isFirstVote, signature: MASK_SIGNATURE, messageHash: SIGNATURE_MESSAGE_HASH, vote: ZERO_VOTE, diff --git a/examples/CRISP/packages/crisp-sdk/tests/previous.json b/examples/CRISP/packages/crisp-sdk/tests/fixtures/previous-ciphertext.json similarity index 100% rename from examples/CRISP/packages/crisp-sdk/tests/previous.json rename to examples/CRISP/packages/crisp-sdk/tests/fixtures/previous-ciphertext.json diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index fd8fc92590..075da69168 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -7,11 +7,11 @@ import { describe, it, expect, beforeAll, beforeEach, afterEach, vi } from 'vite import { Vote } from '../src/types' import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, ZERO_VOTE, MASK_SIGNATURE } from '../src/constants' import { generateMerkleProof } from '../src/utils' -import { decodeTally, encryptVote, generatePublicKey, verifyProof, encodeVote, generateCircuitInputs, executeCircuit } from '../src/vote' +import { decodeTally, generatePublicKey, verifyProof, encodeVote, generateCircuitInputs, executeCircuit } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, LEAVES } from './constants' -import previousCiphertextEncoded from './previous.json' +import previousCiphertextEncoded from './fixtures/previous-ciphertext.json' import { CrispSDK } from '../src/sdk' describe('Vote', () => { @@ -22,19 +22,20 @@ describe('Vote', () => { let slotAddress: string let publicKey: Uint8Array - const e3Id = 0 + let e3Id: number + let sdk: CrispSDK - const mockedPreviousCiphertextResponse = { - ciphertext: previousCiphertextEncoded, - } + const mockGetPreviousCiphertextResponse = () => + ({ + ok: true, + json: async () => ({ ciphertext: previousCiphertextEncoded }), + }) as Response - const mockedIsSlotEmptyTrueResponse = { - is_empty: true, - } - - const mockedIsSlotEmptyFalseResponse = { - is_empty: false, - } + const mockIsSlotEmptyResponse = (isEmpty: boolean) => + ({ + ok: true, + json: async () => ({ is_empty: isEmpty }), + }) as Response beforeEach(() => { vi.clearAllMocks() @@ -44,8 +45,6 @@ describe('Vote', () => { vi.restoreAllMocks() }) - const sdk = new CrispSDK(CRISP_SERVER_URL) - // Setup the test environment. beforeAll(async () => { vote = { yes: 10n, no: 0n } @@ -55,6 +54,8 @@ describe('Vote', () => { // Address of the last leaf in the Merkle tree, used for mask votes. slotAddress = '0x145B2260E2DAa2965F933A76f5ff5aE3be5A7e5a' publicKey = generatePublicKey() + e3Id = 0 + sdk = new CrispSDK(CRISP_SERVER_URL) }) describe('decodeTally', () => { @@ -105,8 +106,6 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, address, LEAVES) - const previousCiphertext = encryptVote(ZERO_VOTE, publicKey) - const crispInputs = await generateCircuitInputs({ vote, publicKey, @@ -115,8 +114,6 @@ describe('Vote', () => { balance, slotAddress: address, merkleProof, - isFirstVote: true, - previousCiphertext, }) const { returnValue } = await executeCircuit(crispInputs) @@ -146,7 +143,6 @@ describe('Vote', () => { publicKey, balance, slotAddress, - isFirstVote: false, merkleProof, vote: ZERO_VOTE, signature: MASK_SIGNATURE, @@ -183,8 +179,6 @@ describe('Vote', () => { merkleProof, balance, slotAddress, - isFirstVote: true, - previousCiphertext: encryptVote(vote, publicKey), }) const { returnValue } = await executeCircuit(crispInputs) @@ -206,12 +200,7 @@ describe('Vote', () => { describe('generateVoteProof', () => { it('Should generate a valid vote proof', { timeout: 100000 }, async () => { - const mockIsSlotEmptyResponse = { - ok: true, - json: async () => mockedIsSlotEmptyTrueResponse, - } as Response - - vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse) + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse(true)) const proof = await sdk.generateVoteProof({ vote, @@ -236,12 +225,7 @@ describe('Vote', () => { describe('generateMaskVoteProof', () => { it('Should generate a valid mask vote proof when there are no votes in the slot', { timeout: 100000 }, async () => { - const mockIsSlotEmptyResponse = { - ok: true, - json: async () => mockedIsSlotEmptyTrueResponse, - } as Response - - vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse) + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse(true)) const proof = await sdk.generateMaskVoteProof({ balance, @@ -261,17 +245,9 @@ describe('Vote', () => { }) it('Should generate a valid mask vote proof when there is a previous vote in the slot', { timeout: 100000 }, async () => { - const mockIsSlotEmptyResponse = { - ok: true, - json: async () => mockedIsSlotEmptyFalseResponse, - } as Response - - const mockFetchResponse = { - ok: true, - json: async () => mockedPreviousCiphertextResponse, - } as Response - - vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse).mockResolvedValueOnce(mockFetchResponse) + vi.spyOn(global, 'fetch') + .mockResolvedValueOnce(mockIsSlotEmptyResponse(false)) + .mockResolvedValueOnce(mockGetPreviousCiphertextResponse()) const proof = await sdk.generateMaskVoteProof({ balance, From 6bbb08ee89301c67861adc1e4991fb53d428818b Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 22 Dec 2025 12:00:56 +0100 Subject: [PATCH 2/3] chore(crisp): publish version 0.5.4 - Updated @crisp-e3/sdk to 0.5.4 - Updated @crisp-e3/contracts to 0.5.4 - Updated @crisp-e3/zk-inputs to 0.5.4 - Published to npm --- examples/CRISP/client/package.json | 2 +- examples/CRISP/packages/crisp-contracts/package.json | 2 +- examples/CRISP/packages/crisp-sdk/package.json | 2 +- examples/CRISP/packages/crisp-zk-inputs/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/CRISP/client/package.json b/examples/CRISP/client/package.json index 95b89dfc91..2f6ab8b2c2 100644 --- a/examples/CRISP/client/package.json +++ b/examples/CRISP/client/package.json @@ -18,7 +18,7 @@ "deploy": "gh-pages -d dist" }, "dependencies": { - "@crisp-e3/sdk": "0.5.3", + "@crisp-e3/sdk": "0.5.4", "@emotion/babel-plugin": "^11.11.0", "@emotion/react": "^11.11.4", "@phosphor-icons/react": "^2.1.4", diff --git a/examples/CRISP/packages/crisp-contracts/package.json b/examples/CRISP/packages/crisp-contracts/package.json index e26fc273c8..e880974454 100644 --- a/examples/CRISP/packages/crisp-contracts/package.json +++ b/examples/CRISP/packages/crisp-contracts/package.json @@ -1,6 +1,6 @@ { "name": "@crisp-e3/contracts", - "version": "0.5.3", + "version": "0.5.4", "type": "module", "files": [ "contracts", diff --git a/examples/CRISP/packages/crisp-sdk/package.json b/examples/CRISP/packages/crisp-sdk/package.json index d6e31f59f3..2a2dc0d678 100644 --- a/examples/CRISP/packages/crisp-sdk/package.json +++ b/examples/CRISP/packages/crisp-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@crisp-e3/sdk", - "version": "0.5.3", + "version": "0.5.4", "type": "module", "author": { "name": "gnosisguild", diff --git a/examples/CRISP/packages/crisp-zk-inputs/package.json b/examples/CRISP/packages/crisp-zk-inputs/package.json index 4a0d5619dc..c9120422e6 100644 --- a/examples/CRISP/packages/crisp-zk-inputs/package.json +++ b/examples/CRISP/packages/crisp-zk-inputs/package.json @@ -2,7 +2,7 @@ "name": "@crisp-e3/zk-inputs", "type": "module", "description": "Core logic to pre-compute CRISP ZK inputs (WASM/JavaScript bindings).", - "version": "0.5.3", + "version": "0.5.4", "license": "LGPL-3.0-only", "repository": { "type": "git", From 006c54578c7fb021698587dcfca92b67c5fcc80c Mon Sep 17 00:00:00 2001 From: Cedoor Date: Mon, 22 Dec 2025 12:21:12 +0100 Subject: [PATCH 3/3] chore: update lockfile --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9bfaa4cf21..39779de543 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,7 +143,7 @@ importers: examples/CRISP/client: dependencies: '@crisp-e3/sdk': - specifier: 0.5.3 + specifier: 0.5.4 version: link:../packages/crisp-sdk '@emotion/babel-plugin': specifier: ^11.11.0