@metamask-previews/perps-controller 0.0.0-preview-ae46ab603 → 0.0.0-preview-e4aa1532
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 +11 -1
- package/dist/PerpsController.cjs +2224 -66
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts +933 -79
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts +933 -79
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +2221 -64
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/__mocks__/hyperliquidMock.cjs +68 -0
- package/dist/__mocks__/hyperliquidMock.cjs.map +1 -0
- package/dist/__mocks__/hyperliquidMock.d.cts +15 -0
- package/dist/__mocks__/hyperliquidMock.d.cts.map +1 -0
- package/dist/__mocks__/hyperliquidMock.d.mts +15 -0
- package/dist/__mocks__/hyperliquidMock.d.mts.map +1 -0
- package/dist/__mocks__/hyperliquidMock.mjs +65 -0
- package/dist/__mocks__/hyperliquidMock.mjs.map +1 -0
- package/dist/__mocks__/providerMocks.cjs +144 -0
- package/dist/__mocks__/providerMocks.cjs.map +1 -0
- package/dist/__mocks__/providerMocks.d.cts +44 -0
- package/dist/__mocks__/providerMocks.d.cts.map +1 -0
- package/dist/__mocks__/providerMocks.d.mts +44 -0
- package/dist/__mocks__/providerMocks.d.mts.map +1 -0
- package/dist/__mocks__/providerMocks.mjs +136 -0
- package/dist/__mocks__/providerMocks.mjs.map +1 -0
- package/dist/__mocks__/serviceMocks.cjs +187 -0
- package/dist/__mocks__/serviceMocks.cjs.map +1 -0
- package/dist/__mocks__/serviceMocks.d.cts +58 -0
- package/dist/__mocks__/serviceMocks.d.cts.map +1 -0
- package/dist/__mocks__/serviceMocks.d.mts +58 -0
- package/dist/__mocks__/serviceMocks.d.mts.map +1 -0
- package/dist/__mocks__/serviceMocks.mjs +180 -0
- package/dist/__mocks__/serviceMocks.mjs.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.cjs +459 -0
- package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.cts +222 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.mts +222 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.mjs +455 -0
- package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -0
- package/dist/aggregation/index.cjs +9 -0
- package/dist/aggregation/index.cjs.map +1 -0
- package/dist/aggregation/index.d.cts +6 -0
- package/dist/aggregation/index.d.cts.map +1 -0
- package/dist/aggregation/index.d.mts +6 -0
- package/dist/aggregation/index.d.mts.map +1 -0
- package/dist/aggregation/index.mjs +5 -0
- package/dist/aggregation/index.mjs.map +1 -0
- package/dist/constants/eventNames.cjs +117 -0
- package/dist/constants/eventNames.cjs.map +1 -0
- package/dist/constants/eventNames.d.cts +106 -0
- package/dist/constants/eventNames.d.cts.map +1 -0
- package/dist/constants/eventNames.d.mts +106 -0
- package/dist/constants/eventNames.d.mts.map +1 -0
- package/dist/constants/eventNames.mjs +114 -0
- package/dist/constants/eventNames.mjs.map +1 -0
- package/dist/constants/hyperLiquidConfig.cjs +366 -0
- package/dist/constants/hyperLiquidConfig.cjs.map +1 -0
- package/dist/constants/hyperLiquidConfig.d.cts +276 -0
- package/dist/constants/hyperLiquidConfig.d.cts.map +1 -0
- package/dist/constants/hyperLiquidConfig.d.mts +276 -0
- package/dist/constants/hyperLiquidConfig.d.mts.map +1 -0
- package/dist/constants/hyperLiquidConfig.mjs +357 -0
- package/dist/constants/hyperLiquidConfig.mjs.map +1 -0
- package/dist/constants/index.cjs +23 -0
- package/dist/constants/index.cjs.map +1 -0
- package/dist/constants/index.d.cts +7 -0
- package/dist/constants/index.d.cts.map +1 -0
- package/dist/constants/index.d.mts +7 -0
- package/dist/constants/index.d.mts.map +1 -0
- package/dist/constants/index.mjs +7 -0
- package/dist/constants/index.mjs.map +1 -0
- package/dist/constants/orderTypes.cjs +31 -0
- package/dist/constants/orderTypes.cjs.map +1 -0
- package/dist/constants/orderTypes.d.cts +19 -0
- package/dist/constants/orderTypes.d.cts.map +1 -0
- package/dist/constants/orderTypes.d.mts +19 -0
- package/dist/constants/orderTypes.d.mts.map +1 -0
- package/dist/constants/orderTypes.mjs +27 -0
- package/dist/constants/orderTypes.mjs.map +1 -0
- package/dist/constants/performanceMetrics.cjs +61 -0
- package/dist/constants/performanceMetrics.cjs.map +1 -0
- package/dist/constants/performanceMetrics.d.cts +44 -0
- package/dist/constants/performanceMetrics.d.cts.map +1 -0
- package/dist/constants/performanceMetrics.d.mts +44 -0
- package/dist/constants/performanceMetrics.d.mts.map +1 -0
- package/dist/constants/performanceMetrics.mjs +58 -0
- package/dist/constants/performanceMetrics.mjs.map +1 -0
- package/dist/constants/perpsConfig.cjs +461 -0
- package/dist/constants/perpsConfig.cjs.map +1 -0
- package/dist/constants/perpsConfig.d.cts +343 -0
- package/dist/constants/perpsConfig.d.cts.map +1 -0
- package/dist/constants/perpsConfig.d.mts +343 -0
- package/dist/constants/perpsConfig.d.mts.map +1 -0
- package/dist/constants/perpsConfig.mjs +458 -0
- package/dist/constants/perpsConfig.mjs.map +1 -0
- package/dist/constants/perpsErrorCodes.cjs +79 -0
- package/dist/constants/perpsErrorCodes.cjs.map +1 -0
- package/dist/constants/perpsErrorCodes.d.cts +64 -0
- package/dist/constants/perpsErrorCodes.d.cts.map +1 -0
- package/dist/constants/perpsErrorCodes.d.mts +64 -0
- package/dist/constants/perpsErrorCodes.d.mts.map +1 -0
- package/dist/constants/perpsErrorCodes.mjs +76 -0
- package/dist/constants/perpsErrorCodes.mjs.map +1 -0
- package/dist/index.cjs +32 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +6 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +9 -1
- package/dist/index.mjs.map +1 -1
- package/dist/platform-services/HyperLiquidClientService.cjs +857 -0
- package/dist/platform-services/HyperLiquidClientService.cjs.map +1 -0
- package/dist/platform-services/HyperLiquidClientService.d.cts +263 -0
- package/dist/platform-services/HyperLiquidClientService.d.cts.map +1 -0
- package/dist/platform-services/HyperLiquidClientService.d.mts +263 -0
- package/dist/platform-services/HyperLiquidClientService.d.mts.map +1 -0
- package/dist/platform-services/HyperLiquidClientService.mjs +853 -0
- package/dist/platform-services/HyperLiquidClientService.mjs.map +1 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.cjs +2170 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.cjs.map +1 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.d.cts +424 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.d.cts.map +1 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.d.mts +424 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.d.mts.map +1 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.mjs +2166 -0
- package/dist/platform-services/HyperLiquidSubscriptionService.mjs.map +1 -0
- package/dist/platform-services/HyperLiquidWalletService.cjs +140 -0
- package/dist/platform-services/HyperLiquidWalletService.cjs.map +1 -0
- package/dist/platform-services/HyperLiquidWalletService.d.cts +78 -0
- package/dist/platform-services/HyperLiquidWalletService.d.cts.map +1 -0
- package/dist/platform-services/HyperLiquidWalletService.d.mts +78 -0
- package/dist/platform-services/HyperLiquidWalletService.d.mts.map +1 -0
- package/dist/platform-services/HyperLiquidWalletService.mjs +136 -0
- package/dist/platform-services/HyperLiquidWalletService.mjs.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.cjs +777 -0
- package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.d.cts +466 -0
- package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.d.mts +466 -0
- package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.mjs +773 -0
- package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -0
- package/dist/providers/HyperLiquidProvider.cjs +5172 -0
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -0
- package/dist/providers/HyperLiquidProvider.d.cts +881 -0
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -0
- package/dist/providers/HyperLiquidProvider.d.mts +881 -0
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -0
- package/dist/providers/HyperLiquidProvider.mjs +5168 -0
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -0
- package/dist/providers/index.cjs +11 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +6 -0
- package/dist/providers/index.d.cts.map +1 -0
- package/dist/providers/index.d.mts +6 -0
- package/dist/providers/index.d.mts.map +1 -0
- package/dist/providers/index.mjs +6 -0
- package/dist/providers/index.mjs.map +1 -0
- package/dist/routing/ProviderRouter.cjs +148 -0
- package/dist/routing/ProviderRouter.cjs.map +1 -0
- package/dist/routing/ProviderRouter.d.cts +124 -0
- package/dist/routing/ProviderRouter.d.cts.map +1 -0
- package/dist/routing/ProviderRouter.d.mts +124 -0
- package/dist/routing/ProviderRouter.d.mts.map +1 -0
- package/dist/routing/ProviderRouter.mjs +144 -0
- package/dist/routing/ProviderRouter.mjs.map +1 -0
- package/dist/routing/index.cjs +9 -0
- package/dist/routing/index.cjs.map +1 -0
- package/dist/routing/index.d.cts +6 -0
- package/dist/routing/index.d.cts.map +1 -0
- package/dist/routing/index.d.mts +6 -0
- package/dist/routing/index.d.mts.map +1 -0
- package/dist/routing/index.mjs +5 -0
- package/dist/routing/index.mjs.map +1 -0
- package/dist/selectors.cjs +161 -0
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +345 -0
- package/dist/selectors.d.cts.map +1 -0
- package/dist/selectors.d.mts +345 -0
- package/dist/selectors.d.mts.map +1 -0
- package/dist/selectors.mjs +153 -0
- package/dist/selectors.mjs.map +1 -0
- package/dist/services/AccountService.cjs +313 -0
- package/dist/services/AccountService.cjs.map +1 -0
- package/dist/services/AccountService.d.cts +53 -0
- package/dist/services/AccountService.d.cts.map +1 -0
- package/dist/services/AccountService.d.mts +53 -0
- package/dist/services/AccountService.d.mts.map +1 -0
- package/dist/services/AccountService.mjs +309 -0
- package/dist/services/AccountService.mjs.map +1 -0
- package/dist/services/DataLakeService.cjs +219 -0
- package/dist/services/DataLakeService.cjs.map +1 -0
- package/dist/services/DataLakeService.d.cts +49 -0
- package/dist/services/DataLakeService.d.cts.map +1 -0
- package/dist/services/DataLakeService.d.mts +49 -0
- package/dist/services/DataLakeService.d.mts.map +1 -0
- package/dist/services/DataLakeService.mjs +215 -0
- package/dist/services/DataLakeService.mjs.map +1 -0
- package/dist/services/DepositService.cjs +96 -0
- package/dist/services/DepositService.cjs.map +1 -0
- package/dist/services/DepositService.d.cts +37 -0
- package/dist/services/DepositService.d.cts.map +1 -0
- package/dist/services/DepositService.d.mts +37 -0
- package/dist/services/DepositService.d.mts.map +1 -0
- package/dist/services/DepositService.mjs +92 -0
- package/dist/services/DepositService.mjs.map +1 -0
- package/dist/services/EligibilityService.cjs +156 -0
- package/dist/services/EligibilityService.cjs.map +1 -0
- package/dist/services/EligibilityService.d.cts +48 -0
- package/dist/services/EligibilityService.d.cts.map +1 -0
- package/dist/services/EligibilityService.d.mts +48 -0
- package/dist/services/EligibilityService.d.mts.map +1 -0
- package/dist/services/EligibilityService.mjs +152 -0
- package/dist/services/EligibilityService.mjs.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.cjs +258 -0
- package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.d.cts +100 -0
- package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.d.mts +100 -0
- package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.mjs +254 -0
- package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -0
- package/dist/services/MarketDataService.cjs +875 -0
- package/dist/services/MarketDataService.cjs.map +1 -0
- package/dist/services/MarketDataService.d.cts +289 -0
- package/dist/services/MarketDataService.d.cts.map +1 -0
- package/dist/services/MarketDataService.d.mts +289 -0
- package/dist/services/MarketDataService.d.mts.map +1 -0
- package/dist/services/MarketDataService.mjs +871 -0
- package/dist/services/MarketDataService.mjs.map +1 -0
- package/dist/services/RewardsIntegrationService.cjs +94 -0
- package/dist/services/RewardsIntegrationService.cjs.map +1 -0
- package/dist/services/RewardsIntegrationService.d.cts +30 -0
- package/dist/services/RewardsIntegrationService.d.cts.map +1 -0
- package/dist/services/RewardsIntegrationService.d.mts +30 -0
- package/dist/services/RewardsIntegrationService.d.mts.map +1 -0
- package/dist/services/RewardsIntegrationService.mjs +90 -0
- package/dist/services/RewardsIntegrationService.mjs.map +1 -0
- package/dist/services/ServiceContext.cjs +3 -0
- package/dist/services/ServiceContext.cjs.map +1 -0
- package/dist/services/ServiceContext.d.cts +110 -0
- package/dist/services/ServiceContext.d.cts.map +1 -0
- package/dist/services/ServiceContext.d.mts +110 -0
- package/dist/services/ServiceContext.d.mts.map +1 -0
- package/dist/services/ServiceContext.mjs +2 -0
- package/dist/services/ServiceContext.mjs.map +1 -0
- package/dist/services/TradingService.cjs +1481 -0
- package/dist/services/TradingService.cjs.map +1 -0
- package/dist/services/TradingService.d.cts +308 -0
- package/dist/services/TradingService.d.cts.map +1 -0
- package/dist/services/TradingService.d.mts +308 -0
- package/dist/services/TradingService.d.mts.map +1 -0
- package/dist/services/TradingService.mjs +1477 -0
- package/dist/services/TradingService.mjs.map +1 -0
- package/dist/services/index.cjs +26 -0
- package/dist/services/index.cjs.map +1 -0
- package/dist/services/index.d.cts +11 -0
- package/dist/services/index.d.cts.map +1 -0
- package/dist/services/index.d.mts +11 -0
- package/dist/services/index.d.mts.map +1 -0
- package/dist/services/index.mjs +10 -0
- package/dist/services/index.mjs.map +1 -0
- package/dist/services/utils.cjs +16 -0
- package/dist/services/utils.cjs.map +1 -0
- package/dist/services/utils.d.cts +8 -0
- package/dist/services/utils.d.cts.map +1 -0
- package/dist/services/utils.d.mts +8 -0
- package/dist/services/utils.d.mts.map +1 -0
- package/dist/services/utils.mjs +12 -0
- package/dist/services/utils.mjs.map +1 -0
- package/dist/types/chart.cjs +42 -0
- package/dist/types/chart.cjs.map +1 -0
- package/dist/types/chart.d.cts +62 -0
- package/dist/types/chart.d.cts.map +1 -0
- package/dist/types/chart.d.mts +62 -0
- package/dist/types/chart.d.mts.map +1 -0
- package/dist/types/chart.mjs +39 -0
- package/dist/types/chart.mjs.map +1 -0
- package/dist/types/hyperliquid-types.cjs +3 -0
- package/dist/types/hyperliquid-types.cjs.map +1 -0
- package/dist/types/hyperliquid-types.d.cts +52 -0
- package/dist/types/hyperliquid-types.d.cts.map +1 -0
- package/dist/types/hyperliquid-types.d.mts +52 -0
- package/dist/types/hyperliquid-types.d.mts.map +1 -0
- package/dist/types/hyperliquid-types.mjs +2 -0
- package/dist/types/hyperliquid-types.mjs.map +1 -0
- package/dist/types/index.cjs +96 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +1153 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.mts +1153 -0
- package/dist/types/index.d.mts.map +1 -0
- package/dist/types/index.mjs +79 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types/transactionTypes.cjs +28 -0
- package/dist/types/transactionTypes.cjs.map +1 -0
- package/dist/types/transactionTypes.d.cts +64 -0
- package/dist/types/transactionTypes.d.cts.map +1 -0
- package/dist/types/transactionTypes.d.mts +64 -0
- package/dist/types/transactionTypes.d.mts.map +1 -0
- package/dist/types/transactionTypes.mjs +23 -0
- package/dist/types/transactionTypes.mjs.map +1 -0
- package/dist/utils/accountUtils.cjs +65 -0
- package/dist/utils/accountUtils.cjs.map +1 -0
- package/dist/utils/accountUtils.d.cts +26 -0
- package/dist/utils/accountUtils.d.cts.map +1 -0
- package/dist/utils/accountUtils.d.mts +26 -0
- package/dist/utils/accountUtils.d.mts.map +1 -0
- package/dist/utils/accountUtils.mjs +61 -0
- package/dist/utils/accountUtils.mjs.map +1 -0
- package/dist/utils/amountConversion.cjs +61 -0
- package/dist/utils/amountConversion.cjs.map +1 -0
- package/dist/utils/amountConversion.d.cts +16 -0
- package/dist/utils/amountConversion.d.cts.map +1 -0
- package/dist/utils/amountConversion.d.mts +16 -0
- package/dist/utils/amountConversion.d.mts.map +1 -0
- package/dist/utils/amountConversion.mjs +54 -0
- package/dist/utils/amountConversion.mjs.map +1 -0
- package/dist/utils/chartUtils.cjs +98 -0
- package/dist/utils/chartUtils.cjs.map +1 -0
- package/dist/utils/chartUtils.d.cts +14 -0
- package/dist/utils/chartUtils.d.cts.map +1 -0
- package/dist/utils/chartUtils.d.mts +14 -0
- package/dist/utils/chartUtils.d.mts.map +1 -0
- package/dist/utils/chartUtils.mjs +94 -0
- package/dist/utils/chartUtils.mjs.map +1 -0
- package/dist/utils/errorUtils.cjs +22 -0
- package/dist/utils/errorUtils.cjs.map +1 -0
- package/dist/utils/errorUtils.d.cts +13 -0
- package/dist/utils/errorUtils.d.cts.map +1 -0
- package/dist/utils/errorUtils.d.mts +13 -0
- package/dist/utils/errorUtils.d.mts.map +1 -0
- package/dist/utils/errorUtils.mjs +18 -0
- package/dist/utils/errorUtils.mjs.map +1 -0
- package/dist/utils/formatUtils.cjs +987 -0
- package/dist/utils/formatUtils.cjs.map +1 -0
- package/dist/utils/formatUtils.d.cts +387 -0
- package/dist/utils/formatUtils.d.cts.map +1 -0
- package/dist/utils/formatUtils.d.mts +387 -0
- package/dist/utils/formatUtils.d.mts.map +1 -0
- package/dist/utils/formatUtils.mjs +966 -0
- package/dist/utils/formatUtils.mjs.map +1 -0
- package/dist/utils/hyperLiquidAdapter.cjs +454 -0
- package/dist/utils/hyperLiquidAdapter.cjs.map +1 -0
- package/dist/utils/hyperLiquidAdapter.d.cts +158 -0
- package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -0
- package/dist/utils/hyperLiquidAdapter.d.mts +158 -0
- package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -0
- package/dist/utils/hyperLiquidAdapter.mjs +439 -0
- package/dist/utils/hyperLiquidAdapter.mjs.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs +89 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +58 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +58 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.mjs +84 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +1 -0
- package/dist/utils/hyperLiquidValidation.cjs +426 -0
- package/dist/utils/hyperLiquidValidation.cjs.map +1 -0
- package/dist/utils/hyperLiquidValidation.d.cts +143 -0
- package/dist/utils/hyperLiquidValidation.d.cts.map +1 -0
- package/dist/utils/hyperLiquidValidation.d.mts +143 -0
- package/dist/utils/hyperLiquidValidation.d.mts.map +1 -0
- package/dist/utils/hyperLiquidValidation.mjs +413 -0
- package/dist/utils/hyperLiquidValidation.mjs.map +1 -0
- package/dist/utils/idUtils.cjs +50 -0
- package/dist/utils/idUtils.cjs.map +1 -0
- package/dist/utils/idUtils.d.cts +38 -0
- package/dist/utils/idUtils.d.cts.map +1 -0
- package/dist/utils/idUtils.d.mts +38 -0
- package/dist/utils/idUtils.d.mts.map +1 -0
- package/dist/utils/idUtils.mjs +42 -0
- package/dist/utils/idUtils.mjs.map +1 -0
- package/dist/utils/marginUtils.cjs +137 -0
- package/dist/utils/marginUtils.cjs.map +1 -0
- package/dist/utils/marginUtils.d.cts +64 -0
- package/dist/utils/marginUtils.d.cts.map +1 -0
- package/dist/utils/marginUtils.d.mts +64 -0
- package/dist/utils/marginUtils.d.mts.map +1 -0
- package/dist/utils/marginUtils.mjs +131 -0
- package/dist/utils/marginUtils.mjs.map +1 -0
- package/dist/utils/marketDataTransform.cjs +227 -0
- package/dist/utils/marketDataTransform.cjs.map +1 -0
- package/dist/utils/marketDataTransform.d.cts +45 -0
- package/dist/utils/marketDataTransform.d.cts.map +1 -0
- package/dist/utils/marketDataTransform.d.mts +45 -0
- package/dist/utils/marketDataTransform.d.mts.map +1 -0
- package/dist/utils/marketDataTransform.mjs +220 -0
- package/dist/utils/marketDataTransform.mjs.map +1 -0
- package/dist/utils/marketUtils.cjs +420 -0
- package/dist/utils/marketUtils.cjs.map +1 -0
- package/dist/utils/marketUtils.d.cts +227 -0
- package/dist/utils/marketUtils.d.cts.map +1 -0
- package/dist/utils/marketUtils.d.mts +227 -0
- package/dist/utils/marketUtils.d.mts.map +1 -0
- package/dist/utils/marketUtils.mjs +404 -0
- package/dist/utils/marketUtils.mjs.map +1 -0
- package/dist/utils/orderBookGrouping.cjs +151 -0
- package/dist/utils/orderBookGrouping.cjs.map +1 -0
- package/dist/utils/orderBookGrouping.d.cts +76 -0
- package/dist/utils/orderBookGrouping.d.cts.map +1 -0
- package/dist/utils/orderBookGrouping.d.mts +76 -0
- package/dist/utils/orderBookGrouping.d.mts.map +1 -0
- package/dist/utils/orderBookGrouping.mjs +143 -0
- package/dist/utils/orderBookGrouping.mjs.map +1 -0
- package/dist/utils/orderCalculations.cjs +283 -0
- package/dist/utils/orderCalculations.cjs.map +1 -0
- package/dist/utils/orderCalculations.d.cts +107 -0
- package/dist/utils/orderCalculations.d.cts.map +1 -0
- package/dist/utils/orderCalculations.d.mts +107 -0
- package/dist/utils/orderCalculations.d.mts.map +1 -0
- package/dist/utils/orderCalculations.mjs +274 -0
- package/dist/utils/orderCalculations.mjs.map +1 -0
- package/dist/utils/orderUtils.cjs +159 -0
- package/dist/utils/orderUtils.cjs.map +1 -0
- package/dist/utils/orderUtils.d.cts +66 -0
- package/dist/utils/orderUtils.d.cts.map +1 -0
- package/dist/utils/orderUtils.d.mts +66 -0
- package/dist/utils/orderUtils.d.mts.map +1 -0
- package/dist/utils/orderUtils.mjs +151 -0
- package/dist/utils/orderUtils.mjs.map +1 -0
- package/dist/utils/pnlCalculations.cjs +107 -0
- package/dist/utils/pnlCalculations.cjs.map +1 -0
- package/dist/utils/pnlCalculations.d.cts +79 -0
- package/dist/utils/pnlCalculations.d.cts.map +1 -0
- package/dist/utils/pnlCalculations.d.mts +79 -0
- package/dist/utils/pnlCalculations.d.mts.map +1 -0
- package/dist/utils/pnlCalculations.mjs +97 -0
- package/dist/utils/pnlCalculations.mjs.map +1 -0
- package/dist/utils/positionCalculations.cjs +176 -0
- package/dist/utils/positionCalculations.cjs.map +1 -0
- package/dist/utils/positionCalculations.d.cts +85 -0
- package/dist/utils/positionCalculations.d.cts.map +1 -0
- package/dist/utils/positionCalculations.d.mts +85 -0
- package/dist/utils/positionCalculations.d.mts.map +1 -0
- package/dist/utils/positionCalculations.mjs +165 -0
- package/dist/utils/positionCalculations.mjs.map +1 -0
- package/dist/utils/sortMarkets.cjs +88 -0
- package/dist/utils/sortMarkets.cjs.map +1 -0
- package/dist/utils/sortMarkets.d.cts +21 -0
- package/dist/utils/sortMarkets.d.cts.map +1 -0
- package/dist/utils/sortMarkets.d.mts +21 -0
- package/dist/utils/sortMarkets.d.mts.map +1 -0
- package/dist/utils/sortMarkets.mjs +84 -0
- package/dist/utils/sortMarkets.mjs.map +1 -0
- package/dist/utils/standaloneInfoClient.cjs +34 -0
- package/dist/utils/standaloneInfoClient.cjs.map +1 -0
- package/dist/utils/standaloneInfoClient.d.cts +31 -0
- package/dist/utils/standaloneInfoClient.d.cts.map +1 -0
- package/dist/utils/standaloneInfoClient.d.mts +31 -0
- package/dist/utils/standaloneInfoClient.d.mts.map +1 -0
- package/dist/utils/standaloneInfoClient.mjs +30 -0
- package/dist/utils/standaloneInfoClient.mjs.map +1 -0
- package/dist/utils/stringParseUtils.cjs +49 -0
- package/dist/utils/stringParseUtils.cjs.map +1 -0
- package/dist/utils/stringParseUtils.d.cts +35 -0
- package/dist/utils/stringParseUtils.d.cts.map +1 -0
- package/dist/utils/stringParseUtils.d.mts +35 -0
- package/dist/utils/stringParseUtils.d.mts.map +1 -0
- package/dist/utils/stringParseUtils.mjs +44 -0
- package/dist/utils/stringParseUtils.mjs.map +1 -0
- package/dist/utils/time.cjs +37 -0
- package/dist/utils/time.cjs.map +1 -0
- package/dist/utils/time.d.cts +17 -0
- package/dist/utils/time.d.cts.map +1 -0
- package/dist/utils/time.d.mts +17 -0
- package/dist/utils/time.d.mts.map +1 -0
- package/dist/utils/time.mjs +33 -0
- package/dist/utils/time.mjs.map +1 -0
- package/dist/utils/tpslValidation.cjs +505 -0
- package/dist/utils/tpslValidation.cjs.map +1 -0
- package/dist/utils/tpslValidation.d.cts +182 -0
- package/dist/utils/tpslValidation.d.cts.map +1 -0
- package/dist/utils/tpslValidation.d.mts +182 -0
- package/dist/utils/tpslValidation.d.mts.map +1 -0
- package/dist/utils/tpslValidation.mjs +482 -0
- package/dist/utils/tpslValidation.mjs.map +1 -0
- package/dist/utils/transactionUtils.cjs +36 -0
- package/dist/utils/transactionUtils.cjs.map +1 -0
- package/dist/utils/transactionUtils.d.cts +17 -0
- package/dist/utils/transactionUtils.d.cts.map +1 -0
- package/dist/utils/transactionUtils.d.mts +17 -0
- package/dist/utils/transactionUtils.d.mts.map +1 -0
- package/dist/utils/transactionUtils.mjs +32 -0
- package/dist/utils/transactionUtils.mjs.map +1 -0
- package/dist/utils/wait.cjs +12 -0
- package/dist/utils/wait.cjs.map +1 -0
- package/dist/utils/wait.d.cts +8 -0
- package/dist/utils/wait.d.cts.map +1 -0
- package/dist/utils/wait.d.mts +8 -0
- package/dist/utils/wait.d.mts.map +1 -0
- package/dist/utils/wait.mjs +8 -0
- package/dist/utils/wait.mjs.map +1 -0
- package/package.json +19 -4
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatPercentage = exports.formatChange = exports.transformMarketData = exports.calculateOpenInterestUSD = void 0;
|
|
4
|
+
const formatUtils_1 = require("./formatUtils.cjs");
|
|
5
|
+
const hyperLiquidAdapter_1 = require("./hyperLiquidAdapter.cjs");
|
|
6
|
+
const hyperLiquidConfig_1 = require("../constants/hyperLiquidConfig.cjs");
|
|
7
|
+
const perpsConfig_1 = require("../constants/perpsConfig.cjs");
|
|
8
|
+
/**
|
|
9
|
+
* Creates an Intl.NumberFormat formatter
|
|
10
|
+
*
|
|
11
|
+
* @param locale - The locale for formatting
|
|
12
|
+
* @param options - NumberFormat options
|
|
13
|
+
* @returns Formatted number formatter
|
|
14
|
+
*/
|
|
15
|
+
const getIntlNumberFormatter = (locale, options) => {
|
|
16
|
+
return new Intl.NumberFormat(locale, options);
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Calculate open interest in USD
|
|
20
|
+
* Open interest from HyperLiquid is in contracts/units, not USD
|
|
21
|
+
* To get USD value, multiply by current price
|
|
22
|
+
*
|
|
23
|
+
* @param openInterest - Raw open interest value in contracts/units
|
|
24
|
+
* @param currentPrice - Current price of the asset
|
|
25
|
+
* @returns Open interest in USD, or NaN if invalid
|
|
26
|
+
*/
|
|
27
|
+
function calculateOpenInterestUSD(openInterest, currentPrice) {
|
|
28
|
+
if (openInterest === null ||
|
|
29
|
+
openInterest === undefined ||
|
|
30
|
+
currentPrice === null ||
|
|
31
|
+
currentPrice === undefined) {
|
|
32
|
+
return NaN;
|
|
33
|
+
}
|
|
34
|
+
const openInterestNum = typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;
|
|
35
|
+
const priceNum = typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;
|
|
36
|
+
if (isNaN(openInterestNum) || isNaN(priceNum)) {
|
|
37
|
+
return NaN;
|
|
38
|
+
}
|
|
39
|
+
return openInterestNum * priceNum;
|
|
40
|
+
}
|
|
41
|
+
exports.calculateOpenInterestUSD = calculateOpenInterestUSD;
|
|
42
|
+
/**
|
|
43
|
+
* Calculate 24h percentage change.
|
|
44
|
+
* Shows -100% when current price is missing but previous price exists.
|
|
45
|
+
*
|
|
46
|
+
* @param params - Parameters for calculating 24h percentage change
|
|
47
|
+
* @returns The 24h percentage change value
|
|
48
|
+
*/
|
|
49
|
+
function calculateChange24hPercent(params) {
|
|
50
|
+
const { hasCurrentPrice, currentPrice, prevDayPrice } = params;
|
|
51
|
+
if (!hasCurrentPrice) {
|
|
52
|
+
return prevDayPrice > 0 ? -100 : 0;
|
|
53
|
+
}
|
|
54
|
+
if (prevDayPrice <= 0) {
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extract funding data for a symbol from predicted fundings.
|
|
61
|
+
* Looks for specified exchange first, falls back to first available.
|
|
62
|
+
*
|
|
63
|
+
* @param params - Parameters for extracting funding data
|
|
64
|
+
* @param params.predictedFundings - Array of predicted funding data
|
|
65
|
+
* @param params.symbol - Asset symbol to extract funding for
|
|
66
|
+
* @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')
|
|
67
|
+
* @returns Funding data including next funding time, interval, and predicted rate
|
|
68
|
+
*/
|
|
69
|
+
function extractFundingData(params) {
|
|
70
|
+
const { predictedFundings, symbol, exchangeName = hyperLiquidConfig_1.HYPERLIQUID_CONFIG.ExchangeName, } = params;
|
|
71
|
+
const result = {};
|
|
72
|
+
if (!predictedFundings) {
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
const fundingData = predictedFundings.find(([assetSymbol]) => assetSymbol === symbol);
|
|
76
|
+
if (!fundingData?.[1] ||
|
|
77
|
+
!Array.isArray(fundingData[1]) ||
|
|
78
|
+
fundingData[1].length === 0) {
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
// Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)
|
|
82
|
+
const targetExchange = fundingData[1].find((exchange) => Array.isArray(exchange) && exchange[0] === exchangeName);
|
|
83
|
+
if (targetExchange?.[1]) {
|
|
84
|
+
result.nextFundingTime = targetExchange[1].nextFundingTime;
|
|
85
|
+
result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;
|
|
86
|
+
result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
// Fallback to first exchange if target not found
|
|
90
|
+
const firstExchange = fundingData[1][0];
|
|
91
|
+
if (Array.isArray(firstExchange) && firstExchange[1]) {
|
|
92
|
+
result.nextFundingTime = firstExchange[1].nextFundingTime;
|
|
93
|
+
result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Transform raw HyperLiquid market data to UI-friendly format
|
|
99
|
+
*
|
|
100
|
+
* @param hyperLiquidData - Raw data from HyperLiquid API
|
|
101
|
+
* @param assetMarketTypes - Optional mapping of asset symbols to market types
|
|
102
|
+
* @returns Transformed market data ready for UI consumption
|
|
103
|
+
*/
|
|
104
|
+
function transformMarketData(hyperLiquidData, assetMarketTypes) {
|
|
105
|
+
const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;
|
|
106
|
+
return universe.map((asset, index) => {
|
|
107
|
+
const symbol = asset.name;
|
|
108
|
+
const currentPrice = parseFloat(allMids[symbol]);
|
|
109
|
+
// Find matching asset context for additional data
|
|
110
|
+
// The assetCtxs array is aligned with universe array by index
|
|
111
|
+
const assetCtx = assetCtxs[index];
|
|
112
|
+
// Calculate 24h change
|
|
113
|
+
const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;
|
|
114
|
+
// Handle missing current price data
|
|
115
|
+
const hasCurrentPrice = !isNaN(currentPrice);
|
|
116
|
+
const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;
|
|
117
|
+
// For dollar change: show $0.00 when current price is missing
|
|
118
|
+
const change24h = hasCurrentPrice
|
|
119
|
+
? effectiveCurrentPrice - prevDayPrice
|
|
120
|
+
: 0;
|
|
121
|
+
// For percentage: show -100% when current price is missing but previous price exists
|
|
122
|
+
const change24hPercent = calculateChange24hPercent({
|
|
123
|
+
hasCurrentPrice,
|
|
124
|
+
currentPrice: effectiveCurrentPrice,
|
|
125
|
+
prevDayPrice,
|
|
126
|
+
});
|
|
127
|
+
// Format volume (dayNtlVlm is daily notional volume)
|
|
128
|
+
// If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data
|
|
129
|
+
const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;
|
|
130
|
+
// Calculate open interest in USD
|
|
131
|
+
const openInterest = calculateOpenInterestUSD(assetCtx?.openInterest, currentPrice);
|
|
132
|
+
// Get current funding rate from assetCtx - this is the actual current funding rate
|
|
133
|
+
let fundingRate;
|
|
134
|
+
if (assetCtx && 'funding' in assetCtx) {
|
|
135
|
+
fundingRate = parseFloat(assetCtx.funding);
|
|
136
|
+
}
|
|
137
|
+
// Extract funding timing and predicted rate
|
|
138
|
+
const fundingData = extractFundingData({
|
|
139
|
+
predictedFundings,
|
|
140
|
+
symbol,
|
|
141
|
+
});
|
|
142
|
+
// Use current funding rate from assetCtx, not predicted
|
|
143
|
+
// The predicted rate is for the next funding period
|
|
144
|
+
if (!fundingRate && fundingData.predictedFundingRate !== undefined) {
|
|
145
|
+
fundingRate = fundingData.predictedFundingRate;
|
|
146
|
+
}
|
|
147
|
+
// Extract DEX and base symbol for display
|
|
148
|
+
// e.g., "flx:TSLA" → { dex: "flx", symbol: "TSLA" }
|
|
149
|
+
const { dex } = (0, hyperLiquidAdapter_1.parseAssetName)(symbol);
|
|
150
|
+
const marketSource = dex ?? undefined;
|
|
151
|
+
// Determine market type:
|
|
152
|
+
// 1. Check explicit mapping (e.g., 'xyz:GOLD' → 'commodity')
|
|
153
|
+
// 2. Default HIP-3 DEX markets to 'equity' (stocks) if not mapped
|
|
154
|
+
// 3. Main DEX markets remain undefined (crypto)
|
|
155
|
+
const marketType = assetMarketTypes?.[symbol] ?? (dex ? 'equity' : undefined);
|
|
156
|
+
return {
|
|
157
|
+
symbol,
|
|
158
|
+
name: symbol,
|
|
159
|
+
maxLeverage: `${asset.maxLeverage}x`,
|
|
160
|
+
price: isNaN(currentPrice)
|
|
161
|
+
? perpsConfig_1.PERPS_CONSTANTS.FallbackPriceDisplay
|
|
162
|
+
: (0, formatUtils_1.formatPerpsFiat)(currentPrice, { ranges: formatUtils_1.PRICE_RANGES_UNIVERSAL }),
|
|
163
|
+
change24h: isNaN(change24h)
|
|
164
|
+
? perpsConfig_1.PERPS_CONSTANTS.ZeroAmountDetailedDisplay
|
|
165
|
+
: formatChange(change24h),
|
|
166
|
+
change24hPercent: isNaN(change24hPercent)
|
|
167
|
+
? '0.00%'
|
|
168
|
+
: formatPercentage(change24hPercent),
|
|
169
|
+
volume: isNaN(volume)
|
|
170
|
+
? perpsConfig_1.PERPS_CONSTANTS.FallbackPriceDisplay
|
|
171
|
+
: (0, formatUtils_1.formatVolume)(volume),
|
|
172
|
+
openInterest: isNaN(openInterest)
|
|
173
|
+
? perpsConfig_1.PERPS_CONSTANTS.FallbackPriceDisplay
|
|
174
|
+
: (0, formatUtils_1.formatVolume)(openInterest),
|
|
175
|
+
nextFundingTime: fundingData.nextFundingTime,
|
|
176
|
+
fundingIntervalHours: fundingData.fundingIntervalHours,
|
|
177
|
+
fundingRate,
|
|
178
|
+
marketSource,
|
|
179
|
+
marketType,
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
exports.transformMarketData = transformMarketData;
|
|
184
|
+
/**
|
|
185
|
+
* Format 24h change with sign.
|
|
186
|
+
* Uses more decimal places for smaller amounts to show meaningful precision.
|
|
187
|
+
*
|
|
188
|
+
* @param change - The price change value to format
|
|
189
|
+
* @returns Formatted change string with sign and dollar symbol
|
|
190
|
+
*/
|
|
191
|
+
function formatChange(change) {
|
|
192
|
+
if (isNaN(change) || !isFinite(change)) {
|
|
193
|
+
return '$0.00';
|
|
194
|
+
}
|
|
195
|
+
if (change === 0) {
|
|
196
|
+
return '$0.00';
|
|
197
|
+
}
|
|
198
|
+
const formatted = (0, formatUtils_1.formatPerpsFiat)(Math.abs(change), {
|
|
199
|
+
ranges: formatUtils_1.PRICE_RANGES_UNIVERSAL,
|
|
200
|
+
});
|
|
201
|
+
// Remove $ sign and add it back with proper sign placement
|
|
202
|
+
const valueWithoutDollar = formatted.replace('$', '');
|
|
203
|
+
return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;
|
|
204
|
+
}
|
|
205
|
+
exports.formatChange = formatChange;
|
|
206
|
+
/**
|
|
207
|
+
* Format percentage change with sign.
|
|
208
|
+
*
|
|
209
|
+
* @param percent - The percentage value to format
|
|
210
|
+
* @returns Formatted percentage string with sign
|
|
211
|
+
*/
|
|
212
|
+
function formatPercentage(percent) {
|
|
213
|
+
if (isNaN(percent) || !isFinite(percent)) {
|
|
214
|
+
return '0.00%';
|
|
215
|
+
}
|
|
216
|
+
if (percent === 0) {
|
|
217
|
+
return '0.00%';
|
|
218
|
+
}
|
|
219
|
+
const formatted = getIntlNumberFormatter('en-US', {
|
|
220
|
+
style: 'percent',
|
|
221
|
+
minimumFractionDigits: 2,
|
|
222
|
+
maximumFractionDigits: 2,
|
|
223
|
+
}).format(percent / 100);
|
|
224
|
+
return percent > 0 ? `+${formatted}` : formatted;
|
|
225
|
+
}
|
|
226
|
+
exports.formatPercentage = formatPercentage;
|
|
227
|
+
//# sourceMappingURL=marketDataTransform.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketDataTransform.cjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n formatVolume,\n formatPerpsFiat,\n PRICE_RANGES_UNIVERSAL,\n} from './formatUtils';\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type { PerpsMarketData, MarketType } from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Creates an Intl.NumberFormat formatter\n *\n * @param locale - The locale for formatting\n * @param options - NumberFormat options\n * @returns Formatted number formatter\n */\nconst getIntlNumberFormatter = (\n locale: string,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => {\n return new Intl.NumberFormat(locale, options);\n};\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (\n openInterest === null ||\n openInterest === undefined ||\n currentPrice === null ||\n currentPrice === undefined\n ) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change.\n * Shows -100% when current price is missing but previous price exists.\n *\n * @param params - Parameters for calculating 24h percentage change\n * @returns The 24h percentage change value\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && 'funding' in assetCtx) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // Determine market type:\n // 1. Check explicit mapping (e.g., 'xyz:GOLD' → 'commodity')\n // 2. Default HIP-3 DEX markets to 'equity' (stocks) if not mapped\n // 3. Main DEX markets remain undefined (crypto)\n const marketType: MarketType | undefined =\n assetMarketTypes?.[symbol] ?? (dex ? 'equity' : undefined);\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatPerpsFiat(currentPrice, { ranges: PRICE_RANGES_UNIVERSAL }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(change: number): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatPerpsFiat(Math.abs(change), {\n ranges: PRICE_RANGES_UNIVERSAL,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n\n/**\n * Format percentage change with sign.\n *\n * @param percent - The percentage value to format\n * @returns Formatted percentage string with sign\n */\nexport function formatPercentage(percent: number): string {\n if (isNaN(percent) || !isFinite(percent)) {\n return '0.00%';\n }\n if (percent === 0) {\n return '0.00%';\n }\n\n const formatted = getIntlNumberFormatter('en-US', {\n style: 'percent',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(percent / 100);\n\n return percent > 0 ? `+${formatted}` : formatted;\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { PerpsMarketData, MarketType } from "../types/index.cjs";
|
|
2
|
+
import type { AllMidsResponse, PerpsUniverse, PerpsAssetCtx, PredictedFunding } from "../types/hyperliquid-types.cjs";
|
|
3
|
+
/**
|
|
4
|
+
* Calculate open interest in USD
|
|
5
|
+
* Open interest from HyperLiquid is in contracts/units, not USD
|
|
6
|
+
* To get USD value, multiply by current price
|
|
7
|
+
*
|
|
8
|
+
* @param openInterest - Raw open interest value in contracts/units
|
|
9
|
+
* @param currentPrice - Current price of the asset
|
|
10
|
+
* @returns Open interest in USD, or NaN if invalid
|
|
11
|
+
*/
|
|
12
|
+
export declare function calculateOpenInterestUSD(openInterest: string | number | undefined, currentPrice: string | number | undefined): number;
|
|
13
|
+
/**
|
|
14
|
+
* HyperLiquid-specific market data structure
|
|
15
|
+
*/
|
|
16
|
+
export type HyperLiquidMarketData = {
|
|
17
|
+
universe: PerpsUniverse[];
|
|
18
|
+
assetCtxs: PerpsAssetCtx[];
|
|
19
|
+
allMids: AllMidsResponse;
|
|
20
|
+
predictedFundings?: PredictedFunding[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Transform raw HyperLiquid market data to UI-friendly format
|
|
24
|
+
*
|
|
25
|
+
* @param hyperLiquidData - Raw data from HyperLiquid API
|
|
26
|
+
* @param assetMarketTypes - Optional mapping of asset symbols to market types
|
|
27
|
+
* @returns Transformed market data ready for UI consumption
|
|
28
|
+
*/
|
|
29
|
+
export declare function transformMarketData(hyperLiquidData: HyperLiquidMarketData, assetMarketTypes?: Record<string, MarketType>): PerpsMarketData[];
|
|
30
|
+
/**
|
|
31
|
+
* Format 24h change with sign.
|
|
32
|
+
* Uses more decimal places for smaller amounts to show meaningful precision.
|
|
33
|
+
*
|
|
34
|
+
* @param change - The price change value to format
|
|
35
|
+
* @returns Formatted change string with sign and dollar symbol
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatChange(change: number): string;
|
|
38
|
+
/**
|
|
39
|
+
* Format percentage change with sign.
|
|
40
|
+
*
|
|
41
|
+
* @param percent - The percentage value to format
|
|
42
|
+
* @returns Formatted percentage string with sign
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatPercentage(percent: number): string;
|
|
45
|
+
//# sourceMappingURL=marketDataTransform.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketDataTransform.d.cts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,2BAAiB;AAC5D,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAgBpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAoBR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CAiGnB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAenD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAexD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { PerpsMarketData, MarketType } from "../types/index.mjs";
|
|
2
|
+
import type { AllMidsResponse, PerpsUniverse, PerpsAssetCtx, PredictedFunding } from "../types/hyperliquid-types.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Calculate open interest in USD
|
|
5
|
+
* Open interest from HyperLiquid is in contracts/units, not USD
|
|
6
|
+
* To get USD value, multiply by current price
|
|
7
|
+
*
|
|
8
|
+
* @param openInterest - Raw open interest value in contracts/units
|
|
9
|
+
* @param currentPrice - Current price of the asset
|
|
10
|
+
* @returns Open interest in USD, or NaN if invalid
|
|
11
|
+
*/
|
|
12
|
+
export declare function calculateOpenInterestUSD(openInterest: string | number | undefined, currentPrice: string | number | undefined): number;
|
|
13
|
+
/**
|
|
14
|
+
* HyperLiquid-specific market data structure
|
|
15
|
+
*/
|
|
16
|
+
export type HyperLiquidMarketData = {
|
|
17
|
+
universe: PerpsUniverse[];
|
|
18
|
+
assetCtxs: PerpsAssetCtx[];
|
|
19
|
+
allMids: AllMidsResponse;
|
|
20
|
+
predictedFundings?: PredictedFunding[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Transform raw HyperLiquid market data to UI-friendly format
|
|
24
|
+
*
|
|
25
|
+
* @param hyperLiquidData - Raw data from HyperLiquid API
|
|
26
|
+
* @param assetMarketTypes - Optional mapping of asset symbols to market types
|
|
27
|
+
* @returns Transformed market data ready for UI consumption
|
|
28
|
+
*/
|
|
29
|
+
export declare function transformMarketData(hyperLiquidData: HyperLiquidMarketData, assetMarketTypes?: Record<string, MarketType>): PerpsMarketData[];
|
|
30
|
+
/**
|
|
31
|
+
* Format 24h change with sign.
|
|
32
|
+
* Uses more decimal places for smaller amounts to show meaningful precision.
|
|
33
|
+
*
|
|
34
|
+
* @param change - The price change value to format
|
|
35
|
+
* @returns Formatted change string with sign and dollar symbol
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatChange(change: number): string;
|
|
38
|
+
/**
|
|
39
|
+
* Format percentage change with sign.
|
|
40
|
+
*
|
|
41
|
+
* @param percent - The percentage value to format
|
|
42
|
+
* @returns Formatted percentage string with sign
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatPercentage(percent: number): string;
|
|
45
|
+
//# sourceMappingURL=marketDataTransform.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketDataTransform.d.mts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,2BAAiB;AAC5D,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAgBpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAoBR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CAiGnB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAenD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAexD"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { formatVolume, formatPerpsFiat, PRICE_RANGES_UNIVERSAL } from "./formatUtils.mjs";
|
|
2
|
+
import { parseAssetName } from "./hyperLiquidAdapter.mjs";
|
|
3
|
+
import { HYPERLIQUID_CONFIG } from "../constants/hyperLiquidConfig.mjs";
|
|
4
|
+
import { PERPS_CONSTANTS } from "../constants/perpsConfig.mjs";
|
|
5
|
+
/**
|
|
6
|
+
* Creates an Intl.NumberFormat formatter
|
|
7
|
+
*
|
|
8
|
+
* @param locale - The locale for formatting
|
|
9
|
+
* @param options - NumberFormat options
|
|
10
|
+
* @returns Formatted number formatter
|
|
11
|
+
*/
|
|
12
|
+
const getIntlNumberFormatter = (locale, options) => {
|
|
13
|
+
return new Intl.NumberFormat(locale, options);
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Calculate open interest in USD
|
|
17
|
+
* Open interest from HyperLiquid is in contracts/units, not USD
|
|
18
|
+
* To get USD value, multiply by current price
|
|
19
|
+
*
|
|
20
|
+
* @param openInterest - Raw open interest value in contracts/units
|
|
21
|
+
* @param currentPrice - Current price of the asset
|
|
22
|
+
* @returns Open interest in USD, or NaN if invalid
|
|
23
|
+
*/
|
|
24
|
+
export function calculateOpenInterestUSD(openInterest, currentPrice) {
|
|
25
|
+
if (openInterest === null ||
|
|
26
|
+
openInterest === undefined ||
|
|
27
|
+
currentPrice === null ||
|
|
28
|
+
currentPrice === undefined) {
|
|
29
|
+
return NaN;
|
|
30
|
+
}
|
|
31
|
+
const openInterestNum = typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;
|
|
32
|
+
const priceNum = typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;
|
|
33
|
+
if (isNaN(openInterestNum) || isNaN(priceNum)) {
|
|
34
|
+
return NaN;
|
|
35
|
+
}
|
|
36
|
+
return openInterestNum * priceNum;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Calculate 24h percentage change.
|
|
40
|
+
* Shows -100% when current price is missing but previous price exists.
|
|
41
|
+
*
|
|
42
|
+
* @param params - Parameters for calculating 24h percentage change
|
|
43
|
+
* @returns The 24h percentage change value
|
|
44
|
+
*/
|
|
45
|
+
function calculateChange24hPercent(params) {
|
|
46
|
+
const { hasCurrentPrice, currentPrice, prevDayPrice } = params;
|
|
47
|
+
if (!hasCurrentPrice) {
|
|
48
|
+
return prevDayPrice > 0 ? -100 : 0;
|
|
49
|
+
}
|
|
50
|
+
if (prevDayPrice <= 0) {
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extract funding data for a symbol from predicted fundings.
|
|
57
|
+
* Looks for specified exchange first, falls back to first available.
|
|
58
|
+
*
|
|
59
|
+
* @param params - Parameters for extracting funding data
|
|
60
|
+
* @param params.predictedFundings - Array of predicted funding data
|
|
61
|
+
* @param params.symbol - Asset symbol to extract funding for
|
|
62
|
+
* @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')
|
|
63
|
+
* @returns Funding data including next funding time, interval, and predicted rate
|
|
64
|
+
*/
|
|
65
|
+
function extractFundingData(params) {
|
|
66
|
+
const { predictedFundings, symbol, exchangeName = HYPERLIQUID_CONFIG.ExchangeName, } = params;
|
|
67
|
+
const result = {};
|
|
68
|
+
if (!predictedFundings) {
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
const fundingData = predictedFundings.find(([assetSymbol]) => assetSymbol === symbol);
|
|
72
|
+
if (!fundingData?.[1] ||
|
|
73
|
+
!Array.isArray(fundingData[1]) ||
|
|
74
|
+
fundingData[1].length === 0) {
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
// Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)
|
|
78
|
+
const targetExchange = fundingData[1].find((exchange) => Array.isArray(exchange) && exchange[0] === exchangeName);
|
|
79
|
+
if (targetExchange?.[1]) {
|
|
80
|
+
result.nextFundingTime = targetExchange[1].nextFundingTime;
|
|
81
|
+
result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;
|
|
82
|
+
result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
// Fallback to first exchange if target not found
|
|
86
|
+
const firstExchange = fundingData[1][0];
|
|
87
|
+
if (Array.isArray(firstExchange) && firstExchange[1]) {
|
|
88
|
+
result.nextFundingTime = firstExchange[1].nextFundingTime;
|
|
89
|
+
result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Transform raw HyperLiquid market data to UI-friendly format
|
|
95
|
+
*
|
|
96
|
+
* @param hyperLiquidData - Raw data from HyperLiquid API
|
|
97
|
+
* @param assetMarketTypes - Optional mapping of asset symbols to market types
|
|
98
|
+
* @returns Transformed market data ready for UI consumption
|
|
99
|
+
*/
|
|
100
|
+
export function transformMarketData(hyperLiquidData, assetMarketTypes) {
|
|
101
|
+
const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;
|
|
102
|
+
return universe.map((asset, index) => {
|
|
103
|
+
const symbol = asset.name;
|
|
104
|
+
const currentPrice = parseFloat(allMids[symbol]);
|
|
105
|
+
// Find matching asset context for additional data
|
|
106
|
+
// The assetCtxs array is aligned with universe array by index
|
|
107
|
+
const assetCtx = assetCtxs[index];
|
|
108
|
+
// Calculate 24h change
|
|
109
|
+
const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;
|
|
110
|
+
// Handle missing current price data
|
|
111
|
+
const hasCurrentPrice = !isNaN(currentPrice);
|
|
112
|
+
const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;
|
|
113
|
+
// For dollar change: show $0.00 when current price is missing
|
|
114
|
+
const change24h = hasCurrentPrice
|
|
115
|
+
? effectiveCurrentPrice - prevDayPrice
|
|
116
|
+
: 0;
|
|
117
|
+
// For percentage: show -100% when current price is missing but previous price exists
|
|
118
|
+
const change24hPercent = calculateChange24hPercent({
|
|
119
|
+
hasCurrentPrice,
|
|
120
|
+
currentPrice: effectiveCurrentPrice,
|
|
121
|
+
prevDayPrice,
|
|
122
|
+
});
|
|
123
|
+
// Format volume (dayNtlVlm is daily notional volume)
|
|
124
|
+
// If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data
|
|
125
|
+
const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;
|
|
126
|
+
// Calculate open interest in USD
|
|
127
|
+
const openInterest = calculateOpenInterestUSD(assetCtx?.openInterest, currentPrice);
|
|
128
|
+
// Get current funding rate from assetCtx - this is the actual current funding rate
|
|
129
|
+
let fundingRate;
|
|
130
|
+
if (assetCtx && 'funding' in assetCtx) {
|
|
131
|
+
fundingRate = parseFloat(assetCtx.funding);
|
|
132
|
+
}
|
|
133
|
+
// Extract funding timing and predicted rate
|
|
134
|
+
const fundingData = extractFundingData({
|
|
135
|
+
predictedFundings,
|
|
136
|
+
symbol,
|
|
137
|
+
});
|
|
138
|
+
// Use current funding rate from assetCtx, not predicted
|
|
139
|
+
// The predicted rate is for the next funding period
|
|
140
|
+
if (!fundingRate && fundingData.predictedFundingRate !== undefined) {
|
|
141
|
+
fundingRate = fundingData.predictedFundingRate;
|
|
142
|
+
}
|
|
143
|
+
// Extract DEX and base symbol for display
|
|
144
|
+
// e.g., "flx:TSLA" → { dex: "flx", symbol: "TSLA" }
|
|
145
|
+
const { dex } = parseAssetName(symbol);
|
|
146
|
+
const marketSource = dex ?? undefined;
|
|
147
|
+
// Determine market type:
|
|
148
|
+
// 1. Check explicit mapping (e.g., 'xyz:GOLD' → 'commodity')
|
|
149
|
+
// 2. Default HIP-3 DEX markets to 'equity' (stocks) if not mapped
|
|
150
|
+
// 3. Main DEX markets remain undefined (crypto)
|
|
151
|
+
const marketType = assetMarketTypes?.[symbol] ?? (dex ? 'equity' : undefined);
|
|
152
|
+
return {
|
|
153
|
+
symbol,
|
|
154
|
+
name: symbol,
|
|
155
|
+
maxLeverage: `${asset.maxLeverage}x`,
|
|
156
|
+
price: isNaN(currentPrice)
|
|
157
|
+
? PERPS_CONSTANTS.FallbackPriceDisplay
|
|
158
|
+
: formatPerpsFiat(currentPrice, { ranges: PRICE_RANGES_UNIVERSAL }),
|
|
159
|
+
change24h: isNaN(change24h)
|
|
160
|
+
? PERPS_CONSTANTS.ZeroAmountDetailedDisplay
|
|
161
|
+
: formatChange(change24h),
|
|
162
|
+
change24hPercent: isNaN(change24hPercent)
|
|
163
|
+
? '0.00%'
|
|
164
|
+
: formatPercentage(change24hPercent),
|
|
165
|
+
volume: isNaN(volume)
|
|
166
|
+
? PERPS_CONSTANTS.FallbackPriceDisplay
|
|
167
|
+
: formatVolume(volume),
|
|
168
|
+
openInterest: isNaN(openInterest)
|
|
169
|
+
? PERPS_CONSTANTS.FallbackPriceDisplay
|
|
170
|
+
: formatVolume(openInterest),
|
|
171
|
+
nextFundingTime: fundingData.nextFundingTime,
|
|
172
|
+
fundingIntervalHours: fundingData.fundingIntervalHours,
|
|
173
|
+
fundingRate,
|
|
174
|
+
marketSource,
|
|
175
|
+
marketType,
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Format 24h change with sign.
|
|
181
|
+
* Uses more decimal places for smaller amounts to show meaningful precision.
|
|
182
|
+
*
|
|
183
|
+
* @param change - The price change value to format
|
|
184
|
+
* @returns Formatted change string with sign and dollar symbol
|
|
185
|
+
*/
|
|
186
|
+
export function formatChange(change) {
|
|
187
|
+
if (isNaN(change) || !isFinite(change)) {
|
|
188
|
+
return '$0.00';
|
|
189
|
+
}
|
|
190
|
+
if (change === 0) {
|
|
191
|
+
return '$0.00';
|
|
192
|
+
}
|
|
193
|
+
const formatted = formatPerpsFiat(Math.abs(change), {
|
|
194
|
+
ranges: PRICE_RANGES_UNIVERSAL,
|
|
195
|
+
});
|
|
196
|
+
// Remove $ sign and add it back with proper sign placement
|
|
197
|
+
const valueWithoutDollar = formatted.replace('$', '');
|
|
198
|
+
return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Format percentage change with sign.
|
|
202
|
+
*
|
|
203
|
+
* @param percent - The percentage value to format
|
|
204
|
+
* @returns Formatted percentage string with sign
|
|
205
|
+
*/
|
|
206
|
+
export function formatPercentage(percent) {
|
|
207
|
+
if (isNaN(percent) || !isFinite(percent)) {
|
|
208
|
+
return '0.00%';
|
|
209
|
+
}
|
|
210
|
+
if (percent === 0) {
|
|
211
|
+
return '0.00%';
|
|
212
|
+
}
|
|
213
|
+
const formatted = getIntlNumberFormatter('en-US', {
|
|
214
|
+
style: 'percent',
|
|
215
|
+
minimumFractionDigits: 2,
|
|
216
|
+
maximumFractionDigits: 2,
|
|
217
|
+
}).format(percent / 100);
|
|
218
|
+
return percent > 0 ? `+${formatted}` : formatted;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=marketDataTransform.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketDataTransform.mjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n formatVolume,\n formatPerpsFiat,\n PRICE_RANGES_UNIVERSAL,\n} from './formatUtils';\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type { PerpsMarketData, MarketType } from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Creates an Intl.NumberFormat formatter\n *\n * @param locale - The locale for formatting\n * @param options - NumberFormat options\n * @returns Formatted number formatter\n */\nconst getIntlNumberFormatter = (\n locale: string,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat => {\n return new Intl.NumberFormat(locale, options);\n};\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (\n openInterest === null ||\n openInterest === undefined ||\n currentPrice === null ||\n currentPrice === undefined\n ) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change.\n * Shows -100% when current price is missing but previous price exists.\n *\n * @param params - Parameters for calculating 24h percentage change\n * @returns The 24h percentage change value\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && 'funding' in assetCtx) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // Determine market type:\n // 1. Check explicit mapping (e.g., 'xyz:GOLD' → 'commodity')\n // 2. Default HIP-3 DEX markets to 'equity' (stocks) if not mapped\n // 3. Main DEX markets remain undefined (crypto)\n const marketType: MarketType | undefined =\n assetMarketTypes?.[symbol] ?? (dex ? 'equity' : undefined);\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatPerpsFiat(currentPrice, { ranges: PRICE_RANGES_UNIVERSAL }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(change: number): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatPerpsFiat(Math.abs(change), {\n ranges: PRICE_RANGES_UNIVERSAL,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n\n/**\n * Format percentage change with sign.\n *\n * @param percent - The percentage value to format\n * @returns Formatted percentage string with sign\n */\nexport function formatPercentage(percent: number): string {\n if (isNaN(percent) || !isFinite(percent)) {\n return '0.00%';\n }\n if (percent === 0) {\n return '0.00%';\n }\n\n const formatted = getIntlNumberFormatter('en-US', {\n style: 'percent',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(percent / 100);\n\n return percent > 0 ? `+${formatted}` : formatted;\n}\n"]}
|