madeonsol-x402 4.3.0 → 4.5.0

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/types.d.ts CHANGED
@@ -6,7 +6,9 @@ export interface KolTrade {
6
6
  token_name: string | null;
7
7
  token_symbol: string | null;
8
8
  action: "buy" | "sell";
9
- sol_amount: number;
9
+ /** SOL size of the trade. `null` on a sell whose SOL proceeds are unknown (they went to
10
+ * another wallet or cannot be proven; since 2026-10-18). The sell still happened. Never read null as 0. */
11
+ sol_amount: number | null;
10
12
  token_amount: number;
11
13
  /** Token market cap in USD at the moment of trade (real-time, sourced from
12
14
  * our in-memory price tracker — not the Dexscreener spot which lags). */
@@ -423,7 +425,20 @@ export interface FirstTouchSubscriptionCreateResponse {
423
425
  * below are REST-only. (The x402 route still sends deprecated wallet_address / pnl_sol /
424
426
  * total_buy_sol / total_sell_sol aliases until 2026-11-03; they are not typed.)
425
427
  */
426
- export interface KolLeaderboardEntry {
428
+ /**
429
+ * Migration 512 — realized-PnL completeness of a KOL. A KOL sell whose SOL proceeds went to another
430
+ * wallet (or cannot be proven) still reduces holdings, but its position is left out of PnL, win rate,
431
+ * ROI and rankings (never booked as 0 proceeds or a loss). Same vocabulary as /wallet/{address}/pnl.
432
+ */
433
+ export interface KolPnlCompletenessFields {
434
+ completeness?: "complete" | "incomplete";
435
+ incomplete_reasons?: Array<"proceeds_unattributed">;
436
+ /** Positions excluded from realized PnL / win rate / ROI because a sell's proceeds are unknown. */
437
+ unknown_realizations?: number;
438
+ /** KOL sells with unknown proceeds (sol_amount null) in the window. */
439
+ unknown_proceeds_sells?: number;
440
+ }
441
+ export interface KolLeaderboardEntry extends KolPnlCompletenessFields {
427
442
  wallet: string;
428
443
  name: string;
429
444
  /** Realized (cost-basis) PnL in SOL, 6 decimals. */
@@ -433,6 +448,20 @@ export interface KolLeaderboardEntry {
433
448
  buy_count: number;
434
449
  sell_count: number;
435
450
  win_rate: number | null;
451
+ /** Migration 526 (TR-14): present when win_rate is the full-history FIFO win rate (same number as the KOL profile). */
452
+ win_rate_method?: "fifo_full_history" | "unavailable";
453
+ /** not_computed_for_period: FIFO covers 7d / 30d only; other periods serve win_rate null. */
454
+ win_rate_status?: "available" | "partial" | "insufficient_sample" | "no_known_positions" | "no_closed_positions" | "unavailable" | "not_computed_for_period";
455
+ win_rate_window?: "7d" | "30d" | null;
456
+ win_rate_rule_version?: string | null;
457
+ /** Win-rate denominator (known closed positions) for win_rate_window. */
458
+ closed_positions_known?: number | null;
459
+ /** Closed positions with an unproven realization: never a win or loss, not in the denominator. */
460
+ unknown_realizations_winrate?: number | null;
461
+ win_rate_computed_at?: string | null;
462
+ /** classifier_076 = roster classifier; otherwise the auto tag and its method. */
463
+ strategy_tag_source?: "classifier_076" | "fifo_auto_v2" | "in_window_auto_512" | null;
464
+ auto_strategy_tag_source?: "fifo_auto_v2" | "in_window_auto_512";
436
465
  /** v1.12 — median hold time in minutes over the last 30 days. */
437
466
  median_hold_minutes_30d?: number | null;
438
467
  /** v1.12 — percentile rank (0-100) of early entry quality over the last 30 days. */
@@ -796,6 +825,10 @@ export interface HotToken {
796
825
  total_buy_sol: number;
797
826
  total_sell_sol: number;
798
827
  net_flow: number;
828
+ /** Sells with unknown proceeds left out of total_sell_sol / net flow (never counted as 0 SOL); null = not measured. */
829
+ unknown_proceeds_sells?: number | null;
830
+ /** false when unknown_proceeds_sells > 0; null = not measured. */
831
+ sell_sol_complete?: boolean | null;
799
832
  first_kol_buy_at?: string | null;
800
833
  first_kol_buy_age_minutes: number | null;
801
834
  /** Last KOL buy in the period (REST). */
@@ -967,7 +1000,7 @@ export interface KolEntryOrderParams {
967
1000
  limit?: number;
968
1001
  }
969
1002
  /** One requested wallet. `found: false` (not an active KOL) carries only `wallet` + `found`. */
970
- export interface KolCompareProfile {
1003
+ export interface KolCompareProfile extends KolPnlCompletenessFields {
971
1004
  wallet: string;
972
1005
  found: boolean;
973
1006
  name?: string;
@@ -994,7 +1027,37 @@ export interface KolCompareProfile {
994
1027
  percentile_pnl_30d?: number | null;
995
1028
  percentile_winrate_30d?: number | null;
996
1029
  percentile_early_entry_30d?: number | null;
997
- }
1030
+ /** Migration 512 — 7-day positions excluded from the 7-day PnL metrics (unknown proceeds). Under migration 526 (winrate_method present): the FIFO 7-day unknown realizations; the PnL counter moves to pnl_unknown_realizations_7d. */
1031
+ unknown_realizations_7d?: number;
1032
+ /** Migration 526 (TR-14): present once the FIFO win rate is served. Absent = the in-window method. */
1033
+ winrate_method?: "fifo_full_history" | "unavailable";
1034
+ /** Status of winrate_30d. */
1035
+ winrate_status?: KolWinrateStatus;
1036
+ winrate_status_7d?: KolWinrateStatus;
1037
+ winrate_status_30d?: KolWinrateStatus;
1038
+ /** Minimum known closed positions before a win rate is published. */
1039
+ winrate_min_known?: number;
1040
+ winrate_rule_version?: string | null;
1041
+ winrate_definition?: string;
1042
+ /** Win-rate denominator: completed buy lots whose realization is proven. */
1043
+ closed_positions_known_7d?: number;
1044
+ closed_positions_known_30d?: number;
1045
+ /** All completed buy lots in the window: known + unknown realizations. */
1046
+ closed_positions_all_7d?: number;
1047
+ closed_positions_all_30d?: number;
1048
+ /** Closed positions with an unproven realization: never a win or loss, not in the denominator. */
1049
+ unknown_realizations_30d?: number;
1050
+ /** Migration 526: the in-window 7-day PnL counter (positions excluded from pnl_7d for unknown proceeds). */
1051
+ pnl_unknown_realizations_7d?: number;
1052
+ /** opening_inventory_unproven / consideration_unknown / closure_unproven (KOL_WINRATE_SOURCE=fifo only). */
1053
+ unknown_by_reason_30d?: Record<string, number> | null;
1054
+ winrate_computed_at?: string | null;
1055
+ /** classifier_076 = roster classifier; otherwise the auto tag and its method. */
1056
+ strategy_tag_source?: "classifier_076" | "fifo_auto_v2" | "in_window_auto_512" | null;
1057
+ auto_strategy_tag_source?: "fifo_auto_v2" | "in_window_auto_512";
1058
+ }
1059
+ /** Migration 526 (TR-14) win-rate status vocabulary. */
1060
+ export type KolWinrateStatus = "available" | "partial" | "insufficient_sample" | "no_known_positions" | "no_closed_positions" | "unavailable";
998
1061
  export interface KolCompareOverlapToken {
999
1062
  token_mint: string;
1000
1063
  token_symbol: string | null;
@@ -1119,6 +1182,10 @@ export interface AlphaLeaderboardEntry {
1119
1182
  /** v1.24 — null (not 0) when the entry-MC aggregate failed. */
1120
1183
  entry_mc_samples?: number | null;
1121
1184
  avg_entry_mc_usd?: number | null;
1185
+ /** 2026-10 (migration 511) — early-buyer pairs whose realization is unknown (a sell whose proceeds went to another wallet); excluded from win_rate, net_pnl_sol and roi. null before migration 511. */
1186
+ unknown_realizations?: number | null;
1187
+ /** 2026-10 (migration 511) — SOL bought on those pairs, left out of net_pnl_sol and roi. */
1188
+ unknown_cost_basis_sol?: number | null;
1122
1189
  }
1123
1190
  export interface AlphaLeaderboardResponse {
1124
1191
  /** Launch-pipeline scope disclosure (absent ≠ clean). */
@@ -1153,18 +1220,28 @@ export interface AlphaWalletSummary {
1153
1220
  last_seen: string;
1154
1221
  bot_confidence: "low" | "medium" | "high" | "none";
1155
1222
  bot_signals: string[];
1223
+ /** 2026-10 (migration 511) — early-buyer pairs whose realization is unknown (a sell whose proceeds went to another wallet); excluded from win_rate, net_pnl_sol and roi. null before migration 511. */
1224
+ unknown_realizations?: number | null;
1225
+ /** 2026-10 (migration 511) — SOL bought on those pairs, left out of net_pnl_sol and roi. */
1226
+ unknown_cost_basis_sol?: number | null;
1156
1227
  }
1157
1228
  export interface AlphaWalletToken {
1158
1229
  token_mint: string;
1159
1230
  rank: number;
1160
- first_buy_sol: number;
1231
+ /** null = the first buy's SOL consideration is unknown (never reported as 0). */
1232
+ first_buy_sol: number | null;
1233
+ /** "unknown_consideration" exactly when first_buy_sol is null. */
1234
+ first_buy_sol_status: "measured" | "unknown_consideration";
1161
1235
  first_buy_at: string;
1162
- total_sol_bought: number;
1236
+ /** null when first_buy_sol is null (the first buy's cost is unknown), never the priced buys alone or 0. */
1237
+ total_sol_bought: number | null;
1163
1238
  total_sol_sold: number;
1164
- realized_pnl_sol: number;
1239
+ /** 2026-10 (migration 508) — null when the realization is unknown (a sell whose proceeds went to another wallet, price_status proceeds_unattributed); never reported as 0. */
1240
+ realized_pnl_sol: number | null;
1165
1241
  buy_count: number;
1166
1242
  sell_count: number;
1167
- result: "win" | "loss" | "open";
1243
+ /** 2026-10 (migration 508) — "unknown" when realized_pnl_sol is null: neither a win nor a loss. */
1244
+ result: "win" | "loss" | "open" | "unknown";
1168
1245
  }
1169
1246
  export interface AlphaWalletResponse {
1170
1247
  /** Launch-pipeline scope disclosure (absent ≠ clean). */
@@ -1193,8 +1270,11 @@ export type BuyerQualitySignal = "positive" | "neutral" | "negative";
1193
1270
  export interface CapTableBuyer {
1194
1271
  rank: number;
1195
1272
  wallet: string;
1196
- first_buy_sol: number;
1197
- first_buy_at: string;
1273
+ /** null = the first buy's SOL consideration is unknown (never reported as 0). */
1274
+ first_buy_sol: number | null;
1275
+ /** "unknown_consideration" exactly when first_buy_sol is null. */
1276
+ first_buy_sol_status: "measured" | "unknown_consideration";
1277
+ first_buy_at: string | null;
1198
1278
  /** Realized PnL on this token from confirmed swaps; null when unknown. */
1199
1279
  realized_pnl_sol?: number | null;
1200
1280
  total_sol_bought?: number | null;
@@ -1203,6 +1283,28 @@ export interface CapTableBuyer {
1203
1283
  first_sell_at?: string | null;
1204
1284
  /** first_sell_at == null (swap-ledger scoped: a plain transfer out still reads as holding). */
1205
1285
  still_holding?: boolean;
1286
+ /** 2026-10, only with verify_current_balances=true (ULTRA+): the current balance of this mint. */
1287
+ balance_now?: {
1288
+ amount_raw: string;
1289
+ decimals: number | null;
1290
+ amount: string;
1291
+ holding: boolean;
1292
+ token_accounts: number;
1293
+ slot: number;
1294
+ };
1295
+ /** 2026-10, only with verify_current_balances=true: the balance (unlike still_holding, the swap ledger). */
1296
+ holding_status?: "verified_nonzero" | "verified_zero";
1297
+ /** 2026-10, only with verify_current_balances=true: zero balance although no sell is on the swap ledger. */
1298
+ exited_without_sell?: boolean;
1299
+ /** 2026-10, only with include_scout_scores=true: KOL buyers' scout score as of first_buy_at (no hindsight); null for non-KOLs. */
1300
+ scout_score?: {
1301
+ as_of: string;
1302
+ first_touches_30d: number;
1303
+ avg_followers_4h: number | null;
1304
+ swarm_3plus_pct: number | null;
1305
+ swarm_5plus_pct: number | null;
1306
+ scout_tier: "S" | "A" | "B" | "C" | null;
1307
+ } | null;
1206
1308
  is_bundle: boolean;
1207
1309
  is_kol: boolean;
1208
1310
  kol_name: string | null;
@@ -1267,6 +1369,22 @@ export interface TokenCapTableResponse {
1267
1369
  /** v1.23.4 — trade-coverage disclosure (keyed route; absent on the x402 mirror and older cached responses). */
1268
1370
  coverage?: TradeCoverage;
1269
1371
  /** 2026-10 — whether early-buyer ranks 1..20 can be trusted (a recorded ingest gap overlapping launch→last ranked buy means a true early buyer may be missing). Absent on older responses. */
1372
+ /** 2026-10, only with include_scout_scores=true. */
1373
+ scout_scores_status?: "ok" | "unavailable" | "timeout" | "error";
1374
+ scout_scores_note?: string;
1375
+ /** 2026-10, only with verify_current_balances=true (ULTRA+), after every scored buyer was read. */
1376
+ onchain_balance_verification?: {
1377
+ source: string;
1378
+ checked_at: string;
1379
+ slot_min: number;
1380
+ slot_max: number;
1381
+ verified_wallets: number;
1382
+ complete: boolean;
1383
+ verified_still_holding: number;
1384
+ verified_exited: number;
1385
+ exited_without_sell: number;
1386
+ note: string;
1387
+ };
1270
1388
  ranks_completeness?: {
1271
1389
  ranks_complete: "observed_from_launch" | "gap_overlap" | "not_verified" | "no_ranks";
1272
1390
  rank_basis: "first_persisted_buys_at_or_above_floor";
@@ -1281,6 +1399,17 @@ export interface TokenCapTableResponse {
1281
1399
  }
1282
1400
  export interface TokenBuyerQualityResponse {
1283
1401
  mint: string;
1402
+ /** 2026-10, REST only with include_balances=true (PRO+): the dump-cluster early buyers' CURRENT holdings; totals only when every member was read. */
1403
+ dump_cluster_held_now?: {
1404
+ cohort_size: number;
1405
+ members: number;
1406
+ held_now: Record<string, unknown>;
1407
+ wallets: Array<{
1408
+ wallet: string;
1409
+ balance_now: Record<string, unknown> | null;
1410
+ }>;
1411
+ note: string;
1412
+ };
1284
1413
  score: number;
1285
1414
  confidence: BuyerQualityConfidence;
1286
1415
  signal: BuyerQualitySignal;
@@ -1543,6 +1672,16 @@ export interface Candle {
1543
1672
  close_liquidity_usd?: number | null;
1544
1673
  high_mc_usd?: number | null;
1545
1674
  low_mc_usd?: number | null;
1675
+ /** Known data-quality issue for this candle (2026-10-27); null = no known issue. OHLCV is never altered. */
1676
+ quality?: CandleQuality | null;
1677
+ }
1678
+ /** Per-candle data-quality status. On rolled-up timeframes the worst status of the 1-minute buckets inside. */
1679
+ export interface CandleQuality {
1680
+ status: "contaminated_proven" | "contaminated_suspected" | "unknown";
1681
+ /** Machine-readable cause, e.g. "clmm_v2_create_as_swap". */
1682
+ reason: string;
1683
+ /** 1-minute buckets inside this candle that are listed. */
1684
+ flagged_minutes: number;
1546
1685
  }
1547
1686
  /** 1-minute-derived OHLC candles for a token. PRO/ULTRA only. */
1548
1687
  export interface CandlesResponse {
@@ -1554,6 +1693,8 @@ export interface CandlesResponse {
1554
1693
  /** True when ULTRA net-flow/liquidity fields are populated on each candle. */
1555
1694
  net_flow_included: boolean;
1556
1695
  candles: Candle[];
1696
+ /** false = the quality lookup failed, so a null candle quality means not checked (2026-10-27). */
1697
+ quality_checked?: boolean;
1557
1698
  /** true = the page budget ran out before `limit` candles or `from` was reached; covered_from is then the oldest instant actually searched. */
1558
1699
  truncated?: boolean;
1559
1700
  covered_from?: string;
@@ -1633,6 +1774,96 @@ export interface BundleWallet {
1633
1774
  win_rate?: number | null;
1634
1775
  bot_confidence?: string | null;
1635
1776
  tokens_held?: number;
1777
+ /** 2026-10, only with include_balances=true: current balance of the mint; null when the cohort read failed. */
1778
+ balance_now?: {
1779
+ amount_raw: string;
1780
+ decimals: number | null;
1781
+ amount: string;
1782
+ holding: boolean;
1783
+ token_accounts: number;
1784
+ slot: number;
1785
+ } | null;
1786
+ }
1787
+ export type InsiderFlowNullReason = "unpriced_trades" | "firehose_gap" | "gap_state_unverified" | "not_captured" | "capture_unverified" | "no_buy_volume" | "buy_volume_incomplete" | "liquidity_unknown" | "liquidity_stale" | "sol_price_unavailable";
1788
+ /** One cohort (or the deduplicated `insiders` union) in one window. Every amount is null when the window is `not_captured`. */
1789
+ export interface InsiderFlowCohort {
1790
+ wallets_trading: number | null;
1791
+ wallets_selling: number | null;
1792
+ buy_trades: number | null;
1793
+ sell_trades: number | null;
1794
+ /** Proven SOL spent on buys; unpriced trades are excluded and counted in unpriced_trades. */
1795
+ buy_sol: number | null;
1796
+ sell_sol: number | null;
1797
+ sell_tokens: number | null;
1798
+ unpriced_trades: number | null;
1799
+ amounts: "complete" | "partial" | null;
1800
+ /** sell_sol - buy_sol (positive = net selling); null when amounts are partial or the window overlaps a capture gap. */
1801
+ net_sell_sol: number | null;
1802
+ net_sell_usd: number | null;
1803
+ /** PERCENT of every proven buy in the window. */
1804
+ net_sell_pct_of_buy_volume: number | null;
1805
+ /** PERCENT of the token liquidity in USD. */
1806
+ net_sell_pct_of_liquidity: number | null;
1807
+ null_reasons: Partial<Record<"net_sell_sol" | "net_sell_usd" | "net_sell_pct_of_buy_volume" | "net_sell_pct_of_liquidity", InsiderFlowNullReason>>;
1808
+ }
1809
+ export interface InsiderFlowWindow {
1810
+ from: string;
1811
+ to: string;
1812
+ seconds: number;
1813
+ status: "ok" | "no_trades" | "gap_overlap" | "gap_unverified" | "not_captured" | "capture_unverified";
1814
+ market: {
1815
+ buy_trades: number | null;
1816
+ sell_trades: number | null;
1817
+ buy_sol: number | null;
1818
+ sell_sol: number | null;
1819
+ unpriced_trades: number | null;
1820
+ };
1821
+ insiders: InsiderFlowCohort;
1822
+ by_cohort: {
1823
+ creator?: InsiderFlowCohort;
1824
+ early_buyers?: InsiderFlowCohort;
1825
+ bundlers?: InsiderFlowCohort;
1826
+ kols?: InsiderFlowCohort;
1827
+ };
1828
+ }
1829
+ /** GET /tokens/{mint}/insider-flow (PRO+): net selling by creator, early buyers, bundlers and KOLs over 5 and 15 minutes. */
1830
+ export interface TokenInsiderFlowResponse {
1831
+ mint: string;
1832
+ as_of: string;
1833
+ rule_version: string;
1834
+ time_basis: "ingest_clock";
1835
+ windows: Record<string, InsiderFlowWindow>;
1836
+ cohorts: {
1837
+ creator?: {
1838
+ status: "known" | "platform_signer" | "not_recorded";
1839
+ wallet?: string | null;
1840
+ };
1841
+ early_buyers?: {
1842
+ status: "recorded" | "not_recorded";
1843
+ wallets?: number;
1844
+ };
1845
+ bundlers?: {
1846
+ status: "detected" | "none_detected" | "not_measured";
1847
+ wallets?: number;
1848
+ };
1849
+ kols?: {
1850
+ status: "matched_on_trades";
1851
+ note?: string;
1852
+ };
1853
+ };
1854
+ completeness: Record<string, unknown>;
1855
+ liquidity: {
1856
+ liquidity_usd?: number | null;
1857
+ updated_at?: string | null;
1858
+ status?: "ok" | "unknown" | "stale" | "no_primary_pool";
1859
+ };
1860
+ sol_usd: {
1861
+ price?: number | null;
1862
+ source?: string;
1863
+ status?: "ok" | "unavailable";
1864
+ };
1865
+ coverage: Record<string, unknown>;
1866
+ note: string;
1636
1867
  }
1637
1868
  /**
1638
1869
  * Bundle-cohort holdings for a token. `held_pct_of_supply` (net held / circulating
@@ -1643,6 +1874,23 @@ export interface BundleWallet {
1643
1874
  export interface TokenBundleResponse {
1644
1875
  mint: string;
1645
1876
  bundle: BundleSummary;
1877
+ /** 2026-10, only with include_balances=true (PRO+): balance-based held figures; totals only when complete. */
1878
+ held_now?: {
1879
+ source: "solana_rpc_getTokenAccountsByOwner";
1880
+ checked_at: string;
1881
+ wallets: number;
1882
+ verified_wallets: number;
1883
+ holding_wallets: number;
1884
+ complete: boolean;
1885
+ incomplete_reason: string | null;
1886
+ slot_min: number | null;
1887
+ slot_max: number | null;
1888
+ tokens_held_raw: string | null;
1889
+ tokens_held: string | null;
1890
+ /** RATIO in [0, 1] of circulating_supply_raw. */
1891
+ held_pct_of_supply: number | null;
1892
+ supply_basis: "circulating_supply_raw" | null;
1893
+ };
1646
1894
  wallets: BundleWallet[];
1647
1895
  /** v1.23.4 — trade-coverage disclosure (keyed route; absent on older cached responses). */
1648
1896
  coverage?: TradeCoverage;
@@ -2100,6 +2348,10 @@ export interface KolConsensus {
2100
2348
  net_flow_sol: number;
2101
2349
  total_buy_sol: number;
2102
2350
  total_sell_sol: number;
2351
+ /** Sells with unknown proceeds left out of total_sell_sol / net flow (never counted as 0 SOL); null = not measured. */
2352
+ unknown_proceeds_sells?: number | null;
2353
+ /** false when unknown_proceeds_sells > 0; null = not measured. */
2354
+ sell_sol_complete?: boolean | null;
2103
2355
  first_kol_buy_at: string | null;
2104
2356
  last_kol_buy_at: string | null;
2105
2357
  first_touch_wallet: string | null;
@@ -2178,6 +2430,8 @@ export interface TokenSnapshot {
2178
2430
  price_sol: number | null;
2179
2431
  vwap_price_usd?: number | null;
2180
2432
  vwap_price_sol?: number | null;
2433
+ /** Why the VWAP fields are null, or "ok" (2026-10-15): an implausible VWAP is withheld, never served. */
2434
+ vwap_status?: "ok" | "unavailable" | "no_price_reference" | "implausible_vs_price";
2181
2435
  market_cap: number | null;
2182
2436
  fdv_usd: number | null;
2183
2437
  liquidity_usd: number | null;
@@ -2601,7 +2855,20 @@ export interface WalletStats {
2601
2855
  sold_sol: number;
2602
2856
  unique_tokens: number;
2603
2857
  window_days: number;
2858
+ /** 2026-10 (migration 508) — cost basis consumed by sells whose proceeds went to another wallet. Not in realized PnL or ROI (neither a loss nor a gain). 0 when complete. Absent on older servers. */
2859
+ unknown_realized_cost_basis_sol?: number;
2860
+ /** 2026-10 (migration 508) — sells with price_status proceeds_unattributed. Absent on older servers. */
2861
+ unattributed_sells?: number;
2604
2862
  }
2863
+ /**
2864
+ * 2026-10 (migration 508) — realized-PnL completeness. NOT the same field as
2865
+ * `coverage.completeness` (source-coverage verification, `"not_verified"`):
2866
+ * this one says whether realized PnL / ROI include every sell's proceeds.
2867
+ */
2868
+ export type RealizedPnlCompleteness = "complete" | "incomplete";
2869
+ export type RealizedPnlIncompleteReason = "proceeds_unattributed" | "unknown_consideration" | "missing_cost_basis";
2870
+ /** known = no unattributed sell; partial = some; unknown = every sell unattributed (outcome unknown, not a loss). */
2871
+ export type RealizedStatus = "known" | "partial" | "unknown";
2605
2872
  /** Rolling dump-cluster stats for a wallet (trailing 42 days, refreshed daily).
2606
2873
  * A "dump cohort" is a first-20 buyer appearance on a token that peaked <15min
2607
2874
  * after deploy. `null` on the parent means no cohort record for the wallet. */
@@ -2681,10 +2948,15 @@ export interface WalletTopToken {
2681
2948
  sells: number;
2682
2949
  sol_in: number;
2683
2950
  sol_out: number;
2951
+ /** Known basis only (migration 508): unattributed sells are excluded, see unknown_realized_cost_basis_sol. */
2684
2952
  realized_pnl_sol: number;
2685
2953
  current_mc_usd: number | null;
2686
2954
  peak_mc_usd: number | null;
2687
2955
  last_traded_at: string;
2956
+ /** 2026-10 (migration 508). Absent on older servers. */
2957
+ unknown_realized_cost_basis_sol?: number;
2958
+ unattributed_sells?: number;
2959
+ realized_status?: RealizedStatus;
2688
2960
  }
2689
2961
  export interface WalletTradingStyle {
2690
2962
  total_trades: number;
@@ -2715,9 +2987,14 @@ export interface WalletRecentTrade {
2715
2987
  tx_signature: string;
2716
2988
  }
2717
2989
  export interface WalletStatsResponse {
2718
- /** Trade-data coverage disclosure. */
2990
+ /** Trade-data coverage disclosure (its `completeness` is source coverage, not realized PnL). */
2719
2991
  coverage?: TradeCoverage;
2720
2992
  address: string;
2993
+ /** 2026-10 (migration 508) — realized-PnL completeness over stats + top_tokens. Absent on older servers. */
2994
+ completeness?: RealizedPnlCompleteness;
2995
+ incomplete_reasons?: RealizedPnlIncompleteReason[];
2996
+ /** 2026-10 — fixed sentence: realized PnL and ROI cover the known basis only. */
2997
+ pnl_basis_note?: string;
2721
2998
  stats: WalletStats | null;
2722
2999
  flags: WalletFlags;
2723
3000
  top_tokens?: WalletTopToken[];
@@ -2746,6 +3023,10 @@ export interface WalletPnlSummary {
2746
3023
  total_pnl_sol: number;
2747
3024
  total_bought_sol: number;
2748
3025
  total_sold_sol: number;
3026
+ /** 2026-10 (migration 508) — cost basis of FIFO lots consumed by disposals whose realization is unknown (proceeds_unattributed sells). Not in realized_sol: neither a loss nor a gain. 0 when complete. Absent on analyses cached before the field existed. */
3027
+ unknown_realized_cost_basis_sol?: number;
3028
+ /** Migration 516 (not yet enabled): proven single-event SOL tips inside the basis / proceeds above; tips shared by 2+ trades of one tx are in notes.unallocated_tx_costs. */
3029
+ tips_sol?: number;
2749
3030
  wins: number;
2750
3031
  losses: number;
2751
3032
  win_rate: number | null;
@@ -2780,15 +3061,21 @@ export interface WalletClosedPosition {
2780
3061
  pnl_sol: number;
2781
3062
  roi_pct: number | null;
2782
3063
  hold_minutes: number | null;
2783
- result: "win" | "loss" | "breakeven";
3064
+ /** 2026-10 (migration 508) — "unknown": at least one disposal's realization is unknown; not a win, not a loss, not in win_rate / profit_factor; sorted after the known positions. */
3065
+ result: "win" | "loss" | "breakeven" | "unknown";
3066
+ /** 2026-10 (migration 508) — known | partial (pnl_sol is the known part) | unknown. Absent on analyses cached before the field existed. */
3067
+ realized_status?: "known" | "partial" | "unknown";
3068
+ /** 2026-10 (migration 508) — basis of the lots consumed by unknown disposals of this token; not in pnl_sol. */
3069
+ unknown_realized_cost_basis_sol?: number;
2784
3070
  first_trade: string | null;
2785
3071
  last_trade: string | null;
2786
3072
  }
2787
3073
  export interface WalletOpenPosition {
2788
3074
  token_mint: string;
2789
3075
  token_amount: number;
2790
- cost_basis_sol: number;
2791
- avg_entry_price_sol: number;
3076
+ /** null when cost_basis_status is unknown. */
3077
+ cost_basis_sol: number | null;
3078
+ avg_entry_price_sol: number | null;
2792
3079
  current_price_sol: number | null;
2793
3080
  current_value_sol: number | null;
2794
3081
  unrealized_sol: number | null;
@@ -2799,8 +3086,9 @@ export interface WalletOpenPosition {
2799
3086
  position_basis?: "swap_derived";
2800
3087
  holding_status?: "verified" | "unverified";
2801
3088
  holding_unverified_reason?: "not_checked" | "no_fresh_snapshot" | "snapshot_unreadable" | "snapshot_older_than_trades" | "decimals_mismatch" | "balance_invalid" | null;
2802
- /** partial = a verified balance exceeds the trade position; the excess arrived without a swap and has no cost basis. */
2803
- cost_basis_status?: "known" | "partial";
3089
+ /** partial = a verified balance exceeds the trade position; the excess arrived without a swap and has no cost basis.
3090
+ * unknown = part of the position was bought with unknown consideration: cost_basis_sol / avg_entry_price_sol / unrealized_* are null. */
3091
+ cost_basis_status?: "known" | "partial" | "unknown";
2804
3092
  /** Present (non-null) only when holding_status = verified. */
2805
3093
  holding?: WalletPositionHolding | null;
2806
3094
  }
@@ -2810,10 +3098,10 @@ export interface WalletPositionHolding {
2810
3098
  onchain_balance: number;
2811
3099
  held_known_amount: number;
2812
3100
  external_inflow_amount: number;
2813
- cost_basis_held_sol: number;
3101
+ cost_basis_held_sol: number | null;
2814
3102
  unrealized_known_sol: number | null;
2815
3103
  /** Cost of FIFO lots no longer in the wallet. Outcome unknown: neither realized nor unrealized. */
2816
- cost_basis_not_held_sol: number;
3104
+ cost_basis_not_held_sol: number | null;
2817
3105
  verified_at: string;
2818
3106
  source: "wallet_holdings_cache";
2819
3107
  }
@@ -2833,6 +3121,9 @@ export interface WalletHoldingCheck {
2833
3121
  export interface WalletPnlResponse {
2834
3122
  address: string;
2835
3123
  window_days: number;
3124
+ /** 2026-10 (migration 508) — "incomplete" when at least one disposal's realized PnL is unknown (a sell whose proceeds went to another wallet, price_status proceeds_unattributed; or unknown consideration). Lots are consumed (holdings right), the realization is excluded from realized_sol / win_rate / best-worst, never booked as 0 proceeds. Absent on analyses cached before the field existed. */
3125
+ completeness?: "complete" | "incomplete";
3126
+ incomplete_reasons?: Array<"proceeds_unattributed" | "unknown_consideration" | "missing_cost_basis">;
2836
3127
  summary: WalletPnlSummary;
2837
3128
  pnl_curve: WalletPnlCurvePoint[];
2838
3129
  closed_positions: WalletClosedPosition[];
@@ -2849,6 +3140,16 @@ export interface WalletPnlResponse {
2849
3140
  sells_without_cost_basis?: {
2850
3141
  tokens: number;
2851
3142
  cost_basis: "unknown";
3143
+ }; /** 2026-10 (migration 508) — disposals whose realization is unknown; their basis is excluded from every realized figure. */
3144
+ unknown_realizations?: {
3145
+ proceeds_unattributed_sells: number;
3146
+ tokens: number;
3147
+ unknown_realized_cost_basis_sol: number;
3148
+ realized_pnl: "excluded";
3149
+ }; /** Migration 516 (not yet enabled): SOL tips in no basis and no realized PnL (shared by 2+ trades of one tx, never split; or on a trade with unknown realization). */
3150
+ unallocated_tx_costs?: {
3151
+ count: number;
3152
+ sol: number;
2852
3153
  };
2853
3154
  };
2854
3155
  /** 2026-10 (COV-21) — proven-holding check summary. Absent on older responses. */
@@ -2865,6 +3166,12 @@ export interface WalletPnlResponse {
2865
3166
  }
2866
3167
  export interface WalletPositionsResponse {
2867
3168
  address: string;
3169
+ /** 2026-10 (migration 508) — realized-PnL completeness of the wallet, same values as /pnl (NOT coverage.completeness). Absent on older servers. */
3170
+ completeness?: RealizedPnlCompleteness;
3171
+ incomplete_reasons?: RealizedPnlIncompleteReason[];
3172
+ summary?: {
3173
+ unknown_realized_cost_basis_sol: number;
3174
+ };
2868
3175
  positions: WalletOpenPosition[];
2869
3176
  /** 2026-10 (COV-21) — proven-holding check summary. Absent on older responses. */
2870
3177
  holding_check?: WalletHoldingCheck;
@@ -2933,7 +3240,10 @@ export interface WalletTrade {
2933
3240
  tx_signature: string;
2934
3241
  token_mint: string;
2935
3242
  action: "buy" | "sell";
2936
- sol_amount: number;
3243
+ /** SOL moved by this trade. `null` = the SOL consideration is unproven
3244
+ * (`event.price_status` "quote_unpriced" or "proceeds_unattributed"); `0` = a measured zero.
3245
+ * Since 2026-10-28 an unproven amount is never served as 0. */
3246
+ sol_amount: number | null;
2937
3247
  token_amount: number;
2938
3248
  /** This trade's executed price — `sol_amount / token_amount`. Added 2026-08-16;
2939
3249
  * this route returned amounts and no price before. See {@link TokenTrade}. */
@@ -2946,6 +3256,10 @@ export interface WalletTrade {
2946
3256
  market_price_usd: number | null;
2947
3257
  block_time: number;
2948
3258
  traded_at: string;
3259
+ /** Exact on-chain amounts — see {@link TradeRawAmounts}. Present once exact amounts are enabled server-side. */
3260
+ amounts?: TradeRawAmounts;
3261
+ /** Event identity + attribution labels — see {@link TradeEventFacts}. Present once event reads are enabled server-side. */
3262
+ event?: TradeEventFacts;
2949
3263
  }
2950
3264
  export interface WalletTradesResponse {
2951
3265
  /** Trade-data coverage disclosure. */
@@ -2993,7 +3307,10 @@ export interface TokenTrade {
2993
3307
  tx_signature: string;
2994
3308
  wallet_address: string;
2995
3309
  action: "buy" | "sell";
2996
- sol_amount: number;
3310
+ /** SOL moved by this trade. `null` = the SOL consideration is unproven
3311
+ * (`event.price_status` "quote_unpriced" or "proceeds_unattributed"); `0` = a measured zero.
3312
+ * Since 2026-10-28 an unproven amount is never served as 0. */
3313
+ sol_amount: number | null;
2997
3314
  token_amount: number;
2998
3315
  /** THIS TRADE's executed price: `sol_amount / token_amount`, so it reconciles
2999
3316
  * exactly with the amounts on the same row and with the PnL endpoints.
@@ -3020,6 +3337,88 @@ export interface TokenTrade {
3020
3337
  slot: number | null;
3021
3338
  block_time: number;
3022
3339
  traded_at: string;
3340
+ /** Exact on-chain amounts — see {@link TradeRawAmounts}. Present once exact amounts are enabled server-side. */
3341
+ amounts?: TradeRawAmounts;
3342
+ /** Event identity + attribution labels — see {@link TradeEventFacts}. Present once event reads are enabled server-side. */
3343
+ event?: TradeEventFacts;
3344
+ }
3345
+ /** Event identity and attribution labels of one Solana trade row (migration 493).
3346
+ * Every field null = a netted legacy row (one row per transaction, wallet and mint),
3347
+ * which is every row stored today. Labels are open-ended strings: treat an
3348
+ * unrecognised value as "not proven". Never deduplicate on
3349
+ * (tx_signature, wallet_address); event rows of one transaction differ in event_id. */
3350
+ export interface TradeEventFacts {
3351
+ /** `signature:outer_ix[.inner_ix]`; null = netted row. */
3352
+ event_id: string | null;
3353
+ /** "signer" | "non_signer" | "unproven" (excluded from wallet-scoped reads); null = legacy row. */
3354
+ trader_status: string | null;
3355
+ /** null = priced | "quote_unpriced" | "proceeds_unattributed": with either label sol_amount is NOT the
3356
+ * consideration and price_sol / price_usd are null. */
3357
+ price_status: string | null;
3358
+ /** "chain" | "ingest_clock"; null = legacy row (ingest clock). */
3359
+ block_time_source: string | null;
3360
+ /** Migrations 515/516 (not yet enabled): proven economic settlement of an event row; null = netted / nothing proven. */
3361
+ settlement?: TradeSettlement | null;
3362
+ /** Migrations 515/516 (not yet enabled): roles the tx proves; `wallet` only for a proven signer. */
3363
+ parties?: TradeEventParty[];
3364
+ }
3365
+ /** Amounts are exact base-unit decimal strings (parse with BigInt). */
3366
+ export interface TradeSettlement {
3367
+ /** "custody_fee" | "custody_forward" | "router_funded" (later "direct" | "split_parties" | "pumpfun_multihop"); null = only tips / fees. */
3368
+ route: string | null;
3369
+ amount: {
3370
+ mint: string;
3371
+ amount_raw: string;
3372
+ } | null;
3373
+ gross_token_amount_raw: string | null;
3374
+ pool_quote: {
3375
+ mint: string;
3376
+ amount_raw: string;
3377
+ } | null;
3378
+ /** Facts only: a router_fee / pumpswap_cashback fee is never part of the trade's amounts, price, volume, cost basis or PnL. program / recipient / payer: router_fee + pumpswap_cashback only (payer = this trade's wallet, else null); recipient_account: pumpswap_cashback only. */
3379
+ fees: Array<{
3380
+ kind: "funding_fee" | "route_fee_sol" | "router_fee" | "pumpswap_cashback" | (string & {});
3381
+ mint: string;
3382
+ amount_raw: string;
3383
+ program?: string;
3384
+ recipient?: string;
3385
+ recipient_account?: string;
3386
+ payer?: string | null;
3387
+ }>;
3388
+ tips: Array<{
3389
+ amount_raw: string;
3390
+ mint: string;
3391
+ recipient: string;
3392
+ instruction_index: number;
3393
+ }>;
3394
+ /** 1 = the tips are in this trade's PnL basis; 2+ = unallocated (never split). */
3395
+ tips_shared_by_events: number | null;
3396
+ }
3397
+ export interface TradeEventParty {
3398
+ role: string;
3399
+ ordinal: number;
3400
+ is_signer: boolean | null;
3401
+ /** Only when is_signer is true. */
3402
+ wallet: string | null;
3403
+ mint: string | null;
3404
+ amount_raw: string | null;
3405
+ }
3406
+ /** Exact amounts of one Solana trade (#508). Integers are decimal STRINGS (u64
3407
+ * base units exceed the JS number range; parse with BigInt).
3408
+ * `raw_known: false` = a row stored before exact amounts existed: every field
3409
+ * is null = UNKNOWN, never 0. `sol_amount` / `token_amount` on the row keep their
3410
+ * meaning (gross SOL incl. fee/rent; 6-decimal rounded UI amount). */
3411
+ export interface TradeRawAmounts {
3412
+ /** |net change of the traded mint|, base units (token_amount = token_raw / 10^token_decimals, exact). */
3413
+ token_raw: string | null;
3414
+ token_decimals: number | null;
3415
+ /** Signed lamports (negative = paid), tx fee + token-account rent excluded; null unless SOL is the proven settlement. */
3416
+ sol_net_lamports: string | null;
3417
+ /** The one non-SOL token moved the other way (USDC, PUMP, an xStock …); quote and SOL both null = settlement unknown. */
3418
+ quote_mint: string | null;
3419
+ quote_raw: string | null;
3420
+ quote_decimals: number | null;
3421
+ raw_known: boolean;
3023
3422
  }
3024
3423
  /** Mint-scoped trade tape. `coverage` is the honesty block: the tape starts
3025
3424
  * 2026-04-12 (`history_start`, unix sec) and is pump.fun-pipeline scoped
@@ -3061,12 +3460,23 @@ export interface TokenTopTrader {
3061
3460
  sells: number;
3062
3461
  bought_sol: number;
3063
3462
  sold_sol: number;
3463
+ /** Realized SOL PnL on the matched portion; cost basis per `cost_method`. */
3064
3464
  realized_pnl_sol: number;
3065
- unrealized_pnl_sol: number;
3066
- total_pnl_sol: number;
3067
- held_value_sol: number;
3465
+ /** null when still holding a token we cannot price (never valued at 0). */
3466
+ unrealized_pnl_sol: number | null;
3467
+ total_pnl_sol: number | null;
3468
+ held_value_sol: number | null;
3068
3469
  roi: number | null;
3069
3470
  still_holding: boolean;
3471
+ /** FIFO only: tokens sold without an observed earlier buy (proceeds excluded from realized PnL). null under average_cost. */
3472
+ unmatched_sell_tokens?: number | null;
3473
+ /** FIFO only: every sold token matched an observed buy. null under average_cost. */
3474
+ cost_basis_complete?: boolean | null;
3475
+ /** 2026-10 (migration 508) — basis consumed by sells whose proceeds went to another wallet; not in realized_pnl_sol / roi. Absent on older servers. */
3476
+ unknown_realized_cost_basis_sol?: number;
3477
+ unattributed_sells?: number;
3478
+ /** "unknown" = every sell unattributed: the outcome is unknown, this wallet is not a loser. */
3479
+ realized_status?: RealizedStatus;
3070
3480
  first_trade_at: string;
3071
3481
  last_trade_at: string;
3072
3482
  is_kol: boolean;
@@ -3081,12 +3491,20 @@ export interface TokenTopTradersResponse {
3081
3491
  mint: string;
3082
3492
  sort: "pnl" | "roi";
3083
3493
  window_days: number;
3494
+ /** "fifo" = same cost basis as /wallet/{address}/pnl; "average_cost" = legacy fallback (overstates profit on unmatched sells). */
3495
+ cost_method?: "fifo" | "average_cost";
3496
+ cost_method_note?: string;
3497
+ /** 2026-10 (migration 508) — realized-PnL completeness of the returned page (NOT coverage.completeness). Absent on older servers. */
3498
+ completeness?: RealizedPnlCompleteness;
3499
+ incomplete_reasons?: RealizedPnlIncompleteReason[];
3084
3500
  traders: TokenTopTrader[];
3085
3501
  summary: {
3086
3502
  returned: number;
3087
3503
  known_kols: number;
3088
3504
  known_alpha_wallets: number;
3089
3505
  net_realized_pnl_sol: number;
3506
+ unknown_realized_cost_basis_sol?: number;
3507
+ unattributed_sells?: number;
3090
3508
  };
3091
3509
  /** v1.23.4 — trade-coverage disclosure; when `in_scope` is false an empty
3092
3510
  * `traders` list means "outside the write-gate", not "nobody traded". */
@@ -3468,7 +3886,10 @@ export interface SniperDeploy {
3468
3886
  deployer_runner_rate?: number | null;
3469
3887
  deployer_labeled_tokens?: number | null;
3470
3888
  confirmed_on_chain: boolean | null;
3889
+ /** ShredPrism: FIRST observed successful confirmed-or-stronger outcome (observation time, not consensus time). Current status = confirmed_on_chain / execution_status. */
3471
3890
  confirmed_at: string | null;
3891
+ /** ShredPrism: first observed successful finalized outcome; null for legacy deshred rows. */
3892
+ finalized_at?: string | null;
3472
3893
  /** v1.21 — slot-window snipe rollup (slots [-1..+3]). Null until the ~10-min
3473
3894
  * settle window has passed — absent, not zero. */
3474
3895
  footprint?: SniperFootprint | null;
@@ -3487,6 +3908,28 @@ export interface SniperRecentResponse {
3487
3908
  data_age_seconds: number | null;
3488
3909
  /** Present (true) only when watchlist=true and your watchlist is empty. */
3489
3910
  watchlist_empty?: boolean;
3911
+ /** Which rows are still STORED per source (retention, not detection coverage). Nothing is
3912
+ * stored inside `gap`: legacy deshred ended at the 2026-10-06 switch; ShredPrism rows are deleted after 6 h. */
3913
+ history?: SniperHistory;
3914
+ }
3915
+ export interface SniperHistory {
3916
+ sources: Array<{
3917
+ source: "deshred";
3918
+ status: "retired";
3919
+ newest_row_at: string;
3920
+ } | {
3921
+ source: "shredprism";
3922
+ status: "live";
3923
+ retention_hours: number;
3924
+ retained_from: string;
3925
+ }>;
3926
+ gap: {
3927
+ from: string;
3928
+ to: string;
3929
+ } | null;
3930
+ source_switch_date: string;
3931
+ confirmed_at_semantics: string;
3932
+ note: string;
3490
3933
  }
3491
3934
  /** One DEX pool a token trades in. `is_active` distinguishes live vs parked venues. */
3492
3935
  export interface TokenPool {
@@ -3651,7 +4094,34 @@ export interface TokenDepthResponse {
3651
4094
  };
3652
4095
  }
3653
4096
  /** Wallet-intelligence labels on a holder. Empty = unknown to us, NOT verified clean. */
3654
- export type TokenHolderLabel = "deployer" | "kol" | "early_buyer" | "buyer" | "bundle" | "bot" | "dump_cluster";
4097
+ /** sniper / bundler_wallet / dumper / alpha_tracked appear only with `include_wallet_flags=true`. Empty labels = unknown to us, not verified clean. */
4098
+ export type TokenHolderLabel = "deployer" | "kol" | "early_buyer" | "buyer" | "bundle" | "bot" | "dump_cluster" | "sniper" | "bundler_wallet" | "dumper" | "alpha_tracked";
4099
+ /** Per label: `evaluated: false` means insufficient evidence, NOT a verified negative. */
4100
+ export type WalletFlagLabelCoverage = Record<string, {
4101
+ evaluated: boolean;
4102
+ reason?: string;
4103
+ }>;
4104
+ /** Per-holder flags, only with `include_wallet_flags=true` (TR-07). Null when the flag sources were unavailable. */
4105
+ export interface TokenHolderWalletFlags {
4106
+ is_sniper: boolean;
4107
+ is_bundler: boolean;
4108
+ is_dumper: boolean;
4109
+ is_kol: boolean;
4110
+ is_alpha_tracked: boolean;
4111
+ is_bot_high_confidence: boolean;
4112
+ label_coverage: WalletFlagLabelCoverage;
4113
+ }
4114
+ /** Top-level flag status, only with `include_wallet_flags=true`. */
4115
+ export interface WalletFlagsMeta {
4116
+ status: "available" | "partial" | "unavailable";
4117
+ rule_version?: string;
4118
+ note?: string;
4119
+ [key: string]: unknown;
4120
+ }
4121
+ export interface TokenHoldersParams {
4122
+ /** Opt in to per-holder `wallet_flags` + `wallet_flags_meta` (PRO+, tier-disclosed rows only). */
4123
+ include_wallet_flags?: boolean;
4124
+ }
3655
4125
  /** One ranked holder (owner wallet, token accounts merged). */
3656
4126
  export interface TokenHolder {
3657
4127
  rank: number;
@@ -3670,6 +4140,8 @@ export interface TokenHolder {
3670
4140
  early_buyer_rank: number | null;
3671
4141
  bot_confidence: "none" | "low" | "medium" | "high" | null;
3672
4142
  historical_win_rate: number | null;
4143
+ /** Only with `include_wallet_flags=true`; null when the flag sources were unavailable. */
4144
+ wallet_flags?: TokenHolderWalletFlags | null;
3673
4145
  }
3674
4146
  /**
3675
4147
  * An owner EXCLUDED from the circulating denominator, named where we can:
@@ -3700,6 +4172,10 @@ export interface TokenHoldersConcentration {
3700
4172
  token_accounts_nonzero: number | null;
3701
4173
  /** Raw u64 as STRINGS. */
3702
4174
  supply_raw: string | null;
4175
+ /** Where supply_raw came from: the mint account read in this request (normal), the cache, or getTokenSupply. null when withheld. */
4176
+ supply_source?: "mint_account" | "token_prices_cache" | "rpc_token_supply" | null;
4177
+ /** false = no supply consistent with the disclosed balances; every percentage is then null. */
4178
+ supply_consistent?: boolean;
3703
4179
  circulating_raw: string | null;
3704
4180
  decimals: number | null;
3705
4181
  /** Shares over the circulating denominator (supply minus excluded). top50/top100 are null on the top-20 fallback. */
@@ -3767,6 +4243,8 @@ export interface TokenHoldersResponse {
3767
4243
  census_fallback_reason: string | null;
3768
4244
  note: string;
3769
4245
  };
4246
+ /** Only with `include_wallet_flags=true`. */
4247
+ wallet_flags_meta?: WalletFlagsMeta;
3770
4248
  }
3771
4249
  /** Locker program a contract lives under. LP locks are NOT covered (token / vesting locks only). */
3772
4250
  /** smithii_vesting / sablier_lockup are served only while listed in the response's meta.programs (verified admission). */
@@ -4065,7 +4543,7 @@ export interface TokenFeedPagination {
4065
4543
  /** Pass as `before` to page back. */
4066
4544
  next_before: string | null;
4067
4545
  }
4068
- /** The locks feed's pagination: adds the strict keyset cursor and the post-filter scan meta. (Earlier types put these on every feed; the fee-claims and surges routes never send them.) */
4546
+ /** The locks feed's pagination: adds the strict keyset cursor and the post-filter scan meta. */
4069
4547
  export interface TokenLocksFeedPagination extends TokenFeedPagination {
4070
4548
  /** v1.24 — pass as `cursor` to page back without skipping same-timestamp rows; null = end. */
4071
4549
  next_cursor?: string | null;
@@ -4693,11 +5171,13 @@ export interface TokenFeeClaimsParams {
4693
5171
  social_platform?: number;
4694
5172
  /** Platform-native numeric user id. */
4695
5173
  social_user_id?: string;
4696
- /** Amount floor in SOL. */
5174
+ /** Amount floor in SOL; only SOL-quoted events match. */
4697
5175
  min_sol?: number;
4698
5176
  /** ISO date-time (use `pagination.next_since`). */
4699
5177
  since?: string;
4700
- /** ISO date-time (use `pagination.next_before`). */
5178
+ /** Opaque lossless backward-page cursor (pagination.next_cursor). */
5179
+ cursor?: string;
5180
+ /** Legacy strict timestamp bound; can skip same-timestamp events. */
4701
5181
  before?: string;
4702
5182
  /** 1–100, default 50. */
4703
5183
  limit?: number;
@@ -4743,7 +5223,9 @@ export interface TokenFeeClaimEvent {
4743
5223
  /** GET /tokens/fee-claims — pump.fun fee-event feed, newest first. **History starts 2026-08-17.** PRO+, keyed only. */
4744
5224
  export interface TokenFeeClaimsResponse {
4745
5225
  events: TokenFeeClaimEvent[];
4746
- pagination: TokenFeedPagination;
5226
+ pagination: TokenFeedPagination & {
5227
+ next_cursor: string | null;
5228
+ };
4747
5229
  /** Pointer to the `token:fee_claims` WS channel (event `token:fee_claim`). */
4748
5230
  stream: TokenFeedStreamPointer;
4749
5231
  meta?: Record<string, unknown>;
@@ -4819,7 +5301,10 @@ export interface TokenSurgeEarlyBuyers {
4819
5301
  count: number;
4820
5302
  /** Early buyers that bought in the same block. */
4821
5303
  bundled: number;
5304
+ /** null when any cohort first buy has an unknown SOL cost (never summed as 0); see cohort_sol_unknown_ranks. */
4822
5305
  cohort_sol: number | null;
5306
+ /** Cohort wallets whose first-buy SOL cost is unknown (0 = cohort_sol is complete). Absent on fires before 2026-10-27. */
5307
+ cohort_sol_unknown_ranks?: number;
4823
5308
  /** Cohort wallets that have already sold. */
4824
5309
  sold: number;
4825
5310
  /** Cohort wallets that are known sniper wallets. */
@@ -5205,6 +5690,21 @@ export interface DeployerActivityFamilyCoverage {
5205
5690
  missing_months: string[];
5206
5691
  months_read: string[];
5207
5692
  };
5693
+ /** launches only (2026-10-18): per supported launchpad, whether this window is fully held. The family-level complete / complete_from follow the strictest of these boundaries. A boundary is known coverage, not proof every transaction arrived. */
5694
+ launchpads?: DeployerActivityLaunchpadCoverage[];
5695
+ /** launches only: NOT supported launchpads (moonit, boop, heaven); their launches never appear and do not affect complete. */
5696
+ launchpads_not_indexed?: string[];
5697
+ }
5698
+ export interface DeployerActivityLaunchpadCoverage {
5699
+ launchpad: "pumpfun" | "raydium_launchlab" | "meteora_dbc";
5700
+ /** true when the window starts at or after this launchpad's boundary. */
5701
+ complete: boolean;
5702
+ /** Later of the window start and the boundary (pump.fun / LaunchLab unbonded: 2026-07-03T05:00Z; Meteora DBC: 2026-10-03T16:32:57Z). */
5703
+ complete_from: string;
5704
+ /** What exists before complete_from: bonded launches only, or nothing. */
5705
+ before_complete_from: "bonded_only" | "none";
5706
+ /** Launches that never reach a creator's timeline (Bags via a known relayer), or null. */
5707
+ creator_gaps: string | null;
5208
5708
  }
5209
5709
  export interface DeployerActivityRange {
5210
5710
  from: string | null;
@@ -5512,6 +6012,26 @@ export interface DeployerTokensParams {
5512
6012
  offset?: number;
5513
6013
  /** true = only tokens that graduated (bonded_at set); total / has_more count the bonded set. */
5514
6014
  only_bonded?: boolean;
6015
+ /** Opt in to `launches_24h` (distinct launches observed in our index over a rolling UTC 24 h window). */
6016
+ include_launches_24h?: boolean;
6017
+ }
6018
+ /**
6019
+ * Launches observed in OUR index over a rolling UTC 24 h window (TR-03).
6020
+ * Indexed observations only, not a chain-complete count. `count` is null
6021
+ * (never 0) unless `status` is `observed`.
6022
+ */
6023
+ export interface DeployerLaunches24h {
6024
+ window_start: string;
6025
+ window_end: string;
6026
+ count: number | null;
6027
+ status: "observed" | "source_unavailable" | "over_budget" | "source_incomplete" | "untracked_deployer";
6028
+ completeness: "indexed_observations_only";
6029
+ provenance?: string;
6030
+ row_cap_per_source?: number;
6031
+ source_rows?: {
6032
+ bonded?: number;
6033
+ pending?: number;
6034
+ };
5515
6035
  }
5516
6036
  /** `GET /deployer-hunter/{wallet}/tokens` — newest bond first. */
5517
6037
  export interface DeployerTokensResponse {
@@ -5525,6 +6045,8 @@ export interface DeployerTokensResponse {
5525
6045
  offset: number;
5526
6046
  has_more: boolean;
5527
6047
  coverage?: LaunchCoverage;
6048
+ /** Present only with `include_launches_24h=true`. */
6049
+ launches_24h?: DeployerLaunches24h;
5528
6050
  }
5529
6051
  export interface DeployerAlertStatsParams {
5530
6052
  /** Lookback window, e.g. `24h`, `7d`, `30d`. */
@@ -5652,4 +6174,81 @@ export interface RecentBondsResponse extends FreeTierDelayMeta {
5652
6174
  /** Pass back as `since` to fetch only newer bonds. */
5653
6175
  next_since?: string | null;
5654
6176
  }
6177
+ /** Filters for the `token:bundles` channel (all optional, AND-combined; invalid values reject the channel). */
6178
+ export interface TokenBundlesFilters {
6179
+ /** Only these mints (at most 250). */
6180
+ mints?: string[];
6181
+ /** Minimum distinct buyers in the cluster (3-50, count at detection). */
6182
+ min_wallets?: number;
6183
+ /** Minimum buyers new to the token (3-50). */
6184
+ min_new_wallets?: number;
6185
+ /** launch = within 5 minutes of the token's first sighting. */
6186
+ phases?: Array<"launch" | "later" | "unknown">;
6187
+ /** Only clusters where one transaction carried 3+ of the buyers. */
6188
+ atomic_only?: boolean;
6189
+ /** Only these event types (default both). */
6190
+ bundle_events?: Array<"token:bundle_cluster" | "token:bundle_exit">;
6191
+ }
6192
+ /**
6193
+ * `token:bundle_cluster` on WS `token:bundles` (PRO+): one NEW coordinated buy
6194
+ * cluster on a Solana token, launch or later: one slot where >= 3 wallets
6195
+ * bought and >= 3 of them had never bought the token before. Only stored buys
6196
+ * count (0.05 SOL / $3.50 persistence floor). `wallet_count` is the count at
6197
+ * detection; a cluster is announced once. Evidence, not a verdict. For the
6198
+ * share of supply these wallets hold now call `tokenBundleShare()`.
6199
+ */
6200
+ export interface TokenBundleClusterEvent {
6201
+ /** bundle_cluster_events row id (dedupe key). */
6202
+ id: number;
6203
+ chain: "solana";
6204
+ mint: string;
6205
+ slot: number;
6206
+ /** First buy of the cluster (ISO). */
6207
+ at: string;
6208
+ minutes_after_launch: number | null;
6209
+ phase: "launch" | "later" | "unknown";
6210
+ launch_at: string | null;
6211
+ wallet_count: number;
6212
+ new_wallets: number;
6213
+ /** Transactions carrying 3+ of the buyers (definitively coordinated). */
6214
+ atomic_txs: number;
6215
+ sol_volume: number | null;
6216
+ token_volume: number | null;
6217
+ /** Up to 50 buyer wallets. */
6218
+ wallets: string[];
6219
+ /** When bundle-watch detected it (ISO). */
6220
+ detected_at: string;
6221
+ }
6222
+ /**
6223
+ * `token:bundle_exit` on WS `token:bundles` (PRO+): an announced cluster's
6224
+ * wallets have sold `threshold_pct` (25 / 50 / 90 / 100) % of what they bought
6225
+ * IN the cluster, each threshold once. Carries the cluster's own fields, so the
6226
+ * channel filters apply alike. Only sells by the bundle wallets themselves,
6227
+ * followed for 7 days after detection; first 50 wallets of a larger cluster.
6228
+ */
6229
+ export interface TokenBundleExitEvent extends Omit<TokenBundleClusterEvent, "sol_volume" | "token_volume" | "wallets"> {
6230
+ cluster_id: number;
6231
+ cluster_detected_at: string | null;
6232
+ threshold_pct: 25 | 50 | 90 | 100;
6233
+ wallets_tracked: number;
6234
+ wallets_sold: number;
6235
+ /** Wallets that sold at least 99 % of their cluster buy. */
6236
+ wallets_exited: number;
6237
+ bought_tokens: number;
6238
+ sold_tokens: number;
6239
+ /** sum over wallets of min(sold, bought) / bought, 0..1. */
6240
+ sold_pct: number | null;
6241
+ realized_sol: number;
6242
+ /** 2026-10 (migration 511) — "incomplete" when a recorded sell has unknown proceeds: its tokens count in sold_pct, its proceeds are not in realized_sol (never 0). null = not measured. */
6243
+ realized_status?: "complete" | "incomplete" | null;
6244
+ unknown_proceeds_sells?: number | null;
6245
+ last_sell_at: string | null;
6246
+ recent_sells: Array<{
6247
+ wallet: string;
6248
+ tx_signature: string;
6249
+ tokens: number | null;
6250
+ sol: number | null;
6251
+ at: string;
6252
+ }>;
6253
+ }
5655
6254
  //# sourceMappingURL=types.d.ts.map