Every feature of the launchpad, in detail, with contract calls you can copy. Search by feature, function name, error or keyword.
A launchpad where every fee stream pays the people who hold the coin.
DreamPad launches tokens on a bonding curve, graduates them into a locked Uniswap pool, and routes every fee the coin ever earns back to its holders and its creator. Curve fees, the graduation fee, post-launch trading taxes and the pool's own swap fees all go through one split on the token.
The rule that never changes: at least 90% of every stream goes to holders and the creator, at most 10% to the platform, and everyone can claim whenever they like, before or after graduation.
The app is a Next.js front end over the contracts. Nothing is custodial: your wallet signs every launch, trade and claim. The one exception is optional fast trading, which uses a key kept in your own browser.
Connect, accept the disclosure, pick a network, trade or launch.
Every field on the launch form, what it does, and what cannot be changed later.
A launch deploys three minimal-proxy clones in one transaction: the token (1,000,000,000 fixed supply), its bonding curve and its rewards distributor. The form previews every setting before your wallet opens.
| Field | What it does | Changeable later? |
|---|---|---|
| Launch type | Bonding curve: trading starts on the curve and the coin graduates to a locked Uniswap pool when it sells out. Instant Uniswap pool: the whole supply goes into a locked Uniswap pool against your initial liquidity in the launch transaction, so the coin trades on Uniswap, in every bot and on every terminal from its first block; you receive no tokens and buy afterwards like everyone else. Fees, taxes, max wallet and holder rewards work the same either way; the 3% graduation fee applies to the liquidity. | No |
| Name, ticker | ERC-20 name and symbol. The ticker is reserved for your wallet for 24 hours (see Ticker protection). | No |
| Logo | Upload a file or paste a URL. Files are resized to 128 px and, when 4 KB or smaller, stored on-chain in the metadata; larger images go to IPFS when an upload key is configured. | Yes (setMetadataURI) |
| Description, website, X, Telegram | Stored in the metadata. Bare domains are normalised to https links. | Yes (setMetadataURI) |
| Pair asset | What rewards are paid in and what the pool is seeded with. WETH, USDC, a stock, or any registered token. | No |
| Buyback and burn share | Part of the creator's share of every fee, spent buying the coin back and burning it up to a burn cap. Anyone can run it. | No |
| Buy / sell tax | Post-graduation tax on swaps against the pool, up to 10% each. App default 2% / 4%. Tax-free on Robinhood Chain. | No |
| Holder / creator split | How the non-platform 90% of every fee is divided. Default 80 / 20 of that 90%, i.e. 72% holders, 18% creator, 10% platform. | No |
| Max wallet | Cap per wallet as a share of supply, enforced on every curve buy and for a set time after graduation. The creator wallet is exempt. 0 disables it. | Can only be loosened or removed |
| Minimum hold for rewards | Smallest balance that earns holder rewards. Filters dust wallets. Capped at 0.1% of supply. | Yes (setMinHoldForRewards) |
| Initial buy / initial liquidity | Curve launches: an optional first buy executed inside the launch transaction, so nobody can front-run you. Instant pools: the liquidity the pool opens with, locked for good. Paid in ETH even for USDC or stock pairs. | n/a |
Launch fee: $2, paid in ETH at the current ETH price (a Chainlink feed on Ethereum, the DreamPad oracle on Robinhood Chain). Anything sent above the exact fee is refunded.
Your launch wallet earns the creator share only. It is excluded from holder rewards, so a creator cannot double-dip by holding their own coin in the same wallet.
struct LaunchParams {
string name;
string symbol;
string metadataURI; // logo, description, socials (data: URI or ipfs://)
address quoteAsset; // WETH, USDC, a stock: must be enabled on the factory
uint16 buyTaxBps; // <= feeConfig.maxTaxBps (1000 = 10%); 0 on V3 chains
uint16 sellTaxBps;
uint16 holderShareBps; // holder + creator must sum to 10_000
uint16 creatorShareBps;
uint16 maxWalletBps; // 0 = disabled
uint32 maxWalletDuration;
uint256 minHoldForRewards;
uint256 initialBuyQuote; // optional first buy, in quote units
}
// factory.launch{value: launchFee + initialBuy (WETH pairs only)}(params)
// zap.launchWithETH{value: launchFee + ethForFirstBuy}(params, minQuoteOut)import { createWalletClient, http, parseEther } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { dreamPadFactoryAbi } from "./abi";
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const wallet = createWalletClient({ account, chain, transport: http(RPC) });
const fee = await publicClient.readContract({ address: FACTORY, abi: dreamPadFactoryAbi, functionName: "launchFee" });
const hash = await wallet.writeContract({
address: FACTORY,
abi: dreamPadFactoryAbi,
functionName: "launch",
args: [{
name: "Dream Cat", symbol: "DCAT", metadataURI: "data:application/json;base64,…",
quoteAsset: WETH, buyTaxBps: 200, sellTaxBps: 400,
holderShareBps: 8000, creatorShareBps: 2000,
maxWalletBps: 0, maxWalletDuration: 0, minHoldForRewards: 0n,
initialBuyQuote: parseEther("0.5"),
}],
value: fee + parseEther("0.5"),
});Launching a symbol reserves it for your wallet for 24 hours.
Launching $ABC reserves the ticker for the launching wallet for 24 hours. Nobody else can launch the same symbol in that window, so a bundler cannot clone your ticker next to yours, while you can relaunch it yourself to fix a misconfigured first attempt. Every launch by the holder refreshes the window.
Matching ignores case and a leading $: abc, ABC and $ABC are one ticker. The display symbol stays exactly as typed. A reservation can be handed to another wallet with transferTicker.
cast call $FACTORY "tickerStatus(string)(address,uint256)" "ABC" --rpc-url $RPC cast call $FACTORY "canLaunchTicker(string,address)(bool)" "ABC" $MY_WALLET --rpc-url $RPC
800M tokens sold on an x·y=k curve with virtual reserves, sized to raise about $30,000.
Of the 1B supply, 800,000,000 tokens are sold on the curve and 200,000,000 are reserved for the pool. The curve is constant-product (x · y = k) with a virtual token reserve of 1.06B and a virtual quote reserve set per pair asset. With those constants a curve always raises about 3.08× its virtual quote reserve before it sells out.
The virtual reserve is sized so that every coin raises roughly the same $30,000 whatever it is paired with: 8 WETH, about 30,769 USDC, or the equivalent in a stock at its live price. refreshQuoteAsset re-sizes a pair asset after a big price move (once an hour, 25% per step) and is also the call that confirms a newly registered asset.
quoteToTokens, tokensToQuoteOut and the zap's previewBuyCurve / previewSellCurve return what the trade would fill right now.# buy with 100 USDC (approve the curve once first) cast send $USDC "approve(address,uint256)" $CURVE $(cast max-uint) --private-key $PK --rpc-url $RPC cast send $CURVE "buy(uint256,uint256,address)" 100000000 0 $ME --private-key $PK --rpc-url $RPC # WETH-paired coins accept native ETH cast send $CURVE "buyWithETH(uint256,address)" 0 $ME --value 0.1ether --private-key $PK --rpc-url $RPC # sell 1M tokens; unwrap=true pays ETH on WETH pairs cast send $CURVE "sell(uint256,uint256,address,bool)" 1000000ether 0 $ME true --private-key $PK --rpc-url $RPC
When the curve sells out, liquidity is created at the closing price and locked forever.
When the last curve token sells, in the same transaction:
LiquidityVault, which can never withdraw them.LiquidityVaultV3, which can only ever collect fees.Graduation is automatic on the buy that sells out the curve. If it ever needs a nudge, graduate() on the curve is permissionless.
Buy and sell with ETH whatever the coin is paired with. The pair asset only shows up as rewards.
DreamZap is the ETH router. On a buy it swaps your ETH into the pair asset on Uniswap (V2 pair, then the best V3 pool, then a V4 pool) and buys on the curve or the pool for you in one transaction. On a sell it does the reverse and pays you ETH. A buyer of a TSLAx-paired coin never holds TSLAx.
sellFor), and the app approves the maximum once.# buy on the curve with 0.1 ETH (minTokensOut from previewBuyCurve minus slippage) cast call $ZAP "previewBuyCurve(address,uint256)(uint256,uint256)" $TOKEN 100000000000000000 --rpc-url $RPC cast send $ZAP "buyCurve(address,uint256)" $TOKEN $MIN_OUT --value 0.1ether --private-key $PK --rpc-url $RPC # sell 1M tokens for ETH (approve the curve once first) cast send $ZAP "sellCurve(address,uint256,uint256)" $TOKEN 1000000ether $MIN_ETH --private-key $PK --rpc-url $RPC # after graduation: buyPool / sellPool (approve the zap for sells)
interface IDreamZap {
function buyCurve(address token, uint256 minTokensOut) external payable returns (uint256);
function buyPool(address token, uint256 minTokensOut) external payable returns (uint256);
function previewBuyCurve(address token, uint256 ethIn) external view returns (uint256 tokensOut, uint256 quoteIn);
}
contract Buyer {
IDreamZap constant ZAP = IDreamZap(0x...);
function buy(address token) external payable {
(uint256 expected,) = ZAP.previewBuyCurve(token, msg.value);
ZAP.buyCurve{value: msg.value}(token, expected * 97 / 100); // 3% slippage
// tokens are credited to msg.sender of the zap call: this contract
}
}Every coin card has a Buy button that spends a preset amount of ETH instantly.
The Buy button on every explore card buys with the ETH amount and slippage configured in the Fast panel in the header (default 0.05 ETH at 3%). There is no amount prompt: the app quotes at click time, applies your slippage, and sends. The button shows the amount, then Bought or Failed; hover a failure for the reason.
In wallet mode you still confirm in your wallet. With fast trading on, the buy signs instantly.
Trade without wallet pop-ups using a key that lives only in your browser.
A browser extension cannot be told to approve transactions automatically, so fast trading creates a separate trading wallet whose private key is stored in this browser. While the switch is on, buys, sells and approvals sign with it instantly. Launching, claiming rewards and admin actions always use your main wallet.
What the cards, stats, chart and tables show.
Holders earn the pair asset from every fee stream, before and after graduation, and claim any time.
Every revenue stream is deposited into the token and split by one formula. The holder share goes to the RewardsDistributor, which credits it pro rata to balances at that moment. Rewards accrue in the pair asset: ETH for WETH launches, USDC for stable launches, the stock itself for stock pairs.
| Stream | When | Rate |
|---|---|---|
| Curve trade fee | every curve buy and sell | 2% of the quote side |
| Graduation fee | once, when the curve sells out | 3% of the raise |
| Trading tax | every pool buy / sell (Ethereum) | creator-set, up to 10% each; app default 2% buy / 4% sell |
| Pool fee | every pool swap, taxed or not | 0.3% (Uniswap V2) or 1% (Uniswap V3), collected on harvest |
claimFor(account) lets anyone push rewards to a holder; processBatch lets keepers sweep.0xdead. The creator can exclude more (a CEX wallet, a vesting contract) and set a minimum balance to qualify.cast call $DISTRIBUTOR "withdrawableOf(address)(uint256)" $ME --rpc-url $RPC cast send $DISTRIBUTOR "claim()" --private-key $PK --rpc-url $RPC cast send $DISTRIBUTOR "claimAsETH()" --private-key $PK --rpc-url $RPC # WETH pairs
The creator's share accrues on the token as one claimable balance. Some controls are one-way by design.
The creator's share of every curve fee, the graduation fee, every tax swap-back and every LP harvest accrues as creatorRewardsClaimable on the token, in the pair asset. Nothing is pushed; claim whenever you like with Claim or Claim as ETH in the Creator panel.
| Control | Effect |
|---|---|
claimCreatorRewards / claimCreatorRewardsAsETH | Pay out the accrued creator share. |
forceSwapBack | Sell the taxes sitting in the token now instead of waiting for the next threshold-crossing sell. It is a market sell, so it nudges the price; the caller pays gas and receives only the normal share. The creator may call it any time; anyone may call it once the pot reached the swap threshold. Each sale is capped at 0.2% of the pool's token reserve as it was when the window started, and sells at no less than the window's average price. |
setSwapSettings | Threshold (0.001% to 1% of supply), max per swap (up to 2%), on / off. |
setMaxWallet | Loosen or remove the max-wallet limit. It can never be tightened. |
setMinHoldForRewards, setExcludedFromRewards | Who qualifies for holder rewards. Only contracts (a vesting contract, a CEX custody contract) can be excluded, never wallets, and the creator wallet, past or present, can never be included. |
setAmmPair | Register another pool of the coin so swaps against it are taxed. Only a real pool of this coin is accepted. |
setMetadataURI | Update logo, description and links. |
transferCreator | Hand the creator role (and future rewards) to another wallet or a multisig. |
Fixed for the life of the coin: buy / sell tax, the holder / creator split, the platform share, the pair asset. There is no setter for any of them, so the Creator panel has no tax controls because there is nothing to change.
How taxes are collected in the coin and turned into rewards.
On Ethereum, swaps against the registered pool pay the buy or sell tax in the coin itself, which the token contract holds. Wallet-to-wallet transfers are free. On the next sell that finds at least swapThreshold (0.05% of supply) waiting, the token sells up to maxSwapAmount (0.5% of supply, and never more than 0.2% of the pool's token reserve as it was when the window started) into the pool for the pair asset and runs the split. The seller whose transaction triggers it pays the extra gas; if that swap fails, the sell still goes through and the retry happens on a later sell.
A swap-back runs at most once every ten minutes and never sells below the pool's time-weighted average price over that window (a 0.3% tolerance, with the pool fee and the sale's own impact already priced in). Anyone may trigger it once the pot is above the threshold, so a floor taken from the spot price would be no floor at all: a caller who dumps first and triggers the swap-back only gets it deferred (SwapBackDeferred), and the pot waits for the next window.
On Robinhood Chain tokens are tax-free: Uniswap V3 pools reject fee-on-transfer tokens, so rewards there come from the 1% pool fee via harvests instead.
The explore cards flag a buy or sell tax above 5% as *high tax* and a creator share above 25% as *high creator fee*.
A launch can set aside part of every fee to buy the coin back and burn it, permissionlessly.
At launch the creator can route a buyback and burn share of every fee stream (curve trades, the graduation fee, taxes and harvested pool fees) to the BuybackVault. The share comes out of the creator's part of the split, so holders are never diluted by it: the launch form shows holders / creator / buyback / platform side by side.
The vault holds that share in the pair asset until someone runs a buyback. Anyone can run it; the caller pays gas and receives nothing. A run buys the coin on its bonding curve before graduation and on its Uniswap pool after, then sends what it bought to the dead address until the coin's burn cap is reached. The cap is chosen at launch as the share of the supply the buybacks may burn: everything, nothing (a pure buyback into the vault), or for example half. Coins bought past the cap stay in the vault, where only the creator can withdraw them, and only after graduation.
Deferred) and the pair asset waits. The first pool run after graduation only records the price window.The coin page shows what is waiting to be spent, what was burned, what is held, and a Run buyback button that greys out until the next window. The protocol's own $DREAM uses this with a 50% burn cap: it burns until half the supply is gone, then keeps buying into the vault.
cast call $VAULT "positions(address)(uint16,uint256,uint256,uint256,uint256,uint256,uint32,uint32)" $TOKEN --rpc-url $RPC cast send $VAULT "run(address)" $TOKEN --private-key $PK --rpc-url $RPC
The locked liquidity earns swap fees; anyone can harvest them into the same split.
Liquidity is locked forever, but the fees it earns are not. LiquidityVault.harvest(token) (Ethereum) burns only the LP that represents fee growth since the last harvest, measured as growth of sqrt(k) per LP share so price moves never count, sells the token half into the pool and deposits the whole harvest as the pair asset. LiquidityVaultV3.harvest(token) (Robinhood Chain) collects the position's accrued fees without touching liquidity.
TokenSaleDeferred) and only the pair-asset half is paid out. A front-run therefore either fits inside the tolerance and loses two pool fees, or defers the sale; a harvest cannot be sandwiched for profit.cast call $VAULT "pendingFees(address)(uint256,uint256)" $TOKEN --rpc-url $RPC cast send $VAULT "harvest(address)" $TOKEN --private-key $PK --rpc-url $RPC
Every fee, its default, its hard cap and where it goes.
| Stream | Default | Hard cap | Split |
|---|---|---|---|
| Curve trade fee | 2% of quote | 5% | 90% holders + creator · 10% platform |
| Graduation fee | 3% of raise | 10% | 90% holders + creator · 10% platform |
| Trading tax (Ethereum) | creator sets, app default 2% / 4% | 10% per side (owner may raise the cap to 25%) | 90% holders + creator · 10% platform |
| Uniswap pool fee | 0.3% V2 · 1% V3 | — | same split, on harvest |
| Launch fee | $2 in ETH | — | platform |
The platform share is capped at 10% on-chain (MAX_PLATFORM_SHARE_BPS). Fee settings are snapshotted into each curve and token at launch, so a later change to the factory never touches a live coin.
WETH, USDC, tokenized stocks, or any token with a Uniswap pool.
The pair asset is what rewards are paid in and what the pool is seeded with, nothing else: trading is always in ETH. The launch form shows WETH and the stablecoin as tiles and puts every stock and other registered token in one searchable dropdown.
TSLAon, AAPLon, …) and Backed xStocks (TSLAx, SPYx, …), several hundred in total, from the issuers' official token lists.TSLA, AAPL, …) from Robinhood's asset API.Picking a stock that is not registered yet shows a one-click Register. Registration asks the price oracle for a USD price and sizes the raise to about $30,000 worth of that asset. A token with no pool fails with NotPriceable. The asset is then pending: it opens for launches once refreshQuoteAsset, at least an hour later, sizes it again within 25% of the first sizing (QuoteAssetActivated). A sizing further away replaces the first and the hour restarts. Anyone can run the confirming call; the launch form lists pending assets with a Confirm price button. For an asset priced from a V2 pair the confirming call sizes it from the pair's average price over that hour, and the instant's price must agree with the average, so a pushed price really does have to hold for the whole hour against arbitrage. Active assets are re-sized from the same average.
Prices come from a 10-minute time-weighted average where the pool keeps history (V3), from the hour-long average of a V2 pair for community assets, and from spot for V4 pools (which keep no history; the owner can switch such an asset off). Re-sizing an active asset later is limited to once an hour and 25% per step, so a launch in flight cannot be sandwiched into a wrong raise target. Assets the owner switched off cannot be re-registered.
Community registrations go through the pair-asset guard (PairAssetGuard): the token must take no fee on transfer (a probe amount of 0.001 is moved from the registrant to the guard and straight back, and both balance changes must be exact), must not answer the standard paused() getter, and must not expose a blocklist getter (isBlacklisted, isBlackListed, blacklisted, isBlocked, blocked, isFrozen, frozen, isBanned). Any of these would let a third party freeze every coin paired with the token. The registrant therefore needs a little of the token and an approval to the guard; the launch form asks for both. The stablecoin and the issuers' stock tokens are regulated and do have pause and blocklist controls: DreamPad lists those itself, and owner listings do not go through the guard. A launch on any pair asset that is paused at that moment is refused.
The guard finds controls through their standard names, so a token that hides a pause behind another name still passes. The launch form keeps flagging community-registered assets for that reason: read the contract before pairing with one. Tokens with transfer allow-lists must allow the curve, pool, token, tax vault and distributor.
cast send $FACTORY "registerQuoteAsset(address)" $STOCK --private-key $PK --rpc-url $RPC cast call $FACTORY "activatableAt(address)(uint256)" $STOCK --rpc-url $RPC # unix time of the earliest confirmation # an hour or more later, from any wallet: cast send $FACTORY "refreshQuoteAsset(address)" $STOCK --private-key $PK --rpc-url $RPC cast call $FACTORY "quoteAsset(address)" $STOCK --rpc-url $RPC
Ethereum uses Uniswap V2; Robinhood Chain uses V3 and V4 only.
Each network has its own factory, implementations, zap and liquidity vault. Coin URLs carry the network: /token/eth/0x… and /token/robinhood/0x…. Robinhood Chain is an Arbitrum-style L2 (chain id 4663, testnet 46630) with sub-second blocks; DreamPad never deploys Uniswap V2 there.
| Network | Chain id | DEX | Factory | Explorer |
|---|---|---|---|---|
| Ethereumcurrent | 1 | Uniswap V2 | etherscan.io | |
| Robinhood Chain | 4663 | Uniswap V3 (+ V4 pairs) | explorer.mainnet.chain.robinhood.com |
Uniswap V4 pools are read through the StateView lens. The oracle probes owner-set pool-key templates (the Pons dynamic-fee shape and the hookless tiers); for any other pool, registerV4Pool(key) is permissionless and the launch form has a small panel for it.
Holdings, portfolio total, coins created, fees claimed and trading history for any wallet.
/profile/<address> works for any wallet; Profile in the header opens yours (the fast-trading wallet while fast mode is on, with a link to the main one).
Launches, graduations, every fee stream and where it went, buybacks, holders, market activity and site traffic.
/analytics shows how the launchpad is doing on the network you are browsing, straight from the contracts' own counters, so every figure is exact and live.
A pair asset without a USD price is shown in its own units only and the page says so.
The treasury wallet's page: platform stats and the platform-fee claim.
The platform's 10% accrues on each token as protocolRewardsClaimable. Only the treasury wallet set on the factory can open /admin and claim it, per token or in one batch with DreamPadFactory.claimProtocolRewards(tokens). Launch fees go straight to the treasury.
The page shows revenue per pair asset (claimable, claimed, paid to holders, paid to creators), launch fees collected, and per-coin rows.
Pause launches is the emergency switch. Only the treasury wallet can flip it (not the owner key). While paused nobody can launch; existing coins keep trading, graduating and paying rewards. The same wallet, or the owner, can release a squatted ticker early.
The contracts, what each one owns, and the calls integrators use.
| Contract | Role | Calls you will use |
|---|---|---|
DreamPadFactory | Deploys launches, holds fee config, the quote-asset registry, ticker reservations and the treasury. | launch, launchFee, getLaunch, launchCount, launchesOf, registerQuoteAsset, quoteAsset, tickerStatus, canLaunchTicker, claimProtocolRewards |
PairAssetGuard | Refuses community pair assets that take a transfer fee, can be paused or keep a blocklist; refuses launches on a paused asset. | checkRegistration, checkLive, probeAmount, isPausable, isPaused, hasBlocklist |
BondingCurve | One per coin. Sells 800M tokens, collects the 2% fee, graduates. | buy, buyWithETH, sell, spotPrice, progressBps, remainingTokens, quoteToTokens, tokensToQuoteOut, graduate |
DreamToken | The ERC-20. Taxes, the revenue split, creator balance, platform balance. | creatorRewardsClaimable, claimCreatorRewards, forceSwapBack, taxSplit, pendingTaxTokens, graduated |
RewardsDistributor | One per coin. Holder rewards. | withdrawableOf, claim, claimAsETH, claimFor, holderCount, holderAt |
DreamZap | ETH in, ETH out for every pair asset; ETH first buys at launch. | buyCurve, sellCurve, buyPool, sellPool, launchWithETH, preview*, bestPool |
LiquidityVault / LiquidityVaultV3 | Holds the locked liquidity, harvests its fees. | harvest, pendingFees, harvestedOf |
UniswapV3Oracle | USD prices for pair assets and the launch fee from V3, V2 and V4 pools. | priceUsd, v4PoolFor, registerV4Pool |
Terminals and bots: the HTTP API. No ABI needed. GET /api/v1/{chain}/quote?token=…&side=buy|sell&amount=…&slippageBps=100&trader=… returns the trade at the current state and the exact transaction to send (tx.to, tx.data, tx.value), plus the approval a sell needs first, in both the curve and the pool phase. /api/v1/{chain}/tokens lists launches newest first and /api/v1/{chain}/token/{address} gives phase, price, curve progress, taxes and max wallet. /api/v1/{chain} lists the contracts. {chain} is eth or robinhood. Amounts are base units (wei) as strings. A DEX Screener adapter for the curve phase lives at /api/dexscreener/{chain}/…. The full guide is docs/INTEGRATIONS.md in the repository.
ABIs are exported to web/src/abi by tools/export-abis.mjs. Every launch is discoverable on-chain: launchCount() then launches(i) and getLaunch(token) return the token, curve, distributor, pair asset, creator, pool and timestamps.
const n = await client.readContract({ address: FACTORY, abi: dreamPadFactoryAbi, functionName: "launchCount" });
for (let i = 0n; i < n; i++) {
const token = await client.readContract({ address: FACTORY, abi: dreamPadFactoryAbi, functionName: "launches", args: [i] });
const l = await client.readContract({ address: FACTORY, abi: dreamPadFactoryAbi, functionName: "getLaunch", args: [token] });
console.log(l.token, l.curve, l.distributor, l.quoteAsset, l.creator, l.pair, l.createdAt, l.graduatedAt);
}What to index for trades, claims, launches and graduations.
| Event | Emitted by | Meaning |
|---|---|---|
TokenLaunched(token, curve, distributor, quoteAsset, creator, …) | factory | A new coin. |
TokenGraduated(token, pair) | factory | The curve sold out and the pool is live. |
Buy(buyer, recipient, quoteIn, fee, tokensOut) / Sell(seller, recipient, tokensIn, fee, quoteOut) | curve | Curve trades. Through the zap, buyer is the zap and recipient the user. |
ZapBuy(token, buyer, ethIn, tokensOut, onCurve) / ZapSell(token, seller, tokensIn, ethOut, onCurve) | zap | ETH-denominated trades, on the curve or the pool. |
Swap(...) | Uniswap pair / pool | Post-graduation trades placed directly on Uniswap. |
RewardsSplit(source, toHolders, toCreator, toProtocol) | token | One revenue deposit split three ways. source is curve fee, graduation, tax or LP harvest. |
RewardClaimed(account, amount, asETH) | distributor | A holder claim. |
CreatorRewardsClaimed(creator, amount, asETH) / ProtocolRewardsClaimed(treasury, amount) | token | Creator and platform claims. |
Harvested(token, …) | vault | LP fees harvested and deposited. |
TickerClaimed(ticker, symbol, owner, reservedUntil) | factory | A 24-hour ticker reservation. |
Custom errors the contracts revert with, translated the way the app shows them.
| Error | What the app says |
|---|---|
| TooSoon | A buyback already ran in the last ten minutes. Try again when the window has passed. |
| NothingPending | Nothing is waiting to be spent on a buyback yet. |
| BuybackUnavailable | Buyback and burn is not available on this network yet. |
| InvalidCap | The burn cap must be between 0% and 100% of the supply. |
| NotAPool | Only a real Uniswap pool of this coin can be registered as a trading pair. |
| NotAContract | Only contracts (a vesting or exchange custody contract) can be excluded from rewards, never wallets. |
| InvalidMinHold | The minimum hold for rewards cannot exceed 0.1% of supply. |
| InvalidMaxWallet | That max wallet is smaller than what the minimum buy purchases at the opening price, so nobody could buy. Raise it or turn it off. |
| RefreshTooSoon | This pair asset was re-sized less than an hour ago. Try again later. |
| UntrustedHook | Only hookless Uniswap V4 pools, or pools with a hook DreamPad already trusts, can be registered. |
| InsufficientFee | The ETH sent does not cover the launch fee. |
| FeeOnTransferAsset | This token takes a fee on transfer, so it cannot be a pair asset: the curve's accounting would break on every buy. |
| PausableAsset | This token can be paused, so it cannot be a community pair asset: a pause would freeze every coin paired with it. |
| BlocklistAsset | This token keeps a blocklist, so it cannot be a community pair asset: a blocked wallet would strand rewards and trading. |
| AssetPaused | This pair asset is paused right now, so no coin can be launched on it. |
| ProbeNotFunded | Registering needs a tiny balance of the token (0.001) and an approval for it: the amount is moved out and straight back to prove the token takes no fee. |
| NotPriceable | No price found for this token on Ethereum. A pair asset needs a Uniswap pool (V3, V2 or V4) against ETH, USDC or USDG on this same network. A mainnet coin cannot be used on a testnet. |
| QuoteAssetNotEnabled | That pair asset is not enabled on this network. |
| TickerTaken | That ticker is reserved by another wallet for now. Pick another, or wait for the 24h window to lapse. |
| WrongLaunchFee | The ETH launch fee moved between quote and send. Try again. |
| Slippage | The price moved past your slippage setting. Raise slippage a little or try a smaller size. |
| BelowMinBuy | That is below the minimum buy for this coin. |
| TaxNotSupported | Taxes are not available on this network (Uniswap V3 pools). Launch tax-free. |
| InvalidTax | Taxes are above the allowed maximum. |
| InvalidSplit | The holder / creator split must add up to 100%. |
| Paused | Launches are paused right now. |
| OnlyTreasury | Only the platform treasury wallet can do this. |
| OnlyCreator | Only the coin's creator wallet can do this. |
| OnlyZap | This call is reserved for the app's router contract. |
| NotTickerOwner | You do not own that ticker reservation. |
| NothingToHarvest | No pool fees to harvest yet. |
| NotRegistered | This coin has no locked liquidity position registered. |
| EmptyPool | That Uniswap V4 pool does not exist or has no liquidity. Check the fee, tick spacing and hook. |
| NoStateView | Uniswap V4 is not configured on this network. |
| NoPool | No ETH route for this pair asset on this network yet. |
| AlreadyGraduated | This coin has already graduated to Uniswap; trade it through the pool. |
| TransfersLockedUntilGraduation | Tokens can only move through the curve until the coin graduates. |
| MaxWalletExceeded | That buy would exceed the max wallet limit that is still active. |
| UnknownToken | That address is not a DreamPad coin on this network. |
| NotGraduated | This coin is still on its curve; trade it there. |
| NoEthBacking | The WETH contract on Ethereum does not hold enough ETH to pay this out. Testnet WETH is minted without ETH behind it: sell a smaller amount, receive the pair asset instead, or send testnet ETH to the WETH contract (it wraps on receipt) and retry. |
Read before you trade or launch.
/audit. An independent review is still ahead. Trade amounts you can afford to lose.The full risk disclosure is linked in the footer and must be accepted once per wallet before using the app.