@candledottv/cli 0.13.8 → 0.13.9

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 +255 -16
  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.8";
3479
+ var CLI_VERSION = "0.13.9";
3480
3480
 
3481
3481
  // src/presentation.ts
3482
3482
  function terminalStyle(deps, stream, machine = false) {
@@ -15613,6 +15613,9 @@ ${quote.fee ? `Tier fee: ${safeText(quote.fee.bps)} bps (${safeText(quote.fee.fe
15613
15613
  `);
15614
15614
  if (quote.maxLoss)
15615
15615
  output.write(`Most this wallet can lose: ${safeText(quote.maxLoss)}
15616
+ `);
15617
+ if (quote.feeWallet)
15618
+ output.write(`Fee wallet: ${safeText(quote.feeWallet)}
15616
15619
  `);
15617
15620
  if (quote.legs)
15618
15621
  output.write(`Legs, signed one at a time: ${quote.legs.map(safeText).join(", ")}
@@ -38396,7 +38399,7 @@ var init_token_clusters = __esm(() => {
38396
38399
  });
38397
38400
 
38398
38401
  // ../mcp/src/version.ts
38399
- var SERVER_VERSION = "0.10.27";
38402
+ var SERVER_VERSION = "0.10.28";
38400
38403
 
38401
38404
  // ../mcp/src/update-notice.ts
38402
38405
  function newer(a, b) {
@@ -39651,6 +39654,77 @@ var init_launch_definition = __esm(() => {
39651
39654
  }
39652
39655
  }
39653
39656
  },
39657
+ {
39658
+ key: "feeWallet",
39659
+ type: "string",
39660
+ 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.",
39661
+ chains: [
39662
+ "solana"
39663
+ ],
39664
+ surfaces: {
39665
+ cli: {
39666
+ flag: "--fee-wallet",
39667
+ value: "<address>"
39668
+ },
39669
+ mcp: {
39670
+ key: "feeWallet"
39671
+ },
39672
+ sdk: {
39673
+ key: "feeWallet"
39674
+ }
39675
+ }
39676
+ },
39677
+ {
39678
+ key: "feeWalletMultisig.address",
39679
+ type: "string",
39680
+ help: "The Squads v4 multisig behind an off-curve --fee-wallet vault; takes --fee-wallet-multisig-vault-index.",
39681
+ chains: [
39682
+ "solana"
39683
+ ],
39684
+ requires: [
39685
+ "feeWallet"
39686
+ ],
39687
+ surfaces: {
39688
+ cli: {
39689
+ flag: "--fee-wallet-multisig",
39690
+ value: "<address>"
39691
+ },
39692
+ mcp: {
39693
+ key: "feeWalletMultisig.address"
39694
+ },
39695
+ sdk: {
39696
+ key: "feeWalletMultisig.address"
39697
+ }
39698
+ }
39699
+ },
39700
+ {
39701
+ key: "feeWalletMultisig.vaultIndex",
39702
+ type: "integer",
39703
+ help: "The Squads vault index, 0 to 255, that with the multisig derives an off-curve --fee-wallet.",
39704
+ chains: [
39705
+ "solana"
39706
+ ],
39707
+ range: {
39708
+ min: "0",
39709
+ max: "255",
39710
+ unit: "vault index"
39711
+ },
39712
+ requires: [
39713
+ "feeWalletMultisig.address"
39714
+ ],
39715
+ surfaces: {
39716
+ cli: {
39717
+ flag: "--fee-wallet-multisig-vault-index",
39718
+ value: "<n>"
39719
+ },
39720
+ mcp: {
39721
+ key: "feeWalletMultisig.vaultIndex"
39722
+ },
39723
+ sdk: {
39724
+ key: "feeWalletMultisig.vaultIndex"
39725
+ }
39726
+ }
39727
+ },
39654
39728
  {
39655
39729
  key: "buy",
39656
39730
  type: "decimal",
@@ -39850,7 +39924,7 @@ var M2_TOP_KEYS, GROUPED_TOP_KEYS, LAUNCH_SHARED_SENTENCES, SOCIAL_KEYS, SOCIALS
39850
39924
  var init_launch_schema = __esm(() => {
39851
39925
  init_zod();
39852
39926
  init_launch_definition();
39853
- M2_TOP_KEYS = new Set(["wallet", "buy"]);
39927
+ M2_TOP_KEYS = new Set(["wallet", "buy", "feeWallet", "feeWalletMultisig"]);
39854
39928
  GROUPED_TOP_KEYS = new Set(["socials", "curve", "poolFee"]);
39855
39929
  LAUNCH_SHARED_SENTENCES = mcpLaunchFields().map((field) => field.help).join(" ");
39856
39930
  SOCIAL_KEYS = mcpLaunchFields().flatMap((field) => {
@@ -75958,6 +76032,77 @@ var LAUNCH_DEFINITION = {
75958
76032
  }
75959
76033
  }
75960
76034
  },
76035
+ {
76036
+ key: "feeWallet",
76037
+ type: "string",
76038
+ 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.",
76039
+ chains: [
76040
+ "solana"
76041
+ ],
76042
+ surfaces: {
76043
+ cli: {
76044
+ flag: "--fee-wallet",
76045
+ value: "<address>"
76046
+ },
76047
+ mcp: {
76048
+ key: "feeWallet"
76049
+ },
76050
+ sdk: {
76051
+ key: "feeWallet"
76052
+ }
76053
+ }
76054
+ },
76055
+ {
76056
+ key: "feeWalletMultisig.address",
76057
+ type: "string",
76058
+ help: "The Squads v4 multisig behind an off-curve --fee-wallet vault; takes --fee-wallet-multisig-vault-index.",
76059
+ chains: [
76060
+ "solana"
76061
+ ],
76062
+ requires: [
76063
+ "feeWallet"
76064
+ ],
76065
+ surfaces: {
76066
+ cli: {
76067
+ flag: "--fee-wallet-multisig",
76068
+ value: "<address>"
76069
+ },
76070
+ mcp: {
76071
+ key: "feeWalletMultisig.address"
76072
+ },
76073
+ sdk: {
76074
+ key: "feeWalletMultisig.address"
76075
+ }
76076
+ }
76077
+ },
76078
+ {
76079
+ key: "feeWalletMultisig.vaultIndex",
76080
+ type: "integer",
76081
+ help: "The Squads vault index, 0 to 255, that with the multisig derives an off-curve --fee-wallet.",
76082
+ chains: [
76083
+ "solana"
76084
+ ],
76085
+ range: {
76086
+ min: "0",
76087
+ max: "255",
76088
+ unit: "vault index"
76089
+ },
76090
+ requires: [
76091
+ "feeWalletMultisig.address"
76092
+ ],
76093
+ surfaces: {
76094
+ cli: {
76095
+ flag: "--fee-wallet-multisig-vault-index",
76096
+ value: "<n>"
76097
+ },
76098
+ mcp: {
76099
+ key: "feeWalletMultisig.vaultIndex"
76100
+ },
76101
+ sdk: {
76102
+ key: "feeWalletMultisig.vaultIndex"
76103
+ }
76104
+ }
76105
+ },
75961
76106
  {
75962
76107
  key: "buy",
75963
76108
  type: "decimal",
@@ -76546,7 +76691,7 @@ var HELP = {
76546
76691
  launch: {
76547
76692
  group: "Trade",
76548
76693
  summary: "Create a token on Solana or Hood, with an optional first buy",
76549
- 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. --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.",
76694
+ 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. --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.",
76550
76695
  usage: [LAUNCH_USAGE],
76551
76696
  rows: [],
76552
76697
  flags: [
@@ -90543,9 +90688,81 @@ init_zod();
90543
90688
  init_args();
90544
90689
  init_client();
90545
90690
  init_evm_lite();
90691
+ import { randomUUID as randomUUID6 } from "node:crypto";
90692
+
90693
+ // src/fee-wallet.ts
90694
+ init_solana_lite();
90695
+ var FEE_WALLET_FLAGS = ["--fee-wallet", "--fee-wallet-multisig", "--fee-wallet-multisig-vault-index"];
90696
+ var SQUADS_V4_PROGRAM_ID = decodePubkey("SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf");
90697
+ var UNSUPPORTED = "Fee wallet must be an on-curve Solana wallet or a verified Squads v4 vault when multisig fees are enabled";
90698
+ function feeWalletGiven(flags) {
90699
+ return FEE_WALLET_FLAGS.some((flag) => flags[flag] !== undefined);
90700
+ }
90701
+ function feeWalletSelection(flags) {
90702
+ if (!feeWalletGiven(flags))
90703
+ return;
90704
+ const raw = flags["--fee-wallet"];
90705
+ if (raw === undefined)
90706
+ throw new Error("--fee-wallet-multisig needs --fee-wallet <address>, the vault fees earn to");
90707
+ const bytes = decodeAddress(raw, "--fee-wallet");
90708
+ const feeWallet = encodePubkey(bytes);
90709
+ if (isOnCurve(bytes)) {
90710
+ if (flags["--fee-wallet-multisig"] !== undefined || flags["--fee-wallet-multisig-vault-index"] !== undefined)
90711
+ throw new Error(`--fee-wallet is an on-curve wallet and takes no --fee-wallet-multisig. ${UNSUPPORTED}`);
90712
+ return { feeWallet };
90713
+ }
90714
+ const multisig = flags["--fee-wallet-multisig"];
90715
+ const index = flags["--fee-wallet-multisig-vault-index"];
90716
+ if (multisig === undefined || index === undefined)
90717
+ throw new Error(`--fee-wallet is off-curve, a Squads v4 vault, and names its multisig with --fee-wallet-multisig <address> and --fee-wallet-multisig-vault-index <n>. ${UNSUPPORTED}`);
90718
+ if (!/^\d+$/.test(index) || Number(index) < 0 || Number(index) > 255)
90719
+ throw new Error("--fee-wallet-multisig-vault-index takes a whole number from 0 to 255");
90720
+ const multisigBytes = decodeAddress(multisig, "--fee-wallet-multisig");
90721
+ const vault = findProgramAddress([utf8("multisig"), multisigBytes, utf8("vault"), Uint8Array.of(Number(index))], SQUADS_V4_PROGRAM_ID).address;
90722
+ if (encodePubkey(vault) !== feeWallet)
90723
+ throw new Error(UNSUPPORTED);
90724
+ return { feeWallet, feeWalletMultisig: { address: encodePubkey(multisigBytes), vaultIndex: Number(index) } };
90725
+ }
90726
+ function feeWalletRequestFields(flags) {
90727
+ const selection = feeWalletSelection(flags);
90728
+ if (!selection)
90729
+ return {};
90730
+ return {
90731
+ feeWallet: selection.feeWallet,
90732
+ ...selection.feeWalletMultisig ? { feeWalletMultisig: selection.feeWalletMultisig } : {}
90733
+ };
90734
+ }
90735
+ function utf8(text4) {
90736
+ return new TextEncoder().encode(text4);
90737
+ }
90738
+ function decodeAddress(value, flag) {
90739
+ try {
90740
+ return decodePubkey(value);
90741
+ } catch {
90742
+ throw new Error(`${flag} takes a Solana address.`);
90743
+ }
90744
+ }
90745
+ function feeWalletLines(selection, echo) {
90746
+ if (selection)
90747
+ return [
90748
+ `Fee wallet: ${selection.feeWallet} (earns this launch's fees; set by --fee-wallet)`,
90749
+ ...selection.feeWalletMultisig ? [
90750
+ `Fee wallet multisig: ${selection.feeWalletMultisig.address}, vault ${selection.feeWalletMultisig.vaultIndex} (the Squads v4 multisig behind the fee wallet)`
90751
+ ] : []
90752
+ ];
90753
+ return [
90754
+ 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)."
90755
+ ];
90756
+ }
90757
+ function feeWalletQuoteLine(selection) {
90758
+ if (!selection)
90759
+ return "defaults to the account wallet";
90760
+ return `${selection.feeWallet}${selection.feeWalletMultisig ? ` (Squads vault of ${selection.feeWalletMultisig.address}, vault ${selection.feeWalletMultisig.vaultIndex})` : ""}`;
90761
+ }
90762
+
90763
+ // src/commands/launch.ts
90546
90764
  init_hood_legs();
90547
90765
  init_human_output();
90548
- import { randomUUID as randomUUID6 } from "node:crypto";
90549
90766
 
90550
90767
  // src/launch-bundle.ts
90551
90768
  init_solana_alt();
@@ -90788,7 +91005,7 @@ function embeddedWorks(answer2, requestedChain) {
90788
91005
  function describeRow(row) {
90789
91006
  return `${row.label ? `${row.label} ` : ""}(${row.id}, ${row.address})`;
90790
91007
  }
90791
- async function launchCheck(ctx, key, walletFlag, requestedChain) {
91008
+ async function launchCheck(ctx, key, walletFlag, requestedChain, feeWallet = undefined) {
90792
91009
  const answer2 = checkSchema.parse(await request(ctx, key, "/api/v1/launch/preflight"));
90793
91010
  const embeddedOnly = walletFlag !== undefined && EMBEDDED_NAMES.has(walletFlag);
90794
91011
  const named = walletFlag === undefined || embeddedOnly ? [] : answer2.wallets.filter((row) => row.id === walletFlag || row.address === walletFlag || row.label === walletFlag);
@@ -90798,6 +91015,8 @@ async function launchCheck(ctx, key, walletFlag, requestedChain) {
90798
91015
  const lines = [`Launch paths for key ${answer2.key.keyPrefix} (tier ${answer2.key.tier}):`];
90799
91016
  if (requestedChain)
90800
91017
  lines.push(`Requested launch chain: ${chainName(requestedChain)}.`);
91018
+ if (!requestedChain || requestedChain === "solana")
91019
+ lines.push(...feeWalletLines(feeWallet));
90801
91020
  if (walletFlag === undefined || embeddedOnly)
90802
91021
  lines.push(...embeddedLines(answer2, requestedChain));
90803
91022
  for (const row of shownWallets)
@@ -90811,6 +91030,7 @@ async function launchCheck(ctx, key, walletFlag, requestedChain) {
90811
91030
  ...requestedChain ? { requestedChain } : {},
90812
91031
  key: answer2.key,
90813
91032
  switches: answer2.switches,
91033
+ ...feeWallet ? { feeWallet: { ...feeWallet, set: true } } : { feeWallet: { default: "account wallet", set: false } },
90814
91034
  ...answer2.embedded ? { embedded: answer2.embedded } : {},
90815
91035
  wallets: shownWallets.map((row) => ({
90816
91036
  ...row,
@@ -91024,10 +91244,21 @@ async function launch(args, ctx) {
91024
91244
  writeUsageFailure(ctx.deps, `${error.message}. ${USAGE9}`, ctx.json);
91025
91245
  return 2;
91026
91246
  }
91247
+ let feeWallet;
91248
+ try {
91249
+ feeWallet = feeWalletSelection(flags);
91250
+ } catch (error) {
91251
+ writeUsageFailure(ctx.deps, `${error.message}. ${USAGE9}`, ctx.json);
91252
+ return 2;
91253
+ }
91027
91254
  try {
91028
91255
  if (flags["--buy"]?.trim() && !/^0+(\.0+)?$/.test(flags["--buy"]))
91029
91256
  launchBuyRaw(flags["--buy"], 18);
91030
91257
  const hinted = flagChain(flags);
91258
+ if (hinted === "hood" && feeWalletGiven(flags)) {
91259
+ writeUsageFailure(ctx.deps, `--fee-wallet is Solana only; a Hood launch cannot take it. ${USAGE9}`, ctx.json);
91260
+ return 2;
91261
+ }
91031
91262
  if (!check && hinted === "hood" && flags["--dex-version"] === undefined) {
91032
91263
  writeUsageFailure(ctx.deps, `A Hood launch needs --dex-version v3|v4. ${USAGE9}`, ctx.json);
91033
91264
  return 2;
@@ -91046,7 +91277,7 @@ async function launch(args, ctx) {
91046
91277
  }
91047
91278
  const key = await tradingKey(ctx);
91048
91279
  if (check)
91049
- return await launchCheck(ctx, key, flags["--wallet"], hinted);
91280
+ return await launchCheck(ctx, key, flags["--wallet"], hinted, feeWallet);
91050
91281
  const prior = dryRun ? null : await lookupOperation(ctx, key, id, "launch");
91051
91282
  let retry;
91052
91283
  if (prior) {
@@ -91088,8 +91319,8 @@ async function launch(args, ctx) {
91088
91319
  if (chain2 === "hood" && flags["--dex-version"] === undefined)
91089
91320
  throw new TradingUsage(`${wallet3.address} is a Hood TEE wallet, and a Hood launch needs --dex-version v3|v4.`);
91090
91321
  const buy = launchBuy(flags, chain2);
91091
- if (chain2 === "hood" && Object.keys(poolRequestFields(flags)).length)
91092
- throw new TradingUsage("Pool fee and pool shape choices are Solana only; a Hood launch cannot take them.");
91322
+ if (chain2 === "hood" && (Object.keys(poolRequestFields(flags)).length || feeWalletGiven(flags)))
91323
+ throw new TradingUsage("Pool fee and pool shape choices are Solana only, and so is --fee-wallet; a Hood launch cannot take them.");
91093
91324
  const atomic = chain2 === "solana" && buy !== undefined;
91094
91325
  if (atomic)
91095
91326
  firstBuyCeiling(ctx, flags, buy);
@@ -91139,6 +91370,7 @@ async function launch(args, ctx) {
91139
91370
  fee: built.fee ?? { bps: 0, feeRaw: "0" },
91140
91371
  minimumReceived: buy ? "not quoted (the first buy on the new curve)" : "0 tokens (no first buy)",
91141
91372
  maxDebitLamports: built.maxDebitLamports,
91373
+ feeWallet: feeWalletQuoteLine(feeWallet),
91142
91374
  tokenRisks: []
91143
91375
  };
91144
91376
  notice(ctx.deps, "stderr", "note", buyNotice(buy, "solana").trim());
@@ -91239,7 +91471,8 @@ function solanaSelfBody(args) {
91239
91471
  chain: "solana",
91240
91472
  buyAmount: args.buy ? args.buy.raw : 0,
91241
91473
  linkedWalletId: args.wallet.id,
91242
- ...quoteAsset ? { quoteAsset } : {}
91474
+ ...quoteAsset ? { quoteAsset } : {},
91475
+ ...feeWalletRequestFields(args.flags)
91243
91476
  };
91244
91477
  }
91245
91478
  function hoodBody(args) {
@@ -91266,14 +91499,15 @@ var previewSchema = exports_external.object({
91266
91499
  migration: exports_external.object({ venue: exports_external.string(), poolShape: exports_external.string(), openingPriceStepPct: exports_external.number() }).passthrough().optional()
91267
91500
  }).passthrough().optional(),
91268
91501
  devBuyMax: exports_external.string().nullable().optional(),
91502
+ feeWallet: exports_external.string().optional(),
91269
91503
  fills: exports_external.array(exports_external.object({ index: exports_external.number(), amountRaw: exports_external.string(), supplyPct: exports_external.number() }).passthrough()).optional()
91270
91504
  }).passthrough();
91271
91505
  var percent = (value) => `${Number(value.toFixed(4))}%`;
91272
- function previewLines(answer2, chain2) {
91506
+ function previewLines(answer2, chain2, feeWallet = undefined) {
91273
91507
  const parsed = previewSchema.safeParse(answer2);
91274
91508
  if (!parsed.success)
91275
91509
  return "";
91276
- const { resolved, curveTerms: terms, devBuyMax, fills } = parsed.data;
91510
+ const { resolved, curveTerms: terms, devBuyMax, feeWallet: echo, fills } = parsed.data;
91277
91511
  const quote = (resolved?.quoteAsset ?? LAUNCH_DEFINITION.defaultQuote[chain2]).toUpperCase();
91278
91512
  const decimals = (chain2 === "hood" ? HOOD_BASES[quote] : BASES[quote])?.decimals;
91279
91513
  const whole = (raw) => decimals === undefined ? `${raw} raw` : `${shortAmount(raw, decimals)} ${quote}`;
@@ -91291,6 +91525,8 @@ function previewLines(answer2, chain2) {
91291
91525
  lines.push(`First buy ${fill.index}: ${whole(fill.amountRaw)} takes ${percent(fill.supplyPct)} of the supply.`);
91292
91526
  if (devBuyMax)
91293
91527
  lines.push(`Dev-buy ceiling: ${whole(devBuyMax)}.`);
91528
+ if (chain2 === "solana")
91529
+ lines.push(...feeWalletLines(feeWallet, echo));
91294
91530
  return lines.length ? `${lines.join(`
91295
91531
  `)}
91296
91532
  ` : "";
@@ -91303,7 +91539,7 @@ async function dryRunLaunch(ctx, key, args) {
91303
91539
  throw buyRefusal(error);
91304
91540
  });
91305
91541
  ctx.deps.stderr.write(`Dry run: nothing was built, signed or recorded, and launch id ${args.id} is unused.
91306
- ${previewLines(answer2, chain2)}`);
91542
+ ${previewLines(answer2, chain2, feeWalletSelection(args.flags))}`);
91307
91543
  return printTradingResult(ctx, { ...answer2, clientTradeId: args.id, kind: "launch", ...args.used });
91308
91544
  }
91309
91545
  var DEV_BUY_CEILINGS = LAUNCH_DEFINITION.buyLimits.defaults;
@@ -91400,6 +91636,7 @@ async function atomicLaunch(ctx, key, args) {
91400
91636
  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",
91401
91637
  minimumReceived: minOut !== undefined ? `${minOut} raw units of the new token (the first buy's floor)` : "not quoted",
91402
91638
  maxLoss: quoteAsset === "SOL" ? sol : `${sol} and ${decimalAmount(reading.quoteRaw.toString(), decimals)} ${quoteAsset}`,
91639
+ feeWallet: feeWalletQuoteLine(feeWalletSelection(flags)),
91403
91640
  tokenRisks: [],
91404
91641
  bundleId: built.bundleId
91405
91642
  };
@@ -91528,8 +91765,8 @@ async function embeddedLaunch(ctx, key, args) {
91528
91765
  const buy = launchBuy(flags, chain2);
91529
91766
  if (buy && chain2 === "solana")
91530
91767
  firstBuyCeiling(ctx, flags, buy);
91531
- if (chain2 === "hood" && Object.keys(poolRequestFields(flags)).length)
91532
- throw new TradingUsage("Pool fee and pool shape choices are Solana only; a Hood launch cannot take them.");
91768
+ if (chain2 === "hood" && (Object.keys(poolRequestFields(flags)).length || feeWalletGiven(flags)))
91769
+ throw new TradingUsage("Pool fee and pool shape choices are Solana only, and so is --fee-wallet; a Hood launch cannot take them.");
91533
91770
  const wallet3 = await embeddedLaunchWallet(ctx, key, chain2);
91534
91771
  const uploaded = await uploadLaunchImages(ctx, key, args);
91535
91772
  if (typeof uploaded === "number")
@@ -91549,6 +91786,7 @@ async function embeddedLaunch(ctx, key, args) {
91549
91786
  ...launchCurveFields(flags),
91550
91787
  ...launchMetadataFields(flags),
91551
91788
  ...poolRequestFields(flags),
91789
+ ...feeWalletRequestFields(flags),
91552
91790
  ...buy ? { buyAmount: chain2 === "hood" || BigInt(buy.raw) > BigInt(Number.MAX_SAFE_INTEGER) ? buy.raw : Number(buy.raw) } : {}
91553
91791
  };
91554
91792
  const answer2 = await request(ctx, key, "/api/v1/launch/headless/dry-run", body);
@@ -91558,6 +91796,7 @@ async function embeddedLaunch(ctx, key, args) {
91558
91796
  venue: "curve launch (signed by Candle)",
91559
91797
  priceImpactPct: null,
91560
91798
  minimumReceived: "0 tokens (no first buy)",
91799
+ ...chain2 === "solana" ? { feeWallet: feeWalletQuoteLine(feeWalletSelection(flags)) } : {},
91561
91800
  tokenRisks: []
91562
91801
  };
91563
91802
  if (buy && chain2 === "solana") {
@@ -91581,7 +91820,7 @@ async function embeddedLaunch(ctx, key, args) {
91581
91820
  if (buy)
91582
91821
  quote.minimumReceived = "not quoted (best-effort first buy after creation)";
91583
91822
  }
91584
- ctx.deps.stderr.write(previewLines(answer2, chain2));
91823
+ ctx.deps.stderr.write(previewLines(answer2, chain2, feeWalletSelection(flags)));
91585
91824
  if (args.dryRun) {
91586
91825
  ctx.deps.stderr.write(`Dry run: nothing was built, signed or recorded, and launch id ${id} is unused.
91587
91826
  `);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@candledottv/cli",
3
- "version": "0.13.8",
3
+ "version": "0.13.9",
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": {