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.
- 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: truefor 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).
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.
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 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.
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 .envConfigure 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=falseGenerate wallets safely:
npm run generate-wallets -- 5The 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.
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.
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 startOptionally, 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.
| 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 |
- Use wallets funded only with what you can lose.
- Never commit
.envorcredentials.json. DRY_RUN=falsesends 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.
MIT