@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
@@ -9,11 +9,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  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");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- 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;
12
+ 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;
13
13
  import { hasProperty } from "@metamask/utils";
14
14
  import { v4 as uuidv4 } from "uuid";
15
15
  import { PERPS_EVENT_PROPERTY, PERPS_EVENT_VALUE } from "../constants/eventNames.mjs";
16
- import { BASIS_POINTS_DIVISOR, BUILDER_FEE_CONFIG, FEE_RATES, getBridgeInfo, getChainId, HIP3_ASSET_MARKET_TYPES, HIP3_FEE_CONFIG, HIP3_MARGIN_CONFIG, HYPERLIQUID_ASSET_NAMES, HYPERLIQUID_CONFIG, HYPERLIQUID_WITHDRAWAL_MINUTES, REFERRAL_CONFIG, TRADING_DEFAULTS, USDC_DECIMALS, USDC_SYMBOL } from "../constants/hyperLiquidConfig.mjs";
16
+ import { BASIS_POINTS_DIVISOR, BUILDER_FEE_CONFIG, canonicalizeHyperLiquidDexes, FEE_RATES, getBridgeInfo, getChainId, HIP3_ASSET_MARKET_TYPES, HIP3_FEE_CONFIG, HIP3_MARGIN_CONFIG, HYPERLIQUID_ASSET_NAMES, HYPERLIQUID_CONFIG, HYPERLIQUID_WITHDRAWAL_MINUTES, REFERRAL_CONFIG, TRADING_DEFAULTS, USDC_DECIMALS, USDC_SYMBOL } from "../constants/hyperLiquidConfig.mjs";
17
17
  import { CHASE_ORDER_CONFIG, HYPERLIQUID_TWAP_LIMITS, ORDER_SLIPPAGE_CONFIG, PERFORMANCE_CONFIG, PERPS_CONSTANTS, TP_SL_CONFIG, WITHDRAWAL_CONSTANTS } from "../constants/perpsConfig.mjs";
18
18
  import { PERPS_TRANSACTIONS_HISTORY_CONSTANTS } from "../constants/transactionsHistoryConfig.mjs";
19
19
  import { PERPS_ERROR_CODES } from "../perpsErrorCodes.mjs";
@@ -227,7 +227,32 @@ function groupOrdersBySymbol(orders) {
227
227
  function collectPositionTriggerOrders(params) {
228
228
  const { orders, position, childOrderIds } = params;
229
229
  const byOrderId = new Map();
230
+ let takeProfitPrice;
231
+ let stopLossPrice;
230
232
  orders.forEach((rawOrder) => {
233
+ if (rawOrder.isTrigger &&
234
+ rawOrder.reduceOnly &&
235
+ rawOrder.isPositionTpsl === Boolean(TP_SL_CONFIG.UsePositionBoundTpsl)) {
236
+ if (rawOrder.orderType.includes('Take Profit')) {
237
+ takeProfitPrice = rawOrder.triggerPx;
238
+ }
239
+ else if (rawOrder.orderType.includes('Stop')) {
240
+ stopLossPrice = rawOrder.triggerPx;
241
+ }
242
+ }
243
+ rawOrder.children?.forEach((childOrder) => {
244
+ if (!childOrder.isTrigger ||
245
+ !childOrder.reduceOnly ||
246
+ childOrder.isPositionTpsl !== Boolean(TP_SL_CONFIG.UsePositionBoundTpsl)) {
247
+ return;
248
+ }
249
+ if (childOrder.orderType.includes('Take Profit')) {
250
+ takeProfitPrice = childOrder.triggerPx;
251
+ }
252
+ else if (childOrder.orderType.includes('Stop')) {
253
+ stopLossPrice = childOrder.triggerPx;
254
+ }
255
+ });
231
256
  if (rawOrder.coin !== position.symbol ||
232
257
  !rawOrder.isTrigger ||
233
258
  !rawOrder.reduceOnly ||
@@ -247,6 +272,8 @@ function collectPositionTriggerOrders(params) {
247
272
  return {
248
273
  takeProfitOrders: triggerOrders.filter((order) => order.direction === 'take_profit'),
249
274
  stopLossOrders: triggerOrders.filter((order) => order.direction !== 'take_profit'),
275
+ ...(takeProfitPrice && { takeProfitPrice }),
276
+ ...(stopLossPrice && { stopLossPrice }),
250
277
  };
251
278
  }
252
279
  /**
@@ -298,11 +325,15 @@ export class HyperLiquidProvider {
298
325
  // Prevents multiple signature requests when methods called simultaneously
299
326
  _HyperLiquidProvider_ensureReadyPromise.set(this, null);
300
327
  _HyperLiquidProvider_pendingBuilderFeeApprovals.set(this, new Map());
328
+ _HyperLiquidProvider_subscriptionBuilderApprovalEpoch.set(this, 0);
329
+ /** Builder approvals keyed by network, account, and builder address. */
330
+ _HyperLiquidProvider_approvedBuilderAddresses.set(this, new Set());
301
331
  // Pre-compiled patterns for fast filtering
302
332
  _HyperLiquidProvider_compiledAllowlistPatterns.set(this, []);
303
333
  _HyperLiquidProvider_compiledBlocklistPatterns.set(this, []);
304
334
  // Fee discount context for MetaMask reward discounts (in basis points)
305
335
  _HyperLiquidProvider_userFeeDiscountBips.set(this, void 0);
336
+ _HyperLiquidProvider_userFeeResolution.set(this, void 0);
306
337
  // Feature flag configuration for HIP-3 market filtering
307
338
  _HyperLiquidProvider_hip3Enabled.set(this, void 0);
308
339
  _HyperLiquidProvider_allowlistMarkets.set(this, void 0);
@@ -359,6 +390,8 @@ export class HyperLiquidProvider {
359
390
  _HyperLiquidProvider_messenger.set(this, void 0);
360
391
  _HyperLiquidProvider_builderAddressTestnet.set(this, void 0);
361
392
  _HyperLiquidProvider_builderAddressMainnet.set(this, void 0);
393
+ _HyperLiquidProvider_subscriptionBuilderAddressTestnet.set(this, void 0);
394
+ _HyperLiquidProvider_subscriptionBuilderAddressMainnet.set(this, void 0);
362
395
  _HyperLiquidProvider_priceDeviationLimit.set(this, void 0);
363
396
  /**
364
397
  * Ensure provider is ready for TRADING operations (signing required)
@@ -379,6 +412,8 @@ export class HyperLiquidProvider {
379
412
  __classPrivateFieldSet(this, _HyperLiquidProvider_messenger, options.messenger, "f");
380
413
  __classPrivateFieldSet(this, _HyperLiquidProvider_builderAddressTestnet, options.builderAddressTestnet, "f");
381
414
  __classPrivateFieldSet(this, _HyperLiquidProvider_builderAddressMainnet, options.builderAddressMainnet, "f");
415
+ __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionBuilderAddressTestnet, options.subscriptionBuilderAddressTestnet, "f");
416
+ __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionBuilderAddressMainnet, options.subscriptionBuilderAddressMainnet, "f");
382
417
  __classPrivateFieldSet(this, _HyperLiquidProvider_priceDeviationLimit, options.priceDeviationLimit ??
383
418
  HYPERLIQUID_CONFIG.OraclePriceDeviationLimit, "f");
384
419
  const isTestnet = options.isTestnet ?? false;
@@ -401,7 +436,11 @@ export class HyperLiquidProvider {
401
436
  isTestnet,
402
437
  }), "f");
403
438
  __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionService, new 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
404
- __classPrivateFieldGet(this, _HyperLiquidProvider_allowlistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_blocklistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_priceDeviationLimit, "f")), "f");
439
+ __classPrivateFieldGet(this, _HyperLiquidProvider_allowlistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_blocklistMarkets, "f"), __classPrivateFieldGet(this, _HyperLiquidProvider_priceDeviationLimit, "f"), async () => {
440
+ await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_ensureClientsInitialized).call(this);
441
+ const validatedDexs = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getValidatedDexs).call(this);
442
+ return validatedDexs.filter((dex) => dex !== null);
443
+ }), "f");
405
444
  // NOTE: Clients are NOT initialized here - they'll be initialized lazily
406
445
  // when first needed. This avoids accessing Engine.context before it's ready.
407
446
  // Pre-compile filter patterns for performance (invalid patterns are skipped)
@@ -458,6 +497,7 @@ export class HyperLiquidProvider {
458
497
  * @param discountBips - The discount in basis points (e.g., 550 = 5.5%)
459
498
  */
460
499
  setUserFeeDiscount(discountBips) {
500
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeResolution, undefined, "f");
461
501
  __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeDiscountBips, discountBips, "f");
462
502
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquid: Fee discount context updated', {
463
503
  discountBips,
@@ -465,6 +505,20 @@ export class HyperLiquidProvider {
465
505
  isActive: discountBips !== undefined,
466
506
  });
467
507
  }
508
+ /**
509
+ * Set the resolved fee and its attribution source for the next operation.
510
+ *
511
+ * @param resolution - Unified fee resolution, or undefined to clear it.
512
+ */
513
+ setUserFeeResolution(resolution) {
514
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeResolution, resolution, "f");
515
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeDiscountBips, resolution?.discountBips, "f");
516
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquid: Fee resolution context updated', {
517
+ source: resolution?.source,
518
+ discountBips: resolution?.discountBips,
519
+ isActive: resolution !== undefined,
520
+ });
521
+ }
468
522
  /**
469
523
  * Get supported deposit routes with complete asset and routing information
470
524
  *
@@ -499,6 +553,84 @@ export class HyperLiquidProvider {
499
553
  // For HyperLiquid, withdrawal routes are the same as deposit routes
500
554
  return this.getDepositRoutes(params);
501
555
  }
556
+ /**
557
+ * Approve the dedicated subscription builder outside order submission.
558
+ * Failure is non-blocking: order construction will use the ordinary builder
559
+ * at the standard fee until a later approval succeeds.
560
+ *
561
+ * @returns Whether the builder is approved for the current account.
562
+ */
563
+ async approveSubscriptionBuilderFee() {
564
+ const approvalEpoch = __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f");
565
+ await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_ensureClientsInitialized).call(this);
566
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
567
+ return false;
568
+ }
569
+ const isTestnet = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode();
570
+ const network = isTestnet ? 'testnet' : 'mainnet';
571
+ const builderAddress = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getSubscriptionBuilderAddress).call(this, isTestnet);
572
+ if (!builderAddress) {
573
+ return false;
574
+ }
575
+ const userAddress = await __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f").getUserAddressWithDefault();
576
+ const key = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress);
577
+ if (__classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(key)) {
578
+ return true;
579
+ }
580
+ const pending = __classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").get(key);
581
+ if (pending) {
582
+ try {
583
+ await pending;
584
+ return __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(key);
585
+ }
586
+ catch (error) {
587
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquidProvider: Subscription builder approval unavailable', error);
588
+ return false;
589
+ }
590
+ }
591
+ const approval = (async () => {
592
+ const currentApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
593
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
594
+ return;
595
+ }
596
+ if (currentApproval !== null &&
597
+ currentApproval >= BUILDER_FEE_CONFIG.MaxFeeDecimal) {
598
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(key);
599
+ return;
600
+ }
601
+ const exchangeClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getExchangeClient();
602
+ await exchangeClient.approveBuilderFee({
603
+ builder: builderAddress,
604
+ maxFeeRate: BUILDER_FEE_CONFIG.MaxFeeRate,
605
+ });
606
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
607
+ return;
608
+ }
609
+ const afterApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
610
+ if (approvalEpoch !== __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f")) {
611
+ return;
612
+ }
613
+ if (afterApproval === null ||
614
+ afterApproval < BUILDER_FEE_CONFIG.MaxFeeDecimal) {
615
+ throw new Error('[HyperLiquidProvider] Subscription builder approval verification failed');
616
+ }
617
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(key);
618
+ })();
619
+ __classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").set(key, approval);
620
+ try {
621
+ await approval;
622
+ return __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(key);
623
+ }
624
+ catch (error) {
625
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquidProvider: Subscription builder approval unavailable', error);
626
+ return false;
627
+ }
628
+ finally {
629
+ if (__classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").get(key) === approval) {
630
+ __classPrivateFieldGet(this, _HyperLiquidProvider_pendingBuilderFeeApprovals, "f").delete(key);
631
+ }
632
+ }
633
+ }
502
634
  /**
503
635
  * Place an order using direct wallet signing
504
636
  *
@@ -1246,19 +1378,11 @@ export class HyperLiquidProvider {
1246
1378
  results: skippedResults,
1247
1379
  };
1248
1380
  }
1249
- // Calculate discounted builder fee if reward discount is active
1250
- let builderFee = BUILDER_FEE_CONFIG.MaxFeeTenthsBps;
1251
- if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") !== undefined) {
1252
- builderFee = Math.floor(builderFee * (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / BASIS_POINTS_DIVISOR));
1253
- }
1254
1381
  // Single batch API call
1255
1382
  const result = await exchangeClient.order({
1256
1383
  orders,
1257
1384
  grouping: 'na',
1258
- builder: {
1259
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
1260
- f: builderFee,
1261
- },
1385
+ builder: await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this),
1262
1386
  });
1263
1387
  // Parse response statuses (one per order)
1264
1388
  const { statuses } = result.response.data;
@@ -1624,26 +1748,13 @@ export class HyperLiquidProvider {
1624
1748
  // No orderId since we only cancelled orders, didn't place new ones
1625
1749
  };
1626
1750
  }
1627
- // Calculate discounted builder fee if reward discount is active
1628
- let builderFee = BUILDER_FEE_CONFIG.MaxFeeTenthsBps;
1629
- if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") !== undefined) {
1630
- builderFee = Math.floor(builderFee * (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / BASIS_POINTS_DIVISOR));
1631
- __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('HyperLiquid: Applying builder fee discount to TP/SL', {
1632
- originalFee: BUILDER_FEE_CONFIG.MaxFeeTenthsBps,
1633
- discountBips: __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f"),
1634
- discountedFee: builderFee,
1635
- });
1636
- }
1637
1751
  // Submit via SDK exchange client. Position-bound TP/SL uses 'positionTpsl';
1638
1752
  // partial TP/SL must be standalone reduce-only triggers ('na'), since a
1639
1753
  // position-bound TP/SL always closes the whole position.
1640
1754
  const result = await exchangeClient.order({
1641
1755
  orders,
1642
1756
  grouping: isPartialTpsl ? 'na' : 'positionTpsl',
1643
- builder: {
1644
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
1645
- f: builderFee,
1646
- },
1757
+ builder: await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this),
1647
1758
  });
1648
1759
  if (result.status !== 'ok') {
1649
1760
  throw new Error(`TP/SL update failed: ${JSON.stringify(result)}`);
@@ -1942,6 +2053,122 @@ export class HyperLiquidProvider {
1942
2053
  };
1943
2054
  }
1944
2055
  }
2056
+ /**
2057
+ * Fetch a complete standalone user-data bundle.
2058
+ *
2059
+ * Each DEX clearinghouse response is shared by position and account-state
2060
+ * mapping. Any required request failure rejects the entire bundle.
2061
+ *
2062
+ * @param params - User and captured controller identity.
2063
+ * @returns The complete user-data snapshot.
2064
+ */
2065
+ async getUserDataSnapshot(params) {
2066
+ const { identity, userAddress } = params;
2067
+ const network = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode() ? 'testnet' : 'mainnet';
2068
+ const snapshotStartedAt = __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now();
2069
+ const measure = async (stage, request, dex) => {
2070
+ const startedAt = __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now();
2071
+ const dexDetail = dex === undefined ? {} : { dex: dex ?? 'main' };
2072
+ try {
2073
+ const result = await request();
2074
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[PerpsUserSnapshot]', {
2075
+ stage,
2076
+ durationMs: Math.round(__classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now() - startedAt),
2077
+ success: true,
2078
+ ...dexDetail,
2079
+ });
2080
+ return result;
2081
+ }
2082
+ catch (error) {
2083
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[PerpsUserSnapshot]', {
2084
+ stage,
2085
+ durationMs: Math.round(__classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now() - startedAt),
2086
+ success: false,
2087
+ ...dexDetail,
2088
+ });
2089
+ throw error;
2090
+ }
2091
+ };
2092
+ if (identity.provider !== 'hyperliquid' || identity.network !== network) {
2093
+ throw new Error('User data snapshot identity does not match provider');
2094
+ }
2095
+ const requestedDexes = identity.dexes;
2096
+ const canonicalDexes = canonicalizeHyperLiquidDexes(requestedDexes);
2097
+ const hasValidDexIdentity = requestedDexes.length > 0 &&
2098
+ new Set(requestedDexes).size === requestedDexes.length &&
2099
+ requestedDexes.every((dex) => dex === 'main' || /^[a-z0-9][a-z0-9-]*$/u.test(dex)) &&
2100
+ requestedDexes.length === canonicalDexes.length &&
2101
+ requestedDexes.every((dex, index) => dex === canonicalDexes[index]);
2102
+ if (!hasValidDexIdentity) {
2103
+ throw new Error('User data snapshot DEX identity is invalid');
2104
+ }
2105
+ const dexs = requestedDexes.map((dex) => (dex === 'main' ? null : dex));
2106
+ const standaloneInfoClient = createStandaloneInfoClient({
2107
+ isTestnet: network === 'testnet',
2108
+ });
2109
+ const buildUserParams = (dex) => ({
2110
+ user: userAddress,
2111
+ ...(dex ? { dex } : {}),
2112
+ });
2113
+ const [clearinghouseStates, openOrdersByDex, spotState, abstractionMode] = await Promise.all([
2114
+ Promise.all(dexs.map((dex) => measure('clearinghouse_state', () => standaloneInfoClient.clearinghouseState(buildUserParams(dex)), dex))),
2115
+ Promise.all(dexs.map((dex) => measure('frontend_open_orders', () => standaloneInfoClient.frontendOpenOrders(buildUserParams(dex)), dex))),
2116
+ measure('spot_clearinghouse_state', () => standaloneInfoClient.spotClearinghouseState({ user: userAddress })),
2117
+ measure('user_abstraction', () => standaloneInfoClient.userAbstraction({ user: userAddress })),
2118
+ ]);
2119
+ const rawOrders = openOrdersByDex.flat();
2120
+ const childOrderIds = collectChildOrderIds(rawOrders);
2121
+ const ordersBySymbol = groupOrdersBySymbol(rawOrders);
2122
+ const positions = clearinghouseStates.flatMap((state) => state.assetPositions
2123
+ .filter(({ position }) => position.szi !== '0')
2124
+ .map((assetPosition) => {
2125
+ const position = adaptPositionFromSDK(assetPosition);
2126
+ const { takeProfitOrders, stopLossOrders, takeProfitPrice, stopLossPrice, } = collectPositionTriggerOrders({
2127
+ orders: ordersBySymbol.get(position.symbol) ?? [],
2128
+ position,
2129
+ childOrderIds,
2130
+ });
2131
+ return {
2132
+ ...position,
2133
+ takeProfitCount: takeProfitOrders.length,
2134
+ stopLossCount: stopLossOrders.length,
2135
+ takeProfitOrders,
2136
+ stopLossOrders,
2137
+ ...(takeProfitPrice && { takeProfitPrice }),
2138
+ ...(stopLossPrice && { stopLossPrice }),
2139
+ };
2140
+ }));
2141
+ const positionsBySymbol = new Map(positions.map((position) => [position.symbol, position]));
2142
+ const orders = rawOrders.map((order) => adaptOrderFromSDK(order, positionsBySymbol.get(order.coin)));
2143
+ const dexAccountStates = clearinghouseStates.map((state) => adaptAccountStateFromSDK(state));
2144
+ const accountState = addSpotBalanceToAccountState(aggregateAccountStates(dexAccountStates), spotState, { foldIntoCollateral: hyperLiquidModeFoldsSpot(abstractionMode) });
2145
+ accountState.subAccountBreakdown = Object.fromEntries(dexAccountStates.map((dexAccountState, index) => {
2146
+ return [
2147
+ dexs[index] ?? '',
2148
+ {
2149
+ spendableBalance: dexAccountState.spendableBalance,
2150
+ withdrawableBalance: dexAccountState.withdrawableBalance,
2151
+ totalBalance: dexAccountState.totalBalance,
2152
+ },
2153
+ ];
2154
+ }));
2155
+ const snapshot = {
2156
+ positions,
2157
+ orders,
2158
+ accountState,
2159
+ identity: {
2160
+ ...identity,
2161
+ address: userAddress,
2162
+ },
2163
+ };
2164
+ __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[PerpsUserSnapshot]', {
2165
+ stage: 'complete',
2166
+ durationMs: Math.round(__classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").performance.now() - snapshotStartedAt),
2167
+ success: true,
2168
+ dexCount: dexs.length,
2169
+ });
2170
+ return snapshot;
2171
+ }
1945
2172
  /**
1946
2173
  * Get current positions with TP/SL prices
1947
2174
  *
@@ -4293,6 +4520,10 @@ export class HyperLiquidProvider {
4293
4520
  // Clear session caches (ensures fresh state on reconnect/account switch)
4294
4521
  __classPrivateFieldGet(this, _HyperLiquidProvider_referralCheckCache, "f").clear();
4295
4522
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").clear();
4523
+ __classPrivateFieldSet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderApprovalEpoch, "f") + 1, "f");
4524
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").clear();
4525
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeResolution, undefined, "f");
4526
+ __classPrivateFieldSet(this, _HyperLiquidProvider_userFeeDiscountBips, undefined, "f");
4296
4527
  // NOTE: UnifiedAccountCache is global and NOT cleared on disconnect
4297
4528
  // to prevent repeated signing requests across reconnections
4298
4529
  __classPrivateFieldGet(this, _HyperLiquidProvider_cachedMetaByDex, "f").clear();
@@ -4473,7 +4704,7 @@ export class HyperLiquidProvider {
4473
4704
  return `${baseUrl}/explorer`;
4474
4705
  }
4475
4706
  }
4476
- _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) {
4707
+ _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) {
4477
4708
  const compiled = [];
4478
4709
  for (const pattern of patterns) {
4479
4710
  try {
@@ -5097,7 +5328,7 @@ async function _HyperLiquidProvider_getOrFetchPrice(params) {
5097
5328
  }
5098
5329
  // Fallback to REST API if cache miss
5099
5330
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('Price cache miss for getOrFetchPrice, falling back to REST allMids', { symbol });
5100
- const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient();
5331
+ const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient({ useHttp: true });
5101
5332
  const mids = await infoClient.allMids(dexName ? { dex: dexName } : undefined);
5102
5333
  const price = parseFloat(mids[symbol] || '0');
5103
5334
  // Validate REST price: must be positive and finite
@@ -5268,8 +5499,16 @@ async function _HyperLiquidProvider_getCachedMeta(params) {
5268
5499
  return cached;
5269
5500
  }
5270
5501
  }
5271
- // Cache miss or skipCache=true - fetch from API
5272
- const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient();
5502
+ // Cache miss or skipCache=true - fetch from API.
5503
+ // Bring the SDK clients up first. This is the first client touch on the
5504
+ // write path — placeOrder resolves asset info before it ensures trading
5505
+ // readiness — so without it a cold start or a post-disconnect action fails
5506
+ // with CLIENT_NOT_INITIALIZED instead of waiting for the clients it needs.
5507
+ // Idempotent, and a warm cache hit returns above without reaching here.
5508
+ await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_ensureClientsInitialized).call(this);
5509
+ // Metadata is request/response data, so keep this path available while a
5510
+ // failed WebSocket reconnect is retrying.
5511
+ const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient({ useHttp: true });
5273
5512
  // Pass dex only for HIP-3 DEXs; omit for main DEX (empty string).
5274
5513
  // Testnet API returns null when dex="" is explicitly sent.
5275
5514
  const meta = await infoClient.meta(dexKey ? { dex: dexKey } : undefined);
@@ -5490,6 +5729,8 @@ async function _HyperLiquidProvider_calculateHip3FeeMultiplier(params) {
5490
5729
  }
5491
5730
  }, _HyperLiquidProvider_getCacheKey = function _HyperLiquidProvider_getCacheKey(network, userAddress) {
5492
5731
  return `${network}:${userAddress.toLowerCase()}`;
5732
+ }, _HyperLiquidProvider_getApprovedBuilderKey = function _HyperLiquidProvider_getApprovedBuilderKey(network, userAddress, builderAddress) {
5733
+ return `${__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getCacheKey).call(this, network, userAddress)}:${builderAddress.toLowerCase()}`;
5493
5734
  }, _HyperLiquidProvider_fetchMarketsForDex =
5494
5735
  /**
5495
5736
  * Fetch markets for a specific DEX with optional filtering
@@ -5817,12 +6058,12 @@ async function _HyperLiquidProvider_queryUserDataAcrossDexs(baseParams, queryFn)
5817
6058
  /**
5818
6059
  * Check current builder fee approval for the user
5819
6060
  *
6061
+ * @param builder - Builder address to query.
6062
+ * @param userAddress - Account whose approval should be queried.
5820
6063
  * @returns Current max fee rate or null if not approved
5821
6064
  */
5822
- async function _HyperLiquidProvider_checkBuilderFeeApproval() {
6065
+ async function _HyperLiquidProvider_checkBuilderFeeApproval(builder, userAddress) {
5823
6066
  const infoClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getInfoClient();
5824
- const userAddress = await __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f").getUserAddressWithDefault();
5825
- const builder = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode());
5826
6067
  return infoClient.maxBuilderFee({
5827
6068
  user: userAddress,
5828
6069
  builder,
@@ -5851,6 +6092,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5851
6092
  if (globalCached?.attempted && globalCached?.success) {
5852
6093
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[ensureBuilderFeeApproval] Using global cache (prevents hardware wallet prompt spam)', { network, success: globalCached.success });
5853
6094
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").set(cacheKey, true);
6095
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress));
5854
6096
  return;
5855
6097
  }
5856
6098
  // Check if another provider instance is currently attempting this operation
@@ -5870,7 +6112,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5870
6112
  completeInFlight();
5871
6113
  return;
5872
6114
  }
5873
- const { isApproved, requiredDecimal } = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeStatus).call(this);
6115
+ const { isApproved, requiredDecimal } = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeStatus).call(this, builderAddress, userAddress);
5874
6116
  if (isApproved) {
5875
6117
  // User already has approval on-chain
5876
6118
  PerpsSigningCache.setBuilderFee(network, userAddress, {
@@ -5878,6 +6120,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5878
6120
  success: true,
5879
6121
  });
5880
6122
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").set(cacheKey, true);
6123
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress));
5881
6124
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[ensureBuilderFeeApproval] Already approved on-chain', { network });
5882
6125
  }
5883
6126
  else {
@@ -5889,7 +6132,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5889
6132
  maxFeeRate,
5890
6133
  });
5891
6134
  // Verify approval was successful before caching
5892
- const afterApprovalDecimal = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this);
6135
+ const afterApprovalDecimal = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
5893
6136
  if (afterApprovalDecimal === null ||
5894
6137
  afterApprovalDecimal < requiredDecimal) {
5895
6138
  throw new Error('[HyperLiquidProvider] Builder fee approval verification failed');
@@ -5900,6 +6143,7 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5900
6143
  success: true,
5901
6144
  });
5902
6145
  __classPrivateFieldGet(this, _HyperLiquidProvider_builderFeeCheckCache, "f").set(cacheKey, true);
6146
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").add(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, builderAddress));
5903
6147
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('[ensureBuilderFeeApproval] Approval successful', {
5904
6148
  builder: builderAddress,
5905
6149
  maxFeeRate,
@@ -5931,10 +6175,12 @@ async function _HyperLiquidProvider_ensureBuilderFeeApproval() {
5931
6175
  /**
5932
6176
  * Check if builder fee is approved for the current user
5933
6177
  *
6178
+ * @param builderAddress - Builder address to query.
6179
+ * @param userAddress - Account whose approval should be queried.
5934
6180
  * @returns Object with approval status and current rate
5935
6181
  */
5936
- async function _HyperLiquidProvider_checkBuilderFeeStatus() {
5937
- const currentApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this);
6182
+ async function _HyperLiquidProvider_checkBuilderFeeStatus(builderAddress, userAddress) {
6183
+ const currentApproval = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_checkBuilderFeeApproval).call(this, builderAddress, userAddress);
5938
6184
  const requiredDecimal = BUILDER_FEE_CONFIG.MaxFeeDecimal;
5939
6185
  return {
5940
6186
  isApproved: currentApproval !== null && currentApproval >= requiredDecimal,
@@ -6488,16 +6734,7 @@ async function _HyperLiquidProvider_handleHip3PreOrder(params) {
6488
6734
  async function _HyperLiquidProvider_submitOrderWithRollback(params) {
6489
6735
  const { orders, grouping, isHip3Order, dexName, transferInfo, symbol } = params;
6490
6736
  const exchangeClient = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getExchangeClient();
6491
- // Calculate discounted builder fee
6492
- let builderFee = BUILDER_FEE_CONFIG.MaxFeeTenthsBps;
6493
- if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") !== undefined) {
6494
- builderFee = Math.floor(builderFee * (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / BASIS_POINTS_DIVISOR));
6495
- __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('Applying builder fee discount', {
6496
- originalFee: BUILDER_FEE_CONFIG.MaxFeeTenthsBps,
6497
- discountBips: __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f"),
6498
- discountedFee: builderFee,
6499
- });
6500
- }
6737
+ const builder = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this);
6501
6738
  __classPrivateFieldGet(this, _HyperLiquidProvider_deps, "f").debugLogger.log('Submitting order via asset ID routing', {
6502
6739
  symbol,
6503
6740
  assetId: orders[0].a,
@@ -6510,10 +6747,7 @@ async function _HyperLiquidProvider_submitOrderWithRollback(params) {
6510
6747
  const result = await exchangeClient.order({
6511
6748
  orders,
6512
6749
  grouping,
6513
- builder: {
6514
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
6515
- f: builderFee,
6516
- },
6750
+ builder,
6517
6751
  });
6518
6752
  if (result.status !== 'ok') {
6519
6753
  throw new Error(`Order failed: ${JSON.stringify(result)}`);
@@ -6831,10 +7065,7 @@ async function _HyperLiquidProvider_placeScaleOrder(params, context) {
6831
7065
  const result = await exchangeClient.order({
6832
7066
  orders,
6833
7067
  grouping: 'na',
6834
- builder: {
6835
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
6836
- f: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getDiscountedBuilderFee).call(this),
6837
- },
7068
+ builder: await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this),
6838
7069
  });
6839
7070
  if (result.status !== 'ok') {
6840
7071
  throw new Error(`Scale order failed: ${JSON.stringify(result)}`);
@@ -6918,8 +7149,8 @@ async function _HyperLiquidProvider_startChaseSession(params, context, generatio
6918
7149
  if (generation !== __classPrivateFieldGet(this, _HyperLiquidProvider_chaseGeneration, "f")) {
6919
7150
  throw new Error(PERPS_ERROR_CODES.ORDER_CHASE_ABANDONED);
6920
7151
  }
6921
- // Read once, while the caller's discount context is still set.
6922
- const builderFee = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getDiscountedBuilderFee).call(this);
7152
+ // Read once, while the caller's fee-source context is still set.
7153
+ const builder = await __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderOrderContext).call(this);
6923
7154
  // Held onto rather than looked up again after the submission returns.
6924
7155
  // `disconnect` drops the service's client reference synchronously, so a
6925
7156
  // retraction that asked for a client after the fact would be refused one
@@ -6932,7 +7163,8 @@ async function _HyperLiquidProvider_startChaseSession(params, context, generatio
6932
7163
  price: quotePrice,
6933
7164
  size: formattedSize,
6934
7165
  reduceOnly: params.reduceOnly ?? false,
6935
- builderFee,
7166
+ builderFee: builder.f,
7167
+ builderAddress: builder.b,
6936
7168
  exchangeClient: placingClient,
6937
7169
  });
6938
7170
  const intervalMs = params.chaseIntervalMs ?? CHASE_ORDER_CONFIG.DefaultIntervalMs;
@@ -6948,7 +7180,8 @@ async function _HyperLiquidProvider_startChaseSession(params, context, generatio
6948
7180
  pendingReplacement: null,
6949
7181
  restingPrice: quotePrice,
6950
7182
  intervalMs,
6951
- builderFee,
7183
+ builderFee: builder.f,
7184
+ builderAddress: builder.b,
6952
7185
  deadline: Date.now() +
6953
7186
  (params.chaseMaxDurationMs ?? CHASE_ORDER_CONFIG.DefaultMaxDurationMs),
6954
7187
  maxRepricings: params.chaseMaxRepricings ?? CHASE_ORDER_CONFIG.DefaultMaxRepricings,
@@ -7054,6 +7287,7 @@ async function _HyperLiquidProvider_getChaseQuotePrice(params) {
7054
7287
  * @param params.reduceOnly - Whether the order may only reduce a position.
7055
7288
  * @param params.builderFee - Builder fee, in tenths of a basis point, captured
7056
7289
  * when the session started so replacements keep the rate they were quoted at.
7290
+ * @param params.builderAddress - Builder address captured with the fee.
7057
7291
  * @param params.exchangeClient - Client to submit through. Passed in rather
7058
7292
  * than looked up here so a first placement can keep the instance it signed
7059
7293
  * with, which is the only one that can take the order back once `disconnect`
@@ -7076,7 +7310,7 @@ async function _HyperLiquidProvider_restChaseOrder(params) {
7076
7310
  ],
7077
7311
  grouping: 'na',
7078
7312
  builder: {
7079
- b: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode()),
7313
+ b: params.builderAddress,
7080
7314
  f: params.builderFee,
7081
7315
  },
7082
7316
  });
@@ -7254,6 +7488,7 @@ async function _HyperLiquidProvider_runChaseTick(sessionId) {
7254
7488
  size: remaining,
7255
7489
  reduceOnly: session.reduceOnly,
7256
7490
  builderFee: session.builderFee,
7491
+ builderAddress: session.builderAddress,
7257
7492
  // A running session is on a live provider, so the current client is
7258
7493
  // the right one; only the first placement has a teardown to survive.
7259
7494
  exchangeClient: __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").getExchangeClient(),
@@ -7627,6 +7862,33 @@ async function _HyperLiquidProvider_cancelChaseOrder(params) {
7627
7862
  }
7628
7863
  return Math.floor(BUILDER_FEE_CONFIG.MaxFeeTenthsBps *
7629
7864
  (1 - __classPrivateFieldGet(this, _HyperLiquidProvider_userFeeDiscountBips, "f") / BASIS_POINTS_DIVISOR));
7865
+ }, _HyperLiquidProvider_getBuilderOrderContext =
7866
+ /**
7867
+ * Resolve the builder payload for the current operation.
7868
+ *
7869
+ * Subscription waivers use their dedicated builder only after approval is
7870
+ * cached for this provider/account session. Until then, the ordinary builder
7871
+ * and standard fee keep the trade attributable and non-blocking.
7872
+ *
7873
+ * @returns HyperLiquid builder address and fee payload.
7874
+ */
7875
+ async function _HyperLiquidProvider_getBuilderOrderContext() {
7876
+ const isTestnet = __classPrivateFieldGet(this, _HyperLiquidProvider_clientService, "f").isTestnetMode();
7877
+ const network = isTestnet ? 'testnet' : 'mainnet';
7878
+ const defaultBuilder = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getBuilderAddress).call(this, isTestnet);
7879
+ if (__classPrivateFieldGet(this, _HyperLiquidProvider_userFeeResolution, "f")?.source === 'subscription') {
7880
+ const subscriptionBuilder = __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getSubscriptionBuilderAddress).call(this, isTestnet);
7881
+ const userAddress = await __classPrivateFieldGet(this, _HyperLiquidProvider_walletService, "f").getUserAddressWithDefault();
7882
+ if (subscriptionBuilder &&
7883
+ __classPrivateFieldGet(this, _HyperLiquidProvider_approvedBuilderAddresses, "f").has(__classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getApprovedBuilderKey).call(this, network, userAddress, subscriptionBuilder))) {
7884
+ return { b: subscriptionBuilder, f: 0 };
7885
+ }
7886
+ return {
7887
+ b: defaultBuilder,
7888
+ f: BUILDER_FEE_CONFIG.MaxFeeTenthsBps,
7889
+ };
7890
+ }
7891
+ return { b: defaultBuilder, f: __classPrivateFieldGet(this, _HyperLiquidProvider_instances, "m", _HyperLiquidProvider_getDiscountedBuilderFee).call(this) };
7630
7892
  }, _HyperLiquidProvider_fetchOpenOrders =
7631
7893
  /**
7632
7894
  * Read the account's currently resting orders.
@@ -7920,6 +8182,10 @@ async function _HyperLiquidProvider_excludeNonUsdcCollateralResults(results) {
7920
8182
  }
7921
8183
  // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
7922
8184
  return __classPrivateFieldGet(this, _HyperLiquidProvider_builderAddressMainnet, "f") || BUILDER_FEE_CONFIG.MainnetBuilder;
8185
+ }, _HyperLiquidProvider_getSubscriptionBuilderAddress = function _HyperLiquidProvider_getSubscriptionBuilderAddress(isTestnet) {
8186
+ return isTestnet
8187
+ ? __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderAddressTestnet, "f")
8188
+ : __classPrivateFieldGet(this, _HyperLiquidProvider_subscriptionBuilderAddressMainnet, "f");
7923
8189
  }, _HyperLiquidProvider_getReferralCode = function _HyperLiquidProvider_getReferralCode(isTestnet) {
7924
8190
  return isTestnet
7925
8191
  ? REFERRAL_CONFIG.TestnetCode