@metamask-previews/perps-controller 20.0.0-preview-4fa35a45a → 20.0.0-preview-92e2f53
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/CHANGELOG.md +9 -0
- package/dist/constants/eventNames.d.ts +2 -0
- package/dist/constants/eventNames.d.ts.map +1 -1
- package/dist/constants/eventNames.js +1 -0
- package/dist/constants/eventNames.js.map +1 -1
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/perpsErrorCodes.d.ts +8 -0
- package/dist/perpsErrorCodes.d.ts.map +1 -1
- package/dist/perpsErrorCodes.js +11 -0
- package/dist/perpsErrorCodes.js.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.ts.map +1 -1
- package/dist/providers/HyperLiquidProvider.js +11 -2
- package/dist/providers/HyperLiquidProvider.js.map +1 -1
- package/dist/selectors.d.ts.map +1 -1
- package/dist/selectors.js.map +1 -1
- package/dist/services/TradingService.d.ts.map +1 -1
- package/dist/services/TradingService.js +52 -21
- package/dist/services/TradingService.js.map +1 -1
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/hyperLiquidValidation.d.ts +2 -1
- package/dist/utils/hyperLiquidValidation.d.ts.map +1 -1
- package/dist/utils/hyperLiquidValidation.js +14 -1
- package/dist/utils/hyperLiquidValidation.js.map +1 -1
- package/dist/utils/orderCalculations.d.ts.map +1 -1
- package/dist/utils/orderCalculations.js +18 -7
- package/dist/utils/orderCalculations.js.map +1 -1
- package/package.json +3 -3
package/dist/selectors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,YAAY,EAKb,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,oBAAoB,EACpB,SAAS,EACT,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,yBAAyB,EACzB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,UACzB,oBAAoB,GAAG,SAAS,KACtC,OAKF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,UAC7B,oBAAoB,KAC1B,OAKF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,UAC1B,oBAAoB,KAC1B,MAAM,EAKR,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,UAC3B,oBAAoB,UACnB,MAAM,KACb,OAGF,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,UAC/B,oBAAoB,KAC1B,MAAM,EASR,CAAC;AAEF;;;;;;;;;GASG;AAEH,eAAO,MAAM,wBAAwB;eAUM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAN,MAAM;;2BARrC,oBAAoB,KAAG,OAAO,GAAG,SAAS,UAEzC,oBAAoB,SACpB,MAAM,KACZ,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,SAAS,WAEjD,oBAAoB,QAAQ,MAAM,KAAG,MAAM;;;;;;;;CAYvD,CAAC;AAEF;;GAEG;AACH,KAAK,yBAAyB,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,oBAAoB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACzD,CAAC;AA4CF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,UACnC,oBAAoB,QACrB,MAAM,KACX,yBAAyB,GAAG,SAe9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,UACjC,oBAAoB,KAC1B;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,aAAa,CAAA;CAmCpD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,UAC9B,oBAAoB,KAC1B,oBAGD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,UAC9B,oBAAoB,KAC1B,oBAGD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,UAC3B,oBAAoB,KAC1B,SAAoE,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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"}
|
package/dist/selectors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSelector } from 'reselect';\n\nimport { VISIBLE_CANDLE_COUNT_CONFIG } from './constants/chartConfig.js';\nimport {\n MARKET_SORTING_CONFIG,\n PERPS_CONSTANTS,\n SortOptionId,\n DEFAULT_ORDER_BOOK_PREFERENCES,\n DEFAULT_PRO_LAYOUT_PREFERENCES,\n DEFAULT_PERPS_MODE,\n DEFAULT_SELECTED_ORDER_TYPE,\n} from './constants/perpsConfig.js';\nimport type {\n OrderBookPreferences,\n PerpsMode,\n ProLayoutPreferences,\n} from './constants/perpsConfig.js';\nimport type { PerpsControllerState } from './PerpsController.js';\nimport type {\n MarginMode,\n OrderDirection,\n OrderType,\n PerpsSelectedPaymentToken,\n SortDirection,\n} from './types/index.js';\n\n/**\n * Select whether the user is a first-time perps user\n *\n * @param state - PerpsController state\n * @returns true if user is first-time, false otherwise\n */\nexport const selectIsFirstTimeUser = (\n state: PerpsControllerState | undefined,\n): boolean => {\n if (state?.isTestnet) {\n return state?.isFirstTimeUser?.testnet ?? true;\n }\n return state?.isFirstTimeUser?.mainnet ?? true;\n};\n\n/**\n * Select whether user has ever placed their first successful order\n *\n * @param state - PerpsController state\n * @returns boolean indicating if first order was placed\n */\nexport const selectHasPlacedFirstOrder = (\n state: PerpsControllerState,\n): boolean => {\n if (state?.isTestnet) {\n return state?.hasPlacedFirstOrder?.testnet ?? false;\n }\n return state?.hasPlacedFirstOrder?.mainnet ?? false;\n};\n\n/**\n * Select watchlist markets for the current network\n *\n * @param state - PerpsController state\n * @returns Array of watchlist market symbols for current network\n */\nexport const selectWatchlistMarkets = (\n state: PerpsControllerState,\n): string[] => {\n if (state?.isTestnet) {\n return state?.watchlistMarkets?.testnet ?? [];\n }\n return state?.watchlistMarkets?.mainnet ?? [];\n};\n\n/**\n * Check if a specific market is in the watchlist on the current network\n *\n * @param state - PerpsController state\n * @param symbol - Market symbol to check (e.g., 'BTC', 'ETH')\n * @returns boolean indicating if market is in watchlist\n */\nexport const selectIsWatchlistMarket = (\n state: PerpsControllerState,\n symbol: string,\n): boolean => {\n const watchlist = selectWatchlistMarkets(state);\n return watchlist.includes(symbol);\n};\n\n/**\n * Select recently viewed markets for the current network.\n *\n * Returns up to PERPS_CONSTANTS.RecentlyViewedMarketsLimit symbols, ordered\n * newest-first, filtered to entries within PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs\n * (24 hours). Returns an empty array when no qualifying entries exist.\n *\n * @param state - PerpsController state\n * @returns Ordered array of recently viewed market symbols\n */\nexport const selectRecentlyViewedMarkets = (\n state: PerpsControllerState,\n): string[] => {\n const network = state?.isTestnet ? 'testnet' : 'mainnet';\n const entries = state?.recentlyViewedMarkets?.[network] ?? [];\n const cutoff = Date.now() - PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs;\n\n return entries\n .filter((entry) => entry.viewedAt > cutoff)\n .map((entry) => entry.symbol)\n .slice(0, PERPS_CONSTANTS.RecentlyViewedMarketsLimit);\n};\n\n/**\n * Select trade configuration for a specific market on the current network.\n * Uses memoization to return stable object references and prevent unnecessary re-renders.\n *\n * Usage: selectTradeConfiguration(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The trade configuration for the specified market, or undefined.\n */\n\nexport const selectTradeConfiguration = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (isTestnet, configs, coin): { leverage?: number } | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n const config = configs?.[network]?.[coin];\n\n if (!config?.leverage) {\n return undefined;\n }\n\n return { leverage: config.leverage };\n },\n);\n\n/**\n * Pending trade configuration as returned to consumers (timestamp stripped).\n */\ntype PendingTradeConfiguration = {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n reduceOnly?: boolean;\n direction?: OrderDirection;\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n};\n\n/**\n * Memoized extractor for the raw pending trade configuration of a market.\n *\n * Keyed on `isTestnet`, `tradeConfigurations`, and `coin` so it yields a stable\n * object reference (both the stripped `config` and its `timestamp`) while those\n * inputs are unchanged. The TTL is deliberately NOT evaluated here: because the\n * result is memoized, evaluating expiry inside this selector would freeze the\n * `Date.now()` check between input changes. Expiry is applied per-call by\n * `selectPendingTradeConfiguration` instead.\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The stripped config and its save timestamp, or undefined.\n */\n\nconst selectRawPendingTradeConfiguration = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (\n isTestnet,\n configs,\n coin,\n ): { timestamp: number; config: PendingTradeConfiguration } | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n const config = configs?.[network]?.[coin]?.pendingConfig;\n\n if (!config) {\n return undefined;\n }\n\n const { timestamp, ...configWithoutTimestamp } = config;\n return { timestamp, config: configWithoutTimestamp };\n },\n);\n\n/**\n * Select pending trade configuration for a specific market on the current network.\n * Returns undefined if config doesn't exist or has expired.\n *\n * The underlying data extraction is memoized for stable object references, but\n * the TTL is checked on every call (using `Date.now()`) so expiry stays accurate\n * even when the memoized inputs have not changed. This mirrors\n * `PerpsController.getPendingTradeConfiguration`, which also evaluates time on\n * every call.\n *\n * Usage: selectPendingTradeConfiguration(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The pending trade configuration, or undefined if expired or not found.\n */\nexport const selectPendingTradeConfiguration = (\n state: PerpsControllerState,\n coin: string,\n): PendingTradeConfiguration | undefined => {\n const raw = selectRawPendingTradeConfiguration(state, coin);\n\n if (!raw) {\n return undefined;\n }\n\n const age = Date.now() - raw.timestamp;\n\n if (age > PERPS_CONSTANTS.PendingTradeConfigurationTtlMs) {\n // Config expired, return undefined\n return undefined;\n }\n\n return raw.config;\n};\n\n/**\n * Select market filter preferences (network-independent)\n *\n * @param state - PerpsController state\n * @returns Sort/filter preferences object with optionId and direction\n */\nexport const selectMarketFilterPreferences = (\n state: PerpsControllerState,\n): { optionId: SortOptionId; direction: SortDirection } => {\n const pref = state?.marketFilterPreferences;\n\n // Handle legacy string format (backward compatibility)\n if (typeof pref === 'string') {\n // Map legacy compound IDs to new format\n // Old format: 'priceChange-desc' or 'priceChange-asc'\n // New format: { optionId: 'priceChange', direction: 'desc'/'asc' }\n if (pref === 'priceChange-desc') {\n return {\n optionId: 'priceChange',\n direction: 'desc',\n };\n }\n if (pref === 'priceChange-asc') {\n return {\n optionId: 'priceChange',\n direction: 'asc',\n };\n }\n\n // Handle other simple legacy strings (e.g., 'volume', 'openInterest', etc.)\n return {\n optionId: pref,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n };\n }\n\n // Return new object format or default\n return (\n pref ?? {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n }\n );\n};\n\n/**\n * Select pro-mode layout preferences (network-independent).\n *\n * Merges over defaults so callers always receive a fully-populated object,\n * even when the state slice (or a nested field) is missing.\n *\n * @param state - PerpsController state\n * @returns The pro-mode layout preferences object\n */\nexport const selectProLayoutPreferences = (\n state: PerpsControllerState,\n): ProLayoutPreferences => ({\n ...DEFAULT_PRO_LAYOUT_PREFERENCES,\n ...state?.proLayoutPreferences,\n});\n\n/**\n * Select market-agnostic Pro order-book display preferences.\n *\n * @param state - PerpsController state\n * @returns The order-book display preferences\n */\nexport const selectOrderBookPreferences = (\n state: PerpsControllerState,\n): OrderBookPreferences => ({\n ...DEFAULT_ORDER_BOOK_PREFERENCES,\n ...state?.orderBookPreferences,\n});\n\n/**\n * Select the market-agnostic order type.\n *\n * @param state - PerpsController state\n * @returns The selected order type\n */\nexport const selectSelectedOrderType = (\n state: PerpsControllerState,\n): OrderType => state?.selectedOrderType ?? DEFAULT_SELECTED_ORDER_TYPE;\n\n/**\n * Select the visible candle count shared by Lite and Pro.\n *\n * @param state - PerpsController state\n * @returns The visible candle count\n */\nexport const selectVisibleCandleCount = (state: PerpsControllerState): number =>\n Number.isFinite(state?.visibleCandleCount)\n ? state.visibleCandleCount\n : VISIBLE_CANDLE_COUNT_CONFIG.Default;\n\n/**\n * Select the current Perps interface mode (lite/pro).\n *\n * Falls back to the default mode when the state slice is missing.\n *\n * @param state - PerpsController state\n * @returns The current Perps mode\n */\nexport const selectPerpsMode = (state: PerpsControllerState): PerpsMode =>\n state?.mode ?? DEFAULT_PERPS_MODE;\n\n/**\n * Select order book grouping for a specific market on the current network.\n *\n * Usage: selectOrderBookGrouping(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The order book grouping value, or undefined.\n */\n\nexport const selectOrderBookGrouping = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (isTestnet, configs, coin): number | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n return configs?.[network]?.[coin]?.orderBookGrouping;\n },\n);\n\n/**\n * Select the saved margin mode for a specific market on the current network.\n *\n * Usage: selectMarginMode(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The saved margin mode, or undefined.\n */\nexport const selectMarginMode = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (isTestnet, configs, coin): MarginMode | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n return configs?.[network]?.[coin]?.marginMode;\n },\n);\n"]}
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSelector } from 'reselect';\n\nimport { VISIBLE_CANDLE_COUNT_CONFIG } from './constants/chartConfig.js';\nimport {\n MARKET_SORTING_CONFIG,\n PERPS_CONSTANTS,\n SortOptionId,\n DEFAULT_ORDER_BOOK_PREFERENCES,\n DEFAULT_PRO_LAYOUT_PREFERENCES,\n DEFAULT_PERPS_MODE,\n DEFAULT_SELECTED_ORDER_TYPE,\n} from './constants/perpsConfig.js';\nimport type {\n OrderBookPreferences,\n PerpsMode,\n ProLayoutPreferences,\n} from './constants/perpsConfig.js';\nimport type { PerpsControllerState } from './PerpsController.js';\nimport type {\n MarginMode,\n OrderDirection,\n OrderType,\n PerpsSelectedPaymentToken,\n SortDirection,\n} from './types/index.js';\n\n/**\n * Select whether the user is a first-time perps user\n *\n * @param state - PerpsController state\n * @returns true if user is first-time, false otherwise\n */\nexport const selectIsFirstTimeUser = (\n state: PerpsControllerState | undefined,\n): boolean => {\n if (state?.isTestnet) {\n return state?.isFirstTimeUser?.testnet ?? true;\n }\n return state?.isFirstTimeUser?.mainnet ?? true;\n};\n\n/**\n * Select whether user has ever placed their first successful order\n *\n * @param state - PerpsController state\n * @returns boolean indicating if first order was placed\n */\nexport const selectHasPlacedFirstOrder = (\n state: PerpsControllerState,\n): boolean => {\n if (state?.isTestnet) {\n return state?.hasPlacedFirstOrder?.testnet ?? false;\n }\n return state?.hasPlacedFirstOrder?.mainnet ?? false;\n};\n\n/**\n * Select watchlist markets for the current network\n *\n * @param state - PerpsController state\n * @returns Array of watchlist market symbols for current network\n */\nexport const selectWatchlistMarkets = (\n state: PerpsControllerState,\n): string[] => {\n if (state?.isTestnet) {\n return state?.watchlistMarkets?.testnet ?? [];\n }\n return state?.watchlistMarkets?.mainnet ?? [];\n};\n\n/**\n * Check if a specific market is in the watchlist on the current network\n *\n * @param state - PerpsController state\n * @param symbol - Market symbol to check (e.g., 'BTC', 'ETH')\n * @returns boolean indicating if market is in watchlist\n */\nexport const selectIsWatchlistMarket = (\n state: PerpsControllerState,\n symbol: string,\n): boolean => {\n const watchlist = selectWatchlistMarkets(state);\n return watchlist.includes(symbol);\n};\n\n/**\n * Select recently viewed markets for the current network.\n *\n * Returns up to PERPS_CONSTANTS.RecentlyViewedMarketsLimit symbols, ordered\n * newest-first, filtered to entries within PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs\n * (24 hours). Returns an empty array when no qualifying entries exist.\n *\n * @param state - PerpsController state\n * @returns Ordered array of recently viewed market symbols\n */\nexport const selectRecentlyViewedMarkets = (\n state: PerpsControllerState,\n): string[] => {\n const network = state?.isTestnet ? 'testnet' : 'mainnet';\n const entries = state?.recentlyViewedMarkets?.[network] ?? [];\n const cutoff = Date.now() - PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs;\n\n return entries\n .filter((entry) => entry.viewedAt > cutoff)\n .map((entry) => entry.symbol)\n .slice(0, PERPS_CONSTANTS.RecentlyViewedMarketsLimit);\n};\n\n/**\n * Select trade configuration for a specific market on the current network.\n * Uses memoization to return stable object references and prevent unnecessary re-renders.\n *\n * Usage: selectTradeConfiguration(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The trade configuration for the specified market, or undefined.\n */\n\nexport const selectTradeConfiguration = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (isTestnet, configs, coin): { leverage?: number } | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n const config = configs?.[network]?.[coin];\n\n if (!config?.leverage) {\n return undefined;\n }\n\n return { leverage: config.leverage };\n },\n);\n\n/**\n * Pending trade configuration as returned to consumers (timestamp stripped).\n */\ntype PendingTradeConfiguration = {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n reduceOnly?: boolean;\n direction?: OrderDirection;\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n};\n\n/**\n * Memoized extractor for the raw pending trade configuration of a market.\n *\n * Keyed on `isTestnet`, `tradeConfigurations`, and `coin` so it yields a stable\n * object reference (both the stripped `config` and its `timestamp`) while those\n * inputs are unchanged. The TTL is deliberately NOT evaluated here: because the\n * result is memoized, evaluating expiry inside this selector would freeze the\n * `Date.now()` check between input changes. Expiry is applied per-call by\n * `selectPendingTradeConfiguration` instead.\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The stripped config and its save timestamp, or undefined.\n */\n\nconst selectRawPendingTradeConfiguration = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (\n isTestnet,\n configs,\n coin,\n ): { timestamp: number; config: PendingTradeConfiguration } | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n const config = configs?.[network]?.[coin]?.pendingConfig;\n\n if (!config) {\n return undefined;\n }\n\n const { timestamp, ...configWithoutTimestamp } = config;\n return { timestamp, config: configWithoutTimestamp };\n },\n);\n\n/**\n * Select pending trade configuration for a specific market on the current network.\n * Returns undefined if config doesn't exist or has expired.\n *\n * The underlying data extraction is memoized for stable object references, but\n * the TTL is checked on every call (using `Date.now()`) so expiry stays accurate\n * even when the memoized inputs have not changed. This mirrors\n * `PerpsController.getPendingTradeConfiguration`, which also evaluates time on\n * every call.\n *\n * Usage: selectPendingTradeConfiguration(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The pending trade configuration, or undefined if expired or not found.\n */\nexport const selectPendingTradeConfiguration = (\n state: PerpsControllerState,\n coin: string,\n): PendingTradeConfiguration | undefined => {\n const raw = selectRawPendingTradeConfiguration(state, coin);\n\n if (!raw) {\n return undefined;\n }\n\n const age = Date.now() - raw.timestamp;\n\n if (age > PERPS_CONSTANTS.PendingTradeConfigurationTtlMs) {\n // Config expired, return undefined\n return undefined;\n }\n\n return raw.config;\n};\n\n/**\n * Select market filter preferences (network-independent)\n *\n * @param state - PerpsController state\n * @returns Sort/filter preferences object with optionId and direction\n */\nexport const selectMarketFilterPreferences = (\n state: PerpsControllerState,\n): { optionId: SortOptionId; direction: SortDirection } => {\n const pref = state?.marketFilterPreferences;\n\n // Handle legacy string format (backward compatibility)\n if (typeof pref === 'string') {\n // Map legacy compound IDs to new format\n // Old format: 'priceChange-desc' or 'priceChange-asc'\n // New format: { optionId: 'priceChange', direction: 'desc'/'asc' }\n if (pref === 'priceChange-desc') {\n return {\n optionId: 'priceChange',\n direction: 'desc',\n };\n }\n if (pref === 'priceChange-asc') {\n return {\n optionId: 'priceChange',\n direction: 'asc',\n };\n }\n\n // Handle other simple legacy strings (e.g., 'volume', 'openInterest', etc.)\n return {\n optionId: pref,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n };\n }\n\n // Return new object format or default\n return (\n pref ?? {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n }\n );\n};\n\n/**\n * Select pro-mode layout preferences (network-independent).\n *\n * Merges over defaults so callers always receive a fully-populated object,\n * even when the state slice (or a nested field) is missing.\n *\n * @param state - PerpsController state\n * @returns The pro-mode layout preferences object\n */\nexport const selectProLayoutPreferences = (\n state: PerpsControllerState,\n): ProLayoutPreferences => ({\n ...DEFAULT_PRO_LAYOUT_PREFERENCES,\n ...state?.proLayoutPreferences,\n});\n\n/**\n * Select market-agnostic Pro order-book display preferences.\n *\n * @param state - PerpsController state\n * @returns The order-book display preferences\n */\nexport const selectOrderBookPreferences = (\n state: PerpsControllerState,\n): OrderBookPreferences => ({\n ...DEFAULT_ORDER_BOOK_PREFERENCES,\n ...state?.orderBookPreferences,\n});\n\n/**\n * Select the market-agnostic order type.\n *\n * @param state - PerpsController state\n * @returns The selected order type\n */\nexport const selectSelectedOrderType = (\n state: PerpsControllerState,\n): OrderType => state?.selectedOrderType ?? DEFAULT_SELECTED_ORDER_TYPE;\n\n/**\n * Select the visible candle count shared by Lite and Pro.\n *\n * @param state - PerpsController state\n * @returns The visible candle count\n */\nexport const selectVisibleCandleCount = (\n state: PerpsControllerState,\n): number =>\n Number.isFinite(state?.visibleCandleCount)\n ? state.visibleCandleCount\n : VISIBLE_CANDLE_COUNT_CONFIG.Default;\n\n/**\n * Select the current Perps interface mode (lite/pro).\n *\n * Falls back to the default mode when the state slice is missing.\n *\n * @param state - PerpsController state\n * @returns The current Perps mode\n */\nexport const selectPerpsMode = (state: PerpsControllerState): PerpsMode =>\n state?.mode ?? DEFAULT_PERPS_MODE;\n\n/**\n * Select order book grouping for a specific market on the current network.\n *\n * Usage: selectOrderBookGrouping(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The order book grouping value, or undefined.\n */\n\nexport const selectOrderBookGrouping = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (isTestnet, configs, coin): number | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n return configs?.[network]?.[coin]?.orderBookGrouping;\n },\n);\n\n/**\n * Select the saved margin mode for a specific market on the current network.\n *\n * Usage: selectMarginMode(state, coin)\n *\n * @param state - The perps controller state.\n * @param coin - The market coin symbol.\n * @returns The saved margin mode, or undefined.\n */\nexport const selectMarginMode = createSelector(\n [\n (state: PerpsControllerState): boolean | undefined => state?.isTestnet,\n (\n state: PerpsControllerState,\n _coin: string,\n ): PerpsControllerState['tradeConfigurations'] | undefined =>\n state?.tradeConfigurations,\n (_state: PerpsControllerState, coin: string): string => coin,\n ],\n (isTestnet, configs, coin): MarginMode | undefined => {\n const network = isTestnet ? 'testnet' : 'mainnet';\n return configs?.[network]?.[coin]?.marginMode;\n },\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TradingService.d.ts","sourceRoot":"","sources":["../../src/services/TradingService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TradingService.d.ts","sourceRoot":"","sources":["../../src/services/TradingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { PERPS_EVENT_PROPERTY, PERPS_EVENT_VALUE, } from '../constants/eventName
|
|
|
4
4
|
import { isTPSLOrder } from '../constants/orderTypes.js';
|
|
5
5
|
import { PerpsMeasurementName } from '../constants/performanceMetrics.js';
|
|
6
6
|
import { PERPS_CONSTANTS } from '../constants/perpsConfig.js';
|
|
7
|
+
import { PerpsControllerError } from '../errors.js';
|
|
7
8
|
import { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';
|
|
8
9
|
import { PerpsAnalyticsEvent, PerpsTraceNames, PerpsTraceOperations, } from '../types/index.js';
|
|
9
10
|
import { PERPS_ERROR_ACTION, PERPS_ERROR_OPERATION, createPerpsErrorContext, wasProviderErrorReported, } from '../utils/errorContext.js';
|
|
@@ -127,6 +128,43 @@ export class TradingService {
|
|
|
127
128
|
}
|
|
128
129
|
return properties;
|
|
129
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Build normalized slippage and failure properties without removing the
|
|
133
|
+
* existing raw error message used by current analytics dashboards.
|
|
134
|
+
*
|
|
135
|
+
* @param trackingData - Optional caller-provided slippage context.
|
|
136
|
+
* @param result - Provider result, when available.
|
|
137
|
+
* @param error - Thrown provider error, when available.
|
|
138
|
+
* @returns Slippage and normalized failure properties.
|
|
139
|
+
*/
|
|
140
|
+
#buildSlippageProperties(trackingData, result, error) {
|
|
141
|
+
const properties = {};
|
|
142
|
+
if (trackingData?.maxSlippageBps !== undefined) {
|
|
143
|
+
properties[PERPS_EVENT_PROPERTY.MAX_SLIPPAGE_PCT] =
|
|
144
|
+
trackingData.maxSlippageBps / 100;
|
|
145
|
+
}
|
|
146
|
+
if (trackingData?.maxSlippageSource !== undefined) {
|
|
147
|
+
properties[PERPS_EVENT_PROPERTY.MAX_SLIPPAGE_SOURCE] =
|
|
148
|
+
trackingData.maxSlippageSource;
|
|
149
|
+
}
|
|
150
|
+
if (trackingData?.estimatedSlippageBps !== undefined) {
|
|
151
|
+
properties[PERPS_EVENT_PROPERTY.ESTIMATED_SLIPPAGE_PCT] =
|
|
152
|
+
trackingData.estimatedSlippageBps / 100;
|
|
153
|
+
}
|
|
154
|
+
const errorCode = result?.errorCode ??
|
|
155
|
+
(error instanceof PerpsControllerError ? error.errorCode : undefined);
|
|
156
|
+
const errorDetails = result?.errorDetails ??
|
|
157
|
+
(error instanceof PerpsControllerError ? error.errorDetails : undefined);
|
|
158
|
+
if (errorCode !== undefined) {
|
|
159
|
+
properties[PERPS_EVENT_PROPERTY.FAILURE_REASON] = errorCode;
|
|
160
|
+
}
|
|
161
|
+
if (errorDetails?.code === PERPS_ERROR_CODES.PRICE_MOVED &&
|
|
162
|
+
Number.isFinite(errorDetails.priceDeltaBps)) {
|
|
163
|
+
properties[PERPS_EVENT_PROPERTY.PRICE_DELTA_BPS] =
|
|
164
|
+
errorDetails.priceDeltaBps;
|
|
165
|
+
}
|
|
166
|
+
return properties;
|
|
167
|
+
}
|
|
130
168
|
/**
|
|
131
169
|
* Build properties that identify the submitted order intent.
|
|
132
170
|
*
|
|
@@ -185,6 +223,7 @@ export class TradingService {
|
|
|
185
223
|
? PERPS_EVENT_VALUE.DIRECTION.LONG
|
|
186
224
|
: PERPS_EVENT_VALUE.DIRECTION.SHORT,
|
|
187
225
|
...this.#buildTradeIntentProperties(params),
|
|
226
|
+
...this.#buildSlippageProperties(params.trackingData, result, error),
|
|
188
227
|
[PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),
|
|
189
228
|
[PERPS_EVENT_PROPERTY.ORDER_SIZE]: trackedOrderSize,
|
|
190
229
|
[PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,
|
|
@@ -516,6 +555,7 @@ export class TradingService {
|
|
|
516
555
|
: PERPS_EVENT_VALUE.DIRECTION.SHORT,
|
|
517
556
|
...this.#buildTradeIntentProperties(params),
|
|
518
557
|
[PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),
|
|
558
|
+
...this.#buildSlippageProperties(params.trackingData),
|
|
519
559
|
...this.#buildAttributionProperties(params.trackingData),
|
|
520
560
|
});
|
|
521
561
|
// Observational threshold: when the provider round-trip exceeds
|
|
@@ -734,6 +774,7 @@ export class TradingService {
|
|
|
734
774
|
[PERPS_EVENT_PROPERTY.DIRECTION]: metrics.direction,
|
|
735
775
|
[PERPS_EVENT_PROPERTY.ORDER_TYPE]: metrics.orderType,
|
|
736
776
|
[PERPS_EVENT_PROPERTY.ORDER_SIZE]: metrics.requestedSize,
|
|
777
|
+
[PERPS_EVENT_PROPERTY.CLOSE_TYPE]: metrics.closeType,
|
|
737
778
|
[PERPS_EVENT_PROPERTY.OPEN_POSITION_SIZE]: Math.abs(parseFloat(position.size)),
|
|
738
779
|
[PERPS_EVENT_PROPERTY.PERCENTAGE_CLOSED]: metrics.closePercentage,
|
|
739
780
|
...(position.unrealizedPnl && {
|
|
@@ -779,6 +820,7 @@ export class TradingService {
|
|
|
779
820
|
...(params.trackingData?.vipDiscount !== undefined && {
|
|
780
821
|
[PERPS_EVENT_PROPERTY.VIP_DISCOUNT]: params.trackingData.vipDiscount,
|
|
781
822
|
}),
|
|
823
|
+
...this.#buildSlippageProperties(params.trackingData, result, error instanceof Error ? error : undefined),
|
|
782
824
|
// Effective leverage on close events
|
|
783
825
|
...(effectiveLeverage !== undefined && {
|
|
784
826
|
[PERPS_EVENT_PROPERTY.LEVERAGE]: effectiveLeverage,
|
|
@@ -797,7 +839,6 @@ export class TradingService {
|
|
|
797
839
|
if (status === PERPS_EVENT_VALUE.STATUS.EXECUTED) {
|
|
798
840
|
return {
|
|
799
841
|
...baseProperties,
|
|
800
|
-
[PERPS_EVENT_PROPERTY.CLOSE_TYPE]: metrics.closeType,
|
|
801
842
|
...(orderValue !== undefined && {
|
|
802
843
|
[PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,
|
|
803
844
|
}),
|
|
@@ -806,7 +847,9 @@ export class TradingService {
|
|
|
806
847
|
// Add error for failures
|
|
807
848
|
return {
|
|
808
849
|
...baseProperties,
|
|
809
|
-
...(error && {
|
|
850
|
+
...(error && {
|
|
851
|
+
[PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: error instanceof Error ? error.message : error,
|
|
852
|
+
}),
|
|
810
853
|
...(orderValue !== undefined && {
|
|
811
854
|
[PERPS_EVENT_PROPERTY.ORDER_VALUE]: orderValue,
|
|
812
855
|
}),
|
|
@@ -847,29 +890,16 @@ export class TradingService {
|
|
|
847
890
|
...(errorMessage && {
|
|
848
891
|
[PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,
|
|
849
892
|
}),
|
|
893
|
+
...this.#buildSlippageProperties(params.trackingData, result, error),
|
|
850
894
|
...this.#buildAttributionProperties(params.trackingData),
|
|
851
895
|
...bulkActionProps,
|
|
852
896
|
});
|
|
853
897
|
return;
|
|
854
898
|
}
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
? PERPS_EVENT_VALUE.DIRECTION.LONG
|
|
860
|
-
: PERPS_EVENT_VALUE.DIRECTION.SHORT,
|
|
861
|
-
closePercentage: params.size
|
|
862
|
-
? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) *
|
|
863
|
-
100
|
|
864
|
-
: 100,
|
|
865
|
-
closeType: PERPS_EVENT_VALUE.CLOSE_TYPE.FULL,
|
|
866
|
-
orderType: params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,
|
|
867
|
-
requestedSize: params.size
|
|
868
|
-
? parseFloat(params.size)
|
|
869
|
-
: Math.abs(parseFloat(position.size)),
|
|
870
|
-
filledSize: 0,
|
|
871
|
-
isPartiallyFilled: false,
|
|
872
|
-
};
|
|
899
|
+
// A thrown close has no OrderResult. Classify it from the requested size
|
|
900
|
+
// the same way a returned failure is classified, so a partial request is
|
|
901
|
+
// not reported as a full close.
|
|
902
|
+
const metrics = this.#calculateCloseMetrics(position, params, result ?? { success: false });
|
|
873
903
|
// Track partially filled event if applicable
|
|
874
904
|
if (result?.success && metrics.isPartiallyFilled) {
|
|
875
905
|
const partialProperties = this.#buildCloseEventProperties(position, params, metrics, result, PERPS_EVENT_VALUE.STATUS.PARTIALLY_FILLED);
|
|
@@ -887,7 +917,7 @@ export class TradingService {
|
|
|
887
917
|
: PERPS_EVENT_VALUE.STATUS.FAILED;
|
|
888
918
|
const errorMessage = error?.message ?? result?.error;
|
|
889
919
|
// Track main close event
|
|
890
|
-
const eventProperties = this.#buildCloseEventProperties(position, params, metrics, result, status, errorMessage);
|
|
920
|
+
const eventProperties = this.#buildCloseEventProperties(position, params, metrics, result, status, error ?? errorMessage);
|
|
891
921
|
this.#deps.metrics.trackPerpsEvent(PerpsAnalyticsEvent.PositionCloseTransaction, {
|
|
892
922
|
...eventProperties,
|
|
893
923
|
[PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,
|
|
@@ -1588,6 +1618,7 @@ export class TradingService {
|
|
|
1588
1618
|
this.#trackSubmitted(PerpsAnalyticsEvent.PositionCloseTransaction, {
|
|
1589
1619
|
[PERPS_EVENT_PROPERTY.ASSET]: params.symbol,
|
|
1590
1620
|
[PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.orderType ?? PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,
|
|
1621
|
+
...this.#buildSlippageProperties(params.trackingData),
|
|
1591
1622
|
...this.#buildAttributionProperties(params.trackingData),
|
|
1592
1623
|
...(bulkActionId && {
|
|
1593
1624
|
[PERPS_EVENT_PROPERTY.BULK_ACTION_ID]: bulkActionId,
|