@parabolicfamily/mcp 0.1.4 → 0.1.6

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.
package/README.md CHANGED
@@ -16,24 +16,28 @@ The ABIs ship with the package, so it works offline against any Arc RPC you poin
16
16
 
17
17
  ## Configure
18
18
 
19
- Nothing is required. Out of the box the server talks to **Arc Testnet** with the deployed Parabolic
20
- addresses already built in, so `npx -y @parabolicfamily/mcp` is a working install.
19
+ Nothing is required. Out of the box the server talks to the newest Arc chain it has addresses for,
20
+ with those addresses already built in, so `npx -y @parabolicfamily/mcp` is a working install. Since
21
+ 0.1.6 that is **Arc mainnet** (5042), live since 16 September 2026; set `PARABOLIC_CHAIN_ID=5042002`
22
+ for Arc Testnet.
21
23
 
22
- Set `PARABOLIC_CHAIN_ID` and the RPC and contract addresses for that chain follow it. Arc mainnet
23
- (5042) opens on **16 September 2026**; its addresses ship in the release right after the deployment.
24
+ Set `PARABOLIC_CHAIN_ID` and the RPC and contract addresses for that chain follow it. Every unsigned
25
+ transaction the server builds carries its `chainId`, so a wallet cannot sign a testnet launch onto
26
+ mainnet by mistake, and `protocol_stats` reports the chain and RPC host the server is actually using.
24
27
 
25
28
  | Variable | Meaning | Default |
26
29
  |---|---|---|
27
- | `PARABOLIC_CHAIN_ID` | 5042002 Arc Testnet, 5042 Arc mainnet | `5042002` |
30
+ | `PARABOLIC_CHAIN_ID` | 5042002 Arc Testnet, 5042 Arc mainnet | `5042` |
28
31
  | `PARABOLIC_RPC_URL` | Arc JSON-RPC endpoint | the public endpoint for the chain id |
29
32
  | `PARABOLIC_FACTORY` | `ParabolicLaunchFactory`: coin lookups and launch transactions | the deployment for the chain id |
30
33
  | `PARABOLIC_MEMO_ROUTER` | `ParabolicMemoRouter`: the atomic launch-and-buy and the referral-carrying buy | the deployment for the chain id |
31
34
  | `PARABOLIC_EURC` | EURC address, only for EURC-quoted coins | the deployment for the chain id |
32
35
  | `PARABOLIC_SUBGRAPH_URL` | Subgraph endpoint: richer listings, holders, 24h volume, protocol stats | unset (the public API is used instead) |
36
+ | `PARABOLIC_EXPLORER_URL` | Block explorer the address and transaction links are built from | Arcscan for the chain id; Arc mainnet's host is unconfirmed |
33
37
  | `PARABOLIC_HOOK` | `ParabolicHook` address | read from `factory.memeHook()` |
34
38
  | `PARABOLIC_ARC_MEMO` | Arc `Memo` system contract | `0x5294E9927c3306DcBaDb03fe70b92e01cCede505` |
35
39
  | `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) |
36
- | `PARABOLIC_LAUNCH_CONFIG_ID` | Factory launch-config index (0 = the $5K open / $12,500 graduation curve) | `0` |
40
+ | `PARABOLIC_LAUNCH_CONFIG_ID` | Factory launch-config index (0 = the $5K open / $8,000 graduation curve) | `0` |
37
41
  | `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 |
38
42
 
39
43
  The API default follows the chain: Arc Testnet reads the testnet site (`https://parabolic-testnet.vercel.app/api/v1`,
@@ -58,8 +62,9 @@ The identity registry is **Arc's contract, not ours**: Arc deploys it, documents
58
62
  It is an ERC-1967 proxy, so the implementation behind that address is upgradeable by Arc. Parabolic only
59
63
  reads it (and builds the registration for your wallet to sign); nothing on the launchpad depends on it.
60
64
 
61
- Arc mainnet (5042) addresses ship in the release that follows the 16 September 2026 deployment. That
62
- includes the identity registry: Arc has published no mainnet address for it yet, so on chain 5042
65
+ Arc mainnet (5042), deployed 16 September 2026 at block 21,105,294: factory
66
+ `0x27EAeC564fd049E6920C73323ffA7eb6a32A4B1e`, memo router `0x7d642150A222D0F6c98e2fC6bBe86E8Bb6DC90d0`,
67
+ source verified on Sourcify. Arc has published no identity registry for mainnet, so on chain 5042
63
68
  `agent_status` says there is no registry rather than reporting a wallet as unregistered.
64
69
 
65
70
  ### Claude Code
@@ -199,7 +204,7 @@ coins launched from that wallet, and the site tags them `[ Agent ]`.
199
204
  - Curve math is a port of `ParabolicBondingCurve` / `ParabolicBondingCurveMath` (and of `web/lib/curve.ts`): fee legs are taken off the buy input separately, the constant product is priced on `getReserves()`, and a buy that would take more than `sellableTokens()` is clamped to the last sellable tokens, charged the grossed-up price and refunded the rest; that buy graduates the coin, so give it extra gas. Sells take the fee off the gross quote output and close once the curve is ready to graduate.
200
205
  - `minTokensOut` on the curve is a price bound (`spent × minTokensOut ≤ received × tokensOut`), so a clamped fill still honours the caller's terms.
201
206
  - The snipe tax decays per second along `remaining² / window²`; a quote in the launch window overstates the tax a later block charges. Pass `buyer` to have the exemption checked.
202
- - At graduation the curve still holds the reserved 28.57% of supply: ≈ 20.4% seeds the Uniswap v4 full-range position with the $12,500 raised at the same terminal price, and ≈ 8.2% is permanently locked. Fully diluted graduation market cap: $61,250.
207
+ - At graduation the curve still holds the reserved 38.46% of supply: ≈ 23.7% seeds the Uniswap v4 full-range position with the $8,000 raised at the same terminal price, and ≈ 14.8% is permanently locked. Fully diluted graduation market cap: $33,800.
203
208
  - Fair launch: `ParabolicMemoRouter.launchAndBuy` / `launchAndBuyWithToken` put the creator's opening buy inside the launch transaction (snipe-tax exempt, before anyone else can trade). Called directly they work from any wallet; the router forwards no exemption list and rejects a `creatorFeeRecipient` other than zero or the signer.
204
209
  - A memo-routed buy (`memo: { referral }`) wraps `ParabolicMemoRouter.buy` inside Arc's `Memo.memo(...)` so the referral code is attributed on-chain. It is **EOA-only** (the Memo contract's caller must be `tx.origin`) and forwards no value, so the router pulls whole 6-decimal USDC units through the ERC-20 view (`0x3600…0000`) and needs a one-time approval; smart-account wallets should use the direct buy. Memo-wrapped launches (referral on a launch) are not built here.
205
210
  - Agent identity is ERC-8004 on Arc's own `IdentityRegistry` (an ERC-721 named `AgentIdentity`, symbol `AGENT`): `register(metadataURI)` mints one to the caller, `balanceOf` answers whether a wallet holds any. The registry is **not** ERC-721 Enumerable, so there is no way to list a wallet's agent ids without scanning `Transfer` logs, which public Arc RPCs cap and rate-limit; this server does not try. Arc can upgrade the registry behind its address (ERC-1967 proxy). Holding an identity is not an endorsement: registration is open to anyone.
package/dist/config.d.ts CHANGED
@@ -5,16 +5,14 @@ export declare const ARC_MEMO_DEFAULT: Address;
5
5
  export declare const USDC_VIEW: Address;
6
6
  /** `address(0)` as the pair token means the curve is quoted in native USDC. */
7
7
  export declare const NATIVE_QUOTE: Address;
8
- export declare const DEFAULT_CHAIN_ID = 5042002;
9
8
  export declare const DEFAULT_API_URL = "https://www.parabolic.family/api/v1";
10
9
  /**
11
10
  * Deployed Parabolic addresses per chain, so the server is useful with no configuration at all.
12
11
  * The source repository is private; these are the same addresses the site publishes at
13
12
  * https://www.parabolic.family/docs#contracts and that are verified on Arcscan.
14
13
  *
15
- * Arc mainnet (5042) opens on 16 September 2026. Its addresses ship in the release that follows the
16
- * deployment; until then a mainnet chain id resolves the RPC and nothing else, and any tool that
17
- * needs the factory says so.
14
+ * Arc mainnet (5042) opened on 16 September 2026; Parabolic deployed at block 21,105,294 and these are
15
+ * the live addresses (contracts/deployments/5042.json). With them in place the default chain is Arc.
18
16
  */
19
17
  export declare const DEPLOYMENTS: Record<number, {
20
18
  rpcUrl: string;
@@ -32,6 +30,16 @@ export declare const DEPLOYMENTS: Record<number, {
32
30
  */
33
31
  agentRegistry?: Address;
34
32
  }>;
33
+ /**
34
+ * The chain an agent gets with no configuration at all: Arc mainnet once its addresses are in
35
+ * `DEPLOYMENTS`, Arc Testnet until then.
36
+ *
37
+ * This is derived rather than written down because the alternative is a second thing to remember on
38
+ * launch day. A hardcoded testnet default would survive the mainnet release and quietly hand every
39
+ * unconfigured agent a testnet factory, and a hardcoded mainnet default would break the server today,
40
+ * when chain 5042 has an RPC and no contracts. Filling in the 5042 entry moves the default with it.
41
+ */
42
+ export declare const DEFAULT_CHAIN_ID: number;
35
43
  export declare const DEFAULT_RPC_URL: string;
36
44
  export type Config = {
37
45
  /** JSON-RPC endpoint for Arc. */
@@ -59,7 +67,7 @@ export type Config = {
59
67
  arcMemo: Address;
60
68
  /** Arc's ERC-8004 IdentityRegistry. Optional; undefined on a chain where Arc has published none. */
61
69
  agentRegistry?: Address;
62
- /** Launch config index on the factory; preset 0 is the adopted $5K / $12,500 curve. */
70
+ /** Launch config index on the factory; preset 0 is the adopted $5K / $8,000 curve. */
63
71
  launchConfigId: bigint;
64
72
  /** First block to scan for `TokenLaunched` logs when listing without a subgraph. */
65
73
  factoryStartBlock: bigint;
@@ -67,7 +75,23 @@ export type Config = {
67
75
  /** Environment variables the server reads, with their meaning (also rendered by `parabolic.docs`). */
68
76
  export declare const ENV_VARS: Array<[name: string, meaning: string]>;
69
77
  export declare function configFromEnv(env?: Record<string, string | undefined>): Config;
70
- export declare const chainName: (chainId: number) => string;
71
- /** Arcscan base URL for the chain, undefined where there is no explorer (Anvil). */
72
- export declare const explorerBase: (chainId: number) => string | undefined;
78
+ export declare function chainName(chainId: number): string;
79
+ /**
80
+ * The Parabolic site that serves this chain's deployment, with no trailing slash.
81
+ *
82
+ * Derived from the deployment's API URL so a coin link always points at the site where that coin
83
+ * actually exists: a testnet coin on the testnet site, a mainnet coin on parabolic.family. Hardcoding
84
+ * the mainnet host sent every testnet link to a page that has never heard of the coin.
85
+ */
86
+ export declare function siteBase(chainId: number): string | undefined;
87
+ /**
88
+ * Arcscan base URL for the chain, undefined where there is no explorer (Anvil).
89
+ *
90
+ * Arc mainnet's host is a guess: Circle has published an explorer for Arc Testnet only, and
91
+ * `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
92
+ * costs an environment variable rather than a republish of this package. Read from `process.env`
93
+ * directly, unlike every other setting here, because this is called from `arcChain()` which builds a
94
+ * viem chain from a chain id alone and never sees a Config.
95
+ */
96
+ export declare function explorerBase(chainId: number): string | undefined;
73
97
  export declare const explorerUrl: (chainId: number, kind: "address" | "tx", value: string) => string | undefined;
package/dist/config.js CHANGED
@@ -5,16 +5,14 @@ export const ARC_MEMO_DEFAULT = "0x5294E9927c3306DcBaDb03fe70b92e01cCede505";
5
5
  export const USDC_VIEW = "0x3600000000000000000000000000000000000000";
6
6
  /** `address(0)` as the pair token means the curve is quoted in native USDC. */
7
7
  export const NATIVE_QUOTE = "0x0000000000000000000000000000000000000000";
8
- export const DEFAULT_CHAIN_ID = 5042002;
9
8
  export const DEFAULT_API_URL = "https://www.parabolic.family/api/v1";
10
9
  /**
11
10
  * Deployed Parabolic addresses per chain, so the server is useful with no configuration at all.
12
11
  * The source repository is private; these are the same addresses the site publishes at
13
12
  * https://www.parabolic.family/docs#contracts and that are verified on Arcscan.
14
13
  *
15
- * Arc mainnet (5042) opens on 16 September 2026. Its addresses ship in the release that follows the
16
- * deployment; until then a mainnet chain id resolves the RPC and nothing else, and any tool that
17
- * needs the factory says so.
14
+ * Arc mainnet (5042) opened on 16 September 2026; Parabolic deployed at block 21,105,294 and these are
15
+ * the live addresses (contracts/deployments/5042.json). With them in place the default chain is Arc.
18
16
  */
19
17
  export const DEPLOYMENTS = {
20
18
  5042002: {
@@ -27,25 +25,40 @@ export const DEPLOYMENTS = {
27
25
  agentRegistry: "0x8004A818BFB912233c491871b3d84c89A494BD9e",
28
26
  },
29
27
  5042: {
30
- rpcUrl: "https://rpc.arc.io",
28
+ rpcUrl: "https://rpc.mainnet.arc.io",
29
+ factory: "0x27EAeC564fd049E6920C73323ffA7eb6a32A4B1e",
30
+ memoRouter: "0x7d642150A222D0F6c98e2fC6bBe86E8Bb6DC90d0",
31
+ startBlock: 21105294,
31
32
  apiUrl: DEFAULT_API_URL,
33
+ // No EURC pair is approved at launch and Arc has published no ERC-8004 registry for mainnet.
32
34
  },
33
35
  };
36
+ /**
37
+ * The chain an agent gets with no configuration at all: Arc mainnet once its addresses are in
38
+ * `DEPLOYMENTS`, Arc Testnet until then.
39
+ *
40
+ * This is derived rather than written down because the alternative is a second thing to remember on
41
+ * launch day. A hardcoded testnet default would survive the mainnet release and quietly hand every
42
+ * unconfigured agent a testnet factory, and a hardcoded mainnet default would break the server today,
43
+ * when chain 5042 has an RPC and no contracts. Filling in the 5042 entry moves the default with it.
44
+ */
45
+ export const DEFAULT_CHAIN_ID = DEPLOYMENTS[5042].factory ? 5042 : 5042002;
34
46
  export const DEFAULT_RPC_URL = DEPLOYMENTS[DEFAULT_CHAIN_ID].rpcUrl;
35
47
  /** Environment variables the server reads, with their meaning (also rendered by `parabolic.docs`). */
36
48
  export const ENV_VARS = [
37
49
  ["PARABOLIC_RPC_URL", `Arc JSON-RPC endpoint (default ${DEFAULT_RPC_URL})`],
38
- ["PARABOLIC_CHAIN_ID", `chain id (default ${DEFAULT_CHAIN_ID}, Arc Testnet)`],
50
+ ["PARABOLIC_CHAIN_ID", `chain id: 5042002 for Arc Testnet, 5042 for Arc (default ${DEFAULT_CHAIN_ID}, ${chainName(DEFAULT_CHAIN_ID)})`],
39
51
  ["PARABOLIC_FACTORY", "ParabolicLaunchFactory address (on-chain lookups, launch transactions, log-scan listing)"],
40
52
  ["PARABOLIC_MEMO_ROUTER", "ParabolicMemoRouter address (memo-routed buys carrying a referral code; EOA-only)"],
41
53
  ["PARABOLIC_SUBGRAPH_URL", "Parabolic subgraph endpoint (listing, holders, volume, protocol stats)"],
42
54
  ["PARABOLIC_EURC", "ERC-20 EURC address (EURC-quoted launches only)"],
43
55
  ["PARABOLIC_HOOK", "ParabolicHook address (optional; read from the factory when unset)"],
44
- ["PARABOLIC_API_URL", `Parabolic public read API for listings (default: the site that serves the chain's deployment, ${DEPLOYMENTS[DEFAULT_CHAIN_ID].apiUrl} on Arc Testnet, ${DEFAULT_API_URL} on Arc; "" to use a log scan instead)`],
56
+ ["PARABOLIC_API_URL", `Parabolic public read API for listings (default: the site that serves the chain's deployment, ${DEPLOYMENTS[DEFAULT_CHAIN_ID].apiUrl} on ${chainName(DEFAULT_CHAIN_ID)}; "" to use a log scan instead)`],
45
57
  ["PARABOLIC_ARC_MEMO", `Arc Memo system contract (default ${ARC_MEMO_DEFAULT})`],
46
- ["PARABOLIC_AGENT_REGISTRY", `Arc's ERC-8004 IdentityRegistry (agent_status, build_register_agent_tx and the list_coins pair "Agents" filter; default ${DEPLOYMENTS[DEFAULT_CHAIN_ID].agentRegistry} on Arc Testnet, none published for Arc yet)`],
58
+ ["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"}`],
47
59
  ["PARABOLIC_LAUNCH_CONFIG_ID", "factory launch config index (default 0)"],
48
60
  ["PARABOLIC_FACTORY_START_BLOCK", "first block for the TokenLaunched log scan (default: the factory's deployment block for this chain)"],
61
+ ["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)`],
49
62
  ];
50
63
  function addr(name, v) {
51
64
  if (v === undefined || v.trim() === "")
@@ -86,9 +99,39 @@ export function configFromEnv(env = process.env) {
86
99
  factoryStartBlock: BigInt(int("PARABOLIC_FACTORY_START_BLOCK", env.PARABOLIC_FACTORY_START_BLOCK, known?.startBlock ?? 0)),
87
100
  };
88
101
  }
89
- export const chainName = (chainId) => (chainId === 5042002 ? "Arc Testnet" : chainId === 5042 ? "Arc" : `chain ${chainId}`);
90
- /** Arcscan base URL for the chain, undefined where there is no explorer (Anvil). */
91
- export const explorerBase = (chainId) => chainId === 5042002 ? "https://testnet.arcscan.app" : chainId === 5042 ? "https://arcscan.app" : undefined;
102
+ // A function declaration, not a const: ENV_VARS above is built at module load and calls this.
103
+ export function chainName(chainId) {
104
+ return chainId === 5042002 ? "Arc Testnet" : chainId === 5042 ? "Arc" : `chain ${chainId}`;
105
+ }
106
+ /**
107
+ * The Parabolic site that serves this chain's deployment, with no trailing slash.
108
+ *
109
+ * Derived from the deployment's API URL so a coin link always points at the site where that coin
110
+ * actually exists: a testnet coin on the testnet site, a mainnet coin on parabolic.family. Hardcoding
111
+ * the mainnet host sent every testnet link to a page that has never heard of the coin.
112
+ */
113
+ export function siteBase(chainId) {
114
+ const api = DEPLOYMENTS[chainId]?.apiUrl;
115
+ if (!api)
116
+ return undefined;
117
+ const at = api.indexOf("/api/");
118
+ return at === -1 ? api.replace(/\/+$/, "") : api.slice(0, at);
119
+ }
120
+ /**
121
+ * Arcscan base URL for the chain, undefined where there is no explorer (Anvil).
122
+ *
123
+ * Arc mainnet's host is a guess: Circle has published an explorer for Arc Testnet only, and
124
+ * `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
125
+ * costs an environment variable rather than a republish of this package. Read from `process.env`
126
+ * directly, unlike every other setting here, because this is called from `arcChain()` which builds a
127
+ * viem chain from a chain id alone and never sees a Config.
128
+ */
129
+ export function explorerBase(chainId) {
130
+ const override = process.env.PARABOLIC_EXPLORER_URL?.trim();
131
+ if (override && /^https?:\/\//i.test(override))
132
+ return override.replace(/\/+$/, "");
133
+ return chainId === 5042002 ? "https://testnet.arcscan.app" : chainId === 5042 ? "https://explorer.arc.io" : undefined;
134
+ }
92
135
  export const explorerUrl = (chainId, kind, value) => {
93
136
  const base = explorerBase(chainId);
94
137
  return base ? `${base}/${kind}/${value}` : undefined;
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAgB,MAAM,MAAM,CAAC;AAE3D,gHAAgH;AAChH,MAAM,CAAC,MAAM,gBAAgB,GAAY,4CAA4C,CAAC;AACtF,mGAAmG;AACnG,MAAM,CAAC,MAAM,SAAS,GAAY,4CAA4C,CAAC;AAC/E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GAAY,4CAA4C,CAAC;AAElF,MAAM,CAAC,MAAM,eAAe,GAAG,qCAAqC,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAenB;IACH,OAAO,EAAE;QACP,MAAM,EAAE,4BAA4B;QACpC,OAAO,EAAE,4CAA4C;QACrD,UAAU,EAAE,4CAA4C;QACxD,IAAI,EAAE,4CAA4C;QAClD,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,6CAA6C;QACrD,aAAa,EAAE,4CAA4C;KAC5D;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,4BAA4B;QACpC,OAAO,EAAE,4CAA4C;QACrD,UAAU,EAAE,4CAA4C;QACxD,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,eAAe;QACvB,6FAA6F;KAC9F;CACF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;AAkCpE,sGAAsG;AACtG,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,CAAC,mBAAmB,EAAE,kCAAkC,eAAe,GAAG,CAAC;IAC3E,CAAC,oBAAoB,EAAE,4DAA4D,gBAAgB,KAAK,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC;IACvI,CAAC,mBAAmB,EAAE,0FAA0F,CAAC;IACjH,CAAC,uBAAuB,EAAE,mFAAmF,CAAC;IAC9G,CAAC,wBAAwB,EAAE,wEAAwE,CAAC;IACpG,CAAC,gBAAgB,EAAE,iDAAiD,CAAC;IACrE,CAAC,gBAAgB,EAAE,oEAAoE,CAAC;IACxF,CAAC,mBAAmB,EAAE,iGAAiG,WAAW,CAAC,gBAAgB,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,gBAAgB,CAAC,iCAAiC,CAAC;IAC/N,CAAC,oBAAoB,EAAE,qCAAqC,gBAAgB,GAAG,CAAC;IAChF,CAAC,0BAA0B,EAAE,2LAA2L,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,WAAW,CAAC,gBAAgB,CAAC,CAAC,aAAa,IAAI,kDAAkD,EAAE,CAAC;IAC1W,CAAC,4BAA4B,EAAE,yCAAyC,CAAC;IACzE,CAAC,+BAA+B,EAAE,qGAAqG,CAAC;IACxI,CAAC,wBAAwB,EAAE,+EAA+E,YAAY,CAAC,gBAAgB,CAAC,IAAI,qBAAqB,sCAAsC,CAAC;CACzM,CAAC;AAEF,SAAS,IAAI,CAAC,IAAY,EAAE,CAAqB;IAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACzD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACzF,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,CAAqB,EAAE,QAAgB;IAChE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACxD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wCAAwC,CAAC,EAAE,CAAC,CAAC;IACvG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA0C,OAAO,CAAC,GAAG;IACjF,4FAA4F;IAC5F,8FAA8F;IAC9F,oDAAoD;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,MAAM,IAAI,eAAe;QACzE,+FAA+F;QAC/F,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,iBAAkB,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM;QACxG,OAAO;QACP,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,EAAE,OAAO;QAC3E,UAAU,EAAE,IAAI,CAAC,uBAAuB,EAAE,GAAG,CAAC,qBAAqB,CAAC,IAAI,KAAK,EAAE,UAAU;QACzF,MAAM,EAAE,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,SAAS;QAC1H,WAAW,EAAE,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,SAAS;QAC5D,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,EAAE,IAAI;QAC/D,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC;QAChD,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,gBAAgB;QAC/E,aAAa,EAAE,IAAI,CAAC,0BAA0B,EAAE,GAAG,CAAC,wBAAwB,CAAC,IAAI,KAAK,EAAE,aAAa;QACrG,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;QAC5F,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,GAAG,CAAC,6BAA6B,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;KAC3H,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;AACxH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAsB,EAAE,KAAa,EAAsB,EAAE;IACxG,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC"}
package/dist/curve.d.ts CHANGED
@@ -67,7 +67,7 @@ export declare const reservedTokensFor: (supply: bigint, phantomQuote: bigint, g
67
67
  * Where the reserved tokens go at graduation. The v4 full-range position is seeded at the curve's terminal price
68
68
  * ((phantom + threshold) / reserved) with the real quote raised, which takes reserved × threshold / (phantom + threshold)
69
69
  * tokens; the rest, the phantom reserve's share, is permanently locked (GraduationTokensPermanentlyLocked).
70
- * Adopted parameters: 28.57% reserved → ≈ 20.4% of supply seeds the pool, ≈ 8.2% is locked.
70
+ * Adopted parameters: 38.46% reserved → ≈ 23.7% of supply seeds the pool, ≈ 14.8% is locked.
71
71
  */
72
72
  export declare const graduationSplit: (reservedTokens: bigint, phantomQuote: bigint, graduationThreshold: bigint) => {
73
73
  poolSeed: bigint;
package/dist/curve.js CHANGED
@@ -80,7 +80,7 @@ export const reservedTokensFor = (supply, phantomQuote, graduationThreshold) =>
80
80
  * Where the reserved tokens go at graduation. The v4 full-range position is seeded at the curve's terminal price
81
81
  * ((phantom + threshold) / reserved) with the real quote raised, which takes reserved × threshold / (phantom + threshold)
82
82
  * tokens; the rest, the phantom reserve's share, is permanently locked (GraduationTokensPermanentlyLocked).
83
- * Adopted parameters: 28.57% reserved → ≈ 20.4% of supply seeds the pool, ≈ 8.2% is locked.
83
+ * Adopted parameters: 38.46% reserved → ≈ 23.7% of supply seeds the pool, ≈ 14.8% is locked.
84
84
  */
85
85
  export const graduationSplit = (reservedTokens, phantomQuote, graduationThreshold) => {
86
86
  const denominator = phantomQuote + graduationThreshold;
package/dist/docs.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { type Config } from "./config.js";
2
- /** Adopted product parameters (adopted 2026-09-06; published at https://www.parabolic.family/docs#parameters) and verified Arc facts, as text. */
2
+ /** Adopted product parameters (adopted 2026-09-06, graduation threshold revised to $8,000 on 2026-09-16; published at https://www.parabolic.family/docs#parameters) and verified Arc facts, as text. */
3
3
  export declare function docsText(config: Config): string;
package/dist/docs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ARC_MEMO_DEFAULT, ENV_VARS, USDC_VIEW, chainName } from "./config.js";
2
2
  import { endpointHost } from "./format.js";
3
- /** Adopted product parameters (adopted 2026-09-06; published at https://www.parabolic.family/docs#parameters) and verified Arc facts, as text. */
3
+ /** Adopted product parameters (adopted 2026-09-06, graduation threshold revised to $8,000 on 2026-09-16; published at https://www.parabolic.family/docs#parameters) and verified Arc facts, as text. */
4
4
  export function docsText(config) {
5
5
  const set = (v) => v ?? "(not configured)";
6
6
  return [
@@ -8,16 +8,17 @@ export function docsText(config) {
8
8
  "parabolic.family · contact@parabolic.family · fork of the MIT-licensed pons V2 contracts (Robinhood Chain), ported to Arc.",
9
9
  "Category: bonding-curve launchpad (pump.fun / fomo.family / pons), not a fundraising venue. Non-custodial: every launch and trade is a wallet-signed transaction; no custody, no warranties, no advice; coins are user-created and experimental.",
10
10
  "",
11
- "ADOPTED PARAMETERS (2026-09-06)",
11
+ "ADOPTED PARAMETERS (2026-09-06, graduation threshold revised 2026-09-16)",
12
12
  "- Supply: 1,000,000,000 tokens (18 decimals), all minted to the curve.",
13
13
  "- Quote asset: native USDC (Arc's gas token; 18-decimal native accounting). EURC (6-decimal ERC-20) pairs when approved on the factory.",
14
14
  "- Opening: phantom quote reserve $5,000 against the full supply → ≈ $0.000005 per token, ≈ $5,000 opening market cap.",
15
- "- Graduation: when the curve's real quote reserve reaches $12,500. Terminal curve price = (5,000 + 12,500) / reservedTokens → fully diluted market cap at graduation = 17,500² / 5,000 = $61,250 (constant product over the whole 1e9 supply; the spec's rounded figure is $55–60K).",
16
- "- Reserved tokens: supply × phantom / (phantom + threshold) = 5,000 / 17,50028.57% of supply is never sold on the curve and is still held by it at graduation. Of that, ≈ 20.4% of supply (reserved × 12,500 / 17,500) seeds the Uniswap v4 full-range position together with the $12,500 raised, at the same terminal price, and the remaining ≈ 8.2% of supply is permanently locked (GraduationTokensPermanentlyLocked). The position itself is locked forever in ParabolicLaunchLocker.",
17
- "- Launch fee: $1.00 USDC (msg.value on launchToken) + $0.01 gas.",
18
- "- Trade fee: 1.00% (100 bps) on the quote leg, before and after graduation (ParabolicHook takes it on the pool). Split: creator 50 / protocol 30 / buyback vault 20 (vault vests 5 years). On-chain: protocolFeeShareBps of the fee goes to protocol; buybackBurnBps of the remaining creator slice goes to the buyback.",
15
+ "- 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).",
16
+ "- Reserved tokens: supply × phantom / (phantom + threshold) = 5,000 / 13,00038.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.",
17
+ "- Launch fee: $1.00 USDC (msg.value on launchToken) + gas in USDC at the live base fee (about a cent at Arc's 20 gwei target, tens of cents when the network is busy).",
18
+ "- Agents page: parabolic.family/agents lists coins launched by wallets holding an ERC-8004 identity where Arc 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.",
19
+ "- Trade fee: 1.00% (100 bps) on the quote leg, before and after graduation (ParabolicHook takes it on the pool). Split: creator 50 / protocol 50 (the policy since 17 Sep 2026; a coin carries the terms its curve copied at launch, read them from the curve). On-chain: protocolFeeShareBps of the fee goes to protocol; buybackBurnBps of the remaining creator slice goes to the buyback.",
19
20
  "- Creator tax: optional 0–5% (0–500 bps), fixed at launch, charged like the fee on buys and sells, paid entirely to the creator.",
20
- "- 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 deployer is exempt, for the buy in their own launch; there is no other exemption pathway. Snipe revenue is split like the base fee.",
21
+ "- 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.",
21
22
  "- 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.",
22
23
  "- Dev buy (fair launch): the creator's opening buy is snipe-tax exempt. ParabolicMemoRouter.launchAndBuy (native USDC; 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.",
23
24
  "",
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,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,kJAAkJ;AAClJ,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC/D,OAAO;QACL,kDAAkD;QAClD,4HAA4H;QAC5H,kPAAkP;QAClP,EAAE;QACF,iCAAiC;QACjC,wEAAwE;QACxE,yIAAyI;QACzI,uHAAuH;QACvH,sRAAsR;QACtR,geAAge;QAChe,oEAAoE;QACpE,0TAA0T;QAC1T,kIAAkI;QAClI,wYAAwY;QACxY,4IAA4I;QAC5I,qjBAAqjB;QACrjB,EAAE;QACF,0CAA0C;QAC1C,8MAA8M;QAC9M,2QAA2Q;QAC3Q,sKAAsK;QACtK,0JAA0J;QAC1J,6KAA6K;QAC7K,EAAE;QACF,kDAAkD;QAClD,8LAA8L;QAC9L,+FAA+F,SAAS,gFAAgF;QACxL,mMAAmM;QACnM,wCAAwC,gBAAgB,8IAA8I;QACtM,iLAAiL;QACjL,4IAA4I;QAC5I,8CAA8C;QAC9C,EAAE;QACF,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,qVAAqV;QACrV,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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wMAAwM;AACxM,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,kBAAkB,CAAC;IAC/D,OAAO;QACL,kDAAkD;QAClD,4HAA4H;QAC5H,kPAAkP;QAClP,EAAE;QACF,0EAA0E;QAC1E,wEAAwE;QACxE,yIAAyI;QACzI,uHAAuH;QACvH,8OAA8O;QAC9O,+dAA+d;QAC/d,wKAAwK;QACxK,iTAAiT;QACjT,+XAA+X;QAC/X,kIAAkI;QAClI,mcAAmc;QACnc,4IAA4I;QAC5I,qjBAAqjB;QACrjB,EAAE;QACF,0CAA0C;QAC1C,8MAA8M;QAC9M,2QAA2Q;QAC3Q,sKAAsK;QACtK,0JAA0J;QAC1J,6KAA6K;QAC7K,EAAE;QACF,kDAAkD;QAClD,8LAA8L;QAC9L,+FAA+F,SAAS,gFAAgF;QACxL,mMAAmM;QACnM,wCAAwC,gBAAgB,8IAA8I;QACtM,iLAAiL;QACjL,4IAA4I;QAC5I,8CAA8C;QAC9C,EAAE;QACF,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,qVAAqV;QACrV,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"}
@@ -88,6 +88,10 @@ export type BuildLaunchInput = {
88
88
  creatorTaxBps?: number;
89
89
  creator: string;
90
90
  buybackEnabled?: boolean;
91
+ memo?: {
92
+ referral?: string;
93
+ note?: string;
94
+ } | null;
91
95
  };
92
96
  /**
93
97
  * Read-only view of Parabolic plus unsigned-transaction builders. Holds no keys; every method either reads
@@ -166,6 +170,9 @@ export declare class Parabolic {
166
170
  chain: string;
167
171
  subgraph: string;
168
172
  };
173
+ marketCap: number;
174
+ price: number;
175
+ marketCapSource: string;
169
176
  address: `0x${string}`;
170
177
  curve: `0x${string}`;
171
178
  name: string;
@@ -187,9 +194,6 @@ export declare class Parabolic {
187
194
  raw: string;
188
195
  };
189
196
  progressPct: number;
190
- price: number;
191
- marketCap: number;
192
- marketCapSource: string;
193
197
  supply: {
194
198
  amount: string;
195
199
  raw: string;
@@ -254,7 +258,7 @@ export declare class Parabolic {
254
258
  farcaster: string;
255
259
  };
256
260
  links: {
257
- app: string;
261
+ app: string | null;
258
262
  token: string | null;
259
263
  curve: string | null;
260
264
  creator: string | null;
@@ -557,6 +561,18 @@ export declare class Parabolic {
557
561
  };
558
562
  events: string[];
559
563
  notes: string[];
564
+ memo: {
565
+ listedOn: string;
566
+ steps: string[];
567
+ why: string;
568
+ tx: import("./tx.js").UnsignedTx;
569
+ approval: import("./tx.js").UnsignedTx;
570
+ usdcUnits: string;
571
+ eoaOnly: true;
572
+ memoId: Hex;
573
+ payload: Hex;
574
+ note: string;
575
+ } | null;
560
576
  params: TokenParams;
561
577
  launchConfigId: string;
562
578
  pair: "USDC" | "EURC";
@@ -646,6 +662,18 @@ export declare class Parabolic {
646
662
  chainId: number;
647
663
  } | null;
648
664
  notes: string[];
665
+ memo: {
666
+ listedOn: string;
667
+ steps: string[];
668
+ why: string;
669
+ tx: import("./tx.js").UnsignedTx;
670
+ approval: import("./tx.js").UnsignedTx;
671
+ usdcUnits: string;
672
+ eoaOnly: true;
673
+ memoId: Hex;
674
+ payload: Hex;
675
+ note: string;
676
+ } | null;
649
677
  params: TokenParams;
650
678
  launchConfigId: string;
651
679
  pair: "USDC" | "EURC";
package/dist/parabolic.js CHANGED
@@ -4,13 +4,18 @@ import { curveAbi, factoryAbi, tokenAbi } from "./abi.js";
4
4
  import { encodeRegisterAgent, readAgentOwners, readAgentStatus, AGENT_LOOKUP_MAX, MAX_METADATA_URI_BYTES } from "./agents.js";
5
5
  import { mapLimit, viemRpc } from "./chain.js";
6
6
  import { isNative, progressPct, sortCoins, summaryFromGql } from "./coins.js";
7
- import { DEPLOYMENTS, NATIVE_QUOTE, chainName, explorerUrl } from "./config.js";
7
+ import { DEPLOYMENTS, NATIVE_QUOTE, chainName, explorerUrl, siteBase } from "./config.js";
8
8
  import { applySlippage, graduationMarketCap, graduationSplit, marketCap, passesPriceBound, poolIdOf, priceImpact, quoteBuy, quoteSell, reservedTokensFor, spotPrice, toNumber } from "./curve.js";
9
9
  import { docsText } from "./docs.js";
10
10
  import { addrOf, amount, big, bool, endpointHost, num, parseAddress, parseAmount, safeMessage, str } from "./format.js";
11
11
  import { RestApi } from "./restapi.js";
12
12
  import { Subgraph } from "./subgraph.js";
13
- import { encodeApprove, encodeBuy, encodeLaunch, encodeLaunchAndBuy, encodeMemoBuy, encodeSell } from "./tx.js";
13
+ import { encodeApprove, encodeBuy, encodeLaunch, encodeLaunchAndBuy, encodeMemoBuy, encodeMemoLaunch, encodeSell, MCP_LAUNCH_NOTE } from "./tx.js";
14
+ /** A coin's page on the Parabolic site that serves this chain, or null on a chain with no site. */
15
+ const appLink = (chainId, token) => {
16
+ const base = siteBase(chainId);
17
+ return base ? `${base}/coin/${token}` : null;
18
+ };
14
19
  export const PHASES = ["NotGraduated", "Swept", "PoolCreated", "Rescued"];
15
20
  export const DEFAULT_SLIPPAGE_BPS = 100;
16
21
  export const DEV_BUY_SLIPPAGE_BPS = 200n;
@@ -317,8 +322,13 @@ export class Parabolic {
317
322
  const launch = await this.resolveLaunch(address);
318
323
  const [chain, gql] = await Promise.all([this.chainDetail(launch), this.subgraph ? this.subgraph.coin(launch.token).catch(() => null) : Promise.resolve(null)]);
319
324
  const indexed = gql ? summaryFromGql(gql) : undefined;
325
+ // A graduated coin's price lives on its pool; the chain detail knows only the seeding price, the indexer
326
+ // follows the pool swap by swap. Until the pool exists the seeding price is the right figure.
327
+ const pooled = chain.status === "graduated" && gql !== null && gql.status === "GRADUATED" && indexed !== undefined && indexed.marketCap > 0;
328
+ const supplyWhole = Number(chain.supply.amount);
320
329
  return {
321
330
  ...chain,
331
+ ...(pooled ? { marketCap: indexed.marketCap, price: supplyWhole > 0 ? indexed.marketCap / supplyWhole : chain.price, marketCapSource: "Uniswap v4 pool, from the indexer (the pool's price after its last swap)" } : {}),
322
332
  holders: indexed?.holders ?? null,
323
333
  volume24h: indexed?.volume24h ?? null,
324
334
  change24h: indexed?.change24h ?? null,
@@ -396,7 +406,7 @@ export class Parabolic {
396
406
  windowEndsAt: launchedAt + windowSeconds,
397
407
  windowOpen: currentSnipeBps > 0,
398
408
  secondsRemaining: Math.max(0, launchedAt + windowSeconds - now),
399
- exempt: "the creator only, for the buy in their own launch; there is no other exemption pathway. Check curve.snipeTaxExempt(address) or pass `buyer` to quote_buy",
409
+ exempt: "the creator's own address only, and for every buy inside the window, not just the opening one; there is no other exemption pathway. Check curve.snipeTaxExempt(address) or pass `buyer` to quote_buy",
400
410
  },
401
411
  pool: { poolId: poolId ?? null, poolFee: l.poolFee ?? null, tickSpacing: l.tickSpacing ?? null, hook: hook ?? null },
402
412
  createdAt: launchedAt || null,
@@ -404,7 +414,7 @@ export class Parabolic {
404
414
  logo: str(info[1]),
405
415
  description: str(info[2]),
406
416
  socials: { twitter: str(socials.twitter), telegram: str(socials.telegram), discord: str(socials.discord), website: str(socials.website), farcaster: str(socials.farcaster) },
407
- links: { app: `https://parabolic.family/coin/${l.token}`, token: explorerUrl(chainId, "address", l.token) ?? null, curve: explorerUrl(chainId, "address", l.curve) ?? null, creator: explorerUrl(chainId, "address", l.deployer) ?? null },
417
+ links: { app: appLink(chainId, l.token), token: explorerUrl(chainId, "address", l.token) ?? null, curve: explorerUrl(chainId, "address", l.curve) ?? null, creator: explorerUrl(chainId, "address", l.deployer) ?? null },
408
418
  source: l.source === "factory" ? "factory.getLaunchedToken + curve + token reads" : "subgraph lookup + curve + token reads",
409
419
  };
410
420
  }
@@ -666,7 +676,21 @@ export class Parabolic {
666
676
  : undefined;
667
677
  const split = graduationSplit(reserved, phantom, threshold);
668
678
  const pctOf = (v) => (supply > 0n ? Number((v * 1000000n) / supply) / 10_000 : 0);
679
+ // The listed variant: the same launch through Arc's Memo contract with the note "mcp" (or the caller's own
680
+ // note and referral), which is what puts the coin on parabolic.family/agents. Native quote, router configured.
681
+ const memo = router !== undefined && pair === "USDC" && input.memo !== null
682
+ ? (() => {
683
+ const m = encodeMemoLaunch({ arcMemo: this.config.arcMemo, router, params: { ...params, creatorFeeRecipient: NATIVE_QUOTE }, launchConfigId: configId, pairToken, launchFee, buyQuoteIn: devIn, minTokensOut: devMin, referral: input.memo?.referral, note: input.memo?.note, chainId });
684
+ return {
685
+ ...m,
686
+ listedOn: "parabolic.family/agents",
687
+ steps: ["1. approval (the router pulls the launch fee and any opening buy as USDC units through the ERC-20 view)", "2. tx (no value)"],
688
+ why: `Sign this pair instead of \`tx\` to be listed on parabolic.family/agents: the launch is the same, wrapped through Arc's Memo contract with the note "${m.note}" (and the referral code, if any), which the indexer keeps on the coin. EOA-only: a smart-account or contract wallet must send \`tx\` instead.`,
689
+ };
690
+ })()
691
+ : null;
669
692
  const common = {
693
+ memo,
670
694
  params,
671
695
  launchConfigId: configId.toString(),
672
696
  pair,
@@ -704,6 +728,7 @@ export class Parabolic {
704
728
  devBuy: { atomic: true, ...devSummary },
705
729
  events: ["RoutedLaunch(user, token, curve, launchConfigId, pairToken)", "RoutedBuy(user, curve, recipient, quoteSpent, tokensOut, refund)", common.event],
706
730
  notes: [
731
+ `To be listed on parabolic.family/agents sign the \`memo\` pair (approval, then tx) instead: the same launch carrying the note "${MCP_LAUNCH_NOTE}". EOA-only.`,
707
732
  `Unsigned single transaction to ParabolicMemoRouter.${native ? "launchAndBuy" : "launchAndBuyWithToken"}: the launch and the creator's opening buy settle together, before anyone else can trade. Any wallet can call it directly (the memo-wrapped form is EOA-only and cannot carry value).`,
708
733
  "The router forwards the signer as deployer (factory.launchTokenFor) and places the buy through curve.buyFor(signer, …), so it is snipe-tax exempt; unspent quote (rounding, or a fill capped at graduation) is refunded to the signer. creatorFeeRecipient is left zero: the router rejects any value other than zero or the signer (FeeRecipientMustBeCreator), and the factory then uses the creator.",
709
734
  native ? "value must equal launchFee + devBuy exactly (ValueMismatch otherwise)." : "value must equal launchFee exactly; devBuy is pulled in the pair token after the approval.",
@@ -737,6 +762,7 @@ export class Parabolic {
737
762
  devBuy,
738
763
  notes: [
739
764
  "Unsigned. The creator wallet signs; it becomes the deployer (snipe-tax exempt, creator-fee claimant through the fee escrow).",
765
+ ...(memo ? [`To be listed on parabolic.family/agents sign the \`memo\` pair (approval, then tx) instead: the same launch through the router carrying the note "${MCP_LAUNCH_NOTE}". EOA-only.`] : []),
740
766
  economicsNote,
741
767
  "ParabolicMemoRouter.launch / launchAndBuy exist for routed launches (the opening buy inside the launch transaction; a memo-wrapped call also carries a referral code but is EOA-only). Set PARABOLIC_MEMO_ROUTER and pass devBuy to get launchAndBuy.",
742
768
  ],