@candledottv/cli 0.13.10 → 0.13.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +80 -23
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3476,7 +3476,7 @@ var init_terminal_theme = __esm(() => {
3476
3476
  });
3477
3477
 
3478
3478
  // src/version.ts
3479
- var CLI_VERSION = "0.13.10";
3479
+ var CLI_VERSION = "0.13.11";
3480
3480
 
3481
3481
  // src/presentation.ts
3482
3482
  function terminalStyle(deps, stream, machine = false) {
@@ -15771,7 +15771,9 @@ var init_trading = __esm(() => {
15771
15771
  transaction: exports_external.string().min(1),
15772
15772
  maxDebitLamports: exports_external.string().regex(/^\d+$/),
15773
15773
  expiresAt: exports_external.number().finite(),
15774
- fee: feeSchema.optional()
15774
+ fee: feeSchema.optional(),
15775
+ feeWallet: exports_external.string().optional(),
15776
+ feeWalletSource: exports_external.string().optional()
15775
15777
  });
15776
15778
  walletSchema = exports_external.object({
15777
15779
  id: exports_external.string(),
@@ -38464,7 +38466,7 @@ var init_token_clusters = __esm(() => {
38464
38466
  });
38465
38467
 
38466
38468
  // ../mcp/src/version.ts
38467
- var SERVER_VERSION = "0.10.28";
38469
+ var SERVER_VERSION = "0.10.29";
38468
38470
 
38469
38471
  // ../mcp/src/update-notice.ts
38470
38472
  function newer(a, b) {
@@ -39722,7 +39724,7 @@ var init_launch_definition = __esm(() => {
39722
39724
  {
39723
39725
  key: "feeWallet",
39724
39726
  type: "string",
39725
- help: "Solana only: the wallet this launch's curve and pool fees earn to, an on-curve wallet or a Squads v4 vault; defaults to the account wallet.",
39727
+ help: "Solana only: the wallet this launch's curve and pool fees earn to, an on-curve wallet or a Squads v4 vault; defaults to the wallet that launches the token (the account wallet on a server without LAUNCH_FEE_WALLET_FROM_LAUNCHER, except an embedded launch).",
39726
39728
  chains: [
39727
39729
  "solana"
39728
39730
  ],
@@ -44683,6 +44685,18 @@ function buildRequest(name, args, cfg) {
44683
44685
  init: { method: "POST", headers: jsonHeaders(apiKey), body: JSON.stringify(body) }
44684
44686
  };
44685
44687
  }
44688
+ case "candle_atomic_launch_dry_run": {
44689
+ const apiKey = requireApiKey2(cfg);
44690
+ const { payer, chain: _chain, buyAmount: _buyAmount, ...rest } = args;
44691
+ return {
44692
+ url: `${base2}/api/v1/launch/atomic/dry-run`,
44693
+ init: {
44694
+ method: "POST",
44695
+ headers: jsonHeaders(apiKey),
44696
+ body: JSON.stringify({ ...rest, chain: "solana", payer: payer ?? { type: "main" } })
44697
+ }
44698
+ };
44699
+ }
44686
44700
  case "candle_get_market": {
44687
44701
  const { chain: chain2, mint } = args;
44688
44702
  return {
@@ -45355,7 +45369,7 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
45355
45369
  }, async (args) => callAndRelay("candle_claim_staking_reward", args, getConfig(), doFetch));
45356
45370
  register("candle_get_fees", {
45357
45371
  title: "Read the creator fees this account's tokens can pay",
45358
- description: "The tokens launched by the account's own wallets, with what each could pay now in creator fees " + "(raw units from direct chain reads) and `claimable: true` or the `reason` it is not. Reads only; " + "moves nothing. It returns no earned or paid-out totals. An unreadable token is marked, never " + "shown as zero. Paged: pass `continueCursor` back as `cursor`.",
45372
+ description: "The tokens launched by the account's own wallets, with what each could pay now in creator fees " + "(raw units from direct chain reads) and a `reason` saying who can claim: `claimable_by_key` on a " + "claimable Solana row, and otherwise why this key cannot (including `claimable_via_web_session` " + "and `fee_wallet_designated`, which name whose authority collects). Reads only; " + "moves nothing. It returns no earned or paid-out totals. An unreadable token is marked, never " + "shown as zero. Paged: pass `continueCursor` back as `cursor`.",
45359
45373
  inputSchema: getFeesShape
45360
45374
  }, async (args) => callAndRelay("candle_get_fees", args, getConfig(), doFetch));
45361
45375
  register("candle_claim_fees", {
@@ -45468,6 +45482,12 @@ MARKET_NOT_FOUND means Candle has no market for that token and this could not ru
45468
45482
  const result = await executeTrade(args, getConfig(), doFetch);
45469
45483
  return { content: [{ type: "text", text: result.text }], ...result.isError ? { isError: true } : {} };
45470
45484
  });
45485
+ register("candle_atomic_launch_dry_run", {
45486
+ title: "Dry-run an atomic Solana launch",
45487
+ description: "Check a Solana launch bundled with first buys and price each buy, without building anything. Runs the " + "same checks as the atomic build, in the same order (payers, Believer check, fee and spend limits, the " + "key's transaction cap), then returns the launch preview (curveTerms) and one fill per first buy: the " + "tokens it would receive and the floor the build would sign it at. Reads only; moves nothing, reserves " + "nothing, and the clientLaunchId stays unused. It does not check balances, the daily cap, or the " + "transaction's size, so the real launch can still refuse. Needs launch:write, swap:write and Pro or Max.",
45488
+ inputSchema: atomicLaunchDryRunShape,
45489
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
45490
+ }, async (args) => callAndRelay("candle_atomic_launch_dry_run", args, getConfig(), doFetch));
45471
45491
  register("candle_launch_and_seed", {
45472
45492
  title: "Launch a token and seed it",
45473
45493
  description: "Launch a new token from the account's embedded wallet, with an optional dev-buy seed, then " + "return the fresh market state and token links in one result. On solana a seed makes this " + (options.headlessSeed === true ? "the seed is a separate first-buy transaction in the same Jito bundle as the launch, so " + "both land or neither does. That works on every plan, Free included, and needs no " + "swap:write. On hood the seed is " : "the atomic launch: the launch and the seed are two transactions Candle signs and sends as " + "one Jito bundle, so both land or neither does. That needs Pro or Max (TIER_REQUIRED " + "otherwise) and swap:write on the key, and the result carries bundleId. On hood the seed is ") + "a best-effort follow-up. A launch with no seed works on every plan, Free included. MOVES " + "REAL FUNDS unless dryRun; dry-run first, which spends nothing. Seeds above the platform " + "dev-buy ceiling are rejected (DEV_BUY_TOO_HIGH): at most 0.5 SOL / 500 USDC / 2,000,000 " + "CNDL, or on an exp- curve 10% of the threshold when that is lower; the server holds the " + "creator's own seed to the effective ceiling, so launch with the largest devBuy it allows " + "and top up with candle_trade. " + LAUNCH_SHARED_SENTENCES + (imageDir ? IMAGE_PATH_DISCLOSURE : ""),
@@ -45670,7 +45690,7 @@ async function registerEligibleProfileTool(server, env = process.env, doFetch =
45670
45690
  }
45671
45691
  return eligible;
45672
45692
  }
45673
- var VAMP_CANDIDATES_DESCRIPTION, localProfileTools, STAKING_DISCLOSURE = "No instant unstake. Read pool.withdrawalTimelockSeconds for the wait. Solana rewards accrue to the holding wallet. sCNDL in any eligible account wallet counts toward Pro and earns the account's Hood staking reward, except a wallet another account also claims, wallets past the 200-wallet cap, and an account with no EVM wallet. CNDL in a pending withdrawal counts toward nothing for Pro.", stakingWriteShape, TOOL_NAMES, LAB_TOOL_NAMES, PROFILE_EDIT_TOOL_NAMES, isProfileEditTool = (name) => PROFILE_EDIT_TOOL_NAMES.includes(name), OPERATION_NOT_FOUND_RULE, getMarketShape, TOKEN_EVENTS_LIMIT_MESSAGE = "limit must be a whole number from 1 to 1000", tokenEventsLimit, TOKEN_EVENTS_KIND_NOTE = "kept back from the request and applied to the returned page by this server, so a filtered page can be shorter than limit while older events of other kinds remain: page with nextCursor as before until it is null", tokenCardShape, tokenEventsShape, tokenForensicsShape, FEED_LIMIT_MESSAGE = "limit must be a whole number from 1 to 200", feedLimit, getFeedShape, reportActivityShape, getAgentProfileShape, listAgentsShape, createPostShape, deletePostShape, listAgentPostsShape, getAgentPositionsShape, getOperationShape, vampCandidatesShape, getFeesShape, claimFeesShape, resolveTokenShape, profileWalletsShape, profilePnlShape, profileTradesShape, setProfileWalletsShape, swapShape, tradeShape, tokenImageUrl, tokenBannerUrl, localImageShape, localLaunchTokenShape, localLaunchAndSeedShape, IMAGE_PATH_DISCLOSURE, transferShape, sweepShape, PROFILE_PNL_HYPERLIQUID;
45693
+ var VAMP_CANDIDATES_DESCRIPTION, localProfileTools, STAKING_DISCLOSURE = "No instant unstake. Read pool.withdrawalTimelockSeconds for the wait. Solana rewards accrue to the holding wallet. sCNDL in any eligible account wallet counts toward Pro and earns the account's Hood staking reward, except a wallet another account also claims, wallets past the 200-wallet cap, and an account with no EVM wallet. CNDL in a pending withdrawal counts toward nothing for Pro.", stakingWriteShape, TOOL_NAMES, LAB_TOOL_NAMES, PROFILE_EDIT_TOOL_NAMES, isProfileEditTool = (name) => PROFILE_EDIT_TOOL_NAMES.includes(name), OPERATION_NOT_FOUND_RULE, getMarketShape, TOKEN_EVENTS_LIMIT_MESSAGE = "limit must be a whole number from 1 to 1000", tokenEventsLimit, TOKEN_EVENTS_KIND_NOTE = "kept back from the request and applied to the returned page by this server, so a filtered page can be shorter than limit while older events of other kinds remain: page with nextCursor as before until it is null", tokenCardShape, tokenEventsShape, tokenForensicsShape, FEED_LIMIT_MESSAGE = "limit must be a whole number from 1 to 200", feedLimit, getFeedShape, reportActivityShape, getAgentProfileShape, listAgentsShape, createPostShape, deletePostShape, listAgentPostsShape, getAgentPositionsShape, getOperationShape, vampCandidatesShape, getFeesShape, atomicPayerShape, atomicLaunchDryRunShape, claimFeesShape, resolveTokenShape, profileWalletsShape, profilePnlShape, profileTradesShape, setProfileWalletsShape, swapShape, tradeShape, tokenImageUrl, tokenBannerUrl, localImageShape, localLaunchTokenShape, localLaunchAndSeedShape, IMAGE_PATH_DISCLOSURE, transferShape, sweepShape, PROFILE_PNL_HYPERLIQUID;
45674
45694
  var init_tools = __esm(() => {
45675
45695
  init_zod();
45676
45696
  init_client2();
@@ -45735,6 +45755,7 @@ var init_tools = __esm(() => {
45735
45755
  "candle_get_plans",
45736
45756
  "candle_trade",
45737
45757
  "candle_launch_and_seed",
45758
+ "candle_atomic_launch_dry_run",
45738
45759
  "candle_swap",
45739
45760
  "candle_transfer",
45740
45761
  "candle_sweep",
@@ -45886,6 +45907,22 @@ var init_tools = __esm(() => {
45886
45907
  cursor: exports_external.string().optional().describe("The previous page's continueCursor, verbatim"),
45887
45908
  limit: exports_external.number().optional().describe("Tokens per page, 1 to 50 (default 20). Each one costs chain reads")
45888
45909
  };
45910
+ atomicPayerShape = exports_external.union([
45911
+ exports_external.object({ type: exports_external.literal("main") }),
45912
+ exports_external.object({ type: exports_external.literal("linked"), linkedWalletId: exports_external.string().min(1) })
45913
+ ]);
45914
+ atomicLaunchDryRunShape = (() => {
45915
+ const { buyAmount: _buyAmount, chain: _chain, ...launch } = launchTokenShape;
45916
+ return {
45917
+ ...launch,
45918
+ clientLaunchId: exports_external.string().optional().describe("Not used by a dry run; send the id you will launch with"),
45919
+ payer: atomicPayerShape.optional().describe("Who pays for the launch: {type:'main'} (default) or {type:'linked', linkedWalletId}"),
45920
+ firstBuys: exports_external.array(exports_external.object({
45921
+ payer: atomicPayerShape,
45922
+ amountRaw: exports_external.string().regex(/^[1-9][0-9]*$/).describe("Quote-asset raw units")
45923
+ })).min(1).max(4).describe("One to four first buys, each priced on the curve this launch would deploy")
45924
+ };
45925
+ })();
45889
45926
  claimFeesShape = {
45890
45927
  mint: exports_external.string().describe("The launched token: a Solana mint or a Hood token address, as candle_get_fees lists it"),
45891
45928
  dryRun: exports_external.boolean().optional().describe("Check and read only. Sends nothing and writes nothing. Use it first to see what would be claimed")
@@ -76100,7 +76137,7 @@ var LAUNCH_DEFINITION = {
76100
76137
  {
76101
76138
  key: "feeWallet",
76102
76139
  type: "string",
76103
- help: "Solana only: the wallet this launch's curve and pool fees earn to, an on-curve wallet or a Squads v4 vault; defaults to the account wallet.",
76140
+ help: "Solana only: the wallet this launch's curve and pool fees earn to, an on-curve wallet or a Squads v4 vault; defaults to the wallet that launches the token (the account wallet on a server without LAUNCH_FEE_WALLET_FROM_LAUNCHER, except an embedded launch).",
76104
76141
  chains: [
76105
76142
  "solana"
76106
76143
  ],
@@ -76756,7 +76793,7 @@ var HELP = {
76756
76793
  launch: {
76757
76794
  group: "Trade",
76758
76795
  summary: "Create a token on Solana or Hood, with an optional first buy",
76759
- description: "Creates a token from the wallet you name, with an optional first buy. Embedded launches use /launch/headless on every plan, with the key's embedded-wallet allowance and launch:write; no swap:write is needed. A Solana first buy is a creator bundle, signed by Candle. A Hood first buy is best effort after creation. TEE launches use /launch/self and require Pro or Max, allowLaunch, a bound key and verified authority. TEE buys need TEE_LAUNCH_BUYS_ENABLED on the server; Solana buys also need AGENT_TRADING_ENABLED and Jito. Existing server gates and ceilings apply. The embedded path previews the launch before confirmation; --dry-run stops at the preview. No buy creates only the token. Local image and banner uploads happen before confirmation and are public and permanent even if the launch is declined. Reuse --client-trade-id for recovery. On Solana, --fee-wallet <address> sets the wallet the launch's curve and pool fees earn to, an on-curve wallet by itself or a Squads v4 vault with --fee-wallet-multisig <address> and --fee-wallet-multisig-vault-index <n>; without it the fees earn to the account wallet, which the preview, the confirm and --check all say; a live launch also warns on stderr when it defaults, and --require-fee-wallet refuses the launch without one. --check answers first, before any of it: which launch path works on this key and server (embedded allowance, tier, allowLaunch, TEE_LAUNCH_BUYS_ENABLED) in one call, with nothing uploaded, built or sent; name a wallet with --wallet to narrow it, and it exits 1 when no path works. status reads one launch by its mint or clientLaunchId: build, signed, confirmed, trading, bonded, then migrated, with the market's lifecycle and migration fields. --wait follows it until the token is trading, the launch has failed, or ten minutes pass.",
76796
+ description: "Creates a token from the wallet you name, with an optional first buy. Embedded launches use /launch/headless on every plan, with the key's embedded-wallet allowance and launch:write; no swap:write is needed. A Solana first buy is a creator bundle, signed by Candle. A Hood first buy is best effort after creation. TEE launches use /launch/self and require Pro or Max, allowLaunch, a bound key and verified authority. TEE buys need TEE_LAUNCH_BUYS_ENABLED on the server; Solana buys also need AGENT_TRADING_ENABLED and Jito. Existing server gates and ceilings apply. The embedded path previews the launch before confirmation; --dry-run stops at the preview. No buy creates only the token. Local image and banner uploads happen before confirmation and are public and permanent even if the launch is declined. Reuse --client-trade-id for recovery. On Solana, --fee-wallet <address> sets the wallet the launch's curve and pool fees earn to, an on-curve wallet by itself or a Squads v4 vault with --fee-wallet-multisig <address> and --fee-wallet-multisig-vault-index <n>; without it the fees earn to the wallet that launches the token where the server has LAUNCH_FEE_WALLET_FROM_LAUNCHER on (an embedded launch already earns to its embedded wallet), otherwise to the account wallet, and the preview, the confirm and --check all say which; a live launch also warns on stderr when it defaults, and --require-fee-wallet refuses the launch without one. --check answers first, before any of it: which launch path works on this key and server (embedded allowance, tier, allowLaunch, TEE_LAUNCH_BUYS_ENABLED) in one call, with nothing uploaded, built or sent; name a wallet with --wallet to narrow it, and it exits 1 when no path works. status reads one launch by its mint or clientLaunchId: build, signed, confirmed, trading, bonded, then migrated, with the market's lifecycle and migration fields. --wait follows it until the token is trading, the launch has failed, or ten minutes pass.",
76760
76797
  usage: [LAUNCH_USAGE, "candle launch status <mint-or-client-launch-id> [--wait]"],
76761
76798
  rows: [
76762
76799
  {
@@ -78207,6 +78244,7 @@ var TOOL_CLASSES = {
78207
78244
  candle_execution_status: READ,
78208
78245
  candle_get_operation: READ,
78209
78246
  candle_get_fees: READ,
78247
+ candle_atomic_launch_dry_run: READ,
78210
78248
  candle_get_staking: READ,
78211
78249
  candle_perps_markets: READ,
78212
78250
  candle_perps_market: READ,
@@ -89775,6 +89813,8 @@ var REASON_WORDS = {
89775
89813
  embedded_wallet_not_permitted: "this key may not use the embedded wallet",
89776
89814
  not_recipient: "the fees go to someone else, or the token has no fee vault",
89777
89815
  fee_wallet_designated: "the fees go to this launch's designated fee wallet, which claims them itself",
89816
+ claimable_by_key: "claimable by this key",
89817
+ claimable_via_web_session: "the fees go to this account's web wallet; a signed-in session claims them",
89778
89818
  insufficient_gas: "the recipient wallet cannot cover the network fee"
89779
89819
  };
89780
89820
  function reasonText(reason, missing) {
@@ -89809,7 +89849,7 @@ async function feesList(args, ctx) {
89809
89849
  notice(ctx.deps, "stdout", "note", "No launched tokens on this account.");
89810
89850
  else {
89811
89851
  const rows = page.map((row) => {
89812
- const status = row.unreadable ? "could not be read" : row.claimable ? `claimable: ${amountsText(row.claimableAmounts, missing)}` : `not claimable: ${reasonText(row.reason, missing)}`;
89852
+ const status = row.unreadable ? "could not be read" : row.claimable ? `${row.reason === "claimable_by_key" ? "claimable by this key" : "claimable"}: ${amountsText(row.claimableAmounts, missing)}` : `not claimable: ${reasonText(row.reason, missing)}`;
89813
89853
  return [
89814
89854
  safeText(String(row.symbol ?? row.name ?? row.mint)),
89815
89855
  safeText(String(row.chain)),
@@ -91028,7 +91068,8 @@ function decodeAddress(value, flag) {
91028
91068
  throw new Error(`${flag} takes a Solana address.`);
91029
91069
  }
91030
91070
  }
91031
- function feeWalletLines(selection, echo) {
91071
+ var fromLauncher = (echo) => echo?.feeWalletSource === "launching_wallet" && typeof echo.feeWallet === "string";
91072
+ function feeWalletLines(selection, echo, launcherDefault = false) {
91032
91073
  if (selection)
91033
91074
  return [
91034
91075
  `Fee wallet: ${selection.feeWallet} (earns this launch's fees; set by --fee-wallet)`,
@@ -91036,14 +91077,20 @@ function feeWalletLines(selection, echo) {
91036
91077
  `Fee wallet multisig: ${selection.feeWalletMultisig.address}, vault ${selection.feeWalletMultisig.vaultIndex} (the Squads v4 multisig behind the fee wallet)`
91037
91078
  ] : []
91038
91079
  ];
91080
+ if (fromLauncher(echo))
91081
+ return [
91082
+ `Fee wallet: ${echo.feeWallet} (defaults to the launching wallet; pass --fee-wallet <address> to change it)`
91083
+ ];
91084
+ if (launcherDefault)
91085
+ return ["Fee wallet: defaults to the launching wallet (pass --fee-wallet <address> to change it)."];
91039
91086
  return [
91040
- echo ? `Fee wallet: ${echo} (defaults to the account wallet; pass --fee-wallet <address> to change it)` : "Fee wallet: defaults to the account wallet (pass --fee-wallet <address> to change it)."
91087
+ echo?.feeWallet ? `Fee wallet: ${echo.feeWallet} (defaults to the account wallet; pass --fee-wallet <address> to change it)` : "Fee wallet: defaults to the account wallet (pass --fee-wallet <address> to change it)."
91041
91088
  ];
91042
91089
  }
91043
- var FEE_WALLET_DEFAULT_WARNING = "No --fee-wallet given: this launch's curve and pool fees earn to the account wallet. Pass --fee-wallet <address> to send them to another wallet.";
91044
- function feeWalletQuoteLine(selection) {
91090
+ var FEE_WALLET_DEFAULT_WARNING = "No --fee-wallet given: this launch's curve and pool fees earn to the launching wallet, or to the account wallet on a server that does not record the launching wallet; the confirmation names which. Pass --fee-wallet <address> to send them to another wallet.";
91091
+ function feeWalletQuoteLine(selection, echo) {
91045
91092
  if (!selection)
91046
- return "defaults to the account wallet";
91093
+ return fromLauncher(echo) ? `${echo.feeWallet} (the launching wallet, by default)` : "defaults to the account wallet";
91047
91094
  return `${selection.feeWallet}${selection.feeWalletMultisig ? ` (Squads vault of ${selection.feeWalletMultisig.address}, vault ${selection.feeWalletMultisig.vaultIndex})` : ""}`;
91048
91095
  }
91049
91096
 
@@ -91190,7 +91237,8 @@ var checkSchema = exports_external.object({
91190
91237
  switches: exports_external.object({
91191
91238
  headlessLaunch: exports_external.boolean(),
91192
91239
  agentTrading: exports_external.boolean(),
91193
- teeLaunchBuys: exports_external.boolean()
91240
+ teeLaunchBuys: exports_external.boolean(),
91241
+ feeWalletFromLauncher: exports_external.boolean().optional()
91194
91242
  }),
91195
91243
  embedded: exports_external.object({
91196
91244
  solana: exports_external.object({ address: exports_external.string(), delegated: exports_external.boolean().optional() }).nullable().optional(),
@@ -91302,8 +91350,9 @@ async function launchCheck(ctx, key, walletFlag, requestedChain, feeWallet = und
91302
91350
  const lines = [`Launch paths for key ${answer2.key.keyPrefix} (tier ${answer2.key.tier}):`];
91303
91351
  if (requestedChain)
91304
91352
  lines.push(`Requested launch chain: ${chainName(requestedChain)}.`);
91353
+ const launcherDefault = answer2.switches.feeWalletFromLauncher === true;
91305
91354
  if (!requestedChain || requestedChain === "solana")
91306
- lines.push(...feeWalletLines(feeWallet));
91355
+ lines.push(...feeWalletLines(feeWallet, undefined, launcherDefault));
91307
91356
  if (walletFlag === undefined || embeddedOnly)
91308
91357
  lines.push(...embeddedLines(answer2, requestedChain));
91309
91358
  for (const row of shownWallets)
@@ -91317,7 +91366,7 @@ async function launchCheck(ctx, key, walletFlag, requestedChain, feeWallet = und
91317
91366
  ...requestedChain ? { requestedChain } : {},
91318
91367
  key: answer2.key,
91319
91368
  switches: answer2.switches,
91320
- ...feeWallet ? { feeWallet: { ...feeWallet, set: true } } : { feeWallet: { default: "account wallet", set: false } },
91369
+ ...feeWallet ? { feeWallet: { ...feeWallet, set: true } } : { feeWallet: { default: launcherDefault ? "launching wallet" : "account wallet", set: false } },
91321
91370
  ...answer2.embedded ? { embedded: answer2.embedded } : {},
91322
91371
  wallets: shownWallets.map((row) => ({
91323
91372
  ...row,
@@ -91664,7 +91713,7 @@ async function launch(args, ctx) {
91664
91713
  fee: built.fee ?? { bps: 0, feeRaw: "0" },
91665
91714
  minimumReceived: buy ? "not quoted (the first buy on the new curve)" : "0 tokens (no first buy)",
91666
91715
  maxDebitLamports: built.maxDebitLamports,
91667
- feeWallet: feeWalletQuoteLine(feeWallet),
91716
+ feeWallet: feeWalletQuoteLine(feeWallet, built),
91668
91717
  tokenRisks: []
91669
91718
  };
91670
91719
  notice(ctx.deps, "stderr", "note", buyNotice(buy, "solana").trim());
@@ -91794,14 +91843,19 @@ var previewSchema = exports_external.object({
91794
91843
  }).passthrough().optional(),
91795
91844
  devBuyMax: exports_external.string().nullable().optional(),
91796
91845
  feeWallet: exports_external.string().optional(),
91846
+ feeWalletSource: exports_external.string().optional(),
91797
91847
  fills: exports_external.array(exports_external.object({ index: exports_external.number(), amountRaw: exports_external.string(), supplyPct: exports_external.number() }).passthrough()).optional()
91798
91848
  }).passthrough();
91799
91849
  var percent = (value) => `${Number(value.toFixed(4))}%`;
91850
+ function feeWalletEchoOf(answer2) {
91851
+ const parsed = exports_external.object({ feeWallet: exports_external.string().optional(), feeWalletSource: exports_external.string().optional() }).safeParse(answer2);
91852
+ return parsed.success ? parsed.data : undefined;
91853
+ }
91800
91854
  function previewLines(answer2, chain2, feeWallet = undefined) {
91801
91855
  const parsed = previewSchema.safeParse(answer2);
91802
91856
  if (!parsed.success)
91803
91857
  return "";
91804
- const { resolved, curveTerms: terms, devBuyMax, feeWallet: echo, fills } = parsed.data;
91858
+ const { resolved, curveTerms: terms, devBuyMax, feeWallet: echo, feeWalletSource, fills } = parsed.data;
91805
91859
  const quote = (resolved?.quoteAsset ?? LAUNCH_DEFINITION.defaultQuote[chain2]).toUpperCase();
91806
91860
  const decimals = (chain2 === "hood" ? HOOD_BASES[quote] : BASES[quote])?.decimals;
91807
91861
  const whole = (raw) => decimals === undefined ? `${raw} raw` : `${shortAmount(raw, decimals)} ${quote}`;
@@ -91820,7 +91874,7 @@ function previewLines(answer2, chain2, feeWallet = undefined) {
91820
91874
  if (devBuyMax)
91821
91875
  lines.push(`Dev-buy ceiling: ${whole(devBuyMax)}.`);
91822
91876
  if (chain2 === "solana")
91823
- lines.push(...feeWalletLines(feeWallet, echo));
91877
+ lines.push(...feeWalletLines(feeWallet, { feeWallet: echo, feeWalletSource }));
91824
91878
  return lines.length ? `${lines.join(`
91825
91879
  `)}
91826
91880
  ` : "";
@@ -91886,7 +91940,9 @@ var atomicLegSchema = exports_external.object({
91886
91940
  var atomicBuildSchema = exports_external.object({
91887
91941
  bundleId: exports_external.string().min(1),
91888
91942
  legs: exports_external.array(atomicLegSchema),
91889
- expiresAt: exports_external.number().finite()
91943
+ expiresAt: exports_external.number().finite(),
91944
+ feeWallet: exports_external.string().optional(),
91945
+ feeWalletSource: exports_external.string().optional()
91890
91946
  });
91891
91947
  var atomicOutcomeSchema = exports_external.discriminatedUnion("status", [
91892
91948
  exports_external.object({ status: exports_external.literal("landed"), bundleId: exports_external.string(), mint: exports_external.string(), signatures: exports_external.array(exports_external.string()) }).passthrough(),
@@ -91930,7 +91986,7 @@ async function atomicLaunch(ctx, key, args) {
91930
91986
  candleFee: reading.feeRaw > 0n ? `${decimalAmount(reading.feeRaw.toString(), decimals)} ${quoteAsset} (the tier fee on the first buy, in its leg)` : "none on this first buy",
91931
91987
  minimumReceived: minOut !== undefined ? `${minOut} raw units of the new token (the first buy's floor)` : "not quoted",
91932
91988
  maxLoss: quoteAsset === "SOL" ? sol : `${sol} and ${decimalAmount(reading.quoteRaw.toString(), decimals)} ${quoteAsset}`,
91933
- feeWallet: feeWalletQuoteLine(feeWalletSelection(flags)),
91989
+ feeWallet: feeWalletQuoteLine(feeWalletSelection(flags), built),
91934
91990
  tokenRisks: [],
91935
91991
  bundleId: built.bundleId
91936
91992
  };
@@ -92092,7 +92148,7 @@ async function embeddedLaunch(ctx, key, args) {
92092
92148
  venue: "curve launch (signed by Candle)",
92093
92149
  priceImpactPct: null,
92094
92150
  minimumReceived: "0 tokens (no first buy)",
92095
- ...chain2 === "solana" ? { feeWallet: feeWalletQuoteLine(feeWalletSelection(flags)) } : {},
92151
+ ...chain2 === "solana" ? { feeWallet: feeWalletQuoteLine(feeWalletSelection(flags), feeWalletEchoOf(answer2)) } : {},
92096
92152
  tokenRisks: []
92097
92153
  };
92098
92154
  if (buy && chain2 === "solana") {
@@ -92867,6 +92923,7 @@ var MCP_TOOL_NAMES = [
92867
92923
  "candle_execution_status",
92868
92924
  "candle_get_operation",
92869
92925
  "candle_get_fees",
92926
+ "candle_atomic_launch_dry_run",
92870
92927
  "candle_claim_fees",
92871
92928
  "candle_get_staking",
92872
92929
  "candle_stake",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@candledottv/cli",
3
- "version": "0.13.10",
3
+ "version": "0.13.11",
4
4
  "description": "The Candle CLI: authorize a device from your browser, then manage API keys, wallets, and setup health from the terminal",
5
5
  "type": "module",
6
6
  "bin": {