just topblast it.
Beta Version — topblastv2 is being upgraded and audited daily until all quote assets become available. Errors are possible.
← back to launch

Docs

TopBlast bonding curve — integration guide

Everything a terminal, bot or aggregator needs to quote, route and settle trades against TopBlast bonding curves on TON, plus the graduation handoff into a DeDust CPMM v2 pool.

Overview

Each launch deploys one BondingCurve contract and one TEP-74 jetton master. The full supply of 1,000,000,000 tokens (6 decimals) is minted once to the curve and the minter immediately renounces its admin rights — the jetton can never be re-minted, frozen or upgraded.

Tokens trade against a whitelisted quote jetton (USDT, USDe, XAUt0 gold, SP500 or one of nine xStocks) on a constant-product curve with virtual reserves. When the raise reaches the per-pair cap, the curve migrates: up to 25% of total supply, priced at the final curve price, paired with the full raise seeds a DeDust CPMM v2 volatile pool, tradeable from the first block.

Launches happen on this site. Discovery, charts and secondary trading are indexed on topblast.lol.

Architecture

BondingCurveMasterImmutable factory. Holds the quote whitelist, caps, migration fees and child code. Deploys one curve per launch at a deterministic address.
BondingCurvePer-launch AMM. Custodies the meme supply and quote raise, prices trades, accrues fees, executes graduation.
JettonMinter / JettonWalletStandard TEP-74 pair. One-shot mint, admin revoked to the zero address in the same transaction.
DeDust CPMM v2Destination pool created at graduation. The LP position is pinned to the curve contract and locked forever.

Addresses

MasterEQA3QsiH-T6j7PlqUyUoGykqrnTFoys006VJ5Ea7qBZFwMlR
Quote · USDTEQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs
Quote · XAUt0EQA1R_LuQCLHlMgOo1S4G7Y7W1cd0FrAkbA10Zq7rddKxi9k
Quote · SP500EQB1fyBAA9qQDP6LEGaF3cbU-Xbr-p6ESBZGnqlHkHIHAJZv
Quote · AAPLxEQDsjAwfKo-6FVZv2EYt-1CaZTY_ZL-pfkSId6jeQchNwmdo
Quote · TSLAxEQB4IwqWZPUczntdry8vSN2tsJKt-9F7iIb7gEFREYYOB563
Quote · GOOGLxEQALwJzXnxFjckNsurCi9O2kVg_0b1KdtjOSfvOedlY37iZc
Quote · NVDAxEQCva-Of7acQdU_piADdlcbzsFtA-xJwZoctz8ZOXBdBoaB8
Quote · QQQxEQCe6utwqROmrO_cOUUvVNYkvyecUjfugtugvhUwlVYSEm7x
Quote · MSTRxEQBbsLYH5sD74gYO4DOoj0QsHaNL81NLD13AdhkmD0Up-46H
Quote · AMZNxEQCtD2-7qxHhQoNhxri2JSzH-dlmWqKYCDtlEZqRi3-56gd9
Quote · HOODxEQAHz1jK27NO5IdHrht8146-EFz9p4kSZZx2H1xXuNQOYp_r
Quote · COINxEQCvk4Oq2l5Yts_S7Q4j08fB9Ftzx3IY-7UI1AqssyKGDt_I
Quote · USDeEQAIb6KmdfdDR7CN1GBqVJuP25iCnLKCvBlJ07Evuu2dzP5f
Quote · BTCEQDhyPzbIjJT_WnY3gGprjSYUK9fiGMjWMezxO8MZiUdfb_B
Quote · ETHEQBTkLAhEteZCRgRe_xMs5ZE0bMrduYxKbyzGCpXXW8dRWOT
Quote · UTYAEQBaCgUwOoc6gHCNln_oJzb0mVs79YG7wYoavh-o1ItaneLA
Quote · GROYPEQAtwo6qMNwtr0iTA9eKVZ32cuACFJ0VKd78GrBWOe83-X1P
Quote · REDOEQBZ_cafPyDr5KUTs0aNxh0ZTDhkpEZONmLJA2SNGlLm4Cko
Quote · BABYDOGEEQCWDj49HFInSwSk49eAo476E1YBywLoFuSZ6OO3x7jmP2jn
Quote · XROCKEQAVfEY2iKSpEkUhgFLFWAgHeSz2NH2XV-MvDuiKF5plSbsU
Quote · NOTEQAvlWFDxGF2lXm67y4yzC17wYKD9A0guwPkMs1gOsM__NOT

A curve address is deterministic from (master, creator, quote_master, salt), so it can be computed before the deploy transaction lands:

state_init = { code: curve_code, data:
  begin_cell()
    .store_address(master)
    .store_address(creator)
    .store_address(quote_master)
    .store_uint(salt, 64)
  .end_cell() }
curve = address_of(state_init)

Verify before you sign

No contract can protect you against a hijacked domain or a tampered front end. Both values below are fixed and public — before approving a launch or a trade, check that the destination shown by your wallet is the master address here, and that the curve code hash matches. If either differs, the page you are on is not TopBlast.

MasterEQA3QsiH-T6j7PlqUyUoGykqrnTFoys006VJ5Ea7qBZFwMlR
Curve code hash0bc54c805b692d8db5cd8ca21f54974a4391cf2088a9f35e2271f86e75d743f9
Official domainstopblastv2.lol · www.topblastv2.lol · topblast.lol

Curve math

Constant product over virtual reserves. Virtual reserves start at cap ÷ 2 quote units and 1,125,000,000 meme tokens, so the curve sells exactly 750,000,000 tokens (75% of supply) by the cap and the remaining 250,000,000 seed the DeDust pool:

reserve_quote = virt_quote + raised
reserve_meme  = virt_meme  - sold

buy:  swap_in  = amount_in - amount_in * 1%
      amount_out = swap_in * reserve_meme / (reserve_quote + swap_in)

sell: gross_out = amount_in * reserve_quote / (reserve_meme + amount_in)
      amount_out = gross_out - gross_out * 1%

The fee is always taken in the quote asset — buyers pay it on the way in, sellers on the way out. Traders never pay fees in the meme token.

USDTcap 2,640 USDT
XAUt0cap 0.5977 XAUt
SP500cap 3.4085 SP500
AAPLxcap 8.2513 AAPLx
TSLAxcap 7.4197 TSLAx
GOOGLxcap 7.7961 GOOGLx
NVDAxcap 11.3529 NVDAx
QQQxcap 3.6491 QQQx
MSTRxcap 18.7780 MSTRx
AMZNxcap 10.2302 AMZNx
HOODxcap 21.6660 HOODx
COINxcap 14.4578 COINx
USDecap 2,640 USDe
UTYAcap 95,975.5071 UTYA
XROCKcap 90,862.8053 XROCK
NOTcap 5,291,236.5904 NOT

Trading (buy / sell)

Both directions are a standard TEP-74 transfer#0f8a7ea5 to the curve with a forward payload. Never send jettons without a payload — an empty forward payload is treated as a donation and is not swapped.

OpValueDirection
buy0x42555921send QUOTE jettons to the curve
sell0x53454c4csend MEME jettons to the curve
forward_payload#_ op:uint32 query_id:uint64 min_out:Coins = TradePayload;

// buy 100 USDT with 1% slippage tolerance
transfer(
  amount:            100_000000,
  destination:       curve,
  response_destination: sender,
  forward_ton_amount: 0.2 TON,
  forward_payload:   begin_cell()
      .store_uint(0x42555921, 32)
      .store_uint(query_id, 64)
      .store_coins(min_out)
    .end_cell()
)
Whale protection: each wallet can hold at most 20,000,000 tokens (2% of total supply) from curve buys, enforced on-chain as a lifetime per-buyer ledger — spreading across one wallet is impossible and excess input is refunded. On SP500 pairs the creator is capped too; on USDT / USDe / GOLD pairs the creator is exempt.

Attach at least 0.25 TON of forward amount and 0.35 TON total message value. If min_out is not met — or the curve has graduated, or the cap is already reached — the curve refunds your exact input in the same asset instead of throwing, because a failing notification cannot undo a jetton transfer.

Right after launch the curve sends a TEP-89 discovery request to learn its own quote wallet address. Any trade notification that arrives before that reply is treated as a donation and kept by the curve; do not send trades immediately after a launch until the token appears in the indexer and the UI enables trading.

Fees

Every buy and sell pays a 1% trading fee, always denominated in the quote asset. Buyers pay it on the way in, sellers on the way out. Traders never pay fees in the meme token.

Get-methods

MethodReturns
get_curve_data()(raised, cap, sold, graduated, quote_master, meme_master, creator)
get_meme_out(quote_in)meme out for a quote input, fee included
get_quote_out(meme_in)quote out for a meme input, fee included
get_jetton_data()TEP-74: (supply, mintable=0, admin=zero, content, wallet_code)

Indexing

The master emits an external-out log for every launch. Subscribe to outgoing external messages from the master address:

launch_created#4c4e4344
  query_id:uint64
  curve:MsgAddress
  creator:MsgAddress
  quote_master:MsgAddress
  salt:uint64
  metadata:^Cell   // TEP-64 onchain content

Poll get_curve_data() for live progress; the raise percentage is raised / cap. Graduation is signalled by the graduated flag flipping to true and the curve rejecting trades.

HTTP API

For platforms that want to list and track TopBlast launches without decoding contracts themselves, we expose a public read-only JSON API. No authentication, no API key — just cache responsibly (responses carry a short Cache-Control window).

EndpointReturns
GET /api/public/tokensStatic directory of every launch across all known masters: identity, quote pair, category and cap. No live state — read that from the chain
GET /api/public/tokens/{address}One launch in detail — accepts the bonding-curve or the token (jetton master) address in any EQ/UQ/raw form. Adds live raise, graduation, locked-LP amount, pool reserves and the pool price
curl https://topblastv2.lol/api/public/tokens

{
  "master": "EQA3QsiH-T6j…",
  "tokens": [
    {
      "curve": "EQ…",            // bonding curve contract
      "name": "Example",
      "symbol": "EXMPL",
      "image": "https://…",
      "creator": "UQ…",
      "createdAt": 1757000000,   // unix seconds
      "quote": {
        "id": "USDT",
        "symbol": "USDT",
        "master": "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs",
        "decimals": 6
      },
      "category": "stable",
      "cap": { "raw": "2640000000", "amount": "2640" }
    }
  ]
}

// live state (raised, sold, graduated, jetton master) is NOT in this feed —
// call get_curve_data() on the curve, or /api/public/tokens/{curve}
curl https://topblastv2.lol/api/public/tokens/{address}

{
  "token": { /* same shape as above */ },
  "graduation": {
    "graduated": true,
    "pool": "EQ…",               // DeDust CPMM v2 pool, LP locked in the curve
    "lpLockedRaw": "…",
    "lpOwner": "EQ…",            // the curve contract itself
    "reserves": { "memeReserveRaw": "…", "quoteReserveRaw": "…" },
    "price": { "quotePerToken": "0.00000012", "quoteSymbol": "USDT" }
  }
}
Amounts come in two forms: raw (integer, on-chain units) and amount (human string, decimal-converted by quote decimals). The detail endpoint carries raised / cap for a bonding bar and graduated / pool to switch a listing from curve trading to DeDust trading; the directory endpoint is static by design, so take those from get_curve_data() when you track many tokens at once. The directory returns up to the 500 most recent launches across every known master. Responses are 200 on success, 404 for an unknown token and 503 if upstream indexers are lagging.

Everything these endpoints return is also readable directly on-chain — see Indexing above if you prefer to run your own indexer against the master's launch_created#4c4e4344 logs and curve get-methods.

Bots & terminals

Everything a trading bot or terminal needs to route an order, in one place. Start from GET /api/public/config — it returns the live master, the whitelisted quote assets with their decimals, caps and category, the curve constants and the exact gas amounts to attach. Never hard-code these: a new master deployment changes caps and the quote whitelist.

curl https://topblastv2.lol/api/public/config

{
  "network": "mainnet",
  "master": "EQ…",
  "dedustFactory": "EQ…",
  "meme": { "decimals": 9, "supply": "1000000000" },
  "curve": {
    "capUsd": 2640,
    "virtualQuoteNum": 1, "virtualQuoteDen": 2,   // virtual quote = cap * 1/2
    "curveAllocationRaw": "1125000000000000000",  // virtual meme reserve
    "maxBuyPerWalletRaw": "20000000000000000",    // 2% lifetime buy cap
    "tradingFeeBps": 100
  },
  "gasNano": {
    "curveTransfer": "380000000", "curveForward": "260000000",
    "dedustTransfer": "350000000", "dedustForward": "250000000"
  },
  "quotes": [
    { "id": "USDT", "symbol": "USDT", "master": "EQ…", "decimals": 6,
      "category": "stable", "capRaw": "2640000000", "holderPool": false }
  ]
}

Discovery & categories

GET /api/public/tokens lists up to the 500 most recent launches across every known master and accepts an optional ?category= filter (comma-separated). Each token also carries its own category field, so a terminal can build tabs without a lookup table.

CategoryQuote assets
stableUSDT, USDe
stocksSP500 and the xStocks pairs
majorscbBTC, WETH (once whitelisted)
memesmeme-token pairs (once whitelisted)
GET /api/public/tokens?category=stable,stocks

All public endpoints are GET-only, unauthenticated, CORS-open and answer OPTIONS preflight. Respect the Cache-Control window: 60s for the token directory, 30s for a token detail, 300s for config. Poll, do not hammer.

Venue routing

One field decides where an order goes. While graduated is false, trade against the bonding curve at token.curve. Once it flips to true, the curve refuses trades with error 204 and all liquidity lives in the DeDust CPMM v2 pool at token.pool — route there using DeDust's own swap interface (jetton transfer to the asset vault with aswap#e3a0d482 payload). The detail endpoint returns pool reserves and the live quotePerToken price for post-graduation quoting.

Pricing an order on the curve

Quote locally from the constant-product formula in Curve math, or read the curve directly — get_meme_out(quote_in) and get_quote_out(meme_in) already include the 1% fee and are the authoritative quote. Derive min_out from that value and your slippage tolerance, and put it in the trade payload; the curve refunds instead of filling when it cannot be met.

reserve_quote = cap/2 + raised
reserve_meme  = 1_125_000_000e9 - sold

quote_in_net = quote_in * 99 / 100
meme_out     = quote_in_net * reserve_meme / (reserve_quote + quote_in_net)
min_out      = meme_out * (10000 - slippage_bps) / 10000

Outcomes a bot must handle

SituationWhat the bot sees
min_out not metFull input refunded in the same asset — no throw, no fill
Buy crosses the capPartial fill up to the cap, remainder refunded
Buyer at the 2% lifetime capPartial fill up to the remaining allowance, rest refunded. Selling does NOT restore allowance
Curve graduatedTrade refunded; re-route to the DeDust pool
Empty forward payloadTreated as a donation and kept — always attach the payload
Under-funded gasMessage bounces or refunds; attach the gasNano amounts from config

Trades settle asynchronously: a curve processes messages one at a time, so a burst of orders fills sequentially at moving prices, typically within a few seconds each. Confirm a fill by polling the buyer's jetton wallet balance or the curve's get_curve_data() — never by assuming the transfer succeeded.

Error codes

CodeMeaning
201 / 202notification did not come from the curve's quote / meme wallet
203slippage: output below min_out (input is refunded, not thrown)
204curve already graduated
205cap not reached yet / quote wallet not resolved