cPay is a confidential onchain payroll app built with Zama FHEVM, ERC-7984, and standard browser wallets.
It supports a practical payroll workflow:
- ingest ISO 20022
pain.001 - execute confidential payroll onchain
- export
pain.002status receipts
- Payroll data should not be publicly readable onchain.
- cPay keeps salary amounts confidential while preserving settlement and audit trails.
apps/web— frontend (Vite + React)apps/api— backend API (faucet, decrypt, execute, health)packages/contracts— Solidity contracts and testsdocs— public docs
npm install
npm --workspace apps/web run dev
npm --workspace apps/api run devFrontend runs on 5173 by default.
API runs on 8787 by default.
npm run contracts:compile
npm run contracts:test
npm --workspace apps/web run buildnpm run contracts:compile
npm run contracts:test- Upload payroll instructions via ISO 20022
pain.001. - Validate payroll batches before execution.
- Encrypt payroll amounts before onchain submission.
- Execute payroll through ERC-7984 confidential transfers.
- Download local payroll receipt as
pain.002. - Decrypt confidential balances from the connected account.
- Execution:
backendby default,wallet_directfor connected-wallet submission - Decrypt:
observer - Faucet:
backend
Configured via frontend env vars:
VITE_EXECUTION_MODEVITE_DECRYPT_MODEVITE_FAUCET_MODE
- Operational batch limit: 15 payments/run (current stable range: 5/10/15).
- Contract-level hard cap remains
MAX_BATCH_SIZE = 100. - Decryption currently uses observer mode for stability.
- Web target: Vercel
- API target: Fly.io
- Deployment runbook:
docs/deployment.md
docs/overview.mddocs/architecture.mddocs/how-it-works.mddocs/deployment.mddocs/limitations.mddocs/contributing.md
- Root project: ISC (see root
package.json) - Contracts package: MIT (
packages/contracts/LICENSE)