create-project-with-grant
Create Project with Grant
Create a new project and attach a grant in a single on-chain transaction. This creates 4 attestations: Project + ProjectDetails + Grant + GrantDetails.
Use this instead of separate create-project + create-grant when the user wants to set up a project with its funding in one step.
See Agent API Reference for auth, base URL, and error handling.
Prerequisite
If KARMA_API_KEY is not set in the environment, invoke the /setup-agent skill first, then continue with this skill.
Required Information
Project fields:
| Field | Required | Description |
|---|---|---|
chainId |
Yes | Which blockchain |
title |
Yes | Project name (1-200 chars) |
description |
Yes | Project description (1-5000 chars) |
imageURL |
No | Project logo/image URL |
links |
No | Array of { type, url } |
tags |
No | Array of tag strings (max 20) |
communityUID |
Yes | The community/program UID that funded the project |
Grant fields (nested under grant):
| Field | Required | Description |
|---|---|---|
grant.title |
Yes | Grant title (1-200 chars) |
grant.description |
No | Grant description (max 5000 chars) |
grant.amount |
No | Funding amount as string |
grant.proposalURL |
No | Link to proposal |
grant.programId |
No | Program identifier (see below) |
Finding the programId
If the user provides a program/track name but not a programId, look it up after finding the community UID:
# Accepts community slug (e.g., "optimism") or UID (0x...)
curl -s "${BASE_URL}/communities/${COMMUNITY_SLUG_OR_UID}/programs" | python3 -c "
import sys, json
data = json.load(sys.stdin)
programs = data if isinstance(data, list) else data.get('payload', data.get('data', []))
for p in programs:
print(f'Name: {p.get(\"metadata\", {}).get(\"title\", \"N/A\")} | ID: {p[\"programId\"]}')
"
Use the matching programId value in the grant params.
Finding the Community UID
curl -s "${BASE_URL}/v2/communities/?limit=10&page=1" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for c in data if isinstance(data, list) else data.get('payload', data.get('data', [])):
d = c.get('details', {})
name = d.get('name', 'N/A') if isinstance(d, dict) else 'N/A'
print(f'Name: {name} | Chain: {c.get(\"chainID\", \"?\")} | UID: {c[\"uid\"]}')
"
Natural Language Mapping
| User says | Action |
|---|---|
| "create a project with a grant from the Offchain Super Chain program" | Look up community UID + programId, ask for project/grant details |
| "create a project with a grant from Optimism" | Look up community UID, ask if it's a specific program or generic grant |
| "new project X funded by Y for $50K" | title: X, community: Y, amount: "50000" |
| "create project and grant together" | Ask for all details |
| "set up project X with Arbitrum grant" | Look up community, ask for remaining details |
Making the Request
BASE_URL="${KARMA_API_URL:-https://gapapi.karmahq.xyz}"
curl -s -X POST "${BASE_URL}/v2/agent/execute" \
-H "Content-Type: application/json" \
-H "x-api-key: ${KARMA_API_KEY}" \
-d '{
"action": "createProjectWithGrant",
"params": {
"chainId": 10,
"title": "DeFi Protocol",
"description": "A decentralized lending protocol",
"links": [{ "type": "github", "url": "https://github.com/defi-protocol" }],
"tags": ["defi", "lending"],
"communityUID": "0xcommunity...uid",
"grant": {
"title": "Optimism Builder Grant",
"description": "Funding for protocol development",
"amount": "50000",
"proposalURL": "https://gov.optimism.io/proposal/123"
}
}
}'
After Success
Display the result. Note this created 4 attestations in one tx:
Project + Grant created successfully!
Transaction: 0x...
Chain: Optimism (10)
Smart Account: 0x...
Attestations: Project, ProjectDetails, Grant, GrantDetails (4 in 1 tx)
The project and grant will be automatically indexed by the system.
Edge Cases
| Scenario | Response |
|---|---|
| Community name given instead of UID | Look up the UID via communities API |
| Community not found | "Could not find that community. Provide the UID directly." |
| User wants separate creation | Suggest using create-project then create-grant instead |
| Amount with currency symbol | Strip symbol and convert ("$50K" → "50000") |