@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 +14 -9
- package/dist/config.d.ts +32 -8
- package/dist/config.js +54 -11
- package/dist/config.js.map +1 -1
- package/dist/curve.d.ts +1 -1
- package/dist/curve.js +1 -1
- package/dist/docs.d.ts +1 -1
- package/dist/docs.js +8 -7
- package/dist/docs.js.map +1 -1
- package/dist/parabolic.d.ts +32 -4
- package/dist/parabolic.js +30 -4
- package/dist/parabolic.js.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/tx.d.ts +25 -0
- package/dist/tx.js +29 -0
- package/dist/tx.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +54 -13
- package/src/curve.ts +1 -1
- package/src/docs.ts +8 -7
- package/src/parabolic.ts +32 -6
- package/src/server.ts +2 -1
- package/src/tx.ts +32 -0
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
|
|
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.
|
|
23
|
-
|
|
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 | `
|
|
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 / $
|
|
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)
|
|
62
|
-
|
|
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
|
|
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)
|
|
16
|
-
*
|
|
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 / $
|
|
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
|
|
71
|
-
/**
|
|
72
|
-
|
|
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)
|
|
16
|
-
*
|
|
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},
|
|
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
|
|
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
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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:
|
|
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:
|
|
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 $
|
|
16
|
-
"- Reserved tokens: supply × phantom / (phantom + threshold) = 5,000 /
|
|
17
|
-
"- Launch fee: $1.00 USDC (msg.value on launchToken) +
|
|
18
|
-
"-
|
|
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,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.",
|
|
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
|
|
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,
|
|
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"}
|
package/dist/parabolic.d.ts
CHANGED
|
@@ -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
|
|
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:
|
|
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
|
],
|