Features
The bonding curve
Free to launch
Dreams is built on a dynamic bonding curve. Creating a coin is free — no LP funding is required from the deployer. Every coin starts trading the instant it's deployed, with price discovered along the curve as buys and sells come in.
With this mechanism, creators can buy as much of their own supply as they want at launch via an optional dev buy, which also helps protect against snipers grabbing the early float.
Because there is no separate “bootstrap” step, you can read a coin's live liquidity the instant it exists — straight off its on-chain curve state:
import { getDbcClient } from "@/lib/meteora"
import { PublicKey } from "@solana/web3.js"
const client = getDbcClient()
// Every coin trades from block one — read its live curve by mint.
const pool = await client.state.getPoolByBaseMint(new PublicKey(mint))
const { quoteReserve, baseReserve, isMigrated } = pool.account
console.log("SOL in pool: ", Number(quoteReserve) / 1e9) // 9 decimals
console.log("tokens on curve:", Number(baseReserve) / 1e6) // 6 decimals
console.log("graduated? ", Boolean(isMigrated))Graduation
Once a coin accumulates enough liquidity along the curve, it graduates: liquidity migrates into a DAMM v2 pool and the coin trades as a standard AMM pair from then on. Trading never stops — the handoff happens on-chain in the background.
A coin graduates once the SOL raised on its curve reaches the launch config's migration threshold. You can derive a live progress bar from the same two values:
import { getDbcClient, fetchConfigDetails } from "@/lib/meteora"
import { PublicKey } from "@solana/web3.js"
const client = getDbcClient()
const pool = await client.state.getPoolByBaseMint(new PublicKey(mint))
if (pool.account.isMigrated) {
console.log("Graduated — now a DAMM v2 pair.")
} else {
const config = await fetchConfigDetails() // launch config defaults
const raised = Number(pool.account.quoteReserve) / 1e9 // SOL so far
const target = config!.migrationQuoteThresholdSol // SOL to graduate
const progress = Math.min(1, raised / target)
console.log(`${raised.toFixed(1)} / ${target.toFixed(1)} SOL`)
console.log(`${(progress * 100).toFixed(1)}% to graduation`)
}The flywheel spans both phases
LP breakdown
As more SOL flows into a coin's pool, its market cap scales while the proportion of supply left in the pool falls. A simplified view of how that scales:
| Pool SOL | Pool value | Supply in pool | Approx. market cap |
|---|---|---|---|
| 35 | $5,250 | 100% | $5,250 |
| 115 | $17,250 | 30.4% | $56,700 |
| 300 | $45,000 | 11.7% | $385,000 |
| 600 | $90,000 | 5.8% | $1.55M |
| 1,000 | $150,000 | 3.5% | $4.28M |
| 2,000 | $300,000 | 1.8% | $16.6M |
That progression is just arithmetic on the two reserves. As SOL flows in, the spot price — and market cap — climb while the share of supply still sitting in the pool falls toward zero:
import { HUMAN_TOKEN_SUPPLY, BASE_DECIMALS, QUOTE_DECIMALS } from "@/lib/meteora"
// Progressive liquidity: derive market cap + remaining float from reserves.
export function curveSnapshot(
quoteReserve: bigint, // lamports of SOL in the pool
baseReserve: bigint, // raw token units still on the curve
solPriceUsd: number,
) {
const solInPool = Number(quoteReserve) / 10 ** QUOTE_DECIMALS
const tokensInPool = Number(baseReserve) / 10 ** BASE_DECIMALS
// Spot price = SOL per token (simplified constant-product view).
const priceUsd = (solInPool / tokensInPool) * solPriceUsd
return {
poolValueUsd: solInPool * solPriceUsd,
supplyInPool: tokensInPool / HUMAN_TOKEN_SUPPLY, // 1.0 -> 0 as it sells
marketCapUsd: priceUsd * HUMAN_TOKEN_SUPPLY,
}
}
// 300 SOL raised, ~117M tokens left, SOL at $150 -> the row above:
curveSnapshot(300n * 10n ** 9n, 117_000_000n * 10n ** 6n, 150)
// { poolValueUsd: 45000, supplyInPool: 0.117, marketCapUsd: 384615 }Figures are illustrative and assume a SOL price of $150; the live curve uses Meteora's weighted math (via swapQuote), so on-chain numbers depend on market conditions.