Confidential agentic payments stack for AI agents.
x402fhe gives agents the primitives they need to participate in a real economy:
- pay websites and APIs through FHEx402
- own an on-chain identity
- pay humans and other agents through encrypted escrow and settlement
- build reputation from paid interactions
- operate with private amounts using Zama fhEVM
The repo is live on Sepolia today with Zama's canonical wrapper stack and includes the full operator surface: core SDK, Express paywall, OpenClaw skill, frontend UI, facilitator, DFNS MPC, direct Ledger, supervised Ledger bridge, and live demo flows.
- FHEx402 is only one layer: the repo is not just an API payment client, it is a broader agentic commerce stack.
- Agents can do real economic work: identity, confidential balances, website payments, escrow, settlement, and proof-linked reputation all live in one system.
- Private payments, standard shape: the HTTP protocol still looks like x402, but the transfer amount stays encrypted on-chain.
- Real deployment, not just mocks: the repo ships local mock-FHE tests and a separate live Sepolia verification story.
- Multiple operator surfaces: core SDK, Express paywall, OpenClaw skill, browser UI, and supervised signing paths.
| Layer | Status | Detail |
|---|---|---|
| Smart contracts | Deployed on Sepolia | 4 contracts (verifier, escrow, identity, reputation) wired to Zama's canonical Sepolia token stack. Contract suite covers the local mock path; docs/SEPOLIA-E2E.md tracks live-network coverage separately. |
| TypeScript SDK | Usable now | fheFetch (auto-402 client), fhePaywall (Express middleware), FhePaymentHandler, SilentFailureGuard, facilitator client, and real on-chain payment execution through FhePayingClient. |
| OpenClaw skill | Usable now | 16 commands including delegation (grant-view, revoke-view, view-as), balance --of, and 2 demo orchestrators (research-and-visualize, review-and-rate). Command surface is documented in packages/openclaw-skill/README.md. |
| FHE session | Encrypt + decrypt working | ZamaFheSession wraps @zama-fhe/sdk v2.3.0-alpha.2 (vendored). Encryption is local TFHE. CLI decryption (balance --decrypt) verified on live Sepolia via Zama KMS. Falls back to stub mode when the SDK is unavailable. |
| Wallets | Multiple signer modes | Local private keys and DFNS MPC work across the core/runtime stack. Direct browser-attended Ledger support is available through @x402fhe/core/browser + @x402fhe/ui/ledger, and supervised OpenClaw Ledger signing is available through the localhost bridge apps. |
| UI components | Native React SDK path live | @x402fhe/ui composes QueryClientProvider + ZamaProvider through X402FheProvider, useEncryptedBalance() is backed by native useConfidentialBalance(), and the reference frontend supports browser wallets plus Ledger in attended mode. |
| Payment client | Real on-chain TXs | FhePayingClient submits confidentialTransferAndCall on-chain. Budget tracking + receipts. A standalone Sepolia HTTP E2E script exercises fheFetch -> 402 -> pay -> fhePaywall -> facilitator -> 200. |
| Live demo | Dry-run verified | Three Telegram demos: (1) "Wallet Basics" — wrap + confidential transfer + balance (no servers needed), (2) "Private API Shopping" — 3 chained fheFetch payments, (3) "Agent Identity + Paid Work + Feedback" — paid code review + proof-linked reputation. See docs/DEMO.md. |
| Mainnet | Architecture-ready, not deployed | Contracts compile for mainnet and the docs cover the intended shape, but the public deployment and operator story is Sepolia-first today. |
Node.js >= 22 required. The fast local suites are healthy, the live Sepolia path is documented separately in
docs/SEPOLIA-E2E.md, and standards alignment is tracked indocs/ERC-COMPLIANCE.md.
With this stack, an agent can:
- Pay a website or API through FHEx402 using confidential on-chain payments.
- Own an identity through the on-chain agent identity registry.
- Fund a job and pay a human or another agent through encrypted escrow and settlement.
- Collect reputation from paid work through proof-linked feedback.
- Choose the right signing model using local keys, DFNS MPC, browser wallets, direct Ledger, or supervised Ledger approvals.
x402fhe is best understood as five layers working together:
- Payment rail: FHEx402 for confidential website and API payments.
- Wallet layer: user keys, DFNS MPC, browser wallets, Ledger, and Ledger bridge.
- Identity layer: portable on-chain agent identity.
- Commerce layer: encrypted escrow, job funding, and settlement.
- Reputation layer: proof-linked feedback for paid interactions.
If you want the quickest honest "this works" path as an agent operator:
git clone [email protected]:bea7892046/fhex402.git && cd fhex402
pnpm install
export WALLET_MODE=user
export USER_PRIVATE_KEY=0x...
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepolia
pnpm exec tsx packages/openclaw-skill/scripts/info.tsSuccess looks like:
- JSON output
walletType: "user"chainId: 11155111- Sepolia contract addresses for
cUSDC,verifier,identity,reputation, andescrow
If you are evaluating the repo itself rather than using it yet:
pnpm exec tsc --noEmit
pnpm --filter @x402fhe/core test
pnpm --filter @x402fhe/sdk test| I want to... | Use this | Wallet mode | First command | Success signal | Read next |
|---|---|---|---|---|---|
| Let my agent pay websites and APIs | @x402fhe/sdk + @x402fhe/core |
user or dfns |
run the OpenClaw info smoke test, then adapt examples/basic-payment/index.ts |
first fheFetch can pay a 402-gated endpoint |
packages/sdk, examples/basic-payment/index.ts |
| Monetize my API for agents | fhePaywall + facilitator |
server wallet of your choice | wire examples/express-server/index.ts to your route |
server returns 402 with x402FHE payment requirements |
packages/sdk/src/fhePaywall.ts, apps/facilitator |
| Give my agent an identity and reputation | @x402fhe/openclaw-skill identity + feedback commands |
user, dfns, or ledger-bridge |
pnpm exec tsx packages/openclaw-skill/scripts/register-agent.ts --uri https://agent.example/meta.json |
agent NFT is minted and can later receive proof-linked feedback | packages/openclaw-skill/README.md, docs/ARCHITECTURE.md |
| Let agents pay humans or other agents | escrow + commerce contracts through the OpenClaw skill | user, dfns, or ledger-bridge |
pnpm exec tsx packages/openclaw-skill/scripts/create-job.ts --provider 0xProvider... --evaluator 0xEvaluator... --expiry 24 --description \"Build API\" |
escrow job is created and can then be funded with fund-job.ts |
packages/openclaw-skill/README.md, docs/ARCHITECTURE.md |
| Run the full stack inside OpenClaw | @x402fhe/openclaw-skill |
user, dfns, or ledger-bridge |
pnpm exec tsx packages/openclaw-skill/scripts/info.ts |
chain + wallet + contract JSON prints cleanly | packages/openclaw-skill/README.md |
| Supervise an agent with Ledger | localhost Ledger bridge | ledger-bridge |
start bridge daemon + browser UI, then run info |
request appears locally and is approved on-device | docs/LEDGER-BRIDGE.md |
| Explore the browser app and UI kit | @x402fhe/ui + apps/frontend |
injected browser wallet or direct Ledger | pnpm --filter @x402fhe/core build && pnpm --filter @x402fhe/ui build && pnpm --filter @x402fhe/frontend exec next dev -p 3005 |
dashboard reaches Provider ready and shows wallet / encrypted-balance shell |
docs/UI-SURFACES.md, apps/frontend, packages/ui |
| Rehearse the live demo story | demo stack + OpenClaw orchestrators | usually user or ledger-bridge |
follow the demo runbook | each stage has a clear presenter success signal | docs/DEMO.md, docs/DEMO-CHECKLIST.md |
Not every signer mode is meant for every runtime:
| Wallet mode | Best fit | Human needed at signing time? | Supported here |
|---|---|---|---|
| User private key | local development, scripts, simple agents | No | core, sdk, skill, facilitator |
| DFNS MPC | unattended agent/runtime flows | No | core, sdk, skill, facilitator |
| Browser wallet | reference frontend and browser UX | Usually yes | frontend + UI |
| Ledger | attended browser UX | Yes | @x402fhe/core/browser + @x402fhe/ui/ledger |
| Ledger bridge | supervised local agent approvals | Yes | OpenClaw skill + apps/ledger-bridge + apps/ledger-bridge-ui |
- Use
USER_PRIVATE_KEYfor local development and quick scripts. - Use DFNS MPC for unattended agent runtimes.
- Use direct Ledger when the human is using the browser UI directly.
- Use
WALLET_MODE=ledger-bridgewhen OpenClaw should stay headless but a human still approves every signature locally.
Short mental model:
- DFNS = unattended production signer
- User private key = simplest local dev signer
- Browser wallet = injected wallet like MetaMask or Rabby in the reference frontend
- Direct Ledger = human uses the frontend directly
- Ledger bridge = agent proposes, human approves, Ledger signs
Important frontend note:
- The current reference frontend does not use Privy yet.
Connect browser walletmeans an injected EIP-1193 wallet exposed aswindow.ethereum.- If you usually onboard wallets with Privy, treat
apps/frontendas a lower-level reference shell, not the final production auth UX.
export WALLET_MODE=user
export USER_PRIVATE_KEY=0x...
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepolia
pnpm exec tsx packages/openclaw-skill/scripts/info.tsexport WALLET_MODE=dfns
export DFNS_WALLET_ID=...
export DFNS_AUTH_TOKEN=...
export DFNS_CREDENTIAL_ID=...
export DFNS_CREDENTIAL_PRIVATE_KEY='-----BEGIN PRIVATE KEY-----\n...'
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepolia
pnpm exec tsx packages/openclaw-skill/scripts/info.tsexport WALLET_MODE=ledger-bridge
export LEDGER_BRIDGE_TOKEN=replace-with-a-long-random-secret
export LEDGER_BRIDGE_URL=http://127.0.0.1:4555
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepolia
LEDGER_BRIDGE_TOKEN="$LEDGER_BRIDGE_TOKEN" pnpm --filter @x402fhe/ledger-bridge dev
VITE_LEDGER_BRIDGE_TOKEN="$LEDGER_BRIDGE_TOKEN" pnpm --filter @x402fhe/ledger-bridge-ui devThen open the browser UI, connect the Ledger, verify the address on-device, and only then run the OpenClaw command you want to supervise.
- A paid API returns HTTP
402 Payment Required. - The client encrypts the amount locally with the Zama SDK.
- The client sends one on-chain
confidentialTransferAndCall(...)transaction. - The verifier records the nonce and relays the encrypted funds to the seller.
- The client retries with an
X-Paymentheader. - The facilitator verifies the on-chain receipt and the server returns
200.
In other words: standard x402 request/response shape, but confidential on-chain payment execution.
For the full contract walkthrough, privacy boundary, and protocol detail, use:
| Surface | What it does |
|---|---|
@x402fhe/core |
wallet abstractions, Zama session, payment client, signer adapters |
@x402fhe/sdk |
fheFetch, fhePaywall, facilitator client, payment handling |
@x402fhe/openclaw-skill |
16 OpenClaw-friendly commands for payments, escrow, identity, reputation, delegation, and demos |
@x402fhe/ui |
React provider, hooks, components, and direct browser Ledger entrypoint |
apps/facilitator |
payment verification service |
apps/ledger-bridge + apps/ledger-bridge-ui |
supervised Ledger approval path for OpenClaw |
Start with examples/basic-payment/index.ts:
import { JsonRpcProvider } from 'ethers';
import { createUserWallet, ZamaFheSession } from '@x402fhe/core';
import { createFheFetch } from '@x402fhe/sdk';
const provider = new JsonRpcProvider(process.env.RPC_URL!);
const wallet = createUserWallet(process.env.USER_PRIVATE_KEY!, provider);
const session = await ZamaFheSession.create({
rpcUrl: process.env.RPC_URL!,
chain: 'sepolia',
});
const fheFetch = createFheFetch({
wallet,
session,
verifierAddress: '0xD46E80E1d37116B44c7Bfd845A110FCbB93d3E9F',
tokenAddress: '0x7c5BF43B851c1dff1a4feE8dB225b87f2C223639',
maxPayment: 100_000n,
});Note: this example uses USER_PRIVATE_KEY because it is a runtime signer example. The root-level PRIVATE_KEY env is mostly for deployment and Hardhat tasks.
Start with examples/express-server/index.ts:
import express from 'express';
import { fhePaywall } from '@x402fhe/sdk';
const app = express();
app.post('/api/chat', fhePaywall({
price: 10_000n,
recipientAddress: SERVER_ADDRESS,
tokenAddress: CUSDC_ADDRESS,
verifierAddress: VERIFIER_ADDRESS,
facilitatorUrl: FACILITATOR_URL,
chainId: 11155111,
}), (req, res) => {
res.json({ message: 'Paid and verified!' });
});Start with packages/openclaw-skill/README.md:
skill.run("wrap", { amount: "5.00" })
skill.run("pay", { to: "0xServer...", amount: "0.01" })
skill.run("register-agent", { uri: "https://agent.example/meta.json" })
skill.run("grant-view", { delegate: "0xAgentB..." })| Contract | Address |
|---|---|
| cUSDCMock | 0x7c5BF43B851c1dff1a4feE8dB225b87f2C223639 |
| TokenWrappersRegistry | 0x2f0750Bbb0A246059d80e94c454586a7F27a128e |
| Contract | Address |
|---|---|
| X402PaymentVerifier | 0xD46E80E1d37116B44c7Bfd845A110FCbB93d3E9F |
| AgenticCommerceProtocol | 0xECD7a2382A5F0e3b6A7b76536e4CAE11215Cc695 |
| AgentIdentityRegistry | 0x36666464daa16442Fc1d901acfC9419f11407741 |
| AgentReputationRegistry | 0x1649d762Ee62f194D92B93510b8f10a501cE9fD5 |
This repo is Sepolia-first today. If you are checking the intended production token layer, these are the canonical Zama mainnet references:
| Contract | Address |
|---|---|
| cUSDC | 0xe978F22157048E5DB8E5d07971376e86671672B2 |
| cUSDT | 0xAe0207C757Aa2B4019AD96edD0092ddc63EF0c50 |
| TokenWrappersRegistry | 0xeb5015fF021DB115aCe010f23F55C2591059bBA0 |
| USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
The x402fhe application contracts are not deployed on mainnet yet:
| Contract | Address |
|---|---|
| X402PaymentVerifier | Pending mainnet deployment |
| AgenticCommerceProtocol | Pending mainnet deployment |
| AgentIdentityRegistry | Pending mainnet deployment |
| AgentReputationRegistry | Pending mainnet deployment |
Repository verification surface:
- fast local contract tests under Hardhat
- package tests across core, sdk, ui, facilitator, and OpenClaw skill
- dedicated daemon/UI tests for the supervised Ledger bridge apps
- a dated live-network verification snapshot in
docs/SEPOLIA-E2E.md - repo-wide type-checking via
pnpm exec tsc --noEmit
# All contract tests
npx hardhat test
# Package tests
pnpm --filter @x402fhe/core test
pnpm --filter @x402fhe/sdk test
pnpm --filter @x402fhe/openclaw-skill test
pnpm --filter @x402fhe/ui test
pnpm --filter @x402fhe/facilitator test
pnpm --filter @x402fhe/ledger-bridge test
pnpm --filter @x402fhe/ledger-bridge-ui test
# Type-check the full monorepo
pnpm exec tsc --noEmit
# Sepolia integration (requires funded accounts + real FHE coprocessor)
# Prerequisites: PRIVATE_KEY, SEPOLIA_RPC_URL, SERVER_ADDRESS in .env
RUN_SEPOLIA_TESTS=1 npx hardhat test scripts/sepolia-tests/*.sepolia.ts --network sepolia
# Individual Sepolia test suites:
RUN_SEPOLIA_TESTS=1 npx hardhat test scripts/sepolia-tests/wrap-transfer.sepolia.ts --network sepolia
RUN_SEPOLIA_TESTS=1 npx hardhat test scripts/sepolia-tests/verifier-relay.sepolia.ts --network sepolia
RUN_SEPOLIA_TESTS=1 npx hardhat test scripts/sepolia-tests/escrow-lifecycle.sepolia.ts --network sepolia
# Full HTTP x402 flow (facilitator + seller + buyer — real on-chain FHE):
RPC_URL=$SEPOLIA_RPC_URL NODE_ENV=test pnpm exec tsx scripts/test-http-e2e.tsNotes:
- The package suites are fast and deterministic.
- The live Sepolia flows require funded wallets and a working public Zama path.
- The default facilitator test suite is socket-free and should run in restricted environments.
- The Sepolia HTTP E2E flow still launches local facilitator/seller servers; in restricted sandboxes that specific flow may fail with
listen EPERMeven when the code is otherwise correct.
# 1. Create .env with your funded Sepolia account
cat > .env << 'EOF'
PRIVATE_KEY=0xYOUR_SEPOLIA_PRIVATE_KEY
SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_KEY
ETHERSCAN_API_KEY=YOUR_ETHERSCAN_KEY
EOF
# 2. Deploy (uses Zama's canonical cUSDCMock at 0x7c5B...3639)
pnpm deploy:sepolia
# 3. The script prints all deployed addresses — update .env and types.tsUses Zama's canonical cUSDCMock (0x7c5BF43B851c1dff1a4feE8dB225b87f2C223639) on Sepolia. The cUSDCMock wraps Zama's mock USDC (0x9b5Cd13b8eFbB58Dc25A05CF411D8056058aDFfF) — NOT Circle USDC. The mock USDC has a public mint() function for testing:
# In Hardhat console (--network sepolia):
const mockUsdc = new ethers.Contract('0x9b5Cd13b8eFbB58Dc25A05CF411D8056058aDFfF',
['function mint(address,uint256)', 'function approve(address,uint256) returns (bool)'], signer);
await mockUsdc.mint(yourAddress, 10_000_000); // mint 10 mock USDC
await mockUsdc.approve('0x7c5BF43B851c1dff1a4feE8dB225b87f2C223639', 10_000_000);
const cUSDC = new ethers.Contract('0x7c5BF43B851c1dff1a4feE8dB225b87f2C223639',
['function wrap(address,uint256)'], signer);
await cUSDC.wrap(yourAddress, 10_000_000); // wrap into cUSDCThe live Sepolia snapshot covers the major production-shape flows: wrapping, relay payments, escrow lifecycle, identity, reputation, unwrap/finalize, delegation, amount verification, ERC-1271 linking, and the HTTP x402 path. See docs/SEPOLIA-E2E.md for the dated breakdown and transaction references.
pnpm deploy:local # Local Hardhat (deploys MockUSDC + MockConfidentialERC20)
pnpm deploy:mainnet # Ethereum mainnet (uses canonical cUSDC at 0xe978...)Start from .env.example, then pick one of these bundles.
export WALLET_MODE=user
export USER_PRIVATE_KEY=0x...
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepoliaexport WALLET_MODE=dfns
export DFNS_WALLET_ID=...
export DFNS_AUTH_TOKEN=...
export DFNS_CREDENTIAL_ID=...
export DFNS_CREDENTIAL_PRIVATE_KEY='-----BEGIN PRIVATE KEY-----\n...'
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepoliaOptional DFNS convenience variables:
DFNS_PRIVATE_KEY_PATHinstead of inlineDFNS_CREDENTIAL_PRIVATE_KEYDFNS_API_URLif you are not using the defaulthttps://api.dfns.io
export WALLET_MODE=ledger-bridge
export LEDGER_BRIDGE_URL=http://127.0.0.1:4555
export LEDGER_BRIDGE_TOKEN=replace-with-a-long-random-secret
export RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
export CHAIN=sepoliaThe same LEDGER_BRIDGE_TOKEN must be used by:
- the OpenClaw runtime
apps/ledger-bridgeapps/ledger-bridge-ui
Copy .env.example:
| Variable | Required | Description |
|---|---|---|
PRIVATE_KEY |
Yes | Deployer / agent private key |
MAINNET_RPC_URL |
For mainnet | Ethereum RPC endpoint |
SEPOLIA_RPC_URL |
For testnet | Sepolia RPC endpoint |
DFNS_WALLET_ID |
If using Dfns | Dfns MPC wallet ID |
DFNS_AUTH_TOKEN |
If using Dfns | Dfns auth token |
DFNS_CREDENTIAL_ID |
If using Dfns | Dfns credential ID used for User Action Signing |
DFNS_CREDENTIAL_PRIVATE_KEY |
If using Dfns | PEM private key for the Dfns credential signer |
DFNS_PRIVATE_KEY_PATH |
Optional with Dfns | Filesystem path to the DFNS credential PEM; alternative to DFNS_CREDENTIAL_PRIVATE_KEY |
DFNS_CREDENTIAL_ALGORITHM |
Optional with Dfns | Optional crypto.sign algorithm override |
DFNS_API_URL |
Optional with Dfns | Dfns API base URL (default: https://api.dfns.io); the skill uses it to resolve wallet metadata from DFNS_WALLET_ID |
DFNS_APP_ID |
Optional legacy Dfns field | Kept for backward compatibility; not used by the current signer bridge |
USER_PRIVATE_KEY |
If not Dfns | Alternative to Dfns |
WALLET_MODE |
Optional | Explicit OpenClaw signer mode: user, dfns, or ledger-bridge |
LEDGER_BRIDGE_URL |
With WALLET_MODE=ledger-bridge |
Localhost bridge URL (default http://127.0.0.1:4555) |
LEDGER_BRIDGE_TOKEN |
With WALLET_MODE=ledger-bridge |
Shared secret for the OpenClaw runtime, daemon, and browser approval UI |
LEDGER_BRIDGE_TIMEOUT_MS |
Optional with bridge mode | Approval timeout in milliseconds (default 300000) |
LEDGER_BRIDGE_PORT |
Optional for daemon | Daemon listen port (default 4555) |
LEDGER_BRIDGE_REQUEST_TIMEOUT_MS |
Optional for daemon | Default request expiry inside the daemon |
ADVANCED_ALLOW_RAW_LEDGER_SIGNING |
Optional for daemon | Allows raw unknown requests through the bridge; disabled by default |
VITE_LEDGER_BRIDGE_URL |
Optional for bridge UI | Browser UI bridge URL |
VITE_LEDGER_BRIDGE_TOKEN |
Optional for bridge UI | Browser UI auth token for the local bridge |
VITE_RPC_URL |
Optional for bridge UI | RPC URL used by the browser approval UI |
VITE_CHAIN_ID |
Optional for bridge UI | Chain ID used by the browser approval UI |
VERIFIER_ADDRESS |
Post-deploy | X402PaymentVerifier address |
IDENTITY_ADDRESS |
Post-deploy | AgentIdentityRegistry address |
REPUTATION_ADDRESS |
Post-deploy | AgentReputationRegistry address |
ESCROW_ADDRESS |
Post-deploy | AgenticCommerceProtocol address |
ETHERSCAN_API_KEY |
For verification | Etherscan API key |
Wallet-specific notes:
- DFNS: the runtime resolves the wallet address from
DFNS_WALLET_IDautomatically, so you do not need to duplicate it elsewhere. - DFNS: you can supply the credential signer either inline with
DFNS_CREDENTIAL_PRIVATE_KEYor from disk withDFNS_PRIVATE_KEY_PATH. - Ledger bridge: OpenClaw never talks to the Ledger directly; it talks to a localhost daemon, while a local browser approval UI owns the WebHID session.
- Ledger bridge: use one shared
LEDGER_BRIDGE_TOKENvalue in all three places: the skill runtime, the daemon, and the browser UI.
| Document | Description |
|---|---|
| ARCHITECTURE.md | Deep technical architecture — payment flow, contract design, FHE patterns, wallet system |
| PROTOCOL.md | Protocol specification for fhe-confidential-v1 x402 scheme |
| SECURITY.md | Threat model, attack mitigations, known limitations |
| SILENT_FAILURE.md | FHE silent failure pattern and SilentFailureGuard |
| ERC-COMPLIANCE.md | ERC-7984/8004/8183 deviations and rationale |
| SEPOLIA-E2E.md | Dated Sepolia verification snapshot — live-network flows, tx links, and demo rehearsal artifacts |
| UI-SURFACES.md | What the browser UIs actually are: reference frontend vs supervised Ledger approval console |
| packages/openclaw-skill/README.md | OpenClaw skill setup, command catalog, delegation workflow, and troubleshooting |
| LEDGER-BRIDGE.md | Supervised OpenClaw + Ledger localhost bridge setup, request model, and operator workflow |
| examples/ | 7 FHE-native agent templates — LLM proxy, web search, code review, document parser, image generation, knowledge base, paid skill server |
| DEMO.md | Live Telegram demo runbook — setup, stage script, backup plan |
| DEMO-CHECKLIST.md | Pre-flight checklist for in-person demo |
| CONTRIBUTING.md | Setup, conventions, PR process |
| CHANGELOG.md | Release history |
| Layer | Technologies |
|---|---|
| Contracts | Solidity 0.8.27, @fhevm/solidity 0.11, @openzeppelin/contracts 5.1 |
| Runtime | TypeScript, ethers v6, Express 5 |
| Frontend | React 18, Tailwind CSS, Zustand, React Query, @zama-fhe/react-sdk, browser-attended Ledger DMK/WebHID |
| Build | Hardhat, @fhevm/hardhat-plugin, Vitest, tsup, Storybook |
| Infra | pnpm workspaces, GitLab CI |
BUSL-1.1 (Business Source License v1.1)