launchonzec.com
A launchpad for pump.fun tokens where the launch is paid for in Zcash. You send ZEC, from a shielded address if you want, to a one-time deposit address. A NEAR Intent converts it into exactly the SOL a launch needs and delivers that SOL to a Solana wallet that did not exist a minute earlier. That wallet mints your coin on pump.fun's bonding curve and becomes its creator. You never connect a Solana wallet, you never sign a Solana transaction, and nothing on Solana points back to you.
// What this is
pump.fun is the largest memecoin factory on Solana: one transaction creates a mint, a bonding curve and metadata, and the coin trades immediately. Every launch there is signed by the launcher's own Solana wallet, which is public forever and tied to every other thing that wallet has done.
launchonzec.com replaces that wallet with two things: a payment in ZEC, and a fresh Solana keypair that is created for your launch alone. The payment is made on Zcash. The mint is made on Solana. The only thing that joins them is an intent settled by solvers, and the intent is the product.
It is, as far as we know, the first launchpad that lets you pay for a Solana token launch with Zcash, and the first that lets a Zcash user create something on Solana without ever holding SOL.
// Why Zcash, why Solana
Zcash is the only widely held asset with a shielded pool: a transaction from a z-address reveals neither the sender nor the amount to the chain. A deposit that starts shielded has no origin anyone can read. Every other chain we could accept is pseudonymous at best; ZEC is the one that makes the "nothing points back" claim true from the very first hop.
Solana is where pump.fun lives, and pump.fun is where memecoins get their liquidity, their traders and their graduation to an AMM without anyone setting up a pool. Launching anywhere else would mean launching into nothing.
NEAR Intents is the bridge between the two that is not a bridge. Instead of wrapping ZEC, you state an outcome, exactly N SOL delivered to this address, and a network of solvers competes to make it happen. The ZEC you send is bought by whichever solver fills fastest; the SOL they deliver is theirs, not a wrapped representation of yours. See the NEAR Intents documentation.
// Architecture
Four parties touch a launch. None of them is your wallet.
| Party | Holds | Does |
|---|---|---|
| You | ZEC | fills the form, sends one deposit, keeps a claim secret or connects a wallet to own the launch |
| launchonzec.com | the keeper key, the launch rows | derives launch wallets, pins metadata, asks for quotes, submits the mint, exports keys on proof |
| NEAR Intents (1Click) | the intent | quotes, issues the one-time deposit address, matches solvers, reports status |
| Solvers | their own SOL and ZEC | take your ZEC on Zcash, deliver exact SOL on Solana |
| pump.fun | the bonding curve | mints the coin from create_v2, pays the creator 30 bps of every trade |
The data model is one row per launch: what the coin is, the quote (asset, amount, deposit address, deadline), the launch wallet, and what happened. Two columns never leave the server: the salt the wallet is derived from, and the hash of the claim secret. The public site reads a column list that excludes both, plus the deposit and refund details.
The engine is three functions. createLaunch pins metadata, derives the wallet and takes the quote. refreshLaunch reads the intent and the wallet balance and advances the status; it runs every time the session page polls and every time the keeper passes. executeLaunch takes a row lock, builds create_v2 with the optional buy, signs with the launch wallet and the mint keypair, and broadcasts. The lock means two workers can never mint the same launch twice.
// A launch, step by step
- 1.Fill the document: name, ticker, image, an optional dev buy typed in ZEC, optional description, twitter and website. The image is pinned to IPFS through Pinata as soon as you pick it.
- 2.Press launch. The server derives a fresh keypair from the keeper key and a random salt, pins the metadata JSON, and asks 1Click for an EXACT_OUTPUT quote: deliver exactly the SOL this launch needs, paid in ZEC. The quote returns a one-time Zcash deposit address, the exact ZEC amount, and a 45-minute window.
- 3.The session page shows the amount, the address and a QR. Send exactly that amount from any Zcash wallet or exchange. The page polls and shows elapsed time, time left in the window, the number of checks and a log.
- 4.Zcash confirms. 1Click marks the deposit seen; solvers compete and one delivers the SOL to the launch wallet on Solana, typically eight minutes after confirmation.
- 5.The server sees SOL in the wallet and executes the mint: one versioned transaction against pump's lookup tables containing create_v2 (mint, curve, metadata) and, if you set one, the buy at the opening price. The launch wallet is fee payer, signer and creator.
- 6.The coin is live on pump.fun and appears in the launches array. You are shown a claim secret once, or, if a wallet was connected, that wallet owns the launch.
If you close the tab, nothing stops. A keeper process runs the same refresh on every open launch and mints the moment a wallet is funded. The session link is the only key to the session; its id is unguessable.
// Zcash specifics
Shielded or transparent. 1Click's deposit address is a transparent t-address. Sending to it from a z-address (Sapling or Orchard) works and leaves no visible sender; sending from a t-address works and is pseudonymous like any other chain. Use a shielded address if privacy is the point.
Confirmations. Zcash blocks are 75 seconds; solvers wait for a handful before filling. Expect the fill roughly eight minutes after you send. Exchanges add their own withdrawal time.
No memo, no refund address. Nothing is required beyond the amount and the address. The form does not collect a refund address: by design, a deposit that does not match the quote is not recoverable, so send exactly the amount shown. The quote allows a small tolerance and slippage either side.
Amounts. A bare launch is about 0.02604 SOL worth of ZEC; a launch with a dev buy is that plus the buy plus pump's buy fee. Prices are live from the solver quote; the form's estimate uses spot and the binding number is on the session page.
// The launch wallet
Every launch gets a Solana keypair derived as sha256(domain ‖ keeper_secret ‖ salt) where the salt is 16 random bytes stored on the launch row. The private key is never written anywhere; it is recomputed whenever the server has to sign for that launch. The public key is the address you see on the session page, and it is the recipient of the funding intent.
The launch wallet plays every role a launcher's wallet would:
| Role | Held by |
|---|---|
| recipient of the funding intent | launch wallet |
| fee payer and signer of create_v2 | launch wallet |
| creator, earning 30 bps of every trade | launch wallet |
| holder of the dev buy | launch wallet |
| signer of fee collections and payouts | launch wallet, on presentation of the claim secret |
Because the creator is the launch wallet and not you, the dev buy stays there too. Moving it to a wallet of yours would recreate the link the intent removed. Export the key when you want it, or route it out through another intent.
// Ownership and keys
Two ways to prove a launch is yours. If a Solana wallet was connected when you launched, that wallet is recorded as the owner; signing a short message on the session or coin page exports the launch wallet's private key to you, shown once behind an eye toggle. If no wallet was connected, you are shown a claim secret once, an nl_… string whose hash is stored; presenting it does the same.
Import the key into Phantom or any Solana wallet and the dev buy and creator fees are yours to move directly. Exporting is the one point where you choose to link yourself to the launch; nothing on chain changes until you move funds out.
// Creator fees
pump.fun pays the creator 30 basis points of every buy and sell, on the curve and on the AMM after migration. The creator is the launch wallet, so the fees accumulate in a vault only it can claim. Either export the key and collect them yourself, or use the fees page: paste the claim secret, name any asset on any chain, and the fees are collected on Solana and routed out through another intent to that address. Zcash is one of the destinations, so ZEC in, ZEC out is possible end to end.
// Costs and minimums
| Item | SOL | Notes |
|---|---|---|
| mint, curve, metadata accounts | 0.022 | rent set by Solana |
| priority fee | 0.00004 | so the mint lands first try |
| reserve | 0.004 | left in the wallet for later fee collection |
| fixed total | 0.02604 | a launch with no dev buy |
| dev buy | your choice | typed in ZEC · up to 50 SOL |
| pump buy fee | 1.25% | of the dev buy |
| intent | ~1% | solver fee, 1% slippage, 0.1% to 1Click unless keyed |
The funding quote is exact-output on the total, so the launch wallet receives precisely what it needs. If marginally less lands, the dev buy shrinks to fit rather than failing the launch.
// Security model
Be precise about what is hidden, what is visible, and who is trusted.
| Visible on Solana | Visible nowhere |
|---|---|
| the coin, its mint transaction | who paid |
| the launch wallet, funded by a solver | the Zcash address that paid, if shielded |
| the creator: the launch wallet | a Solana wallet of yours: there is none in the flow |
| metadata naming this site and the paying chain | where fees go when routed out |
Trust in the operator. The keeper key derives every launch wallet. Until you export a key, the operator can sign for that wallet, which is what lets the mint and the fee payouts happen without you. Export the key and the operator can still derive it; move the funds and the question is moot. The operator sees the launch row, which does not identify you.
Trust in 1Click and solvers. They see the deposit and the delivery. A shielded deposit shows them a transparent address receiving ZEC and nothing about the sender. Solvers deliver from their own inventory; a fill that fails is refunded by 1Click to the quote's refund address, which on this site is a throwaway, so a failed fill is a loss. In practice fills succeed; the window is generous.
Trust in the session link. Whoever has the link can see the deposit address and, once live, export the key if they also hold the claim secret or the owner wallet. Do not share it.
// Statuses
| status | meaning |
|---|---|
| awaiting_deposit | quote open, nothing received |
| processing | 1Click saw the deposit; solvers are delivering |
| funded | SOL is in the launch wallet; mint not yet sent |
| launching | create_v2 in flight |
| live | the coin exists on pump.fun |
| failed | the mint failed; the SOL is still in the launch wallet and is retried |
| refunded | the intent refunded the deposit |
| expired | 45 minutes passed with no deposit |
// API
Everything the site does goes through these routes. All JSON.
| route | does |
|---|---|
| POST /api/upload | pins an image to IPFS; returns its URL |
| GET /api/intents/assets | the pay-with catalogue with live prices, SOL/USD and the cost model |
| POST /api/launch | opens a launch: pins metadata, derives the wallet, takes the quote; returns the session and the claim secret once |
| GET /api/launch/:id | the session poll: reads the intent and the wallet, advances the status, mints when funded |
| POST /api/launch/:id | tells 1Click about a deposit tx hash so it is picked up at once |
| POST /api/launch/:id/owner | whether a wallet owns the launch: yes or no only |
| POST /api/launch/:id/key | exports the launch wallet's key on a signed message from the owner or the claim secret |
| POST /api/fees | what a launch has earned, by claim secret |
| PUT /api/fees | routes the fees out: collect, quote, deposit into an intent |
| GET /api/coins | live coins with market data, plus the in-flight feed |
// Running it
A Next.js app and one keeper process. Copy .env.example, run supabase/schema.sql, generate a keeper key with pnpm keeper:init, run pnpm keeper next to the site. The keeper key is the root of custody: every launch wallet, every funded-but-unlaunched balance and every coin's creator fees derive from it. Back it up before the first launch and never reuse it across deployments. /admin lists every launch in every status with wallet balances and unclaimed fees, and can retry a failed mint, hide a coin, sweep a wallet or remove a row.
// FAQ
No. Not to launch, not to collect fees. Connecting one is optional and only makes owning the launch wallet easier.
No. The solver brings the SOL. You only ever hold ZEC.
Yes. Withdraw the exact quoted amount of ZEC to the one-time address. Exchanges are slower; the window allows for it.
By design there is no refund path on this site. Send exactly the amount shown.
The launch wallet holds it. Export the key to move it, or route it out with the claim secret.
Nothing changes. Fees keep accruing to the launch wallet.
Between deposit and mint, and for fees you have not exported, the keeper key can derive the launch wallet. Export the key and it is entirely yours.