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
| Package | Purpose |
|---|---|
@zama-fhe/relayer-sdk | FHE operations |
ethers | Ethereum interaction |
idb | IndexedDB 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>
);
}