| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
An open-source campaign engine for launching and buying your own tokens on Pons on Robinhood Chain (chain ID 4663). It supports Pons v1 and v2, controlled multi-wallet execution, persistent position tracking, and automated exits through the venue where the token currently trades.
(“Pons v1” and “Pons v2” below refer to the two protocol generations, not the application version.)
| Pons generation | Entry venue | Opening behavior | Exit venue |
|---|---|---|---|
| v1 | Uniswap v3 | Restricted attempts in N+1 and N+2, then fallback | Same v3 pool |
| v2 | Bonding curve | Atomic launch-and-buy or tax-aware ordered entries | Curve, then Uniswap v4 |
git clone https://github.com/slightlyuseless/pons-launch-engine.git
cd pons-launch-engine
npm install
cp .env.example .env
cp credentials.example.json credentials.json
cp strategies.example.json strategies.json
cp campaign.example.json campaign.json
cp launch-campaign.example.json launch-campaign.jsonOn PowerShell, replace cp with Copy-Item.
Set your provider URLs in .env. The official Pons and Uniswap contract addresses are built in; the public Robinhood endpoint is used only as a read fallback.
credentials.json contains wallet identity only. A wallet’s entry and exit rules belong in strategies.json, so the same strategy can be reused by many wallets without duplicating secrets.
[
{
"name": "Wallet 1",
"privateKey": "0x...",
"publicKey": "0x..."
}
]publicKey means the wallet’s 20-byte EVM address. It must match the private key. Names, private keys, and addresses must each be unique.
You can import existing wallets by adding them with this schema, or append new wallets without replacing existing entries:
npm run generate-wallets -- 5Generated names start at Wallet 1 and skip every existing name. Private keys are written only to the configured credentials file and are not printed.
Each top-level key in strategies.json is a reusable strategy profile:
{
"opening": {
"entry": {
"amount": "0.1",
"slippage": "auto",
"maxPriceImpact": "20%",
"maxSnipeTax": "0%",
"onPriceLimit": "resize",
"splitOrders": 1
},
"exit": {
"takeProfit": [
{ "at": "2x", "sell": "25%" },
{ "at": "4x", "sell": "50%" }
],
"stopLoss": "50%",
"trailingStop": "20%",
"breakEvenAfter": "2x",
"maxHoldSeconds": null
}
}
}amount uses the pairing asset’s decimals. maxSnipeTax: "0%" is appropriate for verified exempt wallets. A non-exempt wallet waits until the contract’s live recipient tax is at or below its configured maximum. Automatic slippage uses the current quote and impact; every transaction still receives an explicit minimum output.
See docs/STRATEGY.md for entry ordering, v1 restrictions, v2 tax handling, exit precedence, and graduation behavior.
campaign.json selects wallets by name, assigns each a strategy, and defines their execution order. The three modes are:
Use campaign.example.json for monitoring and launch-campaign.example.json for an atomic v2 launch. The example credential is public test data and must never be funded.
CAMPAIGN_FILE in .env remains the default for campaign-aware commands. To select a file for one command, use --campaign <file> or -c <file>. npm needs its own -- separator before flags passed to the engine:
npm run doctor -- --campaign launch-campaign.json
npm run plan -- --campaign launch-campaign.json
npm run launchnpm run launch selects launch-campaign.json automatically. Override it when using a differently named launch file:
npm run launch -- --campaign my-launch.jsonFor a monitoring or direct-token campaign:
npm start -- --campaign campaign.jsonTo create a token programmatically, off-chain assets referenced by its metadata must be uploaded to an IPFS service. A local image path is only meaningful on your computer and cannot be used as the token's public logo. Pons stores the other supplied metadata onchain; the engine uploads the local logo and places the resulting ipfs://CID in the launch transaction.
The launch example supports Pinata IPFS:
PINATA_JWT=YOUR_PINATA_JWT"logoFile": "./assets/token-logo.png"PNG, JPEG, GIF, WebP, and SVG files up to 10 MB are accepted. doctor and plan validate the local file. A real launch uploads it to Pinata's public IPFS and uses the returned URI; a dry run does not upload anything.
If the image is already hosted on IPFS, use "logo": "ipfs://..." instead. Set exactly one of logoFile or logo.
Pons v2 supports at most 32 explicit exemption addresses. The first 32 campaign wallets with exempt: true are included in execution order, excluding addresses the protocol exempts automatically. Atomic-campaign doctor and plan output reports any additional flagged wallets that were omitted. Marking a wallet exempt in JSON does not bypass the contract check: the engine still requires its live recipient tax to be zero before buying, so an omitted wallet waits rather than paying the opening tax.
| Command | Purpose |
|---|---|
| npm run doctor -- --campaign <file> | Validate files, RPC chain, deployed contracts, wallets, and settings for one campaign |
| npm run plan -- --campaign <file> | Preview ordered spends, expected fills, impact, resizing, and skipped entries for one campaign |
| npm run launch | Execute launch-campaign.json as an atomic Pons v2 launch-and-buy campaign |
| npm run launch -- --campaign <file> | Execute a differently named atomic launch campaign |
| npm start -- --campaign <file> | Monitor a deployer or enter a direct target token using that campaign |
| npm run status | Show durable open positions and pending transactions |
| npm run resume -- --campaign <file> | Reconcile pending receipts and resume exit monitoring |
| npm run sell-all -- --yes --campaign <file> | Sequentially liquidate every open position |
| npm run generate-wallets -- 5 | Append five locally generated wallets |
| npm test | Run the local test suite |
| npm run typecheck | Check TypeScript without emitting files |
An optional dry run can be enabled with DRY_RUN=true. Use npm run doctor and npm run plan to inspect configuration and projected execution before any broadcast.
The SQLite state file defaults to state/pons.db. On restart:
Do not delete the state database while positions remain open. The database does not replace wallet ownership; it records what the engine knows about its work.
Read docs/ARCHITECTURE.md for the component and state model.
MIT
| Back | FazBrowse Home | New Git URL |