@parabolicfamily/mcp 0.1.8 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +72 -14
  2. package/abi/ParabolicAggregatorRouter.json +2259 -0
  3. package/abi/ParabolicLaunchFactoryV2.json +2542 -0
  4. package/abi/ParabolicPairProbe.json +429 -0
  5. package/abi/ParabolicRouterV2.json +1171 -0
  6. package/abi/ParabolicSessionModule.json +2317 -0
  7. package/abi/deployments.json +258 -0
  8. package/dist/abi.d.ts +3 -3
  9. package/dist/abi.js +3 -3
  10. package/dist/abi.js.map +1 -1
  11. package/dist/chain.d.ts +12 -1
  12. package/dist/chain.js +13 -4
  13. package/dist/chain.js.map +1 -1
  14. package/dist/chains.d.ts +17 -10
  15. package/dist/chains.js +21 -16
  16. package/dist/chains.js.map +1 -1
  17. package/dist/coins.js +2 -1
  18. package/dist/coins.js.map +1 -1
  19. package/dist/config.d.ts +36 -11
  20. package/dist/config.js +98 -20
  21. package/dist/config.js.map +1 -1
  22. package/dist/deployed.d.ts +80 -0
  23. package/dist/deployed.js +95 -0
  24. package/dist/deployed.js.map +1 -0
  25. package/dist/docs.d.ts +13 -0
  26. package/dist/docs.js +68 -12
  27. package/dist/docs.js.map +1 -1
  28. package/dist/format.d.ts +2 -1
  29. package/dist/format.js +3 -2
  30. package/dist/format.js.map +1 -1
  31. package/dist/parabolic.d.ts +18 -0
  32. package/dist/parabolic.js +65 -13
  33. package/dist/parabolic.js.map +1 -1
  34. package/dist/quote-unit.js +49 -28
  35. package/dist/quote-unit.js.map +1 -1
  36. package/dist/referrals.d.ts +77 -0
  37. package/dist/referrals.js +55 -0
  38. package/dist/referrals.js.map +1 -0
  39. package/dist/restapi.d.ts +4 -3
  40. package/dist/restapi.js +19 -4
  41. package/dist/restapi.js.map +1 -1
  42. package/dist/routed.d.ts +389 -0
  43. package/dist/routed.js +413 -0
  44. package/dist/routed.js.map +1 -0
  45. package/dist/server.d.ts +1 -1
  46. package/dist/server.js +91 -7
  47. package/dist/server.js.map +1 -1
  48. package/dist/tx.d.ts +6 -0
  49. package/dist/tx.js +12 -2
  50. package/dist/tx.js.map +1 -1
  51. package/dist/venues.d.ts +49 -0
  52. package/dist/venues.js +44 -0
  53. package/dist/venues.js.map +1 -0
  54. package/package.json +2 -2
  55. package/src/abi.ts +3 -4
  56. package/src/chain.ts +19 -4
  57. package/src/chains.ts +33 -20
  58. package/src/coins.ts +2 -1
  59. package/src/config.ts +112 -22
  60. package/src/deployed.ts +128 -0
  61. package/src/docs.ts +70 -12
  62. package/src/format.ts +3 -2
  63. package/src/parabolic.ts +69 -13
  64. package/src/quote-unit.ts +47 -6
  65. package/src/referrals.ts +61 -0
  66. package/src/restapi.ts +18 -4
  67. package/src/routed.ts +499 -0
  68. package/src/server.ts +123 -7
  69. package/src/tx.ts +13 -2
  70. package/src/venues.ts +93 -0
package/README.md CHANGED
@@ -22,6 +22,51 @@ and whether `<ticker>.parabolic.family` is free. It is advice and not a gate —
22
22
  unique symbol — and the hostname is the one exclusive thing, held by the oldest coin with that ticker. The
23
23
  ticker is normalised the way the site normalises it, so an impossible one is refused before a request is spent.
24
24
 
25
+ ## What changed in 0.2.1
26
+
27
+ No tool changed. The dependency tree is refreshed (`@modelcontextprotocol/sdk` 1.32.1, and the patched
28
+ `proxy-addr`, `ip-address` and `fast-uri` under it), so `npm audit` on an install reads clean, and a failed RPC
29
+ call now writes the endpoint's host to stderr rather than its whole URL, so a keyed endpoint's key stays out of
30
+ the server's own log as well as out of the answer.
31
+
32
+ ## What changed in 0.2.0
33
+
34
+ Five tools for coins made on **other launchpads** (pons on Robinhood Chain, SolonPad on Arc), traded through
35
+ Parabolic's aggregator router; every call that worked in 0.1.9 works unchanged.
36
+
37
+ - `parabolic.list_venue_coins` reads that launchpad's subgraph when `PARABOLIC_SUBGRAPH_URL_PONS_RHC` (or
38
+ `..._SOLONPAD_ARC`) is set.
39
+ - `parabolic.quote_routed_buy` / `quote_routed_sell` and `build_routed_buy_tx` / `build_routed_sell_tx` encode
40
+ `ParabolicAggregatorRouter.buy` / `sell` byte for byte as the site does, with no fee voucher and, for an ERC-20
41
+ input, an exact-amount approval of the router in place of the site's Permit2 signature. The coin lives on the
42
+ other launchpad's contracts; the router charges Parabolic's routed fee (its `defaultFeeBps`, 60 bps at deploy)
43
+ on top of that launchpad's own, and every answer shows both.
44
+ - They refuse, by name, until the chain's deployment record carries the router under `aggregator`, when the
45
+ router has the launchpad switched off, when the coin is not that launchpad's, and when any read fails.
46
+
47
+ ## What changed in 0.1.9
48
+
49
+ 0.1.9 makes **Robinhood Chain (4663) a chain this server serves**. Every call that worked before works
50
+ unchanged and means the same chain it meant: an unqualified address is still Arc, permanently.
51
+
52
+ - **Set `PARABOLIC_CHAIN_ID=4663` and nothing else.** The chain's public RPC, its factory and its start
53
+ block ship with the package, read from the deploy's own record rather than typed in. Until 0.1.9 the
54
+ server answered `chain: "rhc"` with "Parabolic is not deployed on Robinhood Chain yet", which had been
55
+ false since 19 September 2026, and an operator who set the chain id got Arc's RPC and no factory.
56
+ - **`list_coins` reaches that board.** One site serves both, and it answers for its own chain when nothing
57
+ names one, so the listing now names the chain (`?chain=rhc`) the way the Telegram bot does. Arc's URLs
58
+ are byte-identical to what they have always been, because Arc's prefix is empty.
59
+ - **No routed buy there yet.** The chain deploys `ParabolicRouter`, which takes the referral code and the
60
+ note as arguments; `ParabolicMemoRouter` is Arc's and the two share no function selector, so this
61
+ package encodes no routed call on chain 4663. `build_buy_tx` goes straight to the curve and
62
+ `build_launch_tx` to the factory, which is the same call on every chain. The referral share itself is
63
+ paid on that chain, credited by the indexer through the same ledger as Arc's memo, so what is missing
64
+ here is the encoder and not the payout: `parabolic.docs` and the buy payload both say so, and passing
65
+ `memo` is refused by name rather than by asking for a variable that must stay unset.
66
+ - **`parabolic.docs` states Arc mainnet as live.** It described chain 5042 as "unofficial until Circle
67
+ publishes it" and Arc's launch fee as 1e18; mainnet has been public since 16 September 2026 and the fee
68
+ has been 0 since the 19th. The fee is read from the factory and never written down.
69
+
25
70
  ## What changed in 0.1.7 (for an existing consumer: nothing has to)
26
71
 
27
72
  0.1.7 makes the server chain-aware. **Every call that worked in 0.1.6 works unchanged and means the same
@@ -52,13 +97,13 @@ mainnet by mistake, and `protocol_stats` reports the chain and RPC host the serv
52
97
 
53
98
  | Variable | Meaning | Default |
54
99
  |---|---|---|
55
- | `PARABOLIC_CHAIN_ID` | 5042002 Arc Testnet, 5042 Arc mainnet | `5042` |
56
- | `PARABOLIC_RPC_URL` | Arc JSON-RPC endpoint | the public endpoint for the chain id |
100
+ | `PARABOLIC_CHAIN_ID` | 5042 Arc mainnet, 5042002 Arc Testnet, 4663 Robinhood Chain | `5042` |
101
+ | `PARABOLIC_RPC_URL` | JSON-RPC endpoint | the public endpoint for the chain id |
57
102
  | `PARABOLIC_FACTORY` | `ParabolicLaunchFactory`: coin lookups and launch transactions | the deployment for the chain id |
58
- | `PARABOLIC_MEMO_ROUTER` | `ParabolicMemoRouter`: the atomic launch-and-buy and the referral-carrying buy | the deployment for the chain id |
103
+ | `PARABOLIC_MEMO_ROUTER` | `ParabolicMemoRouter`: the atomic launch-and-buy and the referral-carrying buy. Refused on a chain whose record deploys `ParabolicRouter` and no memo router, because the two share no function selector and a routed build against that address would revert | the deployment for the chain id |
59
104
  | `PARABOLIC_EURC` | EURC address, only for EURC-quoted coins | the deployment for the chain id |
60
105
  | `PARABOLIC_SUBGRAPH_URL` | Subgraph endpoint: richer listings, holders, 24h volume, protocol stats | unset (the public API is used instead) |
61
- | `PARABOLIC_EXPLORER_URL` | Block explorer the address and transaction links are built from | Arcscan for the chain id; Arc mainnet's host is unconfirmed |
106
+ | `PARABOLIC_EXPLORER_URL` | Block explorer the address and transaction links are built from | the explorer for the chain id |
62
107
  | `PARABOLIC_HOOK` | `ParabolicHook` address | read from `factory.memeHook()` |
63
108
  | `PARABOLIC_ARC_MEMO` | Arc `Memo` system contract | `0x5294E9927c3306DcBaDb03fe70b92e01cCede505` |
64
109
  | `PARABOLIC_AGENT_REGISTRY` | Arc's ERC-8004 `IdentityRegistry`: `agent_status`, `build_register_agent_tx` and the `pair: "Agents"` listing filter | the registry Arc publishes for the chain id (Arc Testnet only, today) |
@@ -66,7 +111,8 @@ mainnet by mistake, and `protocol_stats` reports the chain and RPC host the serv
66
111
  | `PARABOLIC_FACTORY_START_BLOCK` | First block of the `TokenLaunched` scan, used only when neither a subgraph nor the API is available | the factory's deployment block |
67
112
 
68
113
  The API default follows the chain: Arc Testnet reads the testnet site (`https://parabolic-testnet.vercel.app/api/v1`,
69
- live testnet data), Arc reads `https://www.parabolic.family/api/v1`. Running against a fork or your own
114
+ live testnet data), Arc and Robinhood Chain both read `https://www.parabolic.family/api/v1`, which serves
115
+ both boards and is asked for the right one by name. Running against a fork or your own
70
116
  factory: the server skips the site's API automatically whenever `PARABOLIC_FACTORY` differs from the
71
117
  built-in address for the chain or `PARABOLIC_RPC_URL` points anywhere but the chain's own endpoint, and
72
118
  reads the chain instead. To force that for any other reason, set `PARABOLIC_API_URL=""`.
@@ -77,11 +123,11 @@ with source, before you sign anything:
77
123
 
78
124
  | Contract | Arc Testnet (5042002) |
79
125
  |---|---|
80
- | `ParabolicLaunchFactory` | [`0x2E06eD99bD7D164458847D186B282B23700b2C63`](https://testnet.arcscan.app/address/0x2E06eD99bD7D164458847D186B282B23700b2C63) |
81
- | `ParabolicMemoRouter` | [`0x1381567ea31a094e64f6B39Bd880d0b59c48e08F`](https://testnet.arcscan.app/address/0x1381567ea31a094e64f6B39Bd880d0b59c48e08F) |
82
- | EURC (test token) | [`0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a`](https://testnet.arcscan.app/address/0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a) |
83
- | Arc `Memo` (system) | [`0x5294E9927c3306DcBaDb03fe70b92e01cCede505`](https://testnet.arcscan.app/address/0x5294E9927c3306DcBaDb03fe70b92e01cCede505) |
84
- | ERC-8004 `IdentityRegistry` (Arc's) | [`0x8004A818BFB912233c491871b3d84c89A494BD9e`](https://testnet.arcscan.app/address/0x8004A818BFB912233c491871b3d84c89A494BD9e) |
126
+ | `ParabolicLaunchFactory` | [`0x2E06eD99bD7D164458847D186B282B23700b2C63`](https://explorer.testnet.arc.io/address/0x2E06eD99bD7D164458847D186B282B23700b2C63) |
127
+ | `ParabolicMemoRouter` | [`0x1381567ea31a094e64f6B39Bd880d0b59c48e08F`](https://explorer.testnet.arc.io/address/0x1381567ea31a094e64f6B39Bd880d0b59c48e08F) |
128
+ | EURC (test token) | [`0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a`](https://explorer.testnet.arc.io/address/0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a) |
129
+ | Arc `Memo` (system) | [`0x5294E9927c3306DcBaDb03fe70b92e01cCede505`](https://explorer.testnet.arc.io/address/0x5294E9927c3306DcBaDb03fe70b92e01cCede505) |
130
+ | ERC-8004 `IdentityRegistry` (Arc's) | [`0x8004A818BFB912233c491871b3d84c89A494BD9e`](https://explorer.testnet.arc.io/address/0x8004A818BFB912233c491871b3d84c89A494BD9e) |
85
131
 
86
132
  The identity registry is **Arc's contract, not ours**: Arc deploys it, documents it and can change it.
87
133
  It is an ERC-1967 proxy, so the implementation behind that address is upgradeable by Arc. Parabolic only
@@ -92,6 +138,12 @@ Arc mainnet (5042), deployed 16 September 2026 at block 21,105,294: factory
92
138
  source verified on Sourcify. Arc has published no identity registry for mainnet, so on chain 5042
93
139
  `agent_status` says there is no registry rather than reporting a wallet as unregistered.
94
140
 
141
+ Robinhood Chain (4663), deployed 19 September 2026: factory
142
+ `0x25c9cFa179256A29f84b9Fd0DcF7cB2ff24b473d`, quoted in USDG (`0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168`,
143
+ six decimals, Paxos), gas paid in ETH, source verified on Sourcify. Gas there is not a dollar, so a launch
144
+ fee or a balance on that chain is never a figure in dollars, and no identity registry exists. The chain's
145
+ `ParabolicRouter` is deliberately not configured here; see 0.1.9 above.
146
+
95
147
  ### Claude Code
96
148
 
97
149
  ```sh
@@ -149,16 +201,22 @@ Arguments are strict: a key a tool does not know fails with `Unrecognized key` i
149
201
  | Tool | Purpose |
150
202
  |---|---|
151
203
  | `parabolic.list_coins` | `{ status?: "climbing" \| "graduated", sort?: "trending" \| "new" \| "near_graduation" \| "market_cap", limit?, pair?: "USDC" \| "EURC" \| "Agents" }`. Subgraph when configured, otherwise Parabolic's public read API; a `TokenLaunched` log scan only when both are unavailable. `pair` is the quote asset, except `"Agents"`, which means the coin's creator holds an ERC-8004 identity: that is read from Arc's registry (one `balanceOf` per creator, over the top 100 of the sort) whatever the listing source is. Without a registry for the chain the result sets `pairFilterApplied: false` and the `source` line says the filter did not run. |
152
- | `parabolic.get_coin` | `{ address }` (token or curve). Name, ticker, creator, curve, status/phase, raised/threshold/progress, price, market cap, holders, pool id, fee terms and 50/30/20 split, snipe-tax window and `currentSnipeTaxBps()`. |
204
+ | `parabolic.get_coin` | `{ address }` (token or curve). Name, ticker, creator, curve, status/phase, raised/threshold/progress, price, market cap, holders, pool id, fee terms and the coin's own split (creator / protocol / buyback as the curve snapshotted them at launch, the buyback leg only while the creator's `buybackEnabled` switch is on), snipe-tax window and `currentSnipeTaxBps()`. |
153
205
  | `parabolic.quote_buy` | `{ address, quoteIn, buyer?, slippageBps? }`. Exact curve math on live reserves: fee, creator tax and snipe tax legs, spot vs effective price, price impact, whether the buy graduates the coin, suggested `minTokensOut`. `buyer` checks the snipe-tax exemption. |
154
206
  | `parabolic.quote_sell` | `{ address, tokensIn, slippageBps? }`. Gross, fee, creator tax, effective price, price impact, suggested `minQuoteOut`. |
155
207
  | `parabolic.build_buy_tx` | `{ address, quoteIn, minTokensOut?, recipient, buyer?, slippageBps?, memo? }` → unsigned `curve.buy(...)` (value = quote on native-USDC curves; an approval step for EURC pairs). `memo: { referral, note? }` returns the memo-routed variant instead (see below). |
156
208
  | `parabolic.build_sell_tx` | `{ address, tokensIn, minQuoteOut?, recipient, slippageBps? }` → unsigned ERC-20 approval + `curve.sell(...)`. |
157
- | `parabolic.build_launch_tx` | `{ name, ticker, image?, description?, socials?, pair?, devBuy?, creatorTaxBps?, creator, buybackEnabled? }`. The `TokenParams` are built exactly like the web Create form (economics pinned with `previewLaunchEconomics`, random salt). With `devBuy` and `PARABOLIC_MEMO_ROUTER` set: one unsigned `ParabolicMemoRouter.launchAndBuy` (value = launch fee + dev buy, `creatorFeeRecipient` zero, `minTokensOut` from the curve math on the launch config; `launchAndBuyWithToken` plus an approval for EURC). Otherwise: unsigned `factory.launchToken(...)` with the launch fee as value and, for a `devBuy`, the follow-up buy calldata to send to the curve from the `TokenLaunched` event. |
209
+ | `parabolic.build_launch_tx` | `{ name, ticker, image?, description?, socials?, pair?, devBuy?, creatorTaxBps?, creator, buybackEnabled? }` (`creatorTaxBps` 0 to 500, the factories' `maxCreatorTaxBps()`). The `TokenParams` are built exactly like the web Create form (economics pinned with `previewLaunchEconomics`, random salt). With `devBuy` and `PARABOLIC_MEMO_ROUTER` set: one unsigned `ParabolicMemoRouter.launchAndBuy` (value = launch fee + dev buy, `creatorFeeRecipient` zero, `minTokensOut` from the curve math on the launch config; `launchAndBuyWithToken` plus an approval for EURC). Otherwise: unsigned `factory.launchToken(...)` with the launch fee as value and, for a `devBuy`, the follow-up buy calldata to send to the curve from the `TokenLaunched` event. |
158
210
  | `parabolic.agent_status` | `{ address }`. Whether the wallet holds an ERC-8004 agent identity on Arc's `IdentityRegistry` (`balanceOf`), how many it holds, and the registry address and chain. On a chain where Arc has published no registry the answer is that fact, with `registered` and `identities` null. |
159
211
  | `parabolic.build_register_agent_tx` | `{ from, metadataURI? }` → unsigned `IdentityRegistry.register(metadataURI)` (no value). The registry mints the ERC-721 identity to the signer, so `from` is the wallet that sends it, and returns the agent id; read it from the `Transfer` log in the receipt. `metadataURI` is a pointer to the agent's metadata stored as `tokenURI` and may be empty. Warns when the wallet already holds an identity. |
160
212
  | `parabolic.protocol_stats` | Subgraph totals (launches, graduations, trades, volume, fees, daily series) plus the factory's live launch fee, curve preset, snipe-tax terms and contract addresses. |
161
213
  | `parabolic.check_ticker` | `{ ticker }`. Whether a Parabolic coin already carries the ticker on **any** chain the site serves, and whether `<ticker>.parabolic.family` is free, read from the site's own route (`/api/v1/studio/ticker` on `PARABOLIC_API_URL`'s site). **Advice, not a gate**: nothing on chain enforces a unique symbol, so `free: false` lists what exists (`taken[]`, each with a `ref` for `get_coin`) and does not stop a launch. The hostname is the one exclusive thing and belongs to the oldest coin carrying the ticker (`hostFree`). A name on the site's reserved list comes back as `reserved` and is not a coin. The ticker is normalised the way the site does it (A-Z and 0-9, case and punctuation ignored, 2 to 10 characters); one outside that is refused before the site is asked. Call it before `build_launch_tx`. |
214
+ | `parabolic.referral_status` | `{ account }`. One wallet's referral payouts on this server's chain, read from the site (`GET /api/v1/referrals/{account}`): per asset, what the indexer has credited, what the latest weekly root publishes, what the referral distributor has paid and what is claimable now, with the `claim(asset, account, cumulative, proof)` arguments when there is a leaf. Read-only; figures are never summed across assets. On a chain with no distributor recorded, referrals are paid by hand and the answer says so. |
215
+ | `parabolic.list_venue_coins` | `{ venue: "pons" \| "solonpad", status?, sort?, limit? }`. Coins made on another launchpad, read from that launchpad's subgraph when `PARABOLIC_SUBGRAPH_URL_<VENUE>_<CHAIN>` is set, with the figures `list_coins` returns plus `venue`, the site's `ref` and whether they can be routed here. They live on that launchpad's contracts, not Parabolic's. |
216
+ | `parabolic.quote_routed_buy` | `{ venue, address, quoteIn, from?, slippageBps? }`. Tokens received for `quoteIn` of the coin's own quote asset, bought through `ParabolicAggregatorRouter` on the launchpad's curve (the router's quote view) or its graduated v4 pool (the chain's V4Quoter), read now, with the launchpad's fee and Parabolic's routed fee (the router's `defaultFeeBps`) both shown. |
217
+ | `parabolic.quote_routed_sell` | `{ venue, address, tokensIn, from?, slippageBps? }`. Money received, after Parabolic's routed fee, for `tokensIn` sold through the router, read now. |
218
+ | `parabolic.build_routed_buy_tx` | `{ venue, address, quoteIn, from, slippageBps?, maxSnipeTaxBps? }` → unsigned `ParabolicAggregatorRouter.buy(trade, noVoucher, "0x", noPermit)`, encoded as the site encodes it: `minOut` from a fresh quote less slippage, recipient = `from`, a five-minute deadline; an ETH-quoted coin sends `quoteIn` as value, a USDG-quoted one returns an exact-amount approval of the router first. Inside a launch window the build is refused and names the tax unless `maxSnipeTaxBps` accepts it. |
219
+ | `parabolic.build_routed_sell_tx` | `{ venue, address, tokensIn, from, slippageBps? }` → unsigned exact-amount approval of the router plus `ParabolicAggregatorRouter.sell(...)`; `minOut` is the money after Parabolic's fee. The four routed tools refuse, by name, until the chain's record carries the router (`aggregator`), when the router has the launchpad off, when the coin is not that launchpad's, and when any read fails. |
162
220
  | `parabolic.docs` | The adopted parameters, curve mechanics, verified Arc facts and this server's configuration, as text. |
163
221
 
164
222
  Every tool above also takes an optional `chain` (see "What changed in 0.1.7"), and every coin argument
@@ -207,7 +265,7 @@ Launch a coin with a $200 dev buy:
207
265
  { "name": "parabolic.build_launch_tx", "arguments": { "name": "Orange Pill", "ticker": "PILL", "image": "ipfs://…", "description": "a frog", "socials": { "twitter": "@robin" }, "creatorTaxBps": 250, "devBuy": "200", "creator": "0xYourWallet" } }
208
266
  ```
209
267
 
210
- With `PARABOLIC_MEMO_ROUTER` set the result is `kind: "launch_and_buy"`: one `tx` to the router (`value` = $1 launch fee + $200), the encoded `params` (`creatorFeeRecipient` zero, as the router requires), the curve `terms` (opening and fully diluted graduation market caps, reserved / pool-seed / locked token shares, snipe-tax window) and `devBuy` (expected and minimum tokens, snipe-tax exempt). Without the router it is `kind: "launch"`: `tx` to the factory (value = the launch fee) and `devBuy` with the calldata for the second, snipe-tax-exempt transaction to the new curve. There is no exemption list: only the creator's own address is exempt from the snipe tax.
268
+ With `PARABOLIC_MEMO_ROUTER` set the result is `kind: "launch_and_buy"`: one `tx` to the router (`value` = the factory's `launchFee()`, 0 on both chains today, + $200), the encoded `params` (`creatorFeeRecipient` zero, as the router requires), the curve `terms` (opening and fully diluted graduation market caps, reserved / pool-seed / locked token shares, snipe-tax window) and `devBuy` (expected and minimum tokens, snipe-tax exempt). Without the router it is `kind: "launch"`: `tx` to the factory (value = the launch fee) and `devBuy` with the calldata for the second, snipe-tax-exempt transaction to the new curve. There is no exemption list: only the creator's own address is exempt from the snipe tax.
211
269
 
212
270
  Check whether a wallet is a registered agent, then register it:
213
271
 
@@ -295,7 +353,7 @@ The source lives in a private repository; the published package ships `src/` alo
295
353
  code is readable from `node_modules`. If you have the repository checked out:
296
354
 
297
355
  ```sh
298
- npm install # reads .npmrc (legacy-peer-deps) to skip a vitest peer-resolution bug on Node 23
356
+ npm install
299
357
  npm run build # -> dist/
300
358
  npm test # vitest: curve math, tx builders, tools against a mocked subgraph and RPC
301
359
  npm run smoke # starts dist/index.js over stdio, initialize + tools/list