Skip to main content

fhevm-sdk

React SDK for FHE operations with fhEVM.

Overview

The SDK provides:

  • React hooks for FHE encryption/decryption
  • Decryption signature management
  • FHEVM instance lifecycle
  • Storage utilities for signatures

Installation

The SDK is a workspace package:

import { useFHEEncryption, useFHEDecrypt } from 'fhevm-sdk/react';

Exports

fhevm-sdk
├── /core # Core FHEVM utilities
├── /react # React hooks
├── /storage # Storage utilities
└── /types # Type definitions

React Hooks

useFhevm

Manages FHEVM instance lifecycle:

const { instance, isLoading, error } = useFhevm({
chainId: 11155111,
relayerUrl: 'https://relayer.sepolia.zama.ai'
});

useFHEEncryption

Encrypts values for on-chain operations:

const { encrypt, isReady } = useFHEEncryption({ instance });

const encryptedAmount = await encrypt(1000000n);

useFHEDecrypt

Decrypts FHE handles:

const {
decrypt,
createSignature,
hasSignature
} = useFHEDecrypt({ instance });

// Create signature (once per 365 days)
await createSignature([tokenAddress]);

// Decrypt handle
const clearValue = await decrypt(handle);

useInMemoryStorage

Manages signature storage:

const {
getSignature,
setSignature,
clearSignature
} = useInMemoryStorage();

Decryption Signatures

Signatures authorize server-side decryption:

interface DecryptionSignature {
signature: string; // Wallet signature
publicKey: string; // Ephemeral public key
privateKey: string; // Ephemeral private key (NOT wallet key)
userAddress: string;
contractAddresses: string[];
startTimestamp: number;
durationDays: number;
}

Building

# From monorepo root
pnpm sdk:build

# Watch mode
pnpm sdk:watch

# Run tests
pnpm sdk:test

Dependencies

PackagePurpose
@zama-fhe/relayer-sdkFHE operations
ethersEthereum interaction
idbIndexedDB storage

Usage Example

import { useFhevm, useFHEEncryption } from 'fhevm-sdk/react';

function PaymentComponent() {
const { instance } = useFhevm({ chainId: 11155111 });
const { encrypt, isReady } = useFHEEncryption({ instance });

const handlePayment = async (amount: bigint) => {
if (!isReady) return;

const encrypted = await encrypt(amount);
// Use encrypted value for transfer
};

return (
<button onClick={() => handlePayment(1000000n)}>
Pay
</button>
);
}