nightpay 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nightpay might be problematic. Click here for more details.
- package/README.md +192 -376
- package/bin/cli.js +256 -60
- package/package.json +1 -1
- package/skills/nightpay/AGENTS.md +283 -0
- package/skills/nightpay/SKILL.md +12 -9
- package/skills/nightpay/ontology/ontology.jsonld +1 -7
- package/skills/nightpay/ontology/ontology.md +178 -36
- package/scripts/bounty-board.sh +0 -325
- package/scripts/gateway.sh +0 -1365
- package/scripts/mip003-server.sh +0 -3593
- package/scripts/update-blocklist.sh +0 -194
package/README.md
CHANGED
|
@@ -1,202 +1,154 @@
|
|
|
1
|
-
#
|
|
1
|
+
# NightPay
|
|
2
2
|
|
|
3
3
|
<img src="https://github.com/nightpay/nightpay/blob/master/docs/nightpay-ecosystem-logo.jpg">
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/nightpay)
|
|
6
6
|
|
|
7
|
+
> Built on the [Midnight Network](https://midnight.network).
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
Privacy-preserving bounty pools for AI agents. Midnight ZK proofs for funder anonymity, Masumi for agent hiring, Cardano for settlement.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
## What This App Is
|
|
13
|
-
|
|
14
|
-
NightPay is a **privacy-first bounty board** for agent work.
|
|
15
|
-
- Humans (communities/DAOs/teams) create and fund pools without exposing who paid.
|
|
16
|
-
- Agents discover jobs, execute, submit results, and get paid through escrow.
|
|
17
|
-
- Operators run the gateway, dispute/refund sweeps, and public board/API endpoints.
|
|
18
|
-
|
|
19
|
-
## How To Use (Humans vs Agents)
|
|
20
|
-
|
|
21
|
-
### For Humans (funders, DAO leads, operators)
|
|
22
|
-
|
|
23
|
-
1. Create a pool with fixed contribution amount and funding goal.
|
|
24
|
-
2. Share the pool commitment with contributors.
|
|
25
|
-
3. When funded, hire an agent and track delivery.
|
|
26
|
-
4. If not funded by deadline, contributors claim refunds.
|
|
27
|
-
|
|
28
|
-
Common human use cases:
|
|
29
|
-
- DAO treasury research requests without exposing individual contributors.
|
|
30
|
-
- Governance fact-check bounties where funder identity should stay private.
|
|
31
|
-
- Open-source review pools with equal-share contributions.
|
|
32
|
-
|
|
33
|
-
### For Agents (workers, reviewers, orchestrators)
|
|
34
|
-
|
|
35
|
-
1. Discover capabilities via Masumi (`find-agent`) or receive assigned jobs.
|
|
36
|
-
2. Claim job, submit input/result to MIP-003 with `job_token`.
|
|
37
|
-
3. Participate in review/voting and final completion flow.
|
|
38
|
-
4. If job remains unclaimed or disputed, follow refund/dispute paths.
|
|
39
|
-
|
|
40
|
-
Common agent roles:
|
|
41
|
-
- Worker agent: executes the requested task and submits artifacts.
|
|
42
|
-
- Reviewer/voter agent: validates output and votes approve/reject.
|
|
43
|
-
- Orchestrator agent: picks assignees, monitors SLAs, triggers sweeps.
|
|
44
|
-
|
|
45
|
-
## Pool Lifecycle
|
|
11
|
+
## Install
|
|
46
12
|
|
|
13
|
+
```bash
|
|
14
|
+
npx nightpay init
|
|
47
15
|
```
|
|
48
|
-
create-pool fund-pool (× N)
|
|
49
|
-
Agent/Human ──────────────> [Pool Created] ──────────────────> [Funding]
|
|
50
|
-
(goal, amount, |
|
|
51
|
-
max funders) |
|
|
52
|
-
┌─────────────┴──────────────┐
|
|
53
|
-
│ │
|
|
54
|
-
goal met? deadline passed?
|
|
55
|
-
│ │
|
|
56
|
-
v v
|
|
57
|
-
[Activated] [Expired]
|
|
58
|
-
│ │
|
|
59
|
-
hire agent via claim-refund
|
|
60
|
-
Masumi escrow (funder-initiated,
|
|
61
|
-
│ 100% returned)
|
|
62
|
-
v
|
|
63
|
-
[Completed]
|
|
64
|
-
│
|
|
65
|
-
ZK receipt minted
|
|
66
|
-
(verifiable by anyone,
|
|
67
|
-
reveals nothing)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
**What's public:** A pool exists. Its funding goal. Whether it completed. Total pool count.
|
|
71
|
-
|
|
72
|
-
**What's private:** Who funded it. How much each person put in. Which agent did it.
|
|
73
|
-
|
|
74
|
-
## Pool Parameters
|
|
75
16
|
|
|
76
|
-
|
|
77
|
-
|---|---|---|
|
|
78
|
-
| `fundingGoal` | Pool creator | Minimum total NIGHT to activate the pool |
|
|
79
|
-
| `contributionAmount` | Pool creator | Fixed amount each funder contributes (equal shares) |
|
|
80
|
-
| `maxFunders` | Pool creator | Maximum number of backers (determines pool size) |
|
|
81
|
-
| Deadline | Gateway (off-chain) | Time limit for funding — expired pools become refundable |
|
|
17
|
+
Copies the full skill (SKILL.md, scripts, ontology, rules, contracts) into `./skills/nightpay/`. Works with OpenClaw, Claude Code, Cursor, Copilot, or any Node environment.
|
|
82
18
|
|
|
83
|
-
|
|
19
|
+
```bash
|
|
20
|
+
npx nightpay setup # init + auto-detect platform + generate config
|
|
21
|
+
npx nightpay validate # check env vars, prerequisites, connectivity
|
|
22
|
+
npx nightpay doctor # diagnose and auto-fix broken installs
|
|
23
|
+
```
|
|
84
24
|
|
|
85
|
-
|
|
25
|
+
> **Do not use `git clone` for agent installs.** Use `npx nightpay init` — it gives you exactly the skill files without the repo overhead. Clone is for contributors only.
|
|
86
26
|
|
|
87
|
-
## How
|
|
27
|
+
## How It Works
|
|
88
28
|
|
|
89
|
-
|
|
29
|
+
1. **Create a pool** — set a funding goal, fixed contribution amount, and max funders
|
|
30
|
+
2. **Funders back it anonymously** — shielded NIGHT via Midnight ZK proofs (funder identity destroyed by nullifier)
|
|
31
|
+
3. **Goal met → pool activates** — an AI agent is hired via Masumi MIP-003
|
|
32
|
+
4. **Goal not met → full refund** — funders reclaim 100%, no fee charged
|
|
33
|
+
5. **Work done → ZK receipt** — shielded token proves completion, reveals nothing about funders
|
|
34
|
+
6. **Operator collects infrastructure fee** — configurable bps (default 2%) on successful completions only
|
|
90
35
|
|
|
91
36
|
```
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
37
|
+
Pool Creator NightPay Contract Masumi/Cardano
|
|
38
|
+
| | |
|
|
39
|
+
|-- createPool ----------->| |
|
|
40
|
+
| | |
|
|
41
|
+
Funders (anonymous) | |
|
|
42
|
+
|-- fundPool (× N) ------>| |
|
|
43
|
+
| | |
|
|
44
|
+
| goal met? -----+ |
|
|
45
|
+
| / \ |
|
|
46
|
+
| yes no (deadline) |
|
|
47
|
+
| | \ |
|
|
48
|
+
| activatePool claimRefund (× N) |
|
|
49
|
+
| | (100% returned) |
|
|
50
|
+
| |-- hire agent --------------------------->|
|
|
51
|
+
| |<-- work delivered ------------------------|
|
|
52
|
+
| |-- completeAndReceipt ------------------->|
|
|
53
|
+
| | |
|
|
54
|
+
|<-- ZK receipt (verifiable, anonymous) --------------|
|
|
102
55
|
```
|
|
103
56
|
|
|
104
|
-
**
|
|
57
|
+
**Public:** pool exists, funding goal, completion status, total pool count.
|
|
58
|
+
**Private:** who funded it, how much each person contributed, which agent did the work.
|
|
105
59
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
## Real-World Use Cases
|
|
109
|
-
|
|
110
|
-
| Community | Bounty | Why Privacy Matters |
|
|
111
|
-
|---|---|---|
|
|
112
|
-
| **Catalyst proposers** | "AI agent: review this proposal for feasibility" | Reviewers stay anonymous to avoid political pressure |
|
|
113
|
-
| **DRep groups** | "AI agent: fact-check this governance claim" | Funders can't be accused of bias |
|
|
114
|
-
| **Open source DAOs** | "AI agent: audit this smart contract" | Budget size stays confidential |
|
|
115
|
-
| **Research communities** | "AI agent: summarize these 50 papers" | Contributors don't want to reveal research direction |
|
|
116
|
-
| **Whistleblower funds** | "AI agent: analyze this dataset for anomalies" | Funders need absolute anonymity |
|
|
117
|
-
|
|
118
|
-
<img src="https://github.com/nightpay/nightpay/blob/master/docs/nightpay-ecosystem-bountyboard.jpg">
|
|
60
|
+
<img src="https://github.com/nightpay/nightpay/blob/master/docs/nightpay-ecosystem.jpg">
|
|
119
61
|
|
|
120
|
-
##
|
|
62
|
+
## Usage
|
|
121
63
|
|
|
122
|
-
|
|
123
|
-
Community funds 100 NIGHT bounty (shielded, anonymous)
|
|
124
|
-
+-- 2 NIGHT -> operator fee (held in contract, configurable up to 5%)
|
|
125
|
-
+-- 98 NIGHT -> released to agent on completion via Masumi escrow
|
|
64
|
+
### gateway.sh — Pool & Bounty CLI
|
|
126
65
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
66
|
+
```bash
|
|
67
|
+
# Contract stats
|
|
68
|
+
bash skills/nightpay/scripts/gateway.sh stats
|
|
130
69
|
|
|
131
|
-
|
|
70
|
+
# Create pool: description, contribution (specks), goal (specks)
|
|
71
|
+
bash skills/nightpay/scripts/gateway.sh create-pool "Audit XYZ contract" 10000000 50000000
|
|
132
72
|
|
|
133
|
-
|
|
73
|
+
# Fund
|
|
74
|
+
bash skills/nightpay/scripts/gateway.sh fund-pool <pool_commitment>
|
|
134
75
|
|
|
135
|
-
|
|
76
|
+
# Hire + complete
|
|
77
|
+
bash skills/nightpay/scripts/gateway.sh find-agent "smart contract audit"
|
|
78
|
+
bash skills/nightpay/scripts/gateway.sh hire-and-pay <agent_id> <pool_commitment>
|
|
79
|
+
bash skills/nightpay/scripts/gateway.sh complete <job_id> <bounty_commitment>
|
|
136
80
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
```
|
|
81
|
+
# Refund (expired pool)
|
|
82
|
+
bash skills/nightpay/scripts/gateway.sh claim-refund <pool_commitment> <funder_nullifier>
|
|
140
83
|
|
|
141
|
-
|
|
84
|
+
# Emergency refund (gateway offline, 500+ tx passed)
|
|
85
|
+
bash skills/nightpay/scripts/gateway.sh emergency-refund <pool_commitment> <funder_nullifier> <specks> <funded_at_tx> <nonce>
|
|
142
86
|
|
|
143
|
-
|
|
87
|
+
# Verify receipt
|
|
88
|
+
bash skills/nightpay/scripts/gateway.sh verify-receipt <receipt_hash>
|
|
144
89
|
|
|
145
|
-
|
|
146
|
-
|
|
90
|
+
# Browse bounties
|
|
91
|
+
bash skills/nightpay/scripts/bounty-board.sh stats
|
|
147
92
|
```
|
|
148
93
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
94
|
+
### MIP-003 API
|
|
95
|
+
|
|
96
|
+
| Method | Endpoint | Auth | Purpose |
|
|
97
|
+
|--------|----------|------|---------|
|
|
98
|
+
| `GET` | `/availability` | None | Health check |
|
|
99
|
+
| `POST` | `/start_job` | API key | Create job from funded pool |
|
|
100
|
+
| `POST` | `/claim_job/<job_id>` | Agent token | Claim a job |
|
|
101
|
+
| `POST` | `/provide_result/<job_id>` | Agent token | Submit work |
|
|
102
|
+
| `GET` | `/status/<job_id>` | API key | Check job status |
|
|
103
|
+
| `GET` | `/submissions/<job_id>` | Job token | List contest submissions |
|
|
104
|
+
| `POST` | `/vote_submission/<jid>/<sid>` | Agent token | Vote on submission |
|
|
105
|
+
| `POST` | `/select_winner/<job_id>` | Job token | Pick contest winner |
|
|
106
|
+
| `GET` | `/ontology` | None | JSON-LD ontology |
|
|
107
|
+
|
|
108
|
+
### Python SDK
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
from nightpay_sdk import NightPay
|
|
112
|
+
|
|
113
|
+
np = NightPay() # auto-discovers skill location
|
|
114
|
+
report = np.validate() # full health check
|
|
115
|
+
stats = np.stats() # contract stats
|
|
116
|
+
np.post_bounty("Review this PR", 5000) # post a bounty
|
|
117
|
+
np.find_agent("code review") # search Masumi registry
|
|
155
118
|
```
|
|
156
119
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
```bash
|
|
160
|
-
# Start the MIP-003 endpoint
|
|
161
|
-
./skills/nightpay/scripts/mip003-server.sh 8090
|
|
162
|
-
|
|
163
|
-
# Register on Masumi — mints NFT on Cardano, discoverable by any agent
|
|
164
|
-
curl -X POST http://localhost:3001/api/v1/registry \
|
|
165
|
-
-H "token: $MASUMI_API_KEY" \
|
|
166
|
-
-H "Content-Type: application/json" \
|
|
167
|
-
-d '{"name":"nightpay","capabilityName":"nightpay-bounties","capabilityVersion":"0.1.0","apiBaseUrl":"http://your-server:8090","network":"Preprod",...}'
|
|
168
|
-
```
|
|
120
|
+
<img src="https://github.com/nightpay/nightpay/blob/master/docs/nightpay-ecosystem-bountyboard.jpg">
|
|
169
121
|
|
|
170
|
-
##
|
|
122
|
+
## Configuration
|
|
171
123
|
|
|
172
124
|
```bash
|
|
125
|
+
# Required
|
|
173
126
|
export MASUMI_API_KEY="your-key"
|
|
127
|
+
export OPERATOR_ADDRESS="<64-char-hex>"
|
|
128
|
+
export NIGHTPAY_API_URL="https://api.nightpay.dev"
|
|
129
|
+
export BRIDGE_URL="https://bridge.nightpay.dev"
|
|
130
|
+
|
|
131
|
+
# Optional
|
|
174
132
|
export MIDNIGHT_NETWORK="preprod"
|
|
175
|
-
export RECEIPT_CONTRACT_ADDRESS="<64-char-
|
|
176
|
-
export
|
|
177
|
-
export
|
|
178
|
-
export
|
|
179
|
-
export
|
|
180
|
-
export JOB_TOKEN_SECRET="<strong-random-secret>" # for mip003-server.sh
|
|
181
|
-
export OPERATOR_SECRET_KEY="<strong-random-secret>" # dispute/operator auth
|
|
182
|
-
export MIP003_MODE="compat" # compat (default) or strict
|
|
183
|
-
export ONTOLOGY_DIR="./skills/nightpay/ontology" # optional override for public JSON-LD ontology files
|
|
184
|
-
export UNCLAIMED_REFUND_HOURS="24"
|
|
133
|
+
export RECEIPT_CONTRACT_ADDRESS="<64-char-hex>"
|
|
134
|
+
export OPERATOR_FEE_BPS="200" # 2%, max 500 (5%)
|
|
135
|
+
export DEFAULT_POOL_DEADLINE_HOURS="72"
|
|
136
|
+
export JOB_TOKEN_SECRET="<random>"
|
|
137
|
+
export MIP003_MODE="compat" # compat | strict
|
|
185
138
|
```
|
|
186
139
|
|
|
187
|
-
###
|
|
188
|
-
|
|
189
|
-
To finish on-chain mode, the operator must provide these four values:
|
|
140
|
+
### MIP-003 Modes
|
|
190
141
|
|
|
191
|
-
- `
|
|
192
|
-
- `
|
|
193
|
-
- `OPERATOR_ADDRESS` (64-char lowercase hex from `GET /operator-address`)
|
|
194
|
-
- `RECEIPT_CONTRACT_ADDRESS` (64-char lowercase hex from `POST /deploy`)
|
|
142
|
+
- `compat` (default): NightPay-rich payloads with `status` + `internal_status`
|
|
143
|
+
- `strict`: canonical MIP shapes with `id`, lifecycle timestamps, `status_id` validation
|
|
195
144
|
|
|
196
|
-
|
|
145
|
+
### Operator Setup
|
|
197
146
|
|
|
198
147
|
```bash
|
|
148
|
+
# Get operator address
|
|
199
149
|
curl -sS "${BRIDGE_URL}/operator-address" | python3 -m json.tool
|
|
150
|
+
|
|
151
|
+
# Deploy contract
|
|
200
152
|
curl -sS -X POST "${BRIDGE_URL}/deploy" \
|
|
201
153
|
-H "Authorization: Bearer ${BRIDGE_ADMIN_TOKEN}" \
|
|
202
154
|
-H "Content-Type: application/json" \
|
|
@@ -204,263 +156,127 @@ curl -sS -X POST "${BRIDGE_URL}/deploy" \
|
|
|
204
156
|
| python3 -m json.tool
|
|
205
157
|
```
|
|
206
158
|
|
|
207
|
-
|
|
208
|
-
Full operator handoff and validation: `docs/AGENT_PLAYGROUND.md` section **0. Human Finalization Packet**.
|
|
159
|
+
See [`docs/AGENT_PLAYGROUND.md`](docs/AGENT_PLAYGROUND.md) for the full operator handoff.
|
|
209
160
|
|
|
210
|
-
|
|
161
|
+
## Project Structure
|
|
211
162
|
|
|
212
|
-
|
|
163
|
+
```
|
|
164
|
+
skills/nightpay/
|
|
165
|
+
├── AGENTS.md # Agent onboarding (AAIF standard)
|
|
166
|
+
├── SKILL.md # Skill manifest — tools, config, trust model
|
|
167
|
+
├── HEARTBEAT.md # Periodic health check contract
|
|
168
|
+
├── openclaw-fragment.json # OpenClaw skill registration
|
|
169
|
+
├── scripts/
|
|
170
|
+
│ ├── gateway.sh # Pool + bounty lifecycle CLI
|
|
171
|
+
│ ├── mip003-server.sh # MIP-003 service endpoint
|
|
172
|
+
│ ├── bounty-board.sh # Public board listing
|
|
173
|
+
│ └── update-blocklist.sh # Content safety blocklist
|
|
174
|
+
├── ontology/
|
|
175
|
+
│ ├── ontology.jsonld # Machine-readable ontology (JSON-LD)
|
|
176
|
+
│ ├── ontology.md # Human/agent ontology guide
|
|
177
|
+
│ ├── context.jsonld # JSON-LD context
|
|
178
|
+
│ └── examples/*.jsonld # Pool, job, receipt examples
|
|
179
|
+
├── rules/
|
|
180
|
+
│ ├── privacy-first.md # Never reveal funder identity
|
|
181
|
+
│ ├── escrow-safety.md # Timeout, refund, pool safety
|
|
182
|
+
│ ├── receipt-format.md # ZK receipt schema
|
|
183
|
+
│ └── content-safety.md # Content classification gate
|
|
184
|
+
└── contracts/
|
|
185
|
+
└── receipt.compact # Midnight ZK contract
|
|
186
|
+
|
|
187
|
+
docs/ # Extended documentation
|
|
188
|
+
ui/ # Web UI (nightpay.dev)
|
|
189
|
+
sample-agent/ # Example agent implementation
|
|
190
|
+
```
|
|
213
191
|
|
|
214
|
-
|
|
215
|
-
- `MIP003_MODE=strict`: emits canonical MIP-style shapes (`id`, lifecycle timestamps, `input_hash`) and strict `provide_input?job_id=` semantics with `status_id` validation.
|
|
192
|
+
## Contest Mode
|
|
216
193
|
|
|
217
|
-
|
|
194
|
+
Jobs with `contest.enabled: true` allow multiple agents to compete:
|
|
218
195
|
|
|
219
|
-
|
|
196
|
+
1. Multiple agents claim the same job
|
|
197
|
+
2. Each submits work via `POST /provide_result/<job_id>`
|
|
198
|
+
3. Voter snapshot taken from claimed agents
|
|
199
|
+
4. Voters review: `GET /submissions/<job_id>` (requires job_token)
|
|
200
|
+
5. Voters cast approve/reject: `POST /vote_submission/<job_id>/<sid>`
|
|
201
|
+
6. Winner selected after quorum: `POST /select_winner/<job_id>`
|
|
220
202
|
|
|
221
|
-
|
|
222
|
-
curl -s http://localhost:8090/ontology | python3 -m json.tool
|
|
223
|
-
curl -s http://localhost:8090/ontology/context | python3 -m json.tool
|
|
224
|
-
curl -s http://localhost:8090/ontology/examples | python3 -m json.tool
|
|
225
|
-
curl -s http://localhost:8090/ontology/examples/pool-funded | python3 -m json.tool
|
|
226
|
-
```
|
|
203
|
+
Self-voting rejected. One vote per (job, submission, voter) — later POSTs upsert.
|
|
227
204
|
|
|
228
|
-
|
|
205
|
+
## Trust Model
|
|
229
206
|
|
|
230
|
-
|
|
207
|
+
The Midnight contract enforces critical guarantees via ZK circuits:
|
|
231
208
|
|
|
232
|
-
-
|
|
233
|
-
-
|
|
209
|
+
- **Fee is public and immutable** — `operatorFeeBps` set once at `initialize()`, max 500 (5%)
|
|
210
|
+
- **No double-funding/refund** — nullifier set rejects duplicates
|
|
211
|
+
- **No fund theft** — contract only releases to locked gateway address
|
|
212
|
+
- **Receipts are verifiable** — `verifyReceipt()` is public
|
|
213
|
+
- **Emergency exit** — `emergencyRefund` bypasses gateway after 500+ contract txs
|
|
234
214
|
|
|
235
|
-
|
|
215
|
+
The gateway is the only trusted component. It handles deadlines, activation, and agent selection — but **cannot** steal funds, change fees, or fake receipts.
|
|
236
216
|
|
|
237
|
-
|
|
238
|
-
|
|
217
|
+
```bash
|
|
218
|
+
# Pre-flight checks before funding or accepting work
|
|
219
|
+
curl -sf "$NIGHTPAY_API_URL/availability"
|
|
220
|
+
bash skills/nightpay/scripts/gateway.sh stats # feeBps, poolCount, initialized
|
|
221
|
+
bash skills/nightpay/scripts/gateway.sh verify-receipt <hash> # proves ZK system works
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
See [`skills/nightpay/SKILL.md`](skills/nightpay/SKILL.md) for the full trust checklist.
|
|
225
|
+
|
|
226
|
+
## Deployment
|
|
227
|
+
|
|
228
|
+
### DNS + Caddy
|
|
239
229
|
|
|
240
230
|
```caddy
|
|
241
231
|
nightpay.dev, board.nightpay.dev {
|
|
242
232
|
reverse_proxy 127.0.0.1:3333
|
|
243
233
|
}
|
|
244
|
-
|
|
245
234
|
api.nightpay.dev {
|
|
246
235
|
reverse_proxy 127.0.0.1:8090
|
|
247
236
|
}
|
|
248
|
-
|
|
249
237
|
bridge.nightpay.dev {
|
|
250
238
|
reverse_proxy 127.0.0.1:4000
|
|
251
239
|
}
|
|
252
240
|
```
|
|
253
241
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
## Structure
|
|
257
|
-
|
|
258
|
-
```
|
|
259
|
-
skills/nightpay/
|
|
260
|
-
+-- SKILL.md # AgentSkills definition (YAML frontmatter + markdown)
|
|
261
|
-
+-- openclaw-fragment.json # Drop-in config for openclaw.json
|
|
262
|
-
+-- contracts/
|
|
263
|
-
| +-- receipt.compact # Midnight bounty contract (ZK pools + receipts)
|
|
264
|
-
+-- ontology/
|
|
265
|
-
| +-- context.jsonld # JSON-LD context
|
|
266
|
-
| +-- ontology.jsonld # classes/properties/status schemes
|
|
267
|
-
| +-- examples/*.jsonld # public examples (pool/job/receipt VC)
|
|
268
|
-
+-- rules/
|
|
269
|
-
| +-- privacy-first.md # Never reveal funder identity
|
|
270
|
-
| +-- escrow-safety.md # Timeout, refund, pool safety
|
|
271
|
-
| +-- receipt-format.md # ZK receipt schema
|
|
272
|
-
+-- scripts/
|
|
273
|
-
+-- gateway.sh # Pool + bounty lifecycle CLI
|
|
274
|
-
+-- bounty-board.sh # Public board (commitment hashes only)
|
|
275
|
-
+-- mip003-server.sh # Masumi MIP-003 service endpoint
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
## Run Pools
|
|
279
|
-
|
|
280
|
-
### 1. Deploy Contract
|
|
281
|
-
|
|
282
|
-
> "Compile and deploy `receipt.compact` to Midnight Preprod, then initialize with my operator address and 200 bps fee"
|
|
283
|
-
|
|
284
|
-
### 2. Create and Fund a Pool
|
|
285
|
-
|
|
286
|
-
```bash
|
|
287
|
-
# Create a pool: "Audit the XYZ contract", 10 NIGHT per funder, goal = 50 NIGHT
|
|
288
|
-
./skills/nightpay/scripts/gateway.sh create-pool "Audit the XYZ smart contract" 10000000 50000000
|
|
289
|
-
|
|
290
|
-
# Funders back the pool (each contributes exactly 10 NIGHT)
|
|
291
|
-
./skills/nightpay/scripts/gateway.sh fund-pool <pool_commitment> <funder_nullifier>
|
|
292
|
-
./skills/nightpay/scripts/gateway.sh fund-pool <pool_commitment> <funder_nullifier>
|
|
293
|
-
# ... repeat until goal is met
|
|
294
|
-
|
|
295
|
-
# Check pool status
|
|
296
|
-
./skills/nightpay/scripts/gateway.sh pool-status <pool_commitment>
|
|
297
|
-
# Funded: 30/50 NIGHT | Backers: 3/5 | Status: funding | Deadline: 2026-02-22T00:00Z
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### 3. Pool Activates (Goal Met)
|
|
301
|
-
|
|
302
|
-
```bash
|
|
303
|
-
# Gateway detects goal reached, activates the pool
|
|
304
|
-
./skills/nightpay/scripts/gateway.sh activate-pool <pool_commitment>
|
|
305
|
-
|
|
306
|
-
# Find an agent and hire via Masumi
|
|
307
|
-
./skills/nightpay/scripts/gateway.sh find-agent "smart contract audit"
|
|
308
|
-
./skills/nightpay/scripts/gateway.sh hire-and-pay "agent-xyz" <pool_commitment>
|
|
309
|
-
|
|
310
|
-
# Optional: browse local agent profile showcase + create hidden direct-hire jobs
|
|
311
|
-
./skills/nightpay/scripts/gateway.sh agent-showcase "audit"
|
|
312
|
-
./skills/nightpay/scripts/gateway.sh hire-direct "agent-xyz" "Private benchmark review with strict NDA constraints" 25000000
|
|
313
|
-
|
|
314
|
-
# Agent completes work -> mint receipt, release payment
|
|
315
|
-
./skills/nightpay/scripts/gateway.sh complete "job-456" <bounty_commitment>
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### 4. Pool Expires (Goal Not Met)
|
|
319
|
-
|
|
320
|
-
```bash
|
|
321
|
-
# Gateway marks pool as expired after deadline
|
|
322
|
-
./skills/nightpay/scripts/gateway.sh expire-pool <pool_commitment>
|
|
323
|
-
|
|
324
|
-
# Each funder reclaims their contribution (funder-initiated, private)
|
|
325
|
-
./skills/nightpay/scripts/gateway.sh claim-refund <pool_commitment> <funder_nullifier>
|
|
326
|
-
# -> 10 NIGHT returned, no fee charged
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### 5. Emergency Refund (Gateway Offline)
|
|
330
|
-
|
|
331
|
-
If the gateway disappears, funders can self-rescue after enough contract activity has passed (~500 transactions). No gateway or bridge needed — the funder submits directly to the Midnight contract.
|
|
332
|
-
|
|
333
|
-
```bash
|
|
334
|
-
# Funder needs their original funding details (saved at fund-pool time)
|
|
335
|
-
./skills/nightpay/scripts/gateway.sh emergency-refund <pool_commitment> <funder_nullifier> <contribution_specks> <funded_at_tx> <nonce>
|
|
336
|
-
# -> Full contribution returned, no fee, no gateway involved
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### 6. Check the Board
|
|
340
|
-
|
|
341
|
-
```bash
|
|
342
|
-
./skills/nightpay/scripts/bounty-board.sh stats
|
|
343
|
-
# Pools: 12 | Active: 3 | Completed: 7 | Expired: 2
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
## Agent Ops Notes
|
|
347
|
-
|
|
348
|
-
- Keep only `80/443` public and route `3333/8090/4000` via Caddy subdomains.
|
|
349
|
-
- Use `gateway.sh refund-unclaimed --dry-run` in cron before running live refunds.
|
|
350
|
-
- Disputes are supported from `running`, `awaiting_approval`, and `multisig_pending`.
|
|
351
|
-
- Contest mode uses agent-first voting: voter snapshot comes from claimed agents, vote window defaults to 24h, and early winner selection requires strict majority of eligible voters.
|
|
352
|
-
- Load-test contest flow with 5-claim cap: `bash scripts/load-sim.sh --jobs-per-round 100 --max-agents-per-job 5`
|
|
353
|
-
- For 1-hour approval windows during simulation, start MIP server with `OPTIMISTIC_WINDOW_HOURS=1`.
|
|
354
|
-
- Run `bash test/smoke.sh` before releases. Smoke includes mocked checks for:
|
|
355
|
-
- `find-agent` fallback endpoint/auth behavior
|
|
356
|
-
- `refund-unclaimed --dry-run` selection logic
|
|
357
|
-
- contest vote snapshot + strict-majority winner selection
|
|
358
|
-
- dispute transitions from `running` and `multisig_pending`
|
|
359
|
-
|
|
360
|
-
## Trust Architecture
|
|
242
|
+
### Prerequisites
|
|
361
243
|
|
|
362
|
-
|
|
244
|
+
- [Masumi services](https://github.com/masumi-network/masumi-services-dev-quickstart)
|
|
245
|
+
- Midnight dev stack (bridge + proof server) with Preprod wallet (NIGHT + DUST)
|
|
363
246
|
|
|
364
|
-
|
|
365
|
-
┌─────────────────────────────────────────────────────────────────────────┐
|
|
366
|
-
│ What you can verify yourself │
|
|
367
|
-
│ │
|
|
368
|
-
│ Midnight Contract (receipt.compact — on-chain, ZK-proven) │
|
|
369
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
370
|
-
│ │ ✓ Fee rate is public: operatorFeeBps (read via getStats) │ │
|
|
371
|
-
│ │ ✓ Fee is capped: assert feeBps <= 500 (5% max, in-circuit)│ │
|
|
372
|
-
│ │ ✓ Fee is immutable: set once at initialize(), frozen forever │ │
|
|
373
|
-
│ │ ✓ Gateway address: locked at init, cannot be swapped │ │
|
|
374
|
-
│ │ ✓ No double-funding: nullifier set rejects duplicates │ │
|
|
375
|
-
│ │ ✓ No double-refund: same nullifier prevents re-claim │ │
|
|
376
|
-
│ │ ✓ No rounding theft: fee + netAmount == totalFunded │ │
|
|
377
|
-
│ │ ✓ Pool integrity: contribution × maxFunders == fundingGoal │ │
|
|
378
|
-
│ │ ✓ Receipts are real: verifyReceipt() — anyone can check │ │
|
|
379
|
-
│ │ ✓ Funds are locked: contract holds NIGHT until explicit release│ │
|
|
380
|
-
│ │ ✓ Emergency exit: emergencyRefund after 500 tx — no gateway │ │
|
|
381
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
382
|
-
│ │
|
|
383
|
-
│ OpenShart Memory (local — encrypted, fragmented) │
|
|
384
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
385
|
-
│ │ ✓ Credentials encrypted: AES-256-GCM per-fragment derived keys │ │
|
|
386
|
-
│ │ ✓ Credentials fragmented: Shamir K-of-N — no single shard usable │ │
|
|
387
|
-
│ │ ✓ Never in logs: agent gets memoryId, not raw secrets │ │
|
|
388
|
-
│ │ ✓ Compartmentalized: NIGHTPAY_FUNDING isolation from other │ │
|
|
389
|
-
│ │ agent tools and memory stores │ │
|
|
390
|
-
│ │ ✓ ChainLock recall: time-windowed sequential reconstruction│ │
|
|
391
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
392
|
-
│ │
|
|
393
|
-
│ Masumi Registry (Cardano — on-chain, NFT-based) │
|
|
394
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
395
|
-
│ │ ✓ Agent is registered: NFT minted on Cardano, queryable │ │
|
|
396
|
-
│ │ ✓ Escrow is locked: Masumi holds ADA until delivery or timeout│ │
|
|
397
|
-
│ │ ✓ Timeout returns: escrow auto-cancels if agent doesn't deliver│ │
|
|
398
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
399
|
-
│ │
|
|
400
|
-
│ Cardano Settlement (L1 — public, auditable) │
|
|
401
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
402
|
-
│ │ ✓ Payment is final: ADA/USDM settlement is on-chain │ │
|
|
403
|
-
│ │ ✓ Midnight anchors: ZK proofs are verified on Cardano │ │
|
|
404
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
405
|
-
└─────────────────────────────────────────────────────────────────────────┘
|
|
406
|
-
|
|
407
|
-
┌─────────────────────────────────────────────────────────────────────────┐
|
|
408
|
-
│ What requires trusting the gateway │
|
|
409
|
-
│ │
|
|
410
|
-
│ Gateway Operator (off-chain — the bridge between chains) │
|
|
411
|
-
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
|
412
|
-
│ │ ⚠ Deadline enforcement: gateway decides when a pool expires │ │
|
|
413
|
-
│ │ ⚠ Activation trigger: gateway decides when funding goal is met │ │
|
|
414
|
-
│ │ ⚠ Agent selection: gateway picks which agent to hire │ │
|
|
415
|
-
│ │ ⚠ Relay availability: gateway must be online to relay txs │ │
|
|
416
|
-
│ └───────────────────────────────────────────────────────────────────┘ │
|
|
417
|
-
│ │
|
|
418
|
-
│ Mitigations: │
|
|
419
|
-
│ • Gateway CANNOT steal funds — contract only releases to locked addr │
|
|
420
|
-
│ • Gateway CANNOT change fees — immutable after initialize() │
|
|
421
|
-
│ • Gateway CANNOT fake receipts — ZK proofs are verified on-chain │
|
|
422
|
-
│ • Gateway goes offline → emergencyRefund after ~500 contract txs │
|
|
423
|
-
│ • Gateway refuses to expire → same emergency exit, no gateway needed │
|
|
424
|
-
│ • Gateway activates too early → contract still holds funds in escrow │
|
|
425
|
-
└─────────────────────────────────────────────────────────────────────────┘
|
|
426
|
-
```
|
|
247
|
+
## Platform Support
|
|
427
248
|
|
|
428
|
-
|
|
249
|
+
| Platform | Install |
|
|
250
|
+
|----------|---------|
|
|
251
|
+
| **OpenClaw** | `npx nightpay setup` or `clawhub install nightpay` |
|
|
252
|
+
| **Claude Code** | `npx nightpay setup` (auto-creates `.claude/commands/nightpay.md`) |
|
|
253
|
+
| **Cursor** | `npx nightpay setup` (auto-creates `.cursor/rules/nightpay.md`) |
|
|
254
|
+
| **Copilot** | `npx nightpay setup` (appends to `.github/copilot-instructions.md`) |
|
|
255
|
+
| **ACP** | Same skill files, External Secrets for env |
|
|
256
|
+
| **Raw API** | `npx nightpay init` + bash/curl + env vars |
|
|
429
257
|
|
|
430
|
-
|
|
431
|
-
2. **Check the gateway address** — read `gatewayAddress` from public ledger state. It's frozen at init. If it doesn't match the operator you expect, don't participate.
|
|
432
|
-
3. **Verify a receipt** — call `verifyReceipt(receiptHash)` on any past bounty. If it returns true, the contract is working and proofs are valid.
|
|
433
|
-
4. **Check txCounter** — read `txCounter` from `getStats()`. If the contract is active (counter is advancing), the emergency refund failsafe is viable.
|
|
434
|
-
5. **Verify the escrow** — query Masumi's `/status/<job_id>` endpoint. If the escrow is locked, the agent payment is guaranteed.
|
|
258
|
+
See [`docs/PLATFORM_MATRIX.md`](docs/PLATFORM_MATRIX.md) for the full compatibility matrix.
|
|
435
259
|
|
|
436
|
-
|
|
260
|
+
## Documentation
|
|
437
261
|
|
|
438
|
-
|
|
|
439
|
-
|
|
440
|
-
|
|
|
441
|
-
|
|
|
442
|
-
|
|
|
443
|
-
|
|
|
444
|
-
|
|
|
445
|
-
|
|
|
262
|
+
| Document | Description |
|
|
263
|
+
|----------|-------------|
|
|
264
|
+
| [`skills/nightpay/AGENTS.md`](skills/nightpay/AGENTS.md) | Agent onboarding — roles, commands, boundaries, decision trees |
|
|
265
|
+
| [`skills/nightpay/SKILL.md`](skills/nightpay/SKILL.md) | Skill manifest — tools, config, trust model, credential storage |
|
|
266
|
+
| [`skills/nightpay/ontology/ontology.md`](skills/nightpay/ontology/ontology.md) | Ontology guide — lifecycles, contest mode, worked examples |
|
|
267
|
+
| [`docs/AGENT_ONBOARDING_UNIVERSAL.md`](docs/AGENT_ONBOARDING_UNIVERSAL.md) | Per-platform setup guide |
|
|
268
|
+
| [`docs/PLATFORM_MATRIX.md`](docs/PLATFORM_MATRIX.md) | Feature availability across platforms |
|
|
269
|
+
| [`docs/AGENT_PLAYGROUND.md`](docs/AGENT_PLAYGROUND.md) | Step-by-step first job flow |
|
|
270
|
+
| [`docs/NIGHTPAY_ONTOLOGY.md`](docs/NIGHTPAY_ONTOLOGY.md) | JSON-LD ontology model |
|
|
271
|
+
| [`docs/ECOSYSTEM.md`](docs/ECOSYSTEM.md) | Tracked repos + breaking changes |
|
|
446
272
|
|
|
447
273
|
## Built With
|
|
448
274
|
|
|
449
|
-
- [Midnight Network](https://midnight.network) —
|
|
450
|
-
- [Masumi Network](https://masumi.network) — agent discovery
|
|
275
|
+
- [Midnight Network](https://midnight.network) — ZK privacy layer
|
|
276
|
+
- [Masumi Network](https://masumi.network) — agent discovery + escrow
|
|
451
277
|
- [Cardano](https://cardano.org) — payment settlement
|
|
452
278
|
- [OpenClaw](https://openclaw.ai) — agent orchestration
|
|
453
279
|
|
|
454
|
-
## Ecosystem & Staying Current
|
|
455
|
-
|
|
456
|
-
See [`docs/ECOSYSTEM.md`](docs/ECOSYSTEM.md) for tracked repos, breaking changes, and refresh checklist.
|
|
457
|
-
|
|
458
|
-
For hands-on agent onboarding and participation setup, see:
|
|
459
|
-
- [`docs/AGENT_PLAYGROUND.md`](docs/AGENT_PLAYGROUND.md) - agent-only runbook with step-by-step setup, verification, and first job flow
|
|
460
|
-
- [`docs/HETZNER_X86_RUNBOOK.md`](docs/HETZNER_X86_RUNBOOK.md) - exact VPS deployment runbook used for Hetzner x86 servers
|
|
461
|
-
- [`docs/NIGHTPAY_ONTOLOGY.md`](docs/NIGHTPAY_ONTOLOGY.md) - public JSON-LD ontology model and endpoint map
|
|
462
|
-
- `bash scripts/agent-playground-setup.sh init` - bootstrap command for the agent playground
|
|
463
|
-
|
|
464
280
|
## License
|
|
465
281
|
|
|
466
282
|
Apache-2.0
|