The shared, tested core behind every coin-launch recipe on three.ws. A use
case is a declarative object — a live data source, a naming strategy
that turns one candidate into a coin identity, and a rewards rule that routes
that coin's creator fees. The engine fetches real candidates, applies the
strategy, resolves rewards, and returns a concrete launch plan that the
Launch Studio previews live and the existing
/launch wizard mints.
Nothing here is a mock: candidates come from the GitHub Search API
(github-trending.js) and the narrative engine
(launcher-trends.js); rewards resolve through
github-reward.js.
| File | Role |
|---|---|
usecase-engine.js |
Types, validateUseCase, identity helpers, resolveReward, planLaunch, summarizeUseCase. |
candidate-sources.js |
Adapters: turn live providers into uniform launch candidates. |
registry.js |
Merges every category module, validates each at load, enforces unique ids. |
usecases/*.js |
The catalog — one file per category (github, onchain, news, culture, events, community). |
attribution— the coin is for a real subject (a GitHub repo or creator) and its fees route to that subject via the pump.fun social-fee "reward coin" mechanism. Coin-agnostic: the subject is live data resolved at runtime.narrative— the coin rides a cultural/sector theme and the identity is invented. Held to the $THREE rule vialauncher-trendshygiene: themes only, brand-safe, no external ticker minted verbatim.
{
id: 'github-trending-repos', // kebab-case, unique, /^[a-z0-9][a-z0-9-]{2,48}$/
title: 'Trending GitHub repos → reward coins',
description: '...', // holder-readable
category: 'github', // github|onchain|news|culture|events|community
mode: 'attribution', // attribution | narrative
tags: ['github', 'rewards'],
reward_label: 'Creator fees → the repo owner',
source: { kind: 'github-repos', params: { window: 'new', sinceDays: 30, minStars: 100 } },
defaults: { devBuySol: 0, network: 'mainnet' },
naming: (candidate) => ({ name, symbol, description, image }),
rewards: (candidate) => ({ kind: 'github-owner', github_username, github_user_id }),
}source.kind |
Candidate | Key params |
|---|---|---|
github-repos |
one repo (attribution, owner) |
window new|active, sinceDays, minStars, language, limit |
github-creators |
one creator (attribution, creator) |
same as above |
narratives |
one theme (narrative) |
sources[] from coin_intel,trending,knowyourmeme,googletrends,hackernews,reddit,wikipedia,x, limit |
{ kind: 'creator' }— fees stay with the launching agent wallet.{ kind: 'github-owner', github_username, github_user_id? }— 100% to that GitHub account.{ kind: 'split', shareholders: [{ github_username|address, share_bps }] }— basis-point split (sum 10000).{ kind: 'address', address, share_bps? }— a fixed Solana address.
resolveReward(spec, { network, resolve }) resolves these. resolve:false (the
default, used by the public preview) returns intent only and never touches
the DB or reveals whether a GitHub user has a linked wallet; resolve:true (the
authed launch path) resolves to a concrete address.
- Add an entry to the relevant
usecases/<category>.jsarray (or a new category file imported inregistry.js). validateUseCaseruns at registry load — a malformed recipe fails the import, never a launch.- Verify:
node --input-type=module -e "import {USE_CASE_COUNT} from './api/_lib/launch/registry.js'; console.log(USE_CASE_COUNT)"
- API:
/api/pump/launch-studio—?action=list,?action=preview&id=. - UI: Launch Studio at
/launch-studio. - Docs:
docs/launch-usecases.md. - Tests:
tests/launch-usecases.test.js,tests/github-trending.test.js.