@metamask-previews/perps-controller 2.0.0-preview-a37be9342 → 2.0.0-preview-26cb9fc

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.
Files changed (112) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/PerpsController.cjs.map +1 -1
  3. package/dist/PerpsController.d.cts.map +1 -1
  4. package/dist/PerpsController.d.mts.map +1 -1
  5. package/dist/PerpsController.mjs.map +1 -1
  6. package/dist/constants/eventNames.cjs +1 -0
  7. package/dist/constants/eventNames.cjs.map +1 -1
  8. package/dist/constants/eventNames.d.cts +1 -0
  9. package/dist/constants/eventNames.d.cts.map +1 -1
  10. package/dist/constants/eventNames.d.mts +1 -0
  11. package/dist/constants/eventNames.d.mts.map +1 -1
  12. package/dist/constants/eventNames.mjs +1 -0
  13. package/dist/constants/eventNames.mjs.map +1 -1
  14. package/dist/constants/perpsConfig.cjs +3 -0
  15. package/dist/constants/perpsConfig.cjs.map +1 -1
  16. package/dist/constants/perpsConfig.d.cts +1 -0
  17. package/dist/constants/perpsConfig.d.cts.map +1 -1
  18. package/dist/constants/perpsConfig.d.mts +1 -0
  19. package/dist/constants/perpsConfig.d.mts.map +1 -1
  20. package/dist/constants/perpsConfig.mjs +3 -0
  21. package/dist/constants/perpsConfig.mjs.map +1 -1
  22. package/dist/index.cjs +50 -56
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +2 -1
  25. package/dist/index.d.cts.map +1 -1
  26. package/dist/index.d.mts +2 -1
  27. package/dist/index.d.mts.map +1 -1
  28. package/dist/index.mjs +1 -1
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/providers/HyperLiquidProvider.cjs +18 -6
  31. package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
  32. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
  33. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
  34. package/dist/providers/HyperLiquidProvider.mjs +18 -6
  35. package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
  36. package/dist/services/HyperLiquidClientService.cjs +39 -16
  37. package/dist/services/HyperLiquidClientService.cjs.map +1 -1
  38. package/dist/services/HyperLiquidClientService.d.cts +2 -0
  39. package/dist/services/HyperLiquidClientService.d.cts.map +1 -1
  40. package/dist/services/HyperLiquidClientService.d.mts +2 -0
  41. package/dist/services/HyperLiquidClientService.d.mts.map +1 -1
  42. package/dist/services/HyperLiquidClientService.mjs +39 -16
  43. package/dist/services/HyperLiquidClientService.mjs.map +1 -1
  44. package/dist/services/HyperLiquidSubscriptionService.cjs +78 -13
  45. package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
  46. package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
  47. package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
  48. package/dist/services/HyperLiquidSubscriptionService.mjs +78 -13
  49. package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
  50. package/dist/services/TradingService.cjs +0 -1
  51. package/dist/services/TradingService.cjs.map +1 -1
  52. package/dist/services/TradingService.d.cts.map +1 -1
  53. package/dist/services/TradingService.d.mts.map +1 -1
  54. package/dist/services/TradingService.mjs +0 -1
  55. package/dist/services/TradingService.mjs.map +1 -1
  56. package/dist/types/index.cjs +3 -2
  57. package/dist/types/index.cjs.map +1 -1
  58. package/dist/types/index.d.cts.map +1 -1
  59. package/dist/types/index.d.mts.map +1 -1
  60. package/dist/types/index.mjs +3 -2
  61. package/dist/types/index.mjs.map +1 -1
  62. package/dist/types/transactionTypes.cjs +5 -4
  63. package/dist/types/transactionTypes.cjs.map +1 -1
  64. package/dist/types/transactionTypes.d.cts +0 -4
  65. package/dist/types/transactionTypes.d.cts.map +1 -1
  66. package/dist/types/transactionTypes.d.mts +0 -4
  67. package/dist/types/transactionTypes.d.mts.map +1 -1
  68. package/dist/types/transactionTypes.mjs +3 -2
  69. package/dist/types/transactionTypes.mjs.map +1 -1
  70. package/dist/utils/errorUtils.cjs +4 -3
  71. package/dist/utils/errorUtils.cjs.map +1 -1
  72. package/dist/utils/errorUtils.d.cts +0 -4
  73. package/dist/utils/errorUtils.d.cts.map +1 -1
  74. package/dist/utils/errorUtils.d.mts +0 -4
  75. package/dist/utils/errorUtils.d.mts.map +1 -1
  76. package/dist/utils/errorUtils.mjs +2 -1
  77. package/dist/utils/errorUtils.mjs.map +1 -1
  78. package/dist/utils/hyperLiquidAdapter.cjs +3 -2
  79. package/dist/utils/hyperLiquidAdapter.cjs.map +1 -1
  80. package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -1
  81. package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -1
  82. package/dist/utils/hyperLiquidAdapter.mjs +4 -3
  83. package/dist/utils/hyperLiquidAdapter.mjs.map +1 -1
  84. package/dist/utils/hyperLiquidValidation.cjs +4 -0
  85. package/dist/utils/hyperLiquidValidation.cjs.map +1 -1
  86. package/dist/utils/hyperLiquidValidation.d.cts.map +1 -1
  87. package/dist/utils/hyperLiquidValidation.d.mts.map +1 -1
  88. package/dist/utils/hyperLiquidValidation.mjs +4 -0
  89. package/dist/utils/hyperLiquidValidation.mjs.map +1 -1
  90. package/dist/utils/index.cjs +0 -1
  91. package/dist/utils/index.cjs.map +1 -1
  92. package/dist/utils/index.d.cts +0 -1
  93. package/dist/utils/index.d.cts.map +1 -1
  94. package/dist/utils/index.d.mts +0 -1
  95. package/dist/utils/index.d.mts.map +1 -1
  96. package/dist/utils/index.mjs +0 -1
  97. package/dist/utils/index.mjs.map +1 -1
  98. package/dist/utils/marketDataTransform.cjs +2 -1
  99. package/dist/utils/marketDataTransform.cjs.map +1 -1
  100. package/dist/utils/marketDataTransform.d.cts.map +1 -1
  101. package/dist/utils/marketDataTransform.d.mts.map +1 -1
  102. package/dist/utils/marketDataTransform.mjs +2 -1
  103. package/dist/utils/marketDataTransform.mjs.map +1 -1
  104. package/dist/utils/perpsConnectionAttemptContext.cjs +20 -0
  105. package/dist/utils/perpsConnectionAttemptContext.cjs.map +1 -0
  106. package/dist/utils/perpsConnectionAttemptContext.d.cts +7 -0
  107. package/dist/utils/perpsConnectionAttemptContext.d.cts.map +1 -0
  108. package/dist/utils/perpsConnectionAttemptContext.d.mts +7 -0
  109. package/dist/utils/perpsConnectionAttemptContext.d.mts.map +1 -0
  110. package/dist/utils/perpsConnectionAttemptContext.mjs +15 -0
  111. package/dist/utils/perpsConnectionAttemptContext.mjs.map +1 -0
  112. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidValidation.d.cts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hyperLiquidValidation.d.cts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidValidation.d.mts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hyperLiquidValidation.d.mts","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,wBAAwB;AASxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,2BAAiB;AAE1E;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAEjE;;GAEG;AAEH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,SAAS;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACnD,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE;IACN,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB,EACD,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAkEtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE;IACN,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgFtC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,EAAE,EAC3C,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA+CtC;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,WAAW,CAAC,EAAE,qBAAqB,GAClC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiCtC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,CAAC,EAAE,uBAAuB,EAChC,WAAW,CAAC,EAAE,qBAAqB,GAClC,WAAW,EAAE,CA2Ef;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,uBAAuB,EAChC,WAAW,CAAC,EAAE,qBAAqB,GAClC,WAAW,EAAE,CAef;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,GAAG,OAAO,GAC5B,MAAM,CAgBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAChC,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BvC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAStC"}
@@ -278,6 +278,10 @@ export function applyPathFilters(assets, params, debugLogger) {
278
278
  after: filtered,
279
279
  });
280
280
  }
281
+ // Note: `in` is the idiomatic TypeScript way to narrow a string to
282
+ // `keyof typeof` for indexed access; `hasProperty` types the indexed
283
+ // result as `unknown` and loses the `{ testnet, mainnet }` shape.
284
+ /* eslint-disable-next-line no-restricted-syntax */
281
285
  if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {
282
286
  const config = HYPERLIQUID_ASSET_CONFIGS[params.symbol];
283
287
  const isTestnet = params.isTestnet ?? false;
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidValidation.mjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/utils';\nimport type { CaipAssetId, Hex } from '@metamask/utils';\n\nimport {\n HYPERLIQUID_ASSET_CONFIGS,\n getSupportedAssets,\n TRADING_DEFAULTS,\n} from '../constants/hyperLiquidConfig';\nimport { HYPERLIQUID_ORDER_LIMITS } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes';\nimport type { GetSupportedPathsParams, PerpsDebugLogger } from '../types';\n\n/**\n * Optional debug logger for validation functions.\n * When provided, enables detailed logging for debugging.\n * When omitted, validation runs silently.\n */\nexport type ValidationDebugLogger = PerpsDebugLogger | undefined;\n\n/**\n * Validation utilities for HyperLiquid operations\n */\n\n/**\n * Create standardized error response.\n *\n * @param error - The error that occurred\n * @param defaultResponse - The default response object to use as template\n * @returns The error response with success=false and error message\n */\nexport function createErrorResult<\n TValue extends { success: boolean; error?: string },\n>(error: unknown, defaultResponse: TValue): TValue {\n return {\n ...defaultResponse,\n success: false,\n error:\n error instanceof Error ? error.message : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n}\n\n/**\n * Validate withdrawal parameters.\n *\n * @param params - Withdrawal parameters to validate\n * @param params.assetId - The CAIP asset ID to withdraw\n * @param params.amount - Amount to withdraw as string\n * @param params.destination - Optional destination hex address\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateWithdrawalParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n destination?: Hex;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateWithdrawalParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n hasDestination: Boolean(params.destination),\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateWithdrawalParams: Missing assetId', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateWithdrawalParams: Missing amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateWithdrawalParams: Invalid amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n };\n }\n\n // Validate destination address if provided\n if (params.destination && !isValidHexAddress(params.destination)) {\n debugLogger?.log('validateWithdrawalParams: Invalid destination address', {\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n destination: params.destination,\n isValidHex: isValidHexAddress(params.destination),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n };\n }\n\n debugLogger?.log('validateWithdrawalParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n destination: params.destination ?? 'will use user wallet',\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate deposit parameters.\n *\n * @param params - Deposit parameters to validate\n * @param params.assetId - The CAIP asset ID to deposit\n * @param params.amount - Amount to deposit as string\n * @param params.isTestnet - Whether this is a testnet deposit\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateDepositParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n isTestnet?: boolean;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateDepositParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n isTestnet: params.isTestnet,\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateDepositParams: Missing assetId', {\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateDepositParams: Missing amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateDepositParams: Invalid amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n };\n }\n\n // Check minimum deposit amount\n const minimumAmount = params.isTestnet\n ? TRADING_DEFAULTS.amount.testnet\n : TRADING_DEFAULTS.amount.mainnet;\n\n debugLogger?.log('validateDepositParams: Checking minimum amount', {\n amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n network: params.isTestnet ? 'testnet' : 'mainnet',\n });\n\n if (amount < minimumAmount) {\n debugLogger?.log('validateDepositParams: Below minimum deposit', {\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n amount,\n minimumAmount,\n difference: minimumAmount - amount,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n };\n }\n\n debugLogger?.log('validateDepositParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n parsedAmount: amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate asset support for withdrawals using AssetRoute arrays.\n *\n * @param assetId - The CAIP asset ID to validate\n * @param supportedRoutes - Array of supported asset routes\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateAssetSupport(\n assetId: CaipAssetId,\n supportedRoutes: { assetId: CaipAssetId }[],\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateAssetSupport: Checking asset support', {\n assetId,\n supportedRoutesCount: supportedRoutes.length,\n });\n\n const supportedAssetIds = supportedRoutes.map((route) => route.assetId);\n\n // Check if asset is supported\n const isSupported = supportedAssetIds.includes(assetId);\n\n if (!isSupported) {\n // Also check case-insensitive match for contract addresses\n const isSupportedCaseInsensitive = supportedAssetIds.some(\n (supportedId) => supportedId.toLowerCase() === assetId.toLowerCase(),\n );\n\n if (!isSupportedCaseInsensitive) {\n debugLogger?.log('validateAssetSupport: Asset not supported', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n assetId,\n supportedAssetIds,\n checkedCaseInsensitive: true,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n };\n }\n\n debugLogger?.log(\n '⚠️ validateAssetSupport: Asset supported with case mismatch',\n {\n providedAssetId: assetId,\n matchedAssetId: supportedAssetIds.find(\n (id) => id.toLowerCase() === assetId.toLowerCase(),\n ),\n },\n );\n }\n\n debugLogger?.log('validateAssetSupport: Asset is supported', {\n assetId,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate balance against withdrawal amount.\n *\n * @param withdrawAmount - The amount to withdraw\n * @param availableBalance - The available balance\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateBalance(\n withdrawAmount: number,\n availableBalance: number,\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateBalance: Checking balance sufficiency', {\n withdrawAmount,\n availableBalance,\n difference: availableBalance - withdrawAmount,\n });\n\n if (withdrawAmount > availableBalance) {\n const shortfall = withdrawAmount - availableBalance;\n\n debugLogger?.log('validateBalance: Insufficient balance', {\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n withdrawAmount,\n availableBalance,\n shortfall,\n percentageOfAvailable: `${((withdrawAmount / availableBalance) * 100).toFixed(2)}%`,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n };\n }\n\n const remainingBalance = availableBalance - withdrawAmount;\n debugLogger?.log('validateBalance: Balance is sufficient', {\n withdrawAmount,\n availableBalance,\n remainingBalance,\n percentageUsed: `${((withdrawAmount / availableBalance) * 100).toFixed(2)}%`,\n });\n\n return { isValid: true };\n}\n\n/**\n * Apply filters to asset paths with comprehensive logging.\n *\n * @param assets - Array of CAIP asset IDs to filter\n * @param params - Filter parameters including chainId, symbol, and assetId\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Filtered array of CAIP asset IDs\n */\nexport function applyPathFilters(\n assets: CaipAssetId[],\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n if (!params) {\n debugLogger?.log(\n 'HyperLiquid: applyPathFilters - no params, returning all assets',\n { assets },\n );\n return assets;\n }\n\n let filtered = assets;\n\n debugLogger?.log('HyperLiquid: applyPathFilters - starting filter', {\n initialAssets: assets,\n filterParams: params,\n });\n\n if (params.chainId) {\n const before = filtered;\n filtered = filtered.filter((asset) =>\n asset.startsWith(params.chainId as string),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - chainId filter', {\n chainId: params.chainId,\n before,\n after: filtered,\n });\n }\n\n if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {\n const config =\n HYPERLIQUID_ASSET_CONFIGS[\n params.symbol as keyof typeof HYPERLIQUID_ASSET_CONFIGS\n ];\n const isTestnet = params.isTestnet ?? false;\n const selectedAsset = isTestnet ? config.testnet : config.mainnet;\n const before = filtered;\n filtered = [selectedAsset];\n debugLogger?.log('HyperLiquid: applyPathFilters - symbol filter', {\n symbol: params.symbol,\n isTestnet,\n config,\n selectedAsset,\n before,\n after: filtered,\n });\n }\n\n if (params.assetId) {\n const before = filtered;\n // Use case-insensitive comparison for asset ID matching to handle address case differences\n filtered = filtered.filter(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - assetId filter', {\n assetId: params.assetId,\n before,\n after: filtered,\n exactMatch: before.includes(params.assetId),\n caseInsensitiveMatch: before.some(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n ),\n });\n }\n\n debugLogger?.log('HyperLiquid: applyPathFilters - final result', {\n initialAssets: assets,\n finalFiltered: filtered,\n filterParams: params,\n });\n\n return filtered;\n}\n\n/**\n * Get supported deposit/withdrawal paths with filtering.\n *\n * @param params - Filter parameters including isTestnet, chainId, symbol\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Array of supported CAIP asset IDs\n */\nexport function getSupportedPaths(\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n const isTestnet = params?.isTestnet ?? false;\n const assets = getSupportedAssets(isTestnet);\n const filteredAssets = applyPathFilters(assets, params, debugLogger);\n\n debugLogger?.log('HyperLiquid: getSupportedPaths', {\n isTestnet,\n requestedParams: params,\n allAssets: assets,\n filteredAssets,\n returnType: 'CaipAssetId[]',\n example: filteredAssets[0],\n });\n\n return filteredAssets;\n}\n\n/**\n * Get maximum order value based on leverage and order type.\n * Based on HyperLiquid contract specifications.\n *\n * @param maxLeverage - The maximum leverage for the market\n * @param orderType - The order type (market or limit)\n * @returns Maximum order value in USD\n */\nexport function getMaxOrderValue(\n maxLeverage: number,\n orderType: 'market' | 'limit',\n): number {\n let marketLimit: number;\n\n if (maxLeverage >= 25) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;\n } else if (maxLeverage >= 20) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;\n } else if (maxLeverage >= 10) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;\n } else {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;\n }\n\n return orderType === 'limit'\n ? marketLimit * HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier\n : marketLimit;\n}\n\n/**\n * Validate order parameters.\n * Basic validation - checks required fields are present.\n * Amount validation (size/USD) is handled by validateOrder.\n *\n * @param params - Order parameters to validate\n * @param params.coin - The trading pair coin symbol\n * @param params.size - The order size as string\n * @param params.price - The order price as string\n * @param params.orderType - The order type (market or limit)\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateOrderParams(params: {\n coin?: string;\n size?: string;\n price?: string;\n orderType?: 'market' | 'limit';\n}): { isValid: boolean; error?: string } {\n if (!params.coin) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,\n };\n }\n\n // Note: Size validation removed - validateOrder handles amount validation using USD as source of truth\n\n // Require price for limit orders\n if (params.orderType === 'limit' && !params.price) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,\n };\n }\n\n if (params.price && parseFloat(params.price) <= 0) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Validate coin exists in asset mapping.\n *\n * @param coin - The coin symbol to validate\n * @param coinToAssetId - Map of coin symbols to asset IDs\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateCoinExists(\n coin: string,\n coinToAssetId: Map<string, number>,\n): { isValid: boolean; error?: string } {\n if (!coinToAssetId.has(coin)) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,\n };\n }\n\n return { isValid: true };\n}\n"]}
1
+ {"version":3,"file":"hyperLiquidValidation.mjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isValidHexAddress } from '@metamask/utils';\nimport type { CaipAssetId, Hex } from '@metamask/utils';\n\nimport {\n HYPERLIQUID_ASSET_CONFIGS,\n getSupportedAssets,\n TRADING_DEFAULTS,\n} from '../constants/hyperLiquidConfig';\nimport { HYPERLIQUID_ORDER_LIMITS } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes';\nimport type { GetSupportedPathsParams, PerpsDebugLogger } from '../types';\n\n/**\n * Optional debug logger for validation functions.\n * When provided, enables detailed logging for debugging.\n * When omitted, validation runs silently.\n */\nexport type ValidationDebugLogger = PerpsDebugLogger | undefined;\n\n/**\n * Validation utilities for HyperLiquid operations\n */\n\n/**\n * Create standardized error response.\n *\n * @param error - The error that occurred\n * @param defaultResponse - The default response object to use as template\n * @returns The error response with success=false and error message\n */\nexport function createErrorResult<\n TValue extends { success: boolean; error?: string },\n>(error: unknown, defaultResponse: TValue): TValue {\n return {\n ...defaultResponse,\n success: false,\n error:\n error instanceof Error ? error.message : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n}\n\n/**\n * Validate withdrawal parameters.\n *\n * @param params - Withdrawal parameters to validate\n * @param params.assetId - The CAIP asset ID to withdraw\n * @param params.amount - Amount to withdraw as string\n * @param params.destination - Optional destination hex address\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateWithdrawalParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n destination?: Hex;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateWithdrawalParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n hasDestination: Boolean(params.destination),\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateWithdrawalParams: Missing assetId', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateWithdrawalParams: Missing amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateWithdrawalParams: Invalid amount', {\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_AMOUNT_POSITIVE,\n };\n }\n\n // Validate destination address if provided\n if (params.destination && !isValidHexAddress(params.destination)) {\n debugLogger?.log('validateWithdrawalParams: Invalid destination address', {\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n destination: params.destination,\n isValidHex: isValidHexAddress(params.destination),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INVALID_DESTINATION,\n };\n }\n\n debugLogger?.log('validateWithdrawalParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n destination: params.destination ?? 'will use user wallet',\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate deposit parameters.\n *\n * @param params - Deposit parameters to validate\n * @param params.assetId - The CAIP asset ID to deposit\n * @param params.amount - Amount to deposit as string\n * @param params.isTestnet - Whether this is a testnet deposit\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateDepositParams(\n params: {\n assetId?: CaipAssetId;\n amount?: string;\n isTestnet?: boolean;\n },\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateDepositParams: Starting validation', {\n params,\n hasAssetId: Boolean(params.assetId),\n hasAmount: Boolean(params.amount),\n isTestnet: params.isTestnet,\n });\n\n // Validate required parameters\n if (!params.assetId) {\n debugLogger?.log('validateDepositParams: Missing assetId', {\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_ASSET_ID_REQUIRED,\n };\n }\n\n // Validate amount\n if (!params.amount) {\n debugLogger?.log('validateDepositParams: Missing amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n params,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_REQUIRED,\n };\n }\n\n const amount = parseFloat(params.amount);\n if (isNaN(amount) || amount <= 0) {\n debugLogger?.log('validateDepositParams: Invalid amount', {\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n amount: params.amount,\n parsedAmount: amount,\n isNaN: isNaN(amount),\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_AMOUNT_POSITIVE,\n };\n }\n\n // Check minimum deposit amount\n const minimumAmount = params.isTestnet\n ? TRADING_DEFAULTS.amount.testnet\n : TRADING_DEFAULTS.amount.mainnet;\n\n debugLogger?.log('validateDepositParams: Checking minimum amount', {\n amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n network: params.isTestnet ? 'testnet' : 'mainnet',\n });\n\n if (amount < minimumAmount) {\n debugLogger?.log('validateDepositParams: Below minimum deposit', {\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n amount,\n minimumAmount,\n difference: minimumAmount - amount,\n });\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.DEPOSIT_MINIMUM_AMOUNT,\n };\n }\n\n debugLogger?.log('validateDepositParams: All validations passed', {\n assetId: params.assetId,\n amount: params.amount,\n parsedAmount: amount,\n minimumAmount,\n isTestnet: params.isTestnet,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate asset support for withdrawals using AssetRoute arrays.\n *\n * @param assetId - The CAIP asset ID to validate\n * @param supportedRoutes - Array of supported asset routes\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateAssetSupport(\n assetId: CaipAssetId,\n supportedRoutes: { assetId: CaipAssetId }[],\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateAssetSupport: Checking asset support', {\n assetId,\n supportedRoutesCount: supportedRoutes.length,\n });\n\n const supportedAssetIds = supportedRoutes.map((route) => route.assetId);\n\n // Check if asset is supported\n const isSupported = supportedAssetIds.includes(assetId);\n\n if (!isSupported) {\n // Also check case-insensitive match for contract addresses\n const isSupportedCaseInsensitive = supportedAssetIds.some(\n (supportedId) => supportedId.toLowerCase() === assetId.toLowerCase(),\n );\n\n if (!isSupportedCaseInsensitive) {\n debugLogger?.log('validateAssetSupport: Asset not supported', {\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n assetId,\n supportedAssetIds,\n checkedCaseInsensitive: true,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_ASSET_NOT_SUPPORTED,\n };\n }\n\n debugLogger?.log(\n '⚠️ validateAssetSupport: Asset supported with case mismatch',\n {\n providedAssetId: assetId,\n matchedAssetId: supportedAssetIds.find(\n (id) => id.toLowerCase() === assetId.toLowerCase(),\n ),\n },\n );\n }\n\n debugLogger?.log('validateAssetSupport: Asset is supported', {\n assetId,\n });\n\n return { isValid: true };\n}\n\n/**\n * Validate balance against withdrawal amount.\n *\n * @param withdrawAmount - The amount to withdraw\n * @param availableBalance - The available balance\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateBalance(\n withdrawAmount: number,\n availableBalance: number,\n debugLogger?: ValidationDebugLogger,\n): { isValid: boolean; error?: string } {\n debugLogger?.log('validateBalance: Checking balance sufficiency', {\n withdrawAmount,\n availableBalance,\n difference: availableBalance - withdrawAmount,\n });\n\n if (withdrawAmount > availableBalance) {\n const shortfall = withdrawAmount - availableBalance;\n\n debugLogger?.log('validateBalance: Insufficient balance', {\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n withdrawAmount,\n availableBalance,\n shortfall,\n percentageOfAvailable: `${((withdrawAmount / availableBalance) * 100).toFixed(2)}%`,\n });\n\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.WITHDRAW_INSUFFICIENT_BALANCE,\n };\n }\n\n const remainingBalance = availableBalance - withdrawAmount;\n debugLogger?.log('validateBalance: Balance is sufficient', {\n withdrawAmount,\n availableBalance,\n remainingBalance,\n percentageUsed: `${((withdrawAmount / availableBalance) * 100).toFixed(2)}%`,\n });\n\n return { isValid: true };\n}\n\n/**\n * Apply filters to asset paths with comprehensive logging.\n *\n * @param assets - Array of CAIP asset IDs to filter\n * @param params - Filter parameters including chainId, symbol, and assetId\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Filtered array of CAIP asset IDs\n */\nexport function applyPathFilters(\n assets: CaipAssetId[],\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n if (!params) {\n debugLogger?.log(\n 'HyperLiquid: applyPathFilters - no params, returning all assets',\n { assets },\n );\n return assets;\n }\n\n let filtered = assets;\n\n debugLogger?.log('HyperLiquid: applyPathFilters - starting filter', {\n initialAssets: assets,\n filterParams: params,\n });\n\n if (params.chainId) {\n const before = filtered;\n filtered = filtered.filter((asset) =>\n asset.startsWith(params.chainId as string),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - chainId filter', {\n chainId: params.chainId,\n before,\n after: filtered,\n });\n }\n\n // Note: `in` is the idiomatic TypeScript way to narrow a string to\n // `keyof typeof` for indexed access; `hasProperty` types the indexed\n // result as `unknown` and loses the `{ testnet, mainnet }` shape.\n /* eslint-disable-next-line no-restricted-syntax */\n if (params.symbol && params.symbol in HYPERLIQUID_ASSET_CONFIGS) {\n const config =\n HYPERLIQUID_ASSET_CONFIGS[\n params.symbol as keyof typeof HYPERLIQUID_ASSET_CONFIGS\n ];\n const isTestnet = params.isTestnet ?? false;\n const selectedAsset = isTestnet ? config.testnet : config.mainnet;\n const before = filtered;\n filtered = [selectedAsset];\n debugLogger?.log('HyperLiquid: applyPathFilters - symbol filter', {\n symbol: params.symbol,\n isTestnet,\n config,\n selectedAsset,\n before,\n after: filtered,\n });\n }\n\n if (params.assetId) {\n const before = filtered;\n // Use case-insensitive comparison for asset ID matching to handle address case differences\n filtered = filtered.filter(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n );\n debugLogger?.log('HyperLiquid: applyPathFilters - assetId filter', {\n assetId: params.assetId,\n before,\n after: filtered,\n exactMatch: before.includes(params.assetId),\n caseInsensitiveMatch: before.some(\n (asset) => asset.toLowerCase() === params.assetId?.toLowerCase(),\n ),\n });\n }\n\n debugLogger?.log('HyperLiquid: applyPathFilters - final result', {\n initialAssets: assets,\n finalFiltered: filtered,\n filterParams: params,\n });\n\n return filtered;\n}\n\n/**\n * Get supported deposit/withdrawal paths with filtering.\n *\n * @param params - Filter parameters including isTestnet, chainId, symbol\n * @param debugLogger - Optional debug logger for detailed logging\n * @returns Array of supported CAIP asset IDs\n */\nexport function getSupportedPaths(\n params?: GetSupportedPathsParams,\n debugLogger?: ValidationDebugLogger,\n): CaipAssetId[] {\n const isTestnet = params?.isTestnet ?? false;\n const assets = getSupportedAssets(isTestnet);\n const filteredAssets = applyPathFilters(assets, params, debugLogger);\n\n debugLogger?.log('HyperLiquid: getSupportedPaths', {\n isTestnet,\n requestedParams: params,\n allAssets: assets,\n filteredAssets,\n returnType: 'CaipAssetId[]',\n example: filteredAssets[0],\n });\n\n return filteredAssets;\n}\n\n/**\n * Get maximum order value based on leverage and order type.\n * Based on HyperLiquid contract specifications.\n *\n * @param maxLeverage - The maximum leverage for the market\n * @param orderType - The order type (market or limit)\n * @returns Maximum order value in USD\n */\nexport function getMaxOrderValue(\n maxLeverage: number,\n orderType: 'market' | 'limit',\n): number {\n let marketLimit: number;\n\n if (maxLeverage >= 25) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.HighLeverage;\n } else if (maxLeverage >= 20) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumHighLeverage;\n } else if (maxLeverage >= 10) {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.MediumLeverage;\n } else {\n marketLimit = HYPERLIQUID_ORDER_LIMITS.MarketOrderLimits.LowLeverage;\n }\n\n return orderType === 'limit'\n ? marketLimit * HYPERLIQUID_ORDER_LIMITS.LimitOrderMultiplier\n : marketLimit;\n}\n\n/**\n * Validate order parameters.\n * Basic validation - checks required fields are present.\n * Amount validation (size/USD) is handled by validateOrder.\n *\n * @param params - Order parameters to validate\n * @param params.coin - The trading pair coin symbol\n * @param params.size - The order size as string\n * @param params.price - The order price as string\n * @param params.orderType - The order type (market or limit)\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateOrderParams(params: {\n coin?: string;\n size?: string;\n price?: string;\n orderType?: 'market' | 'limit';\n}): { isValid: boolean; error?: string } {\n if (!params.coin) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_COIN_REQUIRED,\n };\n }\n\n // Note: Size validation removed - validateOrder handles amount validation using USD as source of truth\n\n // Require price for limit orders\n if (params.orderType === 'limit' && !params.price) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED,\n };\n }\n\n if (params.price && parseFloat(params.price) <= 0) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_PRICE_POSITIVE,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Validate coin exists in asset mapping.\n *\n * @param coin - The coin symbol to validate\n * @param coinToAssetId - Map of coin symbols to asset IDs\n * @returns Validation result with isValid flag and optional error message\n */\nexport function validateCoinExists(\n coin: string,\n coinToAssetId: Map<string, number>,\n): { isValid: boolean; error?: string } {\n if (!coinToAssetId.has(coin)) {\n return {\n isValid: false,\n error: PERPS_ERROR_CODES.ORDER_UNKNOWN_COIN,\n };\n }\n\n return { isValid: true };\n}\n"]}
@@ -40,7 +40,6 @@ __exportStar(require("./hyperLiquidOrderBookProcessor.cjs"), exports);
40
40
  __exportStar(require("./hyperLiquidValidation.cjs"), exports);
41
41
  __exportStar(require("./idUtils.cjs"), exports);
42
42
  __exportStar(require("./marketDataTransform.cjs"), exports);
43
- __exportStar(require("./myxAdapter.cjs"), exports);
44
43
  __exportStar(require("./marketUtils.cjs"), exports);
45
44
  __exportStar(require("./orderCalculations.cjs"), exports);
46
45
  __exportStar(require("./rewardsUtils.cjs"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,qDAA+B;AAC/B,mDAA6B;AAC7B,mGAAmG;AACnG,+DAY8B;AAX5B,qHAAA,eAAe,OAAA;AACf,0HAAA,oBAAoB,OAAA;AACpB,uHAAA,iBAAiB,OAAA;AACjB,wHAAA,kBAAkB,OAAA;AAClB,8HAAA,wBAAwB,OAAA;AACxB,uHAAA,iBAAiB,OAAA;AACjB,4HAAA,sBAAsB,OAAA;AACtB,2HAAA,qBAAqB,OAAA;AACrB,0HAAA,oBAAoB,OAAA;AACpB,oHAAA,cAAc,OAAA;AACd,mJAAA,6CAA6C,OAAA;AAE/C,sEAAgD;AAChD,8DAAwC;AACxC,gDAA0B;AAC1B,4DAAsC;AACtC,mDAA6B;AAC7B,oDAA8B;AAC9B,0DAAoC;AACpC,qDAA+B;AAC/B,2DAAqC;AACrC,oDAA8B;AAC9B,6DAAuC;AACvC,yDAAmC;AACnC,qDAA+B;AAC/B,6CAAuB;AAEvB,qFAAqF;AAC9E,MAAM,cAAc,GAAG,GAAmB,EAAE;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,CAAC;IAC9D,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC;AAHW,QAAA,cAAc,kBAGzB","sourcesContent":["/**\n * Barrel re-export for all portable utilities in controllers/utils/\n *\n * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.\n * We use selective exports to avoid the name collision.\n */\nexport * from './accountUtils';\nexport * from './errorUtils';\n// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations\nexport {\n adaptOrderToSDK,\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptMarketFromSDK,\n adaptAccountStateFromSDK,\n buildAssetMapping,\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n calculateHip3AssetId,\n parseAssetName,\n adaptHyperLiquidLedgerUpdateToUserHistoryItem,\n} from './hyperLiquidAdapter';\nexport * from './hyperLiquidOrderBookProcessor';\nexport * from './hyperLiquidValidation';\nexport * from './idUtils';\nexport * from './marketDataTransform';\nexport * from './myxAdapter';\nexport * from './marketUtils';\nexport * from './orderCalculations';\nexport * from './rewardsUtils';\nexport * from './significantFigures';\nexport * from './sortMarkets';\nexport * from './standaloneInfoClient';\nexport * from './stringParseUtils';\nexport * from './transferData';\nexport * from './wait';\n\n// Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)\nexport const getEnvironment = (): 'DEV' | 'PROD' => {\n const env = globalThis.process?.env?.NODE_ENV ?? 'production';\n return env === 'production' ? 'PROD' : 'DEV';\n};\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,qDAA+B;AAC/B,mDAA6B;AAC7B,mGAAmG;AACnG,+DAY8B;AAX5B,qHAAA,eAAe,OAAA;AACf,0HAAA,oBAAoB,OAAA;AACpB,uHAAA,iBAAiB,OAAA;AACjB,wHAAA,kBAAkB,OAAA;AAClB,8HAAA,wBAAwB,OAAA;AACxB,uHAAA,iBAAiB,OAAA;AACjB,4HAAA,sBAAsB,OAAA;AACtB,2HAAA,qBAAqB,OAAA;AACrB,0HAAA,oBAAoB,OAAA;AACpB,oHAAA,cAAc,OAAA;AACd,mJAAA,6CAA6C,OAAA;AAE/C,sEAAgD;AAChD,8DAAwC;AACxC,gDAA0B;AAC1B,4DAAsC;AACtC,oDAA8B;AAC9B,0DAAoC;AACpC,qDAA+B;AAC/B,2DAAqC;AACrC,oDAA8B;AAC9B,6DAAuC;AACvC,yDAAmC;AACnC,qDAA+B;AAC/B,6CAAuB;AAEvB,qFAAqF;AAC9E,MAAM,cAAc,GAAG,GAAmB,EAAE;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,CAAC;IAC9D,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC;AAHW,QAAA,cAAc,kBAGzB","sourcesContent":["/**\n * Barrel re-export for all portable utilities in controllers/utils/\n *\n * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.\n * We use selective exports to avoid the name collision.\n */\nexport * from './accountUtils';\nexport * from './errorUtils';\n// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations\nexport {\n adaptOrderToSDK,\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptMarketFromSDK,\n adaptAccountStateFromSDK,\n buildAssetMapping,\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n calculateHip3AssetId,\n parseAssetName,\n adaptHyperLiquidLedgerUpdateToUserHistoryItem,\n} from './hyperLiquidAdapter';\nexport * from './hyperLiquidOrderBookProcessor';\nexport * from './hyperLiquidValidation';\nexport * from './idUtils';\nexport * from './marketDataTransform';\nexport * from './marketUtils';\nexport * from './orderCalculations';\nexport * from './rewardsUtils';\nexport * from './significantFigures';\nexport * from './sortMarkets';\nexport * from './standaloneInfoClient';\nexport * from './stringParseUtils';\nexport * from './transferData';\nexport * from './wait';\n\n// Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)\nexport const getEnvironment = (): 'DEV' | 'PROD' => {\n const env = globalThis.process?.env?.NODE_ENV ?? 'production';\n return env === 'production' ? 'PROD' : 'DEV';\n};\n"]}
@@ -11,7 +11,6 @@ export * from "./hyperLiquidOrderBookProcessor.cjs";
11
11
  export * from "./hyperLiquidValidation.cjs";
12
12
  export * from "./idUtils.cjs";
13
13
  export * from "./marketDataTransform.cjs";
14
- export * from "./myxAdapter.cjs";
15
14
  export * from "./marketUtils.cjs";
16
15
  export * from "./orderCalculations.cjs";
17
16
  export * from "./rewardsUtils.cjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAE7B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,iCAA6B;AAC7B,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAGvB,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAE7B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAGvB,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC"}
@@ -11,7 +11,6 @@ export * from "./hyperLiquidOrderBookProcessor.mjs";
11
11
  export * from "./hyperLiquidValidation.mjs";
12
12
  export * from "./idUtils.mjs";
13
13
  export * from "./marketDataTransform.mjs";
14
- export * from "./myxAdapter.mjs";
15
14
  export * from "./marketUtils.mjs";
16
15
  export * from "./orderCalculations.mjs";
17
16
  export * from "./rewardsUtils.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAE7B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,iCAA6B;AAC7B,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAGvB,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAE7B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAGvB,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC"}
@@ -12,7 +12,6 @@ export * from "./hyperLiquidOrderBookProcessor.mjs";
12
12
  export * from "./hyperLiquidValidation.mjs";
13
13
  export * from "./idUtils.mjs";
14
14
  export * from "./marketDataTransform.mjs";
15
- export * from "./myxAdapter.mjs";
16
15
  export * from "./marketUtils.mjs";
17
16
  export * from "./orderCalculations.mjs";
18
17
  export * from "./rewardsUtils.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAC7B,mGAAmG;AACnG,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,EAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,iCAA6B;AAC7B,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAEvB,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAmB,EAAE;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,CAAC;IAC9D,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC","sourcesContent":["/**\n * Barrel re-export for all portable utilities in controllers/utils/\n *\n * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.\n * We use selective exports to avoid the name collision.\n */\nexport * from './accountUtils';\nexport * from './errorUtils';\n// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations\nexport {\n adaptOrderToSDK,\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptMarketFromSDK,\n adaptAccountStateFromSDK,\n buildAssetMapping,\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n calculateHip3AssetId,\n parseAssetName,\n adaptHyperLiquidLedgerUpdateToUserHistoryItem,\n} from './hyperLiquidAdapter';\nexport * from './hyperLiquidOrderBookProcessor';\nexport * from './hyperLiquidValidation';\nexport * from './idUtils';\nexport * from './marketDataTransform';\nexport * from './myxAdapter';\nexport * from './marketUtils';\nexport * from './orderCalculations';\nexport * from './rewardsUtils';\nexport * from './significantFigures';\nexport * from './sortMarkets';\nexport * from './standaloneInfoClient';\nexport * from './stringParseUtils';\nexport * from './transferData';\nexport * from './wait';\n\n// Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)\nexport const getEnvironment = (): 'DEV' | 'PROD' => {\n const env = globalThis.process?.env?.NODE_ENV ?? 'production';\n return env === 'production' ? 'PROD' : 'DEV';\n};\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAC7B,mGAAmG;AACnG,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,EAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAEvB,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAmB,EAAE;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,CAAC;IAC9D,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC","sourcesContent":["/**\n * Barrel re-export for all portable utilities in controllers/utils/\n *\n * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.\n * We use selective exports to avoid the name collision.\n */\nexport * from './accountUtils';\nexport * from './errorUtils';\n// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations\nexport {\n adaptOrderToSDK,\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptMarketFromSDK,\n adaptAccountStateFromSDK,\n buildAssetMapping,\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n calculateHip3AssetId,\n parseAssetName,\n adaptHyperLiquidLedgerUpdateToUserHistoryItem,\n} from './hyperLiquidAdapter';\nexport * from './hyperLiquidOrderBookProcessor';\nexport * from './hyperLiquidValidation';\nexport * from './idUtils';\nexport * from './marketDataTransform';\nexport * from './marketUtils';\nexport * from './orderCalculations';\nexport * from './rewardsUtils';\nexport * from './significantFigures';\nexport * from './sortMarkets';\nexport * from './standaloneInfoClient';\nexport * from './stringParseUtils';\nexport * from './transferData';\nexport * from './wait';\n\n// Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)\nexport const getEnvironment = (): 'DEV' | 'PROD' => {\n const env = globalThis.process?.env?.NODE_ENV ?? 'production';\n return env === 'production' ? 'PROD' : 'DEV';\n};\n"]}
@@ -7,6 +7,7 @@ exports.formatChange = exports.transformMarketData = exports.calculateOpenIntere
7
7
  * Portable: no mobile-specific imports.
8
8
  * Formatters are injected via MarketDataFormatters interface.
9
9
  */
10
+ const utils_1 = require("@metamask/utils");
10
11
  const hyperLiquidAdapter_1 = require("./hyperLiquidAdapter.cjs");
11
12
  const hyperLiquidConfig_1 = require("../constants/hyperLiquidConfig.cjs");
12
13
  const perpsConfig_1 = require("../constants/perpsConfig.cjs");
@@ -124,7 +125,7 @@ function transformMarketData(hyperLiquidData, formatters, assetMarketTypes) {
124
125
  const openInterest = calculateOpenInterestUSD(assetCtx?.openInterest, currentPrice);
125
126
  // Get current funding rate from assetCtx - this is the actual current funding rate
126
127
  let fundingRate;
127
- if (assetCtx && 'funding' in assetCtx) {
128
+ if (assetCtx && (0, utils_1.hasProperty)(assetCtx, 'funding')) {
128
129
  fundingRate = parseFloat(assetCtx.funding);
129
130
  }
130
131
  // Extract funding timing and predicted rate
@@ -1 +1 @@
1
- {"version":3,"file":"marketDataTransform.cjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Market data transformation utilities.\n *\n * Portable: no mobile-specific imports.\n * Formatters are injected via MarketDataFormatters interface.\n */\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type {\n PerpsMarketData,\n MarketType,\n MarketDataFormatters,\n} from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (openInterest === undefined || currentPrice === undefined) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change\n * Shows -100% when current price is missing but previous price exists\n *\n * @param params - The parameters for calculating the 24h change.\n * @returns The 24h percentage change value.\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param formatters - Injectable formatters for platform-agnostic formatting\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n formatters: MarketDataFormatters,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && 'funding' in assetCtx) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)\n // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)\n const isHip3 = Boolean(dex);\n\n // Determine market type from explicit mapping only\n // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')\n // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to \"New\" tab\n // Main DEX crypto also has no marketType\n const explicitMarketType = assetMarketTypes?.[symbol];\n const marketType: MarketType | undefined = explicitMarketType;\n\n // Mark as \"new\" if it's a HIP-3 market but not explicitly categorized\n // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet\n const isNewMarket = isHip3 && !explicitMarketType;\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatPerpsFiat(currentPrice, {\n ranges: formatters.priceRangesUniversal,\n }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h, formatters),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatters.formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n isHip3,\n isNewMarket,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @param formatters - Injectable formatters\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(\n change: number,\n formatters: MarketDataFormatters,\n): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatters.formatPerpsFiat(Math.abs(change), {\n ranges: formatters.priceRangesUniversal,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n"]}
1
+ {"version":3,"file":"marketDataTransform.cjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Market data transformation utilities.\n *\n * Portable: no mobile-specific imports.\n * Formatters are injected via MarketDataFormatters interface.\n */\nimport { hasProperty } from '@metamask/utils';\n\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type {\n PerpsMarketData,\n MarketType,\n MarketDataFormatters,\n} from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (openInterest === undefined || currentPrice === undefined) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change\n * Shows -100% when current price is missing but previous price exists\n *\n * @param params - The parameters for calculating the 24h change.\n * @returns The 24h percentage change value.\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param formatters - Injectable formatters for platform-agnostic formatting\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n formatters: MarketDataFormatters,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && hasProperty(assetCtx, 'funding')) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)\n // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)\n const isHip3 = Boolean(dex);\n\n // Determine market type from explicit mapping only\n // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')\n // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to \"New\" tab\n // Main DEX crypto also has no marketType\n const explicitMarketType = assetMarketTypes?.[symbol];\n const marketType: MarketType | undefined = explicitMarketType;\n\n // Mark as \"new\" if it's a HIP-3 market but not explicitly categorized\n // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet\n const isNewMarket = isHip3 && !explicitMarketType;\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatPerpsFiat(currentPrice, {\n ranges: formatters.priceRangesUniversal,\n }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h, formatters),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatters.formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n isHip3,\n isNewMarket,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @param formatters - Injectable formatters\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(\n change: number,\n formatters: MarketDataFormatters,\n): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatters.formatPerpsFiat(Math.abs(change), {\n ranges: formatters.priceRangesUniversal,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"marketDataTransform.d.cts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,2BAAiB;AAClB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CA6GnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CAeR"}
1
+ {"version":3,"file":"marketDataTransform.d.cts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,2BAAiB;AAClB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CA6GnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CAeR"}
@@ -1 +1 @@
1
- {"version":3,"file":"marketDataTransform.d.mts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,2BAAiB;AAClB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CA6GnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CAeR"}
1
+ {"version":3,"file":"marketDataTransform.d.mts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,2BAAiB;AAClB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CA6GnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CAeR"}
@@ -4,6 +4,7 @@
4
4
  * Portable: no mobile-specific imports.
5
5
  * Formatters are injected via MarketDataFormatters interface.
6
6
  */
7
+ import { hasProperty } from "@metamask/utils";
7
8
  import { parseAssetName } from "./hyperLiquidAdapter.mjs";
8
9
  import { HYPERLIQUID_CONFIG } from "../constants/hyperLiquidConfig.mjs";
9
10
  import { PERPS_CONSTANTS } from "../constants/perpsConfig.mjs";
@@ -120,7 +121,7 @@ export function transformMarketData(hyperLiquidData, formatters, assetMarketType
120
121
  const openInterest = calculateOpenInterestUSD(assetCtx?.openInterest, currentPrice);
121
122
  // Get current funding rate from assetCtx - this is the actual current funding rate
122
123
  let fundingRate;
123
- if (assetCtx && 'funding' in assetCtx) {
124
+ if (assetCtx && hasProperty(assetCtx, 'funding')) {
124
125
  fundingRate = parseFloat(assetCtx.funding);
125
126
  }
126
127
  // Extract funding timing and predicted rate
@@ -1 +1 @@
1
- {"version":3,"file":"marketDataTransform.mjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Market data transformation utilities.\n *\n * Portable: no mobile-specific imports.\n * Formatters are injected via MarketDataFormatters interface.\n */\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type {\n PerpsMarketData,\n MarketType,\n MarketDataFormatters,\n} from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (openInterest === undefined || currentPrice === undefined) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change\n * Shows -100% when current price is missing but previous price exists\n *\n * @param params - The parameters for calculating the 24h change.\n * @returns The 24h percentage change value.\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param formatters - Injectable formatters for platform-agnostic formatting\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n formatters: MarketDataFormatters,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && 'funding' in assetCtx) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)\n // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)\n const isHip3 = Boolean(dex);\n\n // Determine market type from explicit mapping only\n // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')\n // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to \"New\" tab\n // Main DEX crypto also has no marketType\n const explicitMarketType = assetMarketTypes?.[symbol];\n const marketType: MarketType | undefined = explicitMarketType;\n\n // Mark as \"new\" if it's a HIP-3 market but not explicitly categorized\n // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet\n const isNewMarket = isHip3 && !explicitMarketType;\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatPerpsFiat(currentPrice, {\n ranges: formatters.priceRangesUniversal,\n }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h, formatters),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatters.formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n isHip3,\n isNewMarket,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @param formatters - Injectable formatters\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(\n change: number,\n formatters: MarketDataFormatters,\n): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatters.formatPerpsFiat(Math.abs(change), {\n ranges: formatters.priceRangesUniversal,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n"]}
1
+ {"version":3,"file":"marketDataTransform.mjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Market data transformation utilities.\n *\n * Portable: no mobile-specific imports.\n * Formatters are injected via MarketDataFormatters interface.\n */\nimport { hasProperty } from '@metamask/utils';\n\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type {\n PerpsMarketData,\n MarketType,\n MarketDataFormatters,\n} from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (openInterest === undefined || currentPrice === undefined) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change\n * Shows -100% when current price is missing but previous price exists\n *\n * @param params - The parameters for calculating the 24h change.\n * @returns The 24h percentage change value.\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param formatters - Injectable formatters for platform-agnostic formatting\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n formatters: MarketDataFormatters,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && hasProperty(assetCtx, 'funding')) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)\n // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)\n const isHip3 = Boolean(dex);\n\n // Determine market type from explicit mapping only\n // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')\n // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to \"New\" tab\n // Main DEX crypto also has no marketType\n const explicitMarketType = assetMarketTypes?.[symbol];\n const marketType: MarketType | undefined = explicitMarketType;\n\n // Mark as \"new\" if it's a HIP-3 market but not explicitly categorized\n // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet\n const isNewMarket = isHip3 && !explicitMarketType;\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatPerpsFiat(currentPrice, {\n ranges: formatters.priceRangesUniversal,\n }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h, formatters),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatters.formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n isHip3,\n isNewMarket,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @param formatters - Injectable formatters\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(\n change: number,\n formatters: MarketDataFormatters,\n): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatters.formatPerpsFiat(Math.abs(change), {\n ranges: formatters.priceRangesUniversal,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n"]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withPerpsConnectionAttemptContext = exports.getPerpsConnectionAttemptContext = void 0;
4
+ let currentAttemptContext = null;
5
+ function getPerpsConnectionAttemptContext() {
6
+ return currentAttemptContext;
7
+ }
8
+ exports.getPerpsConnectionAttemptContext = getPerpsConnectionAttemptContext;
9
+ async function withPerpsConnectionAttemptContext(context, callback) {
10
+ const previousContext = currentAttemptContext;
11
+ currentAttemptContext = context;
12
+ try {
13
+ return await callback();
14
+ }
15
+ finally {
16
+ currentAttemptContext = previousContext;
17
+ }
18
+ }
19
+ exports.withPerpsConnectionAttemptContext = withPerpsConnectionAttemptContext;
20
+ //# sourceMappingURL=perpsConnectionAttemptContext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perpsConnectionAttemptContext.cjs","sourceRoot":"","sources":["../../src/utils/perpsConnectionAttemptContext.ts"],"names":[],"mappings":";;;AAKA,IAAI,qBAAqB,GAAyC,IAAI,CAAC;AAEvE,SAAgB,gCAAgC;IAC9C,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAFD,4EAEC;AAEM,KAAK,UAAU,iCAAiC,CACrD,OAAsC,EACtC,QAAkC;IAElC,MAAM,eAAe,GAAG,qBAAqB,CAAC;IAC9C,qBAAqB,GAAG,OAAO,CAAC;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,EAAE,CAAC;IAC1B,CAAC;YAAS,CAAC;QACT,qBAAqB,GAAG,eAAe,CAAC;IAC1C,CAAC;AACH,CAAC;AAZD,8EAYC","sourcesContent":["export type PerpsConnectionAttemptContext = {\n source: string;\n suppressError: boolean;\n};\n\nlet currentAttemptContext: PerpsConnectionAttemptContext | null = null;\n\nexport function getPerpsConnectionAttemptContext(): PerpsConnectionAttemptContext | null {\n return currentAttemptContext;\n}\n\nexport async function withPerpsConnectionAttemptContext<ValueType>(\n context: PerpsConnectionAttemptContext,\n callback: () => Promise<ValueType>,\n): Promise<ValueType> {\n const previousContext = currentAttemptContext;\n currentAttemptContext = context;\n\n try {\n return await callback();\n } finally {\n currentAttemptContext = previousContext;\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export type PerpsConnectionAttemptContext = {
2
+ source: string;
3
+ suppressError: boolean;
4
+ };
5
+ export declare function getPerpsConnectionAttemptContext(): PerpsConnectionAttemptContext | null;
6
+ export declare function withPerpsConnectionAttemptContext<ValueType>(context: PerpsConnectionAttemptContext, callback: () => Promise<ValueType>): Promise<ValueType>;
7
+ //# sourceMappingURL=perpsConnectionAttemptContext.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perpsConnectionAttemptContext.d.cts","sourceRoot":"","sources":["../../src/utils/perpsConnectionAttemptContext.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAIF,wBAAgB,gCAAgC,IAAI,6BAA6B,GAAG,IAAI,CAEvF;AAED,wBAAsB,iCAAiC,CAAC,SAAS,EAC/D,OAAO,EAAE,6BAA6B,EACtC,QAAQ,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GACjC,OAAO,CAAC,SAAS,CAAC,CASpB"}
@@ -0,0 +1,7 @@
1
+ export type PerpsConnectionAttemptContext = {
2
+ source: string;
3
+ suppressError: boolean;
4
+ };
5
+ export declare function getPerpsConnectionAttemptContext(): PerpsConnectionAttemptContext | null;
6
+ export declare function withPerpsConnectionAttemptContext<ValueType>(context: PerpsConnectionAttemptContext, callback: () => Promise<ValueType>): Promise<ValueType>;
7
+ //# sourceMappingURL=perpsConnectionAttemptContext.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perpsConnectionAttemptContext.d.mts","sourceRoot":"","sources":["../../src/utils/perpsConnectionAttemptContext.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAIF,wBAAgB,gCAAgC,IAAI,6BAA6B,GAAG,IAAI,CAEvF;AAED,wBAAsB,iCAAiC,CAAC,SAAS,EAC/D,OAAO,EAAE,6BAA6B,EACtC,QAAQ,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GACjC,OAAO,CAAC,SAAS,CAAC,CASpB"}
@@ -0,0 +1,15 @@
1
+ let currentAttemptContext = null;
2
+ export function getPerpsConnectionAttemptContext() {
3
+ return currentAttemptContext;
4
+ }
5
+ export async function withPerpsConnectionAttemptContext(context, callback) {
6
+ const previousContext = currentAttemptContext;
7
+ currentAttemptContext = context;
8
+ try {
9
+ return await callback();
10
+ }
11
+ finally {
12
+ currentAttemptContext = previousContext;
13
+ }
14
+ }
15
+ //# sourceMappingURL=perpsConnectionAttemptContext.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perpsConnectionAttemptContext.mjs","sourceRoot":"","sources":["../../src/utils/perpsConnectionAttemptContext.ts"],"names":[],"mappings":"AAKA,IAAI,qBAAqB,GAAyC,IAAI,CAAC;AAEvE,MAAM,UAAU,gCAAgC;IAC9C,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAAsC,EACtC,QAAkC;IAElC,MAAM,eAAe,GAAG,qBAAqB,CAAC;IAC9C,qBAAqB,GAAG,OAAO,CAAC;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,EAAE,CAAC;IAC1B,CAAC;YAAS,CAAC;QACT,qBAAqB,GAAG,eAAe,CAAC;IAC1C,CAAC;AACH,CAAC","sourcesContent":["export type PerpsConnectionAttemptContext = {\n source: string;\n suppressError: boolean;\n};\n\nlet currentAttemptContext: PerpsConnectionAttemptContext | null = null;\n\nexport function getPerpsConnectionAttemptContext(): PerpsConnectionAttemptContext | null {\n return currentAttemptContext;\n}\n\nexport async function withPerpsConnectionAttemptContext<ValueType>(\n context: PerpsConnectionAttemptContext,\n callback: () => Promise<ValueType>,\n): Promise<ValueType> {\n const previousContext = currentAttemptContext;\n currentAttemptContext = context;\n\n try {\n return await callback();\n } finally {\n currentAttemptContext = previousContext;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/perps-controller",
3
- "version": "2.0.0-preview-a37be9342",
3
+ "version": "2.0.0-preview-26cb9fc",
4
4
  "description": "Controller for perpetual trading functionality in MetaMask",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -57,7 +57,6 @@
57
57
  "@metamask/controller-utils": "^11.20.0",
58
58
  "@metamask/messenger": "^1.1.1",
59
59
  "@metamask/utils": "^11.9.0",
60
- "@myx-trade/sdk": "^0.1.265",
61
60
  "@nktkas/hyperliquid": "^0.30.2",
62
61
  "bignumber.js": "^9.1.2",
63
62
  "reselect": "^5.1.1",
@@ -84,6 +83,9 @@
84
83
  "typedoc-plugin-missing-exports": "^2.0.0",
85
84
  "typescript": "~5.3.3"
86
85
  },
86
+ "optionalDependencies": {
87
+ "@myx-trade/sdk": "^0.1.265"
88
+ },
87
89
  "engines": {
88
90
  "node": "^18.18 || >=20"
89
91
  },