@solard/cli 0.2.16 → 0.2.17

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/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
+ import { configure } from "measure-fn";
2
3
  import {
3
4
  addExternalContact,
4
- configureSolardMeasure,
5
5
  createSolardMeasureCollector,
6
6
  executeRegistrySolSweep,
7
7
  executeRegistryTokenLiquidation,
@@ -21,10 +21,10 @@ import {
21
21
  simulateRegistryTokenLiquidation,
22
22
  wrappedSolAta,
23
23
  type TokenRow,
24
- } from "@solard/sdk";
24
+ } from "@solard/core";
25
25
 
26
26
  import { handleMeteoraCommand } from "./meteora-commands.ts";
27
- import { handleFairfunCommand } from "./fairfun-commands.ts";
27
+ import { handleAccountingCommand } from "./accounting-commands.ts";
28
28
  import { resolveDestinationRef } from "./refs.ts";
29
29
  import {
30
30
  VaultOnboardingError,
@@ -77,7 +77,12 @@ function int(flags: Flags, key: string, fallback?: number): number | undefined {
77
77
  function json(value: unknown): string {
78
78
  return JSON.stringify(
79
79
  value,
80
- (_, item) => (typeof item === "bigint" ? item.toString() : item),
80
+ (_, item) =>
81
+ typeof item === "bigint"
82
+ ? item.toString()
83
+ : item instanceof Map
84
+ ? Object.fromEntries(item)
85
+ : item,
81
86
  2,
82
87
  );
83
88
  }
@@ -319,7 +324,7 @@ function commandNeedsSigningVault(
319
324
  }
320
325
 
321
326
  async function storedWalletCount(): Promise<number> {
322
- const { createTraderSolard } = await import("@solard/sdk");
327
+ const { createTraderSolard } = await import("@solard/core");
323
328
  const probe = createTraderSolard();
324
329
  try {
325
330
  return (probe.db.wallets.select().all() as unknown[]).length;
@@ -357,6 +362,8 @@ External contacts (public addresses only; never signing wallets or group members
357
362
  slrd tokens
358
363
  slrd holders <token|ca> [--exclude <a,b>] [--min-raw N] [--json] Complete on-chain holder snapshot
359
364
  slrd events <token|ca> [--all|--swaps|--transfers|--creates] [--jsonl] Live typed Pump/PumpSwap + transfer/create stream
365
+ slrd events history <token|ca> [--provider auto|solscan|rpc] [--from-slot N] [--to-slot N] [--slot-order] [--json]
366
+ Historical holder-balance movements with explicit completeness verification
360
367
 
361
368
  Vanity mints
362
369
  slrd vanity --suffix pump --out .\\mint.json [--count <n>]
@@ -398,8 +405,8 @@ Transfers and consolidation
398
405
  Without --wallets, sweep considers all stored signing wallets
399
406
 
400
407
  Token liquidation
401
- slrd liquidate tokens --except <token|mint> [--wallets <a,b,...>] [--slippage-bps 1500] [--no-jupiter] [--burn-unsellable] [--simulate | --live]
402
- Sell supported tokens except protected mint(s); unwrap WSOL; close unprotected zero-balance token accounts and reclaim rent
408
+ slrd liquidate tokens [--except <token|mint>] [--wallets <a,b,...>] [--except-wallet <wallet>] [--except-wallets <a,b,...>] [--slippage-bps 1500] [--no-jupiter] [--burn-unsellable] [--simulate | --live]
409
+ Sell all supported tokens unless protected with --except; excluded wallets are not scanned or touched
403
410
 
404
411
  RPC
405
412
  All Solard JSON-RPC traffic is globally rate-limited to 5 req/s by default.
@@ -424,11 +431,15 @@ Trading
424
431
  slrd transfer-many --wallet <wallet> (--token <mint>|--sol) --file <allocations.json> [--id <stable-id> --live]
425
432
  slrd transfer-many status <stable-id>
426
433
  slrd transfer-many resume <stable-id> [--sender rpc|helius]
427
- slrd rewards distribute <token|ca> --wallet <beneficiary> --id <ledger-id> --snapshot <snapshot.json> [--reward-mint <mint>] [--live]
428
- Snapshot contains cumulative totalClaimedRaw + recipients[].entitledRaw; Solard tracks confirmed payouts
429
- slrd rewards status <distribution-id>
434
+ slrd rewards history <token|ca> [--wallet <reward-recipient>] [--provider auto|solscan|rpc] [--json]
435
+ slrd rewards distribute <token|ca> --wallet <beneficiary> --snapshot <snapshot.json> [--reward-mint <mint>] [--live]
436
+ Pay every outstanding cumulative holder entitlement and exit when complete
437
+ slrd rewards stop <token|ca> Ask the currently running distribution for this token to stop before its next transfer
438
+ slrd rewards status <token|ca> Show remembered cumulative entitlement/payment state
439
+ slrd rewards audit <token|ca> [--holder <wallet>] Show entitlement and confirmed-payment history
430
440
  slrd rewards inspect <token|ca> Show claim source, quote asset, estimated accrued creator reward, and payout address
431
- slrd rewards claim <token|ca> --wallet <fee-payer> Claim creator rewards; on-chain beneficiary receives the reward
441
+ slrd rewards claim <token|ca> --wallet <fee-payer> [--id <stable-claim-id> --basis <reward-basis.json>]
442
+ slrd rewards claim-status <stable-claim-id>
432
443
 
433
444
  Scripts (strategies stay outside the kernel)
434
445
  slrd scripts List scripts registered in slrd.config.ts
@@ -483,6 +494,7 @@ Environment
483
494
  RPC_ENDPOINT required only for chain operations
484
495
  HELIUS_SENDER_URL regional/global Helius Sender endpoint used by launch scripts
485
496
  HELIUS_RPC_URL RPC endpoint used for ordinary Helius-RPC buyer lane
497
+ SOLSCAN_API_KEY optional indexed token-history provider; enables authoritative historical transfer reconstruction
486
498
  HELIUS_TIP_ACCOUNT, HELIUS_TIP_LAMPORTS, HELIUS_PRIORITY_MICRO_LAMPORTS launch transport policy
487
499
  SLRD_LAUNCH_* launch resend/timeout policy; shared environment, not per-token metadata
488
500
  JITO_BLOCK_ENGINE_URL only when explicitly selecting the separate Jito sender
@@ -508,7 +520,7 @@ async function main() {
508
520
  flags.has("measure-stream") ||
509
521
  process.env.SLRD_MEASURE_STREAM === "1" ||
510
522
  process.env.SLRD_MEASURE_STREAM === "true";
511
- configureSolardMeasure(
523
+ configure(
512
524
  streamMeasures
513
525
  ? {
514
526
  silent: false,
@@ -638,7 +650,7 @@ async function main() {
638
650
  listVanityMintPool,
639
651
  releaseVanityMintReservation,
640
652
  saveMintKeypairFile,
641
- } = await import("@solard/sdk");
653
+ } = await import("@solard/core");
642
654
 
643
655
  if (values[0] === "pool") {
644
656
  const action = values[1] ?? "list";
@@ -816,13 +828,13 @@ async function main() {
816
828
  process.env.JITO_BLOCK_ENGINE_URL ??
817
829
  "https://mainnet.block-engine.jito.wtf"
818
830
  ).replace(/\/$/, "");
819
- const { getJitoTipAccounts } = await import("@solard/sdk");
831
+ const { getJitoTipAccounts } = await import("@solard/core");
820
832
  const tipAccounts = await getJitoTipAccounts(endpoint);
821
833
  emit(json({ endpoint, tipAccounts }) + "\n");
822
834
  return;
823
835
  }
824
836
  if (command === "metadata" && values[0] === "upload") {
825
- const { uploadPumpMetadata } = await import("@solard/sdk");
837
+ const { uploadPumpMetadata } = await import("@solard/core");
826
838
  const uploaded = await uploadPumpMetadata(
827
839
  {
828
840
  imagePath: need(flags, "image"),
@@ -848,13 +860,13 @@ async function main() {
848
860
  }
849
861
  const [{ sol, formatRaw }, { shortKey }, { createTraderSolard }] =
850
862
  await Promise.all([
851
- import("@solard/sdk"),
852
- import("@solard/sdk"),
853
- import("@solard/sdk"),
863
+ import("@solard/core"),
864
+ import("@solard/core"),
865
+ import("@solard/core"),
854
866
  ]);
855
867
  const slrd = createTraderSolard();
856
868
  try {
857
- if (await handleFairfunCommand({ command, values, flags, slrd, emit })) {
869
+ if (await handleAccountingCommand({ command, values, flags, slrd, emit })) {
858
870
  return;
859
871
  }
860
872
 
@@ -986,11 +998,8 @@ async function main() {
986
998
  (vanityResult
987
999
  ? ` vanity suffix=${vanityResult.suffix} attempts=${vanityResult.attempts}\n`
988
1000
  : "") +
989
- ` storage encrypted in Solard's local wallet database\n` +
990
- ` password NOT saved; you will enter it again next invocation\n` +
991
1001
  `╰──────────────────────────────────────────────────────╯\n` +
992
- `\nNext: slrd balances --wallet ${wallet.name}\n` +
993
- `Backup: slrd export ${wallet.name} --out .\\${wallet.name}-key.txt\n`,
1002
+ `\nNext: slrd balances --wallet ${wallet.name}\n`,
994
1003
  );
995
1004
  } else {
996
1005
  emit(`${OWL} created @${wallet.name} ${wallet.address}\n`);
@@ -1612,7 +1621,7 @@ async function main() {
1612
1621
  throw new Error(
1613
1622
  "Provide --uri <metadata_uri> or --image <local_path> --description <text>",
1614
1623
  );
1615
- const { uploadPumpMetadata } = await import("@solard/sdk");
1624
+ const { uploadPumpMetadata } = await import("@solard/core");
1616
1625
  uploadedMetadata = await uploadPumpMetadata(
1617
1626
  {
1618
1627
  imagePath: need(flags, "image"),
@@ -1864,11 +1873,18 @@ async function main() {
1864
1873
  }
1865
1874
  if (command === "liquidate" && (values[0] ?? "tokens") === "tokens") {
1866
1875
  const except = csv(flags.get("except"));
1867
- if (except.length === 0) {
1868
- throw new Error(
1869
- "Usage: slrd liquidate tokens --except <token|mint>[,<token|mint>...] [--wallets <a,b,...>] [--burn-unsellable] [--simulate | --live]",
1870
- );
1871
- }
1876
+ const exceptWalletValue =
1877
+ flags.get("except-wallet") ?? flags.get("exceptWallet");
1878
+ const exceptWalletsValue =
1879
+ flags.get("except-wallets") ?? flags.get("exceptWallets");
1880
+ if (exceptWalletValue === "true")
1881
+ throw new Error("Missing --except-wallet <wallet>");
1882
+ if (exceptWalletsValue === "true")
1883
+ throw new Error("Missing --except-wallets <a,b,...>");
1884
+ const exceptWalletRefs = [
1885
+ ...(exceptWalletValue ? [exceptWalletValue] : []),
1886
+ ...csv(exceptWalletsValue),
1887
+ ].filter((ref, index, refs) => refs.indexOf(ref) === index);
1872
1888
  if (flags.has("simulate") && flags.has("live")) {
1873
1889
  throw new Error("Use either --simulate or --live, not both");
1874
1890
  }
@@ -1884,6 +1900,10 @@ async function main() {
1884
1900
  const mint = resolveTokenMintForPolicy(slrd, ref);
1885
1901
  emit(`PROTECT ${ref} -> ${mint}\n`);
1886
1902
  }
1903
+ for (const ref of exceptWalletRefs) {
1904
+ const wallet = slrd.resolveWallet(ref);
1905
+ emit(`EXCLUDE ${ref} -> ${wallet.address.toBase58()}\n`);
1906
+ }
1887
1907
  emit(
1888
1908
  `RPC hard limit ${process.env.SLRD_RPC_MAX_RPS ?? "5"} req/s\n`,
1889
1909
  );
@@ -1899,19 +1919,27 @@ async function main() {
1899
1919
  name: string | null;
1900
1920
  amountUi: string;
1901
1921
  kind: string;
1922
+ tokenAccount?: string;
1902
1923
  },
1903
1924
  ) => {
1904
1925
  const label = action.symbol ?? action.name ?? shortKey(action.mint);
1926
+ const account =
1927
+ action.kind === "close-empty" && action.tokenAccount
1928
+ ? flags.has("verbose")
1929
+ ? action.tokenAccount
1930
+ : shortKey(action.tokenAccount)
1931
+ : null;
1905
1932
  emit(
1906
1933
  `${prefix} ${index}/${total} @${action.walletName} ` +
1907
1934
  `${action.kind === "unwrap-wsol" ? "WSOL" : label} ${action.amountUi}` +
1908
- `${action.kind === "close-empty" ? " [close empty account]" : ""}\n`,
1935
+ `${action.kind === "close-empty" ? ` [close empty account${account ? ` ${account}` : ""}]` : ""}\n`,
1909
1936
  );
1910
1937
  };
1911
1938
 
1912
1939
  const options = {
1913
1940
  except,
1914
1941
  walletRefs: csv(flags.get("wallets")),
1942
+ exceptWalletRefs,
1915
1943
  slippageBps: int(flags, "slippage-bps", 1500) ?? 1500,
1916
1944
  via: flags.get("sender") ?? "rpc",
1917
1945
  delayMs: int(flags, "delay-ms", 0) ?? 0,
@@ -1941,6 +1969,13 @@ async function main() {
1941
1969
  );
1942
1970
  } else if (event.stage === "action-done") {
1943
1971
  showAction("OK ", event.index, event.total, event.action);
1972
+ } else if (event.stage === "action-pending") {
1973
+ showAction("WAIT", event.index, event.total, event.action);
1974
+ if (flags.has("verbose")) {
1975
+ emit(
1976
+ ` attempt=${event.attempt}/${event.maxAttempts} signature=${event.signature ?? "-"} ${event.reason}\n`,
1977
+ );
1978
+ }
1944
1979
  } else if (event.stage === "action-error") {
1945
1980
  showAction("FAIL", event.index, event.total, event.action);
1946
1981
  emit(` ${event.error}\n`);
@@ -1981,7 +2016,7 @@ async function main() {
1981
2016
  }
1982
2017
 
1983
2018
  emit(
1984
- `KEEP ${plan.totals.keepProtected} protected SLRD holding(s)\n` +
2019
+ `KEEP ${plan.totals.keepProtected} protected token holding(s)\n` +
1985
2020
  `SKIP ${plan.totals.skipUnsupported} unsupported/no-liquidity holding(s)`,
1986
2021
  );
1987
2022
  if (plan.totals.skipUnsupported > 0) {
@@ -2423,23 +2458,84 @@ async function main() {
2423
2458
  }
2424
2459
  if (command === "rewards") {
2425
2460
  const action = values[0] ?? "inspect";
2461
+
2462
+ if (action === "claim-status") {
2463
+ const id = values[1];
2464
+ if (!id)
2465
+ throw new Error("Usage: slrd rewards claim-status <stable-claim-id>");
2466
+ emit(json(slrd.claims.creatorFees.status(id)) + "\n");
2467
+ return;
2468
+ }
2469
+
2426
2470
  const tokenRef = values[1];
2427
2471
  if (!tokenRef)
2428
2472
  throw new Error(
2429
- "Usage: slrd rewards <inspect|claim> <token|ca> [--wallet <fee-payer>]",
2473
+ "Usage: slrd rewards <inspect|claim|claim-status> <token|ca> [--wallet <fee-payer>]",
2430
2474
  );
2431
2475
 
2432
2476
  if (action === "claim") {
2433
2477
  const wallet = need(flags, "wallet");
2434
- const receipt = await slrd.claim(tokenRef, wallet, {
2478
+ const basisPath = flags.get("basis");
2479
+ let basis:
2480
+ | {
2481
+ id: string;
2482
+ slot: number;
2483
+ hash: string;
2484
+ observedAtMs?: number | null;
2485
+ }
2486
+ | undefined;
2487
+ if (basisPath && basisPath !== "true") {
2488
+ const { readFileSync } = await import("node:fs");
2489
+ const { resolve } = await import("node:path");
2490
+ const parsed = JSON.parse(
2491
+ readFileSync(resolve(basisPath), "utf8"),
2492
+ ) as Record<string, unknown>;
2493
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
2494
+ throw new Error("Reward basis file must contain a JSON object");
2495
+ basis = {
2496
+ id: String(parsed.id ?? "").trim(),
2497
+ slot: Number(parsed.slot),
2498
+ hash: String(parsed.hash ?? "").trim(),
2499
+ observedAtMs:
2500
+ parsed.observedAtMs == null ? null : Number(parsed.observedAtMs),
2501
+ };
2502
+ }
2503
+ const result = await slrd.claims.creatorFees.claim(tokenRef, wallet, {
2504
+ id: flags.get("id"),
2505
+ basis,
2435
2506
  via: flags.get("sender") ?? "rpc",
2507
+ skipSimulation: flags.has("skip-simulation"),
2508
+ skipPreflight: flags.has("skip-preflight"),
2436
2509
  });
2437
2510
  emit(
2438
2511
  json({
2439
2512
  action: "claim",
2440
- token: tokenRef,
2441
- feePayer: wallet,
2442
- receipt,
2513
+ claimId: result.claimId,
2514
+ token: result.tokenMint,
2515
+ feePayer: result.feePayer,
2516
+ source: result.source,
2517
+ quote: result.quoteAsset,
2518
+ estimatedClaimRaw: result.estimatedClaimRaw,
2519
+ claimedRaw: result.claimedRaw,
2520
+ claimedUi:
2521
+ result.claimedRaw == null
2522
+ ? null
2523
+ : formatRaw(result.claimedRaw, result.quoteAsset.decimals),
2524
+ payouts: result.payouts,
2525
+ receipt: result.receipt,
2526
+ basis: result.basis,
2527
+ checkpoint:
2528
+ result.claimedRaw == null
2529
+ ? null
2530
+ : {
2531
+ id: result.claimId ?? result.claimSignature,
2532
+ claimSignature: result.claimSignature,
2533
+ slot: result.claimSlot,
2534
+ claimedRaw: result.claimedRaw,
2535
+ quoteMint: result.quoteAsset.mint,
2536
+ observedAtMs: result.observedAtMs,
2537
+ basis: result.basis,
2538
+ },
2443
2539
  }) + "\n",
2444
2540
  );
2445
2541
  return;
@@ -2449,24 +2545,27 @@ async function main() {
2449
2545
  let token = slrd.resolveToken(tokenRef);
2450
2546
  try {
2451
2547
  token = await slrd.refreshToken(token);
2452
- } catch {
2453
- // A registered token can still expose a useful claim plan when one
2454
- // enrichment source is temporarily unavailable.
2455
- }
2548
+ } catch {}
2456
2549
  const { PublicKey } = await import("@solana/web3.js");
2457
2550
  const probeUser = token.creator
2458
2551
  ? new PublicKey(token.creator)
2459
2552
  : new PublicKey(token.mint);
2460
2553
  const plan = await slrd.resolveClaim(token, probeUser);
2554
+ const payoutAddresses = plan.payouts?.length
2555
+ ? plan.payouts.map((row) => row.address.toBase58())
2556
+ : typeof plan.meta?.payoutAddress === "string"
2557
+ ? [plan.meta.payoutAddress]
2558
+ : token.creator
2559
+ ? [token.creator]
2560
+ : [];
2461
2561
  const payoutAddress =
2462
- typeof plan.meta?.payoutAddress === "string"
2463
- ? plan.meta.payoutAddress
2464
- : token.creator;
2562
+ payoutAddresses.length === 1 ? payoutAddresses[0] : null;
2465
2563
  const output = {
2466
2564
  action: "inspect",
2467
2565
  token: token.mint,
2468
2566
  source: plan.source,
2469
2567
  payoutAddress: payoutAddress ?? null,
2568
+ payoutAddresses,
2470
2569
  quote: {
2471
2570
  kind: plan.quoteAsset.kind,
2472
2571
  mint: plan.quoteAsset.mint.toBase58(),
@@ -2486,7 +2585,7 @@ async function main() {
2486
2585
  return;
2487
2586
  }
2488
2587
 
2489
- throw new Error("Usage: slrd rewards <inspect|claim> <token|ca>");
2588
+ throw new Error("Usage: slrd rewards <inspect|claim|claim-status> ...");
2490
2589
  }
2491
2590
 
2492
2591
  if (command === "claim") {
@@ -5,7 +5,7 @@ import {
5
5
  type MeteoraStrategy,
6
6
  type MeteoraTimeframe,
7
7
  type Solard,
8
- } from "@solard/sdk";
8
+ } from "@solard/core";
9
9
 
10
10
  const WSOL = "So11111111111111111111111111111111111111112";
11
11
 
@@ -5,7 +5,7 @@ import {
5
5
  buildPumpExternalDeployment,
6
6
  createTraderSolard,
7
7
  type PumpExternalDeploymentBuild,
8
- } from "@solard/sdk";
8
+ } from "@solard/core";
9
9
 
10
10
  export type ExternalPumpFlags = Map<string, string>;
11
11
 
@@ -13,7 +13,7 @@ import {
13
13
  type PumpSpamBuyRunResult,
14
14
  type PumpSpamBuySettings,
15
15
  type SenderId,
16
- } from "@solard/sdk";
16
+ } from "@solard/core";
17
17
  import {
18
18
  bigintFlag,
19
19
  enabled,
@@ -44,7 +44,7 @@ import {
44
44
  type TokenMetadata,
45
45
  type TraderSubmitMode,
46
46
  type VanityMintPoolReservation,
47
- } from "@solard/sdk";
47
+ } from "@solard/core";
48
48
 
49
49
  export type Flags = Map<string, string[]>;
50
50
 
@@ -1697,7 +1697,7 @@ export async function runPumpTokenLaunchFromArgs(
1697
1697
  spam,
1698
1698
  kind: `cli:launch:pump:${input.alias}`,
1699
1699
  reporter: report,
1700
- beforeDeploymentBroadcast:
1700
+ beforeDeploymentSubmission:
1701
1701
  armedEndpoints.length > 0
1702
1702
  ? async () => {
1703
1703
  await releaseArmedBuyerEndpoints({
@@ -1709,7 +1709,7 @@ export async function runPumpTokenLaunchFromArgs(
1709
1709
  });
1710
1710
  }
1711
1711
  : undefined,
1712
- onDeploymentBroadcastFailure:
1712
+ onDeploymentSubmissionFailure:
1713
1713
  armedEndpoints.length > 0
1714
1714
  ? async (error) => {
1715
1715
  await abortArmedBuyerEndpoints({
@@ -9,7 +9,7 @@ import {
9
9
  uploadPumpMetadata,
10
10
  type MetadataUploaderId,
11
11
  type PumpVampSourceMetadata,
12
- } from "@solard/sdk";
12
+ } from "@solard/core";
13
13
 
14
14
  import {
15
15
  first,
@@ -15,7 +15,7 @@ import {
15
15
  tokenAmount,
16
16
  type Solard,
17
17
  type TradeAsset,
18
- } from "@solard/sdk";
18
+ } from "@solard/core";
19
19
 
20
20
  type Flags = Map<string, string>;
21
21
  type Emit = (value: string) => void;
package/src/refs.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { findExternalContact } from "@solard/sdk";
1
+ import { findExternalContact } from "@solard/core";
2
2
 
3
3
  export type ResolvedDestinationRef = {
4
4
  input: string;
@@ -1,16 +1,13 @@
1
- import type { Solard } from "@solard/sdk";
1
+ import type { Solard } from "@solard/core";
2
2
  import {
3
3
  analyzeTokenHistory,
4
4
  analyzeTokenHistoryForensicsFromStore,
5
- backfillTokenHistory,
6
- backfillRaydiumTokenHistory,
7
5
  getTokenHistoryCoverage,
8
6
  loadTokenHistoryTrades,
9
- TokenHistoryError,
10
7
  type BackfillTokenHistoryOptions,
11
8
  type TokenHistoryCoverage,
12
9
  type TokenHistoryTrade,
13
- } from "@solard/sdk";
10
+ } from "@solard/core";
14
11
 
15
12
  export type TokenHistoryCliFlags = Map<string, string>;
16
13
 
@@ -212,34 +209,15 @@ async function runBackfill(args: {
212
209
  }
213
210
  },
214
211
  };
215
- let result: TokenHistoryCoverage;
216
- try {
217
- result = await backfillTokenHistory(
218
- args.slrd.connection(),
219
- args.mint,
220
- backfillOptions,
221
- );
222
- } catch (error) {
223
- if (
224
- !(error instanceof TokenHistoryError) ||
225
- error.code !== "UNSUPPORTED_TOKEN"
226
- )
227
- throw error;
228
- progress(
229
- "VENUE Pump history unsupported; trying Raydium/LaunchLab discovery",
230
- );
231
- result = await backfillRaydiumTokenHistory(
232
- args.slrd.connection(),
233
- args.mint,
234
- {
235
- ...backfillOptions,
236
- maxRaydiumPools: Math.max(
237
- 1,
238
- Math.trunc(numberFlag(args.flags, "raydium-pools", 8) ?? 8),
239
- ),
240
- },
241
- );
242
- }
212
+ const market = await args.slrd.history.market(args.mint, {
213
+ ...backfillOptions,
214
+ backfill: true,
215
+ maxRaydiumPools: Math.max(
216
+ 1,
217
+ Math.trunc(numberFlag(args.flags, "raydium-pools", 8) ?? 8),
218
+ ),
219
+ });
220
+ const result: TokenHistoryCoverage = market.coverage;
243
221
  if (jsonMode) {
244
222
  args.emit(`${json(result)}\n`);
245
223
  return;
@@ -115,7 +115,7 @@ async function confirmNewPassword(): Promise<string> {
115
115
 
116
116
  async function validateAllStoredWallets(password: string): Promise<void> {
117
117
  setMasterKey(password);
118
- const { createTraderSolard } = await import("@solard/sdk");
118
+ const { createTraderSolard } = await import("@solard/core");
119
119
  const probe = createTraderSolard();
120
120
  try {
121
121
  const integrity = probe.wallets.integrity();