@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.
- package/CHANGELOG.md +30 -1
- package/dist/PerpsController-method-action-types.cjs.map +1 -1
- package/dist/PerpsController-method-action-types.d.cts +36 -1
- package/dist/PerpsController-method-action-types.d.cts.map +1 -1
- package/dist/PerpsController-method-action-types.d.mts +36 -1
- package/dist/PerpsController-method-action-types.d.mts.map +1 -1
- package/dist/PerpsController-method-action-types.mjs.map +1 -1
- package/dist/PerpsController.cjs +600 -119
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts +35 -4
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts +35 -4
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +603 -122
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/constants/eventNames.cjs +3 -0
- package/dist/constants/eventNames.cjs.map +1 -1
- package/dist/constants/eventNames.d.cts +1 -0
- package/dist/constants/eventNames.d.cts.map +1 -1
- package/dist/constants/eventNames.d.mts +1 -0
- package/dist/constants/eventNames.d.mts.map +1 -1
- package/dist/constants/eventNames.mjs +3 -0
- package/dist/constants/eventNames.mjs.map +1 -1
- package/dist/constants/hyperLiquidConfig.cjs +14 -2
- package/dist/constants/hyperLiquidConfig.cjs.map +1 -1
- package/dist/constants/hyperLiquidConfig.d.cts +7 -0
- package/dist/constants/hyperLiquidConfig.d.cts.map +1 -1
- package/dist/constants/hyperLiquidConfig.d.mts +7 -0
- package/dist/constants/hyperLiquidConfig.d.mts.map +1 -1
- package/dist/constants/hyperLiquidConfig.mjs +11 -0
- package/dist/constants/hyperLiquidConfig.mjs.map +1 -1
- package/dist/constants/perpsConfig.cjs +19 -2
- package/dist/constants/perpsConfig.cjs.map +1 -1
- package/dist/constants/perpsConfig.d.cts +39 -7
- package/dist/constants/perpsConfig.d.cts.map +1 -1
- package/dist/constants/perpsConfig.d.mts +39 -7
- package/dist/constants/perpsConfig.d.mts.map +1 -1
- package/dist/constants/perpsConfig.mjs +18 -1
- package/dist/constants/perpsConfig.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.cjs +16 -0
- package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.d.cts +3 -1
- package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.d.mts +3 -1
- package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -1
- package/dist/providers/AggregatedPerpsProvider.mjs +16 -0
- package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.cjs +325 -59
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.cts +27 -1
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.mts +27 -1
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
- package/dist/providers/HyperLiquidProvider.mjs +326 -60
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
- package/dist/services/HyperLiquidClientService.cjs +74 -25
- package/dist/services/HyperLiquidClientService.cjs.map +1 -1
- package/dist/services/HyperLiquidClientService.d.cts.map +1 -1
- package/dist/services/HyperLiquidClientService.d.mts.map +1 -1
- package/dist/services/HyperLiquidClientService.mjs +74 -25
- package/dist/services/HyperLiquidClientService.mjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.cjs +16 -5
- package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.mjs +16 -5
- package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
- package/dist/services/MarketDataService.cjs +49 -5
- package/dist/services/MarketDataService.cjs.map +1 -1
- package/dist/services/MarketDataService.d.cts +2 -2
- package/dist/services/MarketDataService.d.cts.map +1 -1
- package/dist/services/MarketDataService.d.mts +2 -2
- package/dist/services/MarketDataService.d.mts.map +1 -1
- package/dist/services/MarketDataService.mjs +49 -5
- package/dist/services/MarketDataService.mjs.map +1 -1
- package/dist/services/RewardsIntegrationService.cjs +330 -68
- package/dist/services/RewardsIntegrationService.cjs.map +1 -1
- package/dist/services/RewardsIntegrationService.d.cts +61 -5
- package/dist/services/RewardsIntegrationService.d.cts.map +1 -1
- package/dist/services/RewardsIntegrationService.d.mts +61 -5
- package/dist/services/RewardsIntegrationService.d.mts.map +1 -1
- package/dist/services/RewardsIntegrationService.mjs +330 -68
- package/dist/services/RewardsIntegrationService.mjs.map +1 -1
- package/dist/services/ServiceContext.cjs.map +1 -1
- package/dist/services/ServiceContext.d.cts +17 -1
- package/dist/services/ServiceContext.d.cts.map +1 -1
- package/dist/services/ServiceContext.d.mts +17 -1
- package/dist/services/ServiceContext.d.mts.map +1 -1
- package/dist/services/ServiceContext.mjs.map +1 -1
- package/dist/services/TerminalMarketService.cjs +422 -7
- package/dist/services/TerminalMarketService.cjs.map +1 -1
- package/dist/services/TerminalMarketService.d.cts +10 -1
- package/dist/services/TerminalMarketService.d.cts.map +1 -1
- package/dist/services/TerminalMarketService.d.mts +10 -1
- package/dist/services/TerminalMarketService.d.mts.map +1 -1
- package/dist/services/TerminalMarketService.mjs +423 -8
- package/dist/services/TerminalMarketService.mjs.map +1 -1
- package/dist/services/TradingService.cjs +52 -28
- package/dist/services/TradingService.cjs.map +1 -1
- package/dist/services/TradingService.d.cts.map +1 -1
- package/dist/services/TradingService.d.mts.map +1 -1
- package/dist/services/TradingService.mjs +52 -28
- package/dist/services/TradingService.mjs.map +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +156 -7
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.mts +156 -7
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/utils/marketUtils.cjs +16 -1
- package/dist/utils/marketUtils.cjs.map +1 -1
- package/dist/utils/marketUtils.d.cts +1 -0
- package/dist/utils/marketUtils.d.cts.map +1 -1
- package/dist/utils/marketUtils.d.mts +1 -0
- package/dist/utils/marketUtils.d.mts.map +1 -1
- package/dist/utils/marketUtils.mjs +14 -0
- package/dist/utils/marketUtils.mjs.map +1 -1
- package/dist/utils/perpsDiskPersistence.cjs +19 -12
- package/dist/utils/perpsDiskPersistence.cjs.map +1 -1
- package/dist/utils/perpsDiskPersistence.d.cts +5 -1
- package/dist/utils/perpsDiskPersistence.d.cts.map +1 -1
- package/dist/utils/perpsDiskPersistence.d.mts +5 -1
- package/dist/utils/perpsDiskPersistence.d.mts.map +1 -1
- package/dist/utils/perpsDiskPersistence.mjs +19 -12
- package/dist/utils/perpsDiskPersistence.mjs.map +1 -1
- 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")
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
6922
|
-
const
|
|
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:
|
|
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
|