madeonsol-x402 3.2.0 → 3.2.1

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
@@ -563,7 +563,9 @@ export interface DeployerAlertsParams {
563
563
  /** v2.10: every event the registry accepts (src/lib/webhook-events.ts VALID_EVENTS); earlier types listed only the first four. */
564
564
  export type WebhookEvent = "kol:trade" | "kol:coordination" | "deployer:alert" | "deployer:bond" | "wallet_tracker:event" | "sniper:deploy" | "rhc:kol_trade" | "token:surge" | "token:revival"
565
565
  /** Realtime developer sells / buys / token transfers (PRO+; identity fields ULTRA+). Dedupe on payload `id`. */
566
- | "dev:activity";
566
+ | "dev:activity"
567
+ /** Robinhood Chain developer buys / sells only (never transfers), PRO+, projected per tier like dev:activity. */
568
+ | "rhc:dev_activity";
567
569
  export interface WebhookFilters {
568
570
  min_sol?: number;
569
571
  action?: "buy" | "sell";
@@ -580,7 +582,10 @@ export interface WebhookFilters {
580
582
  /** dev:activity only. */
581
583
  types?: Array<"dev_sell" | "dev_buy" | "dev_token_transfer_out" | "dev_token_transfer_in">;
582
584
  token_mints?: string[];
585
+ /** dev:activity (base58) and rhc:dev_activity (0x, case-insensitive): deployer_wallet or actor_wallet. */
583
586
  deployers?: string[];
587
+ /** rhc:dev_activity only: 0x token addresses. */
588
+ addresses?: string[];
584
589
  /** ULTRA/BUSINESS custom conditions (max 10). */
585
590
  conditions?: WebhookCondition[];
586
591
  }
@@ -1249,6 +1254,18 @@ export interface TokenCapTableResponse {
1249
1254
  summary: CapTableSummary;
1250
1255
  /** v1.23.4 — trade-coverage disclosure (keyed route; absent on the x402 mirror and older cached responses). */
1251
1256
  coverage?: TradeCoverage;
1257
+ /** 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. */
1258
+ ranks_completeness?: {
1259
+ ranks_complete: "observed_from_launch" | "gap_overlap" | "not_verified" | "no_ranks";
1260
+ rank_basis: "first_persisted_buys_at_or_above_floor";
1261
+ window: {
1262
+ from: string;
1263
+ to: string;
1264
+ } | null;
1265
+ gaps_overlapping: number;
1266
+ open_slots: number;
1267
+ gaps_in_open_slots: number;
1268
+ };
1252
1269
  }
1253
1270
  export interface TokenBuyerQualityResponse {
1254
1271
  mint: string;
@@ -1577,6 +1594,10 @@ export interface BundleSummary {
1577
1594
  buy_volume: number;
1578
1595
  /** Swap-derived net position (proxy for on-chain balance). */
1579
1596
  tokens_held: number;
1597
+ /** 2026-10 (COV-23) — `swap_only` = token transfers are not applied: a member that transferred tokens out and sold elsewhere still reads as holding. Absent on older responses. */
1598
+ holdings_basis?: "swap_only" | "swap_and_transfers";
1599
+ /** 2026-10 (COV-23) — how cohort membership is decided today: ≥3 wallets buying in one ingest batch with the same block_time second (not the same slot). Absent on older responses. */
1600
+ bundle_detection?: "same_batch_block_time_second";
1580
1601
  }
1581
1602
  /**
1582
1603
  * One wallet in the bundle cohort. `rank`…`is_kol` are returned on PRO (top-10)
@@ -1641,15 +1662,37 @@ export interface CopyTradeSubscription {
1641
1662
  created_at: string;
1642
1663
  updated_at?: string;
1643
1664
  /**
1644
- * Source wallets that are tracked KOL wallets (can produce signals), read at
1645
- * response time. `null` when the tracking lookup failed (see `warnings`).
1665
+ * Source wallets that are tracked KOL wallets, read at response time. Under
1666
+ * `source_admission: "any_wallet"` (production since 2026-10-04) this is KOL
1667
+ * enrichment only; under the legacy `"kol_only"` engine only these produce signals.
1668
+ * @deprecated 2026-10-04, kept and still filled. `null` when the tracking lookup failed (see `warnings`).
1646
1669
  * Returned by servers from 2026-09-25 on; absent on older ones.
1647
1670
  */
1648
1671
  source_wallets_tracked?: string[] | null;
1649
- /** Source wallets that are NOT tracked KOL wallets: they never produce a signal. */
1672
+ /**
1673
+ * Source wallets that are NOT tracked KOL wallets. Under
1674
+ * `source_admission: "any_wallet"` they fire like any other wallet (no
1675
+ * Wallet Tracker entry or quota needed); under the legacy `"kol_only"` engine
1676
+ * they never produce a signal.
1677
+ * @deprecated 2026-10-04 — KOL membership is enrichment only; kept and still filled.
1678
+ */
1650
1679
  source_wallets_untracked?: string[] | null;
1651
- /** Present when at least one wallet is untracked, or tracking could not be determined. */
1680
+ /** Present when at least one wallet is untracked (legacy kol_only only), or tracking could not be determined. */
1652
1681
  warnings?: CopyTradeRuleWarning[];
1682
+ /**
1683
+ * Whether the rule can fire right now, separate from `is_active`. Legacy
1684
+ * `kol_only`: `eligible` | `no_tracked_sources` | `unknown`. Server
1685
+ * 2026-10-04 `any_wallet`: `eligible`, or an infrastructure state —
1686
+ * `monitoring_pending` (rule changed after the engine's last load, live
1687
+ * within seconds), `monitoring_unavailable` (engine / trade stream not
1688
+ * reporting; it fires nothing then, see `monitoring_reasons`),
1689
+ * `source_capacity_unavailable`.
1690
+ */
1691
+ operational_state?: "eligible" | "monitoring_pending" | "monitoring_unavailable" | "source_capacity_unavailable" | "no_tracked_sources" | "unknown";
1692
+ /** Server 2026-10-04 — which trades the RUNNING engine admits. Absent = unknown (legacy kol_only semantics). */
1693
+ source_admission?: "kol_only" | "any_wallet";
1694
+ /** Server 2026-10-04 — present only with `monitoring_unavailable`: e.g. `trade_stream_stale`, `source_producer_stale`, `map_stale`, `engine_state_stale`. */
1695
+ monitoring_reasons?: string[];
1653
1696
  }
1654
1697
  /** A non-fatal note on a copy-trade rule. The rule is saved unchanged. */
1655
1698
  export interface CopyTradeRuleWarning {
@@ -1661,9 +1704,10 @@ export interface CopyTradeRuleWarning {
1661
1704
  *
1662
1705
  * `source_wallets`: the per-rule limit is set by your tier and enforced by the
1663
1706
  * server (Pro 5, Ultra 50, Business and Enterprise 250; `GET /me` reports
1664
- * yours as `copytrade_wallets_per_rule`). Signals fire only for trades by
1665
- * wallets MadeOnSol tracks as KOLs (`GET /kol/wallets`). Any valid Solana
1666
- * address is accepted into a rule, but an untracked wallet never produces a signal.
1707
+ * yours as `copytrade_wallets_per_rule`). Any valid Solana wallet can be a
1708
+ * source, KOL or not (`source_admission: "any_wallet"`, production since
1709
+ * 2026-10-04; no Wallet Tracker quota used). On a server still running the
1710
+ * legacy `"kol_only"` engine only tracked KOL wallets (`GET /kol/wallets`) fire.
1667
1711
  */
1668
1712
  export interface CopyTradeCreateParams {
1669
1713
  name?: string;
@@ -1744,6 +1788,14 @@ export interface CopyTradeSignal extends McDeltaFields {
1744
1788
  market_cap_usd?: number | null;
1745
1789
  /** v1.5 — current last-trade price (USD). */
1746
1790
  last_price_usd?: number | null;
1791
+ /** Present once copy-trade identity v2 is active: the independent action this signal copies (null on identity_version 1 rows). Dedupe on id or economic_action_id, never on tx_signature. */
1792
+ economic_action_id?: string | null;
1793
+ /** Present once copy-trade identity v2 is active: the followed wallet that performed the action. */
1794
+ source_actor?: string | null;
1795
+ /** Present once copy-trade identity v2 is active: other followed wallets in the same action. */
1796
+ co_actors?: string[];
1797
+ /** Present once copy-trade identity v2 is active: 1 = per (rule, tx), 2 = per (rule, economic action). */
1798
+ identity_version?: 1 | 2;
1747
1799
  }
1748
1800
  export interface CopyTradeSignalsParams {
1749
1801
  subscription_id?: number;
@@ -1755,6 +1807,22 @@ export interface CopyTradeSignalsParams {
1755
1807
  min_mc_usd?: number;
1756
1808
  /** Keep signals whose source trade's market cap (USD) was at most this. Drops unknown-MC signals. */
1757
1809
  max_mc_usd?: number;
1810
+ /** `next_cursor` from the previous page — opaque strict (fired_at, id) keyset. The MC band is applied before limit and cursor. */
1811
+ cursor?: string;
1812
+ }
1813
+ export interface CopyTradeSignalsResponse {
1814
+ signals: CopyTradeSignal[];
1815
+ /** Pass as `cursor` for the next (older) page; null at the end. */
1816
+ next_cursor?: string | null;
1817
+ /** false only when your signals ran out. */
1818
+ has_more?: boolean;
1819
+ /** Present with min_mc_usd / max_mc_usd; scan_truncated=true means more matches MAY exist past next_cursor. */
1820
+ scan?: {
1821
+ post_filtered: boolean;
1822
+ scanned: number;
1823
+ scan_truncated: boolean;
1824
+ scan_budget: number;
1825
+ };
1758
1826
  }
1759
1827
  export interface WalletTrackerEntry {
1760
1828
  wallet_address: string;
@@ -2402,6 +2470,15 @@ export interface TokenSummary {
2402
2470
  /** v1.24 — VERIFIED LP evidence only; null = unknown (every token today). Was a supply-burn proxy before. */
2403
2471
  lp_burned?: boolean | null;
2404
2472
  lp_burn_status?: LpBurnStatus;
2473
+ /**
2474
+ * D-22 — burned + non-cancelable LOCKED share of the LP (0–100), from LP
2475
+ * evidence; null = unknown (never 0 for unknown). `lp_burnt_pct` stays burn-only.
2476
+ */
2477
+ lp_secured_pct?: number | null;
2478
+ /** permanent = burn and/or permanent locks only; temporary = only time-limited locks; mixed = both; null = nothing secured or unknown. */
2479
+ lp_secured_basis?: "permanent" | "temporary" | "mixed" | null;
2480
+ /** Earliest end of a counted TEMPORARY LP lock (ISO); null when none. Permanent locks have no date. */
2481
+ lp_locked_until?: string | null;
2405
2482
  token_supply_burn_detected?: boolean | null;
2406
2483
  }
2407
2484
  export interface TokensListResponse {
@@ -2463,6 +2540,8 @@ export interface AlmostBondedToken {
2463
2540
  name: string | null;
2464
2541
  /** Launch venue: pump.fun curve or bonk/LetsBonk (Raydium LaunchLab). */
2465
2542
  launchpad?: "pumpfun" | "launchlab";
2543
+ /** 2026-10 — where `launchpad` came from: `primary_dex`, or the token's single curve pool in `token_pools` when primary_dex is unset. */
2544
+ venue_source?: "primary_dex" | "token_pools";
2466
2545
  /** Bonding-curve progress %, from on-chain real_token_reserves depletion. */
2467
2546
  progress_pct: number | null;
2468
2547
  /** Δprogress per minute; null until a 5m-ago snapshot exists. */
@@ -2553,6 +2632,13 @@ export interface WalletClassification {
2553
2632
  kol_name: string | null;
2554
2633
  bot_confidence: "low" | "medium" | "high" | "none" | null;
2555
2634
  dump_cluster: DumpClusterStats | null;
2635
+ /** 2026-10 (COV-25) — whether each flag's rule actually evaluated this wallet. evaluated=false → the boolean is "no evidence", not "verified clean". */
2636
+ label_coverage?: Record<"sniper" | "bundler" | "dumper" | "kol", LabelCoverageEntry>;
2637
+ }
2638
+ export type LabelCoverageReason = "flagged" | "rule_evaluated" | "insufficient_sample" | "not_checked_budget" | "sample_unavailable" | "population_not_checked" | "no_cohort_stats" | "registry";
2639
+ export interface LabelCoverageEntry {
2640
+ evaluated: boolean;
2641
+ reason: LabelCoverageReason;
2556
2642
  }
2557
2643
  export interface WalletBatchClassifyResponse {
2558
2644
  /** Launch-pipeline scope disclosure (absent ≠ clean). */
@@ -2560,6 +2646,15 @@ export interface WalletBatchClassifyResponse {
2560
2646
  wallets: WalletClassification[];
2561
2647
  count: number;
2562
2648
  as_of: string;
2649
+ /** 2026-10 (COV-25) — label rule version, e.g. `wallet-labels/368-v1`. */
2650
+ rule_version?: string;
2651
+ /** 2026-10 (COV-25) — one sentence per label: population + window. */
2652
+ evidence_horizon?: {
2653
+ sniper: string;
2654
+ bundler: string;
2655
+ dumper: string;
2656
+ kol: string;
2657
+ };
2563
2658
  }
2564
2659
  export interface WalletTopToken {
2565
2660
  token_mint: string;
@@ -2682,6 +2777,40 @@ export interface WalletOpenPosition {
2682
2777
  unrealized_pct: number | null;
2683
2778
  first_buy_at: string | null;
2684
2779
  buys_in_position: number;
2780
+ /** 2026-10 (COV-21) — positions are FIFO-open DEX buys (trade position), not a proven holding. */
2781
+ position_basis?: "swap_derived";
2782
+ holding_status?: "verified" | "unverified";
2783
+ holding_unverified_reason?: "not_checked" | "no_fresh_snapshot" | "snapshot_unreadable" | "snapshot_older_than_trades" | "decimals_mismatch" | "balance_invalid" | null;
2784
+ /** partial = a verified balance exceeds the trade position; the excess arrived without a swap and has no cost basis. */
2785
+ cost_basis_status?: "known" | "partial";
2786
+ /** Present (non-null) only when holding_status = verified. */
2787
+ holding?: WalletPositionHolding | null;
2788
+ }
2789
+ /** 2026-10 (COV-21) — proven on-chain holding for one swap-derived position. */
2790
+ export interface WalletPositionHolding {
2791
+ status: "HELD" | "PARTIALLY_REDUCED" | "TRANSFERRED_OR_DISPOSED" | "EXTERNAL_INFLOW";
2792
+ onchain_balance: number;
2793
+ held_known_amount: number;
2794
+ external_inflow_amount: number;
2795
+ cost_basis_held_sol: number;
2796
+ unrealized_known_sol: number | null;
2797
+ /** Cost of FIFO lots no longer in the wallet. Outcome unknown: neither realized nor unrealized. */
2798
+ cost_basis_not_held_sol: number;
2799
+ verified_at: string;
2800
+ source: "wallet_holdings_cache";
2801
+ }
2802
+ /** 2026-10 (COV-21) — summary of the proven-holding check over the returned open positions. */
2803
+ export interface WalletHoldingCheck {
2804
+ mode: "off" | "cache";
2805
+ source: "wallet_holdings_cache" | null;
2806
+ verified_at: string | null;
2807
+ verified: number;
2808
+ unverified: number;
2809
+ held: number;
2810
+ partially_reduced: number;
2811
+ transferred_or_disposed: number;
2812
+ external_inflow: number;
2813
+ note: string;
2685
2814
  }
2686
2815
  export interface WalletPnlResponse {
2687
2816
  address: string;
@@ -2698,8 +2827,14 @@ export interface WalletPnlResponse {
2698
2827
  trades_through_same_second?: number;
2699
2828
  partial?: true;
2700
2829
  analyzed_trades?: number;
2701
- partial_reason?: string;
2830
+ partial_reason?: string; /** 2026-10 (COV-21) — tokens with sells beyond in-window buys; excluded from realized PnL. */
2831
+ sells_without_cost_basis?: {
2832
+ tokens: number;
2833
+ cost_basis: "unknown";
2834
+ };
2702
2835
  };
2836
+ /** 2026-10 (COV-21) — proven-holding check summary. Absent on older responses. */
2837
+ holding_check?: WalletHoldingCheck;
2703
2838
  cache_hit?: boolean;
2704
2839
  computed_at?: string;
2705
2840
  ttl_seconds?: number;
@@ -2713,6 +2848,8 @@ export interface WalletPnlResponse {
2713
2848
  export interface WalletPositionsResponse {
2714
2849
  address: string;
2715
2850
  positions: WalletOpenPosition[];
2851
+ /** 2026-10 (COV-21) — proven-holding check summary. Absent on older responses. */
2852
+ holding_check?: WalletHoldingCheck;
2716
2853
  cache_hit?: boolean;
2717
2854
  computed_at?: string | null;
2718
2855
  ttl_seconds?: number | null;
@@ -3032,18 +3169,24 @@ export interface TokenDepthParams {
3032
3169
  export interface TokenDepthQuote {
3033
3170
  /** The requested buy size, in SOL. */
3034
3171
  size_sol: number;
3035
- /** Tokens received for that buy (UI units, fee-adjusted). */
3036
- tokens_out: number;
3172
+ /**
3173
+ * Concentrated depth models only (server flag): "filled" | "pool_liquidity_exhausted"
3174
+ * (partial fill reported) | "exceeds_loaded_bins" | "price_out_of_range" (numbers null).
3175
+ */
3176
+ status?: "filled" | "pool_liquidity_exhausted" | "exceeds_loaded_bins" | "exceeds_loaded_ticks" | "price_out_of_range";
3177
+ /** Tokens received for that buy (UI units, fee-adjusted). null only on a concentrated pool whose status is not quotable. */
3178
+ tokens_out: number | null;
3037
3179
  /** Average execution price in SOL per token. */
3038
- avg_price_sol: number;
3180
+ avg_price_sol: number | null;
3039
3181
  /** Post-trade spot-price move, % (rounded to 2 decimals). */
3040
- price_impact_pct: number;
3182
+ price_impact_pct: number | null;
3041
3183
  }
3042
3184
  /** SOL required to move the pool's spot price by 1% / 5% / 10%. */
3043
3185
  export interface TokenDepthToMovePrice {
3044
- "1pct": number;
3045
- "5pct": number;
3046
- "10pct": number;
3186
+ /** null on a concentrated pool when the loaded window does not reach that price. */
3187
+ "1pct": number | null;
3188
+ "5pct": number | null;
3189
+ "10pct": number | null;
3047
3190
  }
3048
3191
  /** Fields shared by supported and unsupported depth pools. */
3049
3192
  export interface TokenDepthPoolBase {
@@ -3062,9 +3205,28 @@ export interface TokenDepthPoolBase {
3062
3205
  * `reserves_age_ms` since the last swap). */
3063
3206
  export interface TokenDepthPool extends TokenDepthPoolBase {
3064
3207
  depth_available: true;
3208
+ /** "constant_product" | "curve" | "concentrated" (the last only with a concentrated depth model enabled). */
3065
3209
  model: string;
3210
+ /** Concentrated pools only: the program-exact model that produced the numbers. */
3211
+ model_detail?: "meteora_dlmm_bins" | "raydium_clmm_ticks" | "meteora_damm_v2_full_range";
3212
+ /** Meteora DAMM v2 only: the proven Pool account (pool_address is the vault). */
3213
+ pool_account?: string;
3066
3214
  /** Swap fee, % (e.g. 0.25). */
3067
3215
  fee_pct: number;
3216
+ /** "observed_event" (PumpSwap virtual-reserve model) | "dynamic_fee_at_quote_time" (Meteora DLMM base + variable fee). Absent = static venue fee. */
3217
+ fee_basis?: "observed_event" | "dynamic_fee_at_quote_time" | "amm_config_at_quote_time";
3218
+ /** Meteora DLMM only: the loaded bin range and its slot; quotes never walk outside it. */
3219
+ bins_window?: {
3220
+ from_bin: number;
3221
+ to_bin: number;
3222
+ slot: number;
3223
+ };
3224
+ /** Raydium CLMM only: the loaded tick range [from_tick, to_tick) in the buy direction and its slot. */
3225
+ ticks_window?: {
3226
+ from_tick: number;
3227
+ to_tick: number;
3228
+ slot: number;
3229
+ };
3068
3230
  source: "stream" | "live_rpc";
3069
3231
  /** Age of the reserves snapshot (0 for live_rpc). */
3070
3232
  reserves_age_ms: number;
@@ -3108,6 +3270,13 @@ export interface TokenDepthResponse {
3108
3270
  evaluated: number;
3109
3271
  truncated: boolean;
3110
3272
  };
3273
+ /** Only with a concentrated depth model enabled: largest known pool vs the reported pool; routing is single-pool only. */
3274
+ pool_selection?: {
3275
+ largest_known_pool: string;
3276
+ largest_known_pool_supported: boolean;
3277
+ primary_pool: string | null;
3278
+ routing: "single_pool_only";
3279
+ };
3111
3280
  }
3112
3281
  /** Wallet-intelligence labels on a holder. Empty = unknown to us, NOT verified clean. */
3113
3282
  export type TokenHolderLabel = "deployer" | "kol" | "early_buyer" | "buyer" | "bundle" | "bot" | "dump_cluster";
@@ -3228,7 +3397,10 @@ export interface TokenHoldersResponse {
3228
3397
  };
3229
3398
  }
3230
3399
  /** Locker program a contract lives under. LP locks are NOT covered (token / vesting locks only). */
3231
- export type TokenLockProgram = "streamflow" | "jupiter_lock" | "bonfida_vesting";
3400
+ /** smithii_vesting / sablier_lockup are served only while listed in the response's meta.programs (verified admission). */
3401
+ export type TokenLockProgram = "streamflow" | "jupiter_lock" | "bonfida_vesting" | "smithii_vesting" | "sablier_lockup";
3402
+ /** sablier_lockup only: `current` = recipient proven by the latest read; anything else = recipient null (unknown / burned). */
3403
+ export type TokenLockHolderStatus = "current" | "lost_proof" | "never_proven" | "burned" | "anomaly";
3232
3404
  /** `lock` = whole amount released at one date; `vesting` = cliff and/or periodic release. */
3233
3405
  export type TokenLockKind = "lock" | "vesting";
3234
3406
  /** Contract status, derived at request time from the on-chain schedule + withdrawn/cancelled state. */
@@ -3297,7 +3469,14 @@ export interface TokenLock {
3297
3469
  mint: string;
3298
3470
  /** Creator / locker. Bonfida has none on-chain. */
3299
3471
  sender: string | null;
3472
+ /** sablier_lockup: the CURRENT proven stream-NFT holder only, null otherwise (see holder_status). smithii_vesting: null for merkle receivers. */
3300
3473
  recipient: string | null;
3474
+ /** sablier_lockup only (null for other programs). */
3475
+ holder_status: TokenLockHolderStatus | null;
3476
+ /** sablier_lockup only: last holder a read proved — provenance, NOT the recipient unless holder_status is current. */
3477
+ last_proven_holder: string | null;
3478
+ /** sablier_lockup only: slot of the read that last proved last_proven_holder. */
3479
+ holder_proven_at_slot: number | null;
3301
3480
  name: string | null;
3302
3481
  /** Deposited amount. */
3303
3482
  amount_raw: string;
@@ -3314,11 +3493,13 @@ export interface TokenLock {
3314
3493
  locked_pct_of_supply: number | null;
3315
3494
  unlocked_raw: string;
3316
3495
  unlocked: number | null;
3317
- /** Claimed so far, read from the contract's own state (Solana tracks withdrawals). */
3318
- withdrawn_raw: string;
3496
+ /** Claimed so far, read from the contract's own state; null when the program does not expose it (withdrawn_tracked false: smithii_vesting). */
3497
+ withdrawn_raw: string | null;
3319
3498
  withdrawn: number | null;
3320
- /** Unlocked but not yet withdrawn. */
3321
- claimable_raw: string;
3499
+ /** false = withdrawn / claimable are unknown (null), not zero. */
3500
+ withdrawn_tracked: boolean;
3501
+ /** Unlocked but not yet withdrawn; null when withdrawn is not tracked. */
3502
+ claimable_raw: string | null;
3322
3503
  claimable: number | null;
3323
3504
  start_at: string | null;
3324
3505
  cliff_at: string | null;
@@ -4556,11 +4737,20 @@ export interface DeployerActivityFamilyCoverage {
4556
4737
  boundary_known: boolean;
4557
4738
  /** Set when the family was not queried because it cannot apply (a wallet with no attributed launch has no dev trades). */
4558
4739
  skipped_reason?: "no_attributed_launch";
4740
+ /** dev_trades only, only while archive reads are enabled and the window reaches below the online boundary. */
4741
+ archive?: {
4742
+ read: "ok" | "not_needed" | "failed";
4743
+ served: boolean;
4744
+ reason: DeployerActivityArchiveReason | null;
4745
+ missing_months: string[];
4746
+ months_read: string[];
4747
+ };
4559
4748
  }
4560
4749
  export interface DeployerActivityRange {
4561
4750
  from: string | null;
4562
4751
  to: string | null;
4563
4752
  }
4753
+ export type DeployerActivityArchiveReason = "archive_unavailable" | "archive_timeout" | "archive_contract_mismatch" | "archive_ledger_unavailable" | "archive_months_missing";
4564
4754
  /** Requested vs online vs archive-only history (archive reads are a planned follow-up). */
4565
4755
  export interface DeployerActivityHistoryPlan {
4566
4756
  requested: DeployerActivityRange & {
@@ -4575,7 +4765,8 @@ export interface DeployerActivityHistoryPlan {
4575
4765
  };
4576
4766
  archive_only: (DeployerActivityRange & {
4577
4767
  served: boolean;
4578
- reason: "archive_reads_not_enabled";
4768
+ reason: "archive_reads_not_enabled" | DeployerActivityArchiveReason | null;
4769
+ missing_months?: string[];
4579
4770
  }) | null;
4580
4771
  }
4581
4772
  /**
@@ -4616,12 +4807,66 @@ export interface DeployerActivityResponse {
4616
4807
  future_events_dropped: number;
4617
4808
  note: string;
4618
4809
  };
4619
- /** ULTRA/BUSINESS only, absent on PRO. Currently always not_available. */
4620
- identity?: {
4621
- status: "not_available";
4622
- reason: "identity_stitching_not_released";
4623
- note: string;
4810
+ /**
4811
+ * ULTRA/BUSINESS only, absent on PRO. Currently always not_available with
4812
+ * reason identity_stitching_not_released. When released: read from the
4813
+ * offline identity graph, `not_available` with another reason whenever the
4814
+ * graph is stale or fails a consistency check. Never means "operates alone".
4815
+ */
4816
+ identity?: DeployerActivityIdentityUnavailable | DeployerActivityIdentity;
4817
+ }
4818
+ export interface DeployerActivityIdentityUnavailable {
4819
+ status: "not_available";
4820
+ reason: "identity_stitching_not_released" | "builder_never_ran" | "builder_stale" | "builder_rule_mismatch" | "builder_gate_failed" | "identity_not_active" | "identity_inconsistent" | "evidence_missing" | "member_excluded" | "identity_lookup_failed";
4821
+ note: string;
4822
+ }
4823
+ export interface DeployerActivityIdentityMember {
4824
+ wallet: string;
4825
+ role: string;
4826
+ confidence: "confirmed" | "strong" | "probable";
4827
+ path_len: number;
4828
+ best_evidence_class: string | null;
4829
+ evidence_count: number;
4830
+ is_anchor: boolean;
4831
+ }
4832
+ export interface DeployerActivityIdentity {
4833
+ status: "linked" | "no_strong_evidence";
4834
+ scope: "builder_one_hop";
4835
+ rule_version: string;
4836
+ identity_id: string | null;
4837
+ /** members + 1 (the asked wallet). */
4838
+ wallet_count: number;
4839
+ anchor: string | null;
4840
+ self: Omit<DeployerActivityIdentityMember, "wallet"> | null;
4841
+ members: DeployerActivityIdentityMember[];
4842
+ related: Array<{
4843
+ wallet: string;
4844
+ evidence_class: string;
4845
+ strength: "context";
4846
+ basis: string;
4847
+ }>;
4848
+ evidence: Array<{
4849
+ wallet_a: string;
4850
+ wallet_b: string;
4851
+ evidence_class: string;
4852
+ direction: "a_to_b" | "symmetric";
4853
+ observed_at: string;
4854
+ time_basis: "chain" | "ingest" | "chain_or_ingest";
4855
+ tx_ids: string[];
4856
+ token_mint: string | null;
4857
+ strength: "confirmed" | "strong" | "probable" | "context";
4858
+ basis: string;
4859
+ rule_version: string;
4860
+ }>;
4861
+ builder: {
4862
+ run_id: number;
4863
+ built_at: string;
4864
+ age_seconds: number;
4865
+ stale_after_seconds: number;
4866
+ hub_floor: number | null;
4624
4867
  };
4868
+ disclaimer: string;
4869
+ coverage_note: string;
4625
4870
  }
4626
4871
  export interface DeployerActivityParams {
4627
4872
  /** Clamped server-side to 100 (PRO, ULTRA) or 500 (BUSINESS). */