Banquet Docs
中文 Open the app

Overview

Banquet is a place to launch and trade tokens on Arc, Circle's layer 1. You can browse launches, open any token to see its details, and trade straight from your wallet.

USDC is the native gas token on Arc. Every price, fee and balance you see is a dollar amount, and there is no second asset to acquire before you can transact.

Banquet never holds your funds. Every launch and trade is a transaction your wallet asks you to approve.

Protocol

Launch mechanism

Creating a launch deploys the token, its bonding curve and its creator vault in a single transaction. The whole supply is minted to the curve, so the creator starts with no tokens. The creator sets the name, symbol, image, description, links, graduation target and any tax at creation.

Every token trades against USDC. Trading runs on the curve until the curve allocation is sold, then moves to a Uniswap v4 pool whose liquidity is locked forever.

01 Create
token, curve and vault deploy in one transaction
Bundle?
yes
The creator's own buy runs in the same transaction
1% flat, no anti-snipe premium
no

straight to 02 Trade

02 Trade
anyone buys and sells on the curve
03 Graduate
the pool opens and the curve closes, in one transaction

Each launch uses a fixed supply of one billion tokens, 750,000,000 of them on the curve, a 1% trading fee, and a $1 launch fee.

FieldConstraint
NameUp to 28 characters
Ticker1 to 10 characters
ImagePNG, JPEG, WEBP or GIF, up to 5 MB
DescriptionUp to 280 characters
LinksX, a website, Telegram
Graduation target$5,625 to $50,000, so a token opens at a market cap of at least $2,500

Trading and pricing

Before graduation the price comes from a constant-product curve with a virtual reserve:

(V0 + R) · S = k

V0 is a virtual USDC reserve fixed at deploy, R is what the curve has collected, and S is what it still holds. Spot price is (V0 + R) / S.

The price rises as tokens are sold and falls as they are sold back. From launch to graduation it travels 9x, the same for every token whatever the target.

After graduation the price comes from the token's Uniswap v4 pool. Trading continues there, through Banquet or any router that reaches the pool, and nothing migrates again.

The amount you receive can differ from the quote, because the price moves between the quote and the block your transaction lands in.

Price impactThe curve or pool movement caused by the size of your trade
SlippageThe maximum execution movement your transaction accepts
Cover chargeThe fee on this trade, including the anti-snipe premium if it is still open

Graduation

A launch graduates once 750,000,000 tokens have been sold, which is the whole curve allocation. The progress line tracks how close a launch is.

It triggers on tokens sold, not on money raised. Fees injected into the reserve raise the money collected without emitting tokens, so a target on money raised would fire early with supply unsold. Every token that graduates has therefore distributed the same supply.

Graduation happens in the same transaction as the final buy:

  1. The remaining 250,000,000 tokens and every dollar raised go to the graduation adapter.
  2. It opens a Uniswap v4 pool for the token against USDC, at the curve's closing price, with Banquet's hook attached.
  3. It adds everything as full range liquidity and locks it forever. The adapter has no function that can withdraw it.
  4. The curve closes permanently. Trading continues in the pool.

Only the token's own curve can graduate it, and only Banquet's adapter can open a pool on the hook, so nobody can open a token's pool early at a wrong price.

Graduation only confirms the curve was sold. It is not a quality signal and does not guarantee future liquidity, price, or an exit.

Fees

Every trade pays 1%, on the curve and in the pool after graduation.

Protocol0.50%
Creator0.50%, for life, divided by the creator's split

On the curve, the fee accrues to a ledger and is claimed, so a recipient who cannot receive USDC can never block a trade for anybody else.

In the pool, the fee is taken by Banquet's Uniswap v4 hook on the swap itself. The pool charges no fee of its own, so the 1% is the whole cost, the same as a standard 1% Uniswap pool. The protocol's half is paid in USDC. The creator's half follows their split:

SplitPaid inWhere it goes
KeptUSDCthe creator's vault, claimable at any time
Burnthe tokensent to 0x…dEaD
Liquidityhalf USDC, half the tokenqueued, then added to the pool as locked liquidity
Holder rewardsUSDCthe token's reward pool, claimed by holders (Tax mode only)

A token launched with everything on "kept" burns nothing. The creator's own share can only ever go down: what they give up goes to the burn, liquidity or holders.

A creator can split their vault across up to ten addresses and can hand the vault to somebody else. Neither changes the rate.

The anti-snipe premium is charged on top for the first 15 blocks and goes entirely to the protocol. See launch mechanism.

A perpetual tax, if the creator chose Tax mode, is charged on top of the 1%. See taxes.

Taxes

A tax is optional and chosen at launch. Both modes graduate into the same Uniswap v4 pool and pay the same 1% fee there.

ModeWhile bondingAfter graduation
CleanUp to 50% creator tax, collected by the curveThe 1% only
TaxUp to 50% creator tax, collected by the curveThe 1% plus a perpetual tax of up to 10% a side

The perpetual tax is charged by the pool's hook, not by the token, so the token is an ordinary ERC20 to every router and wallet. Taxes hit swaps only, never wallet to wallet. Buy and sell rates are set separately.

The protocol takes 5% of the perpetual tax. The rest joins the creator's half of the 1% and is divided by the same split: kept, burnt, added as liquidity, or paid to holders. Holder rewards accrue in USDC in proportion to balance, and only Tax mode tokens can pay them.

Rates can never be raised. The curve tax can be lowered by the creator; the perpetual rate is fixed at graduation.

The Tag

Every token launched through Banquet has an address ending in feed.

0x7f3d4b2a91c05e6dbb4417c8e2f0a5d8dd12feed
                                      ^^^^

The factory checks the last two bytes against 0xfeed when it deploys, so a token that does not carry it was not launched here. It cannot be faked by calling the factory with a different salt.

The check is numeric, so casing does not matter: compare case-insensitively, or read tag() and tagMask() off the factory and mask the address yourself.

The Tag proves where a token came from. It proves nothing about the token itself: a tagged token can still have a 50% tax, a large bundle, and a creator who disappears.

Community takeovers (CTO)

When a token's original creator steps away, the creator's fee stream can be handed to somebody else. That is a community takeover, or CTO.

The token, its pool and its locked liquidity are unaffected, and the rate does not change.

Ask on the token's own page, under Take this token over: a payout address and why. Asking needs 5% of the token's supply, held by the wallet asking. One request stands per token. We read it by hand. Quiet for a week is not gone.

Granting calls reassignCreator on the vault, which only the platform address can do. It emits CreatorReassigned with both addresses, so every takeover is on the chain. A creator who still has their key does not need us: transferCreator is theirs.

Approval is administrative. It is not an endorsement or a statement about a token's safety or value.

The stream can also be pointed at a contract that buys the token on the open market and burns what it buys. That contract has no owner, no pause and no withdrawal, and anybody can trigger it.

Never share a private key or seed phrase. Banquet will never ask you to send funds to process a request.

Risk disclosures

Tokens launched through Banquet are user-created and experimental. Review the token address, the creator, the liquidity, the holder concentration and the transaction preview before signing.

  • Prices can move quickly and liquidity can be thin.
  • Similar names and images can represent unrelated tokens.
  • Smart contracts, wallets, RPCs and indexers can fail.
  • Displayed values are estimates, not execution guarantees.
  • Nothing at launch can be changed afterwards, and there is no support path.

Banquet is an interface, not investment advice or a representation of token quality.

Integration

Network

Banquet runs on Arc mainnet. Tokens trade on a bonding curve, then graduate into a Uniswap v4 pool, and are quoted against USDC only.

NetworkArc
Chain ID5042
Native assetUSDC
Public RPChttps://rpc.mainnet.arc.io
USDC (ERC-20)0x3600000000000000000000000000000000000000
PoolUniswap v4, dynamic fee, tick spacing 200, Banquet hook
Pool fee1%, taken by the hook
Launch fee$1
Supply1,000,000,000 (1e9)

USDC is the native gas token and is also an ERC-20 at the address above, with 6 decimals. Never assume 18.

Contracts

Arc mainnet#

ContractAddressWhat it is
TokenFactory0x38d155cb80b845b66260295c68f0b663040c4ac2The one you call. Deploys and owns nothing after.
LaunchToken implementation0xb727db5b250ccb74cafa3cb68ef539d9b6a1f8ffCloned for a launch with no tax.
TaxToken implementation0xb1460d69d0d2c3375300d1757ad2db2e21bf30b3Cloned for a taxed launch.
BondingCurve implementation0x0db4735eba3479f8c9badba796d5e27eed3bcd98Cloned once per token.
CreatorVault implementation0xd73ad0733e3bcf57589398d4006b3e2d8375529bCloned once per token. Holds creator fees.
BanquetV4Hook0xdb8239736c7ab108fd95a02af55589092c2420ccTakes the 1% and any perpetual tax on every pool swap.
UniV4Adapter0x5879a28948ef54308b1a1b9d84e9a0562992bb55Opens the Uniswap v4 pool at graduation and locks its liquidity for good.
Uniswap v4 PoolManager0x8366a39cc670b4001a1121b8f6a443a643e40951Uniswap's. Every graduated pool lives inside it.
Uniswap Universal Router0x4fca4a51ab4f23a7447b3284fbd7d73289a89fb1Uniswap's. What the app trades through after graduation.
Permit20x000000000022d473030f116ddee9f6b43ac78ba3Uniswap's. Holds the router's allowance, with an expiry.
Uniswap v4 StateView0xf3334192d15450cdd385c8b70e03f9a6bd9e673bUniswap's. Reads a pool's price and liquidity.
Uniswap V4Quoter0x8dc178efb8111bb0973dd9d722ebeff267c98f94Uniswap's. Quotes a trade with the hook included.
Disperse0x0c4e16c9562954da2d6fe98e176e5ba78ad296adSends one token to many wallets in one transaction.

Indexing starts at block 21196020, where the factory was deployed.

Earlier versions, still trading#

FactoryHookAdapter
0xd3e26ef8316dde01a2295a8365ba4087ebefb0510xdefe9cae31ebd52e124125797e657fad80d4c0880x1e20d1fb68891a111b8cbcd4a1ffe5708bcfad6d

Per-token addresses#

Token and curve addresses are not listed anywhere, because there will be thousands. Both are deterministic: the factory deploys EIP-1167 clones through CREATE2, and emits TokenLaunched at every launch.

Every token address ends in feed, checked on chain by the factory. Verify it against tag() and tagMask() rather than the literal, and check the factory emitted it.

Onchain events

For a trust-minimized integration, index the factory's CurveReady and TokenLaunched events, register each emitted curve, and index its Bought, Sold and Graduated events. After graduation, index the adapter's Graduated for the pool id and the hook's events for what each swap paid. Onchain events are the authoritative source of truth.

ContractEventtopic0
FactoryTokenLaunched0x5b296911b7a0146e120ae1fb6b8be7710a7c85b2ac77d7d31654192e87668656
FactoryCurveReady0xb2bc2a1d77374590aba07729e6e0b8615ae7d0df8ded9fc9e0c863f641e8a54b
FactoryLaunchExtras0x816c0318420e57b5b41fd51f7f182003b479dbc49828acf299f99214b4152b31
CurveBought0x27330bd7589580547b6437e08f9c60653de63691d2d2b2c13bff9ee67da2a68d
CurveSold0x490fdc1c23c0f3a84bf80a0384eaadcb9188c9ef71b9430da391a0e4c4c39bf6
CurveGraduated0x1c858049e704460ab9455025be4078f9e746e3fd426a56040d06389edb8197db
AdapterGraduated(token, poolId, liquidity)0x0679d6268f9e4abb74afa977f548840167fb3409ecf2b596128e65990aa10988
HookCutTaken(poolId, toCreator, toPlatform)0x71902a4f16088bf96f470c3d48efd7c29388924ffe2fc9424c93eb349718cdce
HookCutBurnt(poolId, amount)0x487ed7e78e7e3b75a1b85bc7d2b094429205b13abbdfe1c3a6ac569a6c4545b6
HookHoldersPaid(poolId, amount)0x3aa79f12131ca184f157391ac454a907f50820756452154855b09d90b58e7bca
HookLiquidityAdded(poolId, liquidity, usdc, tokens)0x491804742ecda0a8eac7ede1889f8661bcf9cb3847e12b0f389ef5fe12b0d168

CurveReady is emitted before the launch transaction's own bundle buy, so a bundle is attributable to the token. Open the token on CurveReady and fill in its metadata from TokenLaunched.

Pool trades are Uniswap's own Swap events on the PoolManager, keyed by pool id. Their amounts are the pool's, before the hook's fee, and negative means into the pool.

import { createPublicClient, http, parseAbiItem } from "viem";

const client = createPublicClient({
  chain: {
    id: 5042,
    name: "Arc",
    nativeCurrency: { name: "USDC", symbol: "USDC", decimals: 18 },
    rpcUrls: { default: { http: ["https://rpc.mainnet.arc.io"] } },
  },
  transport: http(),
});

const launches = await client.getLogs({
  address: FACTORY,
  event: parseAbiItem(
    "event CurveReady(address indexed token, address indexed curve, address indexed creator, uint256 targetUsdc, uint16 curveTaxBps, bool taxMode)"
  ),
  fromBlock: START_BLOCK,
});

Reading token state

Before graduation, everything a price needs is on the curve.

CallReturns
reserveUsdc()USDC collected so far, 6 decimals
tokensSold()Tokens sold so far, net of sales back, 18 decimals
tokensRemaining()What the curve still has for sale, 18 decimals
config()The launch configuration, including virtualUsdc, the virtual reserve
currentFeeBps()The fee on the next trade, premium included
graduated()Whether the curve has closed
quoteBuy(usdcIn)Tokens out and the fee, in bps
quoteSell(tokenIn)USDC out and the fee, in bps

Spot price is (virtualUsdc + reserveUsdc) / (1,125,000,000 - tokensSold), where 1,125,000,000 is the curve's virtual token reserve. Use it for display only. Price a trade with the quote functions, which account for the impact of the trade itself.

A launch has graduated when graduated() is true. Trading then happens in its Uniswap v4 pool: read the price from Uniswap's StateView and quote with Uniswap's V4Quoter, which include the hook's fee and any perpetual tax.

On the curve, fees are pulled: feesOwed(address) reads what an address can claim, and claim() pays it. In the pool, the hook pays the creator's vault on every swap.

Trading bots and aggregators

Everything a bot needs to list, quote and trade Banquet tokens on Arc mainnet. Every contract is permissionless: no key, no allowlist, no API key.

Kit#

ABIshttps://banquet.fun/abi/TokenFactory.json, BondingCurve.json, LaunchToken.json, LaunchTokenTax.json, CreatorVault.json, UniV4Adapter.json, BanquetV4Hook.json
Addresseshttps://banquet.fun/abi/deployment.json, also on the contracts page
ChainArc mainnet, chain id 5042, RPC https://rpc.mainnet.arc.io
Quote assetUSDC. Native gas token with 18 decimals, ERC-20 at 0x3600000000000000000000000000000000000000 with 6
TokenERC-20, 18 decimals, 1,000,000,000 supply, address ends in feed

1. Find launches#

Index CurveReady(address indexed token, address indexed curve, address indexed creator, uint256 targetUsdc, uint16 curveTaxBps, bool taxMode) on the factory, from its start block in deployment.json. It fires once per launch, before the launch's own bundle buy, and names the curve every pre-graduation trade goes to. TokenLaunched follows in the same transaction with the name and symbol.

To check any address: factory.carriesTag(token) is true only for a Banquet token, and factory.curveOf(token) returns its curve.

2. Before graduation: trade on the curve#

The curve is the only market until it sells out. curve.graduated() is false.

Quote

CallReturns
quoteBuy(uint256 usdcIn)(tokensOut, feeBps), usdcIn in 6 decimals
quoteSell(uint256 tokensIn)(usdcOut, feeBps), usdcOut in 6 decimals

Both include every fee in force, the anti-snipe premium included.

Buy, paid in native USDC:

function buy(uint256 minTokensOut, address integrator) external payable returns (uint256);
  • msg.value is USDC at 18 decimals and must be a whole multiple of 1e12 (whole 6-decimal units), or it reverts with NotExact.
  • Pass integrator = address(0). The integrator share is zero on these curves.
  • A buy that fills the curve is clamped to what is left, graduates the token in the same transaction, and refunds the unused value.

Sell, paid out in USDC (ERC-20):

function sell(uint256 tokensIn, uint256 minUsdcOut, address integrator) external returns (uint256);

Approve the curve on the token first: the curve pulls tokensIn with transferFrom.

Fees on the curve: 1% (0.5% creator, 0.5% protocol), plus the creator's curve tax if any (config().curveTaxBps, up to 50%), plus the anti-snipe premium for the first 15 blocks after trading opens: 75% at the first block, decaying quadratically to zero. currentFeeBps() is the total on the next trade.

3. Graduation#

When the last curve token is sold, in that same transaction:

  • the curve emits Graduated(address target, uint256 tokenAmount, uint256 usdcAmount) and closes: further buy and sell revert with AlreadyGraduated;
  • the adapter opens the Uniswap v4 pool and emits Graduated(address indexed token, bytes32 indexed poolId, uint128 liquidity);
  • 250,000,000 tokens and the whole raise are locked as full range liquidity, for ever.

4. After graduation: trade on Uniswap v4#

A graduated token trades in an ordinary Uniswap v4 pool. Any router that reaches the PoolManager works, including Uniswap's Universal Router.

Pool key

FieldValue
currency0, currency1the token and USDC 0x3600…0000, sorted ascending
fee0x800000 (dynamic, set by the hook)
tickSpacing200
hooksv4Hook in deployment.json

poolId = keccak256(abi.encode(poolKey)), also emitted by the adapter.

Uniswap on Arc

PoolManager0x8366a39CC670B4001A1121B8F6A443A643e40951
Universal Router0x4fcA4a51Ab4F23A7447b3284fBd7D73289A89Fb1
Permit20x000000000022D473030F116dDEE9F6B43aC78BA3
V4Quoter0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94
StateView0xF3334192D15450CdD385c8B70e03f9A6bD9E673b

Quote with the V4Quoter. The hook takes its fee inside the swap, so the quoter's answer already includes it; a price computed from sqrtPriceX96 alone does not. Exact input and exact output are both supported and both charged.

Fees in the pool: 1% on every swap, taken by the hook (the pool's own LP fee is zero), plus a Tax mode token's perpetual tax, read with hook.poolOf(poolId) (buyBps, sellBps, up to 10% each). Taxes apply to swaps only; wallet transfers are never taxed.

5. Events worth indexing#

See onchain events for every topic. The short list for a bot:

WhereEventMeaning
FactoryCurveReadya new token and its curve
CurveBought, Solda curve trade
CurveGraduatedthe curve closed
AdapterGraduatedthe pool id to trade on
PoolManagerSwapa pool trade, filtered by pool id

6. Read-only API (optional)#

The chain is authoritative. For convenience, the indexer behind banquet.fun answers JSON at https://banquet-production-fecb.up.railway.app:

RouteReturns
/tokens?limit=50&offset=0&sort=newesttokens with price, market cap, volume, progress, pool id
/tokens/counthow many
/trades/:tokenrecent trades
/holders/:tokenholders
/candles/:token?interval=60OHLCV, intervals 60, 300, 3600, 86400

Prices are 18-decimal USDC per whole token (priceWad), USDC amounts are 6 decimals.

Contact#

contact@banquet.fun or @Banquetdotfun.

Errors

Custom errors, so a revert says what happened.

ErrorMeaning
BadParamsA launch parameter is out of range
BadConfigA tax or allocation is out of range
TooManyWalletsA bundle names more than 100 recipients
DuplicateRecipientA bundle names the same wallet twice
NotStartedTrading has not opened yet
AlreadyGraduatedThe curve has closed
SlippageThe quote moved past your minimum
NothingToClaimThe address is owed nothing
NotCreatorThe caller is not the creator
NotTheCurveSomething other than the token's own curve tried to graduate it
NotAdapterSomething other than Banquet's adapter tried to open or register a pool
AlreadyRegisteredThe pool's fee is already set
FeeTooHighA perpetual rate is above 10%
NotADecreaseA split change would raise the creator's own share

A revert costs gas and changes nothing else. A launch that reverts deploys no token.

Support

Read the risk disclosures before anything else.

For a security issue, write to security@banquet.fun. Do not open a public issue for a vulnerability that can be exploited.

For anything else, contact@banquet.fun or @Banquetdotfun.

Banquet holds no key to any token launched through it. Nothing can be paused, moved, seized or refunded, including by us.

Legal