Skip to content

Commit 4b0acc1

Browse files
committed
Update roadmap: add provider budget verification, encrypted messaging, configurable fees, 10 plugins, 1100+ tests
1 parent 9b7cfea commit 4b0acc1

2 files changed

Lines changed: 101 additions & 85 deletions

File tree

README.md

Lines changed: 93 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,18 @@ MARC Protocol encrypts what matters: **amounts and balances are FHE-encrypted**,
2323

2424
Zama's fhEVM is **not limited to EVM**. Zama is expanding to Solana (SVM) and other virtual machines. MARC Protocol follows wherever Zama deploys.
2525

26-
| Chain / VM | Status | Impact |
27-
|------------|--------|--------|
28-
| **Ethereum** | Live (Sepolia) | Largest DeFi TVL, highest security |
29-
| **Base** | Planned | #1 in x402 volume (Coinbase ecosystem) |
30-
| **Arbitrum** | Planned | Largest L2 by TVL |
31-
| **Polygon** | Planned | Enterprise + gaming agents |
32-
| **Solana (SVM)** | Planned (Zama roadmap) | Largest non-EVM agent ecosystem |
33-
| **Any future VM** | Automatic | Wherever Zama deploys, MARC follows |
26+
| Chain / VM | Status | Impact |
27+
| ----------------- | ---------------------- | -------------------------------------- |
28+
| **Ethereum** | Live (Sepolia) | Largest DeFi TVL, highest security |
29+
| **Base** | Planned | #1 in x402 volume (Coinbase ecosystem) |
30+
| **Arbitrum** | Planned | Largest L2 by TVL |
31+
| **Polygon** | Planned | Enterprise + gaming agents |
32+
| **Solana (SVM)** | Planned (Zama roadmap) | Largest non-EVM agent ecosystem |
33+
| **Any future VM** | Automatic | Wherever Zama deploys, MARC follows |
3434

3535
When Zama deploys to Base, Arbitrum, Solana, and beyond, **agents on every major chain can make confidential payments through MARC Protocol.** One protocol, every chain, every VM, full privacy.
3636

37-
> *"Crypto privacy is needed if you want to make API calls without compromising the information of your access patterns. Even with a local AI agent, you can learn a lot about what someone is doing if you see all of their search engine calls. [...] providers will demand an anti-DoS mechanism, and realistically payment per call. By default that will be credit card or some corposlop stablecoin thing, so we need crypto privacy."*
37+
> _"Crypto privacy is needed if you want to make API calls without compromising the information of your access patterns. Even with a local AI agent, you can learn a lot about what someone is doing if you see all of their search engine calls. [...] providers will demand an anti-DoS mechanism, and realistically payment per call. By default that will be credit card or some corposlop stablecoin thing, so we need crypto privacy."_
3838
>
3939
> -- [Vitalik Buterin, March 2026](https://x.com/VitalikButerin/status/2030510783134871594)
4040
@@ -85,10 +85,10 @@ The same encrypted cUSDC transfers work identically when triggered by MCP tool c
8585

8686
**Two contracts, no pool:**
8787

88-
| Contract | Purpose |
89-
|----------|---------|
90-
| **ConfidentialUSDC** | ERC-7984 token wrapper. USDC wraps to encrypted cUSDC. Agents hold cUSDC directly and transfer it peer-to-peer. |
91-
| **X402PaymentVerifier** | Thin nonce registry. Records payment nonces with `minPrice` for server-side price verification. |
88+
| Contract | Purpose |
89+
| ----------------------- | --------------------------------------------------------------------------------------------------------------- |
90+
| **ConfidentialUSDC** | ERC-7984 token wrapper. USDC wraps to encrypted cUSDC. Agents hold cUSDC directly and transfer it peer-to-peer. |
91+
| **X402PaymentVerifier** | Thin nonce registry. Records payment nonces with `minPrice` for server-side price verification. |
9292

9393
## Features
9494

@@ -133,73 +133,73 @@ cd frontend && npm install && npx vite build
133133

134134
Inherits: `ZamaEthereumConfig`, `ERC7984`, `ERC7984ERC20Wrapper`, `Ownable2Step`, `Pausable`, `ReentrancyGuard`
135135

136-
| Function | Description |
137-
|----------|-------------|
138-
| `wrap(address to, uint256 amount)` | Wrap plaintext USDC into encrypted cUSDC (fee deducted) |
139-
| `unwrap(address from, address to, bytes32 encAmount, bytes inputProof)` | Request async unwrap (step 1: burn + KMS decrypt request) |
140-
| `finalizeUnwrap(bytes32 burntAmount, uint64 cleartext, bytes proof)` | Finalize unwrap with KMS proof (step 2: fee deducted, USDC sent) |
141-
| `confidentialTransfer(address to, bytes32 encAmount, bytes inputProof)` | Transfer encrypted cUSDC peer-to-peer (fee-free) |
142-
| `confidentialBalanceOf(address account)` | Get encrypted balance handle (euint64) |
143-
| `setOperator(address operator, uint48 until)` | Authorize operator for transfers |
144-
| `isOperator(address holder, address spender)` | Check operator authorization |
145-
| `setTreasury(address newTreasury)` | Update fee treasury (onlyOwner) |
146-
| `treasuryWithdraw()` | Withdraw accumulated fees to treasury |
147-
| `pause() / unpause()` | Emergency pause (onlyOwner) |
148-
| `transferOwnership(address) / acceptOwnership()` | 2-step ownership transfer |
136+
| Function | Description |
137+
| ----------------------------------------------------------------------- | ---------------------------------------------------------------- |
138+
| `wrap(address to, uint256 amount)` | Wrap plaintext USDC into encrypted cUSDC (fee deducted) |
139+
| `unwrap(address from, address to, bytes32 encAmount, bytes inputProof)` | Request async unwrap (step 1: burn + KMS decrypt request) |
140+
| `finalizeUnwrap(bytes32 burntAmount, uint64 cleartext, bytes proof)` | Finalize unwrap with KMS proof (step 2: fee deducted, USDC sent) |
141+
| `confidentialTransfer(address to, bytes32 encAmount, bytes inputProof)` | Transfer encrypted cUSDC peer-to-peer (fee-free) |
142+
| `confidentialBalanceOf(address account)` | Get encrypted balance handle (euint64) |
143+
| `setOperator(address operator, uint48 until)` | Authorize operator for transfers |
144+
| `isOperator(address holder, address spender)` | Check operator authorization |
145+
| `setTreasury(address newTreasury)` | Update fee treasury (onlyOwner) |
146+
| `treasuryWithdraw()` | Withdraw accumulated fees to treasury |
147+
| `pause() / unpause()` | Emergency pause (onlyOwner) |
148+
| `transferOwnership(address) / acceptOwnership()` | 2-step ownership transfer |
149149

150150
**Events:**
151151

152-
| Event | When |
153-
|-------|------|
154-
| `ConfidentialTransfer(from, to, amount)` | Every encrypted transfer (including wrap mint) |
155-
| `UnwrapRequested(receiver, amount)` | Unwrap initiated |
156-
| `UnwrapFinalized(receiver, encAmount, clearAmount)` | Unwrap completed |
157-
| `TreasuryUpdated(old, new)` | Treasury address changed |
158-
| `TreasuryWithdrawn(treasury, amount)` | Fees withdrawn |
152+
| Event | When |
153+
| --------------------------------------------------- | ---------------------------------------------- |
154+
| `ConfidentialTransfer(from, to, amount)` | Every encrypted transfer (including wrap mint) |
155+
| `UnwrapRequested(receiver, amount)` | Unwrap initiated |
156+
| `UnwrapFinalized(receiver, encAmount, clearAmount)` | Unwrap completed |
157+
| `TreasuryUpdated(old, new)` | Treasury address changed |
158+
| `TreasuryWithdrawn(treasury, amount)` | Fees withdrawn |
159159

160160
### X402PaymentVerifier
161161

162-
| Function | Description |
163-
|----------|-------------|
162+
| Function | Description |
163+
| ------------------------------------------------------------------------------ | -------------------------------------------------- |
164164
| `recordPayment(address payer, address server, bytes32 nonce, uint64 minPrice)` | Record payment nonce with minimum price commitment |
165-
| `usedNonces(bytes32 nonce)` | Check if nonce has been used |
165+
| `usedNonces(bytes32 nonce)` | Check if nonce has been used |
166166

167167
**Events:**
168168

169-
| Event | When |
170-
|-------|------|
169+
| Event | When |
170+
| ------------------------------------------------- | ---------------------- |
171171
| `PaymentVerified(payer, server, nonce, minPrice)` | Payment nonce recorded |
172172

173173
## Deployed Addresses (Sepolia)
174174

175-
| Contract | Address |
176-
|----------|---------|
177-
| MockUSDC | [`0xc89e913676B034f8b38E49f7508803d1cDEC9F4f`](https://sepolia.etherscan.io/address/0xc89e913676B034f8b38E49f7508803d1cDEC9F4f) |
178-
| ConfidentialUSDC | [`0xE944754aa70d4924dc5d8E57774CDf21Df5e592D`](https://sepolia.etherscan.io/address/0xE944754aa70d4924dc5d8E57774CDf21Df5e592D) |
179-
| X402PaymentVerifier | [`0x4503A7aee235aBD10e6064BBa8E14235fdF041f4`](https://sepolia.etherscan.io/address/0x4503A7aee235aBD10e6064BBa8E14235fdF041f4) |
175+
| Contract | Address |
176+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
177+
| MockUSDC | [`0xc89e913676B034f8b38E49f7508803d1cDEC9F4f`](https://sepolia.etherscan.io/address/0xc89e913676B034f8b38E49f7508803d1cDEC9F4f) |
178+
| ConfidentialUSDC | [`0xE944754aa70d4924dc5d8E57774CDf21Df5e592D`](https://sepolia.etherscan.io/address/0xE944754aa70d4924dc5d8E57774CDf21Df5e592D) |
179+
| X402PaymentVerifier | [`0x4503A7aee235aBD10e6064BBa8E14235fdF041f4`](https://sepolia.etherscan.io/address/0x4503A7aee235aBD10e6064BBa8E14235fdF041f4) |
180180
| AgenticCommerceProtocol | [`0xBCA8d5ce6D57f36c7aF71954e9F7f86773a02F22`](https://sepolia.etherscan.io/address/0xBCA8d5ce6D57f36c7aF71954e9F7f86773a02F22) |
181-
| AgentIdentityRegistry | [`0xf4609D5DB3153717827703C795acb00867b69567`](https://sepolia.etherscan.io/address/0xf4609D5DB3153717827703C795acb00867b69567) |
181+
| AgentIdentityRegistry | [`0xf4609D5DB3153717827703C795acb00867b69567`](https://sepolia.etherscan.io/address/0xf4609D5DB3153717827703C795acb00867b69567) |
182182
| AgentReputationRegistry | [`0xd1Dd10990f317802c79077834c75742388959668`](https://sepolia.etherscan.io/address/0xd1Dd10990f317802c79077834c75742388959668) |
183-
| Treasury | `0xF505e2E71df58D7244189072008f25f6b6aaE5ae` |
183+
| Treasury | `0xF505e2E71df58D7244189072008f25f6b6aaE5ae` |
184184

185185
All contracts verified on [Etherscan](https://sepolia.etherscan.io).
186186

187187
## Fee Structure
188188

189-
| Operation | Fee | Notes |
190-
|-----------|-----|-------|
191-
| **Wrap** (USDC to cUSDC) | max(0.1%, 0.01 USDC) | Plaintext fee deducted before minting |
192-
| **Transfer** (cUSDC to cUSDC) | **FREE** | Encrypted peer-to-peer, no fee |
193-
| **Unwrap** (cUSDC to USDC) | max(0.1%, 0.01 USDC) | Fee deducted from decrypted cleartext |
189+
| Operation | Fee | Notes |
190+
| ----------------------------- | -------------------- | ------------------------------------- |
191+
| **Wrap** (USDC to cUSDC) | max(0.1%, 0.01 USDC) | Plaintext fee deducted before minting |
192+
| **Transfer** (cUSDC to cUSDC) | **FREE** | Encrypted peer-to-peer, no fee |
193+
| **Unwrap** (cUSDC to USDC) | max(0.1%, 0.01 USDC) | Fee deducted from decrypted cleartext |
194194

195195
**Breakeven:** 10 USDC (below: flat 0.01 USDC fee; above: 0.1% scales with amount).
196196

197-
| Amount | Wrap Fee | Transfer Fee | Unwrap Fee |
198-
|--------|----------|--------------|------------|
199-
| 1 USDC | 0.01 | 0 | 0.01 |
200-
| 10 USDC | 0.01 | 0 | 0.01 |
201-
| 100 USDC | 0.10 | 0 | 0.10 |
202-
| 1000 USDC | 1.00 | 0 | 1.00 |
197+
| Amount | Wrap Fee | Transfer Fee | Unwrap Fee |
198+
| --------- | -------- | ------------ | ---------- |
199+
| 1 USDC | 0.01 | 0 | 0.01 |
200+
| 10 USDC | 0.01 | 0 | 0.01 |
201+
| 100 USDC | 0.10 | 0 | 0.10 |
202+
| 1000 USDC | 1.00 | 0 | 1.00 |
203203

204204
## SDK Usage
205205

@@ -256,15 +256,18 @@ import express from "express";
256256

257257
const app = express();
258258

259-
app.use("/api/premium", fhePaywall({
260-
price: "1000000", // 1 USDC (6 decimals)
261-
asset: "USDC",
262-
tokenAddress: "0xE944754aa70d4924dc5d8E57774CDf21Df5e592D",
263-
verifierAddress: "0x4503A7aee235aBD10e6064BBa8E14235fdF041f4",
264-
recipientAddress: "0x...",
265-
rpcUrl: "https://sepolia.infura.io/v3/...",
266-
minConfirmations: 1,
267-
}));
259+
app.use(
260+
"/api/premium",
261+
fhePaywall({
262+
price: "1000000", // 1 USDC (6 decimals)
263+
asset: "USDC",
264+
tokenAddress: "0xE944754aa70d4924dc5d8E57774CDf21Df5e592D",
265+
verifierAddress: "0x4503A7aee235aBD10e6064BBa8E14235fdF041f4",
266+
recipientAddress: "0x...",
267+
rpcUrl: "https://sepolia.infura.io/v3/...",
268+
minConfirmations: 1,
269+
})
270+
);
268271

269272
app.get("/api/premium/data", (req, res) => {
270273
res.json({ data: "premium content", paidBy: req.paymentInfo?.from });
@@ -491,10 +494,10 @@ marc-protocol/
491494

492495
### Two Unbypassable Fee Streams
493496

494-
| Stream | Rate | Trigger | Enforcement |
495-
|--------|------|---------|-------------|
496-
| **Wrap/Unwrap Fee** | 0.1% (min $0.01) | USDC enters/exits encrypted layer | Contract-level (`accumulatedFees → treasury`) |
497-
| **ERC-8183 Job Escrow** | 1% platform fee | Job completion | Contract-level (`PLATFORM_FEE_BPS = 100`) |
497+
| Stream | Rate | Trigger | Enforcement |
498+
| ----------------------- | ---------------- | --------------------------------- | --------------------------------------------- |
499+
| **Wrap/Unwrap Fee** | 0.1% (min $0.01) | USDC enters/exits encrypted layer | Contract-level (`accumulatedFees → treasury`) |
500+
| **ERC-8183 Job Escrow** | 1% platform fee | Job completion | Contract-level (`PLATFORM_FEE_BPS = 100`) |
498501

499502
**ERC-8183 Job Escrow, Primary Revenue:**
500503
Agent creates job, funds locked in escrow, work delivered, evaluator approves. **99% to provider, 1% to protocol**. The 1% fee is enforced at the contract level, mathematically unbypassable.
@@ -503,13 +506,13 @@ Agent creates job, funds locked in escrow, work delivered, evaluator approves. *
503506

504507
### Revenue Projections
505508

506-
| Year | Scenario | Wrap/Unwrap Fee | Job Escrow (1%) | Enterprise | Total |
507-
|------|----------|-----------------|-----------------|-----------|-------|
508-
| **2026** | Conservative | $24K | $3K | $0 | **$27K** |
509-
| **2026** | Base | $90K | $60K | $50K | **$200K** |
510-
| **2026** | Optimistic | $240K | $1.2M | $150K | **$1.59M** |
511-
| **2027** | Multi-Chain | $1M | $3M | $300K | **$4.3M** |
512-
| **2028+** | Mainstream | $5M | $15M | $1M | **$21M** |
509+
| Year | Scenario | Wrap/Unwrap Fee | Job Escrow (1%) | Enterprise | Total |
510+
| --------- | ------------ | --------------- | --------------- | ---------- | ---------- |
511+
| **2026** | Conservative | $24K | $3K | $0 | **$27K** |
512+
| **2026** | Base | $90K | $60K | $50K | **$200K** |
513+
| **2026** | Optimistic | $240K | $1.2M | $150K | **$1.59M** |
514+
| **2027** | Multi-Chain | $1M | $3M | $300K | **$4.3M** |
515+
| **2028+** | Mainstream | $5M | $15M | $1M | **$21M** |
513516

514517
Key insight: **every new chain and VM that Zama deploys to multiplies MARC's addressable market.** x402 volume alone is $166M+ and growing. Combined with MCP, MPP, A2A, AgentKit, and other emerging protocols, the total agent payment market is much larger. MARC needs just 2-5% adoption for meaningful revenue.
515518

@@ -562,26 +565,35 @@ See [docs/SECURITY.md](docs/SECURITY.md) for the full threat model and audit his
562565
## Roadmap
563566

564567
### v1.0.0 (Current)
565-
- 7 contracts: ConfidentialUSDC, X402PaymentVerifier, AgenticCommerceProtocol, AgentIdentityRegistry, AgentReputationRegistry, MARCTimelock, MockUSDC
566-
- 10 framework plugins: x402, MCP, MPP, AgentKit, Virtuals GAME, OpenClaw
568+
569+
- 7 contracts deployed on Ethereum Sepolia
570+
- 10 framework plugins: x402, MCP, MPP, A2A, AgentKit, Virtuals GAME, OpenClaw, ElizaOS, LangChain, CrewAI
571+
- Single TX default (Zama operator pattern, payAndRecord atomic payments)
567572
- SDK with fheFetch, fhePaywall, facilitator, ERC-8004/8183 helpers
568-
- 900+ tests, deployed on Ethereum Sepolia
569-
- The Graph subgraph, GitHub Actions CI/CD
573+
- 1100+ tests, GitHub Actions CI/CD, The Graph subgraph
570574

571575
### v1.1 (Next)
576+
572577
- Ethereum mainnet deployment
573-
- Professional third-party audit
578+
- Professional third-party security audit
574579
- UUPS proxy pattern for contract upgradeability
575580
- Multisig treasury (Gnosis Safe)
581+
- Provider budget verification (FHE.allow for job budget transparency between parties)
576582
- Gas benchmark report
577583

578584
### v1.2
585+
579586
- Multi-chain deployment: Base (#1 x402 volume), Arbitrum (largest L2 TVL)
580587
- Multi-token factory (cWETH, cDAI confidential wrappers)
588+
- Encrypted agent-to-agent messaging via ECDH (private pricing negotiation using ERC-8004 public keys)
589+
- Configurable fee rates via governance
581590
- Facilitator network (decentralized verification)
582591

583592
### v2.0
593+
584594
- Multi-VM expansion: Solana (SVM) via Zama's cross-VM roadmap
595+
- Cross-VM confidential transfers
596+
- Encrypted agent messaging across chains
585597
- Wherever Zama deploys FHE, MARC follows
586598

587599
## License

docs/ROADMAP.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ Initial public release.
66

77
- **7 contracts:** ConfidentialUSDC (ERC-7984), X402PaymentVerifier, AgenticCommerceProtocol (ERC-8183), AgentIdentityRegistry (ERC-8004), AgentReputationRegistry (ERC-8004), MARCTimelock, MockUSDC
88
- **SDK:** marc-protocol-sdk on npm -- fheFetch, fhePaywall, facilitator server, ERC-8004/8183 helpers, Redis nonce and batch credit stores
9-
- **6 framework plugins:** x402 Scheme, MCP Server, MPP Method, AgentKit Plugin, Virtuals GAME Plugin, OpenClaw Skill
10-
- **Infrastructure:** Deployed on Ethereum Sepolia, 900+ tests, GitHub Actions CI/CD, The Graph subgraph
9+
- **10 framework plugins:** x402 Scheme, MCP Server, MPP Method, AgentKit Plugin, Virtuals GAME Plugin, OpenClaw Skill, A2A Plugin (Google), ElizaOS Plugin, LangChain Tool, CrewAI Tool
10+
- **Single TX default:** Follows Zama's operator pattern (payAndRecord) for atomic payments
11+
- **Infrastructure:** Deployed on Ethereum Sepolia, 1100+ tests, GitHub Actions CI/CD, The Graph subgraph
1112
- **Security:** Ownable2Step, ReentrancyGuard, Pausable, 48h governance timelock, nonce replay prevention, per-IP rate limiting, EIP-191 signature verification
1213

1314
## v1.1 (Next)
@@ -21,21 +22,24 @@ Ethereum mainnet deployment and production hardening.
2122
- Gas benchmark report (wrap/transfer/unwrap/escrow costs)
2223
- Formal verification (Certora or Halmos)
2324
- Bug bounty program
25+
- Provider budget verification via FHE.allow (provider can decrypt job budget after accepting, third parties still cannot see)
2426

2527
## v1.2
2628

27-
Multi-chain expansion across EVM L2s.
29+
Multi-chain expansion and advanced features.
2830

2931
- **Base deployment** -- #1 chain for x402 volume (Coinbase ecosystem)
3032
- **Arbitrum deployment** -- Largest L2 by TVL
3133
- Multi-token factory (cWETH, cDAI confidential wrappers)
3234
- Facilitator network (decentralized verification service)
33-
- LangChain / CrewAI / AutoGPT agent framework integrations
35+
- Encrypted agent-to-agent messaging via ECDH (agents derive shared secret from ERC-8004 public keys, negotiate job pricing off-chain with end-to-end encryption)
36+
- Configurable fee rates via governance (setFee with MARCTimelock delay)
3437

3538
## v2.0
3639

3740
Multi-VM expansion beyond EVM.
3841

3942
- **Solana (SVM) deployment** -- Largest non-EVM agent ecosystem (Zama roadmap)
4043
- Cross-VM confidential transfers
44+
- Encrypted agent messaging across chains
4145
- Wherever Zama deploys FHE, MARC follows

0 commit comments

Comments
 (0)