@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.
- package/dist/index.js +80 -23
- 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.
|
|
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.
|
|
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 `
|
|
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,
|
|
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 ?
|
|
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
|
-
|
|
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