Skip to main content
Set up a Foundry project with @cofhe/foundry-plugin, write a contract that stores an encrypted uint32, and test the encrypt → store → decrypt flow under forge test.
Want to skip the setup? Clone the cofhe-foundry-starter template to get a pre-configured project with everything ready to go.

Prerequisites

  • Foundry (forge, cast, anvil)
  • Node.js 18+ with npm/pnpm/yarn (for installing the plugin’s npm packages)

1. Install dependencies

The plugin and its CoFHE dependencies are distributed via npm. Install them as dev dependencies, then forge install for forge-std:

2. Configure foundry.toml

foundry.toml
  • evm_version = "cancun" is required — MockACL uses transient storage opcodes.
  • code_size_limit = 100000 is required — the mock contracts exceed the EIP-170 24 KB limit.

3. Configure remappings.txt

remappings.txt
The hardhat/=node_modules/forge-std/src/ line is load-bearingMockCoFHE.sol imports hardhat/console.sol, and this alias resolves it to forge-std’s compatible console.sol.

4. Write a contract

src/MyContract.sol
  • euint32 — an encrypted uint32 stored on-chain as a ciphertext handle.
  • InEuint32 — the encrypted input struct produced by CofheClient.
  • FHE.allowThis / FHE.allowSender — grant the contract and caller permission to read the encrypted value (required by the ACL).

5. Write a test

test/MyContract.t.sol

6. Run

What just happened?

  1. deployMocks() deployed the full CoFHE coprocessor mock stack (TaskManager, ACL, ZK verifier, threshold network) to the in-process EVM.
  2. createCofheClient() + bob.connect(BOB_PKEY) spun up an in-Solidity SDK shim bound to vm.addr(BOB_PKEY).
  3. bob.createInEuint32(42) produced a signed InEuint32 — the same shape your contract receives on testnet, signed by MockZkVerifierSigner.
  4. vm.prank(bob.account()) + setValue(...) called the contract as Bob. The contract stored the ciphertext handle and granted ACL access to itself and Bob.
  5. expectPlaintext(myContract.storedValue(), 42) read the on-chain plaintext directly from MockTaskManager.mockStorage — no permit, no SDK round-trip.

Next steps