@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
@@ -2,6 +2,7 @@
2
2
  * Shared transaction types for Perps deposits and withdrawals
3
3
  * Provides a unified structure while maintaining separate use cases
4
4
  */
5
+ import { hasProperty } from "@metamask/utils";
5
6
  /**
6
7
  * Type guard to check if a transaction result is a TransactionRecord
7
8
  *
@@ -9,7 +10,7 @@
9
10
  * @returns True if the result is a TransactionRecord with id and status fields.
10
11
  */
11
12
  export function isTransactionRecord(result) {
12
- return 'id' in result && 'status' in result;
13
+ return hasProperty(result, 'id') && hasProperty(result, 'status');
13
14
  }
14
15
  /**
15
16
  * Type guard to check if a transaction result is a LastTransactionResult
@@ -18,6 +19,6 @@ export function isTransactionRecord(result) {
18
19
  * @returns True if the result is a LastTransactionResult without id or status fields.
19
20
  */
20
21
  export function isLastTransactionResult(result) {
21
- return !('id' in result) || !('status' in result);
22
+ return !hasProperty(result, 'id') || !hasProperty(result, 'status');
22
23
  }
23
24
  //# sourceMappingURL=transactionTypes.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionTypes.mjs","sourceRoot":"","sources":["../../src/types/transactionTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoDH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiD;IAEjD,OAAO,IAAI,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAiD;IAEjD,OAAO,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;AACpD,CAAC","sourcesContent":["/**\n * Shared transaction types for Perps deposits and withdrawals\n * Provides a unified structure while maintaining separate use cases\n */\n\n/**\n * Base type with core properties shared between all transaction results\n * All properties are JSON serializable for controller state compatibility\n */\nexport type BaseTransactionResult = {\n amount: string;\n asset: string;\n txHash?: string;\n timestamp: number;\n success: boolean; // explicit to avoid regressions\n};\n\n/**\n * For transient UI feedback (toasts, progress indicators)\n * Used for immediate success/failure notifications\n * JSON serializable for controller state\n */\nexport type LastTransactionResult = {\n amount: string;\n asset: string;\n txHash: string;\n timestamp: number;\n success: boolean;\n error: string;\n [key: string]: string | number | boolean;\n};\n\n/**\n * For persistent transaction history tracking\n * Used for transaction history display and detailed status tracking\n * JSON serializable for controller state\n */\nexport type TransactionStatus = 'pending' | 'bridging' | 'completed' | 'failed';\n\nexport type TransactionRecord = {\n id: string;\n amount: string;\n asset: string;\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string; // mainly for withdrawals\n source?: string; // mainly for deposits\n transactionId?: string; // generic - could be withdrawalId or depositId\n // Legacy fields for backward compatibility\n withdrawalId?: string; // for withdrawals\n depositId?: string; // for deposits\n};\n\n/**\n * Type guard to check if a transaction result is a TransactionRecord\n *\n * @param result - The transaction result to check.\n * @returns True if the result is a TransactionRecord with id and status fields.\n */\nexport function isTransactionRecord(\n result: LastTransactionResult | TransactionRecord,\n): result is TransactionRecord {\n return 'id' in result && 'status' in result;\n}\n\n/**\n * Type guard to check if a transaction result is a LastTransactionResult\n *\n * @param result - The transaction result to check.\n * @returns True if the result is a LastTransactionResult without id or status fields.\n */\nexport function isLastTransactionResult(\n result: LastTransactionResult | TransactionRecord,\n): result is LastTransactionResult {\n return !('id' in result) || !('status' in result);\n}\n"]}
1
+ {"version":3,"file":"transactionTypes.mjs","sourceRoot":"","sources":["../../src/types/transactionTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,wBAAwB;AAoD9C;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiD;IAEjD,OAAO,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAiD;IAEjD,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACtE,CAAC","sourcesContent":["/**\n * Shared transaction types for Perps deposits and withdrawals\n * Provides a unified structure while maintaining separate use cases\n */\nimport { hasProperty } from '@metamask/utils';\n\n/**\n * Base type with core properties shared between all transaction results\n * All properties are JSON serializable for controller state compatibility\n */\nexport type BaseTransactionResult = {\n amount: string;\n asset: string;\n txHash?: string;\n timestamp: number;\n success: boolean; // explicit to avoid regressions\n};\n\n/**\n * For transient UI feedback (toasts, progress indicators)\n * Used for immediate success/failure notifications\n * JSON serializable for controller state\n */\nexport type LastTransactionResult = {\n amount: string;\n asset: string;\n txHash: string;\n timestamp: number;\n success: boolean;\n error: string;\n [key: string]: string | number | boolean;\n};\n\n/**\n * For persistent transaction history tracking\n * Used for transaction history display and detailed status tracking\n * JSON serializable for controller state\n */\nexport type TransactionStatus = 'pending' | 'bridging' | 'completed' | 'failed';\n\nexport type TransactionRecord = {\n id: string;\n amount: string;\n asset: string;\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string; // mainly for withdrawals\n source?: string; // mainly for deposits\n transactionId?: string; // generic - could be withdrawalId or depositId\n // Legacy fields for backward compatibility\n withdrawalId?: string; // for withdrawals\n depositId?: string; // for deposits\n};\n\n/**\n * Type guard to check if a transaction result is a TransactionRecord\n *\n * @param result - The transaction result to check.\n * @returns True if the result is a TransactionRecord with id and status fields.\n */\nexport function isTransactionRecord(\n result: LastTransactionResult | TransactionRecord,\n): result is TransactionRecord {\n return hasProperty(result, 'id') && hasProperty(result, 'status');\n}\n\n/**\n * Type guard to check if a transaction result is a LastTransactionResult\n *\n * @param result - The transaction result to check.\n * @returns True if the result is a LastTransactionResult without id or status fields.\n */\nexport function isLastTransactionResult(\n result: LastTransactionResult | TransactionRecord,\n): result is LastTransactionResult {\n return !hasProperty(result, 'id') || !hasProperty(result, 'status');\n}\n"]}
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureError = void 0;
2
4
  /**
3
5
  * Utility functions for error handling across the application.
4
6
  * These are general-purpose utilities, not domain-specific.
5
7
  */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ensureError = void 0;
8
+ const utils_1 = require("@metamask/utils");
8
9
  /**
9
10
  * Ensures we have a proper Error object for logging.
10
11
  * Converts unknown/string errors to proper Error instances.
@@ -27,7 +28,7 @@ function ensureError(error, context) {
27
28
  if (typeof error === 'string') {
28
29
  return new Error(error);
29
30
  }
30
- return new Error(typeof error === 'object' && error !== null && 'message' in error
31
+ return new Error(typeof error === 'object' && error !== null && (0, utils_1.hasProperty)(error, 'message')
31
32
  ? String(error.message)
32
33
  : 'Unknown error');
33
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errorUtils.cjs","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;;;;;GAQG;AACH,SAAgB,WAAW,CAAC,KAAc,EAAE,OAAgB;IAC1D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8DAA8D;IAC9D,oFAAoF;IACpF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,qCAAqC,CAAC;QAC1D,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,KAAK,CACd,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;QAC/D,CAAC,CAAC,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC;AAlBD,kCAkBC","sourcesContent":["/**\n * Utility functions for error handling across the application.\n * These are general-purpose utilities, not domain-specific.\n */\n\n/**\n * Ensures we have a proper Error object for logging.\n * Converts unknown/string errors to proper Error instances.\n * Handles undefined/null specially for better Sentry context.\n *\n * @param error - The caught error (could be Error, string, or unknown)\n * @param context - Optional context string to help identify the source of the error\n * @returns A proper Error instance\n */\nexport function ensureError(error: unknown, context?: string): Error {\n if (error instanceof Error) {\n return error;\n }\n // Handle undefined/null specifically for better error context\n // e.g. Hyperliquid SDK may reject with undefined when AbortSignal.reason is not set\n if (error === undefined || error === null) {\n const baseMessage = 'Unknown error (no details provided)';\n return new Error(context ? `${baseMessage} [${context}]` : baseMessage);\n }\n if (typeof error === 'string') {\n return new Error(error);\n }\n return new Error(\n typeof error === 'object' && error !== null && 'message' in error\n ? String((error as { message: unknown }).message)\n : 'Unknown error',\n );\n}\n"]}
1
+ {"version":3,"file":"errorUtils.cjs","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,2CAA8C;AAE9C;;;;;;;;GAQG;AACH,SAAgB,WAAW,CAAC,KAAc,EAAE,OAAgB;IAC1D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8DAA8D;IAC9D,oFAAoF;IACpF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,qCAAqC,CAAC;QAC1D,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,KAAK,CACd,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,IAAA,mBAAW,EAAC,KAAK,EAAE,SAAS,CAAC;QAC1E,CAAC,CAAC,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC;AAlBD,kCAkBC","sourcesContent":["/**\n * Utility functions for error handling across the application.\n * These are general-purpose utilities, not domain-specific.\n */\nimport { hasProperty } from '@metamask/utils';\n\n/**\n * Ensures we have a proper Error object for logging.\n * Converts unknown/string errors to proper Error instances.\n * Handles undefined/null specially for better Sentry context.\n *\n * @param error - The caught error (could be Error, string, or unknown)\n * @param context - Optional context string to help identify the source of the error\n * @returns A proper Error instance\n */\nexport function ensureError(error: unknown, context?: string): Error {\n if (error instanceof Error) {\n return error;\n }\n // Handle undefined/null specifically for better error context\n // e.g. Hyperliquid SDK may reject with undefined when AbortSignal.reason is not set\n if (error === undefined || error === null) {\n const baseMessage = 'Unknown error (no details provided)';\n return new Error(context ? `${baseMessage} [${context}]` : baseMessage);\n }\n if (typeof error === 'string') {\n return new Error(error);\n }\n return new Error(\n typeof error === 'object' && error !== null && hasProperty(error, 'message')\n ? String((error as { message: unknown }).message)\n : 'Unknown error',\n );\n}\n"]}
@@ -1,7 +1,3 @@
1
- /**
2
- * Utility functions for error handling across the application.
3
- * These are general-purpose utilities, not domain-specific.
4
- */
5
1
  /**
6
2
  * Ensures we have a proper Error object for logging.
7
3
  * Converts unknown/string errors to proper Error instances.
@@ -1 +1 @@
1
- {"version":3,"file":"errorUtils.d.cts","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAkBnE"}
1
+ {"version":3,"file":"errorUtils.d.cts","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAkBnE"}
@@ -1,7 +1,3 @@
1
- /**
2
- * Utility functions for error handling across the application.
3
- * These are general-purpose utilities, not domain-specific.
4
- */
5
1
  /**
6
2
  * Ensures we have a proper Error object for logging.
7
3
  * Converts unknown/string errors to proper Error instances.
@@ -1 +1 @@
1
- {"version":3,"file":"errorUtils.d.mts","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAkBnE"}
1
+ {"version":3,"file":"errorUtils.d.mts","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAkBnE"}
@@ -2,6 +2,7 @@
2
2
  * Utility functions for error handling across the application.
3
3
  * These are general-purpose utilities, not domain-specific.
4
4
  */
5
+ import { hasProperty } from "@metamask/utils";
5
6
  /**
6
7
  * Ensures we have a proper Error object for logging.
7
8
  * Converts unknown/string errors to proper Error instances.
@@ -24,7 +25,7 @@ export function ensureError(error, context) {
24
25
  if (typeof error === 'string') {
25
26
  return new Error(error);
26
27
  }
27
- return new Error(typeof error === 'object' && error !== null && 'message' in error
28
+ return new Error(typeof error === 'object' && error !== null && hasProperty(error, 'message')
28
29
  ? String(error.message)
29
30
  : 'Unknown error');
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errorUtils.mjs","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,OAAgB;IAC1D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8DAA8D;IAC9D,oFAAoF;IACpF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,qCAAqC,CAAC;QAC1D,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,KAAK,CACd,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;QAC/D,CAAC,CAAC,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Utility functions for error handling across the application.\n * These are general-purpose utilities, not domain-specific.\n */\n\n/**\n * Ensures we have a proper Error object for logging.\n * Converts unknown/string errors to proper Error instances.\n * Handles undefined/null specially for better Sentry context.\n *\n * @param error - The caught error (could be Error, string, or unknown)\n * @param context - Optional context string to help identify the source of the error\n * @returns A proper Error instance\n */\nexport function ensureError(error: unknown, context?: string): Error {\n if (error instanceof Error) {\n return error;\n }\n // Handle undefined/null specifically for better error context\n // e.g. Hyperliquid SDK may reject with undefined when AbortSignal.reason is not set\n if (error === undefined || error === null) {\n const baseMessage = 'Unknown error (no details provided)';\n return new Error(context ? `${baseMessage} [${context}]` : baseMessage);\n }\n if (typeof error === 'string') {\n return new Error(error);\n }\n return new Error(\n typeof error === 'object' && error !== null && 'message' in error\n ? String((error as { message: unknown }).message)\n : 'Unknown error',\n );\n}\n"]}
1
+ {"version":3,"file":"errorUtils.mjs","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,wBAAwB;AAE9C;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,OAAgB;IAC1D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8DAA8D;IAC9D,oFAAoF;IACpF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,qCAAqC,CAAC;QAC1D,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,KAAK,CACd,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QAC1E,CAAC,CAAC,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC;QACjD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Utility functions for error handling across the application.\n * These are general-purpose utilities, not domain-specific.\n */\nimport { hasProperty } from '@metamask/utils';\n\n/**\n * Ensures we have a proper Error object for logging.\n * Converts unknown/string errors to proper Error instances.\n * Handles undefined/null specially for better Sentry context.\n *\n * @param error - The caught error (could be Error, string, or unknown)\n * @param context - Optional context string to help identify the source of the error\n * @returns A proper Error instance\n */\nexport function ensureError(error: unknown, context?: string): Error {\n if (error instanceof Error) {\n return error;\n }\n // Handle undefined/null specifically for better error context\n // e.g. Hyperliquid SDK may reject with undefined when AbortSignal.reason is not set\n if (error === undefined || error === null) {\n const baseMessage = 'Unknown error (no details provided)';\n return new Error(context ? `${baseMessage} [${context}]` : baseMessage);\n }\n if (typeof error === 'string') {\n return new Error(error);\n }\n return new Error(\n typeof error === 'object' && error !== null && hasProperty(error, 'message')\n ? String((error as { message: unknown }).message)\n : 'Unknown error',\n );\n}\n"]}
@@ -302,10 +302,11 @@ function adaptHyperLiquidLedgerUpdateToUserHistoryItem(rawLedgerUpdates) {
302
302
  .map((update) => {
303
303
  let amount = '0';
304
304
  let asset = 'USDC';
305
- if ('usdc' in update.delta && update.delta.usdc) {
305
+ if ((0, utils_1.hasProperty)(update.delta, 'usdc') && update.delta.usdc) {
306
306
  amount = Math.abs(parseFloat(update.delta.usdc)).toString();
307
307
  }
308
- if ('coin' in update.delta && typeof update.delta.coin === 'string') {
308
+ if ((0, utils_1.hasProperty)(update.delta, 'coin') &&
309
+ typeof update.delta.coin === 'string') {
309
310
  asset = update.delta.coin;
310
311
  }
311
312
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidAdapter.cjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hex, isHexString } from '@metamask/utils';\n\nimport {\n countSignificantFigures,\n roundToSignificantFigures,\n} from './significantFigures';\nimport { HIP3_ASSET_ID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { DECIMAL_PRECISION_CONFIG } from '../constants/perpsConfig';\nimport type {\n AccountState,\n MarketInfo,\n Order,\n OrderParams as PerpsOrderParams,\n Position,\n RawLedgerUpdate,\n UserHistoryItem,\n} from '../types';\nimport type {\n AssetPosition,\n FrontendOrder,\n ClearinghouseStateResponse,\n SpotClearinghouseStateResponse,\n MetaResponse,\n SDKOrderParams,\n} from '../types/hyperliquid-types';\n\ntype FrontendOrderWithParentTpsl = FrontendOrder & {\n takeProfitPrice?: unknown;\n stopLossPrice?: unknown;\n takeProfitOrderId?: unknown;\n stopLossOrderId?: unknown;\n};\n\nconst readOptionalString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined;\n\nconst readOptionalOrderId = (value: unknown): string | undefined => {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value.toString();\n }\n\n return undefined;\n};\n\nconst getParentTpslMetadata = (\n rawOrder: FrontendOrderWithParentTpsl,\n): {\n takeProfitPrice?: string;\n stopLossPrice?: string;\n takeProfitOrderId?: string;\n stopLossOrderId?: string;\n} => ({\n takeProfitPrice: readOptionalString(rawOrder.takeProfitPrice),\n stopLossPrice: readOptionalString(rawOrder.stopLossPrice),\n takeProfitOrderId: readOptionalOrderId(rawOrder.takeProfitOrderId),\n stopLossOrderId: readOptionalOrderId(rawOrder.stopLossOrderId),\n});\n\n/**\n * HyperLiquid SDK Adapter Utilities\n *\n * These functions transform between MetaMask Perps API types and HyperLiquid SDK types.\n * The SDK uses cryptic property names for efficiency, but our API uses descriptive names\n * to provide a consistent interface across different perps protocols.\n */\n\nexport function adaptOrderToSDK(\n order: PerpsOrderParams,\n symbolToAssetId: Map<string, number>,\n): SDKOrderParams {\n const assetId = symbolToAssetId.get(order.symbol);\n if (assetId === undefined) {\n const availableDexs = new Set<string>();\n symbolToAssetId.forEach((_, symbol) => {\n if (symbol.includes(':')) {\n const dex = symbol.split(':')[0];\n availableDexs.add(dex);\n }\n });\n\n const dexHint =\n availableDexs.size > 0\n ? ` Available HIP-3 DEXs: ${Array.from(availableDexs).join(', ')}`\n : ' No HIP-3 DEXs currently available.';\n\n throw new Error(\n `Asset ${order.symbol} not found in asset mapping.${dexHint} Check console logs for \"HyperLiquidProvider: Asset mapping built\" to see available assets.`,\n );\n }\n\n return {\n a: assetId,\n b: order.isBuy,\n p: order.price ?? '0',\n s: order.size,\n r: order.reduceOnly ?? false,\n t:\n order.orderType === 'limit'\n ? {\n limit: { tif: 'Gtc' },\n }\n : {\n limit: { tif: 'FrontendMarket' },\n },\n c:\n order.clientOrderId && isHexString(order.clientOrderId)\n ? (order.clientOrderId as Hex)\n : undefined,\n };\n}\n\nexport function adaptPositionFromSDK(assetPosition: AssetPosition): Position {\n const pos = assetPosition.position;\n return {\n symbol: pos.coin,\n size: pos.szi,\n entryPrice: pos.entryPx,\n positionValue: pos.positionValue,\n unrealizedPnl: pos.unrealizedPnl,\n marginUsed: pos.marginUsed,\n leverage: {\n type: pos.leverage.type,\n value: pos.leverage.value,\n rawUsd:\n pos.leverage.type === 'isolated' ? pos.leverage.rawUsd : undefined,\n },\n liquidationPrice: pos.liquidationPx,\n maxLeverage: pos.maxLeverage,\n returnOnEquity: pos.returnOnEquity,\n cumulativeFunding: pos.cumFunding,\n takeProfitCount: 0,\n stopLossCount: 0,\n };\n}\n\nexport function adaptOrderFromSDK(\n rawOrder: FrontendOrder,\n position?: Position,\n): Order {\n // TODO: Remove this widened boundary type when FrontendOrder includes\n // takeProfitPrice/stopLossPrice and takeProfitOrderId/stopLossOrderId.\n const parentTpslMetadata = getParentTpslMetadata(\n rawOrder as FrontendOrderWithParentTpsl,\n );\n\n // Extract basic fields with appropriate conversions\n const orderId = rawOrder.oid.toString();\n const symbol = rawOrder.coin;\n const side: 'buy' | 'sell' = rawOrder.side === 'B' ? 'buy' : 'sell';\n const detailedOrderType = rawOrder.orderType;\n const { isTrigger } = rawOrder;\n const { reduceOnly } = rawOrder;\n\n let orderType: 'limit' | 'market' = 'market';\n if (detailedOrderType.toLowerCase().includes('limit') || rawOrder.limitPx) {\n orderType = 'limit';\n }\n\n const price = rawOrder.limitPx || rawOrder.triggerPx || '0';\n\n let size = rawOrder.sz;\n let originalSize = rawOrder.origSz || size;\n\n let currentSize = parseFloat(size);\n let origSize = parseFloat(originalSize);\n\n if (rawOrder.isPositionTpsl && origSize === 0 && position) {\n const absPositionSize = Math.abs(parseFloat(position.size));\n currentSize = absPositionSize;\n origSize = absPositionSize;\n size = absPositionSize.toString();\n originalSize = absPositionSize.toString();\n }\n\n const filledSize = origSize - currentSize;\n\n let takeProfitPrice: string | undefined;\n let stopLossPrice: string | undefined;\n let takeProfitOrderId: string | undefined;\n let stopLossOrderId: string | undefined;\n\n // TODO: We assume that there can only be 1 TP and 1 SL as children but there can be several TPSLs as children\n if (rawOrder.children && rawOrder.children.length > 0) {\n rawOrder.children.forEach((childUnknown) => {\n const child = childUnknown as FrontendOrder;\n if (child.isTrigger && child.orderType) {\n if (child.orderType.includes('Take Profit')) {\n takeProfitPrice = child.triggerPx || child.limitPx;\n takeProfitOrderId = child.oid.toString();\n } else if (child.orderType.includes('Stop')) {\n stopLossPrice = child.triggerPx || child.limitPx;\n stopLossOrderId = child.oid.toString();\n }\n }\n });\n }\n\n // Fallback: preserve parent-level TP/SL metadata when children are absent.\n takeProfitPrice ??= parentTpslMetadata.takeProfitPrice;\n stopLossPrice ??= parentTpslMetadata.stopLossPrice;\n takeProfitOrderId ??= parentTpslMetadata.takeProfitOrderId;\n stopLossOrderId ??= parentTpslMetadata.stopLossOrderId;\n\n // Build the order object\n const order: Order = {\n orderId,\n symbol,\n side,\n orderType,\n size,\n originalSize,\n price,\n filledSize: filledSize.toString(),\n remainingSize: size,\n status: 'open' as const,\n timestamp: rawOrder.timestamp,\n detailedOrderType,\n isTrigger,\n reduceOnly,\n };\n\n if (typeof rawOrder.isPositionTpsl === 'boolean') {\n order.isPositionTpsl = rawOrder.isPositionTpsl;\n }\n\n if (takeProfitPrice) {\n order.takeProfitPrice = takeProfitPrice;\n order.takeProfitOrderId = takeProfitOrderId;\n }\n if (stopLossPrice) {\n order.stopLossPrice = stopLossPrice;\n order.stopLossOrderId = stopLossOrderId;\n }\n if (rawOrder.triggerPx) {\n order.triggerPrice = rawOrder.triggerPx;\n }\n\n return order;\n}\n\nexport function adaptMarketFromSDK(\n sdkMarket: MetaResponse['universe'][number],\n): MarketInfo {\n return {\n name: sdkMarket.name,\n szDecimals: sdkMarket.szDecimals,\n maxLeverage: sdkMarket.maxLeverage,\n marginTableId: sdkMarket.marginTableId,\n onlyIsolated: sdkMarket.onlyIsolated,\n isDelisted: sdkMarket.isDelisted,\n };\n}\n\nexport function adaptAccountStateFromSDK(\n perpsState: ClearinghouseStateResponse,\n spotState?: SpotClearinghouseStateResponse | null,\n): AccountState {\n const { totalUnrealizedPnl, weightedReturnOnEquity } =\n perpsState.assetPositions.reduce(\n (acc, assetPos: AssetPosition) => {\n const unrealizedPnl = parseFloat(\n assetPos.position.unrealizedPnl || '0',\n );\n const marginUsed = parseFloat(assetPos.position.marginUsed || '0');\n const returnOnEquity = parseFloat(\n assetPos.position.returnOnEquity || '0',\n );\n acc.totalUnrealizedPnl += unrealizedPnl;\n acc.weightedReturnOnEquity += returnOnEquity * marginUsed;\n return acc;\n },\n {\n totalUnrealizedPnl: 0,\n weightedReturnOnEquity: 0,\n },\n );\n const totalMarginUsed = parseFloat(\n perpsState.marginSummary.totalMarginUsed || '0',\n );\n const totalReturnOnEquityPercentage =\n totalMarginUsed > 0\n ? ((weightedReturnOnEquity / totalMarginUsed) * 100).toString()\n : '0';\n\n const perpsBalance = parseFloat(perpsState.marginSummary.accountValue);\n\n let spotBalance = 0;\n if (spotState?.balances && Array.isArray(spotState.balances)) {\n spotBalance = spotState.balances.reduce(\n (sum: number, balance: { total?: string }) =>\n sum + parseFloat(balance.total ?? '0'),\n 0,\n );\n }\n\n const totalBalance = (spotBalance + perpsBalance).toString();\n\n const accountState: AccountState = {\n availableBalance: perpsState.withdrawable || '0',\n totalBalance: totalBalance || '0',\n marginUsed: perpsState.marginSummary.totalMarginUsed || '0',\n unrealizedPnl: totalUnrealizedPnl.toString() || '0',\n returnOnEquity: totalReturnOnEquityPercentage || '0',\n };\n\n return accountState;\n}\n\nexport function buildAssetMapping(params: {\n metaUniverse: MetaResponse['universe'];\n dex?: string | null;\n perpDexIndex: number;\n}): {\n symbolToAssetId: Map<string, number>;\n assetIdToSymbol: Map<number, string>;\n} {\n const { metaUniverse, perpDexIndex } = params;\n const symbolToAssetId = new Map<string, number>();\n const assetIdToSymbol = new Map<number, string>();\n\n metaUniverse.forEach((asset, index) => {\n const assetId = calculateHip3AssetId(perpDexIndex, index);\n symbolToAssetId.set(asset.name, assetId);\n assetIdToSymbol.set(assetId, asset.name);\n });\n\n return { symbolToAssetId, assetIdToSymbol };\n}\n\nexport function formatHyperLiquidPrice(params: {\n price: string | number;\n szDecimals: number;\n}): string {\n const { price, szDecimals } = params;\n const priceNum = typeof price === 'string' ? parseFloat(price) : price;\n\n if (Number.isInteger(priceNum)) {\n return priceNum.toString();\n }\n\n const maxDecimalPlaces =\n DECIMAL_PRECISION_CONFIG.MaxPriceDecimals - szDecimals;\n\n let formattedPrice = priceNum.toFixed(maxDecimalPlaces);\n formattedPrice = parseFloat(formattedPrice).toString();\n\n const significantDigits = countSignificantFigures(formattedPrice);\n\n if (significantDigits > DECIMAL_PRECISION_CONFIG.MaxSignificantFigures) {\n formattedPrice = roundToSignificantFigures(formattedPrice);\n }\n\n return formattedPrice;\n}\n\nexport function formatHyperLiquidSize(params: {\n size: string | number;\n szDecimals: number;\n}): string {\n const { size, szDecimals } = params;\n const number = typeof size === 'string' ? parseFloat(size) : size;\n\n if (isNaN(number)) {\n return '0';\n }\n\n const formatted = number.toFixed(szDecimals);\n\n if (!formatted.includes('.')) {\n return formatted;\n }\n\n return formatted.replace(/\\.?0+$/u, '');\n}\n\nexport function calculatePositionSize(params: {\n usdValue: number;\n leverage: number;\n assetPrice: number;\n}): number {\n const { usdValue, leverage, assetPrice } = params;\n return (usdValue * leverage) / assetPrice;\n}\n\nexport function calculateHip3AssetId(\n perpDexIndex: number,\n indexInMeta: number,\n): number {\n if (perpDexIndex === 0) {\n return indexInMeta;\n }\n return (\n HIP3_ASSET_ID_CONFIG.BaseAssetId +\n perpDexIndex * HIP3_ASSET_ID_CONFIG.DexMultiplier +\n indexInMeta\n );\n}\n\nexport function parseAssetName(assetName: string): {\n dex: string | null;\n symbol: string;\n} {\n const colonIndex = assetName.indexOf(':');\n if (colonIndex === -1) {\n return { dex: null, symbol: assetName };\n }\n return {\n dex: assetName.substring(0, colonIndex),\n symbol: assetName.substring(colonIndex + 1),\n };\n}\n\nexport function adaptHyperLiquidLedgerUpdateToUserHistoryItem(\n rawLedgerUpdates: RawLedgerUpdate[],\n): UserHistoryItem[] {\n return (rawLedgerUpdates || [])\n .filter((update) => {\n if (update.delta.type === 'deposit') {\n return true;\n }\n if (update.delta.type === 'withdraw') {\n return true;\n }\n if (update.delta.type === 'internalTransfer') {\n const usdc = Number.parseFloat(update.delta.usdc ?? '0');\n if (Number.isNaN(usdc)) {\n return false;\n }\n return usdc > 0;\n }\n return false;\n })\n .map((update) => {\n let amount = '0';\n let asset = 'USDC';\n\n if ('usdc' in update.delta && update.delta.usdc) {\n amount = Math.abs(parseFloat(update.delta.usdc)).toString();\n }\n if ('coin' in update.delta && typeof update.delta.coin === 'string') {\n asset = update.delta.coin;\n }\n\n return {\n id: `history-${update.hash}`,\n timestamp: update.time,\n amount,\n asset,\n txHash: update.hash,\n status: 'completed' as const,\n type: update.delta.type === 'withdraw' ? 'withdrawal' : 'deposit',\n details: {\n source: '',\n bridgeContract: undefined,\n recipient: undefined,\n blockNumber: undefined,\n chainId: undefined,\n synthetic: undefined,\n },\n };\n });\n}\n"]}
1
+ {"version":3,"file":"hyperLiquidAdapter.cjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasProperty, Hex, isHexString } from '@metamask/utils';\n\nimport {\n countSignificantFigures,\n roundToSignificantFigures,\n} from './significantFigures';\nimport { HIP3_ASSET_ID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { DECIMAL_PRECISION_CONFIG } from '../constants/perpsConfig';\nimport type {\n AccountState,\n MarketInfo,\n Order,\n OrderParams as PerpsOrderParams,\n Position,\n RawLedgerUpdate,\n UserHistoryItem,\n} from '../types';\nimport type {\n AssetPosition,\n FrontendOrder,\n ClearinghouseStateResponse,\n SpotClearinghouseStateResponse,\n MetaResponse,\n SDKOrderParams,\n} from '../types/hyperliquid-types';\n\ntype FrontendOrderWithParentTpsl = FrontendOrder & {\n takeProfitPrice?: unknown;\n stopLossPrice?: unknown;\n takeProfitOrderId?: unknown;\n stopLossOrderId?: unknown;\n};\n\nconst readOptionalString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined;\n\nconst readOptionalOrderId = (value: unknown): string | undefined => {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value.toString();\n }\n\n return undefined;\n};\n\nconst getParentTpslMetadata = (\n rawOrder: FrontendOrderWithParentTpsl,\n): {\n takeProfitPrice?: string;\n stopLossPrice?: string;\n takeProfitOrderId?: string;\n stopLossOrderId?: string;\n} => ({\n takeProfitPrice: readOptionalString(rawOrder.takeProfitPrice),\n stopLossPrice: readOptionalString(rawOrder.stopLossPrice),\n takeProfitOrderId: readOptionalOrderId(rawOrder.takeProfitOrderId),\n stopLossOrderId: readOptionalOrderId(rawOrder.stopLossOrderId),\n});\n\n/**\n * HyperLiquid SDK Adapter Utilities\n *\n * These functions transform between MetaMask Perps API types and HyperLiquid SDK types.\n * The SDK uses cryptic property names for efficiency, but our API uses descriptive names\n * to provide a consistent interface across different perps protocols.\n */\n\nexport function adaptOrderToSDK(\n order: PerpsOrderParams,\n symbolToAssetId: Map<string, number>,\n): SDKOrderParams {\n const assetId = symbolToAssetId.get(order.symbol);\n if (assetId === undefined) {\n const availableDexs = new Set<string>();\n symbolToAssetId.forEach((_, symbol) => {\n if (symbol.includes(':')) {\n const dex = symbol.split(':')[0];\n availableDexs.add(dex);\n }\n });\n\n const dexHint =\n availableDexs.size > 0\n ? ` Available HIP-3 DEXs: ${Array.from(availableDexs).join(', ')}`\n : ' No HIP-3 DEXs currently available.';\n\n throw new Error(\n `Asset ${order.symbol} not found in asset mapping.${dexHint} Check console logs for \"HyperLiquidProvider: Asset mapping built\" to see available assets.`,\n );\n }\n\n return {\n a: assetId,\n b: order.isBuy,\n p: order.price ?? '0',\n s: order.size,\n r: order.reduceOnly ?? false,\n t:\n order.orderType === 'limit'\n ? {\n limit: { tif: 'Gtc' },\n }\n : {\n limit: { tif: 'FrontendMarket' },\n },\n c:\n order.clientOrderId && isHexString(order.clientOrderId)\n ? (order.clientOrderId as Hex)\n : undefined,\n };\n}\n\nexport function adaptPositionFromSDK(assetPosition: AssetPosition): Position {\n const pos = assetPosition.position;\n return {\n symbol: pos.coin,\n size: pos.szi,\n entryPrice: pos.entryPx,\n positionValue: pos.positionValue,\n unrealizedPnl: pos.unrealizedPnl,\n marginUsed: pos.marginUsed,\n leverage: {\n type: pos.leverage.type,\n value: pos.leverage.value,\n rawUsd:\n pos.leverage.type === 'isolated' ? pos.leverage.rawUsd : undefined,\n },\n liquidationPrice: pos.liquidationPx,\n maxLeverage: pos.maxLeverage,\n returnOnEquity: pos.returnOnEquity,\n cumulativeFunding: pos.cumFunding,\n takeProfitCount: 0,\n stopLossCount: 0,\n };\n}\n\nexport function adaptOrderFromSDK(\n rawOrder: FrontendOrder,\n position?: Position,\n): Order {\n // TODO: Remove this widened boundary type when FrontendOrder includes\n // takeProfitPrice/stopLossPrice and takeProfitOrderId/stopLossOrderId.\n const parentTpslMetadata = getParentTpslMetadata(\n rawOrder as FrontendOrderWithParentTpsl,\n );\n\n // Extract basic fields with appropriate conversions\n const orderId = rawOrder.oid.toString();\n const symbol = rawOrder.coin;\n const side: 'buy' | 'sell' = rawOrder.side === 'B' ? 'buy' : 'sell';\n const detailedOrderType = rawOrder.orderType;\n const { isTrigger } = rawOrder;\n const { reduceOnly } = rawOrder;\n\n let orderType: 'limit' | 'market' = 'market';\n if (detailedOrderType.toLowerCase().includes('limit') || rawOrder.limitPx) {\n orderType = 'limit';\n }\n\n const price = rawOrder.limitPx || rawOrder.triggerPx || '0';\n\n let size = rawOrder.sz;\n let originalSize = rawOrder.origSz || size;\n\n let currentSize = parseFloat(size);\n let origSize = parseFloat(originalSize);\n\n if (rawOrder.isPositionTpsl && origSize === 0 && position) {\n const absPositionSize = Math.abs(parseFloat(position.size));\n currentSize = absPositionSize;\n origSize = absPositionSize;\n size = absPositionSize.toString();\n originalSize = absPositionSize.toString();\n }\n\n const filledSize = origSize - currentSize;\n\n let takeProfitPrice: string | undefined;\n let stopLossPrice: string | undefined;\n let takeProfitOrderId: string | undefined;\n let stopLossOrderId: string | undefined;\n\n // TODO: We assume that there can only be 1 TP and 1 SL as children but there can be several TPSLs as children\n if (rawOrder.children && rawOrder.children.length > 0) {\n rawOrder.children.forEach((childUnknown) => {\n const child = childUnknown as FrontendOrder;\n if (child.isTrigger && child.orderType) {\n if (child.orderType.includes('Take Profit')) {\n takeProfitPrice = child.triggerPx || child.limitPx;\n takeProfitOrderId = child.oid.toString();\n } else if (child.orderType.includes('Stop')) {\n stopLossPrice = child.triggerPx || child.limitPx;\n stopLossOrderId = child.oid.toString();\n }\n }\n });\n }\n\n // Fallback: preserve parent-level TP/SL metadata when children are absent.\n takeProfitPrice ??= parentTpslMetadata.takeProfitPrice;\n stopLossPrice ??= parentTpslMetadata.stopLossPrice;\n takeProfitOrderId ??= parentTpslMetadata.takeProfitOrderId;\n stopLossOrderId ??= parentTpslMetadata.stopLossOrderId;\n\n // Build the order object\n const order: Order = {\n orderId,\n symbol,\n side,\n orderType,\n size,\n originalSize,\n price,\n filledSize: filledSize.toString(),\n remainingSize: size,\n status: 'open' as const,\n timestamp: rawOrder.timestamp,\n detailedOrderType,\n isTrigger,\n reduceOnly,\n };\n\n if (typeof rawOrder.isPositionTpsl === 'boolean') {\n order.isPositionTpsl = rawOrder.isPositionTpsl;\n }\n\n if (takeProfitPrice) {\n order.takeProfitPrice = takeProfitPrice;\n order.takeProfitOrderId = takeProfitOrderId;\n }\n if (stopLossPrice) {\n order.stopLossPrice = stopLossPrice;\n order.stopLossOrderId = stopLossOrderId;\n }\n if (rawOrder.triggerPx) {\n order.triggerPrice = rawOrder.triggerPx;\n }\n\n return order;\n}\n\nexport function adaptMarketFromSDK(\n sdkMarket: MetaResponse['universe'][number],\n): MarketInfo {\n return {\n name: sdkMarket.name,\n szDecimals: sdkMarket.szDecimals,\n maxLeverage: sdkMarket.maxLeverage,\n marginTableId: sdkMarket.marginTableId,\n onlyIsolated: sdkMarket.onlyIsolated,\n isDelisted: sdkMarket.isDelisted,\n };\n}\n\nexport function adaptAccountStateFromSDK(\n perpsState: ClearinghouseStateResponse,\n spotState?: SpotClearinghouseStateResponse | null,\n): AccountState {\n const { totalUnrealizedPnl, weightedReturnOnEquity } =\n perpsState.assetPositions.reduce(\n (acc, assetPos: AssetPosition) => {\n const unrealizedPnl = parseFloat(\n assetPos.position.unrealizedPnl || '0',\n );\n const marginUsed = parseFloat(assetPos.position.marginUsed || '0');\n const returnOnEquity = parseFloat(\n assetPos.position.returnOnEquity || '0',\n );\n acc.totalUnrealizedPnl += unrealizedPnl;\n acc.weightedReturnOnEquity += returnOnEquity * marginUsed;\n return acc;\n },\n {\n totalUnrealizedPnl: 0,\n weightedReturnOnEquity: 0,\n },\n );\n const totalMarginUsed = parseFloat(\n perpsState.marginSummary.totalMarginUsed || '0',\n );\n const totalReturnOnEquityPercentage =\n totalMarginUsed > 0\n ? ((weightedReturnOnEquity / totalMarginUsed) * 100).toString()\n : '0';\n\n const perpsBalance = parseFloat(perpsState.marginSummary.accountValue);\n\n let spotBalance = 0;\n if (spotState?.balances && Array.isArray(spotState.balances)) {\n spotBalance = spotState.balances.reduce(\n (sum: number, balance: { total?: string }) =>\n sum + parseFloat(balance.total ?? '0'),\n 0,\n );\n }\n\n const totalBalance = (spotBalance + perpsBalance).toString();\n\n const accountState: AccountState = {\n availableBalance: perpsState.withdrawable || '0',\n totalBalance: totalBalance || '0',\n marginUsed: perpsState.marginSummary.totalMarginUsed || '0',\n unrealizedPnl: totalUnrealizedPnl.toString() || '0',\n returnOnEquity: totalReturnOnEquityPercentage || '0',\n };\n\n return accountState;\n}\n\nexport function buildAssetMapping(params: {\n metaUniverse: MetaResponse['universe'];\n dex?: string | null;\n perpDexIndex: number;\n}): {\n symbolToAssetId: Map<string, number>;\n assetIdToSymbol: Map<number, string>;\n} {\n const { metaUniverse, perpDexIndex } = params;\n const symbolToAssetId = new Map<string, number>();\n const assetIdToSymbol = new Map<number, string>();\n\n metaUniverse.forEach((asset, index) => {\n const assetId = calculateHip3AssetId(perpDexIndex, index);\n symbolToAssetId.set(asset.name, assetId);\n assetIdToSymbol.set(assetId, asset.name);\n });\n\n return { symbolToAssetId, assetIdToSymbol };\n}\n\nexport function formatHyperLiquidPrice(params: {\n price: string | number;\n szDecimals: number;\n}): string {\n const { price, szDecimals } = params;\n const priceNum = typeof price === 'string' ? parseFloat(price) : price;\n\n if (Number.isInteger(priceNum)) {\n return priceNum.toString();\n }\n\n const maxDecimalPlaces =\n DECIMAL_PRECISION_CONFIG.MaxPriceDecimals - szDecimals;\n\n let formattedPrice = priceNum.toFixed(maxDecimalPlaces);\n formattedPrice = parseFloat(formattedPrice).toString();\n\n const significantDigits = countSignificantFigures(formattedPrice);\n\n if (significantDigits > DECIMAL_PRECISION_CONFIG.MaxSignificantFigures) {\n formattedPrice = roundToSignificantFigures(formattedPrice);\n }\n\n return formattedPrice;\n}\n\nexport function formatHyperLiquidSize(params: {\n size: string | number;\n szDecimals: number;\n}): string {\n const { size, szDecimals } = params;\n const number = typeof size === 'string' ? parseFloat(size) : size;\n\n if (isNaN(number)) {\n return '0';\n }\n\n const formatted = number.toFixed(szDecimals);\n\n if (!formatted.includes('.')) {\n return formatted;\n }\n\n return formatted.replace(/\\.?0+$/u, '');\n}\n\nexport function calculatePositionSize(params: {\n usdValue: number;\n leverage: number;\n assetPrice: number;\n}): number {\n const { usdValue, leverage, assetPrice } = params;\n return (usdValue * leverage) / assetPrice;\n}\n\nexport function calculateHip3AssetId(\n perpDexIndex: number,\n indexInMeta: number,\n): number {\n if (perpDexIndex === 0) {\n return indexInMeta;\n }\n return (\n HIP3_ASSET_ID_CONFIG.BaseAssetId +\n perpDexIndex * HIP3_ASSET_ID_CONFIG.DexMultiplier +\n indexInMeta\n );\n}\n\nexport function parseAssetName(assetName: string): {\n dex: string | null;\n symbol: string;\n} {\n const colonIndex = assetName.indexOf(':');\n if (colonIndex === -1) {\n return { dex: null, symbol: assetName };\n }\n return {\n dex: assetName.substring(0, colonIndex),\n symbol: assetName.substring(colonIndex + 1),\n };\n}\n\nexport function adaptHyperLiquidLedgerUpdateToUserHistoryItem(\n rawLedgerUpdates: RawLedgerUpdate[],\n): UserHistoryItem[] {\n return (rawLedgerUpdates || [])\n .filter((update) => {\n if (update.delta.type === 'deposit') {\n return true;\n }\n if (update.delta.type === 'withdraw') {\n return true;\n }\n if (update.delta.type === 'internalTransfer') {\n const usdc = Number.parseFloat(update.delta.usdc ?? '0');\n if (Number.isNaN(usdc)) {\n return false;\n }\n return usdc > 0;\n }\n return false;\n })\n .map((update) => {\n let amount = '0';\n let asset = 'USDC';\n\n if (hasProperty(update.delta, 'usdc') && update.delta.usdc) {\n amount = Math.abs(parseFloat(update.delta.usdc)).toString();\n }\n if (\n hasProperty(update.delta, 'coin') &&\n typeof update.delta.coin === 'string'\n ) {\n asset = update.delta.coin;\n }\n\n return {\n id: `history-${update.hash}`,\n timestamp: update.time,\n amount,\n asset,\n txHash: update.hash,\n status: 'completed' as const,\n type: update.delta.type === 'withdraw' ? 'withdrawal' : 'deposit',\n details: {\n source: '',\n bridgeContract: undefined,\n recipient: undefined,\n blockNumber: undefined,\n chainId: undefined,\n synthetic: undefined,\n },\n };\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidAdapter.d.cts","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,IAAI,gBAAgB,EAC/B,QAAQ,EACR,eAAe,EACf,eAAe,EAChB,2BAAiB;AAClB,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACf,uCAAmC;AAsCpC;;;;;;GAMG;AAEH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,cAAc,CAwChB;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,GAAG,QAAQ,CAsB3E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,QAAQ,GAClB,KAAK,CAoGP;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAC1C,UAAU,CASZ;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,0BAA0B,EACtC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,GAChD,YAAY,CAkDd;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAYA;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAqBT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAeT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAGT;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,CASR;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IACjD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CASA;AAED,wBAAgB,6CAA6C,CAC3D,gBAAgB,EAAE,eAAe,EAAE,GAClC,eAAe,EAAE,CA+CnB"}
1
+ {"version":3,"file":"hyperLiquidAdapter.d.cts","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,IAAI,gBAAgB,EAC/B,QAAQ,EACR,eAAe,EACf,eAAe,EAChB,2BAAiB;AAClB,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACf,uCAAmC;AAsCpC;;;;;;GAMG;AAEH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,cAAc,CAwChB;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,GAAG,QAAQ,CAsB3E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,QAAQ,GAClB,KAAK,CAoGP;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAC1C,UAAU,CASZ;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,0BAA0B,EACtC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,GAChD,YAAY,CAkDd;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAYA;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAqBT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAeT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAGT;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,CASR;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IACjD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CASA;AAED,wBAAgB,6CAA6C,CAC3D,gBAAgB,EAAE,eAAe,EAAE,GAClC,eAAe,EAAE,CAkDnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidAdapter.d.mts","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,IAAI,gBAAgB,EAC/B,QAAQ,EACR,eAAe,EACf,eAAe,EAChB,2BAAiB;AAClB,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACf,uCAAmC;AAsCpC;;;;;;GAMG;AAEH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,cAAc,CAwChB;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,GAAG,QAAQ,CAsB3E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,QAAQ,GAClB,KAAK,CAoGP;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAC1C,UAAU,CASZ;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,0BAA0B,EACtC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,GAChD,YAAY,CAkDd;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAYA;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAqBT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAeT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAGT;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,CASR;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IACjD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CASA;AAED,wBAAgB,6CAA6C,CAC3D,gBAAgB,EAAE,eAAe,EAAE,GAClC,eAAe,EAAE,CA+CnB"}
1
+ {"version":3,"file":"hyperLiquidAdapter.d.mts","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,IAAI,gBAAgB,EAC/B,QAAQ,EACR,eAAe,EACf,eAAe,EAChB,2BAAiB;AAClB,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACf,uCAAmC;AAsCpC;;;;;;GAMG;AAEH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,gBAAgB,EACvB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,cAAc,CAwChB;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,GAAG,QAAQ,CAsB3E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,QAAQ,GAClB,KAAK,CAoGP;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAC1C,UAAU,CASZ;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,0BAA0B,EACtC,SAAS,CAAC,EAAE,8BAA8B,GAAG,IAAI,GAChD,YAAY,CAkDd;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAYA;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAqBT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAeT;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAGT;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM,CASR;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IACjD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CASA;AAED,wBAAgB,6CAA6C,CAC3D,gBAAgB,EAAE,eAAe,EAAE,GAClC,eAAe,EAAE,CAkDnB"}
@@ -1,4 +1,4 @@
1
- import { isHexString } from "@metamask/utils";
1
+ import { hasProperty, isHexString } from "@metamask/utils";
2
2
  import { countSignificantFigures, roundToSignificantFigures } from "./significantFigures.mjs";
3
3
  import { HIP3_ASSET_ID_CONFIG } from "../constants/hyperLiquidConfig.mjs";
4
4
  import { DECIMAL_PRECISION_CONFIG } from "../constants/perpsConfig.mjs";
@@ -288,10 +288,11 @@ export function adaptHyperLiquidLedgerUpdateToUserHistoryItem(rawLedgerUpdates)
288
288
  .map((update) => {
289
289
  let amount = '0';
290
290
  let asset = 'USDC';
291
- if ('usdc' in update.delta && update.delta.usdc) {
291
+ if (hasProperty(update.delta, 'usdc') && update.delta.usdc) {
292
292
  amount = Math.abs(parseFloat(update.delta.usdc)).toString();
293
293
  }
294
- if ('coin' in update.delta && typeof update.delta.coin === 'string') {
294
+ if (hasProperty(update.delta, 'coin') &&
295
+ typeof update.delta.coin === 'string') {
295
296
  asset = update.delta.coin;
296
297
  }
297
298
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidAdapter.mjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hex, isHexString } from '@metamask/utils';\n\nimport {\n countSignificantFigures,\n roundToSignificantFigures,\n} from './significantFigures';\nimport { HIP3_ASSET_ID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { DECIMAL_PRECISION_CONFIG } from '../constants/perpsConfig';\nimport type {\n AccountState,\n MarketInfo,\n Order,\n OrderParams as PerpsOrderParams,\n Position,\n RawLedgerUpdate,\n UserHistoryItem,\n} from '../types';\nimport type {\n AssetPosition,\n FrontendOrder,\n ClearinghouseStateResponse,\n SpotClearinghouseStateResponse,\n MetaResponse,\n SDKOrderParams,\n} from '../types/hyperliquid-types';\n\ntype FrontendOrderWithParentTpsl = FrontendOrder & {\n takeProfitPrice?: unknown;\n stopLossPrice?: unknown;\n takeProfitOrderId?: unknown;\n stopLossOrderId?: unknown;\n};\n\nconst readOptionalString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined;\n\nconst readOptionalOrderId = (value: unknown): string | undefined => {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value.toString();\n }\n\n return undefined;\n};\n\nconst getParentTpslMetadata = (\n rawOrder: FrontendOrderWithParentTpsl,\n): {\n takeProfitPrice?: string;\n stopLossPrice?: string;\n takeProfitOrderId?: string;\n stopLossOrderId?: string;\n} => ({\n takeProfitPrice: readOptionalString(rawOrder.takeProfitPrice),\n stopLossPrice: readOptionalString(rawOrder.stopLossPrice),\n takeProfitOrderId: readOptionalOrderId(rawOrder.takeProfitOrderId),\n stopLossOrderId: readOptionalOrderId(rawOrder.stopLossOrderId),\n});\n\n/**\n * HyperLiquid SDK Adapter Utilities\n *\n * These functions transform between MetaMask Perps API types and HyperLiquid SDK types.\n * The SDK uses cryptic property names for efficiency, but our API uses descriptive names\n * to provide a consistent interface across different perps protocols.\n */\n\nexport function adaptOrderToSDK(\n order: PerpsOrderParams,\n symbolToAssetId: Map<string, number>,\n): SDKOrderParams {\n const assetId = symbolToAssetId.get(order.symbol);\n if (assetId === undefined) {\n const availableDexs = new Set<string>();\n symbolToAssetId.forEach((_, symbol) => {\n if (symbol.includes(':')) {\n const dex = symbol.split(':')[0];\n availableDexs.add(dex);\n }\n });\n\n const dexHint =\n availableDexs.size > 0\n ? ` Available HIP-3 DEXs: ${Array.from(availableDexs).join(', ')}`\n : ' No HIP-3 DEXs currently available.';\n\n throw new Error(\n `Asset ${order.symbol} not found in asset mapping.${dexHint} Check console logs for \"HyperLiquidProvider: Asset mapping built\" to see available assets.`,\n );\n }\n\n return {\n a: assetId,\n b: order.isBuy,\n p: order.price ?? '0',\n s: order.size,\n r: order.reduceOnly ?? false,\n t:\n order.orderType === 'limit'\n ? {\n limit: { tif: 'Gtc' },\n }\n : {\n limit: { tif: 'FrontendMarket' },\n },\n c:\n order.clientOrderId && isHexString(order.clientOrderId)\n ? (order.clientOrderId as Hex)\n : undefined,\n };\n}\n\nexport function adaptPositionFromSDK(assetPosition: AssetPosition): Position {\n const pos = assetPosition.position;\n return {\n symbol: pos.coin,\n size: pos.szi,\n entryPrice: pos.entryPx,\n positionValue: pos.positionValue,\n unrealizedPnl: pos.unrealizedPnl,\n marginUsed: pos.marginUsed,\n leverage: {\n type: pos.leverage.type,\n value: pos.leverage.value,\n rawUsd:\n pos.leverage.type === 'isolated' ? pos.leverage.rawUsd : undefined,\n },\n liquidationPrice: pos.liquidationPx,\n maxLeverage: pos.maxLeverage,\n returnOnEquity: pos.returnOnEquity,\n cumulativeFunding: pos.cumFunding,\n takeProfitCount: 0,\n stopLossCount: 0,\n };\n}\n\nexport function adaptOrderFromSDK(\n rawOrder: FrontendOrder,\n position?: Position,\n): Order {\n // TODO: Remove this widened boundary type when FrontendOrder includes\n // takeProfitPrice/stopLossPrice and takeProfitOrderId/stopLossOrderId.\n const parentTpslMetadata = getParentTpslMetadata(\n rawOrder as FrontendOrderWithParentTpsl,\n );\n\n // Extract basic fields with appropriate conversions\n const orderId = rawOrder.oid.toString();\n const symbol = rawOrder.coin;\n const side: 'buy' | 'sell' = rawOrder.side === 'B' ? 'buy' : 'sell';\n const detailedOrderType = rawOrder.orderType;\n const { isTrigger } = rawOrder;\n const { reduceOnly } = rawOrder;\n\n let orderType: 'limit' | 'market' = 'market';\n if (detailedOrderType.toLowerCase().includes('limit') || rawOrder.limitPx) {\n orderType = 'limit';\n }\n\n const price = rawOrder.limitPx || rawOrder.triggerPx || '0';\n\n let size = rawOrder.sz;\n let originalSize = rawOrder.origSz || size;\n\n let currentSize = parseFloat(size);\n let origSize = parseFloat(originalSize);\n\n if (rawOrder.isPositionTpsl && origSize === 0 && position) {\n const absPositionSize = Math.abs(parseFloat(position.size));\n currentSize = absPositionSize;\n origSize = absPositionSize;\n size = absPositionSize.toString();\n originalSize = absPositionSize.toString();\n }\n\n const filledSize = origSize - currentSize;\n\n let takeProfitPrice: string | undefined;\n let stopLossPrice: string | undefined;\n let takeProfitOrderId: string | undefined;\n let stopLossOrderId: string | undefined;\n\n // TODO: We assume that there can only be 1 TP and 1 SL as children but there can be several TPSLs as children\n if (rawOrder.children && rawOrder.children.length > 0) {\n rawOrder.children.forEach((childUnknown) => {\n const child = childUnknown as FrontendOrder;\n if (child.isTrigger && child.orderType) {\n if (child.orderType.includes('Take Profit')) {\n takeProfitPrice = child.triggerPx || child.limitPx;\n takeProfitOrderId = child.oid.toString();\n } else if (child.orderType.includes('Stop')) {\n stopLossPrice = child.triggerPx || child.limitPx;\n stopLossOrderId = child.oid.toString();\n }\n }\n });\n }\n\n // Fallback: preserve parent-level TP/SL metadata when children are absent.\n takeProfitPrice ??= parentTpslMetadata.takeProfitPrice;\n stopLossPrice ??= parentTpslMetadata.stopLossPrice;\n takeProfitOrderId ??= parentTpslMetadata.takeProfitOrderId;\n stopLossOrderId ??= parentTpslMetadata.stopLossOrderId;\n\n // Build the order object\n const order: Order = {\n orderId,\n symbol,\n side,\n orderType,\n size,\n originalSize,\n price,\n filledSize: filledSize.toString(),\n remainingSize: size,\n status: 'open' as const,\n timestamp: rawOrder.timestamp,\n detailedOrderType,\n isTrigger,\n reduceOnly,\n };\n\n if (typeof rawOrder.isPositionTpsl === 'boolean') {\n order.isPositionTpsl = rawOrder.isPositionTpsl;\n }\n\n if (takeProfitPrice) {\n order.takeProfitPrice = takeProfitPrice;\n order.takeProfitOrderId = takeProfitOrderId;\n }\n if (stopLossPrice) {\n order.stopLossPrice = stopLossPrice;\n order.stopLossOrderId = stopLossOrderId;\n }\n if (rawOrder.triggerPx) {\n order.triggerPrice = rawOrder.triggerPx;\n }\n\n return order;\n}\n\nexport function adaptMarketFromSDK(\n sdkMarket: MetaResponse['universe'][number],\n): MarketInfo {\n return {\n name: sdkMarket.name,\n szDecimals: sdkMarket.szDecimals,\n maxLeverage: sdkMarket.maxLeverage,\n marginTableId: sdkMarket.marginTableId,\n onlyIsolated: sdkMarket.onlyIsolated,\n isDelisted: sdkMarket.isDelisted,\n };\n}\n\nexport function adaptAccountStateFromSDK(\n perpsState: ClearinghouseStateResponse,\n spotState?: SpotClearinghouseStateResponse | null,\n): AccountState {\n const { totalUnrealizedPnl, weightedReturnOnEquity } =\n perpsState.assetPositions.reduce(\n (acc, assetPos: AssetPosition) => {\n const unrealizedPnl = parseFloat(\n assetPos.position.unrealizedPnl || '0',\n );\n const marginUsed = parseFloat(assetPos.position.marginUsed || '0');\n const returnOnEquity = parseFloat(\n assetPos.position.returnOnEquity || '0',\n );\n acc.totalUnrealizedPnl += unrealizedPnl;\n acc.weightedReturnOnEquity += returnOnEquity * marginUsed;\n return acc;\n },\n {\n totalUnrealizedPnl: 0,\n weightedReturnOnEquity: 0,\n },\n );\n const totalMarginUsed = parseFloat(\n perpsState.marginSummary.totalMarginUsed || '0',\n );\n const totalReturnOnEquityPercentage =\n totalMarginUsed > 0\n ? ((weightedReturnOnEquity / totalMarginUsed) * 100).toString()\n : '0';\n\n const perpsBalance = parseFloat(perpsState.marginSummary.accountValue);\n\n let spotBalance = 0;\n if (spotState?.balances && Array.isArray(spotState.balances)) {\n spotBalance = spotState.balances.reduce(\n (sum: number, balance: { total?: string }) =>\n sum + parseFloat(balance.total ?? '0'),\n 0,\n );\n }\n\n const totalBalance = (spotBalance + perpsBalance).toString();\n\n const accountState: AccountState = {\n availableBalance: perpsState.withdrawable || '0',\n totalBalance: totalBalance || '0',\n marginUsed: perpsState.marginSummary.totalMarginUsed || '0',\n unrealizedPnl: totalUnrealizedPnl.toString() || '0',\n returnOnEquity: totalReturnOnEquityPercentage || '0',\n };\n\n return accountState;\n}\n\nexport function buildAssetMapping(params: {\n metaUniverse: MetaResponse['universe'];\n dex?: string | null;\n perpDexIndex: number;\n}): {\n symbolToAssetId: Map<string, number>;\n assetIdToSymbol: Map<number, string>;\n} {\n const { metaUniverse, perpDexIndex } = params;\n const symbolToAssetId = new Map<string, number>();\n const assetIdToSymbol = new Map<number, string>();\n\n metaUniverse.forEach((asset, index) => {\n const assetId = calculateHip3AssetId(perpDexIndex, index);\n symbolToAssetId.set(asset.name, assetId);\n assetIdToSymbol.set(assetId, asset.name);\n });\n\n return { symbolToAssetId, assetIdToSymbol };\n}\n\nexport function formatHyperLiquidPrice(params: {\n price: string | number;\n szDecimals: number;\n}): string {\n const { price, szDecimals } = params;\n const priceNum = typeof price === 'string' ? parseFloat(price) : price;\n\n if (Number.isInteger(priceNum)) {\n return priceNum.toString();\n }\n\n const maxDecimalPlaces =\n DECIMAL_PRECISION_CONFIG.MaxPriceDecimals - szDecimals;\n\n let formattedPrice = priceNum.toFixed(maxDecimalPlaces);\n formattedPrice = parseFloat(formattedPrice).toString();\n\n const significantDigits = countSignificantFigures(formattedPrice);\n\n if (significantDigits > DECIMAL_PRECISION_CONFIG.MaxSignificantFigures) {\n formattedPrice = roundToSignificantFigures(formattedPrice);\n }\n\n return formattedPrice;\n}\n\nexport function formatHyperLiquidSize(params: {\n size: string | number;\n szDecimals: number;\n}): string {\n const { size, szDecimals } = params;\n const number = typeof size === 'string' ? parseFloat(size) : size;\n\n if (isNaN(number)) {\n return '0';\n }\n\n const formatted = number.toFixed(szDecimals);\n\n if (!formatted.includes('.')) {\n return formatted;\n }\n\n return formatted.replace(/\\.?0+$/u, '');\n}\n\nexport function calculatePositionSize(params: {\n usdValue: number;\n leverage: number;\n assetPrice: number;\n}): number {\n const { usdValue, leverage, assetPrice } = params;\n return (usdValue * leverage) / assetPrice;\n}\n\nexport function calculateHip3AssetId(\n perpDexIndex: number,\n indexInMeta: number,\n): number {\n if (perpDexIndex === 0) {\n return indexInMeta;\n }\n return (\n HIP3_ASSET_ID_CONFIG.BaseAssetId +\n perpDexIndex * HIP3_ASSET_ID_CONFIG.DexMultiplier +\n indexInMeta\n );\n}\n\nexport function parseAssetName(assetName: string): {\n dex: string | null;\n symbol: string;\n} {\n const colonIndex = assetName.indexOf(':');\n if (colonIndex === -1) {\n return { dex: null, symbol: assetName };\n }\n return {\n dex: assetName.substring(0, colonIndex),\n symbol: assetName.substring(colonIndex + 1),\n };\n}\n\nexport function adaptHyperLiquidLedgerUpdateToUserHistoryItem(\n rawLedgerUpdates: RawLedgerUpdate[],\n): UserHistoryItem[] {\n return (rawLedgerUpdates || [])\n .filter((update) => {\n if (update.delta.type === 'deposit') {\n return true;\n }\n if (update.delta.type === 'withdraw') {\n return true;\n }\n if (update.delta.type === 'internalTransfer') {\n const usdc = Number.parseFloat(update.delta.usdc ?? '0');\n if (Number.isNaN(usdc)) {\n return false;\n }\n return usdc > 0;\n }\n return false;\n })\n .map((update) => {\n let amount = '0';\n let asset = 'USDC';\n\n if ('usdc' in update.delta && update.delta.usdc) {\n amount = Math.abs(parseFloat(update.delta.usdc)).toString();\n }\n if ('coin' in update.delta && typeof update.delta.coin === 'string') {\n asset = update.delta.coin;\n }\n\n return {\n id: `history-${update.hash}`,\n timestamp: update.time,\n amount,\n asset,\n txHash: update.hash,\n status: 'completed' as const,\n type: update.delta.type === 'withdraw' ? 'withdrawal' : 'deposit',\n details: {\n source: '',\n bridgeContract: undefined,\n recipient: undefined,\n blockNumber: undefined,\n chainId: undefined,\n synthetic: undefined,\n },\n };\n });\n}\n"]}
1
+ {"version":3,"file":"hyperLiquidAdapter.mjs","sourceRoot":"","sources":["../../src/utils/hyperLiquidAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { hasProperty, Hex, isHexString } from '@metamask/utils';\n\nimport {\n countSignificantFigures,\n roundToSignificantFigures,\n} from './significantFigures';\nimport { HIP3_ASSET_ID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { DECIMAL_PRECISION_CONFIG } from '../constants/perpsConfig';\nimport type {\n AccountState,\n MarketInfo,\n Order,\n OrderParams as PerpsOrderParams,\n Position,\n RawLedgerUpdate,\n UserHistoryItem,\n} from '../types';\nimport type {\n AssetPosition,\n FrontendOrder,\n ClearinghouseStateResponse,\n SpotClearinghouseStateResponse,\n MetaResponse,\n SDKOrderParams,\n} from '../types/hyperliquid-types';\n\ntype FrontendOrderWithParentTpsl = FrontendOrder & {\n takeProfitPrice?: unknown;\n stopLossPrice?: unknown;\n takeProfitOrderId?: unknown;\n stopLossOrderId?: unknown;\n};\n\nconst readOptionalString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined;\n\nconst readOptionalOrderId = (value: unknown): string | undefined => {\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value.toString();\n }\n\n return undefined;\n};\n\nconst getParentTpslMetadata = (\n rawOrder: FrontendOrderWithParentTpsl,\n): {\n takeProfitPrice?: string;\n stopLossPrice?: string;\n takeProfitOrderId?: string;\n stopLossOrderId?: string;\n} => ({\n takeProfitPrice: readOptionalString(rawOrder.takeProfitPrice),\n stopLossPrice: readOptionalString(rawOrder.stopLossPrice),\n takeProfitOrderId: readOptionalOrderId(rawOrder.takeProfitOrderId),\n stopLossOrderId: readOptionalOrderId(rawOrder.stopLossOrderId),\n});\n\n/**\n * HyperLiquid SDK Adapter Utilities\n *\n * These functions transform between MetaMask Perps API types and HyperLiquid SDK types.\n * The SDK uses cryptic property names for efficiency, but our API uses descriptive names\n * to provide a consistent interface across different perps protocols.\n */\n\nexport function adaptOrderToSDK(\n order: PerpsOrderParams,\n symbolToAssetId: Map<string, number>,\n): SDKOrderParams {\n const assetId = symbolToAssetId.get(order.symbol);\n if (assetId === undefined) {\n const availableDexs = new Set<string>();\n symbolToAssetId.forEach((_, symbol) => {\n if (symbol.includes(':')) {\n const dex = symbol.split(':')[0];\n availableDexs.add(dex);\n }\n });\n\n const dexHint =\n availableDexs.size > 0\n ? ` Available HIP-3 DEXs: ${Array.from(availableDexs).join(', ')}`\n : ' No HIP-3 DEXs currently available.';\n\n throw new Error(\n `Asset ${order.symbol} not found in asset mapping.${dexHint} Check console logs for \"HyperLiquidProvider: Asset mapping built\" to see available assets.`,\n );\n }\n\n return {\n a: assetId,\n b: order.isBuy,\n p: order.price ?? '0',\n s: order.size,\n r: order.reduceOnly ?? false,\n t:\n order.orderType === 'limit'\n ? {\n limit: { tif: 'Gtc' },\n }\n : {\n limit: { tif: 'FrontendMarket' },\n },\n c:\n order.clientOrderId && isHexString(order.clientOrderId)\n ? (order.clientOrderId as Hex)\n : undefined,\n };\n}\n\nexport function adaptPositionFromSDK(assetPosition: AssetPosition): Position {\n const pos = assetPosition.position;\n return {\n symbol: pos.coin,\n size: pos.szi,\n entryPrice: pos.entryPx,\n positionValue: pos.positionValue,\n unrealizedPnl: pos.unrealizedPnl,\n marginUsed: pos.marginUsed,\n leverage: {\n type: pos.leverage.type,\n value: pos.leverage.value,\n rawUsd:\n pos.leverage.type === 'isolated' ? pos.leverage.rawUsd : undefined,\n },\n liquidationPrice: pos.liquidationPx,\n maxLeverage: pos.maxLeverage,\n returnOnEquity: pos.returnOnEquity,\n cumulativeFunding: pos.cumFunding,\n takeProfitCount: 0,\n stopLossCount: 0,\n };\n}\n\nexport function adaptOrderFromSDK(\n rawOrder: FrontendOrder,\n position?: Position,\n): Order {\n // TODO: Remove this widened boundary type when FrontendOrder includes\n // takeProfitPrice/stopLossPrice and takeProfitOrderId/stopLossOrderId.\n const parentTpslMetadata = getParentTpslMetadata(\n rawOrder as FrontendOrderWithParentTpsl,\n );\n\n // Extract basic fields with appropriate conversions\n const orderId = rawOrder.oid.toString();\n const symbol = rawOrder.coin;\n const side: 'buy' | 'sell' = rawOrder.side === 'B' ? 'buy' : 'sell';\n const detailedOrderType = rawOrder.orderType;\n const { isTrigger } = rawOrder;\n const { reduceOnly } = rawOrder;\n\n let orderType: 'limit' | 'market' = 'market';\n if (detailedOrderType.toLowerCase().includes('limit') || rawOrder.limitPx) {\n orderType = 'limit';\n }\n\n const price = rawOrder.limitPx || rawOrder.triggerPx || '0';\n\n let size = rawOrder.sz;\n let originalSize = rawOrder.origSz || size;\n\n let currentSize = parseFloat(size);\n let origSize = parseFloat(originalSize);\n\n if (rawOrder.isPositionTpsl && origSize === 0 && position) {\n const absPositionSize = Math.abs(parseFloat(position.size));\n currentSize = absPositionSize;\n origSize = absPositionSize;\n size = absPositionSize.toString();\n originalSize = absPositionSize.toString();\n }\n\n const filledSize = origSize - currentSize;\n\n let takeProfitPrice: string | undefined;\n let stopLossPrice: string | undefined;\n let takeProfitOrderId: string | undefined;\n let stopLossOrderId: string | undefined;\n\n // TODO: We assume that there can only be 1 TP and 1 SL as children but there can be several TPSLs as children\n if (rawOrder.children && rawOrder.children.length > 0) {\n rawOrder.children.forEach((childUnknown) => {\n const child = childUnknown as FrontendOrder;\n if (child.isTrigger && child.orderType) {\n if (child.orderType.includes('Take Profit')) {\n takeProfitPrice = child.triggerPx || child.limitPx;\n takeProfitOrderId = child.oid.toString();\n } else if (child.orderType.includes('Stop')) {\n stopLossPrice = child.triggerPx || child.limitPx;\n stopLossOrderId = child.oid.toString();\n }\n }\n });\n }\n\n // Fallback: preserve parent-level TP/SL metadata when children are absent.\n takeProfitPrice ??= parentTpslMetadata.takeProfitPrice;\n stopLossPrice ??= parentTpslMetadata.stopLossPrice;\n takeProfitOrderId ??= parentTpslMetadata.takeProfitOrderId;\n stopLossOrderId ??= parentTpslMetadata.stopLossOrderId;\n\n // Build the order object\n const order: Order = {\n orderId,\n symbol,\n side,\n orderType,\n size,\n originalSize,\n price,\n filledSize: filledSize.toString(),\n remainingSize: size,\n status: 'open' as const,\n timestamp: rawOrder.timestamp,\n detailedOrderType,\n isTrigger,\n reduceOnly,\n };\n\n if (typeof rawOrder.isPositionTpsl === 'boolean') {\n order.isPositionTpsl = rawOrder.isPositionTpsl;\n }\n\n if (takeProfitPrice) {\n order.takeProfitPrice = takeProfitPrice;\n order.takeProfitOrderId = takeProfitOrderId;\n }\n if (stopLossPrice) {\n order.stopLossPrice = stopLossPrice;\n order.stopLossOrderId = stopLossOrderId;\n }\n if (rawOrder.triggerPx) {\n order.triggerPrice = rawOrder.triggerPx;\n }\n\n return order;\n}\n\nexport function adaptMarketFromSDK(\n sdkMarket: MetaResponse['universe'][number],\n): MarketInfo {\n return {\n name: sdkMarket.name,\n szDecimals: sdkMarket.szDecimals,\n maxLeverage: sdkMarket.maxLeverage,\n marginTableId: sdkMarket.marginTableId,\n onlyIsolated: sdkMarket.onlyIsolated,\n isDelisted: sdkMarket.isDelisted,\n };\n}\n\nexport function adaptAccountStateFromSDK(\n perpsState: ClearinghouseStateResponse,\n spotState?: SpotClearinghouseStateResponse | null,\n): AccountState {\n const { totalUnrealizedPnl, weightedReturnOnEquity } =\n perpsState.assetPositions.reduce(\n (acc, assetPos: AssetPosition) => {\n const unrealizedPnl = parseFloat(\n assetPos.position.unrealizedPnl || '0',\n );\n const marginUsed = parseFloat(assetPos.position.marginUsed || '0');\n const returnOnEquity = parseFloat(\n assetPos.position.returnOnEquity || '0',\n );\n acc.totalUnrealizedPnl += unrealizedPnl;\n acc.weightedReturnOnEquity += returnOnEquity * marginUsed;\n return acc;\n },\n {\n totalUnrealizedPnl: 0,\n weightedReturnOnEquity: 0,\n },\n );\n const totalMarginUsed = parseFloat(\n perpsState.marginSummary.totalMarginUsed || '0',\n );\n const totalReturnOnEquityPercentage =\n totalMarginUsed > 0\n ? ((weightedReturnOnEquity / totalMarginUsed) * 100).toString()\n : '0';\n\n const perpsBalance = parseFloat(perpsState.marginSummary.accountValue);\n\n let spotBalance = 0;\n if (spotState?.balances && Array.isArray(spotState.balances)) {\n spotBalance = spotState.balances.reduce(\n (sum: number, balance: { total?: string }) =>\n sum + parseFloat(balance.total ?? '0'),\n 0,\n );\n }\n\n const totalBalance = (spotBalance + perpsBalance).toString();\n\n const accountState: AccountState = {\n availableBalance: perpsState.withdrawable || '0',\n totalBalance: totalBalance || '0',\n marginUsed: perpsState.marginSummary.totalMarginUsed || '0',\n unrealizedPnl: totalUnrealizedPnl.toString() || '0',\n returnOnEquity: totalReturnOnEquityPercentage || '0',\n };\n\n return accountState;\n}\n\nexport function buildAssetMapping(params: {\n metaUniverse: MetaResponse['universe'];\n dex?: string | null;\n perpDexIndex: number;\n}): {\n symbolToAssetId: Map<string, number>;\n assetIdToSymbol: Map<number, string>;\n} {\n const { metaUniverse, perpDexIndex } = params;\n const symbolToAssetId = new Map<string, number>();\n const assetIdToSymbol = new Map<number, string>();\n\n metaUniverse.forEach((asset, index) => {\n const assetId = calculateHip3AssetId(perpDexIndex, index);\n symbolToAssetId.set(asset.name, assetId);\n assetIdToSymbol.set(assetId, asset.name);\n });\n\n return { symbolToAssetId, assetIdToSymbol };\n}\n\nexport function formatHyperLiquidPrice(params: {\n price: string | number;\n szDecimals: number;\n}): string {\n const { price, szDecimals } = params;\n const priceNum = typeof price === 'string' ? parseFloat(price) : price;\n\n if (Number.isInteger(priceNum)) {\n return priceNum.toString();\n }\n\n const maxDecimalPlaces =\n DECIMAL_PRECISION_CONFIG.MaxPriceDecimals - szDecimals;\n\n let formattedPrice = priceNum.toFixed(maxDecimalPlaces);\n formattedPrice = parseFloat(formattedPrice).toString();\n\n const significantDigits = countSignificantFigures(formattedPrice);\n\n if (significantDigits > DECIMAL_PRECISION_CONFIG.MaxSignificantFigures) {\n formattedPrice = roundToSignificantFigures(formattedPrice);\n }\n\n return formattedPrice;\n}\n\nexport function formatHyperLiquidSize(params: {\n size: string | number;\n szDecimals: number;\n}): string {\n const { size, szDecimals } = params;\n const number = typeof size === 'string' ? parseFloat(size) : size;\n\n if (isNaN(number)) {\n return '0';\n }\n\n const formatted = number.toFixed(szDecimals);\n\n if (!formatted.includes('.')) {\n return formatted;\n }\n\n return formatted.replace(/\\.?0+$/u, '');\n}\n\nexport function calculatePositionSize(params: {\n usdValue: number;\n leverage: number;\n assetPrice: number;\n}): number {\n const { usdValue, leverage, assetPrice } = params;\n return (usdValue * leverage) / assetPrice;\n}\n\nexport function calculateHip3AssetId(\n perpDexIndex: number,\n indexInMeta: number,\n): number {\n if (perpDexIndex === 0) {\n return indexInMeta;\n }\n return (\n HIP3_ASSET_ID_CONFIG.BaseAssetId +\n perpDexIndex * HIP3_ASSET_ID_CONFIG.DexMultiplier +\n indexInMeta\n );\n}\n\nexport function parseAssetName(assetName: string): {\n dex: string | null;\n symbol: string;\n} {\n const colonIndex = assetName.indexOf(':');\n if (colonIndex === -1) {\n return { dex: null, symbol: assetName };\n }\n return {\n dex: assetName.substring(0, colonIndex),\n symbol: assetName.substring(colonIndex + 1),\n };\n}\n\nexport function adaptHyperLiquidLedgerUpdateToUserHistoryItem(\n rawLedgerUpdates: RawLedgerUpdate[],\n): UserHistoryItem[] {\n return (rawLedgerUpdates || [])\n .filter((update) => {\n if (update.delta.type === 'deposit') {\n return true;\n }\n if (update.delta.type === 'withdraw') {\n return true;\n }\n if (update.delta.type === 'internalTransfer') {\n const usdc = Number.parseFloat(update.delta.usdc ?? '0');\n if (Number.isNaN(usdc)) {\n return false;\n }\n return usdc > 0;\n }\n return false;\n })\n .map((update) => {\n let amount = '0';\n let asset = 'USDC';\n\n if (hasProperty(update.delta, 'usdc') && update.delta.usdc) {\n amount = Math.abs(parseFloat(update.delta.usdc)).toString();\n }\n if (\n hasProperty(update.delta, 'coin') &&\n typeof update.delta.coin === 'string'\n ) {\n asset = update.delta.coin;\n }\n\n return {\n id: `history-${update.hash}`,\n timestamp: update.time,\n amount,\n asset,\n txHash: update.hash,\n status: 'completed' as const,\n type: update.delta.type === 'withdraw' ? 'withdrawal' : 'deposit',\n details: {\n source: '',\n bridgeContract: undefined,\n recipient: undefined,\n blockNumber: undefined,\n chainId: undefined,\n synthetic: undefined,\n },\n };\n });\n}\n"]}
@@ -286,6 +286,10 @@ function applyPathFilters(assets, params, debugLogger) {
286
286
  after: filtered,
287
287
  });
288
288
  }
289
+ // Note: `in` is the idiomatic TypeScript way to narrow a string to
290
+ // `keyof typeof` for indexed access; `hasProperty` types the indexed
291
+ // result as `unknown` and loses the `{ testnet, mainnet }` shape.
292
+ /* eslint-disable-next-line no-restricted-syntax */
289
293
  if (params.symbol && params.symbol in hyperLiquidConfig_1.HYPERLIQUID_ASSET_CONFIGS) {
290
294
  const config = hyperLiquidConfig_1.HYPERLIQUID_ASSET_CONFIGS[params.symbol];
291
295
  const isTestnet = params.isTestnet ?? false;
@@ -1 +1 @@
1
- {"version":3,"file":"hyperLiquidValidation.cjs","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.cjs","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"]}