@parabolicfamily/mcp 0.1.8 → 0.2.0

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 (63) hide show
  1. package/README.md +55 -10
  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 +1955 -0
  7. package/abi/deployments.json +258 -0
  8. package/dist/abi.d.ts +3 -1
  9. package/dist/abi.js +3 -1
  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/config.d.ts +36 -11
  18. package/dist/config.js +98 -20
  19. package/dist/config.js.map +1 -1
  20. package/dist/deployed.d.ts +80 -0
  21. package/dist/deployed.js +95 -0
  22. package/dist/deployed.js.map +1 -0
  23. package/dist/docs.d.ts +13 -0
  24. package/dist/docs.js +68 -12
  25. package/dist/docs.js.map +1 -1
  26. package/dist/parabolic.d.ts +17 -0
  27. package/dist/parabolic.js +55 -8
  28. package/dist/parabolic.js.map +1 -1
  29. package/dist/quote-unit.js +49 -28
  30. package/dist/quote-unit.js.map +1 -1
  31. package/dist/referrals.d.ts +77 -0
  32. package/dist/referrals.js +55 -0
  33. package/dist/referrals.js.map +1 -0
  34. package/dist/restapi.d.ts +4 -3
  35. package/dist/restapi.js +19 -4
  36. package/dist/restapi.js.map +1 -1
  37. package/dist/routed.d.ts +389 -0
  38. package/dist/routed.js +413 -0
  39. package/dist/routed.js.map +1 -0
  40. package/dist/server.d.ts +1 -1
  41. package/dist/server.js +84 -6
  42. package/dist/server.js.map +1 -1
  43. package/dist/tx.d.ts +6 -0
  44. package/dist/tx.js +12 -2
  45. package/dist/tx.js.map +1 -1
  46. package/dist/venues.d.ts +49 -0
  47. package/dist/venues.js +44 -0
  48. package/dist/venues.js.map +1 -0
  49. package/package.json +1 -1
  50. package/src/abi.ts +3 -1
  51. package/src/chain.ts +19 -4
  52. package/src/chains.ts +33 -20
  53. package/src/config.ts +112 -22
  54. package/src/deployed.ts +128 -0
  55. package/src/docs.ts +70 -12
  56. package/src/parabolic.ts +59 -8
  57. package/src/quote-unit.ts +47 -6
  58. package/src/referrals.ts +61 -0
  59. package/src/restapi.ts +18 -4
  60. package/src/routed.ts +499 -0
  61. package/src/server.ts +116 -6
  62. package/src/tx.ts +13 -2
  63. package/src/venues.ts +93 -0
package/dist/config.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { getAddress, isAddress } from "viem";
2
2
  import { CHAINS, chainName } from "./chains.js";
3
+ import { deployedAt, factoryBlock, recordedAggregator, recordedEurc } from "./deployed.js";
4
+ import { VENUE_ENV_VARS, venueSubgraphsFrom } from "./venues.js";
3
5
  /** Arc's system `Memo` contract (CREATE2, zero salt), verified on Arc Testnet; expected to match on mainnet. */
4
6
  export const ARC_MEMO_DEFAULT = "0x5294E9927c3306DcBaDb03fe70b92e01cCede505";
5
7
  /** ERC-20 view of native USDC on Arc (6 decimals, same balance as the 18-decimal native asset). */
@@ -10,29 +12,65 @@ export const DEFAULT_API_URL = "https://www.parabolic.family/api/v1";
10
12
  /**
11
13
  * Deployed Parabolic addresses per chain, so the server is useful with no configuration at all.
12
14
  * The source repository is private; these are the same addresses the site publishes at
13
- * https://www.parabolic.family/docs#contracts and that are verified on Arcscan.
15
+ * https://www.parabolic.family/docs#contracts and that are verified on Sourcify.
14
16
  *
15
- * Arc mainnet (5042) opened on 16 September 2026; Parabolic deployed at block 21,105,294 and these are
16
- * the live addresses (contracts/deployments/5042.json). With them in place the default chain is Arc.
17
+ * **No address is written here** (23 Sep 2026, finding F50). Every one is read out of the deployment
18
+ * record the deploy itself produced, through `abi/deployments.json` (src/deployed.ts). This table was
19
+ * three chains typed by hand and chain two was never typed, so the package shipped for four days telling
20
+ * every agent Parabolic was not deployed on Robinhood Chain; syncing a record is now the whole of adding
21
+ * a chain, and `CHAINS[id].live` follows the same file.
22
+ *
23
+ * What stays written here is what no deploy can answer: the **public** JSON-RPC endpoint an unconfigured
24
+ * agent may call (a record holds the deploy machine's endpoint, which on Arc is a keyed provider's), the
25
+ * site that serves the chain, and Arc's ERC-8004 registry, which is Arc's contract and not one of ours.
17
26
  */
18
27
  export const DEPLOYMENTS = {
19
28
  5042002: {
20
29
  rpcUrl: "https://rpc.testnet.arc.io",
21
- factory: "0x2E06eD99bD7D164458847D186B282B23700b2C63",
22
- memoRouter: "0x1381567ea31a094e64f6B39Bd880d0b59c48e08F",
23
- eurc: "0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a",
24
- startBlock: 61736670,
30
+ factory: deployedAt(5042002, "ParabolicLaunchFactory"),
31
+ memoRouter: deployedAt(5042002, "ParabolicMemoRouter"),
32
+ eurc: recordedEurc(5042002),
33
+ startBlock: factoryBlock(5042002),
25
34
  apiUrl: "https://parabolic-testnet.vercel.app/api/v1",
26
35
  agentRegistry: "0x8004A818BFB912233c491871b3d84c89A494BD9e",
27
36
  },
28
37
  5042: {
29
38
  rpcUrl: "https://rpc.mainnet.arc.io",
30
- factory: "0x27EAeC564fd049E6920C73323ffA7eb6a32A4B1e",
31
- memoRouter: "0x7d642150A222D0F6c98e2fC6bBe86E8Bb6DC90d0",
32
- startBlock: 21105294,
39
+ factory: deployedAt(5042, "ParabolicLaunchFactory"),
40
+ memoRouter: deployedAt(5042, "ParabolicMemoRouter"),
41
+ eurc: recordedEurc(5042),
42
+ startBlock: factoryBlock(5042),
33
43
  apiUrl: DEFAULT_API_URL,
34
44
  // No EURC pair is approved at launch and Arc has published no ERC-8004 registry for mainnet.
35
45
  },
46
+ /*
47
+ * Robinhood Chain, deployed 19 September 2026 and served here since the 23rd.
48
+ *
49
+ * `rpcUrl` is the chain's own public host (CLAUDE.md §4): keyless, and what the indexer, the keeper and
50
+ * the site all read. It prunes state at ten to thirteen minutes of chain time, which is a real limit on a
51
+ * historical read and none at all on the head reads these tools make.
52
+ *
53
+ * `apiUrl` is production, the same host Arc's entry names, because one site serves both boards — which is
54
+ * why `RestApi` sends `chain=rhc` (src/restapi.ts). Without that parameter the host answers for Arc, the
55
+ * `meta.chainId` check refuses it, and a listing on this chain came back empty however many coins existed.
56
+ *
57
+ * **`memoRouter` is deliberately absent, and it must stay absent.** This chain deploys `ParabolicRouter`,
58
+ * not `ParabolicMemoRouter`: the two share no function selector (`buy` is memo 0x3f60b633 against router
59
+ * 0xe6eef0e5) and this package carries only the memo router's ABI, so filling this field with the router's
60
+ * address would encode calldata for functions that address does not have and every routed build would
61
+ * revert. Without it `build_buy_tx` goes straight to the curve and `build_launch_tx` to the factory, both
62
+ * of which are the same on every chain. A `ParabolicRouter` encoder is what this field is waiting on.
63
+ *
64
+ * No `agentRegistry`: Arc publishes one for Arc Testnet and nobody publishes one here, so `agent_status`
65
+ * says there is no registry rather than reading an address that is not a registry.
66
+ */
67
+ 4663: {
68
+ rpcUrl: "https://rpc.mainnet.chain.robinhood.com",
69
+ factory: deployedAt(4663, "ParabolicLaunchFactory"),
70
+ eurc: recordedEurc(4663),
71
+ startBlock: factoryBlock(4663),
72
+ apiUrl: DEFAULT_API_URL,
73
+ },
36
74
  };
37
75
  /**
38
76
  * The chain an agent gets with no configuration at all: Arc mainnet once its addresses are in
@@ -47,8 +85,13 @@ export const DEFAULT_CHAIN_ID = DEPLOYMENTS[5042].factory ? 5042 : 5042002;
47
85
  export const DEFAULT_RPC_URL = DEPLOYMENTS[DEFAULT_CHAIN_ID].rpcUrl;
48
86
  /** Environment variables the server reads, with their meaning (also rendered by `parabolic.docs`). */
49
87
  export const ENV_VARS = [
50
- ["PARABOLIC_RPC_URL", `Arc JSON-RPC endpoint (default ${DEFAULT_RPC_URL})`],
51
- ["PARABOLIC_CHAIN_ID", `chain id: 5042002 for Arc Testnet, 5042 for Arc (default ${DEFAULT_CHAIN_ID}, ${chainName(DEFAULT_CHAIN_ID)})`],
88
+ // Not "Arc JSON-RPC endpoint": `configFromEnv` defaults this to the CONFIGURED chain's own public host
89
+ // (`known.rpcUrl`), so on a 4663 server the old line named Arc twice over — the wrong chain and a default
90
+ // that is not the one taken (second review of 23 September 2026). The default is stated for the chain the
91
+ // line can name at module load, which is the unconfigured one.
92
+ ["PARABOLIC_RPC_URL", `JSON-RPC endpoint for the configured chain (default: that chain's public endpoint, ${DEFAULT_RPC_URL} on ${chainName(DEFAULT_CHAIN_ID)})`],
93
+ // Named from the registry rather than typed, so a chain whose record ships is a chain this line offers.
94
+ ["PARABOLIC_CHAIN_ID", `chain id: ${Object.values(CHAINS).filter((c) => c.live).map((c) => `${c.id} for ${c.name}`).join(", ")} (default ${DEFAULT_CHAIN_ID}, ${chainName(DEFAULT_CHAIN_ID)})`],
52
95
  ["PARABOLIC_FACTORY", "ParabolicLaunchFactory address (on-chain lookups, launch transactions, log-scan listing)"],
53
96
  ["PARABOLIC_MEMO_ROUTER", "ParabolicMemoRouter address (memo-routed buys carrying a referral code; EOA-only)"],
54
97
  ["PARABOLIC_SUBGRAPH_URL", "Parabolic subgraph endpoint (listing, holders, volume, protocol stats)"],
@@ -59,7 +102,9 @@ export const ENV_VARS = [
59
102
  ["PARABOLIC_AGENT_REGISTRY", `Arc's ERC-8004 IdentityRegistry (agent_status, build_register_agent_tx and the list_coins pair "Agents" filter). Arc's, not ours, and Arc has published one for Arc Testnet only, so on ${chainName(DEFAULT_CHAIN_ID)} the default is ${DEPLOYMENTS[DEFAULT_CHAIN_ID].agentRegistry ?? "none and those tools say so instead of answering"}`],
60
103
  ["PARABOLIC_LAUNCH_CONFIG_ID", "factory launch config index (default 0)"],
61
104
  ["PARABOLIC_FACTORY_START_BLOCK", "first block for the TokenLaunched log scan (default: the factory's deployment block for this chain)"],
62
- ["PARABOLIC_EXPLORER_URL", `block explorer base URL for building address and transaction links (default ${explorerBase(DEFAULT_CHAIN_ID) ?? "none for this chain"}; Arc mainnet's host is unconfirmed)`],
105
+ ["PARABOLIC_AGGREGATOR_ROUTER", "ParabolicAggregatorRouter address, read ONLY on Anvil (31337) and the testnets, and only where the chain's deployment record names no router; ignored on Arc (5042) and Robinhood Chain (4663), where the record's router is the only one. Routed trades on another launchpad's coin refuse without one"],
106
+ ...VENUE_ENV_VARS.map((name) => [name, `subgraph endpoint for that launchpad's coins on that chain (parabolic.list_venue_coins); unset lists none`]),
107
+ ["PARABOLIC_EXPLORER_URL", `block explorer base URL for building address and transaction links (default ${explorerBase(DEFAULT_CHAIN_ID) ?? "none for this chain"})`],
63
108
  ];
64
109
  function addr(name, v) {
65
110
  if (v === undefined || v.trim() === "")
@@ -69,6 +114,23 @@ function addr(name, v) {
69
114
  throw new Error(`${name} is not an address: ${s}`);
70
115
  return getAddress(s);
71
116
  }
117
+ /**
118
+ * `PARABOLIC_MEMO_ROUTER`, refused on a chain whose own record says it routes through `ParabolicRouter`.
119
+ *
120
+ * Second review of 23 September 2026. `build_buy_tx` used to throw "Memo-routed buys need
121
+ * PARABOLIC_MEMO_ROUTER" on every chain, which reads as an instruction; an operator on Robinhood Chain who
122
+ * followed it would set this to that chain's `ParabolicRouter` and every routed build would encode calldata
123
+ * for functions that address does not have (`buy` is memo 0x3f60b633 against router 0xe6eef0e5), reverting
124
+ * after the caller had already approved the quote asset. Refusing at start-up is the only place that costs
125
+ * nobody a transaction. A chain with no record of either contract is left alone: a private deployment of the
126
+ * memo router is a real case, and this is not the place to judge it.
127
+ */
128
+ function memoRouterFrom(chainId, given) {
129
+ if (given !== undefined && deployedAt(chainId, "ParabolicMemoRouter") === undefined && deployedAt(chainId, "ParabolicRouter") !== undefined) {
130
+ throw new Error(`PARABOLIC_MEMO_ROUTER is set on ${chainName(chainId)}, which deploys ParabolicRouter and no ParabolicMemoRouter. The two share no function selector, so a routed build against that address would encode calldata it does not have and revert. Unset it: buys here go straight to the curve.`);
131
+ }
132
+ return given;
133
+ }
72
134
  function int(name, v, fallback) {
73
135
  if (v === undefined || v.trim() === "")
74
136
  return fallback;
@@ -89,7 +151,7 @@ export function configFromEnv(env = process.env) {
89
151
  rpcOverridden: Boolean(env.PARABOLIC_RPC_URL?.trim()) && env.PARABOLIC_RPC_URL.trim() !== known?.rpcUrl,
90
152
  chainId,
91
153
  factory: addr("PARABOLIC_FACTORY", env.PARABOLIC_FACTORY) ?? known?.factory,
92
- memoRouter: addr("PARABOLIC_MEMO_ROUTER", env.PARABOLIC_MEMO_ROUTER) ?? known?.memoRouter,
154
+ memoRouter: memoRouterFrom(chainId, addr("PARABOLIC_MEMO_ROUTER", env.PARABOLIC_MEMO_ROUTER)) ?? known?.memoRouter,
93
155
  apiUrl: env.PARABOLIC_API_URL === undefined ? known?.apiUrl ?? DEFAULT_API_URL : env.PARABOLIC_API_URL.trim() || undefined,
94
156
  subgraphUrl: env.PARABOLIC_SUBGRAPH_URL?.trim() || undefined,
95
157
  eurc: addr("PARABOLIC_EURC", env.PARABOLIC_EURC) ?? known?.eurc,
@@ -98,8 +160,24 @@ export function configFromEnv(env = process.env) {
98
160
  agentRegistry: addr("PARABOLIC_AGENT_REGISTRY", env.PARABOLIC_AGENT_REGISTRY) ?? known?.agentRegistry,
99
161
  launchConfigId: BigInt(int("PARABOLIC_LAUNCH_CONFIG_ID", env.PARABOLIC_LAUNCH_CONFIG_ID, 0)),
100
162
  factoryStartBlock: BigInt(int("PARABOLIC_FACTORY_START_BLOCK", env.PARABOLIC_FACTORY_START_BLOCK, known?.startBlock ?? 0)),
163
+ ...aggregatorFrom(chainId, addr("PARABOLIC_AGGREGATOR_ROUTER", env.PARABOLIC_AGGREGATOR_ROUTER)),
164
+ venueSubgraphs: venueSubgraphsFrom(env, chainId),
101
165
  };
102
166
  }
167
+ /**
168
+ * Whether PARABOLIC_AGGREGATOR_ROUTER may stand in for a router on this chain: Anvil and the testnets only (RE-30B-4).
169
+ * On a live chain (Arc 5042, Robinhood Chain 4663, any id this registry does not call a testnet) the deployment record
170
+ * is the only source, so an install snippet carrying the variable can never aim a trade at an address the record does
171
+ * not carry. A fork proof on a live chain's id sets the router on its own config, in the test, not through this.
172
+ */
173
+ export const aggregatorEnvHonoured = (chainId) => chainId === 31337 || CHAINS[chainId]?.testnet === true;
174
+ /** The record's router, or the variable's where the record names none on a rehearsal chain. See `Config.aggregatorRouter`. */
175
+ function aggregatorFrom(chainId, given) {
176
+ const recorded = recordedAggregator(chainId)?.address;
177
+ if (recorded)
178
+ return { aggregatorRouter: recorded, aggregatorSource: "record" };
179
+ return given && aggregatorEnvHonoured(chainId) ? { aggregatorRouter: given, aggregatorSource: "env" } : {};
180
+ }
103
181
  /**
104
182
  * Re-exported rather than defined here since 18 Sep 2026: the same two strings for the same two chains,
105
183
  * from the registry that now also knows how a coin on a third one is named (src/chains.ts).
@@ -120,13 +198,13 @@ export function siteBase(chainId) {
120
198
  return at === -1 ? api.replace(/\/+$/, "") : api.slice(0, at);
121
199
  }
122
200
  /**
123
- * Arcscan base URL for the chain, undefined where there is no explorer (Anvil).
201
+ * The explorer base URL for the chain, undefined where there is no explorer (Anvil).
124
202
  *
125
- * Arc mainnet's host is a guess: Circle has published an explorer for Arc Testnet only, and
126
- * `https://explorer.arc.io` is Circle's published explorer (16 Sep 2026), behind a login at launch. `PARABOLIC_EXPLORER_URL` overrides it so a wrong guess
127
- * costs an environment variable rather than a republish of this package. Read from `process.env`
128
- * directly, unlike every other setting here, because this is called from `arcChain()` which builds a
129
- * viem chain from a chain id alone and never sees a Config.
203
+ * Arc mainnet's is Circle's `explorer.arc.io`, published 16 Sep 2026 and behind a login on the day;
204
+ * Robinhood Chain's is the Blockscout instance that chain lists. `PARABOLIC_EXPLORER_URL` overrides both,
205
+ * so a host that moves costs an environment variable rather than a republish of this package. Read from
206
+ * `process.env` directly, unlike every other setting here, because this is called from `arcChain()` which
207
+ * builds a viem chain from a chain id alone and never sees a Config.
130
208
  */
131
209
  export function explorerBase(chainId) {
132
210
  const override = process.env.PARABOLIC_EXPLORER_URL?.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { type Address } from "viem";
2
+ type Deployed = {
3
+ address: string;
4
+ block: number | null;
5
+ };
6
+ type Record_ = {
7
+ chainId: number;
8
+ network: string;
9
+ timestamp?: string;
10
+ commit?: string;
11
+ contracts: Record<string, Deployed>;
12
+ config: {
13
+ launchConfigId?: number | null;
14
+ launchForwarder?: string | null;
15
+ quoteToken?: string | null;
16
+ quoteEconomics?: {
17
+ decimals?: number | null;
18
+ } | null;
19
+ eurc?: string | null;
20
+ arcMemo?: string | null;
21
+ nativeDecimals?: number | null;
22
+ quoteAssets?: {
23
+ address?: string | null;
24
+ symbol?: string | null;
25
+ }[] | null;
26
+ } | null;
27
+ /** The chain's Uniswap v4 periphery as the deploy recorded it; null on a record that names none. */
28
+ v4?: Record<string, {
29
+ address?: string | null;
30
+ } | undefined> | null;
31
+ /** The aggregator router (docs/33 §A11). Absent means no router on that chain, never "unknown". */
32
+ aggregator?: {
33
+ address?: string | null;
34
+ block?: number | null;
35
+ } | null;
36
+ };
37
+ /** The record for a chain, or undefined where this package ships none. */
38
+ export declare const recordFor: (chainId: number) => Record_ | undefined;
39
+ /** A deployed contract's address by its Solidity name, or undefined where that chain's record has none. */
40
+ export declare const deployedAt: (chainId: number, name: string) => Address | undefined;
41
+ /**
42
+ * The block the factory itself was deployed at, which is where a `TokenLaunched` scan starts.
43
+ *
44
+ * The factory's own block rather than the record's `startBlock`: the record's is the first transaction of
45
+ * the whole deploy, and no coin can exist before the contract that launches them does.
46
+ */
47
+ export declare const factoryBlock: (chainId: number) => number | undefined;
48
+ /** EURC where a chain's deploy recorded one, undefined otherwise. Arc mainnet's record names none. */
49
+ export declare const recordedEurc: (chainId: number) => Address | undefined;
50
+ /** Chain ids this package ships addresses for, ascending. */
51
+ export type RecordedQuoteAsset = {
52
+ address: Address;
53
+ symbol: string;
54
+ };
55
+ /**
56
+ * Every quote asset a chain's deployment record names, checksummed. `config.quoteAssets` since the 4663 record
57
+ * (USDG and the three shares approved on 21 Sep 2026); Arc's record predates the field and names its ERC-20
58
+ * quote in `config.eurc` alone, null on mainnet, which is what "EURC pairs off at launch" looks like in a record.
59
+ * Read, never typed: a share named by hand here is the copy that goes stale (23 Sep 2026, the bot had exactly
60
+ * that gap and this package had it too, answering a 4663 share by its address alone).
61
+ */
62
+ export declare function recordedQuoteAssets(chainId: number): RecordedQuoteAsset[];
63
+ export declare const deployedChainIds: () => number[];
64
+ /**
65
+ * Whether Parabolic is deployed on this chain, which is what `live` means in src/chains.ts: a factory
66
+ * this package can read with no configuration at all, not merely a chain a reference can name.
67
+ */
68
+ export declare const isDeployedOn: (chainId: number) => boolean;
69
+ /**
70
+ * The ParabolicAggregatorRouter a chain's deployment record names under `aggregator`, or undefined. Undefined is the
71
+ * ordinary state until the founder deploys it (docs/33 §A11), and every routed tool then refuses by name: nothing in
72
+ * this package builds a routed trade against an address the record does not carry (src/routed.ts).
73
+ */
74
+ export declare const recordedAggregator: (chainId: number) => {
75
+ address: Address;
76
+ block: number | null;
77
+ } | undefined;
78
+ /** One v4 periphery contract by the record's own key (`v4Quoter`, `stateView`, `permit2`, `universalRouter`). */
79
+ export declare const recordedV4: (chainId: number, name: string) => Address | undefined;
80
+ export {};
@@ -0,0 +1,95 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { getAddress, isAddress } from "viem";
5
+ /**
6
+ * What this package ships addresses for, read from the deployment records rather than typed out.
7
+ *
8
+ * `scripts/sync-abis.mjs` reduces `contracts/deployments/<chainId>.json` into `abi/deployments.json`;
9
+ * this module reads it at import time, the way src/abi.ts reads the ABIs, and it is the only place in
10
+ * the package a deployed address comes from.
11
+ *
12
+ * ## Why it exists (23 September 2026, finding F50)
13
+ *
14
+ * `DEPLOYMENTS` in src/config.ts was three chains written by hand and chain two was never written. So
15
+ * the published 0.1.8 told every model "Parabolic is not deployed on Robinhood Chain yet" — four days
16
+ * after nine contracts were deployed there and twenty-three coins launched — and an operator who did
17
+ * what that message says (`PARABOLIC_CHAIN_ID=4663`) got Arc's RPC, no factory and an empty list. A
18
+ * table somebody has to remember to update is a table that goes stale silently, and this one went stale
19
+ * on the surface whose whole job is to be a model's system prompt.
20
+ *
21
+ * So a chain is served here **because its record says so**: `live` in src/chains.ts and the entry in
22
+ * `DEPLOYMENTS` are both derived from this file, and syncing a new chain's record is the whole of
23
+ * turning it on. The same rule web/lib/chains.ts follows through web/abi/deployments.json.
24
+ */
25
+ /** One level above src/ (tests) and dist/ (build), as src/abi.ts resolves it, and the same override. */
26
+ const DIR = process.env.PARABOLIC_ABI_DIR ?? resolve(dirname(fileURLToPath(import.meta.url)), "..", "abi");
27
+ const file = join(DIR, "deployments.json");
28
+ let records;
29
+ try {
30
+ records = JSON.parse(readFileSync(file, "utf8"));
31
+ }
32
+ catch (e) {
33
+ // Loud rather than silent, and for the same reason src/abi.ts is: a missing record would take every
34
+ // chain's addresses with it and the server would come up looking configured and reading nothing.
35
+ throw new Error(`Cannot read the bundled deployment records ${file}. The package ships abi/deployments.json; a missing file means a damaged install, so reinstall @parabolicfamily/mcp (${e.message})`);
36
+ }
37
+ const addr = (v) => (typeof v === "string" && isAddress(v, { strict: false }) ? getAddress(v) : undefined);
38
+ /** The record for a chain, or undefined where this package ships none. */
39
+ export const recordFor = (chainId) => records[String(chainId)];
40
+ /** A deployed contract's address by its Solidity name, or undefined where that chain's record has none. */
41
+ export const deployedAt = (chainId, name) => addr(recordFor(chainId)?.contracts?.[name]?.address);
42
+ /**
43
+ * The block the factory itself was deployed at, which is where a `TokenLaunched` scan starts.
44
+ *
45
+ * The factory's own block rather than the record's `startBlock`: the record's is the first transaction of
46
+ * the whole deploy, and no coin can exist before the contract that launches them does.
47
+ */
48
+ export const factoryBlock = (chainId) => {
49
+ const b = recordFor(chainId)?.contracts?.ParabolicLaunchFactory?.block;
50
+ return typeof b === "number" && b >= 0 ? b : undefined;
51
+ };
52
+ /** EURC where a chain's deploy recorded one, undefined otherwise. Arc mainnet's record names none. */
53
+ export const recordedEurc = (chainId) => addr(recordFor(chainId)?.config?.eurc);
54
+ /**
55
+ * Every quote asset a chain's deployment record names, checksummed. `config.quoteAssets` since the 4663 record
56
+ * (USDG and the three shares approved on 21 Sep 2026); Arc's record predates the field and names its ERC-20
57
+ * quote in `config.eurc` alone, null on mainnet, which is what "EURC pairs off at launch" looks like in a record.
58
+ * Read, never typed: a share named by hand here is the copy that goes stale (23 Sep 2026, the bot had exactly
59
+ * that gap and this package had it too, answering a 4663 share by its address alone).
60
+ */
61
+ export function recordedQuoteAssets(chainId) {
62
+ const config = recordFor(chainId)?.config;
63
+ if (!config)
64
+ return [];
65
+ const listed = Array.isArray(config.quoteAssets) ? config.quoteAssets : [];
66
+ const out = [];
67
+ for (const a of listed) {
68
+ const address = addr(a?.address);
69
+ if (address !== undefined && typeof a?.symbol === "string" && a.symbol.trim() !== "")
70
+ out.push({ address, symbol: a.symbol.trim() });
71
+ }
72
+ if (out.length > 0)
73
+ return out;
74
+ const eurc = addr(config.eurc);
75
+ return eurc === undefined ? [] : [{ address: eurc, symbol: "EURC" }];
76
+ }
77
+ export const deployedChainIds = () => Object.keys(records).map(Number).filter(Number.isFinite).sort((a, b) => a - b);
78
+ /**
79
+ * Whether Parabolic is deployed on this chain, which is what `live` means in src/chains.ts: a factory
80
+ * this package can read with no configuration at all, not merely a chain a reference can name.
81
+ */
82
+ export const isDeployedOn = (chainId) => deployedAt(chainId, "ParabolicLaunchFactory") !== undefined;
83
+ /**
84
+ * The ParabolicAggregatorRouter a chain's deployment record names under `aggregator`, or undefined. Undefined is the
85
+ * ordinary state until the founder deploys it (docs/33 §A11), and every routed tool then refuses by name: nothing in
86
+ * this package builds a routed trade against an address the record does not carry (src/routed.ts).
87
+ */
88
+ export const recordedAggregator = (chainId) => {
89
+ const a = recordFor(chainId)?.aggregator;
90
+ const address = addr(a?.address ?? undefined);
91
+ return address === undefined || /^0x0{40}$/i.test(address) ? undefined : { address, block: typeof a?.block === "number" ? a.block : null };
92
+ };
93
+ /** One v4 periphery contract by the record's own key (`v4Quoter`, `stateView`, `permit2`, `universalRouter`). */
94
+ export const recordedV4 = (chainId, name) => addr(recordFor(chainId)?.v4?.[name]?.address ?? undefined);
95
+ //# sourceMappingURL=deployed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployed.js","sourceRoot":"","sources":["../src/deployed.ts"],"names":[],"mappings":"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"}
package/dist/docs.d.ts CHANGED
@@ -1,4 +1,17 @@
1
1
  import { type Config } from "./config.js";
2
+ /**
3
+ * The referral's share of a trade fee, in basis points of the whole fee, which is the unit the ledger that
4
+ * actually credits it is folded in (`REFERRAL_OF_FEE_BPS` in indexer/src/memo-payload.ts; decided 12 Sep 2026,
5
+ * curve buys only, paid out of Parabolic's own half of the fee).
6
+ *
7
+ * The line below wrote the percentage as a figure until 23 Sep 2026 (F60). Three packages state this rate and
8
+ * only the site's copy was pinned to a constant, so moving the indexer's would have left this file quoting a
9
+ * share nobody is paid at, on the one surface that is a model's system prompt rather than a page somebody
10
+ * skims. web/test/review-web-api-contract.test.ts reads the percentage out of THIS file and fails when it
11
+ * stops agreeing with web/lib/data.ts and the indexer, which holds the figures in this comment to those two
12
+ * as well: 1,000 bps is 10% of the fee, which is 0.10% of a referred buy.
13
+ */
14
+ export declare const REFERRAL_OF_FEE_BPS = 1000;
2
15
  /**
3
16
  * Adopted product parameters (adopted 2026-09-06, graduation threshold revised to $8,000 on 2026-09-16; published
4
17
  * at https://www.parabolic.family/docs#parameters) and the chain's own facts, as text.
package/dist/docs.js CHANGED
@@ -1,7 +1,22 @@
1
- import { ARC_MEMO_DEFAULT, ENV_VARS, USDC_VIEW, chainName } from "./config.js";
1
+ import { ARC_MEMO_DEFAULT, DEPLOYMENTS, ENV_VARS, USDC_VIEW, chainName } from "./config.js";
2
2
  import { chainFor } from "./chains.js";
3
+ import { deployedAt, recordedAggregator } from "./deployed.js";
4
+ import { VENUES, VENUE_KEYS, venueOn } from "./venues.js";
3
5
  import { defaultQuoteOf } from "./quote-unit.js";
4
6
  import { endpointHost } from "./format.js";
7
+ /**
8
+ * The referral's share of a trade fee, in basis points of the whole fee, which is the unit the ledger that
9
+ * actually credits it is folded in (`REFERRAL_OF_FEE_BPS` in indexer/src/memo-payload.ts; decided 12 Sep 2026,
10
+ * curve buys only, paid out of Parabolic's own half of the fee).
11
+ *
12
+ * The line below wrote the percentage as a figure until 23 Sep 2026 (F60). Three packages state this rate and
13
+ * only the site's copy was pinned to a constant, so moving the indexer's would have left this file quoting a
14
+ * share nobody is paid at, on the one surface that is a model's system prompt rather than a page somebody
15
+ * skims. web/test/review-web-api-contract.test.ts reads the percentage out of THIS file and fails when it
16
+ * stops agreeing with web/lib/data.ts and the indexer, which holds the figures in this comment to those two
17
+ * as well: 1,000 bps is 10% of the fee, which is 0.10% of a referred buy.
18
+ */
19
+ export const REFERRAL_OF_FEE_BPS = 1_000;
5
20
  /**
6
21
  * Adopted product parameters (adopted 2026-09-06, graduation threshold revised to $8,000 on 2026-09-16; published
7
22
  * at https://www.parabolic.family/docs#parameters) and the chain's own facts, as text.
@@ -24,7 +39,7 @@ export function docsText(config) {
24
39
  return [
25
40
  // "curves priced in dollars" was written in both branches until 20 Sep 2026, which is true of every asset
26
41
  // Parabolic has ever been quoted in and is not a property of a curve. The chain's own default asset says it.
27
- `PARABOLIC — bonding-curve token launchpad on ${chainName(config.chainId)}; each curve is priced in one quote asset${quote === undefined
42
+ `PARABOLIC · bonding-curve token launchpad on ${chainName(config.chainId)}; each curve is priced in one quote asset${quote === undefined
28
43
  ? ", read it from the coin's curve (`pairToken`)"
29
44
  : `, which on this chain is ${quote.symbol}${quote.dollar ? " (a dollar)" : " (NOT a dollar: never put a $ in front of a figure counted in it)"}${chain?.native?.symbol === quote.symbol ? " and is also the gas asset" : ", not the gas token"}`}`,
30
45
  "parabolic.family · contact@parabolic.family · the people's launchpad; the goal is the betterment of the community.",
@@ -34,18 +49,27 @@ export function docsText(config) {
34
49
  "- Supply: 1,000,000,000 tokens (18 decimals), all minted to the curve.",
35
50
  onArc
36
51
  ? "- Quote asset: native USDC (Arc's gas token; 18-decimal native accounting). EURC (6-decimal ERC-20) pairs when approved on the factory."
37
- : `- Quote asset: read it from the coin's curve (\`pairToken\`) and the factory's \`pairTokenEconomics\`. A chain's dollar is its own — never assume USDC, and never assume decimals: a token's symbol() is not the name of the money. Gas on this chain: ${gas}.`,
52
+ : `- Quote asset: read it from the coin's curve (\`pairToken\`) and the factory's \`pairTokenEconomics\`. A chain's dollar is its own. Never assume USDC, and never assume decimals: a token's symbol() is not the name of the money. Gas on this chain: ${gas}.`,
38
53
  "- Opening: phantom quote reserve $5,000 against the full supply → ≈ $0.000005 per token, ≈ $5,000 opening market cap.",
39
54
  "- Graduation: when the curve's real quote reserve reaches $8,000. Terminal curve price = (5,000 + 8,000) / reservedTokens → fully diluted market cap at graduation = 13,000² / 5,000 = $33,800 (constant product over the whole 1e9 supply). Both figures are the launch config's, so read `getLaunchConfig(launchConfigId)` rather than taking them from here: Arc Testnet's factory still answers 12,500.",
40
55
  "- Reserved tokens: supply × phantom / (phantom + threshold) = 5,000 / 13,000 ≈ 38.46% of supply is never sold on the curve and is still held by it at graduation. Of that, ≈ 23.7% of supply (reserved × 8,000 / 13,000) seeds the Uniswap v4 full-range position together with the $8,000 raised, at the same terminal price, and the remaining ≈ 14.8% of supply is permanently locked (GraduationTokensPermanentlyLocked). The position itself is locked forever in ParabolicLaunchLocker.",
41
- "- Launch fee: whatever `launchFee()` on the factory answers. It is charged as `msg.value` on launchToken, so it is denominated in the chain's gas asset and is a dollar only where that asset is one. Read the figure and never assume it: the intended direction is zero everywhere (docs/20 §4), but Arc's factory still answers 1e18 as of 18 Sep 2026, so the intent is not the state of any chain. `parabolic.protocol_stats` reports it as `launchFee` with `launchFeeAsset` and `launchFeeSource`, and `build_launch_tx` puts the read value into the transaction.",
56
+ "- Launch fee: whatever `launchFee()` on the factory answers. It is charged as `msg.value` on launchToken, so it is denominated in the chain's gas asset and is a dollar only where that asset is one. Read the figure and never assume it, including from this line: Arc answered 1e18 until `setLaunchFee(0)` on 19 Sep 2026 and answers 0 now, Robinhood Chain has been 0 since its deploy, and a figure written down is a figure that can be stale while a transaction pays the one the factory holds. `parabolic.protocol_stats` reports it as `launchFee` with `launchFeeAsset` and `launchFeeSource`, and `build_launch_tx` puts the read value into the transaction.",
42
57
  "- Agents page: parabolic.family/agents lists coins launched by wallets holding an ERC-8004 identity where the chain publishes a registry (Arc Testnet today), and, on every chain, coins whose launch memo carries the note \"mcp\": build_launch_tx returns that variant as `memo` (EOA-only). Sign it to be listed.",
43
- "- Trade fee: 1.00% (100 bps) on the quote leg, before and after graduation (ParabolicHook takes it on the pool). The split is a per-chain parameter, not a constant: read `protocolFeeShareBps` and `buybackBurnBps` on the hook for the next launch, and the coin's own curve for an existing one, which carries the terms it copied at launch. On Arc the hook has answered 5,000 / 0 — creator 50 / protocol 50 — since 17 Sep 2026.",
58
+ "- Trade fee: 1.00% (100 bps) on the quote leg, before and after graduation (ParabolicHook takes it on the pool). The split is a per-chain parameter, not a constant: read `protocolFeeShareBps` and `buybackBurnBps` on the hook for the next launch, and the coin's own curve for an existing one, which carries the terms it copied at launch. On Arc the hook has answered 5,000 / 0 (creator 50 / protocol 50) since 17 Sep 2026.",
44
59
  "- Creator tax: optional 0–5% (0–500 bps), fixed at launch, charged like the fee on buys and sells, paid entirely to the creator.",
45
60
  "- Snipe tax: 93% (9,300 bps) at launch decaying to 0 over 5 s along a quadratic ease-out (remaining² / window²); capped at 10,000 − fee − creatorTax − 1 bps, which 9,300 stays below at every legal creator tax, so it is charged as written. Buys only. Only the creator's own address is exempt, and it stays exempt for every buy inside the window, not just the opening one; there is no other exemption pathway. Snipe revenue is split like the base fee.",
61
+ // Three cases, not two (found by the second review of 23 September 2026). The non-Arc branch said
62
+ // "it exists on Arc only; a chain without that precompile has no referral attribution", which became a
63
+ // false statement about money the moment this server started serving Robinhood Chain the same day:
64
+ // `ParabolicRouter` takes the referral code as an argument there, the indexer credits it through the
65
+ // same ledger as Arc's memo (indexer/src/memo-payload.ts), and the site prints referral links on that
66
+ // chain. What is true off Arc is narrower and is said here instead: the share is paid, and this package
67
+ // cannot build the call that carries it.
46
68
  onArc
47
- ? "- Referral: a bytes8 referral code (first 8 bytes of the referrer's address) carried in the Arc memo of a routed buy earns 10% of the fee."
48
- : "- Referral: carried in an Arc transaction memo, so it exists on Arc only; a chain without that precompile has no referral attribution.",
69
+ ? `- Referral: a bytes8 referral code (first 8 bytes of the referrer's address) carried in the Arc memo of a routed buy earns ${REFERRAL_OF_FEE_BPS / 100}% of the fee.`
70
+ : deployedAt(config.chainId, "ParabolicRouter")
71
+ ? `- Referral: a bytes8 referral code (first 8 bytes of the referrer's address) earns ${REFERRAL_OF_FEE_BPS / 100}% of the fee on this chain as it does on Arc, credited through the same ledger; it rides as an argument on \`ParabolicRouter\` rather than in an Arc memo. This server carries no encoder for that router, so a buy built here goes straight to the curve and earns nobody a referral.`
72
+ : "- Referral: a bytes8 referral code earns a share of the fee where a routed buy can carry one, which is Arc's memo or a chain that deploys `ParabolicRouter`. This chain's record names neither, so there is no referral attribution on it.",
49
73
  "- Dev buy (fair launch): the creator's opening buy is snipe-tax exempt. ParabolicMemoRouter.launchAndBuy (native quote; value = launch fee + buy) and launchAndBuyWithToken (ERC-20 quote; value = launch fee, buy pulled after an approval) place it inside the launch transaction, before anyone else can trade. The router forwards no exemption list and requires creatorFeeRecipient to be zero or the signer (FeeRecipientMustBeCreator); buyQuoteIn must be non-zero (ZeroBuyAmount). Without the router the buy is a second transaction to the new curve right after launch.",
50
74
  "",
51
75
  "CURVE MECHANICS (what the tools compute)",
@@ -57,8 +81,11 @@ export function docsText(config) {
57
81
  "",
58
82
  ...(onArc
59
83
  ? [
60
- "ARC NETWORK FACTS (verified against Arc Testnet)",
61
- "- Testnet: chain id 5042002, RPC https://rpc.testnet.arc.io, explorer https://testnet.arcscan.app. Mainnet: chain id 5042 (unofficial until Circle publishes it), public launch 16 Sep 2026.",
84
+ "ARC NETWORK FACTS",
85
+ // Read from the registry and the deployment table rather than written again (23 Sep 2026, F36):
86
+ // this line said mainnet's id was "unofficial until Circle publishes it" for a week after the
87
+ // public launch, on the one surface whose whole job is to be a model's system prompt.
88
+ `- Mainnet: chain id 5042, RPC ${DEPLOYMENTS[5042].rpcUrl}, explorer ${chainFor(5042)?.explorer}, live since 16 Sep 2026 (nine contracts, source verified on Sourcify). Testnet: chain id 5042002, RPC ${DEPLOYMENTS[5042002].rpcUrl}, explorer ${chainFor(5042002)?.explorer}.`,
62
89
  `- USDC is the native gas asset (18-decimal native accounting); its 6-decimal ERC-20 view is ${USDC_VIEW}. Base fee target ≈ $0.01, floor 20 Gwei, ceiling 20,000 Gwei (EWMA-smoothed).`,
63
90
  "- Malachite BFT consensus, deterministic finality < 1 s, proof of authority with 12 institutional validators. Osaka EVM on Reth. PREVRANDAO = 0 (no on-chain randomness). Mempool not observable.",
64
91
  `- System contracts on testnet: Memo (${ARC_MEMO_DEFAULT}; EOA-only, no value forwarding), Multicall3From, Permit2 (canonical), CREATE2, CCTP v2 (domain 26), Gateway, EURC, USYC, StableFX FxEscrow.`,
@@ -69,21 +96,50 @@ export function docsText(config) {
69
96
  ]
70
97
  : [
71
98
  `${chainName(config.chainId).toUpperCase()} NETWORK FACTS`,
72
- `- Nothing about this chain is written down here. Gas asset: ${gas}. Read the chain for anything else, and treat an unread figure as unknown rather than as Arc's.`,
73
- "- The Arc `Memo` precompile does not exist off Arc, so buy notes, on-chain forum posts and referral attribution are Arc-only features.",
99
+ `- Gas asset: ${gas}. Read the chain for anything else, and treat an unread figure as unknown rather than as Arc's.`,
100
+ // Reachable since 23 Sep 2026, when Robinhood Chain became a chain this server serves (F50). The
101
+ // routed sentence is conditional because it is a fact about the chain's own deployment record,
102
+ // not about every chain that is not Arc.
103
+ deployedAt(config.chainId, "ParabolicRouter")
104
+ ? "- Arc's `Memo` precompile exists on Arc alone. This chain deploys `ParabolicRouter`, which takes the referral code and the note as arguments and emits its own event; this server carries no encoder for it, so buy notes and referral attribution cannot be built here. `build_buy_tx` goes straight to the curve, which is the same call on every chain."
105
+ : "- The Arc `Memo` precompile does not exist off Arc, so buy notes, on-chain forum posts and referral attribution are Arc-only features.",
74
106
  "",
75
107
  ]),
76
108
  "THIS SERVER",
77
109
  `- Chain: ${chainName(config.chainId)} (${config.chainId}), RPC ${endpointHost(config.rpcUrl)}.`,
78
110
  `- Factory: ${set(config.factory)} · Memo router: ${set(config.memoRouter)} · Subgraph: ${config.subgraphUrl ? endpointHost(config.subgraphUrl) : "(not configured)"} · EURC: ${set(config.eurc)} · Hook: ${config.hook ?? "(read from factory)"} · Launch config id: ${config.launchConfigId}.`,
79
- "- Tools: parabolic.list_coins, parabolic.get_coin, parabolic.quote_buy, parabolic.quote_sell, parabolic.build_buy_tx, parabolic.build_sell_tx, parabolic.build_launch_tx, parabolic.protocol_stats, parabolic.agent_status, parabolic.build_register_agent_tx, parabolic.check_ticker, parabolic.docs. Resources: parabolic://docs/parameters, parabolic://coins/{address}.",
111
+ "- Tools: parabolic.list_coins, parabolic.get_coin, parabolic.quote_buy, parabolic.quote_sell, parabolic.build_buy_tx, parabolic.build_sell_tx, parabolic.build_launch_tx, parabolic.protocol_stats, parabolic.agent_status, parabolic.build_register_agent_tx, parabolic.check_ticker, parabolic.referral_status, parabolic.list_venue_coins, parabolic.quote_routed_buy, parabolic.quote_routed_sell, parabolic.build_routed_buy_tx, parabolic.build_routed_sell_tx, parabolic.docs. Resources: parabolic://docs/parameters, parabolic://coins/{address}.",
80
112
  "- check_ticker asks the Parabolic site (PARABOLIC_API_URL's site, route /api/v1/studio/ticker) whether a coin already carries a symbol on any chain the site serves and whether <ticker>.parabolic.family is free. Advice, not a gate: nothing on chain enforces a unique symbol. The hostname is the one exclusive thing and belongs to the oldest coin with the ticker.",
113
+ "- referral_status reads one wallet's referral payouts from the Parabolic site (route /api/v1/referrals/{account}): credited, published in the latest weekly root, claimed and claimable per asset, never summed, and the claim(asset, account, cumulative, proof) arguments. The referral distributor pays the account and nobody else. Read-only.",
81
114
  "- It never holds keys, signs, sends or broadcasts. build_* tools return unsigned { to, data, value, chainId } for the caller's wallet. Quotes are read from chain at call time and can move before a transaction lands.",
82
115
  `- build_launch_tx: with PARABOLIC_MEMO_ROUTER set and devBuy > 0 it returns one ParabolicMemoRouter.launchAndBuy transaction (creatorFeeRecipient zero, minTokensOut from the curve math on the launch config's phantom quote, value = launch fee + devBuy)${config.memoRouter ? " (router configured)" : " (router not configured here)"}; otherwise factory.launchToken plus, for a devBuy, the two-step plan (buy calldata to send to the new curve).`,
83
116
  "- The factory ABI has no enumeration function; listing uses the subgraph when set, otherwise Parabolic's public read API (PARABOLIC_API_URL), and a TokenLaunched log scan of the factory only when both are unavailable.",
84
117
  "",
118
+ ...routedSection(config),
119
+ "",
85
120
  "ENVIRONMENT",
86
121
  ...ENV_VARS.map(([k, v]) => `- ${k}: ${v}`),
87
122
  ].join("\n");
88
123
  }
124
+ /**
125
+ * Coins made on other launchpads, traded through ParabolicAggregatorRouter (src/routed.ts). Said per chain from the
126
+ * chain's own record: whether a router is deployed here, and which launchpads run here and are proven through it.
127
+ */
128
+ function routedSection(config) {
129
+ const recorded = recordedAggregator(config.chainId);
130
+ const router = config.aggregatorRouter;
131
+ const here = VENUE_KEYS.flatMap((k) => {
132
+ const on = venueOn(k, config.chainId);
133
+ return on ? [`${VENUES[k].name} (factory ${on.factory}, ${on.proven.path === "lineage" ? `proven through the router by ${on.proven.method === "fork" ? "a fork execution" : "a live-node simulation, not an execution"} at block ${on.proven.block.toLocaleString("en-US")}` : "proven on its pools, which this server does not build"}; subgraph ${config.venueSubgraphs?.[k] ? endpointHost(config.venueSubgraphs[k]) : `not configured, set ${on.subgraphEnv}`})`] : [];
134
+ });
135
+ return [
136
+ "OTHER LAUNCHPADS' COINS (routed through Parabolic)",
137
+ "- list_venue_coins lists coins made on another launchpad from that launchpad's subgraph; quote_routed_buy / quote_routed_sell and build_routed_buy_tx / build_routed_sell_tx trade them through ParabolicAggregatorRouter.",
138
+ "- Such a coin lives on the other launchpad's contracts, not Parabolic's: its curve or pool, its own fee and creator tax, and its snipe tax (keyed on the RECIPIENT on pons) are that launchpad's. Parabolic's own coins never go through the router.",
139
+ "- The routed fee: the router takes Parabolic's fee on top of the launchpad's own, from the input of a buy and from the venue's payout on a sell, and pushes it to the treasury in the same call. It is the router's `defaultFeeBps`, read at every call: 60 bps (0.6%) at deploy, the Free tier's; Pro (30) and Hyper (10) are vouchers the Parabolic site signs for one wallet, and this server sends none. No owner call can raise it above 100 bps.",
140
+ "- A build sends minOut from a fresh quote less slippage, maxSnipeTaxBps 0 unless raised to the tax the launchpad charges now, recipient = from, and a deadline five minutes past the chain's head block. An ERC-20 input (a USDG-quoted buy, every sell) comes with an approval of the router for exactly the amount, because the site's one-shot Permit2 transfer is a signature this server cannot make.",
141
+ `- Router on this chain: ${router ? `${router} (${config.aggregatorSource === "env" ? "PARABOLIC_AGGREGATOR_ROUTER, not in the deployment record: a rehearsal" : "from the deployment record"})` : recorded ? recorded.address : "none. This chain's deployment record carries no `aggregator` key yet, so every routed tool refuses rather than build against a guessed address"}.`,
142
+ `- Launchpads on this chain: ${here.length ? here.join("; ") : "none this server knows"}.`,
143
+ ];
144
+ }
89
145
  //# sourceMappingURL=docs.js.map
package/dist/docs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,4GAA4G;IAC5G,8GAA8G;IAC9G,MAAM,KAAK,GAAG,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,KAAK,EAAE,GAAG,KAAK,aAAa,CAAC;IACnE,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC,CAAC,4DAA4D,EAAE,CAAC,CAAC,CAAC,kEAAkE,CAAC;IAChR,OAAO;QACL,0GAA0G;QAC1G,6GAA6G;QAC7G,gDAAgD,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,4CACvE,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,4BAA4B,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,mEAAmE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,qBAAqB,EACnP,EAAE;QACF,oHAAoH;QACpH,2OAA2O;QAC3O,EAAE;QACF,0EAA0E;QAC1E,wEAAwE;QACxE,KAAK;YACH,CAAC,CAAC,yIAAyI;YAC3I,CAAC,CAAC,0PAA0P,GAAG,GAAG;QACpQ,uHAAuH;QACvH,6YAA6Y;QAC7Y,+dAA+d;QAC/d,2iBAA2iB;QAC3iB,uTAAuT;QACvT,yaAAya;QACza,kIAAkI;QAClI,mcAAmc;QACnc,KAAK;YACH,CAAC,CAAC,4IAA4I;YAC9I,CAAC,CAAC,wIAAwI;QAC5I,sjBAAsjB;QACtjB,EAAE;QACF,0CAA0C;QAC1C,8MAA8M;QAC9M,2QAA2Q;QAC3Q,sKAAsK;QACtK,0JAA0J;QAC1J,6KAA6K;QAC7K,EAAE;QACF,GAAG,CAAC,KAAK;YACP,CAAC,CAAC;gBACE,kDAAkD;gBAClD,8LAA8L;gBAC9L,+FAA+F,SAAS,gFAAgF;gBACxL,mMAAmM;gBACnM,wCAAwC,gBAAgB,8IAA8I;gBACtM,iLAAiL;gBACjL,4IAA4I;gBAC5I,8CAA8C;gBAC9C,EAAE;aACH;YACH,CAAC,CAAC;gBACE,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,gBAAgB;gBAC1D,+DAA+D,GAAG,iGAAiG;gBACnK,wIAAwI;gBACxI,EAAE;aACH,CAAC;QACN,aAAa;QACb,YAAY,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;QAChG,cAAc,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,YAAY,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,IAAI,IAAI,qBAAqB,wBAAwB,MAAM,CAAC,cAAc,GAAG;QAChS,6WAA6W;QAC7W,2WAA2W;QAC3W,yNAAyN;QACzN,8PAA8P,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,+BAA+B,gHAAgH;QAC1b,2NAA2N;QAC3N,EAAE;QACF,aAAa;QACb,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;KAC5C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}