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.
- PonsV2LaunchFactory at 0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e. Deploys a token and a curve per launch through a CREATE2 deployer, holds the launch configuration, the paired asset allowlist, the launch fee and the launch enabled flag, and graduates curves into Uniswap V4.
- PonsV2LaunchAndBuy at 0xe33E9E479dF8802cb0866d5d05258bEc4cF62948. The factory's launchForwarder: launches on the caller's behalf through launchTokenFor and performs the opening buy in the same transaction.
- PonsV2BondingCurve, one per launch. Holds the token supply and the quote asset, prices trades by constant product over virtual reserves, accrues fees, and hands its reserves to the factory at graduation.
- PonsV2LauncherToken, one per launch. A standard ERC-20 that also exposes logo(), description() and socials() as stored at launch.
- Fee policy and hook at 0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044, fee escrow at 0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e, buyback vault at 0x42df2a798f82289E177311362e8f5ccC45c1219c, locker at 0x267444D099b10fB5Ed7c3Cc7B7c767AdcA574952, and the Uniswap V4 PoolManager at 0x8366a39CC670B4001A1121B8F6A443A643e40951.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Launch scan, every 4 s: TokenLaunched logs on the factory from a stored cursor, in windows of 49,000 blocks; for each log the launch transaction is fetched and decoded (launchToken on the factory or launchAndBuy on the router; other callers are skipped) and kept when the salt carries the tag. Stored: token, curve, deployer, pair token and its symbol and decimals, graduation threshold, name, symbol, description, logo, socials, salt, block, transaction, timestamp, creator tax.
- Push: the launch page posts its transaction hash the moment the receipt lands, so the row exists before the link to the token page is shown. If a page is opened before that, it reads the launch straight from the chain (the factory log for that token, the tag check, the strings, the curve numbers) and never shows a blank.
- Metrics, every 8 s per launch: realQuoteReserve, getReserves, readyToGraduate, and CurveBuy logs since the last pass for distinct buyers. Raised, progress, spot price, graduated and buyers come from this.
- Factory wide stats, every 60 s: every TokenLaunched log (not only tagged ones) into a launches table, and CurveBuy and CurveSell logs for the curves launched in the last 24 hours, scanned incrementally in address batches, splitting any window that trips the 10,000 match cap. The stats page reads the aggregates.
- Images: token artwork uploaded on the launch page is stored by content hash and served back under the site's origin, so the URL written on chain is stable.
- Removal: a launch can be deleted from the site on the operator's word and blocked from re-indexing. The chain keeps it.
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
- No custody. The site never holds funds or keys. A buyer's assets move source wallet to Relay's contracts to the buyer's Robinhood Chain wallet to the curve, each hop signed by the buyer.
- Contracts. PONS v2 is unaudited by Pons's own statement. Its factory owner can change the launch fee, the allowlist, the configuration and the launch enabled flag; a pinned expectedEconomics protects a launch in flight from a mid transaction change, nothing protects against future changes.
- If Relay fails to deliver, funds are refunded to the source wallet by Relay; the site reports failure or refund and stops.
- If the OKX swap or the curve buy fails after landing, the ETH (or the stock) is already in the buyer's Robinhood Chain wallet and can be traded from the Buy tab or anywhere else. Nothing is stuck in a site contract, because there is none.
- Prices shown before a signature are the curve's own arithmetic on live reserves and Relay's or OKX's live quotes, bounded on execution by minTokensOut and slippage parameters; a move beyond the bound reverts rather than fills badly.
- The indexer is a convenience, not an oracle: every number it serves can be recomputed from the chain, and the trade panel reads the curve live regardless.
13. Known limits
- The public RPC keeps about 2.3 days of logs, so factory wide statistics have 24 and 48 hour windows only, and the indexer cannot backfill launches older than that. An archival RPC would lift this.
- bStocks on BNB Chain are not offered as a source yet because their contract addresses have not been verified.
- The Solana leg needs an injected Phantom style wallet; wallet standard discovery is not implemented.
- Buyer counts are distinct CurveBuy recipients since launch, not current holders.
- The cross chain flow is verified by live quotes and contract simulation, and by launches and curve buys made through the site; it has not yet carried a real cross chain payment end to end at the time of writing.
14. Roadmap
PONS v2 curve, unchanged
shippedThe bonding curve is the part that already works. We do not fork it and we do not tune it.
Launch page
shippedName, ticker, description, image, socials, paired asset. One button, shaped like Pons's own create page.
Launch on the PONS v2 factory
shippedDeploy from the browser onto the live factory on Robinhood Chain, in ETH or in the stock itself. The board reads real curves.
Buy and sell on the curve from the site
shippedEvery 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.
Pay from any chain
shippedThe 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.
Stats
shippedEvery 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.
bStocks on BNB Chain
nextBNB 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.