ChainHack Docs.
What is ChainHack?
ChainHack is a Solana-native platform for hackathons, bounties, grants, and on-chain builder reputation. Every hackathon you join, every bounty you complete, every prize you win permanently anchored to your wallet address on Solana.
Unlike Web2 platforms that store results in private databases, ChainHack's core state lives in smart contracts on Solana mainnet. This means your record is portable, verifiable, and censorship-resistant by default.
How it works
The platform has three user roles:
- Builders discover and submit to hackathons, claim bounties, vote in grant rounds, and accumulate on-chain reputation.
- Organizers create and manage hackathons, bounty campaigns, or quadratic funding rounds. Prize pools are escrowed in smart contracts.
- Sponsors fund prize pools or matching pools and access verified, ranked builder talent.
When an organizer creates an opportunity, a smart contract is deployed on Solana. The prize pool is transferred into escrow. When voting closes, the contract distributes prizes automatically no manual intervention.
Core principles
| Principle | What it means |
|---|---|
| On-chain first | All state that matters (submissions, votes, prizes) lives on Solana. |
| Self-custody | You own your prize. It goes to your wallet, not a platform account. |
| Verifiable | Anyone can audit any outcome by reading the program state. |
| Sybil-resistant | Voting uses proof-of-personhood, not raw token balances. |
| Permissionless | Anyone can create an opportunity or submit no whitelists. |
Connect your wallet
ChainHack supports any Solana wallet that implements the Wallet Standard interface. Recommended wallets:
- Phantom most popular Solana wallet, available as browser extension and mobile app.
- Backpack xNFT-powered wallet with deep Solana ecosystem integrations.
- Solflare full-featured hardware wallet support including Ledger.
Click Connect Wallet in the top-right corner. If no extension is detected, a demo wallet is used automatically useful for exploring the UI without a real wallet.
Explore opportunities
The Explore page lists all active, upcoming, and recently ended opportunities. Use the filters to narrow by type and status:
| Type | Description |
|---|---|
| HACKATHON | Themed competitions with tracks, teams, and judging panels. |
| BOUNTY | Task-based rewards for specific deliverables (SDKs, bug fixes, etc). |
| GRANT | Quadratic-funded rounds where community contributions are matched. |
The search bar filters by title, description, tags, and sponsor name in real time. No page reload required.
Build your profile
Your builder profile is tied to your wallet address. It aggregates:
- REP score and level (calculated from wins, votes received, and prizes)
- Win count, submission count, total earnings
- Full activity history every hackathon, bounty, and vote
- Unlocked achievements (soulbound, on-chain)
Any dapp or DAO can read your REP score on-chain via the reputation program's public API. No off-platform verification needed.
Submit to a hackathon
Open any active hackathon from the Explore page and click Submit project. The submission modal walks you through:
- Select a track (if the hackathon has multiple)
- Project name and description
- GitHub repository URL
- Demo URL or video link
On confirmation, your submission is signed by your wallet, timestamped on Solana, and pinned to IPFS + Arweave for permanent storage. The transaction costs <$0.001 in SOL fees.
Judging timeline
After the submission deadline, the judging phase begins. Depending on the hackathon config, judging may use one or both of:
- Community voting quadratic voting open to verified wallet holders. One person, one effective vote.
- Expert judges sponsor-appointed judges score projects on a rubric. Scores are published on-chain.
Prize distribution happens automatically when the judging phase ends the escrow contract reads the final scores and transfers SOL/USDC directly to winner wallets.
Claim a bounty
Bounties are task-based rewards with a single winner (or a small set of winners for tiered bounties). To claim:
- Read the bounty requirements carefully deliverables are explicit.
- Build the deliverable (SDK, feature, fix, etc).
- Submit a link to your work (PR, repo, or package).
- The bounty organizer reviews and approves.
- On approval, the escrow releases the prize to your wallet instantly.
Join a grant round
Grant rounds use quadratic funding (QF). The mechanism works like this:
- A matching pool is seeded by the organizer (e.g. $80,000).
- Community members donate SOL/USDC to their favorite projects.
- The matching algorithm amplifies projects with many small donors over few large ones.
- At round close, each project receives donations + matched funds.
To participate as a builder, submit your project to the round before the deadline. To donate to a project, connect your wallet and contribute any amount even $1 counts.
Earning REP
REP is your on-chain reputation score. It increases through:
| Action | REP gain |
|---|---|
| Hackathon submission | +10 REP |
| Hackathon win (1st place) | +500 REP |
| Hackathon win (2nd place) | +300 REP |
| Hackathon win (3rd place) | +150 REP |
| Bounty completed | +75 REP |
| Grant round funding received | +25–200 REP (scaled to amount) |
| Community votes received | +1 REP per 5 votes |
REP is soulbound it cannot be transferred or sold. Levels unlock at 500, 1500, 3000, and 5000 REP. Higher levels will unlock priority access to certain hackathons and grant rounds in future releases.
Create a hackathon
Visit the Create page and follow the 4-step wizard:
- Step 1 Type. Choose Hackathon, Bounty, or Grant round.
- Step 2 Details. Set title, description, tracks, and requirements.
- Step 3 Prize. Set the prize amount, token (SOL / USDC / USDT), and duration.
- Step 4 Launch. Review and sign the deployment transaction. A smart contract is deployed and the prize pool is escrowed.
Setting up prize pools
Prize pools can be denominated in any SPL token. Common choices:
| Token | Mint address | Notes |
|---|---|---|
| SOL | Native | No approval needed. Recommended for small bounties. |
| USDC | EPjFW...7Fj | Most common for hackathon prizes. Requires token account. |
| USDT | Es9vM...E6P | Alternative stablecoin. |
For hackathons with multiple tracks, each track gets a fixed share of the total pool. You configure track allocations (e.g. 30% DeFi, 25% Gaming) in the organizer dashboard after launch.
Configuring judging
Two judging modes are available. You can combine both final score is a weighted average.
Community voting
Quadratic voting is enabled by default. Eligible voters are verified via one or more of:
- Civic Pass (proof of personhood)
- Gitcoin Passport score ≥ 20
- ChainHack REP ≥ 100 (organic on-chain history)
Expert judges
Add judge wallet addresses in the organizer dashboard. Judges receive a special role token that grants access to the judging interface. Scores are submitted on-chain and cannot be altered after the judging deadline.
Managing submissions
The organizer dashboard (available after connecting the wallet that deployed the contract) shows:
- All submissions with timestamps and track assignment
- Current vote counts per project
- Judge scores (after deadline)
- Prize distribution preview
- One-click escrow release
REP system
REP (reputation) is a soulbound on-chain score anchored to your wallet. It is computed by the reputation program from raw events (submissions, wins, votes received) stored in program accounts.
The score is public and readable by any Solana program or off-chain client via the getBuilderRep(wallet: PublicKey) instruction. DAOs and grant programs can use this to gate access or weight votes.
import { getBuilderRep } from "@chainhack/sdk";
const rep = await getBuilderRep(connection, walletPublicKey);
console.log(rep.score); // e.g. 2847
console.log(rep.level); // e.g. 4
console.log(rep.wins); // e.g. 14Smart contract escrow
Every prize pool is held in a program-derived address (PDA) controlled by the ChainHack escrow program. The organizer cannot unilaterally withdraw funds once submissions open only the program can release them based on voting outcomes.
The release flow:
- Voting closes at the deadline (enforced by the program, not the UI).
- The program computes scores from on-chain votes and judge submissions.
- Prize shares are calculated per the configured distribution.
- The program transfers tokens directly to winner wallet addresses.
- Any unclaimed remainder is returned to the organizer after 30 days.
Quadratic voting
In quadratic voting, the cost of casting n votes for a project is n² credits. This prevents whales from dominating outcomes a voter with 100 credits can cast 10 votes for one project, or spread 1 vote each across 100 projects.
Votes cast Credits used
1 1
2 4
3 9
4 16
5 25
10 100Each verified voter receives a fixed credit allocation per round (default: 25 credits). Unspent credits do not carry over between rounds.
Sybil resistance
ChainHack uses layered sybil resistance. Organizers choose one or more verification methods when creating an opportunity:
| Method | Strength | UX impact |
|---|---|---|
| Civic Pass | High biometric proof of personhood | One-time verification, ~2 min |
| Gitcoin Passport | Medium aggregated web2/web3 identity | Existing passport holders instant |
| ChainHack REP ≥ 100 | Medium organic on-chain history | No extra steps for experienced builders |
| MACI | Very high encrypted votes, no coordination | No UX change for voters |
IPFS & Arweave
Submission metadata (project name, description, repo URL, demo URL) is stored off-chain to keep gas costs low. ChainHack pins all metadata to both IPFS and Arweave:
- IPFS fast retrieval via content-addressed hashing. The CID is stored on-chain in the submission account.
- Arweave permanent storage with a one-time fee. Even if IPFS pins are dropped, Arweave retains the data forever.
The on-chain submission account stores the IPFS CID. Any client can reconstruct the full submission by fetching ipfs://<CID>.
Overview & auth
ChainHack exposes a read-only REST API at https://api.chainhack.xyz/v1. Write operations go directly to the Solana program the API does not proxy transactions.
| Header | Value |
|---|---|
| Content-Type | application/json |
| X-API-Key | Your API key (obtain from dashboard) |
Rate limit: 300 requests/minute per API key. Unauthenticated requests are limited to 30/minute.
curl https://api.chainhack.xyz/v1/opportunities \
-H "X-API-Key: ck_live_abc123"Opportunities
/v1/opportunities/v1/opportunities/:id/v1/opportunities/:id/submissions{
"id": "solana-summer-2026",
"type": "HACKATHON",
"title": "Solana Summer Buildathon 2026",
"status": "active",
"prize": { "amount": 250000, "token": "USDC" },
"participants": 1240,
"endsAt": "2026-05-29T23:59:00Z",
"sponsor": "Solana Foundation",
"tracks": ["DeFi", "Gaming", "AI × Blockchain", "DePIN", "Social"]
}Builders
/v1/builders/:wallet/v1/builders/:wallet/submissions/v1/builders/leaderboardSubmissions
/v1/submissions/:idSubmissions are created directly on-chain via the ChainHack SDK. The API reflects on-chain state with ~1s delay.
import { submitProject } from "@chainhack/sdk";
const tx = await submitProject(connection, wallet, {
opportunityId: "solana-summer-2026",
track: "DeFi",
projectName: "FluxSwap",
description: "Automated liquidity rebalancing...",
repoUrl: "https://github.com/you/fluxswap",
demoUrl: "https://fluxswap.xyz",
});
console.log("tx:", tx.signature);Webhooks
Configure webhooks in the organizer dashboard to receive real-time events:
| Event | Trigger |
|---|---|
| submission.created | New submission anchored on-chain |
| voting.opened | Voting phase started |
| voting.closed | Voting phase ended |
| prizes.distributed | Escrow released, winners paid |
| builder.leveled_up | A builder reached a new REP level |
{
"event": "prizes.distributed",
"opportunityId": "solana-summer-2026",
"timestamp": "2026-05-29T23:59:12Z",
"data": {
"winners": [
{ "wallet": "5kRm...8xFd", "prize": "50000 USDC", "rank": 1 },
{ "wallet": "9hPq...2nKt", "prize": "30000 USDC", "rank": 2 }
],
"txSignature": "4Bk9...mN3p"
}
}Program addresses
| Program | Address | Network |
|---|---|---|
| ChainHack Core | CHhk9mPqR3vX...7fTd | Mainnet |
| Escrow Program | ESCRwB4nK2...xL9p | Mainnet |
| Reputation Program | REPXuY7mN3...4hQs | Mainnet |
| ChainHack Core | CHhkDEVtmp...2rWn | Devnet |
Escrow program
The escrow program holds prize pools and enforces distribution logic. Key instructions:
| Instruction | Caller | Description |
|---|---|---|
| initialize_opportunity | Organizer | Deploy opportunity + escrow PDA, transfer prize. |
| submit_project | Builder | Anchor submission on-chain, emit submission event. |
| cast_vote | Verified voter | Record quadratic vote for a submission. |
| distribute_prizes | Anyone | Trigger prize distribution after voting closes. |
| refund_organizer | Organizer | Claim unclaimed balance after 30-day grace period. |
// Simplified escrow program state
#[account]
pub struct Opportunity {
pub organizer: Pubkey,
pub prize_amount: u64,
pub prize_token: Pubkey,
pub deadline: i64,
pub voting_end: i64,
pub status: OpportunityStatus,
pub submission_count: u32,
pub bump: u8,
}Reputation program
The reputation program maintains a BuilderAccount PDA for each wallet that has interacted with ChainHack. Accounts are created on first submission with zero cost to the builder.
#[account]
pub struct BuilderAccount {
pub wallet: Pubkey,
pub rep: u32,
pub wins: u32,
pub submissions: u32,
pub total_earned_lamports: u64,
pub level: u8,
pub bump: u8,
}REP is incremented by the escrow program via a CPI call when prizes are distributed, and by the voting program when votes are received. The reputation program itself does not hold any funds it is a pure state-tracking program.
getProgramAccounts(REPUTATION_PROGRAM_ID) with a memcmp filter on the wallet field.Last updated May 2026 · v1.4.2