@cofhe/sdk is the successor to cofhejs, redesigned around an explicit, builder-pattern API that gives you full control over encryption, decryption, and permit management.
Why migrate?
- Explicit API — no more implicit initialization or auto-generated permits. Every action is opt-in.
- Builder pattern —
encryptInputs,decryptForView, anddecryptForTxuse a chainable builder so you can set overrides (account, chain, callbacks) before calling.execute(). decryptForTxfeature —cofhejsdoes not provide an API for generating decryption signatures for on-chain usage.- Deferred key loading — FHE keys and TFHE WASM are fetched lazily on the first
encryptInputscall, not during initialization. - Better multichain support — configure multiple chains up front and override per-call.
- Structured errors — typed
CofheErrorobjects with error codes replace theResultwrapper.
Requirements
- Node.js 18+
- TypeScript 5+
- Viem 2+
Installation
Removecofhejs and install @cofhe/sdk:
1. Initialization
The singlecofhejs.initializeWithEthers(...) / cofhejs.initializeWithViem(...) call is replaced by a three-step flow: create a config, create a client, then connect. FHE keys and WASM are no longer fetched eagerly during init — they are deferred until the first encryptInputs call.
Changes
Changes
Before (cofhejs)
After (@cofhe/sdk)
2. Encrypting inputs
cofhejs.encrypt(...) is replaced by a builder: client.encryptInputs([...]).execute().
Changes
Changes
Before (cofhejs)
After (@cofhe/sdk)
The
Encryptable factory functions (Encryptable.uint32(...), Encryptable.bool(...), etc.) work the same way in both libraries.3. Decrypting / Unsealing
cofhejs has a single unseal function. @cofhe/sdk splits decryption into two purpose-built methods:
decryptForView— returns the plaintext for UI display (no on-chain signature).decryptForTx— returns the plaintext and a Threshold Network signature for on-chain verification.
Changes
Changes
Before (cofhejs)
After (@cofhe/sdk) — viewing in UI
After (@cofhe/sdk) — publishing on-chain
4. Permits
Permits are no longer auto-generated during initialization. All permit operations are now explicit throughclient.permits.
Changes
Changes