{"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../../src/utils/metrics/types.ts"],"names":[],"mappings":"","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport type { CaipAssetType, CaipChainId } from '@metamask/utils';\n\nimport type {\n  FeatureId,\n  InputPrimaryDenomination,\n  SortOrder,\n  StatusTypes,\n} from '../../types';\nimport type {\n  UnifiedSwapBridgeEventName,\n  MetaMetricsSwapsEventSource,\n  MetricsActionType,\n  MetricsSwapType,\n  PollingStatus,\n} from './constants';\n\n/**\n * These properties map to properties required by the segment-schema. For example: https://github.com/Consensys/segment-schema/blob/main/libraries/properties/cross-chain-swaps-action.yaml\n */\nexport type RequestParams = {\n  chain_id_source: CaipChainId;\n  chain_id_destination: CaipChainId | null;\n  token_symbol_source: string;\n  token_symbol_destination: string | null;\n  token_address_source: CaipAssetType;\n  token_address_destination: CaipAssetType | null;\n  /**\n   * Client-supplied security classification for the destination token\n   * (e.g. from token security/scanning data). Stored on the controller\n   * and merged into every analytics event that includes\n   * `token_address_destination`. Pass `null` when no security data is\n   * available for the selected destination token.\n   */\n  token_security_type_destination: string | null;\n};\n\nexport type AccountHardwareType =\n  | 'Ledger'\n  | 'Trezor'\n  | 'QR Hardware'\n  | 'Lattice'\n  | null;\n\nexport type RequestMetadata = {\n  slippage_limit?: number; // undefined === auto\n  custom_slippage: boolean;\n  usd_amount_source: number; // Use quoteResponse when available\n  stx_enabled: boolean;\n  is_hardware_wallet: boolean;\n  account_hardware_type: AccountHardwareType;\n  swap_type: MetricsSwapType;\n  security_warnings: string[];\n};\n\nexport type QuoteFetchData = {\n  can_submit: boolean;\n  best_quote_provider?: `${string}_${string}`;\n  quotes_count: number;\n  quotes_list: `${string}_${string}`[];\n  initial_load_time_all_quotes: number;\n  price_impact: number;\n  has_gas_included_quote: boolean;\n};\n\nexport type TradeData = {\n  usd_quoted_gas: number;\n  gas_included: boolean;\n  gas_included_7702: boolean;\n  quoted_time_minutes: number;\n  usd_quoted_return: number;\n  provider: `${string}_${string}`;\n};\n\nexport type TxStatusData = {\n  allowance_reset_transaction?: StatusTypes;\n  approval_transaction?: StatusTypes;\n  source_transaction?: StatusTypes;\n  destination_transaction?: StatusTypes;\n};\n\nexport type InputPrimaryDenominationData = {\n  input_primary_denomination?: InputPrimaryDenomination;\n};\n\nexport type InputKeys =\n  | 'token_source'\n  | 'token_destination'\n  | 'chain_source'\n  | 'chain_destination'\n  | 'slippage'\n  | 'token_amount_source';\n\nexport type InputValues = {\n  token_source: CaipAssetType;\n  token_destination: CaipAssetType;\n  chain_source: CaipChainId;\n  chain_destination: CaipChainId;\n  slippage: number;\n  token_amount_source: string;\n};\n\nexport type QuoteWarning =\n  | 'low_return'\n  | 'no_quotes'\n  | 'insufficient_gas_balance'\n  | 'insufficient_gas_for_selected_quote'\n  | 'insufficient_balance'\n  | 'market_closed'\n  | 'price_impact'\n  | 'quote_expired'\n  | 'tx_alert';\n\n/**\n * Properties that are required to be provided when trackUnifiedSwapBridgeEvent is called.\n * This is the base type without the `location` property which is added to all events\n * via the RequiredEventContextFromClient mapped type.\n */\ntype RequiredEventContextFromClientBase = {\n  [UnifiedSwapBridgeEventName.ButtonClicked]: Pick<\n    RequestParams,\n    'token_symbol_source' | 'token_symbol_destination'\n  > & { environment_type?: string };\n  // When type is object, the payload can be anything\n  [UnifiedSwapBridgeEventName.PageViewed]: object;\n  [UnifiedSwapBridgeEventName.InputChanged]: {\n    input:\n      | 'token_source'\n      | 'token_destination'\n      | 'chain_source'\n      | 'chain_destination'\n      | 'slippage'\n      | 'token_amount_source';\n    input_value: InputValues[keyof InputValues];\n    input_amount_preset?: string;\n  };\n  [UnifiedSwapBridgeEventName.FiatCryptoToggleClicked]: {\n    token_symbol_source: string;\n    token_symbol_destination: string | null;\n    previous_primary_denomination: InputPrimaryDenomination;\n    new_primary_denomination: InputPrimaryDenomination;\n    chain_id_source?: RequestParams['chain_id_source'];\n    chain_id_destination?: RequestParams['chain_id_destination'];\n    token_address_source?: RequestParams['token_address_source'];\n    token_address_destination?: RequestParams['token_address_destination'];\n    token_security_type_destination?: RequestParams['token_security_type_destination'];\n    swap_type?: RequestMetadata['swap_type'];\n  };\n  [UnifiedSwapBridgeEventName.InputSourceDestinationSwitched]: {\n    token_symbol_source: RequestParams['token_symbol_source'];\n    token_symbol_destination: RequestParams['token_symbol_destination'];\n    token_address_source: RequestParams['token_address_source'];\n    token_address_destination: RequestParams['token_address_destination'];\n    token_security_type_destination: RequestParams['token_security_type_destination'];\n    chain_id_source: RequestParams['chain_id_source'];\n    chain_id_destination: RequestParams['chain_id_destination'];\n  } & Pick<RequestMetadata, 'security_warnings'>;\n  [UnifiedSwapBridgeEventName.QuotesRequested]: Pick<\n    RequestMetadata,\n    'stx_enabled' | 'usd_amount_source'\n  > & {\n    token_symbol_source: RequestParams['token_symbol_source'];\n    token_symbol_destination: RequestParams['token_symbol_destination'];\n    token_security_type_destination: RequestParams['token_security_type_destination'];\n  } & InputPrimaryDenominationData;\n  [UnifiedSwapBridgeEventName.QuotesReceived]: TradeData &\n    Pick<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> &\n    InputPrimaryDenominationData & {\n      warnings: QuoteWarning[];\n      best_quote_provider: QuoteFetchData['best_quote_provider'];\n      price_impact: QuoteFetchData['price_impact'];\n      can_submit: QuoteFetchData['can_submit'];\n      usd_balance_source?: number;\n      has_sufficient_gas_for_quote?: boolean | null;\n    };\n  [UnifiedSwapBridgeEventName.QuotesError]: Pick<\n    RequestMetadata,\n    'stx_enabled'\n  > & {\n    token_symbol_source: RequestParams['token_symbol_source'];\n    token_symbol_destination: RequestParams['token_symbol_destination'];\n  } & Pick<RequestMetadata, 'security_warnings'>;\n  // Emitted by BridgeStatusController\n  [UnifiedSwapBridgeEventName.Submitted]: TradeData &\n    Pick<QuoteFetchData, 'price_impact'> &\n    Omit<RequestMetadata, 'security_warnings'> &\n    Pick<\n      RequestParams,\n      | 'token_symbol_source'\n      | 'token_symbol_destination'\n      | 'token_address_source'\n      | 'token_address_destination'\n      | 'chain_id_source'\n      | 'chain_id_destination'\n      | 'token_security_type_destination'\n    > & {\n      action_type: MetricsActionType;\n      batch_id?: string;\n    } & InputPrimaryDenominationData;\n  [UnifiedSwapBridgeEventName.Completed]: TradeData &\n    Pick<QuoteFetchData, 'price_impact'> &\n    Omit<RequestMetadata, 'security_warnings'> &\n    TxStatusData &\n    RequestParams & {\n      actual_time_minutes: number;\n      usd_actual_return: number;\n      usd_actual_gas: number;\n      quote_vs_execution_ratio: number;\n      quoted_vs_used_gas_ratio: number;\n      action_type: MetricsActionType;\n      batch_id?: string;\n    } & InputPrimaryDenominationData;\n  [UnifiedSwapBridgeEventName.Failed]: (\n    | // Tx failed before confirmation\n      (Pick<\n        RequestMetadata,\n        | 'stx_enabled'\n        | 'usd_amount_source'\n        | 'is_hardware_wallet'\n        | 'account_hardware_type'\n      > &\n        Pick<\n          RequestParams,\n          | 'token_symbol_source'\n          | 'token_symbol_destination'\n          | 'token_address_source'\n          | 'token_address_destination'\n          | 'token_security_type_destination'\n        >)\n    // Tx failed after confirmation\n    | (RequestParams &\n        RequestMetadata &\n        TxStatusData & {\n          actual_time_minutes: number;\n        })\n  ) &\n    TradeData &\n    Pick<QuoteFetchData, 'price_impact'> & {\n      error_message: string;\n      batch_id?: string;\n    };\n  [UnifiedSwapBridgeEventName.PollingStatusUpdated]: {\n    polling_status: PollingStatus;\n    retry_attempts: number;\n  };\n  [UnifiedSwapBridgeEventName.StatusValidationFailed]: {\n    failures: string[];\n    refresh_count: number;\n  } & Partial<RequestParams>;\n  // Emitted by clients\n  [UnifiedSwapBridgeEventName.AllQuotesOpened]: Pick<\n    TradeData,\n    'gas_included'\n  > &\n    Pick<QuoteFetchData, 'price_impact'> &\n    Pick<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> & {\n      stx_enabled: RequestMetadata['stx_enabled'];\n      can_submit: QuoteFetchData['can_submit'];\n    };\n  [UnifiedSwapBridgeEventName.AllQuotesSorted]: Pick<\n    TradeData,\n    'gas_included'\n  > &\n    Pick<QuoteFetchData, 'price_impact'> &\n    Pick<RequestParams, 'token_symbol_source' | 'token_symbol_destination'> & {\n      stx_enabled: RequestMetadata['stx_enabled'];\n      sort_order: SortOrder;\n      best_quote_provider: QuoteFetchData['best_quote_provider'];\n      can_submit: QuoteFetchData['can_submit'];\n    };\n  [UnifiedSwapBridgeEventName.QuoteSelected]: TradeData & {\n    is_best_quote: boolean;\n    best_quote_provider: QuoteFetchData['best_quote_provider'];\n    price_impact: QuoteFetchData['price_impact'];\n    can_submit: QuoteFetchData['can_submit'];\n  };\n  [UnifiedSwapBridgeEventName.AssetDetailTooltipClicked]: {\n    token_name: string;\n    token_symbol: string;\n    token_contract: string;\n    chain_name: string;\n    chain_id: string;\n  };\n  [UnifiedSwapBridgeEventName.QuotesValidationFailed]: {\n    failures: string[];\n  };\n  [UnifiedSwapBridgeEventName.AssetPickerOpened]: {\n    asset_location: 'source' | 'destination';\n  };\n};\n\n/**\n * Properties that are required to be provided when trackUnifiedSwapBridgeEvent is called.\n * This combines the event-specific properties from RequiredEventContextFromClientBase\n * with an optional `location` property. When `location` is omitted, the controller\n * falls back to the value stored via `setLocation()` (defaults to Unknown).\n *\n * `ab_tests` is the legacy field and `active_ab_tests` is the newer field.\n * Both are kept for a migration window and are treated as separate payloads.\n */\nexport type RequiredEventContextFromClient = {\n  [K in keyof RequiredEventContextFromClientBase]: RequiredEventContextFromClientBase[K] & {\n    location?: MetaMetricsSwapsEventSource;\n    ab_tests?: Record<string, string>;\n    active_ab_tests?: { key: string; value: string }[];\n    feature_id: FeatureId;\n  };\n};\n\n/**\n * Properties that can be derived from the bridge controller state\n */\nexport type EventPropertiesFromControllerState = {\n  [UnifiedSwapBridgeEventName.ButtonClicked]: RequestParams;\n  [UnifiedSwapBridgeEventName.PageViewed]: RequestParams &\n    Omit<\n      RequestMetadata,\n      'stx_enabled' | 'usd_amount_source' | 'security_warnings'\n    > &\n    InputPrimaryDenominationData;\n  [UnifiedSwapBridgeEventName.InputChanged]: {\n    input: InputKeys;\n    input_value: string;\n  };\n  [UnifiedSwapBridgeEventName.FiatCryptoToggleClicked]: RequestParams &\n    Pick<RequestMetadata, 'swap_type'>;\n  [UnifiedSwapBridgeEventName.InputSourceDestinationSwitched]: RequestParams;\n  [UnifiedSwapBridgeEventName.QuotesRequested]: RequestParams &\n    RequestMetadata & {\n      has_sufficient_funds: boolean;\n    } & InputPrimaryDenominationData;\n  [UnifiedSwapBridgeEventName.QuotesReceived]: RequestParams &\n    RequestMetadata &\n    QuoteFetchData &\n    TradeData & {\n      refresh_count: number; // starts from 0\n    } & InputPrimaryDenominationData;\n  [UnifiedSwapBridgeEventName.QuotesError]: RequestParams &\n    RequestMetadata & {\n      has_sufficient_funds: boolean;\n      error_message: string;\n    };\n  [UnifiedSwapBridgeEventName.Submitted]: null;\n  [UnifiedSwapBridgeEventName.Completed]: null;\n  [UnifiedSwapBridgeEventName.Failed]: RequestParams &\n    RequestMetadata &\n    TxStatusData &\n    TradeData &\n    Pick<QuoteFetchData, 'price_impact'> & {\n      actual_time_minutes: number;\n    };\n  [UnifiedSwapBridgeEventName.AllQuotesOpened]: RequestParams &\n    RequestMetadata &\n    TradeData &\n    QuoteFetchData;\n  [UnifiedSwapBridgeEventName.AllQuotesSorted]: RequestParams &\n    RequestMetadata &\n    TradeData &\n    QuoteFetchData;\n  [UnifiedSwapBridgeEventName.QuoteSelected]: RequestParams &\n    RequestMetadata &\n    QuoteFetchData &\n    TradeData;\n  [UnifiedSwapBridgeEventName.AssetDetailTooltipClicked]: null;\n  [UnifiedSwapBridgeEventName.QuotesValidationFailed]: RequestParams & {\n    refresh_count: number;\n  };\n  [UnifiedSwapBridgeEventName.StatusValidationFailed]: RequestParams;\n  [UnifiedSwapBridgeEventName.AssetPickerOpened]: null;\n  [UnifiedSwapBridgeEventName.PollingStatusUpdated]: TradeData &\n    Pick<QuoteFetchData, 'price_impact'> &\n    Omit<RequestMetadata, 'security_warnings'> &\n    Pick<\n      RequestParams,\n      | 'token_symbol_source'\n      | 'token_symbol_destination'\n      | 'chain_id_source'\n      | 'chain_id_destination'\n    > & {\n      batch_id?: string;\n    };\n};\n\n/**\n * trackUnifiedSwapBridgeEvent payload properties consist of required properties from the client\n * and properties from the bridge controller\n *\n * `ab_tests` will be deprecated in favor of `active_ab_tests` in the future.\n * `ab_tests` and `active_ab_tests` intentionally coexist during migration.\n */\nexport type CrossChainSwapsEventProperties<\n  T extends UnifiedSwapBridgeEventName,\n> =\n  | {\n      feature_id: FeatureId;\n      action_type: MetricsActionType;\n      location: MetaMetricsSwapsEventSource;\n      ab_tests?: Record<string, string>;\n      active_ab_tests?: { key: string; value: string }[];\n    }\n  | Pick<EventPropertiesFromControllerState, T>[T]\n  | Pick<RequiredEventContextFromClient, T>[T];\n"]}