Skip to content

Feat/fhevm sdk wagmi style#42

Draft
poppyseedDev wants to merge 51 commits into
mainfrom
feat/fhevm-sdk-wagmi-style
Draft

Feat/fhevm sdk wagmi style#42
poppyseedDev wants to merge 51 commits into
mainfrom
feat/fhevm-sdk-wagmi-style

Conversation

@poppyseedDev

Copy link
Copy Markdown
Contributor

No description provided.

poppyseedDev and others added 28 commits January 21, 2026 17:28
Add wagmi-inspired chain configuration system:
- FhevmChain type with id, name, network, isMock, rpcUrl, etc.
- Pre-configured chains: hardhatLocal (31337), sepolia (11155111)
- Helper functions: defineChain, defineMockChain, defineProductionChain
- Type guards: isMockChain, isProductionChain
- createHardhatChain for custom local nodes

This is Phase 1 of the wagmi-style SDK refactor.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add configuration system similar to wagmi's createConfig:
- createFhevmConfig() factory function
- FhevmConfig interface with chain lookup methods
- Storage abstraction (noopStorage, createMemoryStorage, createStorage)
- SSR mode support with automatic storage selection
- Type-safe chain ID extraction

This is Phase 2 of the wagmi-style SDK refactor.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add React provider and hooks for wagmi-style FHEVM usage:
- FhevmProvider: manages FHEVM instance lifecycle with wagmi integration
- FhevmContext: React context for FHEVM state
- useFhevmStatus: hook for initialization status (isReady, isError, etc.)
- useFhevmClient: hook for direct FHEVM instance access

Features:
- Auto-initializes when wagmi connects
- Handles chain changes gracefully
- SSR support with deferred initialization
- Abort controller for cleanup on unmount/re-init
- Mock chain detection from config

This is Phase 3 of the wagmi-style SDK refactor.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add simpler hook APIs that use the FhevmProvider context:

useEncrypt:
- encrypt(type, value, contractAddress) - encrypt single value
- encryptBatch(inputs, contractAddress) - encrypt multiple values
- encryptWith(contractAddress, builderFn) - low-level builder access
- isReady flag for UI feedback

useDecrypt:
- Uses config storage automatically for signature persistence
- canDecrypt, results, decrypt(), isDecrypting, message, error
- Handles stale request detection and cancellation

Both hooks get the FHEVM instance from context automatically,
eliminating the need to pass it as a prop.

This is Phase 4 of the wagmi-style SDK refactor.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update SDK exports to include new wagmi-style API:

Main entry (fhevm-sdk):
- createFhevmConfig, FhevmConfig, FhevmStorage
- All chain definitions (sepolia, hardhatLocal, defineChain, etc.)
- FhevmProvider, useEncrypt, useDecrypt, useFhevmStatus, useFhevmClient

New subpath export (fhevm-sdk/chains):
- Direct access to chain definitions

React exports (fhevm-sdk/react):
- New wagmi-style hooks first
- Legacy hooks maintained for backward compatibility

All existing exports preserved for backward compatibility.

This is Phase 5 of the wagmi-style SDK refactor.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add FhevmSetup component that wraps children with FhevmProvider:
- Creates fhevmConfig with sepolia and hardhatLocal chains
- Gets connection state from wagmi's useAccount
- Passes wagmi state to FhevmProvider for auto-initialization
- Replaces InMemoryStorageProvider (storage now managed by config)

The existing ERC7984Demo continues to work via backward compatibility
with the legacy useFhevm hook. Future refactors can migrate to
the new useEncrypt/useDecrypt hooks for cleaner code.

This is Phase 6 of the wagmi-style SDK refactor.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update plan notes with completion status and commit references.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add @tanstack/react-query as peer dependency (optional)
- Add @tanstack/react-query as dev dependency for testing
- Create queryClient.ts with SDK-specific defaults
- Wrap FhevmProvider children with QueryClientProvider

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create queryKeys.ts with hierarchical key structure
- Support keys for decrypt, signature, encrypt, instance operations
- Add comprehensive tests for key generation
- Enable granular cache invalidation patterns

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace manual state management with TanStack Query useMutation
- Cache individual decrypted values in query client for fast lookups
- Add isSuccess, isError, isIdle fields to return type
- Fix query key type helper
- Maintain backward compatibility with existing API

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add useDecryptedValue for single value cache lookup
- Add useDecryptedValues for batch cache lookups
- Read-only access to decryption cache without triggering decryption
- Useful for checking if values have been decrypted before

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add EncryptMutationState interface for mutation tracking
- Add mutation property to UseEncryptReturn
- Provides isPending, isSuccess, isError, isIdle states
- Maintains backward compatibility with existing async functions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Export useDecryptedValue, useDecryptedValues for cache lookups
- Export fhevmQueryClient, createFhevmQueryClient for custom configuration
- Export fhevmKeys query key factory
- Export EncryptMutationState type

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 1 of DX simplification plan:
- ERC7984Demo now uses useFhevmStatus() and useFhevmContext() instead of useFhevm()
- Removed ~40 lines of FHEVM setup boilerplate (provider, isMounted, fhevmEnabled state)
- useERC7984Wagmi now gets instance from context if not provided as prop
- Parameters are now optional with sensible defaults

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 2 of DX simplification plan:
- Add DecryptParams type for simple { handle, contractAddress } usage
- Auto-detect signer from window.ethereum if not provided
- Support both simple single-handle and batch request patterns:
  - useDecrypt({ handle, contractAddress }) // Simple
  - useDecrypt([...requests], signer)       // Batch (signer now optional)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 3 of DX simplification plan:
- encrypt() now supports two patterns:
  - encrypt(value, contractAddress) - defaults to uint64
  - encrypt(type, value, contractAddress) - explicit type
- mutation.mutate() type is now optional (defaults to uint64)
- Added EncryptMutationParams type for cleaner mutation calls

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 4 of DX simplification plan:
- Create useEthersSigner hook that gets signer from window.ethereum
- Uses address from FhevmProvider context automatically
- Returns { signer, provider, isLoading, error, isReady }
- Removes need for frontend's useWagmiEthers in most cases

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 5 & 6 of DX simplification plan:
- Replace useFHEDecrypt with new useDecrypt({ handle, contractAddress })
- Replace useFHEEncryption with new useEncrypt()
- Replace useWagmiEthers with SDK's useEthersSigner
- Remove instance and initialMockChains parameters (use context)
- Simplify transferTokens to use encrypt(value, contract) with default uint64
- Remove getEncryptionMethodForTransfer complexity (~20 lines removed)

Reduction: ~60 lines of code removed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 7 of DX simplification plan:
- Remove instance and fhevmStatus props (use context instead)
- Replace useWagmiEthers with SDK's useEthersSigner
- Remove initialMockChains duplication
- Update ERC7984Demo to call <FHEBenchmark /> without props

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 8 of DX simplification plan:
- useWagmiEthers is no longer used (replaced by SDK's useEthersSigner)
- Delete hooks/wagmi/useWagmiEthers.ts (~70 lines removed)
- Remove empty hooks/wagmi/ directory

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add chainId as dependency to useEthersSigner and useDecrypt auto-signer
creation. This prevents "network changed" errors from ethers.js when
switching chains, as the provider/signer are now properly recreated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Cleanup of dead code:
- Delete utils/helper/decodeTxData.ts (unused TX decoding)
- Delete utils/helper/block.ts (unused block types)
- Delete utils/helper/contractsData.ts (unused hook, replaced by useDeployedContractInfo)
- Delete utils/helper/getParsedError.ts (unused error parsing)
- Remove unused exports from utils/helper/index.ts
- Remove unused getParsedErrorWithAllAbis and simulateContractWriteAndNotifyError from contract.ts
- Remove unused imports (keccak256, toHex, notification, simulateContract)

Total: ~450 lines of dead code removed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Merge DappWrapperWithProviders and FhevmSetup into providers.tsx
- Simplify layout.tsx to just HTML shell with ThemeProvider
- FhevmWrapper now lives inside AppProviders with useAccount access
- Delete redundant DappWrapperWithProviders.tsx and FhevmSetup.tsx

Provider hierarchy is now:
  layout.tsx → ThemeProvider → AppProviders → (Privy|Wagmi) → QueryClient → AppLayout → FhevmWrapper

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace manual instance.createEncryptedInput() calls with useEncrypt hook
- Use encryptWith() builder pattern for encryption
- Remove useFhevmContext and useEthersSigner imports (no longer needed)
- Simplify isReady check to use encryptReady from hook

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename useDecrypt.ts → useUserDecrypt.ts
- Rename useDecryptedValue.ts → useUserDecryptedValue.ts
- Update exports in index.ts

The "User" prefix clarifies these hooks use the userDecrypt API
(client-side decryption) vs potential future gateway decryption.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Complete API documentation covering:
- Quick Start guide with basic setup examples
- Configuration (createFhevmConfig, chains, storage options)
- Provider setup (FhevmProvider with wagmi integration)
- Hooks API reference (useEncrypt, useUserDecrypt, useFhevmStatus, etc.)
- Types reference (core types, decryption, chain, storage)
- Migration guide from legacy hooks to new wagmi-style API
- Best practices for encryption/decryption operations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jan 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
dapps Error Error Feb 23, 2026 2:30pm

Request Review

poppyseedDev and others added 13 commits January 24, 2026 12:16
Complete API documentation covering:
- Quick Start guide with basic setup examples
- Configuration (createFhevmConfig, chains, storage options)
- Provider setup (FhevmProvider with wagmi integration)
- Hooks API reference (useEncrypt, useUserDecrypt, useFhevmStatus, etc.)
- Types reference (core types, decryption, chain, storage)
- Migration guide from legacy hooks to new wagmi-style API
- Best practices for encryption/decryption operations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Multi-page documentation structure:
- SUMMARY.md: GitBook table of contents
- README.md: Introduction and overview
- getting-started/: Installation and Quick Start guides
- configuration/: Config overview, chains, and storage
- provider/: FhevmProvider setup and options
- hooks/: Individual pages for each hook API
  - useEncrypt, useUserDecrypt, useFhevmStatus
  - useFhevmClient, useEthersSigner, useUserDecryptedValue
- types/: Complete TypeScript types reference
- migration/: Guide from legacy to new API

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Public decryption reveals encrypted values to everyone, useful for:
- Auction results visible on-chain
- Game outcomes
- Any values that should be publicly revealed

Key features:
- Simple API: just pass array of handles
- Returns full result with proof for contract callbacks
- Includes abiEncodedClearValues and decryptionProof
- TanStack Query integration for caching
- No signature required (unlike useUserDecrypt)

Contract must call FHE.makePubliclyDecryptable(handle) first.

Also adds documentation page and updates types reference.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update documentation and comments to reflect the hook rename:
- context.ts: Update internal comment
- useFhevmClient.ts: Update JSDoc reference
- useERC7984Wagmi.tsx: Already using useUserDecrypt
- notes/: Update planning docs with new hook names
- hooks.test.ts: Update test references

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Plan to create a demo component testing usePublicDecrypt hook:
- Deploy PublicDecryptSingleValue contract
- Create PublicDecryptDemo.tsx component
- Show full flow: initialize → request decrypt → client decrypt → submit callback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Demonstrates usePublicDecrypt hook with PublicDecryptSingleValue contract:

1. Initialize: Store encrypted value (input + 1)
2. Request Decrypt: Mark value as publicly decryptable on-chain
3. Client Decrypt: Use usePublicDecrypt to get decrypted value
4. Submit Callback: Send proof to contract for verification

Also adds PublicDecryptSingleValue to deployment script.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add /benchmark page for FHEBenchmark component
- Add /public-decrypt page for PublicDecryptDemo component
- Update Header with navigation links to all pages
- Update home page to only show ERC7984Demo
- Fix Quick Example in docs to show complete flow

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove unused FHEBenchmark import from ERC7984Demo
- Move Messages section higher in the UI
- Update deployedContracts with latest local deployment addresses

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New encrypt API:
- Returns destructurable tuple: [handle1, handle2, ..., proof]
- Type-safe inputs via discriminated unions
- Compile-time enforcement of correct value types per FHE type

Example:
```ts
const [amountHandle, proof] = await encrypt([
  { type: "uint64", value: 100n },
], contractAddress);
```

Type safety:
- uint64/uint128/uint256 require bigint
- uint8/uint16/uint32 require number
- bool requires boolean
- address requires `0x${string}`

Files:
- Add src/types/encryption.ts with EncryptInput discriminated union
- Simplify useEncrypt.ts to single encrypt() function
- Update FHEBenchmark and useERC7984Wagmi to new API
- Add encryption-types.test.ts for type validation
- Update all documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Users no longer need to manually add the relayer SDK script tag.
FhevmProvider now automatically loads it on mount.

Changes:
- Add useRelayerScript hook for dynamic script injection
- Integrate script loading into FhevmProvider
- Lock relayer SDK version internally (0.4.0-4)
- Expose script errors via useFhevmStatus
- Remove Script tag from example app layout
- Update documentation

Before:
```tsx
<Script src="...relayer-sdk..." strategy="beforeInteractive" />
<FhevmProvider>...</FhevmProvider>
```

After:
```tsx
<FhevmProvider>...</FhevmProvider>
```

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create dedicated page explaining multi-threaded vs single-threaded modes
- Document COOP/COEP header requirements for multi-threading
- Explain trade-offs: faster encryption vs wallet extension compatibility
- Add configuration examples for Next.js, Vite, and Nginx
- Remove Cross-Origin Isolation section from installation.md
- Add link to new threading page from installation guide

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Create three minimal example apps to test fhevm-sdk with different
web3 library combinations:
- example-wagmi: official create-wagmi template
- example-ethers: Vite + React + ethers.js with custom useWallet hook
- example-viem: Vite + React + viem with custom useWallet hook

Also adds planning notes for SDK restructuring to support these environments.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove hard ethers.js dependency for end users. The SDK now uses EIP-1193
providers directly, enabling support for wagmi, viem, ethers, or raw
window.ethereum without library lock-in.

Key changes:
- Add src/internal/eip1193.ts with signTypedData, isAddress utilities
- Add src/internal/rpc.ts for JSON-RPC calls via fetch
- Add src/storage/adapters.ts with memoryStorage, localStorage adapters
- Update FhevmDecryptionSignature to use EIP-1193 for signing
- Update FhevmProvider with explicit props (address, chainId, isConnected)
- Deprecate wagmi prop in favor of explicit props
- Fix BigInt serialization in eth_signTypedData_v4 calls

Example apps updated:
- example-wagmi: uses useConnection + connector transport
- example-ethers: custom useWallet hook with checksummed addresses
- example-viem: custom useWallet hook with viem utilities
- erc7984example: updated to use new explicit props

Security model: SDK no longer provides default storage. Developers must
explicitly choose their storage strategy (memoryStorage, localStorage, etc.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update quick-start.md with new explicit props pattern
- Update storage.md with new storage adapters (memoryStorage, etc.)
- Mark useEthersSigner as deprecated with migration guide
- Update fhevm-provider.md with new API and integration examples

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…caching

- Add toast notifications for encryption/decryption/transfer operations
- Move toasts to top-right position
- Remove redundant message displays and status cards
- Switch storage from memoryStorage to localStorageAdapter for persistent caching
- Add TransferStatus type for detailed transfer feedback
- Fix BigInt serialization in signature caching (JSON.stringify/parse)
- Simplify storage key to be stable across page loads
- Add debug logging for storage operations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Quick Start section with recommended option
- Document custom prefix functions (createLocalStorageAdapter, createSessionStorageAdapter)
- Add "When to use" guidance for each storage type
- Add custom storage examples (IndexedDB, encrypted, React Native)
- Document signature validity (24 hours)
- Add section on clearing cached signatures
- Add troubleshooting section
- Update security comparison table

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove outdated migration guide (API has stabilized)
- Update next-env.d.ts routes path (auto-generated by Next.js)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
poppyseedDev and others added 4 commits January 28, 2026 13:36
…ersion

Add new hooks for converting between ERC20 and ERC7984 confidential tokens:
- useShield: wraps ERC20 tokens into ERC7984 confidential tokens
- useUnshield: unwraps ERC7984 tokens back to ERC20

Also includes shield demo page, token utilities, and documentation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move packages/fhevm-sdk to fhevm-sdk/ at root level to prepare for
extraction as a separate repository. Also moves docs/ into fhevm-sdk/.

Changes:
- Move packages/fhevm-sdk → fhevm-sdk/
- Move docs/ → fhevm-sdk/docs/
- Update workspace configuration in root package.json
- Add .gitignore for the SDK folder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Rename the SDK package from "fhevm-sdk" to "@zama-fhe/sdk" in preparation
for publishing under the Zama namespace.

Updated:
- Package name in fhevm-sdk/package.json
- Dependency reference in erc7984example/package.json
- All imports across the frontend codebase
- transpilePackages in next.config.ts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
poppyseedDev and others added 2 commits February 2, 2026 14:17
- Remove fhevm-sdk folder (moved to poppyseedDev/react-sdk)
- Remove notes folder (moved to dev-ex/notes)
- Remove AGENTS.md
- Update root package.json to remove SDK workspace and scripts
- Update all packages to use external SDK via file path:
  - erc7984example: @zama-fhe/sdk -> file:../../../react-sdk
  - example-ethers: fhevm-sdk -> @zama-fhe/sdk file reference
  - example-viem: fhevm-sdk -> @zama-fhe/sdk file reference
  - example-wagmi: fhevm-sdk -> @zama-fhe/sdk file reference
- Update imports from "fhevm-sdk" to "@zama-fhe/sdk"

The SDK is now maintained in a separate repository for independent
versioning and npm publishing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Migrate all example apps from @zama-fhe/sdk workspace references to
@zama-fhe/react-sdk packed tarballs, supporting the SDK's move to a
separate repository. Add pnpm overrides for transitive shared/core-sdk
resolution, add confidential transfer (Send) UI to ShieldDemo, and
wire up apiKey support in FhevmProvider.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant