From 92661e4a28b318e6465cacf6aef12fcca0c40fc9 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Sun, 18 Jan 2026 22:52:02 +0000 Subject: [PATCH 1/3] chore: add voting token with balance 1 --- .../client/src/hooks/generic/useMintToken.tsx | 2 +- .../client/src/hooks/voting/useVoteCasting.ts | 2 +- .../contracts/Mocks/MockVotingToken.sol | 34 +++++++++++++++++++ .../packages/crisp-contracts/deploy/crisp.ts | 20 +++++++++-- .../crisp-contracts/deployed_contracts.json | 4 +++ .../packages/crisp-contracts/package.json | 3 +- 6 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol diff --git a/examples/CRISP/client/src/hooks/generic/useMintToken.tsx b/examples/CRISP/client/src/hooks/generic/useMintToken.tsx index 70b9e09c01..4fcad7e118 100644 --- a/examples/CRISP/client/src/hooks/generic/useMintToken.tsx +++ b/examples/CRISP/client/src/hooks/generic/useMintToken.tsx @@ -52,7 +52,7 @@ const useToken = () => { abi: iERC20Abi, address: ROUND_TOKEN, functionName: 'mint', - args: [walletClient.account.address, BigInt(1 * 1e18)], + args: [walletClient.account.address, BigInt(1 * 1e9)], chain: getChain(), }) showToast({ diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index d08e75e18b..5f28dc4429 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -328,7 +328,7 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setIsMasking(false) } }, - [user, roundState, broadcastVote, setTxUrl, showToast, navigate, handleProofGeneration, markVotedInRound, handleMask, handleVote], + [user, roundState, broadcastVote, setTxUrl, showToast, navigate, handleProofGeneration, markVotedInRound, handleMask, handleVote, getMerkleLeaves], ) return { diff --git a/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol b/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol new file mode 100644 index 0000000000..cf1cc88281 --- /dev/null +++ b/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity ^0.8.27; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +/// @title MockVotingToken +/// @notice A mock voting token for testing purposes +/// @dev Public mint function that allows to keep balances to 1e9. +/// @dev by default CRISP server will scale down voting power by 1e18/2 +/// @dev in this case leaving everyone with a balance of 1 to vote yes or no +contract MockVotingToken is ERC20 { + // half of 10e18 + uint256 public constant MAX_BALANCE = 1e9; + + constructor() ERC20("Mock Voting Token", "MVT") { + _mint(msg.sender, 1e9); + } + + function mint(address to, uint256) external { + if (balanceOf(to) + 1e9 > MAX_BALANCE) { + // silently fail + return; + } + _mint(to, 1e9); + } + + function decimals() public pure override returns (uint8) { + return 18; + } +} \ No newline at end of file diff --git a/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts b/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts index fbefb7eb74..1cdfa2729f 100644 --- a/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts +++ b/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts @@ -26,11 +26,24 @@ export const deployCRISPContracts = async () => { const chain = hre.globalOptions.network - const useMockVerifier = Boolean(process.env.USE_MOCK_VERIFIER) + const useMocks = Boolean(process.env.USE_MOCKS) - console.log('useMockVerifier', useMockVerifier) + let tokenAddress; + if (useMocks) { + const token = await ethers.deployContract("MockVotingToken"); + tokenAddress = await token.getAddress(); - const verifier = await deployVerifier(useMockVerifier) + storeDeploymentArgs( + { + address: tokenAddress, + blockNumber: await ethers.provider.getBlockNumber(), + }, + 'MockCRISPToken', + chain, + ) + } + + const verifier = await deployVerifier(useMocks) const enclaveAddress = readDeploymentArgs('Enclave', chain)?.address if (!enclaveAddress) { @@ -101,6 +114,7 @@ export const deployCRISPContracts = async () => { Risc0Verifier: ${verifier} HonkVerifier: ${honkVerifierAddress} CRISPProgram: ${crispAddress} + TokenAddress: ${tokenAddress} `) } diff --git a/examples/CRISP/packages/crisp-contracts/deployed_contracts.json b/examples/CRISP/packages/crisp-contracts/deployed_contracts.json index 0838f59471..9cce2a7d76 100644 --- a/examples/CRISP/packages/crisp-contracts/deployed_contracts.json +++ b/examples/CRISP/packages/crisp-contracts/deployed_contracts.json @@ -127,6 +127,10 @@ "MockRISC0Verifier": { "address": "0x51D31a22cBe13dE01C4c1CD8cEd3955fa58a4aC3", "blockNumber": 10043288 + }, + "MockCRISPToken": { + "address": "0x77da6521A1A22e81Df08E98b4Af41D71413EA354", + "blockNumber": 10073653 } } } \ No newline at end of file diff --git a/examples/CRISP/packages/crisp-contracts/package.json b/examples/CRISP/packages/crisp-contracts/package.json index 2858b82cc8..382d085cb0 100644 --- a/examples/CRISP/packages/crisp-contracts/package.json +++ b/examples/CRISP/packages/crisp-contracts/package.json @@ -33,8 +33,9 @@ "ciphernode:add:self": "hardhat ciphernode:add", "clean:deployments": "hardhat utils:clean-deployments", "deploy:contracts": "hardhat run deploy/deploy.ts", + "deploy:contracts:mock": "export USE_MOCKS=true PRINT_ENV_VARS=true && pnpm deploy:contracts", "deploy:contracts:full": "export DEPLOY_ENCLAVE=true && pnpm deploy:contracts", - "deploy:contracts:full:mock": "export DEPLOY_ENCLAVE=true USE_MOCK_VERIFIER=true PRINT_ENV_VARS=true && pnpm deploy:contracts", + "deploy:contracts:full:mock": "export DEPLOY_ENCLAVE=true USE_MOCKS=true PRINT_ENV_VARS=true && pnpm deploy:contracts", "test": "hardhat test mocha", "verify": "hardhat run deploy/verify.ts", "updateSubmissionWindow": "hardhat ciphernode:window" From a047269dd327aa8102736d5c9ea6c733e703e0a6 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Sun, 18 Jan 2026 22:56:14 +0000 Subject: [PATCH 2/3] chore: format --- .../client/src/hooks/voting/useVoteCasting.ts | 14 +++++++- .../contracts/Mocks/MockVotingToken.sol | 34 +++++++++---------- .../packages/crisp-contracts/deploy/crisp.ts | 6 ++-- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index 5f28dc4429..23a81ad0d6 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -328,7 +328,19 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setIsMasking(false) } }, - [user, roundState, broadcastVote, setTxUrl, showToast, navigate, handleProofGeneration, markVotedInRound, handleMask, handleVote, getMerkleLeaves], + [ + user, + roundState, + broadcastVote, + setTxUrl, + showToast, + navigate, + handleProofGeneration, + markVotedInRound, + handleMask, + handleVote, + getMerkleLeaves, + ], ) return { diff --git a/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol b/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol index cf1cc88281..17693f2bf6 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/Mocks/MockVotingToken.sol @@ -9,26 +9,26 @@ import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; /// @title MockVotingToken /// @notice A mock voting token for testing purposes -/// @dev Public mint function that allows to keep balances to 1e9. -/// @dev by default CRISP server will scale down voting power by 1e18/2 +/// @dev Public mint function that allows to keep balances to 1e9. +/// @dev by default CRISP server will scale down voting power by 1e18/2 /// @dev in this case leaving everyone with a balance of 1 to vote yes or no contract MockVotingToken is ERC20 { - // half of 10e18 - uint256 public constant MAX_BALANCE = 1e9; + // half of 10e18 + uint256 public constant MAX_BALANCE = 1e9; - constructor() ERC20("Mock Voting Token", "MVT") { - _mint(msg.sender, 1e9); - } + constructor() ERC20("Mock Voting Token", "MVT") { + _mint(msg.sender, 1e9); + } - function mint(address to, uint256) external { - if (balanceOf(to) + 1e9 > MAX_BALANCE) { - // silently fail - return; - } - _mint(to, 1e9); + function mint(address to, uint256) external { + if (balanceOf(to) + 1e9 > MAX_BALANCE) { + // silently fail + return; } + _mint(to, 1e9); + } - function decimals() public pure override returns (uint8) { - return 18; - } -} \ No newline at end of file + function decimals() public pure override returns (uint8) { + return 18; + } +} diff --git a/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts b/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts index 1cdfa2729f..01ade94e81 100644 --- a/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts +++ b/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts @@ -28,10 +28,10 @@ export const deployCRISPContracts = async () => { const useMocks = Boolean(process.env.USE_MOCKS) - let tokenAddress; + let tokenAddress if (useMocks) { - const token = await ethers.deployContract("MockVotingToken"); - tokenAddress = await token.getAddress(); + const token = await ethers.deployContract('MockVotingToken') + tokenAddress = await token.getAddress() storeDeploymentArgs( { From 92d03cd502949d4d356af7f37f3fa97157843aef Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Mon, 19 Jan 2026 08:26:12 +0000 Subject: [PATCH 3/3] chore: pr comments --- .../packages/crisp-contracts/.env.example | 5 ++- .../packages/crisp-contracts/deploy/crisp.ts | 31 ++++++++++--------- examples/CRISP/scripts/crisp_deploy.sh | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/CRISP/packages/crisp-contracts/.env.example b/examples/CRISP/packages/crisp-contracts/.env.example index 1fe016db7d..6279b65f72 100644 --- a/examples/CRISP/packages/crisp-contracts/.env.example +++ b/examples/CRISP/packages/crisp-contracts/.env.example @@ -4,6 +4,5 @@ MNEMONIC="" PRIVATE_KEY="" # The RPC URL for the Ethereum network (e.g., Infura, Alchemy) RPC_URL="" -# Whether to use mock verifier and input validator contracts -USE_MOCK_VERIFIER= -USE_MOCK_INPUT_VALIDATOR= \ No newline at end of file +# Whether to use mock verifier and deploy a new mock token contract +USE_MOCKS= diff --git a/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts b/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts index 01ade94e81..4d44ab1693 100644 --- a/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts +++ b/examples/CRISP/packages/crisp-contracts/deploy/crisp.ts @@ -28,21 +28,6 @@ export const deployCRISPContracts = async () => { const useMocks = Boolean(process.env.USE_MOCKS) - let tokenAddress - if (useMocks) { - const token = await ethers.deployContract('MockVotingToken') - tokenAddress = await token.getAddress() - - storeDeploymentArgs( - { - address: tokenAddress, - blockNumber: await ethers.provider.getBlockNumber(), - }, - 'MockCRISPToken', - chain, - ) - } - const verifier = await deployVerifier(useMocks) const enclaveAddress = readDeploymentArgs('Enclave', chain)?.address @@ -107,6 +92,22 @@ export const deployCRISPContracts = async () => { const tx = await enclave.enableE3Program(crispAddress) await tx.wait() + let tokenAddress + if (useMocks) { + const token = await ethers.deployContract('MockVotingToken') + await token.waitForDeployment() + tokenAddress = await token.getAddress() + + storeDeploymentArgs( + { + address: tokenAddress, + blockNumber: await ethers.provider.getBlockNumber(), + }, + 'MockCRISPToken', + chain, + ) + } + console.log(` Deployments: ---------------------------------------------------------------------- diff --git a/examples/CRISP/scripts/crisp_deploy.sh b/examples/CRISP/scripts/crisp_deploy.sh index 47670347d0..4022484067 100755 --- a/examples/CRISP/scripts/crisp_deploy.sh +++ b/examples/CRISP/scripts/crisp_deploy.sh @@ -9,4 +9,4 @@ export PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4 cd packages/crisp-contracts pnpm clean:deployments --network localhost -USE_MOCK_VERIFIER=true pnpm deploy:contracts:full:mock --network localhost +USE_MOCKS=true pnpm deploy:contracts:full:mock --network localhost