@metamask-previews/perps-controller 11.0.0-preview-9efd0b754 → 12.0.0-preview-4e64b66e8

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 (134) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/dist/PerpsController-method-action-types.cjs.map +1 -1
  3. package/dist/PerpsController-method-action-types.d.cts +36 -1
  4. package/dist/PerpsController-method-action-types.d.cts.map +1 -1
  5. package/dist/PerpsController-method-action-types.d.mts +36 -1
  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 +600 -119
  9. package/dist/PerpsController.cjs.map +1 -1
  10. package/dist/PerpsController.d.cts +35 -4
  11. package/dist/PerpsController.d.cts.map +1 -1
  12. package/dist/PerpsController.d.mts +35 -4
  13. package/dist/PerpsController.d.mts.map +1 -1
  14. package/dist/PerpsController.mjs +603 -122
  15. package/dist/PerpsController.mjs.map +1 -1
  16. package/dist/constants/eventNames.cjs +3 -0
  17. package/dist/constants/eventNames.cjs.map +1 -1
  18. package/dist/constants/eventNames.d.cts +1 -0
  19. package/dist/constants/eventNames.d.cts.map +1 -1
  20. package/dist/constants/eventNames.d.mts +1 -0
  21. package/dist/constants/eventNames.d.mts.map +1 -1
  22. package/dist/constants/eventNames.mjs +3 -0
  23. package/dist/constants/eventNames.mjs.map +1 -1
  24. package/dist/constants/hyperLiquidConfig.cjs +14 -2
  25. package/dist/constants/hyperLiquidConfig.cjs.map +1 -1
  26. package/dist/constants/hyperLiquidConfig.d.cts +7 -0
  27. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -1
  28. package/dist/constants/hyperLiquidConfig.d.mts +7 -0
  29. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -1
  30. package/dist/constants/hyperLiquidConfig.mjs +11 -0
  31. package/dist/constants/hyperLiquidConfig.mjs.map +1 -1
  32. package/dist/constants/perpsConfig.cjs +19 -2
  33. package/dist/constants/perpsConfig.cjs.map +1 -1
  34. package/dist/constants/perpsConfig.d.cts +39 -7
  35. package/dist/constants/perpsConfig.d.cts.map +1 -1
  36. package/dist/constants/perpsConfig.d.mts +39 -7
  37. package/dist/constants/perpsConfig.d.mts.map +1 -1
  38. package/dist/constants/perpsConfig.mjs +18 -1
  39. package/dist/constants/perpsConfig.mjs.map +1 -1
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +3 -3
  42. package/dist/index.d.cts.map +1 -1
  43. package/dist/index.d.mts +3 -3
  44. package/dist/index.d.mts.map +1 -1
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/providers/AggregatedPerpsProvider.cjs +16 -0
  47. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -1
  48. package/dist/providers/AggregatedPerpsProvider.d.cts +3 -1
  49. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -1
  50. package/dist/providers/AggregatedPerpsProvider.d.mts +3 -1
  51. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -1
  52. package/dist/providers/AggregatedPerpsProvider.mjs +16 -0
  53. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -1
  54. package/dist/providers/HyperLiquidProvider.cjs +325 -59
  55. package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
  56. package/dist/providers/HyperLiquidProvider.d.cts +27 -1
  57. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
  58. package/dist/providers/HyperLiquidProvider.d.mts +27 -1
  59. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
  60. package/dist/providers/HyperLiquidProvider.mjs +326 -60
  61. package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
  62. package/dist/services/HyperLiquidClientService.cjs +74 -25
  63. package/dist/services/HyperLiquidClientService.cjs.map +1 -1
  64. package/dist/services/HyperLiquidClientService.d.cts.map +1 -1
  65. package/dist/services/HyperLiquidClientService.d.mts.map +1 -1
  66. package/dist/services/HyperLiquidClientService.mjs +74 -25
  67. package/dist/services/HyperLiquidClientService.mjs.map +1 -1
  68. package/dist/services/HyperLiquidSubscriptionService.cjs +16 -5
  69. package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
  70. package/dist/services/HyperLiquidSubscriptionService.d.cts +1 -1
  71. package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
  72. package/dist/services/HyperLiquidSubscriptionService.d.mts +1 -1
  73. package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
  74. package/dist/services/HyperLiquidSubscriptionService.mjs +16 -5
  75. package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
  76. package/dist/services/MarketDataService.cjs +49 -5
  77. package/dist/services/MarketDataService.cjs.map +1 -1
  78. package/dist/services/MarketDataService.d.cts +2 -2
  79. package/dist/services/MarketDataService.d.cts.map +1 -1
  80. package/dist/services/MarketDataService.d.mts +2 -2
  81. package/dist/services/MarketDataService.d.mts.map +1 -1
  82. package/dist/services/MarketDataService.mjs +49 -5
  83. package/dist/services/MarketDataService.mjs.map +1 -1
  84. package/dist/services/RewardsIntegrationService.cjs +330 -68
  85. package/dist/services/RewardsIntegrationService.cjs.map +1 -1
  86. package/dist/services/RewardsIntegrationService.d.cts +61 -5
  87. package/dist/services/RewardsIntegrationService.d.cts.map +1 -1
  88. package/dist/services/RewardsIntegrationService.d.mts +61 -5
  89. package/dist/services/RewardsIntegrationService.d.mts.map +1 -1
  90. package/dist/services/RewardsIntegrationService.mjs +330 -68
  91. package/dist/services/RewardsIntegrationService.mjs.map +1 -1
  92. package/dist/services/ServiceContext.cjs.map +1 -1
  93. package/dist/services/ServiceContext.d.cts +17 -1
  94. package/dist/services/ServiceContext.d.cts.map +1 -1
  95. package/dist/services/ServiceContext.d.mts +17 -1
  96. package/dist/services/ServiceContext.d.mts.map +1 -1
  97. package/dist/services/ServiceContext.mjs.map +1 -1
  98. package/dist/services/TerminalMarketService.cjs +422 -7
  99. package/dist/services/TerminalMarketService.cjs.map +1 -1
  100. package/dist/services/TerminalMarketService.d.cts +10 -1
  101. package/dist/services/TerminalMarketService.d.cts.map +1 -1
  102. package/dist/services/TerminalMarketService.d.mts +10 -1
  103. package/dist/services/TerminalMarketService.d.mts.map +1 -1
  104. package/dist/services/TerminalMarketService.mjs +423 -8
  105. package/dist/services/TerminalMarketService.mjs.map +1 -1
  106. package/dist/services/TradingService.cjs +52 -28
  107. package/dist/services/TradingService.cjs.map +1 -1
  108. package/dist/services/TradingService.d.cts.map +1 -1
  109. package/dist/services/TradingService.d.mts.map +1 -1
  110. package/dist/services/TradingService.mjs +52 -28
  111. package/dist/services/TradingService.mjs.map +1 -1
  112. package/dist/types/index.cjs.map +1 -1
  113. package/dist/types/index.d.cts +156 -7
  114. package/dist/types/index.d.cts.map +1 -1
  115. package/dist/types/index.d.mts +156 -7
  116. package/dist/types/index.d.mts.map +1 -1
  117. package/dist/types/index.mjs.map +1 -1
  118. package/dist/utils/marketUtils.cjs +16 -1
  119. package/dist/utils/marketUtils.cjs.map +1 -1
  120. package/dist/utils/marketUtils.d.cts +1 -0
  121. package/dist/utils/marketUtils.d.cts.map +1 -1
  122. package/dist/utils/marketUtils.d.mts +1 -0
  123. package/dist/utils/marketUtils.d.mts.map +1 -1
  124. package/dist/utils/marketUtils.mjs +14 -0
  125. package/dist/utils/marketUtils.mjs.map +1 -1
  126. package/dist/utils/perpsDiskPersistence.cjs +19 -12
  127. package/dist/utils/perpsDiskPersistence.cjs.map +1 -1
  128. package/dist/utils/perpsDiskPersistence.d.cts +5 -1
  129. package/dist/utils/perpsDiskPersistence.d.cts.map +1 -1
  130. package/dist/utils/perpsDiskPersistence.d.mts +5 -1
  131. package/dist/utils/perpsDiskPersistence.d.mts.map +1 -1
  132. package/dist/utils/perpsDiskPersistence.mjs +19 -12
  133. package/dist/utils/perpsDiskPersistence.mjs.map +1 -1
  134. package/package.json +1 -1
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _HyperLiquidProvider_instances, _HyperLiquidProvider_deps, _HyperLiquidProvider_clientService, _HyperLiquidProvider_walletService, _HyperLiquidProvider_subscriptionService, _HyperLiquidProvider_symbolToAssetId, _HyperLiquidProvider_userFeeCache, _HyperLiquidProvider_maxLeverageCache, _HyperLiquidProvider_cachedMetaByDex, _HyperLiquidProvider_cachedMarketDataWithPrices, _HyperLiquidProvider_cachedSpotMeta, _HyperLiquidProvider_dexDiscoveryCache, _HyperLiquidProvider_referralCheckCache, _HyperLiquidProvider_builderFeeCheckCache, _HyperLiquidProvider_ensureReadyPromise, _HyperLiquidProvider_pendingBuilderFeeApprovals, _HyperLiquidProvider_compiledAllowlistPatterns, _HyperLiquidProvider_compiledBlocklistPatterns, _HyperLiquidProvider_userFeeDiscountBips, _HyperLiquidProvider_hip3Enabled, _HyperLiquidProvider_allowlistMarkets, _HyperLiquidProvider_blocklistMarkets, _HyperLiquidProvider_useUnifiedAccount, _HyperLiquidProvider_dexDiscoveryComplete, _HyperLiquidProvider_unifiedAccountSetupNeedsRetry, _HyperLiquidProvider_pendingValidatedDexsPromise, _HyperLiquidProvider_cachedUsdcTokenId, _HyperLiquidProvider_errorMappings, _HyperLiquidProvider_scaleOrderGroups, _HyperLiquidProvider_chaseSessions, _HyperLiquidProvider_chasePlacementsInFlight, _HyperLiquidProvider_chaseGeneration, _HyperLiquidProvider_clientsInitialized, _HyperLiquidProvider_initializationPromise, _HyperLiquidProvider_messenger, _HyperLiquidProvider_builderAddressTestnet, _HyperLiquidProvider_builderAddressMainnet, _HyperLiquidProvider_priceDeviationLimit, _HyperLiquidProvider_compilePatternsSafely, _HyperLiquidProvider_ensureClientsInitialized, _HyperLiquidProvider_isWalletOnHyperliquid, _HyperLiquidProvider_isHyperliquidMultiSigAccount, _HyperLiquidProvider_ensureUnifiedAccountEnabled, _HyperLiquidProvider_ensureReady, _HyperLiquidProvider_tradingSetupPromise, _HyperLiquidProvider_tradingSetupComplete, _HyperLiquidProvider_ensureReadyForTrading, _HyperLiquidProvider_getOrFetchPrice, _HyperLiquidProvider_filterFills, _HyperLiquidProvider_getAllAvailableDexs, _HyperLiquidProvider_getValidatedDexs, _HyperLiquidProvider_fetchValidatedDexsInternal, _HyperLiquidProvider_getCachedMeta, _HyperLiquidProvider_backfillAssetMapForDex, _HyperLiquidProvider_getAssetIdWithRepair, _HyperLiquidProvider_getCachedSpotMeta, _HyperLiquidProvider_getCachedPerpDexs, _HyperLiquidProvider_calculateHip3FeeMultiplier, _HyperLiquidProvider_getCacheKey, _HyperLiquidProvider_fetchMarketsForDex, _HyperLiquidProvider_getUsdcTokenId, _HyperLiquidProvider_isUsdcCollateralDex, _HyperLiquidProvider_buildAssetMapping, _HyperLiquidProvider_queryUserDataAcrossDexs, _HyperLiquidProvider_mapError, _HyperLiquidProvider_getErrorContext, _HyperLiquidProvider_isMappedAccountModeExchangeError, _HyperLiquidProvider_getTradingErrorContext, _HyperLiquidProvider_checkBuilderFeeApproval, _HyperLiquidProvider_ensureBuilderFeeApproval, _HyperLiquidProvider_checkBuilderFeeStatus, _HyperLiquidProvider_getBalanceForDex, _HyperLiquidProvider_findSourceDexWithBalance, _HyperLiquidProvider_autoTransferForHip3Order, _HyperLiquidProvider_autoTransferBackAfterClose, _HyperLiquidProvider_calculateHip3RequiredMargin, _HyperLiquidProvider_handleHip3PostOrderRebalance, _HyperLiquidProvider_handleHip3OrderRollback, _HyperLiquidProvider_validateOrderBeforePlacement, _HyperLiquidProvider_getAssetInfo, _HyperLiquidProvider_prepareAssetForTrading, _HyperLiquidProvider_handleHip3PreOrder, _HyperLiquidProvider_submitOrderWithRollback, _HyperLiquidProvider_handleOrderError, _HyperLiquidProvider_placeStrategyOrder, _HyperLiquidProvider_prepareStrategyPlacement, _HyperLiquidProvider_getMinimumOrderSize, _HyperLiquidProvider_buildScaleLadder, _HyperLiquidProvider_placeTwapOrder, _HyperLiquidProvider_placeScaleOrder, _HyperLiquidProvider_startChaseSession, _HyperLiquidProvider_getChaseQuotePrice, _HyperLiquidProvider_restChaseOrder, _HyperLiquidProvider_scheduleChaseTick, _HyperLiquidProvider_recoverFailedChaseTick, _HyperLiquidProvider_runChaseTick, _HyperLiquidProvider_resolveOwnRestingSizes, _HyperLiquidProvider_readOrderRemainder, _HyperLiquidProvider_cancelChaseChild, _HyperLiquidProvider_retractOrphanedChaseOrder, _HyperLiquidProvider_stopChaseSession, _HyperLiquidProvider_cancelStrategyOrder, _HyperLiquidProvider_cancelTwapOrder, _HyperLiquidProvider_cancelScaleOrder, _HyperLiquidProvider_cancelChaseOrder, _HyperLiquidProvider_readOrderIdFromStatus, _HyperLiquidProvider_getDiscountedBuilderFee, _HyperLiquidProvider_fetchOpenOrders, _HyperLiquidProvider_resolveReplacementOrderId, _HyperLiquidProvider_getStandaloneValidatedDexs, _HyperLiquidProvider_queryDexPositions, _HyperLiquidProvider_getAllMids, _HyperLiquidProvider_fetchSingleDexFresh, _HyperLiquidProvider_excludeNonUsdcCollateralResults, _HyperLiquidProvider_mergeDexResultsInto, _HyperLiquidProvider_cacheFreshMarketDataSnapshot, _HyperLiquidProvider_getStaleMarketDataSnapshot, _HyperLiquidProvider_isFeeCacheValid, _HyperLiquidProvider_getBuilderAddress, _HyperLiquidProvider_getReferralCode, _HyperLiquidProvider_ensureReferralSet, _HyperLiquidProvider_isReferralCodeReady, _HyperLiquidProvider_checkReferralSet, _HyperLiquidProvider_setReferralCode;
13
+ var _HyperLiquidProvider_instances, _HyperLiquidProvider_deps, _HyperLiquidProvider_clientService, _HyperLiquidProvider_walletService, _HyperLiquidProvider_subscriptionService, _HyperLiquidProvider_symbolToAssetId, _HyperLiquidProvider_userFeeCache, _HyperLiquidProvider_maxLeverageCache, _HyperLiquidProvider_cachedMetaByDex, _HyperLiquidProvider_cachedMarketDataWithPrices, _HyperLiquidProvider_cachedSpotMeta, _HyperLiquidProvider_dexDiscoveryCache, _HyperLiquidProvider_referralCheckCache, _HyperLiquidProvider_builderFeeCheckCache, _HyperLiquidProvider_ensureReadyPromise, _HyperLiquidProvider_pendingBuilderFeeApprovals, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, _HyperLiquidProvider_approvedBuilderAddresses, _HyperLiquidProvider_compiledAllowlistPatterns, _HyperLiquidProvider_compiledBlocklistPatterns, _HyperLiquidProvider_userFeeDiscountBips, _HyperLiquidProvider_userFeeResolution, _HyperLiquidProvider_hip3Enabled, _HyperLiquidProvider_allowlistMarkets, _HyperLiquidProvider_blocklistMarkets, _HyperLiquidProvider_useUnifiedAccount, _HyperLiquidProvider_dexDiscoveryComplete, _HyperLiquidProvider_unifiedAccountSetupNeedsRetry, _HyperLiquidProvider_pendingValidatedDexsPromise, _HyperLiquidProvider_cachedUsdcTokenId, _HyperLiquidProvider_errorMappings, _HyperLiquidProvider_scaleOrderGroups, _HyperLiquidProvider_chaseSessions, _HyperLiquidProvider_chasePlacementsInFlight, _HyperLiquidProvider_chaseGeneration, _HyperLiquidProvider_clientsInitialized, _HyperLiquidProvider_initializationPromise, _HyperLiquidProvider_messenger, _HyperLiquidProvider_builderAddressTestnet, _HyperLiquidProvider_builderAddressMainnet, _HyperLiquidProvider_subscriptionBuilderAddressTestnet, _HyperLiquidProvider_subscriptionBuilderAddressMainnet, _HyperLiquidProvider_priceDeviationLimit, _HyperLiquidProvider_compilePatternsSafely, _HyperLiquidProvider_ensureClientsInitialized, _HyperLiquidProvider_isWalletOnHyperliquid, _HyperLiquidProvider_isHyperliquidMultiSigAccount, _HyperLiquidProvider_ensureUnifiedAccountEnabled, _HyperLiquidProvider_ensureReady, _HyperLiquidProvider_tradingSetupPromise, _HyperLiquidProvider_tradingSetupComplete, _HyperLiquidProvider_ensureReadyForTrading, _HyperLiquidProvider_getOrFetchPrice, _HyperLiquidProvider_filterFills, _HyperLiquidProvider_getAllAvailableDexs, _HyperLiquidProvider_getValidatedDexs, _HyperLiquidProvider_fetchValidatedDexsInternal, _HyperLiquidProvider_getCachedMeta, _HyperLiquidProvider_backfillAssetMapForDex, _HyperLiquidProvider_getAssetIdWithRepair, _HyperLiquidProvider_getCachedSpotMeta, _HyperLiquidProvider_getCachedPerpDexs, _HyperLiquidProvider_calculateHip3FeeMultiplier, _HyperLiquidProvider_getCacheKey, _HyperLiquidProvider_getApprovedBuilderKey, _HyperLiquidProvider_fetchMarketsForDex, _HyperLiquidProvider_getUsdcTokenId, _HyperLiquidProvider_isUsdcCollateralDex, _HyperLiquidProvider_buildAssetMapping, _HyperLiquidProvider_queryUserDataAcrossDexs, _HyperLiquidProvider_mapError, _HyperLiquidProvider_getErrorContext, _HyperLiquidProvider_isMappedAccountModeExchangeError, _HyperLiquidProvider_getTradingErrorContext, _HyperLiquidProvider_checkBuilderFeeApproval, _HyperLiquidProvider_ensureBuilderFeeApproval, _HyperLiquidProvider_checkBuilderFeeStatus, _HyperLiquidProvider_getBalanceForDex, _HyperLiquidProvider_findSourceDexWithBalance, _HyperLiquidProvider_autoTransferForHip3Order, _HyperLiquidProvider_autoTransferBackAfterClose, _HyperLiquidProvider_calculateHip3RequiredMargin, _HyperLiquidProvider_handleHip3PostOrderRebalance, _HyperLiquidProvider_handleHip3OrderRollback, _HyperLiquidProvider_validateOrderBeforePlacement, _HyperLiquidProvider_getAssetInfo, _HyperLiquidProvider_prepareAssetForTrading, _HyperLiquidProvider_handleHip3PreOrder, _HyperLiquidProvider_submitOrderWithRollback, _HyperLiquidProvider_handleOrderError, _HyperLiquidProvider_placeStrategyOrder, _HyperLiquidProvider_prepareStrategyPlacement, _HyperLiquidProvider_getMinimumOrderSize, _HyperLiquidProvider_buildScaleLadder, _HyperLiquidProvider_placeTwapOrder, _HyperLiquidProvider_placeScaleOrder, _HyperLiquidProvider_startChaseSession, _HyperLiquidProvider_getChaseQuotePrice, _HyperLiquidProvider_restChaseOrder, _HyperLiquidProvider_scheduleChaseTick, _HyperLiquidProvider_recoverFailedChaseTick, _HyperLiquidProvider_runChaseTick, _HyperLiquidProvider_resolveOwnRestingSizes, _HyperLiquidProvider_readOrderRemainder, _HyperLiquidProvider_cancelChaseChild, _HyperLiquidProvider_retractOrphanedChaseOrder, _HyperLiquidProvider_stopChaseSession, _HyperLiquidProvider_cancelStrategyOrder, _HyperLiquidProvider_cancelTwapOrder, _HyperLiquidProvider_cancelScaleOrder, _HyperLiquidProvider_cancelChaseOrder, _HyperLiquidProvider_readOrderIdFromStatus, _HyperLiquidProvider_getDiscountedBuilderFee, _HyperLiquidProvider_getBuilderOrderContext, _HyperLiquidProvider_fetchOpenOrders, _HyperLiquidProvider_resolveReplacementOrderId, _HyperLiquidProvider_getStandaloneValidatedDexs, _HyperLiquidProvider_queryDexPositions, _HyperLiquidProvider_getAllMids, _HyperLiquidProvider_fetchSingleDexFresh, _HyperLiquidProvider_excludeNonUsdcCollateralResults, _HyperLiquidProvider_mergeDexResultsInto, _HyperLiquidProvider_cacheFreshMarketDataSnapshot, _HyperLiquidProvider_getStaleMarketDataSnapshot, _HyperLiquidProvider_isFeeCacheValid, _HyperLiquidProvider_getBuilderAddress, _HyperLiquidProvider_getSubscriptionBuilderAddress, _HyperLiquidProvider_getReferralCode, _HyperLiquidProvider_ensureReferralSet, _HyperLiquidProvider_isReferralCodeReady, _HyperLiquidProvider_checkReferralSet, _HyperLiquidProvider_setReferralCode;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.HyperLiquidProvider = void 0;
16
16
  const utils_1 = require("@metamask/utils");
@@ -230,7 +230,32 @@ function groupOrdersBySymbol(orders) {
230
230
  function collectPositionTriggerOrders(params) {
231
231
  const { orders, position, childOrderIds } = params;
232
232
  const byOrderId = new Map();
233
+ let takeProfitPrice;
234
+ let stopLossPrice;
233
235
  orders.forEach((rawOrder) => {
236
+ if (rawOrder.isTrigger &&
237
+ rawOrder.reduceOnly &&
238
+ rawOrder.isPositionTpsl === Boolean(perpsConfig_js_1.TP_SL_CONFIG.UsePositionBoundTpsl)) {
239
+ if (rawOrder.orderType.includes('Take Profit')) {
240
+ takeProfitPrice = rawOrder.triggerPx;
241
+ }
242
+ else if (rawOrder.orderType.includes('Stop')) {
243
+ stopLossPrice = rawOrder.triggerPx;
244
+ }
245
+ }
246
+ rawOrder.children?.forEach((childOrder) => {
247
+ if (!childOrder.isTrigger ||
248
+ !childOrder.reduceOnly ||
249
+ childOrder.isPositionTpsl !== Boolean(perpsConfig_js_1.TP_SL_CONFIG.UsePositionBoundTpsl)) {
250
+ return;
251
+ }
252
+ if (childOrder.orderType.includes('Take Profit')) {
253
+ takeProfitPrice = childOrder.triggerPx;
254
+ }
255
+ else if (childOrder.orderType.includes('Stop')) {
256
+ stopLossPrice = childOrder.triggerPx;
257
+ }
258
+ });
234
259
  if (rawOrder.coin !== position.symbol ||
235
260
  !rawOrder.isTrigger ||
236
261
  !rawOrder.reduceOnly ||
@@ -250,6 +275,8 @@ function collectPositionTriggerOrders(params) {
250
275
  return {
251
276
  takeProfitOrders: triggerOrders.filter((order) => order.direction === 'take_profit'),
252
277
  stopLossOrders: triggerOrders.filter((order) => order.direction !== 'take_profit'),
278
+ ...(takeProfitPrice && { takeProfitPrice }),
279
+ ...(stopLossPrice && { stopLossPrice }),
253
280
  };
254
281
  }
255
282
  /**
@@ -301,11 +328,15 @@ class HyperLiquidProvider {
301
328
  // Prevents multiple signature requests when methods called simultaneously
302
329
  _HyperLiquidProvider_ensureReadyPromise.set(this, null);
303
330
  _HyperLiquidProvider_pendingBuilderFeeApprovals.set(this, new Map());
331
+ _HyperLiquidProvider_subscriptionBuilderApprovalEpoch.set(this, 0);
332
+ /** Builder approvals keyed by network, account, and builder address. */
333
+ _HyperLiquidProvider_approvedBuilderAddresses.set(this, new Set());
304
334
  // Pre-compiled patterns for fast filtering
305
335
  _HyperLiquidProvider_compiledAllowlistPatterns.set(this, []);
306
336
  _HyperLiquidProvider_compiledBlocklistPatterns.set(this, []);
307
337
  // Fee discount context for MetaMask reward discounts (in basis points)
308
338
  _HyperLiquidProvider_userFeeDiscountBips.set(this, void 0);
339
+ _HyperLiquidProvider_userFeeResolution.set(this, void 0);
309
340
  // Feature flag configuration for HIP-3 market filtering
310
341
  _HyperLiquidProvider_hip3Enabled.set(this, void 0);
311
342
  _HyperLiquidProvider_allowlistMarkets.set(this, void 0);
@@ -362,6 +393,8 @@ class HyperLiquidProvider {
362
393
  _HyperLiquidProvider_messenger.set(this, void 0);
363
394
  _HyperLiquidProvider_builderAddressTestnet.set(this, void 0);
364
395
  _HyperLiquidProvider_builderAddressMainnet.set(this, void 0);
396
+ _HyperLiquidProvider_subscriptionBuilderAddressTestnet.set(this, void 0);
397
+ _HyperLiquidProvider_subscriptionBuilderAddressMainnet.set(this, void 0);
365
398
  _HyperLiquidProvider_priceDeviationLimit.set(this, void 0);
366
399
  /**
367
400
  * Ensure provider is ready for TRADING operations (signing required)
@@ -382,6 +415,8 @@ class HyperLiquidProvider {
382
415
  __classPrivateFieldSet(this, _HyperLiquidProvider_messenger, options.messenger, "f");
383
416
  __classPrivateFieldSet(this, _HyperLiquidProvider_builderAddressTestnet, options.builderAddressTestnet, "f");
384
417
  __classPrivateFieldSet(this, _HyperLiquidProvider_builderAddressMainnet, options.builderAddressMainnet, "f");
418
+ __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionBuilderAddressTestnet, options.subscriptionBuilderAddressTestnet, "f");
419
+ __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionBuilderAddressMainnet, options.subscriptionBuilderAddressMainnet, "f");
385
420
  __classPrivateFieldSet(this, _HyperLiquidProvider_priceDeviationLimit, options.priceDeviationLimit ??
386
421
  hyperLiquidConfig_js_1.HYPERLIQUID_CONFIG.OraclePriceDeviationLimit, "f");
387
422
  const isTestnet = options.isTestnet ?? false;
@@ -404,7 +439,11 @@ class HyperLiquidProvider {
404
439
  isTestnet,
405
440
  }), "f");
406
441
  __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionService, new HyperLiquidSubscriptionService_js_1.HyperLiquidSubscriptionService(__classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_hip3Enabled, "f"), [], // enabledDexs - will be populated after DEX discovery in buildAssetMapping
407
- __classPrivateFieldGet(this, _HyperLiquidProvider_allowlistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_blocklistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_priceDeviationLimit, "f")), "f");
442
+ __classPrivateFieldGet(this, _HyperLiquidProvider_allowlistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_blocklistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_priceDeviationLimit, "f"), async () => {
443
+ await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_ensureClientsInitialized).call(this);
444
+ const validatedDexs = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getValidatedDexs).call(this);
445
+ return validatedDexs.filter((dex) => dex !== null);
446
+ }), "f");
408
447
  // NOTE: Clients are NOT initialized here - they'll be initialized lazily
409
448
  // when first needed. This avoids accessing Engine.context before it's ready.
410
449
  // Pre-compile filter patterns for performance (invalid patterns are skipped)
@@ -461,6 +500,7 @@ class HyperLiquidProvider {
461
500
  * @param discountBips - The discount in basis points (e.g., 550 = 5.5%)
462
501
  */
463
502
  setUserFeeDiscount(discountBips) {
503
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeResolution, undefined, "f");
464
504
  __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeDiscountBips, discountBips, "f");
465
505
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquid: Fee discount context updated', {
466
506
  discountBips,
@@ -468,6 +508,20 @@ class HyperLiquidProvider {
468
508
  isActive: discountBips !== undefined,
469
509
  });
470
510
  }
511
+ /**
512
+ * Set the resolved fee and its attribution source for the next operation.
513
+ *
514
+ * @param resolution - Unified fee resolution, or undefined to clear it.
515
+ */
516
+ setUserFeeResolution(resolution) {
517
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeResolution, resolution, "f");
518
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeDiscountBips, resolution?.discountBips, "f");
519
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquid: Fee resolution context updated', {
520
+ source: resolution?.source,
521
+ discountBips: resolution?.discountBips,
522
+ isActive: resolution !== undefined,
523
+ });
524
+ }
471
525
  /**
472
526
  * Get supported deposit routes with complete asset and routing information
473
527
  *
@@ -502,6 +556,84 @@ class HyperLiquidProvider {
502
556
  // For HyperLiquid, withdrawal routes are the same as deposit routes
503
557
  return this.getDepositRoutes(params);
504
558
  }
559
+ /**
560
+ * Approve the dedicated subscription builder outside order submission.
561
+ * Failure is non-blocking: order construction will use the ordinary builder
562
+ * at the standard fee until a later approval succeeds.
563
+ *
564
+ * @returns Whether the builder is approved for the current account.
565
+ */
566
+ async approveSubscriptionBuilderFee() {
567
+ const approvalEpoch = __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f");
568
+ await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_ensureClientsInitialized).call(this);
569
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
570
+ return false;
571
+ }
572
+ const isTestnet = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode();
573
+ const network = isTestnet ? 'testnet' : 'mainnet';
574
+ const builderAddress = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getSubscriptionBuilderAddress).call(this, isTestnet);
575
+ if (!builderAddress) {
576
+ return false;
577
+ }
578
+ const userAddress = await __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f").getUserAddressWithDefault();
579
+ const key = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress);
580
+ if (__classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(key)) {
581
+ return true;
582
+ }
583
+ const pending = __classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").get(key);
584
+ if (pending) {
585
+ try {
586
+ await pending;
587
+ return __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(key);
588
+ }
589
+ catch (error) {
590
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquidProvider: Subscription builder approval unavailable', error);
591
+ return false;
592
+ }
593
+ }
594
+ const approval = (async () => {
595
+ const currentApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
596
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
597
+ return;
598
+ }
599
+ if (currentApproval !== null &&
600
+ currentApproval >= hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeDecimal) {
601
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(key);
602
+ return;
603
+ }
604
+ const exchangeClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getExchangeClient();
605
+ await exchangeClient.approveBuilderFee({
606
+ builder: builderAddress,
607
+ maxFeeRate: hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeRate,
608
+ });
609
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
610
+ return;
611
+ }
612
+ const afterApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
613
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
614
+ return;
615
+ }
616
+ if (afterApproval === null ||
617
+ afterApproval < hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeDecimal) {
618
+ throw new Error('[HyperLiquidProvider] Subscription builder approval verification failed');
619
+ }
620
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(key);
621
+ })();
622
+ __classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").set(key, approval);
623
+ try {
624
+ await approval;
625
+ return __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(key);
626
+ }
627
+ catch (error) {
628
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquidProvider: Subscription builder approval unavailable', error);
629
+ return false;
630
+ }
631
+ finally {
632
+ if (__classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").get(key) === approval) {
633
+ __classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").delete(key);
634
+ }
635
+ }
636
+ }
505
637
  /**
506
638
  * Place an order using direct wallet signing
507
639
  *
@@ -1249,19 +1381,11 @@ class HyperLiquidProvider {
1249
1381
  results: skippedResults,
1250
1382
  };
1251
1383
  }
1252
- // Calculate discounted builder fee if reward discount is active
1253
- let builderFee = hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps;
1254
- if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") !== undefined) {
1255
- builderFee = Math.floor(builderFee * (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / hyperLiquidConfig_js_1.BASIS_POINTS_DIVISOR));
1256
- }
1257
1384
  // Single batch API call
1258
1385
  const result = await exchangeClient.order({
1259
1386
  orders,
1260
1387
  grouping: 'na',
1261
- builder: {
1262
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
1263
- f: builderFee,
1264
- },
1388
+ builder: await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this),
1265
1389
  });
1266
1390
  // Parse response statuses (one per order)
1267
1391
  const { statuses } = result.response.data;
@@ -1627,26 +1751,13 @@ class HyperLiquidProvider {
1627
1751
  // No orderId since we only cancelled orders, didn't place new ones
1628
1752
  };
1629
1753
  }
1630
- // Calculate discounted builder fee if reward discount is active
1631
- let builderFee = hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps;
1632
- if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") !== undefined) {
1633
- builderFee = Math.floor(builderFee * (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / hyperLiquidConfig_js_1.BASIS_POINTS_DIVISOR));
1634
- __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquid: Applying builder fee discount to TP/SL', {
1635
- originalFee: hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps,
1636
- discountBips: __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f"),
1637
- discountedFee: builderFee,
1638
- });
1639
- }
1640
1754
  // Submit via SDK exchange client. Position-bound TP/SL uses 'positionTpsl';
1641
1755
  // partial TP/SL must be standalone reduce-only triggers ('na'), since a
1642
1756
  // position-bound TP/SL always closes the whole position.
1643
1757
  const result = await exchangeClient.order({
1644
1758
  orders,
1645
1759
  grouping: isPartialTpsl ? 'na' : 'positionTpsl',
1646
- builder: {
1647
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
1648
- f: builderFee,
1649
- },
1760
+ builder: await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this),
1650
1761
  });
1651
1762
  if (result.status !== 'ok') {
1652
1763
  throw new Error(`TP/SL update failed: ${JSON.stringify(result)}`);
@@ -1945,6 +2056,122 @@ class HyperLiquidProvider {
1945
2056
  };
1946
2057
  }
1947
2058
  }
2059
+ /**
2060
+ * Fetch a complete standalone user-data bundle.
2061
+ *
2062
+ * Each DEX clearinghouse response is shared by position and account-state
2063
+ * mapping. Any required request failure rejects the entire bundle.
2064
+ *
2065
+ * @param params - User and captured controller identity.
2066
+ * @returns The complete user-data snapshot.
2067
+ */
2068
+ async getUserDataSnapshot(params) {
2069
+ const { identity, userAddress } = params;
2070
+ const network = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode() ? 'testnet' : 'mainnet';
2071
+ const snapshotStartedAt = __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now();
2072
+ const measure = async (stage, request, dex) => {
2073
+ const startedAt = __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now();
2074
+ const dexDetail = dex === undefined ? {} : { dex: dex ?? 'main' };
2075
+ try {
2076
+ const result = await request();
2077
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[PerpsUserSnapshot]', {
2078
+ stage,
2079
+ durationMs: Math.round(__classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now() - startedAt),
2080
+ success: true,
2081
+ ...dexDetail,
2082
+ });
2083
+ return result;
2084
+ }
2085
+ catch (error) {
2086
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[PerpsUserSnapshot]', {
2087
+ stage,
2088
+ durationMs: Math.round(__classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now() - startedAt),
2089
+ success: false,
2090
+ ...dexDetail,
2091
+ });
2092
+ throw error;
2093
+ }
2094
+ };
2095
+ if (identity.provider !== 'hyperliquid' || identity.network !== network) {
2096
+ throw new Error('User data snapshot identity does not match provider');
2097
+ }
2098
+ const requestedDexes = identity.dexes;
2099
+ const canonicalDexes = (0, hyperLiquidConfig_js_1.canonicalizeHyperLiquidDexes)(requestedDexes);
2100
+ const hasValidDexIdentity = requestedDexes.length > 0 &&
2101
+ new Set(requestedDexes).size === requestedDexes.length &&
2102
+ requestedDexes.every((dex) => dex === 'main' || /^[a-z0-9][a-z0-9-]*$/u.test(dex)) &&
2103
+ requestedDexes.length === canonicalDexes.length &&
2104
+ requestedDexes.every((dex, index) => dex === canonicalDexes[index]);
2105
+ if (!hasValidDexIdentity) {
2106
+ throw new Error('User data snapshot DEX identity is invalid');
2107
+ }
2108
+ const dexs = requestedDexes.map((dex) => (dex === 'main' ? null : dex));
2109
+ const standaloneInfoClient = (0, standaloneInfoClient_js_1.createStandaloneInfoClient)({
2110
+ isTestnet: network === 'testnet',
2111
+ });
2112
+ const buildUserParams = (dex) => ({
2113
+ user: userAddress,
2114
+ ...(dex ? { dex } : {}),
2115
+ });
2116
+ const [clearinghouseStates, openOrdersByDex, spotState, abstractionMode] = await Promise.all([
2117
+ Promise.all(dexs.map((dex) => measure('clearinghouse_state', () => standaloneInfoClient.clearinghouseState(buildUserParams(dex)), dex))),
2118
+ Promise.all(dexs.map((dex) => measure('frontend_open_orders', () => standaloneInfoClient.frontendOpenOrders(buildUserParams(dex)), dex))),
2119
+ measure('spot_clearinghouse_state', () => standaloneInfoClient.spotClearinghouseState({ user: userAddress })),
2120
+ measure('user_abstraction', () => standaloneInfoClient.userAbstraction({ user: userAddress })),
2121
+ ]);
2122
+ const rawOrders = openOrdersByDex.flat();
2123
+ const childOrderIds = collectChildOrderIds(rawOrders);
2124
+ const ordersBySymbol = groupOrdersBySymbol(rawOrders);
2125
+ const positions = clearinghouseStates.flatMap((state) => state.assetPositions
2126
+ .filter(({ position }) => position.szi !== '0')
2127
+ .map((assetPosition) => {
2128
+ const position = (0, hyperLiquidAdapter_js_1.adaptPositionFromSDK)(assetPosition);
2129
+ const { takeProfitOrders, stopLossOrders, takeProfitPrice, stopLossPrice, } = collectPositionTriggerOrders({
2130
+ orders: ordersBySymbol.get(position.symbol) ?? [],
2131
+ position,
2132
+ childOrderIds,
2133
+ });
2134
+ return {
2135
+ ...position,
2136
+ takeProfitCount: takeProfitOrders.length,
2137
+ stopLossCount: stopLossOrders.length,
2138
+ takeProfitOrders,
2139
+ stopLossOrders,
2140
+ ...(takeProfitPrice && { takeProfitPrice }),
2141
+ ...(stopLossPrice && { stopLossPrice }),
2142
+ };
2143
+ }));
2144
+ const positionsBySymbol = new Map(positions.map((position) => [position.symbol, position]));
2145
+ const orders = rawOrders.map((order) => (0, hyperLiquidAdapter_js_1.adaptOrderFromSDK)(order, positionsBySymbol.get(order.coin)));
2146
+ const dexAccountStates = clearinghouseStates.map((state) => (0, hyperLiquidAdapter_js_1.adaptAccountStateFromSDK)(state));
2147
+ const accountState = (0, accountUtils_js_1.addSpotBalanceToAccountState)((0, accountUtils_js_1.aggregateAccountStates)(dexAccountStates), spotState, { foldIntoCollateral: (0, hyperliquid_types_js_1.hyperLiquidModeFoldsSpot)(abstractionMode) });
2148
+ accountState.subAccountBreakdown = Object.fromEntries(dexAccountStates.map((dexAccountState, index) => {
2149
+ return [
2150
+ dexs[index] ?? '',
2151
+ {
2152
+ spendableBalance: dexAccountState.spendableBalance,
2153
+ withdrawableBalance: dexAccountState.withdrawableBalance,
2154
+ totalBalance: dexAccountState.totalBalance,
2155
+ },
2156
+ ];
2157
+ }));
2158
+ const snapshot = {
2159
+ positions,
2160
+ orders,
2161
+ accountState,
2162
+ identity: {
2163
+ ...identity,
2164
+ address: userAddress,
2165
+ },
2166
+ };
2167
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[PerpsUserSnapshot]', {
2168
+ stage: 'complete',
2169
+ durationMs: Math.round(__classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now() - snapshotStartedAt),
2170
+ success: true,
2171
+ dexCount: dexs.length,
2172
+ });
2173
+ return snapshot;
2174
+ }
1948
2175
  /**
1949
2176
  * Get current positions with TP/SL prices
1950
2177
  *
@@ -4296,6 +4523,10 @@ class HyperLiquidProvider {
4296
4523
  // Clear session caches (ensures fresh state on reconnect/account switch)
4297
4524
  __classPrivateFieldGet(this, _HyperLiquidProvider_referralCheckCache, "f").clear();
4298
4525
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").clear();
4526
+ __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f") + 1, "f");
4527
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").clear();
4528
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeResolution, undefined, "f");
4529
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeDiscountBips, undefined, "f");
4299
4530
  // NOTE: UnifiedAccountCache is global and NOT cleared on disconnect
4300
4531
  // to prevent repeated signing requests across reconnections
4301
4532
  __classPrivateFieldGet(this, _HyperLiquidProvider_cachedMetaByDex, "f").clear();
@@ -4477,7 +4708,7 @@ class HyperLiquidProvider {
4477
4708
  }
4478
4709
  }
4479
4710
  exports.HyperLiquidProvider = HyperLiquidProvider;
4480
- _HyperLiquidProvider_deps = new WeakMap(), _HyperLiquidProvider_clientService = new WeakMap(), _HyperLiquidProvider_walletService = new WeakMap(), _HyperLiquidProvider_subscriptionService = new WeakMap(), _HyperLiquidProvider_symbolToAssetId = new WeakMap(), _HyperLiquidProvider_userFeeCache = new WeakMap(), _HyperLiquidProvider_maxLeverageCache = new WeakMap(), _HyperLiquidProvider_cachedMetaByDex = new WeakMap(), _HyperLiquidProvider_cachedMarketDataWithPrices = new WeakMap(), _HyperLiquidProvider_cachedSpotMeta = new WeakMap(), _HyperLiquidProvider_dexDiscoveryCache = new WeakMap(), _HyperLiquidProvider_referralCheckCache = new WeakMap(), _HyperLiquidProvider_builderFeeCheckCache = new WeakMap(), _HyperLiquidProvider_ensureReadyPromise = new WeakMap(), _HyperLiquidProvider_pendingBuilderFeeApprovals = new WeakMap(), _HyperLiquidProvider_compiledAllowlistPatterns = new WeakMap(), _HyperLiquidProvider_compiledBlocklistPatterns = new WeakMap(), _HyperLiquidProvider_userFeeDiscountBips = new WeakMap(), _HyperLiquidProvider_hip3Enabled = new WeakMap(), _HyperLiquidProvider_allowlistMarkets = new WeakMap(), _HyperLiquidProvider_blocklistMarkets = new WeakMap(), _HyperLiquidProvider_useUnifiedAccount = new WeakMap(), _HyperLiquidProvider_dexDiscoveryComplete = new WeakMap(), _HyperLiquidProvider_unifiedAccountSetupNeedsRetry = new WeakMap(), _HyperLiquidProvider_pendingValidatedDexsPromise = new WeakMap(), _HyperLiquidProvider_cachedUsdcTokenId = new WeakMap(), _HyperLiquidProvider_errorMappings = new WeakMap(), _HyperLiquidProvider_scaleOrderGroups = new WeakMap(), _HyperLiquidProvider_chaseSessions = new WeakMap(), _HyperLiquidProvider_chasePlacementsInFlight = new WeakMap(), _HyperLiquidProvider_chaseGeneration = new WeakMap(), _HyperLiquidProvider_clientsInitialized = new WeakMap(), _HyperLiquidProvider_initializationPromise = new WeakMap(), _HyperLiquidProvider_messenger = new WeakMap(), _HyperLiquidProvider_builderAddressTestnet = new WeakMap(), _HyperLiquidProvider_builderAddressMainnet = new WeakMap(), _HyperLiquidProvider_priceDeviationLimit = new WeakMap(), _HyperLiquidProvider_tradingSetupPromise = new WeakMap(), _HyperLiquidProvider_tradingSetupComplete = new WeakMap(), _HyperLiquidProvider_instances = new WeakSet(), _HyperLiquidProvider_compilePatternsSafely = function _HyperLiquidProvider_compilePatternsSafely(patterns, listName) {
4711
+ _HyperLiquidProvider_deps = new WeakMap(), _HyperLiquidProvider_clientService = new WeakMap(), _HyperLiquidProvider_walletService = new WeakMap(), _HyperLiquidProvider_subscriptionService = new WeakMap(), _HyperLiquidProvider_symbolToAssetId = new WeakMap(), _HyperLiquidProvider_userFeeCache = new WeakMap(), _HyperLiquidProvider_maxLeverageCache = new WeakMap(), _HyperLiquidProvider_cachedMetaByDex = new WeakMap(), _HyperLiquidProvider_cachedMarketDataWithPrices = new WeakMap(), _HyperLiquidProvider_cachedSpotMeta = new WeakMap(), _HyperLiquidProvider_dexDiscoveryCache = new WeakMap(), _HyperLiquidProvider_referralCheckCache = new WeakMap(), _HyperLiquidProvider_builderFeeCheckCache = new WeakMap(), _HyperLiquidProvider_ensureReadyPromise = new WeakMap(), _HyperLiquidProvider_pendingBuilderFeeApprovals = new WeakMap(), _HyperLiquidProvider_subscriptionBuilderApprovalEpoch = new WeakMap(), _HyperLiquidProvider_approvedBuilderAddresses = new WeakMap(), _HyperLiquidProvider_compiledAllowlistPatterns = new WeakMap(), _HyperLiquidProvider_compiledBlocklistPatterns = new WeakMap(), _HyperLiquidProvider_userFeeDiscountBips = new WeakMap(), _HyperLiquidProvider_userFeeResolution = new WeakMap(), _HyperLiquidProvider_hip3Enabled = new WeakMap(), _HyperLiquidProvider_allowlistMarkets = new WeakMap(), _HyperLiquidProvider_blocklistMarkets = new WeakMap(), _HyperLiquidProvider_useUnifiedAccount = new WeakMap(), _HyperLiquidProvider_dexDiscoveryComplete = new WeakMap(), _HyperLiquidProvider_unifiedAccountSetupNeedsRetry = new WeakMap(), _HyperLiquidProvider_pendingValidatedDexsPromise = new WeakMap(), _HyperLiquidProvider_cachedUsdcTokenId = new WeakMap(), _HyperLiquidProvider_errorMappings = new WeakMap(), _HyperLiquidProvider_scaleOrderGroups = new WeakMap(), _HyperLiquidProvider_chaseSessions = new WeakMap(), _HyperLiquidProvider_chasePlacementsInFlight = new WeakMap(), _HyperLiquidProvider_chaseGeneration = new WeakMap(), _HyperLiquidProvider_clientsInitialized = new WeakMap(), _HyperLiquidProvider_initializationPromise = new WeakMap(), _HyperLiquidProvider_messenger = new WeakMap(), _HyperLiquidProvider_builderAddressTestnet = new WeakMap(), _HyperLiquidProvider_builderAddressMainnet = new WeakMap(), _HyperLiquidProvider_subscriptionBuilderAddressTestnet = new WeakMap(), _HyperLiquidProvider_subscriptionBuilderAddressMainnet = new WeakMap(), _HyperLiquidProvider_priceDeviationLimit = new WeakMap(), _HyperLiquidProvider_tradingSetupPromise = new WeakMap(), _HyperLiquidProvider_tradingSetupComplete = new WeakMap(), _HyperLiquidProvider_instances = new WeakSet(), _HyperLiquidProvider_compilePatternsSafely = function _HyperLiquidProvider_compilePatternsSafely(patterns, listName) {
4481
4712
  const compiled = [];
4482
4713
  for (const pattern of patterns) {
4483
4714
  try {
@@ -5101,7 +5332,7 @@ async function _HyperLiquidProvider_getOrFetchPrice(params) {
5101
5332
  }
5102
5333
  // Fallback to REST API if cache miss
5103
5334
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('Price cache miss for getOrFetchPrice, falling back to REST allMids', { symbol });
5104
- const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient();
5335
+ const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient({ useHttp: true });
5105
5336
  const mids = await infoClient.allMids(dexName ? { dex: dexName } : undefined);
5106
5337
  const price = parseFloat(mids[symbol] || '0');
5107
5338
  // Validate REST price: must be positive and finite
@@ -5272,8 +5503,16 @@ async function _HyperLiquidProvider_getCachedMeta(params) {
5272
5503
  return cached;
5273
5504
  }
5274
5505
  }
5275
- // Cache miss or skipCache=true - fetch from API
5276
- const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient();
5506
+ // Cache miss or skipCache=true - fetch from API.
5507
+ // Bring the SDK clients up first. This is the first client touch on the
5508
+ // write path — placeOrder resolves asset info before it ensures trading
5509
+ // readiness — so without it a cold start or a post-disconnect action fails
5510
+ // with CLIENT_NOT_INITIALIZED instead of waiting for the clients it needs.
5511
+ // Idempotent, and a warm cache hit returns above without reaching here.
5512
+ await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_ensureClientsInitialized).call(this);
5513
+ // Metadata is request/response data, so keep this path available while a
5514
+ // failed WebSocket reconnect is retrying.
5515
+ const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient({ useHttp: true });
5277
5516
  // Pass dex only for HIP-3 DEXs; omit for main DEX (empty string).
5278
5517
  // Testnet API returns null when dex="" is explicitly sent.
5279
5518
  const meta = await infoClient.meta(dexKey ? { dex: dexKey } : undefined);
@@ -5494,6 +5733,8 @@ async function _HyperLiquidProvider_calculateHip3FeeMultiplier(params) {
5494
5733
  }
5495
5734
  }, _HyperLiquidProvider_getCacheKey = function _HyperLiquidProvider_getCacheKey(network, userAddress) {
5496
5735
  return `${network}:${userAddress.toLowerCase()}`;
5736
+ }, _HyperLiquidProvider_getApprovedBuilderKey = function _HyperLiquidProvider_getApprovedBuilderKey(network, userAddress, builderAddress) {
5737
+ return `${__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getCacheKey).call(this, network, userAddress)}:${builderAddress.toLowerCase()}`;
5497
5738
  }, _HyperLiquidProvider_fetchMarketsForDex =
5498
5739
  /**
5499
5740
  * Fetch markets for a specific DEX with optional filtering
@@ -5821,12 +6062,12 @@ async function _HyperLiquidProvider_queryUserDataAcrossDexs(baseParams, queryFn)
5821
6062
  /**
5822
6063
  * Check current builder fee approval for the user
5823
6064
  *
6065
+ * @param builder - Builder address to query.
6066
+ * @param userAddress - Account whose approval should be queried.
5824
6067
  * @returns Current max fee rate or null if not approved
5825
6068
  */
5826
- async function _HyperLiquidProvider_checkBuilderFeeApproval() {
6069
+ async function _HyperLiquidProvider_checkBuilderFeeApproval(builder, userAddress) {
5827
6070
  const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient();
5828
- const userAddress = await __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f").getUserAddressWithDefault();
5829
- const builder = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode());
5830
6071
  return infoClient.maxBuilderFee({
5831
6072
  user: userAddress,
5832
6073
  builder,
@@ -5855,6 +6096,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5855
6096
  if (globalCached?.attempted && globalCached?.success) {
5856
6097
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[ensureBuilderFeeApproval] Using global cache (prevents hardware wallet prompt spam)', { network, success: globalCached.success });
5857
6098
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").set(cacheKey, true);
6099
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress));
5858
6100
  return;
5859
6101
  }
5860
6102
  // Check if another provider instance is currently attempting this operation
@@ -5874,7 +6116,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5874
6116
  completeInFlight();
5875
6117
  return;
5876
6118
  }
5877
- const { isApproved, requiredDecimal } = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeStatus).call(this);
6119
+ const { isApproved, requiredDecimal } = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeStatus).call(this, builderAddress, userAddress);
5878
6120
  if (isApproved) {
5879
6121
  // User already has approval on-chain
5880
6122
  TradingReadinessCache_js_1.PerpsSigningCache.setBuilderFee(network, userAddress, {
@@ -5882,6 +6124,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5882
6124
  success: true,
5883
6125
  });
5884
6126
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").set(cacheKey, true);
6127
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress));
5885
6128
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[ensureBuilderFeeApproval] Already approved on-chain', { network });
5886
6129
  }
5887
6130
  else {
@@ -5893,7 +6136,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5893
6136
  maxFeeRate,
5894
6137
  });
5895
6138
  // Verify approval was successful before caching
5896
- const afterApprovalDecimal = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this);
6139
+ const afterApprovalDecimal = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
5897
6140
  if (afterApprovalDecimal === null ||
5898
6141
  afterApprovalDecimal < requiredDecimal) {
5899
6142
  throw new Error('[HyperLiquidProvider] Builder fee approval verification failed');
@@ -5904,6 +6147,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5904
6147
  success: true,
5905
6148
  });
5906
6149
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").set(cacheKey, true);
6150
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress));
5907
6151
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[ensureBuilderFeeApproval] Approval successful', {
5908
6152
  builder: builderAddress,
5909
6153
  maxFeeRate,
@@ -5935,10 +6179,12 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5935
6179
  /**
5936
6180
  * Check if builder fee is approved for the current user
5937
6181
  *
6182
+ * @param builderAddress - Builder address to query.
6183
+ * @param userAddress - Account whose approval should be queried.
5938
6184
  * @returns Object with approval status and current rate
5939
6185
  */
5940
- async function _HyperLiquidProvider_checkBuilderFeeStatus() {
5941
- const currentApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this);
6186
+ async function _HyperLiquidProvider_checkBuilderFeeStatus(builderAddress, userAddress) {
6187
+ const currentApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
5942
6188
  const requiredDecimal = hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeDecimal;
5943
6189
  return {
5944
6190
  isApproved: currentApproval !== null && currentApproval >= requiredDecimal,
@@ -6492,16 +6738,7 @@ async function _HyperLiquidProvider_handleHip3PreOrder(params) {
6492
6738
  async function _HyperLiquidProvider_submitOrderWithRollback(params) {
6493
6739
  const { orders, grouping, isHip3Order, dexName, transferInfo, symbol } = params;
6494
6740
  const exchangeClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getExchangeClient();
6495
- // Calculate discounted builder fee
6496
- let builderFee = hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps;
6497
- if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") !== undefined) {
6498
- builderFee = Math.floor(builderFee * (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / hyperLiquidConfig_js_1.BASIS_POINTS_DIVISOR));
6499
- __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('Applying builder fee discount', {
6500
- originalFee: hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps,
6501
- discountBips: __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f"),
6502
- discountedFee: builderFee,
6503
- });
6504
- }
6741
+ const builder = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this);
6505
6742
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('Submitting order via asset ID routing', {
6506
6743
  symbol,
6507
6744
  assetId: orders[0].a,
@@ -6514,10 +6751,7 @@ async function _HyperLiquidProvider_submitOrderWithRollback(params) {
6514
6751
  const result = await exchangeClient.order({
6515
6752
  orders,
6516
6753
  grouping,
6517
- builder: {
6518
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
6519
- f: builderFee,
6520
- },
6754
+ builder,
6521
6755
  });
6522
6756
  if (result.status !== 'ok') {
6523
6757
  throw new Error(`Order failed: ${JSON.stringify(result)}`);
@@ -6835,10 +7069,7 @@ async function _HyperLiquidProvider_placeScaleOrder(params, context) {
6835
7069
  const result = await exchangeClient.order({
6836
7070
  orders,
6837
7071
  grouping: 'na',
6838
- builder: {
6839
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
6840
- f: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getDiscountedBuilderFee).call(this),
6841
- },
7072
+ builder: await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this),
6842
7073
  });
6843
7074
  if (result.status !== 'ok') {
6844
7075
  throw new Error(`Scale order failed: ${JSON.stringify(result)}`);
@@ -6922,8 +7153,8 @@ async function _HyperLiquidProvider_startChaseSession(params, context, generatio
6922
7153
  if (generation !== __classPrivateFieldGet(this, _HyperLiquidProvider_chaseGeneration, "f")) {
6923
7154
  throw new Error(perpsErrorCodes_js_1.PERPS_ERROR_CODES.ORDER_CHASE_ABANDONED);
6924
7155
  }
6925
- // Read once, while the caller's discount context is still set.
6926
- const builderFee = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getDiscountedBuilderFee).call(this);
7156
+ // Read once, while the caller's fee-source context is still set.
7157
+ const builder = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this);
6927
7158
  // Held onto rather than looked up again after the submission returns.
6928
7159
  // `disconnect` drops the service's client reference synchronously, so a
6929
7160
  // retraction that asked for a client after the fact would be refused one
@@ -6936,7 +7167,8 @@ async function _HyperLiquidProvider_startChaseSession(params, context, generatio
6936
7167
  price: quotePrice,
6937
7168
  size: formattedSize,
6938
7169
  reduceOnly: params.reduceOnly ?? false,
6939
- builderFee,
7170
+ builderFee: builder.f,
7171
+ builderAddress: builder.b,
6940
7172
  exchangeClient: placingClient,
6941
7173
  });
6942
7174
  const intervalMs = params.chaseIntervalMs ?? perpsConfig_js_1.CHASE_ORDER_CONFIG.DefaultIntervalMs;
@@ -6952,7 +7184,8 @@ async function _HyperLiquidProvider_startChaseSession(params, context, generatio
6952
7184
  pendingReplacement: null,
6953
7185
  restingPrice: quotePrice,
6954
7186
  intervalMs,
6955
- builderFee,
7187
+ builderFee: builder.f,
7188
+ builderAddress: builder.b,
6956
7189
  deadline: Date.now() +
6957
7190
  (params.chaseMaxDurationMs ?? perpsConfig_js_1.CHASE_ORDER_CONFIG.DefaultMaxDurationMs),
6958
7191
  maxRepricings: params.chaseMaxRepricings ?? perpsConfig_js_1.CHASE_ORDER_CONFIG.DefaultMaxRepricings,
@@ -7058,6 +7291,7 @@ async function _HyperLiquidProvider_getChaseQuotePrice(params) {
7058
7291
  * @param params.reduceOnly - Whether the order may only reduce a position.
7059
7292
  * @param params.builderFee - Builder fee, in tenths of a basis point, captured
7060
7293
  * when the session started so replacements keep the rate they were quoted at.
7294
+ * @param params.builderAddress - Builder address captured with the fee.
7061
7295
  * @param params.exchangeClient - Client to submit through. Passed in rather
7062
7296
  * than looked up here so a first placement can keep the instance it signed
7063
7297
  * with, which is the only one that can take the order back once `disconnect`
@@ -7080,7 +7314,7 @@ async function _HyperLiquidProvider_restChaseOrder(params) {
7080
7314
  ],
7081
7315
  grouping: 'na',
7082
7316
  builder: {
7083
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
7317
+ b: params.builderAddress,
7084
7318
  f: params.builderFee,
7085
7319
  },
7086
7320
  });
@@ -7258,6 +7492,7 @@ async function _HyperLiquidProvider_runChaseTick(sessionId) {
7258
7492
  size: remaining,
7259
7493
  reduceOnly: session.reduceOnly,
7260
7494
  builderFee: session.builderFee,
7495
+ builderAddress: session.builderAddress,
7261
7496
  // A running session is on a live provider, so the current client is
7262
7497
  // the right one; only the first placement has a teardown to survive.
7263
7498
  exchangeClient: __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getExchangeClient(),
@@ -7631,6 +7866,33 @@ async function _HyperLiquidProvider_cancelChaseOrder(params) {
7631
7866
  }
7632
7867
  return Math.floor(hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps *
7633
7868
  (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / hyperLiquidConfig_js_1.BASIS_POINTS_DIVISOR));
7869
+ }, _HyperLiquidProvider_getBuilderOrderContext =
7870
+ /**
7871
+ * Resolve the builder payload for the current operation.
7872
+ *
7873
+ * Subscription waivers use their dedicated builder only after approval is
7874
+ * cached for this provider/account session. Until then, the ordinary builder
7875
+ * and standard fee keep the trade attributable and non-blocking.
7876
+ *
7877
+ * @returns HyperLiquid builder address and fee payload.
7878
+ */
7879
+ async function _HyperLiquidProvider_getBuilderOrderContext() {
7880
+ const isTestnet = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode();
7881
+ const network = isTestnet ? 'testnet' : 'mainnet';
7882
+ const defaultBuilder = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, isTestnet);
7883
+ if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeResolution, "f")?.source === 'subscription') {
7884
+ const subscriptionBuilder = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getSubscriptionBuilderAddress).call(this, isTestnet);
7885
+ const userAddress = await __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f").getUserAddressWithDefault();
7886
+ if (subscriptionBuilder &&
7887
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, subscriptionBuilder))) {
7888
+ return { b: subscriptionBuilder, f: 0 };
7889
+ }
7890
+ return {
7891
+ b: defaultBuilder,
7892
+ f: hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MaxFeeTenthsBps,
7893
+ };
7894
+ }
7895
+ return { b: defaultBuilder, f: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getDiscountedBuilderFee).call(this) };
7634
7896
  }, _HyperLiquidProvider_fetchOpenOrders =
7635
7897
  /**
7636
7898
  * Read the account's currently resting orders.
@@ -7924,6 +8186,10 @@ async function _HyperLiquidProvider_excludeNonUsdcCollateralResults(results) {
7924
8186
  }
7925
8187
  // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
7926
8188
  return __classPrivateFieldGet(this, _HyperLiquidProvider_builderAddressMainnet, "f") || hyperLiquidConfig_js_1.BUILDER_FEE_CONFIG.MainnetBuilder;
8189
+ }, _HyperLiquidProvider_getSubscriptionBuilderAddress = function _HyperLiquidProvider_getSubscriptionBuilderAddress(isTestnet) {
8190
+ return isTestnet
8191
+ ? __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderAddressTestnet, "f")
8192
+ : __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderAddressMainnet, "f");
7927
8193
  }, _HyperLiquidProvider_getReferralCode = function _HyperLiquidProvider_getReferralCode(isTestnet) {
7928
8194
  return isTestnet
7929
8195
  ? hyperLiquidConfig_js_1.REFERRAL_CONFIG.TestnetCode