@fhevmsdk/react
v0.3.0
Published
React hooks and components for FHEVM SDK
Maintainers
Readme
@fhevmsdk/react
React hooks and components for FHEVM SDK with a wagmi-like API.
📦 Installation
pnpm install @fhevmsdk/react @fhevmsdk/core wagmi viem🚀 Quick Start
1. Setup Providers
import { WagmiProvider, createConfig } from 'wagmi'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { FHEVMProvider } from '@fhevmsdk/react'
const wagmiConfig = createConfig({ /* your config */ })
const queryClient = new QueryClient()
function App() {
return (
<WagmiProvider config={wagmiConfig}>
<QueryClientProvider client={queryClient}>
<FHEVMProvider network="sepolia">
<YourApp />
</FHEVMProvider>
</QueryClientProvider>
</WagmiProvider>
)
}2. Use Hooks in Components
import {
useFHEVM,
useConfidentialBalance,
useConfidentialTransfer,
} from '@fhevmsdk/react'
function TokenTransfer() {
const { isReady } = useFHEVM()
const { decryptedBalance, revealBalance, formatBalance } =
useConfidentialBalance({
contractAddress: '0x...',
abi: tokenABI,
})
const { transfer, isLoading } = useConfidentialTransfer({
contractAddress: '0x...',
abi: tokenABI,
})
if (!isReady) return <div>Loading FHEVM...</div>
return (
<div>
<button onClick={revealBalance}>Show Balance</button>
{decryptedBalance && <p>{formatBalance(decryptedBalance)}</p>}
<button onClick={() => transfer({ to: '0x...', amount: '10' })}>
Transfer
</button>
</div>
)
}📚 Hooks API
useFHEVM()
Main hook to access FHEVM client and status.
const { client, isReady, error, retry } = useFHEVM()Returns:
client: FHEVMClient | nullisReady: boolean - Whether FHEVM is initializederror: string | null - Initialization errorretry: () => void - Retry initialization
useEncrypt()
Hook for encrypting values.
const {
encryptUint8,
encryptUint16,
encryptUint32,
encryptUint64,
encryptUint128,
encryptUint256,
isEncrypting,
error,
canEncrypt,
} = useEncrypt()
// Usage
const encrypted = await encryptUint64({
value: 1000000n,
contractAddress: '0x...',
})
// Returns: { data: '0x...', proof: '0x...' }Parameters:
value: bigint - Value to encryptcontractAddress: string - Target contract address
Returns:
data:0x${string}- Encrypted handleproof:0x${string}- Encryption proof
useDecrypt()
Hook for decrypting values.
const { decrypt, isDecrypting, error, canDecrypt } = useDecrypt()
// Usage
const decrypted = await decrypt({
ciphertextHandle: '0x...',
contractAddress: '0x...',
})
// Returns: bigintuseConfidentialBalance(params)
Hook to read and decrypt confidential token balances.
const {
encryptedBalance,
decryptedBalance,
isVisible,
isLoading,
isDecrypting,
revealBalance,
hideBalance,
formatBalance,
refetch,
} = useConfidentialBalance({
contractAddress: '0x...',
abi: tokenABI,
functionName: 'confidentialBalanceOf', // optional
decimals: 6, // optional
})Parameters:
contractAddress: Address of the token contractabi: Contract ABIfunctionName: Function name (default: 'confidentialBalanceOf')decimals: Token decimals (default: 6)
Returns:
encryptedBalance: Encrypted balance handledecryptedBalance: Decrypted balance (null until revealed)isVisible: Whether balance is currently revealedrevealBalance(): Decrypt and show balancehideBalance(): Hide decrypted balanceformatBalance(bigint): Format balance for display
useConfidentialTransfer(params)
Hook to perform confidential token transfers.
const {
transfer,
isLoading,
isPreparingTx,
isEncrypting,
isPending,
isConfirming,
isSuccess,
txHash,
error,
reset,
canTransfer,
} = useConfidentialTransfer({
contractAddress: '0x...',
abi: tokenABI,
functionName: 'confidentialTransfer', // optional
decimals: 6, // optional
})
// Usage
await transfer({
to: '0x...',
amount: '10.5', // or bigint
})Parameters:
contractAddress: Address of the token contractabi: Contract ABIfunctionName: Function name (default: 'confidentialTransfer')decimals: Token decimals (default: 6)
Transfer Parameters:
to: Recipient addressamount: Amount as string or bigint
Returns:
transfer(params): Execute transferisLoading: Overall loading stateisPreparingTx: Preparing transactionisEncrypting: Encrypting amountisPending: Transaction pendingisConfirming: Waiting for confirmationisSuccess: Transaction successfultxHash: Transaction hasherror: Error messagereset(): Reset statecanTransfer: Whether transfer can be executed
🎯 Complete Example
import { useState } from 'react'
import { ConnectKitButton } from 'connectkit'
import {
useFHEVM,
useConfidentialBalance,
useConfidentialTransfer,
} from '@fhevmsdk/react'
const TOKEN_ADDRESS = '0x...'
const TOKEN_ABI = [/* ... */]
function TokenDApp() {
const { isReady, error, retry } = useFHEVM()
const [recipient, setRecipient] = useState('')
const [amount, setAmount] = useState('')
const {
decryptedBalance,
isVisible,
revealBalance,
hideBalance,
formatBalance,
} = useConfidentialBalance({
contractAddress: TOKEN_ADDRESS,
abi: TOKEN_ABI,
decimals: 6,
})
const {
transfer,
isLoading,
isSuccess,
error: transferError,
} = useConfidentialTransfer({
contractAddress: TOKEN_ADDRESS,
abi: TOKEN_ABI,
decimals: 6,
})
if (error) {
return (
<div>
<p>Error: {error}</p>
<button onClick={retry}>Retry</button>
</div>
)
}
if (!isReady) {
return <div>Loading FHEVM...</div>
}
return (
<div>
<h1>Confidential Token</h1>
<ConnectKitButton />
<div>
<h2>Balance</h2>
{isVisible && decryptedBalance ? (
<>
<p>{formatBalance(decryptedBalance)}</p>
<button onClick={hideBalance}>Hide</button>
</>
) : (
<button onClick={revealBalance}>Reveal</button>
)}
</div>
<div>
<h2>Transfer</h2>
<input
placeholder="Recipient"
value={recipient}
onChange={(e) => setRecipient(e.target.value)}
/>
<input
placeholder="Amount"
value={amount}
onChange={(e) => setAmount(e.target.value)}
/>
<button
onClick={() => transfer({ to: recipient, amount })}
disabled={isLoading}
>
{isLoading ? 'Transferring...' : 'Transfer'}
</button>
{isSuccess && <p>Transfer successful!</p>}
{transferError && <p>Error: {transferError}</p>}
</div>
</div>
)
}🔧 Provider Configuration
<FHEVMProvider
network="sepolia" // or custom NetworkConfig
config={{ // optional custom config
network: customNetworkConfig,
provider: customProvider,
}}
>
{children}
</FHEVMProvider>📝 TypeScript
All hooks are fully typed. Import types from @fhevmsdk/core:
import type {
FHEVMClient,
EncryptedValue,
NetworkConfig,
} from '@fhevmsdk/react'⚠️ Important Notes
- Wagmi Required: This package requires wagmi to be configured
- React 18+: Requires React 18 or higher
- Provider Order: FHEVMProvider must be inside WagmiProvider
- Single Instance: FHEVM uses a singleton pattern to prevent multiple initializations
🔗 Related Packages
- @fhevmsdk/core - Core SDK
- wagmi - React hooks for Ethereum
📄 License
MIT
