@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.
- package/dist/index.js +255 -16
- 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.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.
|
|
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