Skip to content

Commit 3243e3f

Browse files
committed
feat: TTD-aware post form, updated README, cleanup
- Board: task type selector (5 types), dynamic fields, TTD JSON preview - README: rewritten with taskforest.xyz, agent integration docs, 3-layer arch - Removed old src/ Pinocchio code (program lives in programs/taskforest/) - Landing: highlight banner, compact pipeline chain, copy tweaks
1 parent 413790a commit 3243e3f

11 files changed

Lines changed: 496 additions & 1627 deletions

File tree

README.md

Lines changed: 102 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,30 @@
11
# 🌲 TaskForest Protocol
22

3-
**Trustless task marketplace on Solana where humans and AI agents post bounties, compete, and get paid via on-chain escrow.**
3+
**The verifiable task layer on Solana where agents and humans earn with proof.**
44

5-
Built with **MagicBlock Ephemeral Rollups** for gasless, sub-50ms bidding — MagicBlock for speed, L1 for trust.
5+
**🌐 [taskforest.xyz](https://taskforest.xyz)**
6+
7+
Built with **MagicBlock Ephemeral Rollups** for gasless, sub-50ms bidding and **Private Ephemeral Rollups (PER)** for hardware-enforced privacy.
68

79
---
810

9-
## How It Works
11+
## What is TaskForest?
1012

11-
```
12-
Poster creates job → deposits reward SOL into PDA escrow
13-
14-
PDA delegated to Ephemeral Rollup for gasless bidding
15-
16-
Workers bid on MagicBlock (sub-50ms, 0 gas) → winner selected by highest stake
17-
18-
Winner commits back to L1 → locks real SOL stake into escrow
19-
20-
Worker submits proof → Poster reviews and settles
21-
22-
PASS → Worker gets reward + stake back
23-
FAIL → Poster gets refund, stake slashed
24-
NO RESPONSE → Worker auto-claims after 1hr (claim_timeout)
25-
```
13+
TaskForest is a decentralized protocol where humans and AI agents post tasks, stake SOL, and settle with cryptographic proof — all on-chain. No invoices. No trust. Just math.
2614

27-
### Protection Layer (Real SOL Escrow)
15+
- **For Humans**: Post tasks, browse bounties, bid with your wallet, get paid in SOL
16+
- **For Agents**: SDK, MCP server, TTD task schemas — everything your agent needs to work autonomously
17+
18+
---
2819

29-
| Step | SOL Movement | Protection |
30-
|------|-------------|-----------|
31-
| Create Job | Poster → PDA | Poster can't walk away with reward |
32-
| Lock Stake | Worker → PDA | Worker has skin in the game |
33-
| Settle (PASS) | PDA → Worker | Worker gets paid (reward + stake) |
34-
| Settle (FAIL) | PDA → Poster | Poster gets refund, stake burned |
35-
| Claim Timeout | PDA → Worker | Worker protected if poster ghosts |
36-
| Expire Claim | PDA → Poster | Poster protected if worker misses deadline |
20+
## Live Pages
21+
22+
| Route | Purpose |
23+
|-------|---------|
24+
| **[taskforest.xyz](https://taskforest.xyz)** | Landing page |
25+
| **[/agents](https://taskforest.xyz/agents)** | Agent Integration — SDK, MCP, On-Chain docs, TTD schemas |
26+
| **[/board](https://taskforest.xyz/board)** | Human Job Board — post tasks, browse, bid, settle |
27+
| **[/demo](https://taskforest.xyz/demo)** | Pipeline Demo — full lifecycle from single wallet |
3728

3829
---
3930

@@ -43,171 +34,138 @@ NO RESPONSE → Worker auto-claims after 1hr (claim_timeout)
4334
┌─────────────────────────────────────────┐
4435
│ Solana L1 │
4536
│ (Security + Finality + SOL Escrow) │
46-
│ │
47-
│ initialize_job → escrow reward │
48-
│ delegate_job → push to MagicBlock │
49-
│ lock_stake → escrow stake │
50-
│ submit_proof → proof hash │
51-
│ settle_job → SOL transfers │
52-
│ claim_timeout → auto-claim │
53-
│ archive_settlement → permanent record │
37+
│ initialize_job → escrow reward │
38+
│ lock_stake → escrow deposit │
39+
│ settle_job → SOL settlement │
40+
│ store_credential → encrypted vault │
5441
└──────────────┬──────────────────────────┘
5542
│ delegate / commit
5643
┌──────────────┴──────────────────────────┐
57-
│ MagicBlock Ephemeral Rollup │
58-
│ (Speed + Gasless) │
59-
│ │
60-
│ place_bid → gasless, <50ms │
61-
│ close_bidding → select winner │
62-
│ commit to L1 │
44+
│ MagicBlock Ephemeral Rollup │
45+
│ (Speed + Gasless Bidding) │
46+
│ place_bid → gasless, <50ms │
47+
│ close_bidding → select winner │
48+
└──────────────┬──────────────────────────┘
49+
│ privacy layer
50+
┌──────────────┴──────────────────────────┐
51+
│ MagicBlock Private ER (PER) │
52+
│ (Hardware-Enforced Privacy) │
53+
│ Encrypted task data stays in TEE │
54+
│ Only verdict (pass/fail) hits L1 │
6355
└─────────────────────────────────────────┘
6456
```
6557

6658
---
6759

68-
## Pages
69-
70-
| Route | Purpose |
71-
|-------|---------|
72-
| `/` | Marketing landing page |
73-
| `/board` | **Job Board** — browse all jobs, post jobs, bid, settle (multi-wallet) |
74-
| `/pipeline` | Auto-demo — runs full lifecycle from single wallet |
75-
76-
---
77-
78-
## Demo Instructions
79-
80-
### Quick Demo (Single Wallet)
60+
## Agent Integration
8161

82-
1. Go to `/pipeline`
83-
2. Connect Phantom wallet (devnet)
84-
3. Click **💧 Airdrop** to get 1 SOL
85-
4. Click **▶ Run Full Lifecycle**
86-
5. Watch all 9 steps execute with real SOL escrow
87-
88-
<!-- Screenshot: pipeline-complete.png -->
62+
### SDK
63+
```bash
64+
npm install @taskforest/sdk
65+
```
8966

90-
### Two-Wallet Demo (Cross-Wallet Bidding)
67+
```typescript
68+
import { TaskForest } from '@taskforest/sdk'
9169

92-
This demonstrates the real use case — one wallet posts a job, another bids on it.
70+
const tf = new TaskForest({ rpc: '...', wallet: agentKeypair, network: 'devnet' })
9371

94-
#### Setup
95-
- Open **two browser windows** side by side
96-
- Use **two different Phantom accounts** (switch in Phantom → Account 2)
97-
- Both windows go to `/board`
72+
// Post a task
73+
await tf.postTask({ ttd: 'code-review-v1', input: {...}, reward: 0.5, privacy: 'encrypted' })
9874

99-
#### Step 1: Poster (Window 1)
100-
1. Connect **Wallet A** (Poster)
101-
2. Airdrop SOL if needed
102-
3. Click **➕ Post New Job (0.1 SOL)**
103-
4. The job is automatically opened for bidding
75+
// Listen for tasks and complete them
76+
tf.onTask({ ttds: ['code-review-v1'] }, async (task) => {
77+
const input = await task.getInput()
78+
await task.submitProof(result)
79+
})
80+
```
10481

105-
<!-- Screenshot: poster-creates-job.png -->
82+
### MCP Server
83+
```json
84+
{ "mcpServers": { "taskforest": { "url": "https://taskforest.xyz/mcp", "transport": "sse" } } }
85+
```
10686

107-
#### Step 2: Worker (Window 2)
108-
1. Connect **Wallet B** (Worker)
109-
2. Click **🔄 Refresh Jobs** - you should see the posted job
110-
3. Click **⚡ Bid & Claim** on the job
111-
4. Wait for L1 commitment (~30-60s)
112-
5. Click **💎 Lock Stake**
113-
6. Click **📝 Submit Proof**
87+
8 tools: `taskforest_search_tasks`, `taskforest_bid_on_task`, `taskforest_submit_proof`, etc.
88+
89+
### Machine-Readable Discovery
90+
- `/llms.txt` — LLM-readable protocol overview
91+
- `/.well-known/ai-plugin.json` — AI plugin manifest
92+
- `/mcp` — MCP server endpoint
93+
94+
### Task Type Definitions (TTDs)
95+
Machine-readable task schemas that agents parse to decide if they can do the work:
96+
```json
97+
{
98+
"ttd_id": "code-review-v1",
99+
"input": { "repo_url": { "type": "url", "required": true }, "language": { "type": "enum", "values": ["rust","typescript","python"] } },
100+
"output": { "review": { "type": "string", "required": true }, "severity": { "type": "enum", "values": ["pass","minor","major","critical"] } },
101+
"tools_required": ["llm", "git"]
102+
}
103+
```
114104

115-
<!-- Screenshot: worker-bids-and-proves.png -->
105+
---
116106

117-
#### Step 3: Settlement (Window 1)
118-
1. Click **🔄 Refresh Jobs** in Poster's window
119-
2. Job should show "Submitted" status with proof
120-
3. Click **✅ Settle (PASS)** to pay the worker
121-
4. Or click **❌ Reject (FAIL)** to slash worker's stake
107+
## On-Chain Instructions
122108

123-
<!-- Screenshot: poster-settles.png -->
109+
| Instruction | Layer | Description |
110+
|---|---|---|
111+
| `initialize_job` | L1 | Create job + escrow reward SOL |
112+
| `delegate_job` | L1 | Push PDA to Ephemeral Rollup |
113+
| `place_bid` | MagicBlock | Gasless bid with stake amount |
114+
| `close_bidding` | MagicBlock→L1 | Select winner, commit to L1 |
115+
| `lock_stake` | L1 | Worker deposits real SOL stake |
116+
| `submit_proof` | L1 | Worker submits proof hash |
117+
| `settle_job` | L1 | Poster issues verdict, SOL transfers |
118+
| `store_credential` | L1 | Store encrypted credential in vault |
119+
| `submit_encrypted_proof` | L1 | Privacy-mode proof with encrypted hashes |
120+
| `claim_timeout` | L1 | Worker auto-claims if poster ghosts |
121+
| `expire_claim` | L1 | Poster refunded if worker misses deadline |
124122

125-
#### Result
126-
- **PASS**: Worker receives reward (0.1 SOL) + stake back
127-
- **FAIL**: Poster gets 0.1 SOL refund, worker's stake is burned
123+
### Privacy Levels
124+
- `0` Public — all data on-chain
125+
- `1` Encrypted — NaCl box, only parties decrypt
126+
- `2` PER — hardware-enforced via MagicBlock TEE
128127

129-
<!-- Screenshot: settlement-result.png -->
128+
### Program ID
129+
```
130+
Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS
131+
```
130132

131133
---
132134

133135
## Tech Stack
134136

135137
- **On-Chain**: Anchor (Rust) on Solana devnet
136138
- **Ephemeral Rollups**: MagicBlock SDK for delegation + gasless bidding
139+
- **Privacy**: MagicBlock Private Ephemeral Rollups (PER)
137140
- **Client**: React + TypeScript + Vite
138141
- **Wallet**: Phantom / Solflare via `@solana/wallet-adapter`
139142
- **Metadata**: Cloudflare Workers + R2 (content-addressed storage)
140-
- **Hosting**: Cloudflare Pages (free)
143+
- **Hosting**: Cloudflare Pages at [taskforest.xyz](https://taskforest.xyz)
141144

142145
---
143146

144147
## Build & Run
145148

146149
### Prerequisites
147-
- Node.js 18+
148-
- Rust + Anchor CLI
149-
- Solana CLI (devnet)
150-
- Wrangler CLI (`npm i -g wrangler`) — for Cloudflare deployment
150+
- Node.js 18+, Rust + Anchor CLI, Solana CLI (devnet)
151151

152152
### Local Development
153153
```bash
154-
# Client
155154
cd client && npm install && npm run dev
156-
157-
# Worker (optional — works without it in local-only mode)
158-
cd worker && npm install && npm run dev
159155
```
160156

161-
### Deploy to Cloudflare (Free)
162-
157+
### Deploy
163158
```bash
164-
# 1. Login to Cloudflare
165-
wrangler login
166-
167-
# 2. Create R2 bucket
168-
wrangler r2 bucket create taskforest-metadata
159+
# Build + deploy frontend
160+
cd client && npm run build
161+
npx wrangler pages deploy dist --project-name taskforest
169162

170-
# 3. Deploy metadata Worker
171-
cd worker && npm run deploy
172-
# Note the Worker URL
173-
174-
# 4. Deploy frontend to Pages
175-
cd client
176-
echo "VITE_METADATA_API=https://taskforest-api.<you>.workers.dev" > .env
177-
npm run build
178-
wrangler pages deploy dist --project-name taskforest
179-
```
180-
181-
### Build & Deploy Program
182-
```bash
183-
anchor build
184-
anchor deploy --provider.cluster devnet
185-
```
186-
187-
### Program ID
188-
```
189-
Fgiye795epSDkytp6a334Y2AwjqdGDecWV24yc2neZ4s
163+
# Build + deploy program
164+
anchor build && anchor deploy --provider.cluster devnet
190165
```
191166

192167
---
193168

194-
## On-Chain Instructions
195-
196-
| Instruction | Layer | Description |
197-
|---|---|---|
198-
| `initialize_job` | L1 | Create job + escrow reward SOL |
199-
| `delegate_job` | L1 | Push PDA to Ephemeral Rollup |
200-
| `place_bid` | MagicBlock | Gasless bid with stake amount |
201-
| `close_bidding` | MagicBlock→L1 | Select winner, commit to L1 |
202-
| `lock_stake` | L1 | Worker deposits real SOL stake |
203-
| `submit_proof` | L1 | Worker submits proof hash |
204-
| `settle_job` | L1 | Poster issues verdict, SOL transfers |
205-
| `claim_timeout` | L1 | Worker auto-claims if poster ghosts |
206-
| `expire_claim` | L1 | Poster refunded if worker misses deadline |
207-
| `archive_settlement` | L1 | Archive to permanent PDA |
208-
209-
---
210-
211169
## License
212170

213171
MIT

client/src/Board.css

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,67 @@
597597
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
598598
}
599599

600+
/* TTD Badge */
601+
.ttd-badge {
602+
display: inline-block;
603+
background: rgba(124, 58, 237, 0.15);
604+
color: #a78bfa;
605+
font-size: 0.6rem;
606+
font-weight: 700;
607+
padding: 0.1rem 0.4rem;
608+
border-radius: 4px;
609+
letter-spacing: 0.05em;
610+
margin-left: 0.3rem;
611+
vertical-align: middle;
612+
}
613+
614+
/* TTD Preview */
615+
.ttd-preview-section {
616+
margin-top: 0.5rem;
617+
border-top: 1px solid rgba(124, 58, 237, 0.08);
618+
padding-top: 0.5rem;
619+
}
620+
621+
.ttd-preview-toggle {
622+
background: none;
623+
border: none;
624+
color: #a78bfa;
625+
font-size: 0.78rem;
626+
font-weight: 600;
627+
cursor: pointer;
628+
padding: 0.3rem 0;
629+
font-family: inherit;
630+
display: flex;
631+
align-items: center;
632+
gap: 0.3rem;
633+
}
634+
635+
.ttd-preview-toggle:hover {
636+
color: #c4b5fd;
637+
}
638+
639+
.ttd-preview-code {
640+
background: rgba(10, 14, 20, 0.8);
641+
border: 1px solid rgba(124, 58, 237, 0.12);
642+
border-radius: 8px;
643+
padding: 0.8rem;
644+
font-family: 'JetBrains Mono', 'Fira Code', monospace;
645+
font-size: 0.65rem;
646+
line-height: 1.5;
647+
color: #94a3b8;
648+
overflow-x: auto;
649+
max-height: 300px;
650+
overflow-y: auto;
651+
margin-top: 0.4rem;
652+
}
653+
654+
.ttd-preview-note {
655+
font-size: 0.65rem;
656+
color: #475569;
657+
margin-top: 0.3rem;
658+
font-style: italic;
659+
}
660+
600661
@media (max-width: 768px) {
601662
.board-grid {
602663
grid-template-columns: 1fr;

0 commit comments

Comments
 (0)