Vanity mint
A mint that ends in `pump` (or another short pattern): instant from our warm pool, a bounded job for other patterns, or the SDK grinder on your own CPU.
pump.fun coins conventionally end in pump, letsbonk coins in bonk. The address is the mint keypair's public key, so a pattern means grinding keypairs until one matches (a 4-character suffix averages 11 million tries). Three tiers: warm pool — we keep a few …pump and …bonk keys ready, so the common request answers at once; job — other patterns up to 4 characters are ground on our workers (up to 10 minutes); local — the SDK grinder on your own CPU, no limits, the key never exists anywhere else (the recommended default for anything custom).
mint of your own create: anyone who sees the secret first could create a token at that address.wallets/ pattern on Wallet backups); a mint key that only lives in memory is a launch you cannot repeat.Start a job
| Field | Type | Description |
|---|---|---|
| suffix | string | Base58 characters the address must end with, e.g. pump. Case-sensitive by default. |
| prefix | string | Base58 characters it must start with. suffix + prefix together ≤ 4 characters on our workers; longer patterns → vanity_too_long, grind locally. |
| caseSensitive | boolean | Default true (pump.fun shows the exact case). false matches letters in either case and is ~30 % faster per character. |
curl -X POST "https://api.trenchytools.lol/api/sol/vanity?api-key=YOUR_API_KEY" \
-H "content-type: application/json" \
-d '{"suffix":"pump"}'
{
"jobId": "k3Jt…",
"status": "running",
"suffix": "pump",
"caseSensitive": true,
"expectedAttempts": 11316496,
"limits": { "maxChars": 4, "workersPerJob": 3, "timeoutS": 600, "maxJobs": 2, "pool": { "ready": { "pump": 5, "bonk": 3 } } },
"poll": "/api/sol/vanity/k3Jt…"
}
Poll a job
GET /api/sol/vanity/:jobId → status running (with attempts, elapsedMs), failed (with reason, e.g. the 10-minute limit), or done with publicKey and secretKey — once. pooled: true marks a key that came from the warm pool. A second read says collected: true. Results are kept 10 minutes. One running job per key; when the workers are busy you get 429 vanity_busy: retry in a minute or grind locally.
{
"jobId": "k3Jt…", "status": "done", "attempts": 9412377, "elapsedMs": 171204,
"publicKey": "7gH…pump",
"secretKey": "<base58, shown once>",
"warning": "Shown once; we keep nothing. Use it only as the mint of your own create, promptly."
}
Grind locally (recommended)
Same search on your own CPU, no limits, the key never leaves the process. The SDK ships it; any example repo has the worker.
import { grindVanity } from '@trenchytools/sdk/vanity'
const { keypair, attempts } = await grindVanity({ suffix: 'pump', workers: 8 }) // ~1–2 min on 8 cores
// keypair.publicKey.toBase58() ends in "pump"; pass it as `mint` and sign the create with it
What each launchpad expects
| Launchpad | Address pattern | Who makes it |
|---|---|---|
| pump.fun | …pump (convention, optional) | You: vanity mint keypair |
| letsbonk (LaunchLab) | …bonk (convention, optional) | You: vanity mint keypair |
| StonkFun (LaunchLab) | none | — |
| four.meme (BNB) | …4444 always | The launchpad (CREATE2 salt), nothing to do |
| Flap (BNB) | none known | — |
| pons (Robinhood) | derived from form + salt | Salt search; not exposed yet |
GET /api/chains carries the same address info per launchpad so an assistant knows when to grind and when not to.