| name | private-app-channels |
| description | Activate when the user works with Tokamak Private App Channels, zkp-channel-manager, L2 state channels with ZK proof verification, BridgeCore, BridgeDepositManager, BridgeProofManager, BridgeWithdrawManager, channel lifecycle (open/deposit/initialize/transact/close/withdraw), MPT keys, Groth16 channel proofs, or off-chain ERC20 transfers.
|
| license | MIT |
| metadata | {"author":"tokamak-network","version":"1.0.0"} |
Tokamak Private App Channels
Layer 2 state channel solution with zero-knowledge proof verification on Ethereum. Enables off-chain ERC20 transactions with trustless on-chain settlement.
Source: https://github.com/tokamak-network/private-app-channel-manager
Architecture
private-app-channel-manager (Next.js 15 + React 19)
โ
โโโ Smart Contracts (Sepolia)
โ โโโ BridgeCore โ Channel creation, state management
โ โโโ BridgeDepositManager โ Token deposits, MPT key registration
โ โโโ BridgeProofManager โ Proof submission, state initialization
โ โโโ BridgeWithdrawManager โ Withdrawals after channel closure
โ
โโโ ZK Proof: Browser (snarkjs)
โ โโโ Groth16 proofs for channel initialization + closing
โ Tree sizes: 16, 32, 64, 128 leaves
โ
โโโ ZK Proof: Server (Tokamak-Zk-EVM)
โ โโโ tokamak-cli --synthesize โ --prove โ --verify โ --extract-proof
โ Used for L2 ERC20 transaction proofs
โ
โโโ Tokamak-Zk-EVM/ (git submodule)
โโโ Synthesizer + QAP compiler + prover
Channel Lifecycle
1. CREATE โ openChannel(participants, targetContract) State: Initialized (1)
2. DEPOSIT โ depositToken(channelId, amount, mptKey) State: Initialized (1)
3. INITIALIZE โ initializeChannelState(channelId, proof) State: Open (2)
4. TRANSACT โ Off-chain L2 ERC20 transfers via Tokamak-Zk-EVM
5. SUBMIT โ submitProofAndSignature(channelId, proofs) State: Closing (3)
6. CLOSE โ verifyFinalBalancesGroth16() State: Closed (4)
7. WITHDRAW โ withdraw(channelId, token)
State transitions are one-way only: None(0) โ Initialized(1) โ Open(2) โ Closing(3) โ Closed(4).
Common Mistakes
| Mistake | Fix |
|---|
| Non-leader trying to initialize/close | Only the channel leader (first participant) can initialize, approve proofs, submit, and close |
| Forgetting MPT key registration | Deposit with mptKey param โ even 0 TON deposit registers the key |
| Extracting unverified proof | --verify must pass before --extract-proof โ invalid proofs are rejected |
| Wrong tree size | Tree size (16/32/64/128) is auto-selected based on participantCount + preAllocatedLeaves |
| Checking participants before initialization | State < 2: use isChannelWhitelisted. State >= 2: use getChannelParticipants |
Smart Contract Functions
openChannel(participants, targetContract)
getChannelState(channelId)
getChannelParticipants(channelId)
getChannelLeader(channelId)
getL2MptKey(channelId, participant)
getParticipantDeposit(channelId, participant)
depositToken(channelId, amount, mptKey)
initializeChannelState(channelId, proof)
submitProofAndSignature(channelId, proofs, signature)
withdraw(channelId, token)
getWithdrawableAmount(channelId, user, token)
Proof Generation
A. Initialize/Close Proof (Browser โ snarkjs)
Generated in-browser using Groth16. Circuit files at public/zk-assets/.
import { useBridgeProofManagerWrite } from "@/hooks/contract";
B. Transaction Proof (Server โ Tokamak-Zk-EVM)
tokamak-cli --synthesize <input.json>
tokamak-cli --prove
tokamak-cli --preprocess && tokamak-cli --verify
tokamak-cli --extract-proof <output.zip>
Local Database
Proofs stored at data/uploads/channels/{channelId}/:
proofs/{proofKey}/ โ Generated proofs
submittedProofs/ โ Pending leader review
verifiedProofs/ โ Approved by leader
rejectedProofs/ โ Rejected proofs
Project Structure
private-app-channel-manager/
โโโ app/
โ โโโ create-channel/ # Channel creation
โ โโโ join-channel/ # Join existing channel
โ โโโ state-explorer/ # Main channel management
โ โ โโโ deposit/ # Token deposit
โ โ โโโ transaction/ # L2 transactions & proofs
โ โ โโโ state3/ # Channel closing
โ โ โโโ withdraw/ # Token withdrawal
โ โโโ api/
โ โโโ tokamak-zk-evm/ # Synthesis & proof API
โ โโโ channels/ # Channel CRUD
โ โโโ save-proof-zip/ # Proof file storage
โโโ hooks/contract/ # Smart contract hooks
โ โโโ useBridgeCore.ts
โ โโโ useBridgeDepositManager.ts
โ โโโ useBridgeProofManager.ts
โ โโโ useBridgeWithdrawManager.ts
โโโ lib/
โ โโโ clientProofGeneration.ts # Browser Groth16
โ โโโ createERC20TransferTx.ts # L2 tx signing
โ โโโ db/ # Local file-based DB
โโโ packages/
โ โโโ config/ # Network + contract config
โ โโโ frost/ # FROST signatures (planned)
โ โโโ ui/ # Shared UI components
โโโ stores/ # Zustand state stores
โโโ Tokamak-Zk-EVM/ # Git submodule
โโโ public/zk-assets/ # Circuit WASM + zkey files
Prerequisites
| Dependency | Purpose |
|---|
| Node.js >= 18 | App framework |
| Alchemy API Key | Sepolia RPC |
| MetaMask / Web3 wallet | User authentication |
| Tokamak-Zk-EVM submodule | L2 transaction proofs |
Quick Start
npm install
npm run dev
Tech Stack
| Technology | Purpose |
|---|
| Next.js 15 (App Router) | Web framework |
| React 19 + Zustand | UI + state management |
| wagmi + viem | Blockchain interaction |
| snarkjs | Browser-side Groth16 proofs |
| Tokamak-Zk-EVM | L2 transaction synthesis |
| tokamak-l2js | L2 primitives (EdDSA, Poseidon) |
Related Skills
- zk-evm: Tokamak zk-EVM pipeline used as submodule for transaction proofs
- tokamak-contracts: Contract addresses and proxy patterns