technical whitepaper, verified against the chain 6 Sept 2026

Every coin is a payment token for Robinhood Chain.

This document describes what anychain.fun is built on and how it works, down to the contracts, their addresses, the arithmetic and the wire calls. Every number in it was read from the chain or from a live API on the date above, and the page rebuilds from the same data files the site runs on.

1. Abstract

anychain.fun is a launchpad for memestocks: ERC-20 tokens launched around a stock narrative, priced by a bonding curve, settled on Robinhood Chain (chain id 4663). The curve and the launch factory are PONS v2, used exactly as Pons deployed them; anychain.fun adds no contract of its own. What it adds is the payment side: a buyer holding SOL, an xStock, USDC, ETH, BNB or POL on Solana, Ethereum, Base, BNB Chain or Polygon pays with that, from the wallet they already have, and receives the token in a Robinhood Chain wallet. The bridge is Relay, which reaches chain 4663 directly; when a curve trades in a tokenized stock rather than ETH, OKX's on chain aggregator turns the landed ETH into that stock; the last signature is the curve buy itself.

Launches made through the site are recognisable from the chain alone, by a tag in the CREATE2 salt, so the site's own index can be rebuilt by anyone from public data. Nothing is custodied: every transaction is the user's wallet signing on the chain the transaction lives on.

2. Robinhood Chain

Chain id
4663 (0x1237)
Native asset
ETH, 18 decimals
Block time
about 0.1 s (10,000 blocks measured at 0.101 s each)
Settlement
Arbitrum technology; deposits originate on Ethereum mainnet
Public RPC
rpc.mainnet.chain.robinhood.com
Explorer
robinhoodchain.blockscout.com (Blockscout v11)
Tokenized equities
194 ERC-20s read from the chain, 18 decimals, one share each
DEXs
Uniswap V3 and Uniswap V4 are deployed; PONS v2 graduates into V4

The public RPC shapes several design decisions. It is not archival, so state at old blocks cannot be read. eth_getLogs takes at most 50,000 blocks per call, at most 10,000 matching logs, and refuses a query without an address. It serves no logs older than a floor that moves forward with time, about 2.3 days behind the head at 0.1 s per block. It also answers browsers with a malformed CORS header, so the site never reads the chain from the browser: reads go through the site's own server routes, and a connected wallet's provider carries receipts.

3. PONS v2, the contracts

PONS v2 is a set of contracts by Pons Labs. The two the site talks to are verified on Blockscout; the per launch contracts (each token and its curve) are not verified there, so their interfaces were taken from Pons's public repository, ponsdotdev/ponsfamily, directory contractsV2/src/v2. Pons states that v2 is unaudited.

Read from the factory on 6 Sept 2026:

launchEnabled
true, so canLaunch(x) is true for everyone
launchFee
0.0005 ETH, msg.value must equal it exactly
launchConfigCount
1, id 0
Config 0
supply 1e9 tokens, curveFeeBps 100, phantomQuote 1.68 ETH, graduationThreshold 4.2 ETH, poolFee 0, tickSpacing 200, enabled
maxCreatorTaxBps
1,000 (10%); total trade fee capped at 2,000
Snipe tax
snipeTaxStartBps 9,900 over snipeTaxSeconds 3; ceilings 9,900 bps, 60 s, 32 exemptions
Approved paired assets
native ETH plus 53 of the 194 tokenized equities; WETH is not approved

4. Launching

The factory exposes three launch entry points; the site uses the first two.

launchToken(TokenParams params, uint256 launchConfigId, address pairToken)
  payable returns (address token, address curve)                     // selector 0xb04c4db7
launchToken(TokenParams params, uint256 launchConfigId, address pairToken,
  address[] snipeTaxExemptions) payable returns (address, address)   // selector 0xa72101af
launchTokenFor(TokenParams, uint256, address pairToken, address originalDeployer,
  address[] snipeTaxExemptions) payable                              // only the launchForwarder

struct TokenParams {
  string name; string symbol; string logo; string description;
  Socials socials;               // twitter, telegram, discord, website, farcaster
  address creatorFeeRecipient;   // zero means the caller, on the direct path only
  uint16  creatorTaxBps;         // 0 to 1000
  bool    buybackEnabled;
  bytes32 expectedEconomics;     // previewLaunchEconomics(configId, pairToken), or zero to waive
  bytes32 salt;                  // CREATE2, see section 5
}

A launch without an opening buy is a direct call to launchToken with value equal to launchFee. A launch with an opening buy goes through the router:

PonsV2LaunchAndBuy.launchAndBuy(TokenParams params, uint256 launchConfigId, address pairToken,
  uint256 quoteIn, uint256 minTokensOut, address recipient, address[] snipeTaxExemptions) payable
  returns (address token, address curve, uint256 tokensOut)

value = launchFee + quoteIn      // ETH pair
value = launchFee                // stock pair; quoteIn is pulled by transferFrom, so approve the router first

Two facts about the router path were established by simulation against the live contracts on 6 Sept 2026. First, creatorFeeRecipient must be explicit: through the router the factory's caller is the router, so a zero address reverts with ZeroAddress() (selector 0xd92e233d). Second, a 0.01 ETH opening buy on a fresh ETH curve returned 5,858,335 tokens, exactly the curve arithmetic of section 6 with no snipe tax, because the factory exempts the launcher and the creator fee recipient before trading opens. With a stock pair and no allowance the router reverts with ERC20InsufficientAllowance (0xfb8f41b2), which is why the site approves the stock to the router before sending.

expectedEconomics pins the paired asset's economics at send time: the factory reverts if Pons changes phantom quote or graduation threshold between the preview and the transaction. The site always pins.

5. The anychain tag

The salt is 32 bytes the factory feeds to CREATE2. The site fills the first eight bytes with a constant and the remaining twenty four with randomness:

tag  = keccak256("anychain.fun")[0..8] = 0x54cadb5bb321177e
salt = tag ++ random(24 bytes)

The salt is not emitted in an event, but it is in the calldata of every launch transaction. Anyone can therefore rebuild the list of anychain.fun launches from the chain alone: read TokenLaunched logs on the factory, fetch each transaction, decode launchToken or launchAndBuy, and keep the ones whose salt starts with the tag. That is exactly what the indexer in section 10 does. The tag proves origin, not quality: it says the launch came through this site, nothing more.

6. Curve arithmetic

A curve holds a real quote balance (trackedQuote) and the tokens (trackedTokens). Pricing uses virtual reserves: the quote side is padded by a constant phantomQuote so the first buy is not free, and fees already accrued are excluded.

quoteReserve  = phantomQuote + trackedQuote - quoteFeeBalance - creatorTaxBalance
tokenReserve  = trackedTokens
sellable      = trackedTokens - reservedTokens          // what is still for sale
readyToGraduate = sellable == 0

buy(quoteIn):
  fee  = quoteIn * feeBps / 10000
  tax  = quoteIn * creatorTaxBps / 10000
  net  = quoteIn - fee - tax
  out  = tokenReserve * net / (quoteReserve + net)     // constant product, no extra fee
  if out > sellable: out = sellable and quoteIn is reduced to what that costs; the rest is refunded
  slippage check: spent * minTokensOut <= received * out   (a price bound, so partial fills still pass)

sell(tokensIn):
  gross = quoteReserve * tokensIn / (tokenReserve + tokensIn)
  out   = gross - gross * feeBps / 10000 - gross * creatorTaxBps / 10000
  sell needs the token approved to the curve; it is closed once sellable == 0

For config 0 with an ETH pair, phantomQuote is 1.68 ETH and reservedTokens is 285,714,285.71 tokens, two sevenths of supply, kept back to seed the graduated pool; 714,285,714.29 tokens are sellable. The spot price shown on the site is quoteReserve / tokenReserve, and market cap is that price times the 1e9 supply, both in the paired asset's units. For a stock pair the same shape applies with the asset's own economics, for example SPY phantom 4.36 shares and graduation at 10.9 shares, TSLA 10.4 and 26, NVDA 16.64 and 41.6.

Worked example: 0.01 ETH into a fresh ETH curve. net = 0.0099 ETH; out = 1e9 × 0.0099 / (1.68 + 0.0099) = 5,858,335 tokens, 0.59% of supply. The site's previews compute exactly this, with the live reserves, before any signature.

7. Fees, taxes and the launch window

Curve fee
1% of the quote leg on every buy and sell (feeBps 100)
Creator tax
0 to 10%, chosen at launch, on top of the curve fee, to creatorFeeRecipient
Protocol share
protocolFeeShareBps 3,000: 30% of swept curve fees to Pons
Buyback route
buybackBurnBps 5,000 when buybackEnabled; maxInternalPriceImpactBps 300
Launch fee
0.0005 ETH to the factory per launch
Launch window
99% snipe tax on buys in the first 3 seconds, decaying linearly to zero; launcher, fee recipient and declared wallets exempt
anychain.fun
takes no fee of its own today

Fees accrue inside the curve (quoteFeeBalance, creatorTaxBalance) and are distributed by sweepFees, callable by the creator or by Pons's sweep operator, and forced at graduation. Cross chain buys additionally pay Relay's fee (about 0.06 USD on a 10 USDC route on 6 Sept 2026) and, for stock pairs, OKX's aggregator route on chain 4663.

8. Graduation

When the sellable allocation is bought out (equivalently, when the real quote reserve reaches graduationThreshold), the curve is ready. The crossing buy tries to graduate automatically; if that fails the state stays open and graduate() is permissionless, so no holder can be stranded. At graduation the curve sweeps fees, halts trading, and hands its remaining quote and the reserved tokens to the factory, which seeds a Uniswap V4 pool through the PoolManager at 0x8366a39CC670B4001A1121B8F6A443A643e40951 with tickSpacing 200 and the fee policy hook at 0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044; the position is held by the locker at 0x267444D099b10fB5Ed7c3Cc7B7c767AdcA574952. Pons describes the liquidity as locked. After graduation the token trades on that pool, not on this site.

9. Paying from any chain

The Any chain tab on a token page runs the sequence below. Every step is the buyer's own wallet signing; the site holds no keys and no funds. Verified against Relay, OKX and the chain on 6 Sept 2026.

  1. Quote. POST api.relay.link/quote with user, recipient (the buyer's Robinhood Chain address, or any address they type), originChainId, originCurrency, destinationChainId 4663, destinationCurrency 0x0 (ETH), amount, tradeType EXACT_INPUT. Relay answers with a requestId, the delivered ETH, a time estimate (about 1 s on every route tested), fees, the sender's balance, and steps. The site proxies this through its own route and refreshes the quote as the amount changes.
  2. Sign on the source chain. Each step item is a transaction. On an EVM chain the connected wallet is switched to the source chain (wallet_switchEthereumChain, adding it if unknown), the item's to, data, value and chainId are sent with eth_sendTransaction, and the receipt is awaited; an ERC-20 source has an approve step first, a native one has only the deposit. On Solana the item is a list of instructions plus address lookup tables; the site builds a v0 transaction with a recent blockhash (through its own narrow RPC proxy) and asks a Phantom style wallet, connected separately on the panel, to sign and send.
  3. Landing. GET api.relay.link/intents/status?requestId until status is success (failure and refund are surfaced as such; anything not delivered is refunded to the source wallet by Relay). The site also watches the recipient's ETH balance on Robinhood Chain and takes the observed delta as the landed amount. When the recipient is a typed address rather than the connected wallet, the flow ends here, since the site cannot sign for that address.
  4. Stock swap, only for a stock pair. OKX DEX aggregator, V6 on web3.okx.com: GET /api/v6/dex/aggregator/swap with chainIndex 4663, fromTokenAddress 0xeeee…eeee (native), toTokenAddress the stock, amount = landed ETH minus a 0.0003 ETH gas reserve, slippagePercent 1, userWalletAddress the buyer. OKX returns to, data, value and gas; the wallet signs it on chain 4663. The received stock is measured as a balance delta, then approved to the curve.
  5. The curve. curve.buy(quoteIn, minTokensOut, recipient) with value = quoteIn for an ETH pair, or with the stock allowance in place. minTokensOut is 97% of the curve arithmetic at that moment for the cross chain flow, 99% for a plain buy on the Buy tab.

Sources listed on the site: Solana (SOL, USDC, AAPLx, 28 more); Ethereum (ETH, USDC); Base (ETH, USDC); BNB Chain (BNB, USDC); Polygon (POL, USDC). Relay identifies Solana as chain 792703809. OKX's cross chain product does not reach chain 4663 in either direction, which is why the bridge is Relay and OKX is used only for the same chain stock swap.

10. The indexer

A small service on anychain.fun's own server (Node, Postgres 16, under pm2) is the site's memory. It reads the chain, never writes to it, and everything it holds can be rebuilt from public data.

Load: the board is rendered into the home page's HTML from the indexer and revalidated every 20 s, the stats page every 30 s, so visitors do not reach the box one by one; the box itself caches its two hot reads for 3 s and rate limits by address. Postgres is doing tens of rows per second at most; the real ceiling is the public RPC, which is why the scans are incremental and windowed.

11. The site

Next.js on Vercel, plain CSS, two fonts. All chain reads happen in server routes; all chain writes happen in the browser through the user's wallet (EIP-6963 discovery for EVM wallets, Phantom for Solana). Secrets (OKX keys, the indexer secret) live on the server only.

/api/board
the indexer's launches, newest first
/api/pons/launch
launchFee, launchEnabled, previewLaunchEconomics, allowlist, read live with retry and a last good fallback
/api/curve/[curve]
reserves, sellable, feeBps, creatorTaxBps, graduated
/api/launched
pushes a launch transaction to the indexer
/api/upload, /i/[id]
artwork in, artwork out
/api/xchain/quote, /api/xchain/status
Relay quote and delivery status
/api/okx/swap, /api/okx/aggquote
OKX aggregator swap and quote on chain 4663
/api/solana/rpc
read only Solana JSON-RPC pass-through for building the Solana transaction

12. Trust model and failure modes

13. Known limits

14. Roadmap

  1. PONS v2 curve, unchanged

    shipped

    The bonding curve is the part that already works. We do not fork it and we do not tune it.

  2. Launch page

    shipped

    Name, ticker, description, image, socials, paired asset. One button, shaped like Pons's own create page.

  3. Launch on the PONS v2 factory

    shipped

    Deploy from the browser onto the live factory on Robinhood Chain, in ETH or in the stock itself. The board reads real curves.

  4. Buy and sell on the curve from the site

    shipped

    Every token launched here has a page with a live trade panel on its PONS v2 curve, in ETH or the paired stock. Launches can open with a developer buy through Pons's router.

  5. Pay from any chain

    shipped

    The first tab on every token page. Pick the chain and the asset (SOL, the xStocks, USDC, ETH, BNB, POL), connect the wallet for that chain (Phantom for Solana, your EVM wallet elsewhere), choose where the token lands, and sign. Relay carries it into ETH on Robinhood Chain in about a second, OKX swaps it into the paired stock when the curve needs one, the curve buys.

  6. Stats

    shipped

    Every launch and curve trade on the PONS v2 factory, counted from the chain by our indexer and shown factory wide, with anychain.fun's own launches beside them.

  7. bStocks on BNB Chain

    next

    BNB Chain bStocks as a payment source, once their contract addresses are verified on chain.

15. Addresses

All on Robinhood Chain, chain id 4663, unless stated.

PonsV2LaunchFactoryverified source on Blockscout; launches, allowlist, config, fee
0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e
PonsV2LaunchAndBuy (router, launchForwarder)verified; launch plus opening buy in one transaction
0xe33E9E479dF8802cb0866d5d05258bEc4cF62948
Fee policy / meme hookthe curve's feePolicy; the Uniswap V4 hook after graduation
0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044
Fee escrowwhere swept fees settle
0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e
Buyback vaultbuyback and lock route for creator fees
0x42df2a798f82289E177311362e8f5ccC45c1219c
Lockerholds the graduated pool position
0x267444D099b10fB5Ed7c3Cc7B7c767AdcA574952
Uniswap V4 PoolManagergraduated curves become V4 pools here
0x8366a39CC670B4001A1121B8F6A443A643e40951
Launch deployerthe factory's CREATE2 deployer for tokens and curves
0x3711ceA4feaDE896C913C68F01Eda97Cb06D1A42
Factory owner, protocol fee recipientPons
0x263ed295dAFaE1d9AAdD6E56c4B6F9f38eE019Dd
USDG6 decimal stable used as a quote asset by other launchers
0x5fc5360d0400a0fd4f2af552add042d716f1d168
OKX aggregator approval contract (chain 4663)spender for ERC-20 inputs to OKX swaps
0x42170295F1173c9e5874ea9d00c6d137E1a4f53d
SPY (tokenized equity)example paired asset; graduates at 10.9 shares
0x117cc2133c37B721F49dE2A7a74833232B3B4C0C
TSLA (tokenized equity)example paired asset; graduates at 26 shares
0x322F0929c4625eD5bAd873c95208D54E1c003b2d
Relay chain idsorigin ids used in quotes
Solana 792703809, Ethereum 1, Base 8453, BNB Chain 56, Polygon 137, Robinhood Chain 4663
anychain salt tagfirst 8 bytes of every salt the site sends
0x54cadb5bb321177e

The 53 approved paired assets with their per asset economics are listed on the docs page, read from the factory.