@metamask-previews/perps-controller 12.2.0-preview-e68ab1498 → 13.0.0-preview-56ae4c857

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 (106) hide show
  1. package/CHANGELOG.md +15 -6
  2. package/dist/PerpsController-method-action-types.cjs.map +1 -1
  3. package/dist/PerpsController-method-action-types.d.cts +26 -3
  4. package/dist/PerpsController-method-action-types.d.cts.map +1 -1
  5. package/dist/PerpsController-method-action-types.d.mts +26 -3
  6. package/dist/PerpsController-method-action-types.d.mts.map +1 -1
  7. package/dist/PerpsController-method-action-types.mjs.map +1 -1
  8. package/dist/PerpsController.cjs +392 -102
  9. package/dist/PerpsController.cjs.map +1 -1
  10. package/dist/PerpsController.d.cts +26 -7
  11. package/dist/PerpsController.d.cts.map +1 -1
  12. package/dist/PerpsController.d.mts +26 -7
  13. package/dist/PerpsController.d.mts.map +1 -1
  14. package/dist/PerpsController.mjs +392 -102
  15. package/dist/PerpsController.mjs.map +1 -1
  16. package/dist/constants/eventNames.cjs +1 -1
  17. package/dist/constants/eventNames.cjs.map +1 -1
  18. package/dist/constants/eventNames.d.cts +1 -1
  19. package/dist/constants/eventNames.d.mts +1 -1
  20. package/dist/constants/eventNames.mjs +1 -1
  21. package/dist/constants/eventNames.mjs.map +1 -1
  22. package/dist/constants/hyperLiquidConfig.cjs +14 -2
  23. package/dist/constants/hyperLiquidConfig.cjs.map +1 -1
  24. package/dist/constants/hyperLiquidConfig.d.cts +10 -0
  25. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -1
  26. package/dist/constants/hyperLiquidConfig.d.mts +10 -0
  27. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -1
  28. package/dist/constants/hyperLiquidConfig.mjs +12 -0
  29. package/dist/constants/hyperLiquidConfig.mjs.map +1 -1
  30. package/dist/constants/perpsConfig.cjs +3 -4
  31. package/dist/constants/perpsConfig.cjs.map +1 -1
  32. package/dist/constants/perpsConfig.d.cts +2 -4
  33. package/dist/constants/perpsConfig.d.cts.map +1 -1
  34. package/dist/constants/perpsConfig.d.mts +2 -4
  35. package/dist/constants/perpsConfig.d.mts.map +1 -1
  36. package/dist/constants/perpsConfig.mjs +3 -4
  37. package/dist/constants/perpsConfig.mjs.map +1 -1
  38. package/dist/index.cjs +8 -6
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +4 -3
  41. package/dist/index.d.cts.map +1 -1
  42. package/dist/index.d.mts +4 -3
  43. package/dist/index.d.mts.map +1 -1
  44. package/dist/index.mjs +1 -0
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/perpsErrorCodes.cjs +5 -1
  47. package/dist/perpsErrorCodes.cjs.map +1 -1
  48. package/dist/perpsErrorCodes.d.cts +4 -0
  49. package/dist/perpsErrorCodes.d.cts.map +1 -1
  50. package/dist/perpsErrorCodes.d.mts +4 -0
  51. package/dist/perpsErrorCodes.d.mts.map +1 -1
  52. package/dist/perpsErrorCodes.mjs +5 -1
  53. package/dist/perpsErrorCodes.mjs.map +1 -1
  54. package/dist/providers/AggregatedPerpsProvider.cjs +104 -14
  55. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -1
  56. package/dist/providers/AggregatedPerpsProvider.d.cts +34 -2
  57. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -1
  58. package/dist/providers/AggregatedPerpsProvider.d.mts +34 -2
  59. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -1
  60. package/dist/providers/AggregatedPerpsProvider.mjs +102 -13
  61. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -1
  62. package/dist/providers/HyperLiquidProvider.cjs +2141 -637
  63. package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
  64. package/dist/providers/HyperLiquidProvider.d.cts +37 -17
  65. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
  66. package/dist/providers/HyperLiquidProvider.d.mts +37 -17
  67. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
  68. package/dist/providers/HyperLiquidProvider.mjs +2146 -642
  69. package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
  70. package/dist/types/index.cjs.map +1 -1
  71. package/dist/types/index.d.cts +96 -3
  72. package/dist/types/index.d.cts.map +1 -1
  73. package/dist/types/index.d.mts +96 -3
  74. package/dist/types/index.d.mts.map +1 -1
  75. package/dist/types/index.mjs.map +1 -1
  76. package/dist/utils/capabilitySymbols.cjs +25 -0
  77. package/dist/utils/capabilitySymbols.cjs.map +1 -0
  78. package/dist/utils/capabilitySymbols.d.cts +15 -0
  79. package/dist/utils/capabilitySymbols.d.cts.map +1 -0
  80. package/dist/utils/capabilitySymbols.d.mts +15 -0
  81. package/dist/utils/capabilitySymbols.d.mts.map +1 -0
  82. package/dist/utils/capabilitySymbols.mjs +21 -0
  83. package/dist/utils/capabilitySymbols.mjs.map +1 -0
  84. package/dist/utils/hyperLiquidAdapter.cjs +20 -1
  85. package/dist/utils/hyperLiquidAdapter.cjs.map +1 -1
  86. package/dist/utils/hyperLiquidAdapter.d.cts +1 -0
  87. package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -1
  88. package/dist/utils/hyperLiquidAdapter.d.mts +1 -0
  89. package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -1
  90. package/dist/utils/hyperLiquidAdapter.mjs +19 -0
  91. package/dist/utils/hyperLiquidAdapter.mjs.map +1 -1
  92. package/dist/utils/hyperLiquidValidation.cjs +1 -1
  93. package/dist/utils/hyperLiquidValidation.cjs.map +1 -1
  94. package/dist/utils/hyperLiquidValidation.d.cts +1 -1
  95. package/dist/utils/hyperLiquidValidation.d.mts +1 -1
  96. package/dist/utils/hyperLiquidValidation.mjs +1 -1
  97. package/dist/utils/hyperLiquidValidation.mjs.map +1 -1
  98. package/dist/utils/stringParseUtils.cjs +17 -1
  99. package/dist/utils/stringParseUtils.cjs.map +1 -1
  100. package/dist/utils/stringParseUtils.d.cts +8 -0
  101. package/dist/utils/stringParseUtils.d.cts.map +1 -1
  102. package/dist/utils/stringParseUtils.d.mts +8 -0
  103. package/dist/utils/stringParseUtils.d.mts.map +1 -1
  104. package/dist/utils/stringParseUtils.mjs +15 -0
  105. package/dist/utils/stringParseUtils.mjs.map +1 -1
  106. package/package.json +1 -1
@@ -7,6 +7,8 @@ export declare const PERPS_ERROR_CODES: {
7
7
  readonly CLIENT_NOT_INITIALIZED: "CLIENT_NOT_INITIALIZED";
8
8
  readonly CLIENT_REINITIALIZING: "CLIENT_REINITIALIZING";
9
9
  readonly PROVIDER_NOT_AVAILABLE: "PROVIDER_NOT_AVAILABLE";
10
+ readonly PROVIDER_NOT_FOUND: "PROVIDER_NOT_FOUND";
11
+ readonly PROVIDER_LIFECYCLE_STALE: "PROVIDER_LIFECYCLE_STALE";
10
12
  readonly TOKEN_NOT_SUPPORTED: "TOKEN_NOT_SUPPORTED";
11
13
  readonly BRIDGE_CONTRACT_NOT_FOUND: "BRIDGE_CONTRACT_NOT_FOUND";
12
14
  readonly WITHDRAW_FAILED: "WITHDRAW_FAILED";
@@ -51,6 +53,7 @@ export declare const PERPS_ERROR_CODES: {
51
53
  readonly ORDER_STRATEGY_PARAMS_NOT_SUPPORTED: "ORDER_STRATEGY_PARAMS_NOT_SUPPORTED";
52
54
  readonly ORDER_STRATEGY_FIELD_UNSUPPORTED: "ORDER_STRATEGY_FIELD_UNSUPPORTED";
53
55
  readonly ORDER_STRATEGY_MARKET_UNSUPPORTED: "ORDER_STRATEGY_MARKET_UNSUPPORTED";
56
+ readonly ORDER_STRATEGY_ROUTE_UNAVAILABLE: "ORDER_STRATEGY_ROUTE_UNAVAILABLE";
54
57
  readonly ORDER_STRATEGY_HANDLE_UNKNOWN: "ORDER_STRATEGY_HANDLE_UNKNOWN";
55
58
  readonly ORDER_EDIT_STRATEGY_UNSUPPORTED: "ORDER_EDIT_STRATEGY_UNSUPPORTED";
56
59
  readonly ORDER_STRATEGY_CANCEL_INCOMPLETE: "ORDER_STRATEGY_CANCEL_INCOMPLETE";
@@ -90,6 +93,7 @@ export declare const PERPS_ERROR_CODES: {
90
93
  readonly POSITION_WOULD_FLIP: "POSITION_WOULD_FLIP";
91
94
  readonly MARGIN_ADJUSTMENT_FAILED: "MARGIN_ADJUSTMENT_FAILED";
92
95
  readonly TPSL_UPDATE_FAILED: "TPSL_UPDATE_FAILED";
96
+ readonly TPSL_PROTECTION_LOST: "TPSL_PROTECTION_LOST";
93
97
  readonly ORDER_REJECTED: "ORDER_REJECTED";
94
98
  readonly SLIPPAGE_EXCEEDED: "SLIPPAGE_EXCEEDED";
95
99
  readonly RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED";
@@ -1 +1 @@
1
- {"version":3,"file":"perpsErrorCodes.d.mts","sourceRoot":"","sources":["../src/perpsErrorCodes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkHpB,CAAC;AAEX,MAAM,MAAM,cAAc,GACxB,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"perpsErrorCodes.d.mts","sourceRoot":"","sources":["../src/perpsErrorCodes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsHpB,CAAC;AAEX,MAAM,MAAM,cAAc,GACxB,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC"}
@@ -7,6 +7,8 @@ export const PERPS_ERROR_CODES = {
7
7
  CLIENT_NOT_INITIALIZED: 'CLIENT_NOT_INITIALIZED',
8
8
  CLIENT_REINITIALIZING: 'CLIENT_REINITIALIZING',
9
9
  PROVIDER_NOT_AVAILABLE: 'PROVIDER_NOT_AVAILABLE',
10
+ PROVIDER_NOT_FOUND: 'PROVIDER_NOT_FOUND',
11
+ PROVIDER_LIFECYCLE_STALE: 'PROVIDER_LIFECYCLE_STALE',
10
12
  TOKEN_NOT_SUPPORTED: 'TOKEN_NOT_SUPPORTED',
11
13
  BRIDGE_CONTRACT_NOT_FOUND: 'BRIDGE_CONTRACT_NOT_FOUND',
12
14
  WITHDRAW_FAILED: 'WITHDRAW_FAILED',
@@ -59,7 +61,8 @@ export const PERPS_ERROR_CODES = {
59
61
  ORDER_STRATEGY_PARAMS_NOT_SUPPORTED: 'ORDER_STRATEGY_PARAMS_NOT_SUPPORTED', // Strategy field supplied on an order type that does not own it
60
62
  ORDER_STRATEGY_FIELD_UNSUPPORTED: 'ORDER_STRATEGY_FIELD_UNSUPPORTED', // price / triggerPrice / timeInForce / attached TP/SL supplied on a strategy placement
61
63
  ORDER_STRATEGY_MARKET_UNSUPPORTED: 'ORDER_STRATEGY_MARKET_UNSUPPORTED', // The provider cannot run a strategy placement on this market
62
- ORDER_STRATEGY_HANDLE_UNKNOWN: 'ORDER_STRATEGY_HANDLE_UNKNOWN', // Cancel referenced a scale group or chase session this provider does not hold
64
+ ORDER_STRATEGY_ROUTE_UNAVAILABLE: 'ORDER_STRATEGY_ROUTE_UNAVAILABLE', // The requested strategy provider route does not match the active direct provider
65
+ ORDER_STRATEGY_HANDLE_UNKNOWN: 'ORDER_STRATEGY_HANDLE_UNKNOWN', // Strategy cancel handle is invalid or this provider session does not hold it
63
66
  ORDER_EDIT_STRATEGY_UNSUPPORTED: 'ORDER_EDIT_STRATEGY_UNSUPPORTED', // editOrder cannot modify a strategy placement; cancel by its handle and place again
64
67
  ORDER_STRATEGY_CANCEL_INCOMPLETE: 'ORDER_STRATEGY_CANCEL_INCOMPLETE', // Part of a strategy placement is still resting after a cancel; the handle stays valid for a retry
65
68
  ORDER_TWAP_DURATION_REQUIRED: 'ORDER_TWAP_DURATION_REQUIRED', // TWAP placed without twapDuration
@@ -109,6 +112,7 @@ export const PERPS_ERROR_CODES = {
109
112
  POSITION_WOULD_FLIP: 'POSITION_WOULD_FLIP',
110
113
  MARGIN_ADJUSTMENT_FAILED: 'MARGIN_ADJUSTMENT_FAILED',
111
114
  TPSL_UPDATE_FAILED: 'TPSL_UPDATE_FAILED',
115
+ TPSL_PROTECTION_LOST: 'TPSL_PROTECTION_LOST',
112
116
  // Order execution errors
113
117
  ORDER_REJECTED: 'ORDER_REJECTED',
114
118
  SLIPPAGE_EXCEEDED: 'SLIPPAGE_EXCEEDED',
@@ -1 +1 @@
1
- {"version":3,"file":"perpsErrorCodes.mjs","sourceRoot":"","sources":["../src/perpsErrorCodes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Error codes for PerpsController\n * These codes are returned to the UI layer for translation\n * Extracted to separate file to avoid circular dependencies with translatePerpsError\n */\nexport const PERPS_ERROR_CODES = {\n CLIENT_NOT_INITIALIZED: 'CLIENT_NOT_INITIALIZED',\n CLIENT_REINITIALIZING: 'CLIENT_REINITIALIZING',\n PROVIDER_NOT_AVAILABLE: 'PROVIDER_NOT_AVAILABLE',\n TOKEN_NOT_SUPPORTED: 'TOKEN_NOT_SUPPORTED',\n BRIDGE_CONTRACT_NOT_FOUND: 'BRIDGE_CONTRACT_NOT_FOUND',\n WITHDRAW_FAILED: 'WITHDRAW_FAILED',\n POSITIONS_FAILED: 'POSITIONS_FAILED',\n ACCOUNT_STATE_FAILED: 'ACCOUNT_STATE_FAILED',\n MARKETS_FAILED: 'MARKETS_FAILED',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n // Provider-agnostic order errors\n ORDER_LEVERAGE_REDUCTION_FAILED: 'ORDER_LEVERAGE_REDUCTION_FAILED',\n // HyperLiquid-specific order errors\n IOC_CANCEL: 'IOC_CANCEL', // Order could not immediately match (insufficient liquidity)\n // Connection errors\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n // Validation errors - withdraw\n WITHDRAW_ASSET_ID_REQUIRED: 'WITHDRAW_ASSET_ID_REQUIRED',\n WITHDRAW_AMOUNT_REQUIRED: 'WITHDRAW_AMOUNT_REQUIRED',\n WITHDRAW_AMOUNT_POSITIVE: 'WITHDRAW_AMOUNT_POSITIVE',\n WITHDRAW_INVALID_DESTINATION: 'WITHDRAW_INVALID_DESTINATION',\n WITHDRAW_ASSET_NOT_SUPPORTED: 'WITHDRAW_ASSET_NOT_SUPPORTED',\n WITHDRAW_INSUFFICIENT_BALANCE: 'WITHDRAW_INSUFFICIENT_BALANCE',\n // Validation errors - deposit\n DEPOSIT_ASSET_ID_REQUIRED: 'DEPOSIT_ASSET_ID_REQUIRED',\n DEPOSIT_AMOUNT_REQUIRED: 'DEPOSIT_AMOUNT_REQUIRED',\n DEPOSIT_AMOUNT_POSITIVE: 'DEPOSIT_AMOUNT_POSITIVE',\n DEPOSIT_MINIMUM_AMOUNT: 'DEPOSIT_MINIMUM_AMOUNT',\n // Validation errors - order\n ORDER_COIN_REQUIRED: 'ORDER_COIN_REQUIRED',\n ORDER_LIMIT_PRICE_REQUIRED: 'ORDER_LIMIT_PRICE_REQUIRED',\n ORDER_PRICE_POSITIVE: 'ORDER_PRICE_POSITIVE',\n ORDER_UNKNOWN_COIN: 'ORDER_UNKNOWN_COIN',\n ORDER_SIZE_POSITIVE: 'ORDER_SIZE_POSITIVE',\n ORDER_PRICE_REQUIRED: 'ORDER_PRICE_REQUIRED',\n ORDER_SIZE_MIN: 'ORDER_SIZE_MIN',\n ORDER_LEVERAGE_INVALID: 'ORDER_LEVERAGE_INVALID',\n ORDER_LEVERAGE_BELOW_POSITION: 'ORDER_LEVERAGE_BELOW_POSITION',\n ORDER_MAX_VALUE_EXCEEDED: 'ORDER_MAX_VALUE_EXCEEDED',\n // Validation errors - trigger placement (stop / take profit) and partial TP/SL\n ORDER_TRIGGER_PRICE_REQUIRED: 'ORDER_TRIGGER_PRICE_REQUIRED', // stop_*/take_profit_* placed without a trigger price\n ORDER_TRIGGER_PRICE_POSITIVE: 'ORDER_TRIGGER_PRICE_POSITIVE',\n ORDER_TRIGGER_PRICE_NOT_SUPPORTED: 'ORDER_TRIGGER_PRICE_NOT_SUPPORTED', // Trigger price supplied for a market/limit order\n ORDER_TRIGGER_TPSL_UNSUPPORTED: 'ORDER_TRIGGER_TPSL_UNSUPPORTED', // Attached TP/SL on a trigger placement\n ORDER_TPSL_SIZE_INVALID: 'ORDER_TPSL_SIZE_INVALID', // Partial TP/SL size non-positive, larger than the order, or missing its price\n ORDER_EDIT_TRIGGER_UNSUPPORTED: 'ORDER_EDIT_TRIGGER_UNSUPPORTED', // editOrder cannot turn a resting order into a trigger placement\n ORDER_TPSL_LINKAGE_CONFLICT: 'ORDER_TPSL_LINKAGE_CONFLICT', // tpslLinkage and the deprecated grouping disagree\n ORDER_TPSL_POSITION_LINKAGE_UNSUPPORTED:\n 'ORDER_TPSL_POSITION_LINKAGE_UNSUPPORTED', // Position-linked TP/SL requested on an order placement; use updatePositionTPSL\n ORDER_TPSL_LINKAGE_REQUIRED: 'ORDER_TPSL_LINKAGE_REQUIRED', // Attached TP/SL requested with no linkage to parent or position\n ORDER_EDIT_ORDER_UNVERIFIABLE: 'ORDER_EDIT_ORDER_UNVERIFIABLE', // editOrder cannot confirm the resting order's placement type\n ORDER_TIME_IN_FORCE_NOT_SUPPORTED: 'ORDER_TIME_IN_FORCE_NOT_SUPPORTED', // Time in force supplied for an order shape that cannot carry one\n // Validation errors - strategy placement (twap / scale / chase)\n ORDER_STRATEGY_PARAMS_NOT_SUPPORTED: 'ORDER_STRATEGY_PARAMS_NOT_SUPPORTED', // Strategy field supplied on an order type that does not own it\n ORDER_STRATEGY_FIELD_UNSUPPORTED: 'ORDER_STRATEGY_FIELD_UNSUPPORTED', // price / triggerPrice / timeInForce / attached TP/SL supplied on a strategy placement\n ORDER_STRATEGY_MARKET_UNSUPPORTED: 'ORDER_STRATEGY_MARKET_UNSUPPORTED', // The provider cannot run a strategy placement on this market\n ORDER_STRATEGY_HANDLE_UNKNOWN: 'ORDER_STRATEGY_HANDLE_UNKNOWN', // Cancel referenced a scale group or chase session this provider does not hold\n ORDER_EDIT_STRATEGY_UNSUPPORTED: 'ORDER_EDIT_STRATEGY_UNSUPPORTED', // editOrder cannot modify a strategy placement; cancel by its handle and place again\n ORDER_STRATEGY_CANCEL_INCOMPLETE: 'ORDER_STRATEGY_CANCEL_INCOMPLETE', // Part of a strategy placement is still resting after a cancel; the handle stays valid for a retry\n ORDER_TWAP_DURATION_REQUIRED: 'ORDER_TWAP_DURATION_REQUIRED', // TWAP placed without twapDuration\n ORDER_TWAP_DURATION_INVALID: 'ORDER_TWAP_DURATION_INVALID', // twapDuration not a whole number of minutes within the venue's bounds\n ORDER_SCALE_RANGE_REQUIRED: 'ORDER_SCALE_RANGE_REQUIRED', // Scale placed without both ladder bounds\n ORDER_SCALE_RANGE_INVALID: 'ORDER_SCALE_RANGE_INVALID', // Scale ladder bounds or skew are invalid\n ORDER_SCALE_COUNT_INVALID: 'ORDER_SCALE_COUNT_INVALID', // scaleNumOrders missing, non-integer, or outside the supported ladder size\n ORDER_SCALE_SIZE_TOO_SMALL: 'ORDER_SCALE_SIZE_TOO_SMALL', // Total size cannot give every ladder rung a non-zero slice\n ORDER_SCALE_NOTIONAL_TOO_SMALL: 'ORDER_SCALE_NOTIONAL_TOO_SMALL', // Ladder notional split across the rungs leaves each below the venue's per-order minimum\n ORDER_TWAP_NOTIONAL_TOO_SMALL: 'ORDER_TWAP_NOTIONAL_TOO_SMALL', // TWAP total below the venue's documented minimum TWAP order size\n ORDER_CHASE_INTERVAL_INVALID: 'ORDER_CHASE_INTERVAL_INVALID', // chaseIntervalMs below the minimum poll interval\n ORDER_CHASE_DURATION_INVALID: 'ORDER_CHASE_DURATION_INVALID', // chaseMaxDurationMs shorter than one poll interval, or chaseMaxRepricings non-positive\n ORDER_CHASE_MAX_DISTANCE_INVALID: 'ORDER_CHASE_MAX_DISTANCE_INVALID', // chaseMaxDistanceBps must be finite, greater than 0, and less than 10,000 when supplied\n ORDER_CHASE_ABANDONED: 'ORDER_CHASE_ABANDONED', // The provider was torn down while the chase was being placed; its order rests but no strategy runs\n ORDER_CHASE_LIMIT_REACHED: 'ORDER_CHASE_LIMIT_REACHED', // The venue's cap on simultaneously active chase orders is already in use\n ORDER_CHASE_TOUCH_UNAVAILABLE: 'ORDER_CHASE_TOUCH_UNAVAILABLE', // The order book returned no price on the side the chase must rest at\n // HyperLiquid client/service errors\n EXCHANGE_CLIENT_NOT_AVAILABLE: 'EXCHANGE_CLIENT_NOT_AVAILABLE',\n INFO_CLIENT_NOT_AVAILABLE: 'INFO_CLIENT_NOT_AVAILABLE',\n SUBSCRIPTION_CLIENT_NOT_AVAILABLE: 'SUBSCRIPTION_CLIENT_NOT_AVAILABLE',\n // Wallet/account errors\n NO_ACCOUNT_SELECTED: 'NO_ACCOUNT_SELECTED',\n KEYRING_LOCKED: 'KEYRING_LOCKED',\n INVALID_ADDRESS_FORMAT: 'INVALID_ADDRESS_FORMAT',\n // Wallet has no account on the exchange yet (HyperLiquid creates accounts\n // server-side on the first USDC credit). Actionable: the user must fund the\n // account before any order can be placed.\n EXCHANGE_ACCOUNT_NOT_FOUND: 'EXCHANGE_ACCOUNT_NOT_FOUND',\n // HyperLiquid exchange rejects agent-signed writes for multi-sig accounts\n // without a multi-sig wrapper, or when the action nonce is stale/reused.\n EXCHANGE_MULTI_SIG_REQUIRED: 'EXCHANGE_MULTI_SIG_REQUIRED',\n EXCHANGE_INVALID_NONCE: 'EXCHANGE_INVALID_NONCE',\n // Transfer/swap errors\n TRANSFER_FAILED: 'TRANSFER_FAILED',\n SWAP_FAILED: 'SWAP_FAILED',\n SPOT_PAIR_NOT_FOUND: 'SPOT_PAIR_NOT_FOUND',\n PRICE_UNAVAILABLE: 'PRICE_UNAVAILABLE',\n // Market/collateral errors\n UNSUPPORTED_COLLATERAL: 'UNSUPPORTED_COLLATERAL', // DEX collateral token is not USDC (TAT-3304)\n // Batch operation errors\n BATCH_CANCEL_FAILED: 'BATCH_CANCEL_FAILED',\n BATCH_CLOSE_FAILED: 'BATCH_CLOSE_FAILED',\n // Position/margin errors\n INSUFFICIENT_MARGIN: 'INSUFFICIENT_MARGIN',\n INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',\n REDUCE_ONLY_VIOLATION: 'REDUCE_ONLY_VIOLATION',\n POSITION_WOULD_FLIP: 'POSITION_WOULD_FLIP',\n MARGIN_ADJUSTMENT_FAILED: 'MARGIN_ADJUSTMENT_FAILED',\n TPSL_UPDATE_FAILED: 'TPSL_UPDATE_FAILED',\n // Order execution errors\n ORDER_REJECTED: 'ORDER_REJECTED',\n SLIPPAGE_EXCEEDED: 'SLIPPAGE_EXCEEDED',\n RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED',\n // Network/service errors\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\n NETWORK_ERROR: 'NETWORK_ERROR',\n} as const;\n\nexport type PerpsErrorCode =\n (typeof PERPS_ERROR_CODES)[keyof typeof PERPS_ERROR_CODES];\n"]}
1
+ {"version":3,"file":"perpsErrorCodes.mjs","sourceRoot":"","sources":["../src/perpsErrorCodes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Error codes for PerpsController\n * These codes are returned to the UI layer for translation\n * Extracted to separate file to avoid circular dependencies with translatePerpsError\n */\nexport const PERPS_ERROR_CODES = {\n CLIENT_NOT_INITIALIZED: 'CLIENT_NOT_INITIALIZED',\n CLIENT_REINITIALIZING: 'CLIENT_REINITIALIZING',\n PROVIDER_NOT_AVAILABLE: 'PROVIDER_NOT_AVAILABLE',\n PROVIDER_NOT_FOUND: 'PROVIDER_NOT_FOUND',\n PROVIDER_LIFECYCLE_STALE: 'PROVIDER_LIFECYCLE_STALE',\n TOKEN_NOT_SUPPORTED: 'TOKEN_NOT_SUPPORTED',\n BRIDGE_CONTRACT_NOT_FOUND: 'BRIDGE_CONTRACT_NOT_FOUND',\n WITHDRAW_FAILED: 'WITHDRAW_FAILED',\n POSITIONS_FAILED: 'POSITIONS_FAILED',\n ACCOUNT_STATE_FAILED: 'ACCOUNT_STATE_FAILED',\n MARKETS_FAILED: 'MARKETS_FAILED',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n // Provider-agnostic order errors\n ORDER_LEVERAGE_REDUCTION_FAILED: 'ORDER_LEVERAGE_REDUCTION_FAILED',\n // HyperLiquid-specific order errors\n IOC_CANCEL: 'IOC_CANCEL', // Order could not immediately match (insufficient liquidity)\n // Connection errors\n CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',\n // Validation errors - withdraw\n WITHDRAW_ASSET_ID_REQUIRED: 'WITHDRAW_ASSET_ID_REQUIRED',\n WITHDRAW_AMOUNT_REQUIRED: 'WITHDRAW_AMOUNT_REQUIRED',\n WITHDRAW_AMOUNT_POSITIVE: 'WITHDRAW_AMOUNT_POSITIVE',\n WITHDRAW_INVALID_DESTINATION: 'WITHDRAW_INVALID_DESTINATION',\n WITHDRAW_ASSET_NOT_SUPPORTED: 'WITHDRAW_ASSET_NOT_SUPPORTED',\n WITHDRAW_INSUFFICIENT_BALANCE: 'WITHDRAW_INSUFFICIENT_BALANCE',\n // Validation errors - deposit\n DEPOSIT_ASSET_ID_REQUIRED: 'DEPOSIT_ASSET_ID_REQUIRED',\n DEPOSIT_AMOUNT_REQUIRED: 'DEPOSIT_AMOUNT_REQUIRED',\n DEPOSIT_AMOUNT_POSITIVE: 'DEPOSIT_AMOUNT_POSITIVE',\n DEPOSIT_MINIMUM_AMOUNT: 'DEPOSIT_MINIMUM_AMOUNT',\n // Validation errors - order\n ORDER_COIN_REQUIRED: 'ORDER_COIN_REQUIRED',\n ORDER_LIMIT_PRICE_REQUIRED: 'ORDER_LIMIT_PRICE_REQUIRED',\n ORDER_PRICE_POSITIVE: 'ORDER_PRICE_POSITIVE',\n ORDER_UNKNOWN_COIN: 'ORDER_UNKNOWN_COIN',\n ORDER_SIZE_POSITIVE: 'ORDER_SIZE_POSITIVE',\n ORDER_PRICE_REQUIRED: 'ORDER_PRICE_REQUIRED',\n ORDER_SIZE_MIN: 'ORDER_SIZE_MIN',\n ORDER_LEVERAGE_INVALID: 'ORDER_LEVERAGE_INVALID',\n ORDER_LEVERAGE_BELOW_POSITION: 'ORDER_LEVERAGE_BELOW_POSITION',\n ORDER_MAX_VALUE_EXCEEDED: 'ORDER_MAX_VALUE_EXCEEDED',\n // Validation errors - trigger placement (stop / take profit) and partial TP/SL\n ORDER_TRIGGER_PRICE_REQUIRED: 'ORDER_TRIGGER_PRICE_REQUIRED', // stop_*/take_profit_* placed without a trigger price\n ORDER_TRIGGER_PRICE_POSITIVE: 'ORDER_TRIGGER_PRICE_POSITIVE',\n ORDER_TRIGGER_PRICE_NOT_SUPPORTED: 'ORDER_TRIGGER_PRICE_NOT_SUPPORTED', // Trigger price supplied for a market/limit order\n ORDER_TRIGGER_TPSL_UNSUPPORTED: 'ORDER_TRIGGER_TPSL_UNSUPPORTED', // Attached TP/SL on a trigger placement\n ORDER_TPSL_SIZE_INVALID: 'ORDER_TPSL_SIZE_INVALID', // Partial TP/SL size non-positive, larger than the order, or missing its price\n ORDER_EDIT_TRIGGER_UNSUPPORTED: 'ORDER_EDIT_TRIGGER_UNSUPPORTED', // editOrder cannot turn a resting order into a trigger placement\n ORDER_TPSL_LINKAGE_CONFLICT: 'ORDER_TPSL_LINKAGE_CONFLICT', // tpslLinkage and the deprecated grouping disagree\n ORDER_TPSL_POSITION_LINKAGE_UNSUPPORTED:\n 'ORDER_TPSL_POSITION_LINKAGE_UNSUPPORTED', // Position-linked TP/SL requested on an order placement; use updatePositionTPSL\n ORDER_TPSL_LINKAGE_REQUIRED: 'ORDER_TPSL_LINKAGE_REQUIRED', // Attached TP/SL requested with no linkage to parent or position\n ORDER_EDIT_ORDER_UNVERIFIABLE: 'ORDER_EDIT_ORDER_UNVERIFIABLE', // editOrder cannot confirm the resting order's placement type\n ORDER_TIME_IN_FORCE_NOT_SUPPORTED: 'ORDER_TIME_IN_FORCE_NOT_SUPPORTED', // Time in force supplied for an order shape that cannot carry one\n // Validation errors - strategy placement (twap / scale / chase)\n ORDER_STRATEGY_PARAMS_NOT_SUPPORTED: 'ORDER_STRATEGY_PARAMS_NOT_SUPPORTED', // Strategy field supplied on an order type that does not own it\n ORDER_STRATEGY_FIELD_UNSUPPORTED: 'ORDER_STRATEGY_FIELD_UNSUPPORTED', // price / triggerPrice / timeInForce / attached TP/SL supplied on a strategy placement\n ORDER_STRATEGY_MARKET_UNSUPPORTED: 'ORDER_STRATEGY_MARKET_UNSUPPORTED', // The provider cannot run a strategy placement on this market\n ORDER_STRATEGY_ROUTE_UNAVAILABLE: 'ORDER_STRATEGY_ROUTE_UNAVAILABLE', // The requested strategy provider route does not match the active direct provider\n ORDER_STRATEGY_HANDLE_UNKNOWN: 'ORDER_STRATEGY_HANDLE_UNKNOWN', // Strategy cancel handle is invalid or this provider session does not hold it\n ORDER_EDIT_STRATEGY_UNSUPPORTED: 'ORDER_EDIT_STRATEGY_UNSUPPORTED', // editOrder cannot modify a strategy placement; cancel by its handle and place again\n ORDER_STRATEGY_CANCEL_INCOMPLETE: 'ORDER_STRATEGY_CANCEL_INCOMPLETE', // Part of a strategy placement is still resting after a cancel; the handle stays valid for a retry\n ORDER_TWAP_DURATION_REQUIRED: 'ORDER_TWAP_DURATION_REQUIRED', // TWAP placed without twapDuration\n ORDER_TWAP_DURATION_INVALID: 'ORDER_TWAP_DURATION_INVALID', // twapDuration not a whole number of minutes within the venue's bounds\n ORDER_SCALE_RANGE_REQUIRED: 'ORDER_SCALE_RANGE_REQUIRED', // Scale placed without both ladder bounds\n ORDER_SCALE_RANGE_INVALID: 'ORDER_SCALE_RANGE_INVALID', // Scale ladder bounds or skew are invalid\n ORDER_SCALE_COUNT_INVALID: 'ORDER_SCALE_COUNT_INVALID', // scaleNumOrders missing, non-integer, or outside the supported ladder size\n ORDER_SCALE_SIZE_TOO_SMALL: 'ORDER_SCALE_SIZE_TOO_SMALL', // Total size cannot give every ladder rung a non-zero slice\n ORDER_SCALE_NOTIONAL_TOO_SMALL: 'ORDER_SCALE_NOTIONAL_TOO_SMALL', // Ladder notional split across the rungs leaves each below the venue's per-order minimum\n ORDER_TWAP_NOTIONAL_TOO_SMALL: 'ORDER_TWAP_NOTIONAL_TOO_SMALL', // TWAP total below the venue's documented minimum TWAP order size\n ORDER_CHASE_INTERVAL_INVALID: 'ORDER_CHASE_INTERVAL_INVALID', // chaseIntervalMs below the minimum poll interval\n ORDER_CHASE_DURATION_INVALID: 'ORDER_CHASE_DURATION_INVALID', // chaseMaxDurationMs shorter than one poll interval, or chaseMaxRepricings non-positive\n ORDER_CHASE_MAX_DISTANCE_INVALID: 'ORDER_CHASE_MAX_DISTANCE_INVALID', // chaseMaxDistanceBps must be finite, greater than 0, and less than 10,000 when supplied\n ORDER_CHASE_ABANDONED: 'ORDER_CHASE_ABANDONED', // The provider was torn down while the chase was being placed; its order rests but no strategy runs\n ORDER_CHASE_LIMIT_REACHED: 'ORDER_CHASE_LIMIT_REACHED', // The venue's cap on simultaneously active chase orders is already in use\n ORDER_CHASE_TOUCH_UNAVAILABLE: 'ORDER_CHASE_TOUCH_UNAVAILABLE', // The order book returned no price on the side the chase must rest at\n // HyperLiquid client/service errors\n EXCHANGE_CLIENT_NOT_AVAILABLE: 'EXCHANGE_CLIENT_NOT_AVAILABLE',\n INFO_CLIENT_NOT_AVAILABLE: 'INFO_CLIENT_NOT_AVAILABLE',\n SUBSCRIPTION_CLIENT_NOT_AVAILABLE: 'SUBSCRIPTION_CLIENT_NOT_AVAILABLE',\n // Wallet/account errors\n NO_ACCOUNT_SELECTED: 'NO_ACCOUNT_SELECTED',\n KEYRING_LOCKED: 'KEYRING_LOCKED',\n INVALID_ADDRESS_FORMAT: 'INVALID_ADDRESS_FORMAT',\n // Wallet has no account on the exchange yet (HyperLiquid creates accounts\n // server-side on the first USDC credit). Actionable: the user must fund the\n // account before any order can be placed.\n EXCHANGE_ACCOUNT_NOT_FOUND: 'EXCHANGE_ACCOUNT_NOT_FOUND',\n // HyperLiquid exchange rejects agent-signed writes for multi-sig accounts\n // without a multi-sig wrapper, or when the action nonce is stale/reused.\n EXCHANGE_MULTI_SIG_REQUIRED: 'EXCHANGE_MULTI_SIG_REQUIRED',\n EXCHANGE_INVALID_NONCE: 'EXCHANGE_INVALID_NONCE',\n // Transfer/swap errors\n TRANSFER_FAILED: 'TRANSFER_FAILED',\n SWAP_FAILED: 'SWAP_FAILED',\n SPOT_PAIR_NOT_FOUND: 'SPOT_PAIR_NOT_FOUND',\n PRICE_UNAVAILABLE: 'PRICE_UNAVAILABLE',\n // Market/collateral errors\n UNSUPPORTED_COLLATERAL: 'UNSUPPORTED_COLLATERAL', // DEX collateral token is not USDC (TAT-3304)\n // Batch operation errors\n BATCH_CANCEL_FAILED: 'BATCH_CANCEL_FAILED',\n BATCH_CLOSE_FAILED: 'BATCH_CLOSE_FAILED',\n // Position/margin errors\n INSUFFICIENT_MARGIN: 'INSUFFICIENT_MARGIN',\n INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',\n REDUCE_ONLY_VIOLATION: 'REDUCE_ONLY_VIOLATION',\n POSITION_WOULD_FLIP: 'POSITION_WOULD_FLIP',\n MARGIN_ADJUSTMENT_FAILED: 'MARGIN_ADJUSTMENT_FAILED',\n TPSL_UPDATE_FAILED: 'TPSL_UPDATE_FAILED',\n TPSL_PROTECTION_LOST: 'TPSL_PROTECTION_LOST',\n // Order execution errors\n ORDER_REJECTED: 'ORDER_REJECTED',\n SLIPPAGE_EXCEEDED: 'SLIPPAGE_EXCEEDED',\n RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED',\n // Network/service errors\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\n NETWORK_ERROR: 'NETWORK_ERROR',\n} as const;\n\nexport type PerpsErrorCode =\n (typeof PERPS_ERROR_CODES)[keyof typeof PERPS_ERROR_CODES];\n"]}
@@ -27,10 +27,24 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
27
27
  };
28
28
  var _AggregatedPerpsProvider_instances, _AggregatedPerpsProvider_providers, _AggregatedPerpsProvider_defaultProvider, _AggregatedPerpsProvider_aggregationMode, _AggregatedPerpsProvider_deps, _AggregatedPerpsProvider_router, _AggregatedPerpsProvider_subscriptionMux, _AggregatedPerpsProvider_getActiveProviders, _AggregatedPerpsProvider_getDefaultProvider, _AggregatedPerpsProvider_getProviderOrDefault, _AggregatedPerpsProvider_extractSuccessfulResults;
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.AggregatedPerpsProvider = void 0;
30
+ exports.AggregatedPerpsProvider = exports.ChaseOrderSuspensionError = void 0;
31
31
  const SubscriptionMultiplexer_js_1 = require("../aggregation/SubscriptionMultiplexer.cjs");
32
+ const perpsErrorCodes_js_1 = require("../perpsErrorCodes.cjs");
32
33
  const ProviderRouter_js_1 = require("../routing/ProviderRouter.cjs");
33
34
  const index_js_1 = require("../types/index.cjs");
35
+ /** Error returned when only some providers suspend their Chase orders. */
36
+ class ChaseOrderSuspensionError extends Error {
37
+ constructor(options) {
38
+ const failedProviderIds = options.failures
39
+ .map(({ providerId }) => providerId)
40
+ .join(', ');
41
+ super(`Failed to suspend Chase orders for: ${failedProviderIds}`);
42
+ this.name = 'ChaseOrderSuspensionError';
43
+ this.suspendedOrders = options.suspendedOrders;
44
+ this.failures = options.failures;
45
+ }
46
+ }
47
+ exports.ChaseOrderSuspensionError = ChaseOrderSuspensionError;
34
48
  /**
35
49
  * AggregatedPerpsProvider implements PerpsProvider by coordinating
36
50
  * multiple backend providers.
@@ -63,6 +77,7 @@ class AggregatedPerpsProvider {
63
77
  constructor(config) {
64
78
  _AggregatedPerpsProvider_instances.add(this);
65
79
  this.protocolId = 'aggregated';
80
+ this.routesOrdersByProviderId = true;
66
81
  _AggregatedPerpsProvider_providers.set(this, void 0);
67
82
  _AggregatedPerpsProvider_defaultProvider.set(this, void 0);
68
83
  _AggregatedPerpsProvider_aggregationMode.set(this, void 0);
@@ -96,6 +111,54 @@ class AggregatedPerpsProvider {
96
111
  getWithdrawalRoutes(params) {
97
112
  return __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getDefaultProvider).call(this).getWithdrawalRoutes(params);
98
113
  }
114
+ /**
115
+ * Resolve capabilities with the same explicit-provider/default-provider
116
+ * selection used by order placement. Unknown routes return a typed
117
+ * unavailable result instead of throwing a placement error.
118
+ *
119
+ * @param params - Market and optional provider route.
120
+ * @returns Capabilities from the selected provider.
121
+ */
122
+ async getOrderCapabilities(params) {
123
+ const providerId = params.providerId ?? __classPrivateFieldGet(this, _AggregatedPerpsProvider_defaultProvider, "f");
124
+ const provider = __classPrivateFieldGet(this, _AggregatedPerpsProvider_providers, "f").get(providerId);
125
+ if (!provider) {
126
+ return {
127
+ status: 'unavailable',
128
+ providerId,
129
+ reason: 'provider_not_found',
130
+ };
131
+ }
132
+ if (!provider.getOrderCapabilities) {
133
+ return { status: 'unavailable', providerId, reason: 'not_implemented' };
134
+ }
135
+ try {
136
+ const capabilities = await provider.getOrderCapabilities({
137
+ ...params,
138
+ providerId,
139
+ });
140
+ if (capabilities.providerId !== undefined &&
141
+ capabilities.providerId !== providerId) {
142
+ return {
143
+ status: 'unavailable',
144
+ providerId,
145
+ reason: 'provider_not_routable',
146
+ };
147
+ }
148
+ return { ...capabilities, providerId };
149
+ }
150
+ catch (error) {
151
+ __classPrivateFieldGet(this, _AggregatedPerpsProvider_deps, "f").debugLogger.log('[AggregatedPerpsProvider] Order capabilities unavailable', {
152
+ providerId,
153
+ error: error instanceof Error ? error.message : String(error),
154
+ });
155
+ return {
156
+ status: 'unavailable',
157
+ providerId,
158
+ reason: 'provider_unavailable',
159
+ };
160
+ }
161
+ }
99
162
  // ============================================================================
100
163
  // Read Operations (Aggregate from all providers)
101
164
  // ============================================================================
@@ -229,6 +292,20 @@ class AggregatedPerpsProvider {
229
292
  const result = await provider.placeOrder(params);
230
293
  return { ...result, providerId };
231
294
  }
295
+ /**
296
+ * Read TWAP lifecycle records from every active provider.
297
+ *
298
+ * @returns TWAP records with their provider route attached.
299
+ */
300
+ async getTwapOrders() {
301
+ const results = await Promise.allSettled(__classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getActiveProviders).call(this).map(async ([providerId, provider]) => provider.getTwapOrders
302
+ ? (await provider.getTwapOrders()).map((order) => ({
303
+ ...order,
304
+ providerId,
305
+ }))
306
+ : []));
307
+ return __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_extractSuccessfulResults).call(this, results, 'getTwapOrders').flat();
308
+ }
232
309
  /**
233
310
  * Read all available snapshots, retaining successful providers on a partial failure.
234
311
  *
@@ -249,24 +326,35 @@ class AggregatedPerpsProvider {
249
326
  * suspended, so callers may retry to reconcile a partial failure.
250
327
  *
251
328
  * @returns Chase snapshots after every provider suspends successfully.
252
- * @throws If any active provider fails to suspend its Chase orders.
329
+ * @throws ChaseOrderSuspensionError if any active provider fails. The error
330
+ * includes successful snapshots and each failed provider ID.
253
331
  */
254
332
  async suspendChaseOrders() {
255
- const results = await Promise.allSettled(__classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getActiveProviders).call(this).map(async ([providerId, provider]) => provider.suspendChaseOrders
333
+ const providers = __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getActiveProviders).call(this);
334
+ const results = await Promise.allSettled(providers.map(async ([providerId, provider]) => provider.suspendChaseOrders
256
335
  ? (await provider.suspendChaseOrders()).map((order) => ({
257
336
  ...order,
258
337
  providerId,
259
338
  }))
260
339
  : []));
261
- const failure = results.find((result) => result.status === 'rejected');
262
- if (failure?.status === 'rejected') {
263
- throw failure.reason;
264
- }
265
340
  const snapshots = [];
266
- for (const result of results) {
341
+ const failures = [];
342
+ results.forEach((result, index) => {
267
343
  if (result.status === 'fulfilled') {
268
344
  snapshots.push(...result.value);
269
345
  }
346
+ else {
347
+ failures.push({
348
+ providerId: providers[index][0],
349
+ reason: result.reason,
350
+ });
351
+ }
352
+ });
353
+ if (failures.length > 0) {
354
+ throw new ChaseOrderSuspensionError({
355
+ suspendedOrders: snapshots,
356
+ failures,
357
+ });
270
358
  }
271
359
  return snapshots;
272
360
  }
@@ -361,7 +449,8 @@ class AggregatedPerpsProvider {
361
449
  return __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getDefaultProvider).call(this).getMaxLeverage(asset);
362
450
  }
363
451
  async calculateFees(params) {
364
- return __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getDefaultProvider).call(this).calculateFees(params);
452
+ const [, provider] = __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getProviderOrDefault).call(this, params.providerId);
453
+ return provider.calculateFees(params);
365
454
  }
366
455
  // ============================================================================
367
456
  // Subscriptions (Multiplex via SubscriptionMultiplexer)
@@ -577,13 +666,14 @@ _AggregatedPerpsProvider_providers = new WeakMap(), _AggregatedPerpsProvider_def
577
666
  }
578
667
  return provider;
579
668
  }, _AggregatedPerpsProvider_getProviderOrDefault = function _AggregatedPerpsProvider_getProviderOrDefault(providerId) {
580
- const id = providerId ?? __classPrivateFieldGet(this, _AggregatedPerpsProvider_defaultProvider, "f");
581
- const provider = __classPrivateFieldGet(this, _AggregatedPerpsProvider_providers, "f").get(id);
582
- if (!provider) {
583
- __classPrivateFieldGet(this, _AggregatedPerpsProvider_deps, "f").debugLogger.log(`[AggregatedPerpsProvider] Provider '${id}' not found, using default`);
669
+ if (providerId === undefined) {
584
670
  return [__classPrivateFieldGet(this, _AggregatedPerpsProvider_defaultProvider, "f"), __classPrivateFieldGet(this, _AggregatedPerpsProvider_instances, "m", _AggregatedPerpsProvider_getDefaultProvider).call(this)];
585
671
  }
586
- return [id, provider];
672
+ const provider = __classPrivateFieldGet(this, _AggregatedPerpsProvider_providers, "f").get(providerId);
673
+ if (!provider) {
674
+ throw new Error(perpsErrorCodes_js_1.PERPS_ERROR_CODES.PROVIDER_NOT_FOUND);
675
+ }
676
+ return [providerId, provider];
587
677
  }, _AggregatedPerpsProvider_extractSuccessfulResults = function _AggregatedPerpsProvider_extractSuccessfulResults(results, context) {
588
678
  const successful = [];
589
679
  results.forEach((result, index) => {
@@ -1 +1 @@
1
- {"version":3,"file":"AggregatedPerpsProvider.cjs","sourceRoot":"","sources":["../../src/providers/AggregatedPerpsProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AggregatedPerpsProvider - Multi-provider aggregation wrapper\n *\n * Implements PerpsProvider interface to enable seamless multi-provider support.\n * Aggregates read operations from all providers, routes write operations to specific\n * providers based on params.providerId or default provider.\n *\n * Phase 1 Implementation:\n * - Read operations: Aggregate from all providers using Promise.allSettled()\n * - Write operations: Route to params.providerId ?? defaultProvider\n * - Subscriptions: Multiplex via SubscriptionMultiplexer\n * - Lifecycle: Delegate to default provider\n *\n * All returned data includes providerId field for UI differentiation.\n */\n\nimport type { CaipAccountId } from '@metamask/utils';\n\nimport { SubscriptionMultiplexer } from '../aggregation/SubscriptionMultiplexer.js';\nimport { ProviderRouter } from '../routing/ProviderRouter.js';\nimport { WebSocketConnectionState } from '../types/index.js';\nimport type {\n AccountState,\n AggregatedProviderConfig,\n AggregationMode,\n AssetRoute,\n BatchCancelOrdersParams,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersResult,\n ChaseOrder,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n DepositParams,\n DisconnectResult,\n EditOrderParams,\n FeeCalculationParams,\n FeeCalculationResult,\n Funding,\n GetAccountStateParams,\n GetAvailableDexsParams,\n GetFundingParams,\n GetHistoricalPortfolioParams,\n GetMarketsParams,\n GetOrderFillsParams,\n GetOrdersParams,\n GetOrFetchFillsParams,\n GetPositionsParams,\n GetSupportedPathsParams,\n HistoricalPortfolioResult,\n InitializeResult,\n PerpsPlatformDependencies,\n PerpsProvider,\n LiquidationPriceParams,\n LiveDataConfig,\n MaintenanceMarginParams,\n MarginResult,\n MarketInfo,\n Order,\n OrderFill,\n OrderParams,\n OrderResult,\n PerpsMarketData,\n PerpsProviderType,\n Position,\n ReadyToTradeResult,\n SubscribeAccountParams,\n SubscribeCandlesParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribePositionsParams,\n SubscribePricesParams,\n ToggleTestnetResult,\n UpdateMarginParams,\n UpdatePositionTPSLParams,\n UserHistoryItem,\n WithdrawParams,\n WithdrawResult,\n RawLedgerUpdate,\n PerpsReadOptions,\n PerpsFeeResolution,\n} from '../types/index.js';\n\n/**\n * AggregatedPerpsProvider implements PerpsProvider by coordinating\n * multiple backend providers.\n *\n * Design principles:\n * 1. Read operations aggregate from all providers (parallel)\n * 2. Write operations route to specific provider (explicit > default)\n * 3. Lifecycle operations delegate to default provider\n * 4. All returned data includes providerId for UI differentiation\n *\n * @example\n * ```typescript\n * const aggregated = new AggregatedPerpsProvider({\n * providers: new Map([\n * ['hyperliquid', hlProvider],\n * ['myx', myxProvider],\n * ]),\n * defaultProvider: 'hyperliquid',\n * infrastructure: deps,\n * });\n *\n * // Read: returns positions from all providers\n * const positions = await aggregated.getPositions();\n *\n * // Write: routes to specific or default provider\n * await aggregated.placeOrder({ symbol: 'BTC', providerId: 'myx', ... });\n * ```\n */\nexport class AggregatedPerpsProvider implements PerpsProvider {\n readonly protocolId = 'aggregated';\n\n readonly #providers: Map<PerpsProviderType, PerpsProvider>;\n\n readonly #defaultProvider: PerpsProviderType;\n\n readonly #aggregationMode: AggregationMode;\n\n readonly #deps: PerpsPlatformDependencies;\n\n readonly #router: ProviderRouter;\n\n readonly #subscriptionMux: SubscriptionMultiplexer;\n\n constructor(config: AggregatedProviderConfig) {\n this.#providers = config.providers;\n this.#defaultProvider = config.defaultProvider;\n this.#aggregationMode = config.aggregationMode ?? 'all';\n this.#deps = config.infrastructure;\n\n // Initialize router with default provider\n this.#router = new ProviderRouter({\n defaultProvider: this.#defaultProvider,\n });\n\n // Initialize subscription multiplexer with logger for error reporting\n this.#subscriptionMux = new SubscriptionMultiplexer({\n logger: this.#deps.logger,\n });\n\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] Initialized', {\n providers: Array.from(this.#providers.keys()),\n defaultProvider: this.#defaultProvider,\n aggregationMode: this.#aggregationMode,\n });\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n /**\n * Get list of active providers as tuples for iteration.\n * Returns array of [providerId, provider] pairs.\n *\n * @returns The result of the operation.\n */\n #getActiveProviders(): [PerpsProviderType, PerpsProvider][] {\n return Array.from(this.#providers.entries());\n }\n\n /**\n * Get the default provider instance.\n * Throws if default provider is not available.\n *\n * @returns The result of the operation.\n */\n #getDefaultProvider(): PerpsProvider {\n const provider = this.#providers.get(this.#defaultProvider);\n if (!provider) {\n throw new Error(\n `[AggregatedPerpsProvider] Default provider '${this.#defaultProvider}' not available`,\n );\n }\n return provider;\n }\n\n /**\n * Get provider by ID, falling back to default if not found.\n *\n * @param providerId - The provider id value.\n * @returns The result of the operation.\n */\n #getProviderOrDefault(\n providerId?: PerpsProviderType,\n ): [PerpsProviderType, PerpsProvider] {\n const id = providerId ?? this.#defaultProvider;\n const provider = this.#providers.get(id);\n if (!provider) {\n this.#deps.debugLogger.log(\n `[AggregatedPerpsProvider] Provider '${id}' not found, using default`,\n );\n return [this.#defaultProvider, this.#getDefaultProvider()];\n }\n return [id, provider];\n }\n\n /**\n * Extract successful results from Promise.allSettled.\n * Logs errors for failed promises.\n *\n * @param results - Results from Promise.allSettled\n * @param context - Context string for logging\n * @returns Array of successful values\n */\n #extractSuccessfulResults<TResult>(\n results: PromiseSettledResult<TResult>[],\n context: string,\n ): TResult[] {\n const successful: TResult[] = [];\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n successful.push(result.value);\n } else {\n this.#deps.debugLogger.log(\n `[AggregatedPerpsProvider] ${context} failed for provider ${index}`,\n { error: result.reason },\n );\n }\n });\n return successful;\n }\n\n // ============================================================================\n // Asset Routes (Synchronous - delegate to default provider)\n // ============================================================================\n\n getDepositRoutes(params?: GetSupportedPathsParams): AssetRoute[] {\n return this.#getDefaultProvider().getDepositRoutes(params);\n }\n\n getWithdrawalRoutes(params?: GetSupportedPathsParams): AssetRoute[] {\n return this.#getDefaultProvider().getWithdrawalRoutes(params);\n }\n\n // ============================================================================\n // Read Operations (Aggregate from all providers)\n // ============================================================================\n\n async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const positions = await provider.getPositions(params);\n return positions.map((pos) => ({ ...pos, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getPositions').flat();\n }\n\n async getAccountState(params?: GetAccountStateParams): Promise<AccountState> {\n // Return account state from default provider with providerId injected\n const provider = this.#getDefaultProvider();\n const state = await provider.getAccountState(params);\n return { ...state, providerId: this.#defaultProvider };\n }\n\n async getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const markets = await provider.getMarkets(params);\n return markets.map((market) => ({ ...market, providerId: id }));\n }),\n );\n\n const allMarkets = this.#extractSuccessfulResults(\n results,\n 'getMarkets',\n ).flat();\n\n // Deduplicate markets by name (keep first occurrence)\n const seen = new Set<string>();\n return allMarkets.filter((market) => {\n // Use providerId:name as unique key to allow same market from different providers\n const key = `${market.providerId}:${market.name}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n\n async getMarketDataWithPrices(): Promise<PerpsMarketData[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const data = await provider.getMarketDataWithPrices();\n return data.map((item) => ({ ...item, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(\n results,\n 'getMarketDataWithPrices',\n ).flat();\n }\n\n async getOrderFills(\n params?: GetOrderFillsParams,\n options?: PerpsReadOptions,\n ): Promise<OrderFill[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const fills = await provider.getOrderFills(params, options);\n return fills.map((fill) => ({ ...fill, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOrderFills').flat();\n }\n\n async getOrFetchFills(params?: GetOrFetchFillsParams): Promise<OrderFill[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const fills = await provider.getOrFetchFills(params);\n return fills.map((fill) => ({ ...fill, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOrFetchFills').flat();\n }\n\n async getOrders(\n params?: GetOrdersParams,\n options?: PerpsReadOptions,\n ): Promise<Order[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const orders = await provider.getOrders(params, options);\n return orders.map((order) => ({ ...order, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOrders').flat();\n }\n\n async getOpenOrders(params?: GetOrdersParams): Promise<Order[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const orders = await provider.getOpenOrders(params);\n return orders.map((order) => ({ ...order, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOpenOrders').flat();\n }\n\n async getFunding(\n params?: GetFundingParams,\n options?: PerpsReadOptions,\n ): Promise<Funding[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([_providerId, provider]) => {\n const funding = await provider.getFunding(params, options);\n // Funding type doesn't have providerId - we could add it if needed\n return funding;\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getFunding').flat();\n }\n\n async getHistoricalPortfolio(\n params?: GetHistoricalPortfolioParams,\n ): Promise<HistoricalPortfolioResult> {\n // Delegate to default provider\n return this.#getDefaultProvider().getHistoricalPortfolio(params);\n }\n\n /**\n * Get user non-funding ledger updates from default provider.\n *\n * @param params - Optional parameters\n * @param params.accountId - Account ID to filter by\n * @param params.startTime - Start time filter\n * @param params.endTime - End time filter\n * @returns Raw ledger updates\n */\n async getUserNonFundingLedgerUpdates(params?: {\n accountId?: string;\n startTime?: number;\n endTime?: number;\n }): Promise<RawLedgerUpdate[]> {\n // Delegate to default provider (protocol-specific)\n return this.#getDefaultProvider().getUserNonFundingLedgerUpdates(params);\n }\n\n /**\n * Resolve the currently selected CAIP account identifier. Accounts are\n * shared across sub-providers (same InternalAccountController), so the\n * default provider's view is authoritative.\n *\n * @returns Resolved CAIP account id from the default sub-provider.\n */\n async getCurrentAccountId(): Promise<CaipAccountId> {\n return this.#getDefaultProvider().getCurrentAccountId();\n }\n\n /**\n * Get user history from all providers.\n *\n * @param params - Optional parameters\n * @param params.accountId - Account ID to filter by\n * @param params.startTime - Start time filter\n * @param params.endTime - End time filter\n * @returns Aggregated user history with providerId\n */\n async getUserHistory(params?: {\n accountId?: CaipAccountId;\n startTime?: number;\n endTime?: number;\n }): Promise<UserHistoryItem[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const history = await provider.getUserHistory(params);\n return history.map((item) => ({ ...item, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getUserHistory').flat();\n }\n\n // ============================================================================\n // Write Operations (Route to specific provider)\n // ============================================================================\n\n async placeOrder(params: OrderParams): Promise<OrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] placeOrder routing', {\n requestedProvider: params.providerId,\n actualProvider: providerId,\n symbol: params.symbol,\n });\n\n const result = await provider.placeOrder(params);\n return { ...result, providerId };\n }\n\n /**\n * Read all available snapshots, retaining successful providers on a partial failure.\n *\n * @returns Chase snapshots from every provider that responded successfully.\n */\n async getChaseOrders(): Promise<ChaseOrder[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([providerId, provider]) =>\n provider.getChaseOrders\n ? (await provider.getChaseOrders()).map((order) => ({\n ...order,\n providerId,\n }))\n : [],\n ),\n );\n\n return this.#extractSuccessfulResults(results, 'getChaseOrders').flat();\n }\n\n /**\n * Attempt to suspend every provider and reject after all attempts settle if\n * any provider could not suspend safely. Successful providers remain\n * suspended, so callers may retry to reconcile a partial failure.\n *\n * @returns Chase snapshots after every provider suspends successfully.\n * @throws If any active provider fails to suspend its Chase orders.\n */\n async suspendChaseOrders(): Promise<ChaseOrder[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([providerId, provider]) =>\n provider.suspendChaseOrders\n ? (await provider.suspendChaseOrders()).map((order) => ({\n ...order,\n providerId,\n }))\n : [],\n ),\n );\n\n const failure = results.find((result) => result.status === 'rejected');\n if (failure?.status === 'rejected') {\n throw failure.reason;\n }\n\n const snapshots: ChaseOrder[] = [];\n for (const result of results) {\n if (result.status === 'fulfilled') {\n snapshots.push(...result.value);\n }\n }\n return snapshots;\n }\n\n async editOrder(params: EditOrderParams): Promise<OrderResult> {\n // EditOrderParams contains OrderParams in newOrder which may have providerId\n const [providerId, provider] = this.#getProviderOrDefault(\n params.newOrder.providerId,\n );\n const result = await provider.editOrder(params);\n return { ...result, providerId };\n }\n\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n const result = await provider.cancelOrder(params);\n return { ...result, providerId };\n }\n\n async cancelOrders(\n params: BatchCancelOrdersParams,\n ): Promise<CancelOrdersResult> {\n // Batch cancel delegates to default provider\n const provider = this.#getDefaultProvider();\n if (!provider.cancelOrders) {\n return {\n success: false,\n successCount: 0,\n failureCount: params.length,\n results: params.map((param) => ({\n orderId: param.orderId,\n symbol: param.symbol,\n success: false,\n error: 'Batch cancel not supported',\n })),\n };\n }\n return provider.cancelOrders(params);\n }\n\n async closePosition(params: ClosePositionParams): Promise<OrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n const result = await provider.closePosition(params);\n return { ...result, providerId };\n }\n\n async closePositions(\n params: ClosePositionsParams,\n ): Promise<ClosePositionsResult> {\n // Batch close delegates to default provider\n const provider = this.#getDefaultProvider();\n if (!provider.closePositions) {\n return {\n success: false,\n successCount: 0,\n failureCount: 0,\n results: [],\n };\n }\n return provider.closePositions(params);\n }\n\n async updatePositionTPSL(\n params: UpdatePositionTPSLParams,\n ): Promise<OrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n const result = await provider.updatePositionTPSL(params);\n return { ...result, providerId };\n }\n\n async updateMargin(params: UpdateMarginParams): Promise<MarginResult> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.updateMargin(params);\n }\n\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.withdraw(params);\n }\n\n // ============================================================================\n // Validation (Route to specific provider)\n // ============================================================================\n\n async validateDeposit(\n params: DepositParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n return this.#getDefaultProvider().validateDeposit(params);\n }\n\n async validateOrder(\n params: OrderParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.validateOrder(params);\n }\n\n async validateClosePosition(\n params: ClosePositionParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.validateClosePosition(params);\n }\n\n async validateWithdrawal(\n params: WithdrawParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.validateWithdrawal(params);\n }\n\n // ============================================================================\n // Protocol Calculations (Delegate to default or route)\n // ============================================================================\n\n async calculateLiquidationPrice(\n params: LiquidationPriceParams,\n ): Promise<string> {\n return this.#getDefaultProvider().calculateLiquidationPrice(params);\n }\n\n async calculateMaintenanceMargin(\n params: MaintenanceMarginParams,\n ): Promise<number> {\n return this.#getDefaultProvider().calculateMaintenanceMargin(params);\n }\n\n async getMaxLeverage(asset: string): Promise<number> {\n return this.#getDefaultProvider().getMaxLeverage(asset);\n }\n\n async calculateFees(\n params: FeeCalculationParams,\n ): Promise<FeeCalculationResult> {\n return this.#getDefaultProvider().calculateFees(params);\n }\n\n // ============================================================================\n // Subscriptions (Multiplex via SubscriptionMultiplexer)\n // ============================================================================\n\n subscribeToPrices(params: SubscribePricesParams): () => void {\n return this.#subscriptionMux.subscribeToPrices({\n ...params,\n providers: this.#getActiveProviders(),\n aggregationMode: 'merge',\n });\n }\n\n subscribeToPositions(params: SubscribePositionsParams): () => void {\n return this.#subscriptionMux.subscribeToPositions({\n ...params,\n providers: this.#getActiveProviders(),\n });\n }\n\n subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n return this.#subscriptionMux.subscribeToOrderFills({\n ...params,\n providers: this.#getActiveProviders(),\n });\n }\n\n subscribeToOrders(params: SubscribeOrdersParams): () => void {\n return this.#subscriptionMux.subscribeToOrders({\n ...params,\n providers: this.#getActiveProviders(),\n });\n }\n\n subscribeToAccount(params: SubscribeAccountParams): () => void {\n // For account subscriptions, we emit as array for multi-provider\n // but the callback expects single AccountState\n // Delegate to default provider for now\n return this.#getDefaultProvider().subscribeToAccount(params);\n }\n\n subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n // Delegate to default provider\n return this.#getDefaultProvider().subscribeToOICaps(params);\n }\n\n subscribeToCandles(params: SubscribeCandlesParams): () => void {\n // Delegate to default provider\n return this.#getDefaultProvider().subscribeToCandles(params);\n }\n\n subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n // Delegate to default provider\n return this.#getDefaultProvider().subscribeToOrderBook(params);\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n setLiveDataConfig(config: Partial<LiveDataConfig>): void {\n // Apply config to all providers\n this.#providers.forEach((provider) => {\n provider.setLiveDataConfig(config);\n });\n }\n\n setUserFeeDiscount(discountBips: number | undefined): void {\n // Apply to all providers that support it\n this.#providers.forEach((provider) => {\n if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(discountBips);\n }\n });\n }\n\n setUserFeeResolution(resolution: PerpsFeeResolution | undefined): void {\n this.#providers.forEach((provider) => {\n if (provider.setUserFeeResolution) {\n provider.setUserFeeResolution(resolution);\n } else if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(resolution?.discountBips);\n }\n });\n }\n\n async approveSubscriptionBuilderFee(): Promise<boolean> {\n const provider =\n this.#providers.get('hyperliquid') ?? this.#getDefaultProvider();\n return provider.approveSubscriptionBuilderFee\n ? provider.approveSubscriptionBuilderFee()\n : false;\n }\n\n // ============================================================================\n // Lifecycle (Delegate to default provider)\n // ============================================================================\n\n async toggleTestnet(): Promise<ToggleTestnetResult> {\n return this.#getDefaultProvider().toggleTestnet();\n }\n\n async initialize(): Promise<InitializeResult> {\n // Initialize default provider\n const result = await this.#getDefaultProvider().initialize();\n\n // Optionally initialize other providers in background\n // For Phase 1, we only initialize default provider\n return result;\n }\n\n async isReadyToTrade(): Promise<ReadyToTradeResult> {\n return this.#getDefaultProvider().isReadyToTrade();\n }\n\n async disconnect(): Promise<DisconnectResult> {\n // Disconnect all providers\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(([, provider]) => provider.disconnect()),\n );\n\n // Clear subscription cache\n this.#subscriptionMux.clearCache();\n\n // Return success if at least one succeeded\n const successCount = results.filter(\n (res) => res.status === 'fulfilled' && res.value.success,\n ).length;\n\n return {\n success: successCount > 0,\n };\n }\n\n async ping(timeoutMs?: number): Promise<void> {\n return this.#getDefaultProvider().ping(timeoutMs);\n }\n\n getWebSocketConnectionState(): WebSocketConnectionState {\n const provider = this.#getDefaultProvider();\n if (provider.getWebSocketConnectionState) {\n return provider.getWebSocketConnectionState();\n }\n return WebSocketConnectionState.Disconnected;\n }\n\n subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n const provider = this.#getDefaultProvider();\n if (provider.subscribeToConnectionState) {\n return provider.subscribeToConnectionState(listener);\n }\n listener(WebSocketConnectionState.Disconnected, 0);\n return () => {\n /* noop */\n };\n }\n\n async reconnect(): Promise<void> {\n const provider = this.#getDefaultProvider();\n if (provider.reconnect) {\n await provider.reconnect();\n }\n }\n\n // ============================================================================\n // Block Explorer\n // ============================================================================\n\n getBlockExplorerUrl(address?: string): string {\n return this.#getDefaultProvider().getBlockExplorerUrl(address);\n }\n\n // ============================================================================\n // HIP-3 (Optional)\n // ============================================================================\n\n async getAvailableDexs(params?: GetAvailableDexsParams): Promise<string[]> {\n const provider = this.#getDefaultProvider();\n if (!provider.getAvailableDexs) {\n return [];\n }\n return provider.getAvailableDexs(params);\n }\n\n // ============================================================================\n // Provider Management\n // ============================================================================\n\n /**\n * Add a new provider to the aggregated provider.\n *\n * @param providerId - Unique identifier for the provider\n * @param provider - Provider instance\n */\n addProvider(providerId: PerpsProviderType, provider: PerpsProvider): void {\n this.#providers.set(providerId, provider);\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] Provider added', {\n providerId,\n });\n }\n\n /**\n * Remove a provider from the aggregated provider.\n *\n * @param providerId - Provider to remove\n * @returns true if removed, false if not found\n */\n removeProvider(providerId: PerpsProviderType): boolean {\n const removed = this.#providers.delete(providerId);\n if (removed) {\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] Provider removed', {\n providerId,\n });\n }\n return removed;\n }\n\n /**\n * Get list of all registered provider IDs.\n *\n * @returns The result of the operation.\n */\n getProviderIds(): PerpsProviderType[] {\n return Array.from(this.#providers.keys());\n }\n\n /**\n * Check if a provider is registered.\n *\n * @param providerId - The provider id value.\n * @returns True if the condition is met.\n */\n hasProvider(providerId: PerpsProviderType): boolean {\n return this.#providers.has(providerId);\n }\n\n /**\n * Get the router instance for external configuration.\n *\n * @returns The result of the operation.\n */\n getRouter(): ProviderRouter {\n return this.#router;\n }\n}\n"]}
1
+ {"version":3,"file":"AggregatedPerpsProvider.cjs","sourceRoot":"","sources":["../../src/providers/AggregatedPerpsProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AggregatedPerpsProvider - Multi-provider aggregation wrapper\n *\n * Implements PerpsProvider interface to enable seamless multi-provider support.\n * Aggregates read operations from all providers, routes write operations to specific\n * providers based on params.providerId or default provider.\n *\n * Phase 1 Implementation:\n * - Read operations: Aggregate from all providers using Promise.allSettled()\n * - Write operations: Route to params.providerId ?? defaultProvider\n * - Subscriptions: Multiplex via SubscriptionMultiplexer\n * - Lifecycle: Delegate to default provider\n *\n * All returned data includes providerId field for UI differentiation.\n */\n\nimport type { CaipAccountId } from '@metamask/utils';\n\nimport { SubscriptionMultiplexer } from '../aggregation/SubscriptionMultiplexer.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport { ProviderRouter } from '../routing/ProviderRouter.js';\nimport { WebSocketConnectionState } from '../types/index.js';\nimport type {\n AccountState,\n AggregatedProviderConfig,\n AggregationMode,\n AssetRoute,\n BatchCancelOrdersParams,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersResult,\n ChaseOrder,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n DepositParams,\n DisconnectResult,\n EditOrderParams,\n FeeCalculationParams,\n FeeCalculationResult,\n Funding,\n GetAccountStateParams,\n GetAvailableDexsParams,\n GetFundingParams,\n GetHistoricalPortfolioParams,\n GetMarketsParams,\n GetOrderCapabilitiesParams,\n GetOrderFillsParams,\n GetOrdersParams,\n GetOrFetchFillsParams,\n GetPositionsParams,\n GetSupportedPathsParams,\n HistoricalPortfolioResult,\n InitializeResult,\n PerpsPlatformDependencies,\n PerpsProvider,\n LiquidationPriceParams,\n LiveDataConfig,\n MaintenanceMarginParams,\n MarginResult,\n MarketInfo,\n Order,\n OrderFill,\n OrderParams,\n OrderResult,\n PerpsMarketData,\n PerpsOrderCapabilities,\n PerpsProviderType,\n Position,\n ReadyToTradeResult,\n SubscribeAccountParams,\n SubscribeCandlesParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribePositionsParams,\n SubscribePricesParams,\n ToggleTestnetResult,\n TwapOrder,\n UpdateMarginParams,\n UpdatePositionTPSLParams,\n UserHistoryItem,\n WithdrawParams,\n WithdrawResult,\n RawLedgerUpdate,\n PerpsReadOptions,\n PerpsFeeResolution,\n} from '../types/index.js';\n\n/** Error returned when only some providers suspend their Chase orders. */\nexport class ChaseOrderSuspensionError extends Error {\n readonly suspendedOrders: ChaseOrder[];\n\n readonly failures: { providerId: PerpsProviderType; reason: unknown }[];\n\n constructor(options: {\n suspendedOrders: ChaseOrder[];\n failures: { providerId: PerpsProviderType; reason: unknown }[];\n }) {\n const failedProviderIds = options.failures\n .map(({ providerId }) => providerId)\n .join(', ');\n super(`Failed to suspend Chase orders for: ${failedProviderIds}`);\n this.name = 'ChaseOrderSuspensionError';\n this.suspendedOrders = options.suspendedOrders;\n this.failures = options.failures;\n }\n}\n\n/**\n * AggregatedPerpsProvider implements PerpsProvider by coordinating\n * multiple backend providers.\n *\n * Design principles:\n * 1. Read operations aggregate from all providers (parallel)\n * 2. Write operations route to specific provider (explicit > default)\n * 3. Lifecycle operations delegate to default provider\n * 4. All returned data includes providerId for UI differentiation\n *\n * @example\n * ```typescript\n * const aggregated = new AggregatedPerpsProvider({\n * providers: new Map([\n * ['hyperliquid', hlProvider],\n * ['myx', myxProvider],\n * ]),\n * defaultProvider: 'hyperliquid',\n * infrastructure: deps,\n * });\n *\n * // Read: returns positions from all providers\n * const positions = await aggregated.getPositions();\n *\n * // Write: routes to specific or default provider\n * await aggregated.placeOrder({ symbol: 'BTC', providerId: 'myx', ... });\n * ```\n */\nexport class AggregatedPerpsProvider implements PerpsProvider {\n readonly protocolId = 'aggregated';\n\n readonly routesOrdersByProviderId = true;\n\n readonly #providers: Map<PerpsProviderType, PerpsProvider>;\n\n readonly #defaultProvider: PerpsProviderType;\n\n readonly #aggregationMode: AggregationMode;\n\n readonly #deps: PerpsPlatformDependencies;\n\n readonly #router: ProviderRouter;\n\n readonly #subscriptionMux: SubscriptionMultiplexer;\n\n constructor(config: AggregatedProviderConfig) {\n this.#providers = config.providers;\n this.#defaultProvider = config.defaultProvider;\n this.#aggregationMode = config.aggregationMode ?? 'all';\n this.#deps = config.infrastructure;\n\n // Initialize router with default provider\n this.#router = new ProviderRouter({\n defaultProvider: this.#defaultProvider,\n });\n\n // Initialize subscription multiplexer with logger for error reporting\n this.#subscriptionMux = new SubscriptionMultiplexer({\n logger: this.#deps.logger,\n });\n\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] Initialized', {\n providers: Array.from(this.#providers.keys()),\n defaultProvider: this.#defaultProvider,\n aggregationMode: this.#aggregationMode,\n });\n }\n\n // ============================================================================\n // Helper Methods\n // ============================================================================\n\n /**\n * Get list of active providers as tuples for iteration.\n * Returns array of [providerId, provider] pairs.\n *\n * @returns The result of the operation.\n */\n #getActiveProviders(): [PerpsProviderType, PerpsProvider][] {\n return Array.from(this.#providers.entries());\n }\n\n /**\n * Get the default provider instance.\n * Throws if default provider is not available.\n *\n * @returns The result of the operation.\n */\n #getDefaultProvider(): PerpsProvider {\n const provider = this.#providers.get(this.#defaultProvider);\n if (!provider) {\n throw new Error(\n `[AggregatedPerpsProvider] Default provider '${this.#defaultProvider}' not available`,\n );\n }\n return provider;\n }\n\n /**\n * Get the explicit provider, or the default when no route was supplied.\n *\n * @param providerId - The provider id value.\n * @returns The selected provider id and instance.\n * @throws If an explicit provider is not registered.\n */\n #getProviderOrDefault(\n providerId?: PerpsProviderType,\n ): [PerpsProviderType, PerpsProvider] {\n if (providerId === undefined) {\n return [this.#defaultProvider, this.#getDefaultProvider()];\n }\n\n const provider = this.#providers.get(providerId);\n if (!provider) {\n throw new Error(PERPS_ERROR_CODES.PROVIDER_NOT_FOUND);\n }\n return [providerId, provider];\n }\n\n /**\n * Extract successful results from Promise.allSettled.\n * Logs errors for failed promises.\n *\n * @param results - Results from Promise.allSettled\n * @param context - Context string for logging\n * @returns Array of successful values\n */\n #extractSuccessfulResults<TResult>(\n results: PromiseSettledResult<TResult>[],\n context: string,\n ): TResult[] {\n const successful: TResult[] = [];\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n successful.push(result.value);\n } else {\n this.#deps.debugLogger.log(\n `[AggregatedPerpsProvider] ${context} failed for provider ${index}`,\n { error: result.reason },\n );\n }\n });\n return successful;\n }\n\n // ============================================================================\n // Asset Routes (Synchronous - delegate to default provider)\n // ============================================================================\n\n getDepositRoutes(params?: GetSupportedPathsParams): AssetRoute[] {\n return this.#getDefaultProvider().getDepositRoutes(params);\n }\n\n getWithdrawalRoutes(params?: GetSupportedPathsParams): AssetRoute[] {\n return this.#getDefaultProvider().getWithdrawalRoutes(params);\n }\n\n /**\n * Resolve capabilities with the same explicit-provider/default-provider\n * selection used by order placement. Unknown routes return a typed\n * unavailable result instead of throwing a placement error.\n *\n * @param params - Market and optional provider route.\n * @returns Capabilities from the selected provider.\n */\n async getOrderCapabilities(\n params: GetOrderCapabilitiesParams,\n ): Promise<PerpsOrderCapabilities> {\n const providerId = params.providerId ?? this.#defaultProvider;\n const provider = this.#providers.get(providerId);\n if (!provider) {\n return {\n status: 'unavailable',\n providerId,\n reason: 'provider_not_found',\n };\n }\n if (!provider.getOrderCapabilities) {\n return { status: 'unavailable', providerId, reason: 'not_implemented' };\n }\n try {\n const capabilities = await provider.getOrderCapabilities({\n ...params,\n providerId,\n });\n if (\n capabilities.providerId !== undefined &&\n capabilities.providerId !== providerId\n ) {\n return {\n status: 'unavailable',\n providerId,\n reason: 'provider_not_routable',\n };\n }\n return { ...capabilities, providerId };\n } catch (error) {\n this.#deps.debugLogger.log(\n '[AggregatedPerpsProvider] Order capabilities unavailable',\n {\n providerId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n return {\n status: 'unavailable',\n providerId,\n reason: 'provider_unavailable',\n };\n }\n }\n\n // ============================================================================\n // Read Operations (Aggregate from all providers)\n // ============================================================================\n\n async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const positions = await provider.getPositions(params);\n return positions.map((pos) => ({ ...pos, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getPositions').flat();\n }\n\n async getAccountState(params?: GetAccountStateParams): Promise<AccountState> {\n // Return account state from default provider with providerId injected\n const provider = this.#getDefaultProvider();\n const state = await provider.getAccountState(params);\n return { ...state, providerId: this.#defaultProvider };\n }\n\n async getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const markets = await provider.getMarkets(params);\n return markets.map((market) => ({ ...market, providerId: id }));\n }),\n );\n\n const allMarkets = this.#extractSuccessfulResults(\n results,\n 'getMarkets',\n ).flat();\n\n // Deduplicate markets by name (keep first occurrence)\n const seen = new Set<string>();\n return allMarkets.filter((market) => {\n // Use providerId:name as unique key to allow same market from different providers\n const key = `${market.providerId}:${market.name}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n\n async getMarketDataWithPrices(): Promise<PerpsMarketData[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const data = await provider.getMarketDataWithPrices();\n return data.map((item) => ({ ...item, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(\n results,\n 'getMarketDataWithPrices',\n ).flat();\n }\n\n async getOrderFills(\n params?: GetOrderFillsParams,\n options?: PerpsReadOptions,\n ): Promise<OrderFill[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const fills = await provider.getOrderFills(params, options);\n return fills.map((fill) => ({ ...fill, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOrderFills').flat();\n }\n\n async getOrFetchFills(params?: GetOrFetchFillsParams): Promise<OrderFill[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const fills = await provider.getOrFetchFills(params);\n return fills.map((fill) => ({ ...fill, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOrFetchFills').flat();\n }\n\n async getOrders(\n params?: GetOrdersParams,\n options?: PerpsReadOptions,\n ): Promise<Order[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const orders = await provider.getOrders(params, options);\n return orders.map((order) => ({ ...order, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOrders').flat();\n }\n\n async getOpenOrders(params?: GetOrdersParams): Promise<Order[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const orders = await provider.getOpenOrders(params);\n return orders.map((order) => ({ ...order, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getOpenOrders').flat();\n }\n\n async getFunding(\n params?: GetFundingParams,\n options?: PerpsReadOptions,\n ): Promise<Funding[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([_providerId, provider]) => {\n const funding = await provider.getFunding(params, options);\n // Funding type doesn't have providerId - we could add it if needed\n return funding;\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getFunding').flat();\n }\n\n async getHistoricalPortfolio(\n params?: GetHistoricalPortfolioParams,\n ): Promise<HistoricalPortfolioResult> {\n // Delegate to default provider\n return this.#getDefaultProvider().getHistoricalPortfolio(params);\n }\n\n /**\n * Get user non-funding ledger updates from default provider.\n *\n * @param params - Optional parameters\n * @param params.accountId - Account ID to filter by\n * @param params.startTime - Start time filter\n * @param params.endTime - End time filter\n * @returns Raw ledger updates\n */\n async getUserNonFundingLedgerUpdates(params?: {\n accountId?: string;\n startTime?: number;\n endTime?: number;\n }): Promise<RawLedgerUpdate[]> {\n // Delegate to default provider (protocol-specific)\n return this.#getDefaultProvider().getUserNonFundingLedgerUpdates(params);\n }\n\n /**\n * Resolve the currently selected CAIP account identifier. Accounts are\n * shared across sub-providers (same InternalAccountController), so the\n * default provider's view is authoritative.\n *\n * @returns Resolved CAIP account id from the default sub-provider.\n */\n async getCurrentAccountId(): Promise<CaipAccountId> {\n return this.#getDefaultProvider().getCurrentAccountId();\n }\n\n /**\n * Get user history from all providers.\n *\n * @param params - Optional parameters\n * @param params.accountId - Account ID to filter by\n * @param params.startTime - Start time filter\n * @param params.endTime - End time filter\n * @returns Aggregated user history with providerId\n */\n async getUserHistory(params?: {\n accountId?: CaipAccountId;\n startTime?: number;\n endTime?: number;\n }): Promise<UserHistoryItem[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([id, provider]) => {\n const history = await provider.getUserHistory(params);\n return history.map((item) => ({ ...item, providerId: id }));\n }),\n );\n\n return this.#extractSuccessfulResults(results, 'getUserHistory').flat();\n }\n\n // ============================================================================\n // Write Operations (Route to specific provider)\n // ============================================================================\n\n async placeOrder(params: OrderParams): Promise<OrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] placeOrder routing', {\n requestedProvider: params.providerId,\n actualProvider: providerId,\n symbol: params.symbol,\n });\n\n const result = await provider.placeOrder(params);\n return { ...result, providerId };\n }\n\n /**\n * Read TWAP lifecycle records from every active provider.\n *\n * @returns TWAP records with their provider route attached.\n */\n async getTwapOrders(): Promise<TwapOrder[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([providerId, provider]) =>\n provider.getTwapOrders\n ? (await provider.getTwapOrders()).map((order) => ({\n ...order,\n providerId,\n }))\n : [],\n ),\n );\n\n return this.#extractSuccessfulResults(results, 'getTwapOrders').flat();\n }\n\n /**\n * Read all available snapshots, retaining successful providers on a partial failure.\n *\n * @returns Chase snapshots from every provider that responded successfully.\n */\n async getChaseOrders(): Promise<ChaseOrder[]> {\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(async ([providerId, provider]) =>\n provider.getChaseOrders\n ? (await provider.getChaseOrders()).map((order) => ({\n ...order,\n providerId,\n }))\n : [],\n ),\n );\n\n return this.#extractSuccessfulResults(results, 'getChaseOrders').flat();\n }\n\n /**\n * Attempt to suspend every provider and reject after all attempts settle if\n * any provider could not suspend safely. Successful providers remain\n * suspended, so callers may retry to reconcile a partial failure.\n *\n * @returns Chase snapshots after every provider suspends successfully.\n * @throws ChaseOrderSuspensionError if any active provider fails. The error\n * includes successful snapshots and each failed provider ID.\n */\n async suspendChaseOrders(): Promise<ChaseOrder[]> {\n const providers = this.#getActiveProviders();\n const results = await Promise.allSettled(\n providers.map(async ([providerId, provider]) =>\n provider.suspendChaseOrders\n ? (await provider.suspendChaseOrders()).map((order) => ({\n ...order,\n providerId,\n }))\n : [],\n ),\n );\n\n const snapshots: ChaseOrder[] = [];\n const failures: {\n providerId: PerpsProviderType;\n reason: unknown;\n }[] = [];\n results.forEach((result, index) => {\n if (result.status === 'fulfilled') {\n snapshots.push(...result.value);\n } else {\n failures.push({\n providerId: providers[index][0],\n reason: result.reason,\n });\n }\n });\n if (failures.length > 0) {\n throw new ChaseOrderSuspensionError({\n suspendedOrders: snapshots,\n failures,\n });\n }\n return snapshots;\n }\n\n async editOrder(params: EditOrderParams): Promise<OrderResult> {\n // EditOrderParams contains OrderParams in newOrder which may have providerId\n const [providerId, provider] = this.#getProviderOrDefault(\n params.newOrder.providerId,\n );\n const result = await provider.editOrder(params);\n return { ...result, providerId };\n }\n\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n const result = await provider.cancelOrder(params);\n return { ...result, providerId };\n }\n\n async cancelOrders(\n params: BatchCancelOrdersParams,\n ): Promise<CancelOrdersResult> {\n // Batch cancel delegates to default provider\n const provider = this.#getDefaultProvider();\n if (!provider.cancelOrders) {\n return {\n success: false,\n successCount: 0,\n failureCount: params.length,\n results: params.map((param) => ({\n orderId: param.orderId,\n symbol: param.symbol,\n success: false,\n error: 'Batch cancel not supported',\n })),\n };\n }\n return provider.cancelOrders(params);\n }\n\n async closePosition(params: ClosePositionParams): Promise<OrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n const result = await provider.closePosition(params);\n return { ...result, providerId };\n }\n\n async closePositions(\n params: ClosePositionsParams,\n ): Promise<ClosePositionsResult> {\n // Batch close delegates to default provider\n const provider = this.#getDefaultProvider();\n if (!provider.closePositions) {\n return {\n success: false,\n successCount: 0,\n failureCount: 0,\n results: [],\n };\n }\n return provider.closePositions(params);\n }\n\n async updatePositionTPSL(\n params: UpdatePositionTPSLParams,\n ): Promise<OrderResult> {\n const [providerId, provider] = this.#getProviderOrDefault(\n params.providerId,\n );\n const result = await provider.updatePositionTPSL(params);\n return { ...result, providerId };\n }\n\n async updateMargin(params: UpdateMarginParams): Promise<MarginResult> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.updateMargin(params);\n }\n\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.withdraw(params);\n }\n\n // ============================================================================\n // Validation (Route to specific provider)\n // ============================================================================\n\n async validateDeposit(\n params: DepositParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n return this.#getDefaultProvider().validateDeposit(params);\n }\n\n async validateOrder(\n params: OrderParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.validateOrder(params);\n }\n\n async validateClosePosition(\n params: ClosePositionParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.validateClosePosition(params);\n }\n\n async validateWithdrawal(\n params: WithdrawParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.validateWithdrawal(params);\n }\n\n // ============================================================================\n // Protocol Calculations (Delegate to default or route)\n // ============================================================================\n\n async calculateLiquidationPrice(\n params: LiquidationPriceParams,\n ): Promise<string> {\n return this.#getDefaultProvider().calculateLiquidationPrice(params);\n }\n\n async calculateMaintenanceMargin(\n params: MaintenanceMarginParams,\n ): Promise<number> {\n return this.#getDefaultProvider().calculateMaintenanceMargin(params);\n }\n\n async getMaxLeverage(asset: string): Promise<number> {\n return this.#getDefaultProvider().getMaxLeverage(asset);\n }\n\n async calculateFees(\n params: FeeCalculationParams,\n ): Promise<FeeCalculationResult> {\n const [, provider] = this.#getProviderOrDefault(params.providerId);\n return provider.calculateFees(params);\n }\n\n // ============================================================================\n // Subscriptions (Multiplex via SubscriptionMultiplexer)\n // ============================================================================\n\n subscribeToPrices(params: SubscribePricesParams): () => void {\n return this.#subscriptionMux.subscribeToPrices({\n ...params,\n providers: this.#getActiveProviders(),\n aggregationMode: 'merge',\n });\n }\n\n subscribeToPositions(params: SubscribePositionsParams): () => void {\n return this.#subscriptionMux.subscribeToPositions({\n ...params,\n providers: this.#getActiveProviders(),\n });\n }\n\n subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n return this.#subscriptionMux.subscribeToOrderFills({\n ...params,\n providers: this.#getActiveProviders(),\n });\n }\n\n subscribeToOrders(params: SubscribeOrdersParams): () => void {\n return this.#subscriptionMux.subscribeToOrders({\n ...params,\n providers: this.#getActiveProviders(),\n });\n }\n\n subscribeToAccount(params: SubscribeAccountParams): () => void {\n // For account subscriptions, we emit as array for multi-provider\n // but the callback expects single AccountState\n // Delegate to default provider for now\n return this.#getDefaultProvider().subscribeToAccount(params);\n }\n\n subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n // Delegate to default provider\n return this.#getDefaultProvider().subscribeToOICaps(params);\n }\n\n subscribeToCandles(params: SubscribeCandlesParams): () => void {\n // Delegate to default provider\n return this.#getDefaultProvider().subscribeToCandles(params);\n }\n\n subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n // Delegate to default provider\n return this.#getDefaultProvider().subscribeToOrderBook(params);\n }\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n setLiveDataConfig(config: Partial<LiveDataConfig>): void {\n // Apply config to all providers\n this.#providers.forEach((provider) => {\n provider.setLiveDataConfig(config);\n });\n }\n\n setUserFeeDiscount(discountBips: number | undefined): void {\n // Apply to all providers that support it\n this.#providers.forEach((provider) => {\n if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(discountBips);\n }\n });\n }\n\n setUserFeeResolution(resolution: PerpsFeeResolution | undefined): void {\n this.#providers.forEach((provider) => {\n if (provider.setUserFeeResolution) {\n provider.setUserFeeResolution(resolution);\n } else if (provider.setUserFeeDiscount) {\n provider.setUserFeeDiscount(resolution?.discountBips);\n }\n });\n }\n\n async approveSubscriptionBuilderFee(): Promise<boolean> {\n const provider =\n this.#providers.get('hyperliquid') ?? this.#getDefaultProvider();\n return provider.approveSubscriptionBuilderFee\n ? provider.approveSubscriptionBuilderFee()\n : false;\n }\n\n // ============================================================================\n // Lifecycle (Delegate to default provider)\n // ============================================================================\n\n async toggleTestnet(): Promise<ToggleTestnetResult> {\n return this.#getDefaultProvider().toggleTestnet();\n }\n\n async initialize(): Promise<InitializeResult> {\n // Initialize default provider\n const result = await this.#getDefaultProvider().initialize();\n\n // Optionally initialize other providers in background\n // For Phase 1, we only initialize default provider\n return result;\n }\n\n async isReadyToTrade(): Promise<ReadyToTradeResult> {\n return this.#getDefaultProvider().isReadyToTrade();\n }\n\n async disconnect(): Promise<DisconnectResult> {\n // Disconnect all providers\n const results = await Promise.allSettled(\n this.#getActiveProviders().map(([, provider]) => provider.disconnect()),\n );\n\n // Clear subscription cache\n this.#subscriptionMux.clearCache();\n\n // Return success if at least one succeeded\n const successCount = results.filter(\n (res) => res.status === 'fulfilled' && res.value.success,\n ).length;\n\n return {\n success: successCount > 0,\n };\n }\n\n async ping(timeoutMs?: number): Promise<void> {\n return this.#getDefaultProvider().ping(timeoutMs);\n }\n\n getWebSocketConnectionState(): WebSocketConnectionState {\n const provider = this.#getDefaultProvider();\n if (provider.getWebSocketConnectionState) {\n return provider.getWebSocketConnectionState();\n }\n return WebSocketConnectionState.Disconnected;\n }\n\n subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n const provider = this.#getDefaultProvider();\n if (provider.subscribeToConnectionState) {\n return provider.subscribeToConnectionState(listener);\n }\n listener(WebSocketConnectionState.Disconnected, 0);\n return () => {\n /* noop */\n };\n }\n\n async reconnect(): Promise<void> {\n const provider = this.#getDefaultProvider();\n if (provider.reconnect) {\n await provider.reconnect();\n }\n }\n\n // ============================================================================\n // Block Explorer\n // ============================================================================\n\n getBlockExplorerUrl(address?: string): string {\n return this.#getDefaultProvider().getBlockExplorerUrl(address);\n }\n\n // ============================================================================\n // HIP-3 (Optional)\n // ============================================================================\n\n async getAvailableDexs(params?: GetAvailableDexsParams): Promise<string[]> {\n const provider = this.#getDefaultProvider();\n if (!provider.getAvailableDexs) {\n return [];\n }\n return provider.getAvailableDexs(params);\n }\n\n // ============================================================================\n // Provider Management\n // ============================================================================\n\n /**\n * Add a new provider to the aggregated provider.\n *\n * @param providerId - Unique identifier for the provider\n * @param provider - Provider instance\n */\n addProvider(providerId: PerpsProviderType, provider: PerpsProvider): void {\n this.#providers.set(providerId, provider);\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] Provider added', {\n providerId,\n });\n }\n\n /**\n * Remove a provider from the aggregated provider.\n *\n * @param providerId - Provider to remove\n * @returns true if removed, false if not found\n */\n removeProvider(providerId: PerpsProviderType): boolean {\n const removed = this.#providers.delete(providerId);\n if (removed) {\n this.#deps.debugLogger.log('[AggregatedPerpsProvider] Provider removed', {\n providerId,\n });\n }\n return removed;\n }\n\n /**\n * Get list of all registered provider IDs.\n *\n * @returns The result of the operation.\n */\n getProviderIds(): PerpsProviderType[] {\n return Array.from(this.#providers.keys());\n }\n\n /**\n * Check if a provider is registered.\n *\n * @param providerId - The provider id value.\n * @returns True if the condition is met.\n */\n hasProvider(providerId: PerpsProviderType): boolean {\n return this.#providers.has(providerId);\n }\n\n /**\n * Get the router instance for external configuration.\n *\n * @returns The result of the operation.\n */\n getRouter(): ProviderRouter {\n return this.#router;\n }\n}\n"]}
@@ -16,7 +16,22 @@
16
16
  import type { CaipAccountId } from "@metamask/utils";
17
17
  import { ProviderRouter } from "../routing/ProviderRouter.cjs";
18
18
  import { WebSocketConnectionState } from "../types/index.cjs";
19
- import type { AccountState, AggregatedProviderConfig, AssetRoute, BatchCancelOrdersParams, CancelOrderParams, CancelOrderResult, CancelOrdersResult, ChaseOrder, ClosePositionParams, ClosePositionsParams, ClosePositionsResult, DepositParams, DisconnectResult, EditOrderParams, FeeCalculationParams, FeeCalculationResult, Funding, GetAccountStateParams, GetAvailableDexsParams, GetFundingParams, GetHistoricalPortfolioParams, GetMarketsParams, GetOrderFillsParams, GetOrdersParams, GetOrFetchFillsParams, GetPositionsParams, GetSupportedPathsParams, HistoricalPortfolioResult, InitializeResult, PerpsProvider, LiquidationPriceParams, LiveDataConfig, MaintenanceMarginParams, MarginResult, MarketInfo, Order, OrderFill, OrderParams, OrderResult, PerpsMarketData, PerpsProviderType, Position, ReadyToTradeResult, SubscribeAccountParams, SubscribeCandlesParams, SubscribeOICapsParams, SubscribeOrderBookParams, SubscribeOrderFillsParams, SubscribeOrdersParams, SubscribePositionsParams, SubscribePricesParams, ToggleTestnetResult, UpdateMarginParams, UpdatePositionTPSLParams, UserHistoryItem, WithdrawParams, WithdrawResult, RawLedgerUpdate, PerpsReadOptions, PerpsFeeResolution } from "../types/index.cjs";
19
+ import type { AccountState, AggregatedProviderConfig, AssetRoute, BatchCancelOrdersParams, CancelOrderParams, CancelOrderResult, CancelOrdersResult, ChaseOrder, ClosePositionParams, ClosePositionsParams, ClosePositionsResult, DepositParams, DisconnectResult, EditOrderParams, FeeCalculationParams, FeeCalculationResult, Funding, GetAccountStateParams, GetAvailableDexsParams, GetFundingParams, GetHistoricalPortfolioParams, GetMarketsParams, GetOrderCapabilitiesParams, GetOrderFillsParams, GetOrdersParams, GetOrFetchFillsParams, GetPositionsParams, GetSupportedPathsParams, HistoricalPortfolioResult, InitializeResult, PerpsProvider, LiquidationPriceParams, LiveDataConfig, MaintenanceMarginParams, MarginResult, MarketInfo, Order, OrderFill, OrderParams, OrderResult, PerpsMarketData, PerpsOrderCapabilities, PerpsProviderType, Position, ReadyToTradeResult, SubscribeAccountParams, SubscribeCandlesParams, SubscribeOICapsParams, SubscribeOrderBookParams, SubscribeOrderFillsParams, SubscribeOrdersParams, SubscribePositionsParams, SubscribePricesParams, ToggleTestnetResult, TwapOrder, UpdateMarginParams, UpdatePositionTPSLParams, UserHistoryItem, WithdrawParams, WithdrawResult, RawLedgerUpdate, PerpsReadOptions, PerpsFeeResolution } from "../types/index.cjs";
20
+ /** Error returned when only some providers suspend their Chase orders. */
21
+ export declare class ChaseOrderSuspensionError extends Error {
22
+ readonly suspendedOrders: ChaseOrder[];
23
+ readonly failures: {
24
+ providerId: PerpsProviderType;
25
+ reason: unknown;
26
+ }[];
27
+ constructor(options: {
28
+ suspendedOrders: ChaseOrder[];
29
+ failures: {
30
+ providerId: PerpsProviderType;
31
+ reason: unknown;
32
+ }[];
33
+ });
34
+ }
20
35
  /**
21
36
  * AggregatedPerpsProvider implements PerpsProvider by coordinating
22
37
  * multiple backend providers.
@@ -48,9 +63,19 @@ import type { AccountState, AggregatedProviderConfig, AssetRoute, BatchCancelOrd
48
63
  export declare class AggregatedPerpsProvider implements PerpsProvider {
49
64
  #private;
50
65
  readonly protocolId = "aggregated";
66
+ readonly routesOrdersByProviderId = true;
51
67
  constructor(config: AggregatedProviderConfig);
52
68
  getDepositRoutes(params?: GetSupportedPathsParams): AssetRoute[];
53
69
  getWithdrawalRoutes(params?: GetSupportedPathsParams): AssetRoute[];
70
+ /**
71
+ * Resolve capabilities with the same explicit-provider/default-provider
72
+ * selection used by order placement. Unknown routes return a typed
73
+ * unavailable result instead of throwing a placement error.
74
+ *
75
+ * @param params - Market and optional provider route.
76
+ * @returns Capabilities from the selected provider.
77
+ */
78
+ getOrderCapabilities(params: GetOrderCapabilitiesParams): Promise<PerpsOrderCapabilities>;
54
79
  getPositions(params?: GetPositionsParams): Promise<Position[]>;
55
80
  getAccountState(params?: GetAccountStateParams): Promise<AccountState>;
56
81
  getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]>;
@@ -98,6 +123,12 @@ export declare class AggregatedPerpsProvider implements PerpsProvider {
98
123
  endTime?: number;
99
124
  }): Promise<UserHistoryItem[]>;
100
125
  placeOrder(params: OrderParams): Promise<OrderResult>;
126
+ /**
127
+ * Read TWAP lifecycle records from every active provider.
128
+ *
129
+ * @returns TWAP records with their provider route attached.
130
+ */
131
+ getTwapOrders(): Promise<TwapOrder[]>;
101
132
  /**
102
133
  * Read all available snapshots, retaining successful providers on a partial failure.
103
134
  *
@@ -110,7 +141,8 @@ export declare class AggregatedPerpsProvider implements PerpsProvider {
110
141
  * suspended, so callers may retry to reconcile a partial failure.
111
142
  *
112
143
  * @returns Chase snapshots after every provider suspends successfully.
113
- * @throws If any active provider fails to suspend its Chase orders.
144
+ * @throws ChaseOrderSuspensionError if any active provider fails. The error
145
+ * includes successful snapshots and each failed provider ID.
114
146
  */
115
147
  suspendChaseOrders(): Promise<ChaseOrder[]>;
116
148
  editOrder(params: EditOrderParams): Promise<OrderResult>;