Skip to content

Repository files navigation

pons-sniper

Open-source bot for buying tokens launched on pons (Robinhood Chain, chain id 4663).

Manage each sniper wallet with independent execution and exit rules.

Generation Launch venue Entry behavior Exit venue
v1 Uniswap v3 Targets restricted blocks N+1 and N+2 within the token limits Same v3 pool
v2 Bonding curve Verifies configured wallet exemptions and enters immediately Curve before graduation

The current v1 and v2 factories are monitored.

Features

  • Hard-filters launches to one required SNIPE_TARGET_WALLET.
  • Supports any number of independently configured wallets for v1.
  • Uses up to the first 32 credentials marked whitelisted: true for v2.
  • Quotes every wallet as though it lands behind its sibling wallets.
  • Starts entries in configurable batches instead of one unbounded RPC burst.
  • Requotes v2 between completed batches and sells wallets sequentially.
  • Supports fixed-percent or live automatic slippage.
  • Supports per-wallet buy size, sell percentage, take-profit, and stop-loss.
  • Defaults generated wallets to no take-profit or stop-loss.
  • Sends transactions by default (DRY_RUN=false).

Strategy guide

docs/STRATEGY.md is the detailed explanation of how and why the bot enters and exits positions. It covers the v1 N+1/N+2 restriction window, v2 exemption verification and public tax timing, multi-wallet batching, worst-order slippage protection, curve sizing, graduation behavior, and the remaining protocol risks. Read it before changing timing, tax, batching, or execution settings.

v1 restricted-block entry

The v1 launch block is N. Ordinary wallets cannot buy in that block. Blocks N+1 and N+2 allow buys while enforcing the token's wallet and cumulative purchase limits—currently 5% and 5.5% of supply.

The bot targets N+1, then retries failed wallets around N+2. Restricted entries use an exact-output v3 swap capped one basis point inside the wallet's remaining allowance. Each wallet sends at most its configured buyAmount, and unused ETH is refunded. Failed restricted entries retain one exact-input fallback after restrictionsEndBlock.

V1 does not expose a persistent creator-managed exemption list. Its only exemption is the creator's atomic initial buy inside the launch transaction.

v2 exemption entry

V2 supports up to 32 persistent snipe-tax exemptions. The bot takes the first 32 credentials marked whitelisted: true in file order. Before sending, it still verifies currentSnipeTaxBps(recipient) for each wallet. A configuration flag therefore cannot make an unexempted wallet accidentally pay the opening tax.

Run npm run wallets to print the exact addresses to paste into the v2 launch form.

Setup

Requirements: Node.js 20 or newer and dedicated funded wallets.

git clone https://github.com/YOUR_USERNAME/pons-sniper.git
cd pons-sniper
npm install
cp .env.example .env

Configure the RPC and creator wallet in .env (recommend using Alchemy for RPC provider):

RPC_HTTP_URL=https://robinhood-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_API_KEY
RPC_WS_URL=wss://robinhood-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_API_KEY
CREDENTIALS_FILE=credentials.json
SNIPE_TARGET_WALLET=0x...
PONS_VERSIONS=v1,v2
DRY_RUN=false

Generate wallets safely:

npm run generate-wallets -- 5

The command creates credentials.json if needed and appends five new wallets. It never removes existing entries, reuses an existing name, or prints private keys. Both .env and credentials.json are gitignored.

You can also import existing wallets by adding them directly to credentials.json using the schema below. Each publicKey must be the EVM address derived from its corresponding privateKey, and wallet names, private keys, and public addresses must remain unique.

credentials.json is the only wallet source. Startup fails if it is missing or contains no entries.

credentials.json

The root is a JSON array. publicKey is the wallet's EVM address used for pons whitelisting—not the raw secp256k1 public key.

[
  {
    "name": "Wallet 1",
    "privateKey": "0x...",
    "publicKey": "0x...",
    "buyAmount": "0.1",
    "sellAmount": "100%",
    "slippage": "auto",
    "takeProfit": null,
    "stopLoss": null,
    "whitelisted": false
  }
]
Field Format
name Unique, case-insensitive wallet label
privateKey 32-byte hex private key
publicKey Matching 20-byte EVM address
buyAmount Decimal WETH/ETH budget, such as "0.1"
sellAmount Position percentage sold once when an exit rule fires
slippage Percentage such as "3%", or "auto"
takeProfit Cost-basis threshold such as "250%", "2.5x", or 2.5; null disables it
stopLoss Cost-basis threshold such as "50%", "0.5x", or 0.5; null disables it
whitelisted Makes the entry eligible for the v2 exemption set

Generated defaults are 0.1 buy amount, 100% sell amount, automatic slippage, no take-profit, no stop-loss, and whitelisted: false.

Automatic slippage starts at 1%, increases by one quarter of the live first-versus-last sibling-wallet quote difference, and is capped at 25%. The worst sibling fill itself is already included in the transaction bound. V1 accounts for every pending sibling before staggered broadcasts; v2 accounts for the current batch and refreshes live curve state before starting the next one.

The private key, public address, duplicate names, duplicate wallets, percentages, and trigger ranges are validated before startup.

Running

npm run wallets  # Validate wallet settings, show balances, and print the v2 whitelist
npm run verify   # Run read-only chain, contract, quote, and funding checks
npm start

Optionally, set DRY_RUN=true to validate the complete flow without broadcasting transactions, then restore DRY_RUN=false when ready.

Credential takeProfit and stopLoss values determine whether automatic exit rules are active for each wallet. sellAmount determines how much is sold when a rule fires. V2 graduation safety may still force a full exit because the curve's sell side closes before graduation. Post-graduation v2 Uniswap v4 routing is not implemented.

Commands

Command Purpose
npm start Run the sniper
npm run generate-wallets -- 5 Append five new credential wallets
npm run wallets Print wallet settings, balances, and the v2 exemption list
npm run verify Validate contracts, event decoding, and live quotes
npm run typecheck Check TypeScript without emitting files
npm run listen -- 120 Observe launch events without trading
npm run autosize -- 0.005 Set each wallet's balance-minus-reserve buy size
npm run simulate -- 0.1 200 Model v2 launch sizing
npm run calibrate Sample the next v2 tax window

Safety

  • Use wallets funded only with what you can lose.
  • Never commit .env or credentials.json.
  • DRY_RUN=false sends irreversible transactions.
  • Positions and realised PnL are in memory; restarts do not recover them.
  • Wallets are submitted in configurable batches. Large wallet counts still increase RPC usage and cause later batches to land later.
  • Automatic exits are processed sequentially and requoted after each preceding wallet settles, preventing sibling sells from invalidating later quotes.
  • Quotes and simulations reduce risk but cannot eliminate price movement, RPC failures, sequencer ordering, or contract risk.

Use at your own risk. Launched tokens can lose all value.

License

MIT

Releases

Packages

Contributors

Languages