Watches ponsfamily.com (Pons, a token launchpad on Robinhood Chain, chain ID 4663) for newly launched tokens and snipes them at the moment of launch, then sells automatically once the price hits your take-profit target.
- Detect — polls the Pons factory contract for
TokenLaunchedevents everyFACTORY_POLL_MS(default 2s) — no waiting to observe buy activity first, every fresh launch is immediately actionable. - Filter — only buys if the token's current market cap (price × total
supply, in USD) is between
MIN_MARKET_CAP_USDandMAX_MARKET_CAP_USDat the moment of the snipe attempt. - Buy — wraps native ETH into the pool's pair token, approves the
router, and swaps in ~
BUY_AMOUNT_USDworth (1% fee tier, SwapRouter02'sexactInputSingle). - Sell — sells the full position the moment price reaches
TAKE_PROFIT_MULTIPLEx entry (default 3x = +200%). That's the only automatic exit — no stop-loss, no inactivity timeout. Positions that are flat, losing, or have gone quiet are left open for you to close manually (e.g. vianpm run statusto check unrealized P&L, then a manual sell).
State (seen tokens, open/closed positions, last-scanned blocks) is kept in
state.json so the bot can be restarted without re-processing history or
losing track of open positions.
Bankr's wallet API only signs/submits transactions on Ethereum, Polygon, Base, and Unichain (chain IDs 1, 137, 8453, 130). Robinhood Chain (4663) isn't one of them, so this bot holds and signs its own key for that chain specifically, using viem directly against Pons's contracts.
npm install
cp .env.example .env
npm run gen-wallet # generates a fresh burner keypair and prints setup stepsgen-wallet prints an address and private key, and refuses to run again once
PRIVATE_KEY is already set in .env (so it won't clobber a funded wallet).
Paste the private key into .env, then send a small amount of ETH to the
printed address on Robinhood Chain — enough to cover gas plus however many
$1 buys you expect to make concurrently (e.g. $10-20 to start).
Edit .env to taste. Key parameters:
| Var | Meaning | Default |
|---|---|---|
BUY_AMOUNT_USD |
Size of each buy | 1 |
FACTORY_POLL_MS |
How often to check for new launches (lower = closer snipe, more RPC load) | 2000 |
MAX_CONCURRENT_POSITIONS |
Caps simultaneous open positions | 3 |
TAKE_PROFIT_MULTIPLE |
Sell trigger, as a multiple of entry price | 3 (= +200%) |
STOP_LOSS_PCT |
Unused — no automatic stop-loss (kept for reference) | 0 |
MIN_MARKET_CAP_USD / MAX_MARKET_CAP_USD |
Only buy if current market cap falls in this range (no floor by default — new launches start near zero) | 0 / 6000 |
SLIPPAGE_BPS |
Slippage tolerance on buy/sell swaps | 3000 (30%) |
DRY_RUN |
If true, logs intended trades without spending anything | true |
npm startLeave DRY_RUN=true for your first run and watch the logs for a while:
[detect] new launch: ...— a new token was picked up[detect] buy signal: ...— it crossed the buy-count threshold[dry-run] would BUY .../[dry-run] would SELL ...— what the bot would have done
Once the detection logic looks sane, set DRY_RUN=false to let it actually
trade. The process needs to keep running (it's a local script, not a hosted
job) — use pm2, a background terminal, Windows Task Scheduler, or similar
if you want it to survive terminal closes/reboots.
- New/low-liquidity tokens are frequently rugs or go to zero. The
"N buys in a window" signal is a weak proxy for legitimacy — it can be
gamed by a deployer buying their own token with multiple wallets. Keep
BUY_AMOUNT_USDsmall; that's your real risk control here, not the signal. Ponsfamily allows anyone to launch a token and there's no vetting process, so expect a high rate of tokens that never recover. - Honeypots / transfer taxes. Some tokens make selling revert or heavily tax it. The bot doesn't detect this ahead of time; a stuck position will just never hit the sell condition (or the sell tx will revert, logged as an error, and it'll retry next poll cycle).
- Slippage estimate is approximate.
estimateMinOutprices off the pool's current spot price, not a true pre-trade quote, so it doesn't account for this trade's own price impact on very shallow pools. That's why the default tolerance is generous (30%); tightening it risks failed buys on legitimately volatile new pools, loosening it risks worse fills. - Router is confirmed
SwapRouter02(verified source on robinhoodchain.blockscout.com), which is whyswapRouterAbiomits thedeadlinefield the originalSwapRouterhas — including it produces a selector matching no real function and reverts every swap. Confirmed working with real transactions as of this fix. - Market cap gating uses a rough spot-price estimate, not a true pre-trade quote — same caveats as the slippage estimate below.
- Only fund what you can afford to lose. This is a burner wallet for a bot trading unvetted new tokens on a new chain — treat it accordingly.
src/config.ts— env-driven configurationsrc/abis.ts— factory/pool/router/ERC20 ABIssrc/chain.ts— viem public/wallet clients for Robinhood Chainsrc/generateWallet.ts— burner wallet generator (npm run gen-wallet)src/state.ts— JSON state persistencesrc/priceOracle.ts— ETH/USD pricing (for sizing the $ buy amount)src/detector.ts— factory log polling, new-launch detectionsrc/trader.ts— buy/sell execution and take-profit monitoringsrc/index.ts— main loop wiring it all together