Interact with Catallax — a decentralized contract work protocol on Nostr using Lightning/Cashu payments and trusted escrow arbiters.
Read references/NIP-3400.md for the full spec. Key concepts:
Use nak to query kind 33401 events from relays:
# List all task proposals (limit 50)
nak req -k 33401 -l 50 wss://relay.damus.io
# Filter by tag (e.g. tasks tagged "development")
nak req -k 33401 -t development -l 50 wss://relay.damus.io
# Filter by status (open tasks only)
nak req -k 33401 -l 100 wss://relay.damus.io | \
while read -r event; do
status=$(echo "$event" | jq -r '.tags[] | select(.[0]=="status") | .[1]')
if [ "$status" = "proposed" ] || [ "$status" = "funded" ]; then
echo "$event"
fi
done
Parse the content field as JSON to get title, description, requirements. Parse tags for amount, status, categories.
When presenting tasks to the user, show:
amount tag, in sats — show "?" if missing)status tag)t tags)funding_type tag: "patron" or "crowdfunding")# List arbiter services
nak req -k 33400 -l 50 wss://relay.damus.io
Parse content for name, about, policy. Parse tags for fee_type, fee_amount, min/max amounts, categories.
When presenting arbiters:
t tags)To create a task as a Patron, publish a kind 33401 event:
# Build and publish task proposal
nak event -k 33401 \
--tag d="<unique-slug>" \
--tag p="<your-pubkey>" \
--tag amount="<bounty-in-sats>" \
--tag t="<category>" \
--tag status="proposed" \
--tag funding_type="patron" \
-c '{"title":"Task Title","description":"Detailed description...","requirements":"What must be delivered"}' \
--sec "<nsec>" \
wss://relay.damus.io wss://nos.lol wss://relay.primal.net
Generate the d-tag slug from the title (lowercase, hyphenated, with random suffix for uniqueness).
Important: The content field must be valid JSON with title, description, and optionally requirements and deadline.
Since kind 33401 is addressable replaceable, publish a new event with the same d-tag to update. Include all original tags plus changes:
# Update to funded (add zap receipt reference)
nak event -k 33401 \
--tag d="<same-d-tag>" \
--tag status="funded" \
--tag e="<zap-receipt-event-id>" \
# ... all other original tags ...
--sec "<nsec>" \
wss://relay.damus.io
Work delivery is coordinated out-of-band per the protocol. However, agents may use kind 951 (work delivery) as a convention:
nak event -k 951 \
--tag e="<task-event-id>" \
--tag p="<patron-pubkey>" \
-c '{"delivery":"Description of completed work","evidence":"Link or proof"}' \
--sec "<nsec>" \
wss://relay.damus.io
nak event -k 3402 \
--tag e="<payout-zap-receipt-id>" \
--tag e="<task-event-id>" \
--tag p="<patron-pubkey>" \
--tag p="<arbiter-pubkey>" \
--tag p="<worker-pubkey>" \
--tag resolution="successful" \
--tag a="33401:<patron-pubkey>:<task-d-tag>" \
-c '{"resolution_details":"Work met all requirements"}' \
--sec "<nsec>" \
wss://relay.damus.io
| User says | Action |
|---|---|
| ----------- | -------- |
| "find bounties" / "show tasks" | Query kind 33401, filter status=proposed or funded |
| "create a task" / "post a bounty" | Build and publish kind 33401 |
| "find arbiters" | Query kind 33400 |
| "submit work" / "deliver" | Publish kind 951 referencing the task |
| "check my tasks" | Query kind 33401 filtered by user's pubkey in p-tags |
| "what's the status" | Fetch specific task by d-tag, report status |
For visual browsing: https://catallax-reference-client.netlify.app/catallax
Query multiple relays for best coverage:
Note: Some relays may not return results for nak req -k 33401 due to kind filtering. If nak returns empty results, fall back to a WebSocket script approach — open a WebSocket connection, send a REQ with {"kinds":[33401],"limit":50}, and collect EVENT responses until EOSE.
共 1 个版本