@metamask-previews/perps-controller 0.0.0-preview-685dbf46b → 1.0.0-preview-bc00f2c
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 -2
- package/dist/PerpsController.cjs +3077 -65
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts +969 -82
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts +969 -82
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +3073 -62
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/aggregation/SubscriptionMultiplexer.cjs +441 -0
- package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.cts +171 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.mts +171 -0
- package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -0
- package/dist/aggregation/SubscriptionMultiplexer.mjs +437 -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/chartConfig.cjs +227 -0
- package/dist/constants/chartConfig.cjs.map +1 -0
- package/dist/constants/chartConfig.d.cts +216 -0
- package/dist/constants/chartConfig.d.cts.map +1 -0
- package/dist/constants/chartConfig.d.mts +216 -0
- package/dist/constants/chartConfig.d.mts.map +1 -0
- package/dist/constants/chartConfig.mjs +221 -0
- package/dist/constants/chartConfig.mjs.map +1 -0
- package/dist/constants/eventNames.cjs +436 -0
- package/dist/constants/eventNames.cjs.map +1 -0
- package/dist/constants/eventNames.d.cts +387 -0
- package/dist/constants/eventNames.d.cts.map +1 -0
- package/dist/constants/eventNames.d.mts +387 -0
- package/dist/constants/eventNames.d.mts.map +1 -0
- package/dist/constants/eventNames.mjs +433 -0
- package/dist/constants/eventNames.mjs.map +1 -0
- package/dist/constants/hyperLiquidConfig.cjs +380 -0
- package/dist/constants/hyperLiquidConfig.cjs.map +1 -0
- package/dist/constants/hyperLiquidConfig.d.cts +236 -0
- package/dist/constants/hyperLiquidConfig.d.cts.map +1 -0
- package/dist/constants/hyperLiquidConfig.d.mts +236 -0
- package/dist/constants/hyperLiquidConfig.d.mts.map +1 -0
- package/dist/constants/hyperLiquidConfig.mjs +371 -0
- package/dist/constants/hyperLiquidConfig.mjs.map +1 -0
- package/dist/constants/index.cjs +28 -0
- package/dist/constants/index.cjs.map +1 -0
- package/dist/constants/index.d.cts +12 -0
- package/dist/constants/index.d.cts.map +1 -0
- package/dist/constants/index.d.mts +12 -0
- package/dist/constants/index.d.mts.map +1 -0
- package/dist/constants/index.mjs +12 -0
- package/dist/constants/index.mjs.map +1 -0
- package/dist/constants/myxConfig.cjs +229 -0
- package/dist/constants/myxConfig.cjs.map +1 -0
- package/dist/constants/myxConfig.d.cts +106 -0
- package/dist/constants/myxConfig.d.cts.map +1 -0
- package/dist/constants/myxConfig.d.mts +106 -0
- package/dist/constants/myxConfig.d.mts.map +1 -0
- package/dist/constants/myxConfig.mjs +219 -0
- package/dist/constants/myxConfig.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 +63 -0
- package/dist/constants/performanceMetrics.cjs.map +1 -0
- package/dist/constants/performanceMetrics.d.cts +46 -0
- package/dist/constants/performanceMetrics.d.cts.map +1 -0
- package/dist/constants/performanceMetrics.d.mts +46 -0
- package/dist/constants/performanceMetrics.d.mts.map +1 -0
- package/dist/constants/performanceMetrics.mjs +60 -0
- package/dist/constants/performanceMetrics.mjs.map +1 -0
- package/dist/constants/perpsConfig.cjs +295 -0
- package/dist/constants/perpsConfig.cjs.map +1 -0
- package/dist/constants/perpsConfig.d.cts +221 -0
- package/dist/constants/perpsConfig.d.cts.map +1 -0
- package/dist/constants/perpsConfig.d.mts +221 -0
- package/dist/constants/perpsConfig.d.mts.map +1 -0
- package/dist/constants/perpsConfig.mjs +292 -0
- package/dist/constants/perpsConfig.mjs.map +1 -0
- package/dist/constants/transactionsHistoryConfig.cjs +19 -0
- package/dist/constants/transactionsHistoryConfig.cjs.map +1 -0
- package/dist/constants/transactionsHistoryConfig.d.cts +16 -0
- package/dist/constants/transactionsHistoryConfig.d.cts.map +1 -0
- package/dist/constants/transactionsHistoryConfig.d.mts +16 -0
- package/dist/constants/transactionsHistoryConfig.d.mts.map +1 -0
- package/dist/constants/transactionsHistoryConfig.mjs +16 -0
- package/dist/constants/transactionsHistoryConfig.mjs.map +1 -0
- package/dist/index.cjs +63 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +38 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +38 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +46 -1
- package/dist/index.mjs.map +1 -1
- package/dist/perpsErrorCodes.cjs +80 -0
- package/dist/perpsErrorCodes.cjs.map +1 -0
- package/dist/perpsErrorCodes.d.cts +65 -0
- package/dist/perpsErrorCodes.d.cts.map +1 -0
- package/dist/perpsErrorCodes.d.mts +65 -0
- package/dist/perpsErrorCodes.d.mts.map +1 -0
- package/dist/perpsErrorCodes.mjs +77 -0
- package/dist/perpsErrorCodes.mjs.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.cjs +508 -0
- package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.d.cts +171 -0
- package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.d.mts +171 -0
- package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -0
- package/dist/providers/AggregatedPerpsProvider.mjs +504 -0
- package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -0
- package/dist/providers/HyperLiquidProvider.cjs +5679 -0
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -0
- package/dist/providers/HyperLiquidProvider.d.cts +516 -0
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -0
- package/dist/providers/HyperLiquidProvider.d.mts +516 -0
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -0
- package/dist/providers/HyperLiquidProvider.mjs +5675 -0
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -0
- package/dist/providers/MYXProvider.cjs +514 -0
- package/dist/providers/MYXProvider.cjs.map +1 -0
- package/dist/providers/MYXProvider.d.cts +105 -0
- package/dist/providers/MYXProvider.d.cts.map +1 -0
- package/dist/providers/MYXProvider.d.mts +105 -0
- package/dist/providers/MYXProvider.d.mts.map +1 -0
- package/dist/providers/MYXProvider.mjs +510 -0
- package/dist/providers/MYXProvider.mjs.map +1 -0
- package/dist/routing/ProviderRouter.cjs +154 -0
- package/dist/routing/ProviderRouter.cjs.map +1 -0
- package/dist/routing/ProviderRouter.d.cts +112 -0
- package/dist/routing/ProviderRouter.d.cts.map +1 -0
- package/dist/routing/ProviderRouter.d.mts +112 -0
- package/dist/routing/ProviderRouter.d.mts.map +1 -0
- package/dist/routing/ProviderRouter.mjs +150 -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 +166 -0
- package/dist/selectors.cjs.map +1 -0
- package/dist/selectors.d.cts +362 -0
- package/dist/selectors.d.cts.map +1 -0
- package/dist/selectors.d.mts +362 -0
- package/dist/selectors.d.mts.map +1 -0
- package/dist/selectors.mjs +158 -0
- package/dist/selectors.mjs.map +1 -0
- package/dist/services/AccountService.cjs +324 -0
- package/dist/services/AccountService.cjs.map +1 -0
- package/dist/services/AccountService.d.cts +56 -0
- package/dist/services/AccountService.d.cts.map +1 -0
- package/dist/services/AccountService.d.mts +56 -0
- package/dist/services/AccountService.d.mts.map +1 -0
- package/dist/services/AccountService.mjs +320 -0
- package/dist/services/AccountService.mjs.map +1 -0
- package/dist/services/DataLakeService.cjs +233 -0
- package/dist/services/DataLakeService.cjs.map +1 -0
- package/dist/services/DataLakeService.d.cts +51 -0
- package/dist/services/DataLakeService.d.cts.map +1 -0
- package/dist/services/DataLakeService.d.mts +51 -0
- package/dist/services/DataLakeService.d.mts.map +1 -0
- package/dist/services/DataLakeService.mjs +229 -0
- package/dist/services/DataLakeService.mjs.map +1 -0
- package/dist/services/DepositService.cjs +98 -0
- package/dist/services/DepositService.cjs.map +1 -0
- package/dist/services/DepositService.d.cts +39 -0
- package/dist/services/DepositService.d.cts.map +1 -0
- package/dist/services/DepositService.d.mts +39 -0
- package/dist/services/DepositService.d.mts.map +1 -0
- package/dist/services/DepositService.mjs +94 -0
- package/dist/services/DepositService.mjs.map +1 -0
- package/dist/services/EligibilityService.cjs +173 -0
- package/dist/services/EligibilityService.cjs.map +1 -0
- package/dist/services/EligibilityService.d.cts +39 -0
- package/dist/services/EligibilityService.d.cts.map +1 -0
- package/dist/services/EligibilityService.d.mts +39 -0
- package/dist/services/EligibilityService.d.mts.map +1 -0
- package/dist/services/EligibilityService.mjs +169 -0
- package/dist/services/EligibilityService.mjs.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.cjs +257 -0
- package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.d.cts +73 -0
- package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.d.mts +73 -0
- package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -0
- package/dist/services/FeatureFlagConfigurationService.mjs +253 -0
- package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -0
- package/dist/services/HyperLiquidClientService.cjs +867 -0
- package/dist/services/HyperLiquidClientService.cjs.map +1 -0
- package/dist/services/HyperLiquidClientService.d.cts +214 -0
- package/dist/services/HyperLiquidClientService.d.cts.map +1 -0
- package/dist/services/HyperLiquidClientService.d.mts +214 -0
- package/dist/services/HyperLiquidClientService.d.mts.map +1 -0
- package/dist/services/HyperLiquidClientService.mjs +862 -0
- package/dist/services/HyperLiquidClientService.mjs.map +1 -0
- package/dist/services/HyperLiquidSubscriptionService.cjs +2199 -0
- package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -0
- package/dist/services/HyperLiquidSubscriptionService.d.cts +187 -0
- package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -0
- package/dist/services/HyperLiquidSubscriptionService.d.mts +187 -0
- package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -0
- package/dist/services/HyperLiquidSubscriptionService.mjs +2195 -0
- package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -0
- package/dist/services/HyperLiquidWalletService.cjs +163 -0
- package/dist/services/HyperLiquidWalletService.cjs.map +1 -0
- package/dist/services/HyperLiquidWalletService.d.cts +78 -0
- package/dist/services/HyperLiquidWalletService.d.cts.map +1 -0
- package/dist/services/HyperLiquidWalletService.d.mts +78 -0
- package/dist/services/HyperLiquidWalletService.d.mts.map +1 -0
- package/dist/services/HyperLiquidWalletService.mjs +159 -0
- package/dist/services/HyperLiquidWalletService.mjs.map +1 -0
- package/dist/services/MYXClientService.cjs +304 -0
- package/dist/services/MYXClientService.cjs.map +1 -0
- package/dist/services/MYXClientService.d.cts +81 -0
- package/dist/services/MYXClientService.d.cts.map +1 -0
- package/dist/services/MYXClientService.d.mts +81 -0
- package/dist/services/MYXClientService.d.mts.map +1 -0
- package/dist/services/MYXClientService.mjs +300 -0
- package/dist/services/MYXClientService.mjs.map +1 -0
- package/dist/services/MarketDataService.cjs +848 -0
- package/dist/services/MarketDataService.cjs.map +1 -0
- package/dist/services/MarketDataService.d.cts +291 -0
- package/dist/services/MarketDataService.d.cts.map +1 -0
- package/dist/services/MarketDataService.d.mts +291 -0
- package/dist/services/MarketDataService.d.mts.map +1 -0
- package/dist/services/MarketDataService.mjs +844 -0
- package/dist/services/MarketDataService.mjs.map +1 -0
- package/dist/services/RewardsIntegrationService.cjs +120 -0
- package/dist/services/RewardsIntegrationService.cjs.map +1 -0
- package/dist/services/RewardsIntegrationService.d.cts +28 -0
- package/dist/services/RewardsIntegrationService.d.cts.map +1 -0
- package/dist/services/RewardsIntegrationService.d.mts +28 -0
- package/dist/services/RewardsIntegrationService.d.mts.map +1 -0
- package/dist/services/RewardsIntegrationService.mjs +116 -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 +86 -0
- package/dist/services/ServiceContext.d.cts.map +1 -0
- package/dist/services/ServiceContext.d.mts +86 -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/TradingReadinessCache.cjs +288 -0
- package/dist/services/TradingReadinessCache.cjs.map +1 -0
- package/dist/services/TradingReadinessCache.d.cts +174 -0
- package/dist/services/TradingReadinessCache.d.cts.map +1 -0
- package/dist/services/TradingReadinessCache.d.mts +174 -0
- package/dist/services/TradingReadinessCache.d.mts.map +1 -0
- package/dist/services/TradingReadinessCache.mjs +285 -0
- package/dist/services/TradingReadinessCache.mjs.map +1 -0
- package/dist/services/TradingService.cjs +1457 -0
- package/dist/services/TradingService.cjs.map +1 -0
- package/dist/services/TradingService.d.cts +195 -0
- package/dist/services/TradingService.d.cts.map +1 -0
- package/dist/services/TradingService.d.mts +195 -0
- package/dist/services/TradingService.d.mts.map +1 -0
- package/dist/services/TradingService.mjs +1453 -0
- package/dist/services/TradingService.mjs.map +1 -0
- package/dist/types/config.cjs +3 -0
- package/dist/types/config.cjs.map +1 -0
- package/dist/types/config.d.cts +49 -0
- package/dist/types/config.d.cts.map +1 -0
- package/dist/types/config.d.mts +49 -0
- package/dist/types/config.d.mts.map +1 -0
- package/dist/types/config.mjs +2 -0
- package/dist/types/config.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 +20 -0
- package/dist/types/hyperliquid-types.d.cts.map +1 -0
- package/dist/types/hyperliquid-types.d.mts +20 -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 +115 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +1262 -0
- package/dist/types/index.d.cts.map +1 -0
- package/dist/types/index.d.mts +1262 -0
- package/dist/types/index.d.mts.map +1 -0
- package/dist/types/index.mjs +97 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types/messenger.cjs +3 -0
- package/dist/types/messenger.cjs.map +1 -0
- package/dist/types/messenger.d.cts +27 -0
- package/dist/types/messenger.d.cts.map +1 -0
- package/dist/types/messenger.d.mts +27 -0
- package/dist/types/messenger.d.mts.map +1 -0
- package/dist/types/messenger.mjs +2 -0
- package/dist/types/messenger.mjs.map +1 -0
- package/dist/types/myx-types.cjs +25 -0
- package/dist/types/myx-types.cjs.map +1 -0
- package/dist/types/myx-types.d.cts +63 -0
- package/dist/types/myx-types.d.cts.map +1 -0
- package/dist/types/myx-types.d.mts +63 -0
- package/dist/types/myx-types.d.mts.map +1 -0
- package/dist/types/myx-types.mjs +22 -0
- package/dist/types/myx-types.mjs.map +1 -0
- package/dist/types/perps-types.cjs +4 -0
- package/dist/types/perps-types.cjs.map +1 -0
- package/dist/types/perps-types.d.cts +105 -0
- package/dist/types/perps-types.d.cts.map +1 -0
- package/dist/types/perps-types.d.mts +105 -0
- package/dist/types/perps-types.d.mts.map +1 -0
- package/dist/types/perps-types.mjs +2 -0
- package/dist/types/perps-types.mjs.map +1 -0
- package/dist/types/token.cjs +3 -0
- package/dist/types/token.cjs.map +1 -0
- package/dist/types/token.d.cts +25 -0
- package/dist/types/token.d.cts.map +1 -0
- package/dist/types/token.d.mts +25 -0
- package/dist/types/token.d.mts.map +1 -0
- package/dist/types/token.mjs +2 -0
- package/dist/types/token.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 +100 -0
- package/dist/utils/accountUtils.cjs.map +1 -0
- package/dist/utils/accountUtils.d.cts +30 -0
- package/dist/utils/accountUtils.d.cts.map +1 -0
- package/dist/utils/accountUtils.d.mts +30 -0
- package/dist/utils/accountUtils.d.mts.map +1 -0
- package/dist/utils/accountUtils.mjs +92 -0
- package/dist/utils/accountUtils.mjs.map +1 -0
- package/dist/utils/errorUtils.cjs +35 -0
- package/dist/utils/errorUtils.cjs.map +1 -0
- package/dist/utils/errorUtils.d.cts +15 -0
- package/dist/utils/errorUtils.d.cts.map +1 -0
- package/dist/utils/errorUtils.d.mts +15 -0
- package/dist/utils/errorUtils.d.mts.map +1 -0
- package/dist/utils/errorUtils.mjs +31 -0
- package/dist/utils/errorUtils.mjs.map +1 -0
- package/dist/utils/hyperLiquidAdapter.cjs +331 -0
- package/dist/utils/hyperLiquidAdapter.cjs.map +1 -0
- package/dist/utils/hyperLiquidAdapter.d.cts +42 -0
- package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -0
- package/dist/utils/hyperLiquidAdapter.d.mts +42 -0
- package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -0
- package/dist/utils/hyperLiquidAdapter.mjs +316 -0
- package/dist/utils/hyperLiquidAdapter.mjs.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs +83 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +55 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +55 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -0
- package/dist/utils/hyperLiquidOrderBookProcessor.mjs +78 -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 +18 -0
- package/dist/utils/idUtils.cjs.map +1 -0
- package/dist/utils/idUtils.d.cts +6 -0
- package/dist/utils/idUtils.d.cts.map +1 -0
- package/dist/utils/idUtils.d.mts +6 -0
- package/dist/utils/idUtils.d.mts.map +1 -0
- package/dist/utils/idUtils.mjs +10 -0
- package/dist/utils/idUtils.mjs.map +1 -0
- package/dist/utils/index.cjs +59 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +25 -0
- package/dist/utils/index.d.cts.map +1 -0
- package/dist/utils/index.d.mts +25 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +30 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/marketDataTransform.cjs +211 -0
- package/dist/utils/marketDataTransform.cjs.map +1 -0
- package/dist/utils/marketDataTransform.d.cts +40 -0
- package/dist/utils/marketDataTransform.d.cts.map +1 -0
- package/dist/utils/marketDataTransform.d.mts +40 -0
- package/dist/utils/marketDataTransform.d.mts.map +1 -0
- package/dist/utils/marketDataTransform.mjs +205 -0
- package/dist/utils/marketDataTransform.mjs.map +1 -0
- package/dist/utils/marketUtils.cjs +151 -0
- package/dist/utils/marketUtils.cjs.map +1 -0
- package/dist/utils/marketUtils.d.cts +30 -0
- package/dist/utils/marketUtils.d.cts.map +1 -0
- package/dist/utils/marketUtils.d.mts +30 -0
- package/dist/utils/marketUtils.d.mts.map +1 -0
- package/dist/utils/marketUtils.mjs +138 -0
- package/dist/utils/marketUtils.mjs.map +1 -0
- package/dist/utils/myxAdapter.cjs +224 -0
- package/dist/utils/myxAdapter.cjs.map +1 -0
- package/dist/utils/myxAdapter.d.cts +81 -0
- package/dist/utils/myxAdapter.d.cts.map +1 -0
- package/dist/utils/myxAdapter.d.mts +81 -0
- package/dist/utils/myxAdapter.d.mts.map +1 -0
- package/dist/utils/myxAdapter.mjs +213 -0
- package/dist/utils/myxAdapter.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/rewardsUtils.cjs +98 -0
- package/dist/utils/rewardsUtils.cjs.map +1 -0
- package/dist/utils/rewardsUtils.d.cts +33 -0
- package/dist/utils/rewardsUtils.d.cts.map +1 -0
- package/dist/utils/rewardsUtils.d.mts +33 -0
- package/dist/utils/rewardsUtils.d.mts.map +1 -0
- package/dist/utils/rewardsUtils.mjs +92 -0
- package/dist/utils/rewardsUtils.mjs.map +1 -0
- package/dist/utils/significantFigures.cjs +88 -0
- package/dist/utils/significantFigures.cjs.map +1 -0
- package/dist/utils/significantFigures.d.cts +25 -0
- package/dist/utils/significantFigures.d.cts.map +1 -0
- package/dist/utils/significantFigures.d.mts +25 -0
- package/dist/utils/significantFigures.d.mts.map +1 -0
- package/dist/utils/significantFigures.mjs +82 -0
- package/dist/utils/significantFigures.mjs.map +1 -0
- package/dist/utils/sortMarkets.cjs +93 -0
- package/dist/utils/sortMarkets.cjs.map +1 -0
- package/dist/utils/sortMarkets.d.cts +27 -0
- package/dist/utils/sortMarkets.d.cts.map +1 -0
- package/dist/utils/sortMarkets.d.mts +27 -0
- package/dist/utils/sortMarkets.d.mts.map +1 -0
- package/dist/utils/sortMarkets.mjs +88 -0
- package/dist/utils/sortMarkets.mjs.map +1 -0
- package/dist/utils/standaloneInfoClient.cjs +70 -0
- package/dist/utils/standaloneInfoClient.cjs.map +1 -0
- package/dist/utils/standaloneInfoClient.d.cts +37 -0
- package/dist/utils/standaloneInfoClient.d.cts.map +1 -0
- package/dist/utils/standaloneInfoClient.d.mts +37 -0
- package/dist/utils/standaloneInfoClient.d.mts.map +1 -0
- package/dist/utils/standaloneInfoClient.mjs +64 -0
- package/dist/utils/standaloneInfoClient.mjs.map +1 -0
- package/dist/utils/stringParseUtils.cjs +18 -0
- package/dist/utils/stringParseUtils.cjs.map +1 -0
- package/dist/utils/stringParseUtils.d.cts +3 -0
- package/dist/utils/stringParseUtils.d.cts.map +1 -0
- package/dist/utils/stringParseUtils.d.mts +3 -0
- package/dist/utils/stringParseUtils.d.mts.map +1 -0
- package/dist/utils/stringParseUtils.mjs +13 -0
- package/dist/utils/stringParseUtils.mjs.map +1 -0
- package/dist/utils/transferData.cjs +33 -0
- package/dist/utils/transferData.cjs.map +1 -0
- package/dist/utils/transferData.d.cts +9 -0
- package/dist/utils/transferData.d.cts.map +1 -0
- package/dist/utils/transferData.d.mts +9 -0
- package/dist/utils/transferData.d.mts.map +1 -0
- package/dist/utils/transferData.mjs +29 -0
- package/dist/utils/transferData.mjs.map +1 -0
- package/dist/utils/wait.cjs +6 -0
- package/dist/utils/wait.cjs.map +1 -0
- package/dist/utils/wait.d.cts +2 -0
- package/dist/utils/wait.d.cts.map +1 -0
- package/dist/utils/wait.d.mts +2 -0
- package/dist/utils/wait.d.mts.map +1 -0
- package/dist/utils/wait.mjs +2 -0
- package/dist/utils/wait.mjs.map +1 -0
- package/package.json +16 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.filterMarketsByQuery = exports.calculate24hHighLow = exports.calculateFundingCountdown = exports.getPerpsDexFromSymbol = exports.getPerpsDisplaySymbol = exports.shouldIncludeMarket = exports.matchesMarketPattern = exports.compileMarketPattern = exports.validateMarketPattern = exports.escapeRegex = exports.MAX_MARKET_PATTERN_LENGTH = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Maximum length for market filter patterns (prevents DoS attacks)
|
|
6
|
+
*/
|
|
7
|
+
exports.MAX_MARKET_PATTERN_LENGTH = 100;
|
|
8
|
+
const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
9
|
+
exports.escapeRegex = escapeRegex;
|
|
10
|
+
const validateMarketPattern = (pattern) => {
|
|
11
|
+
if (!pattern || pattern.trim().length === 0) {
|
|
12
|
+
throw new Error('Market pattern cannot be empty');
|
|
13
|
+
}
|
|
14
|
+
const normalizedPattern = pattern.trim();
|
|
15
|
+
if (normalizedPattern.length > exports.MAX_MARKET_PATTERN_LENGTH) {
|
|
16
|
+
throw new Error(`Market pattern exceeds maximum length (${exports.MAX_MARKET_PATTERN_LENGTH} chars): ${normalizedPattern}`);
|
|
17
|
+
}
|
|
18
|
+
const dangerousChars = /[\\()[\]{}^$+?.|]/u;
|
|
19
|
+
if (dangerousChars.test(normalizedPattern)) {
|
|
20
|
+
throw new Error(`Market pattern contains invalid regex characters: ${normalizedPattern}`);
|
|
21
|
+
}
|
|
22
|
+
const validPattern = /^[a-zA-Z0-9:_\-*]+$/u;
|
|
23
|
+
if (!validPattern.test(normalizedPattern)) {
|
|
24
|
+
throw new Error(`Market pattern contains invalid characters: ${normalizedPattern}`);
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
};
|
|
28
|
+
exports.validateMarketPattern = validateMarketPattern;
|
|
29
|
+
const compileMarketPattern = (pattern) => {
|
|
30
|
+
const normalizedPattern = pattern.trim();
|
|
31
|
+
(0, exports.validateMarketPattern)(normalizedPattern);
|
|
32
|
+
if (normalizedPattern.endsWith(':*')) {
|
|
33
|
+
const prefix = normalizedPattern.slice(0, -2);
|
|
34
|
+
return new RegExp(`^${(0, exports.escapeRegex)(prefix)}:`, 'u');
|
|
35
|
+
}
|
|
36
|
+
if (!normalizedPattern.includes(':')) {
|
|
37
|
+
return new RegExp(`^${(0, exports.escapeRegex)(normalizedPattern)}:`, 'u');
|
|
38
|
+
}
|
|
39
|
+
return normalizedPattern;
|
|
40
|
+
};
|
|
41
|
+
exports.compileMarketPattern = compileMarketPattern;
|
|
42
|
+
const matchesMarketPattern = (symbol, matcher) => {
|
|
43
|
+
if (typeof matcher === 'string') {
|
|
44
|
+
return symbol === matcher;
|
|
45
|
+
}
|
|
46
|
+
return matcher.test(symbol);
|
|
47
|
+
};
|
|
48
|
+
exports.matchesMarketPattern = matchesMarketPattern;
|
|
49
|
+
const shouldIncludeMarket = (symbol, dex, hip3Enabled, compiledEnabledPatterns, compiledBlockedPatterns) => {
|
|
50
|
+
if (dex === null) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (!hip3Enabled) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (compiledEnabledPatterns.length > 0) {
|
|
57
|
+
const whitelisted = compiledEnabledPatterns.some(({ matcher }) => (0, exports.matchesMarketPattern)(symbol, matcher));
|
|
58
|
+
if (!whitelisted) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (compiledBlockedPatterns.length === 0) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
const blacklisted = compiledBlockedPatterns.some(({ matcher }) => (0, exports.matchesMarketPattern)(symbol, matcher));
|
|
66
|
+
return !blacklisted;
|
|
67
|
+
};
|
|
68
|
+
exports.shouldIncludeMarket = shouldIncludeMarket;
|
|
69
|
+
const getPerpsDisplaySymbol = (symbol) => {
|
|
70
|
+
if (!symbol || typeof symbol !== 'string') {
|
|
71
|
+
return symbol;
|
|
72
|
+
}
|
|
73
|
+
const colonIndex = symbol.indexOf(':');
|
|
74
|
+
if (colonIndex > 0 && colonIndex < symbol.length - 1) {
|
|
75
|
+
return symbol.substring(colonIndex + 1);
|
|
76
|
+
}
|
|
77
|
+
return symbol;
|
|
78
|
+
};
|
|
79
|
+
exports.getPerpsDisplaySymbol = getPerpsDisplaySymbol;
|
|
80
|
+
const getPerpsDexFromSymbol = (symbol) => {
|
|
81
|
+
if (!symbol || typeof symbol !== 'string') {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const colonIndex = symbol.indexOf(':');
|
|
85
|
+
if (colonIndex > 0 && colonIndex < symbol.length - 1) {
|
|
86
|
+
return symbol.substring(0, colonIndex);
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
};
|
|
90
|
+
exports.getPerpsDexFromSymbol = getPerpsDexFromSymbol;
|
|
91
|
+
const calculateFundingCountdown = (params) => {
|
|
92
|
+
const now = new Date();
|
|
93
|
+
const nowMs = now.getTime();
|
|
94
|
+
if (params?.nextFundingTime && params.nextFundingTime > nowMs) {
|
|
95
|
+
const msUntilFunding = params.nextFundingTime - nowMs;
|
|
96
|
+
const hoursUntilFunding = msUntilFunding / (1000 * 60 * 60);
|
|
97
|
+
if (hoursUntilFunding <= 1.1) {
|
|
98
|
+
const totalSeconds = Math.floor(msUntilFunding / 1000);
|
|
99
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
100
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
101
|
+
const seconds = totalSeconds % 60;
|
|
102
|
+
const formattedHours = String(hours).padStart(2, '0');
|
|
103
|
+
const formattedMinutes = String(minutes).padStart(2, '0');
|
|
104
|
+
const formattedSeconds = String(seconds).padStart(2, '0');
|
|
105
|
+
return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const utcMinutes = now.getUTCMinutes();
|
|
109
|
+
const utcSeconds = now.getUTCSeconds();
|
|
110
|
+
const minutesUntilNextHour = 59 - utcMinutes;
|
|
111
|
+
const secondsUntilNextHour = 60 - utcSeconds;
|
|
112
|
+
const finalSeconds = secondsUntilNextHour === 60 ? 0 : secondsUntilNextHour;
|
|
113
|
+
const finalMinutes = secondsUntilNextHour === 60
|
|
114
|
+
? minutesUntilNextHour + 1
|
|
115
|
+
: minutesUntilNextHour;
|
|
116
|
+
const finalHours = finalMinutes === 60 ? 1 : 0;
|
|
117
|
+
const adjustedMinutes = finalMinutes === 60 ? 0 : finalMinutes;
|
|
118
|
+
const formattedHours = String(finalHours).padStart(2, '0');
|
|
119
|
+
const formattedMinutes = String(adjustedMinutes).padStart(2, '0');
|
|
120
|
+
const formattedSeconds = String(finalSeconds).padStart(2, '0');
|
|
121
|
+
return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
|
|
122
|
+
};
|
|
123
|
+
exports.calculateFundingCountdown = calculateFundingCountdown;
|
|
124
|
+
const calculate24hHighLow = (candleData) => {
|
|
125
|
+
if (!candleData?.candles || candleData.candles.length === 0) {
|
|
126
|
+
return { high: 0, low: 0 };
|
|
127
|
+
}
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;
|
|
130
|
+
let last24hCandles = candleData.candles.filter((candle) => candle.time >= twentyFourHoursAgo);
|
|
131
|
+
if (last24hCandles.length === 0) {
|
|
132
|
+
last24hCandles = [...candleData.candles];
|
|
133
|
+
}
|
|
134
|
+
const highs = last24hCandles.map((candle) => parseFloat(candle.high));
|
|
135
|
+
const lows = last24hCandles.map((candle) => parseFloat(candle.low));
|
|
136
|
+
return {
|
|
137
|
+
high: Math.max(...highs),
|
|
138
|
+
low: Math.min(...lows),
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
exports.calculate24hHighLow = calculate24hHighLow;
|
|
142
|
+
const filterMarketsByQuery = (markets, searchQuery) => {
|
|
143
|
+
if (!searchQuery?.trim()) {
|
|
144
|
+
return markets;
|
|
145
|
+
}
|
|
146
|
+
const lowerQuery = searchQuery.toLowerCase().trim();
|
|
147
|
+
return markets.filter((market) => market.symbol?.toLowerCase().includes(lowerQuery) ||
|
|
148
|
+
market.name?.toLowerCase().includes(lowerQuery));
|
|
149
|
+
};
|
|
150
|
+
exports.filterMarketsByQuery = filterMarketsByQuery;
|
|
151
|
+
//# sourceMappingURL=marketUtils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketUtils.cjs","sourceRoot":"","sources":["../../src/utils/marketUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PerpsMarketData } from '../types';\nimport type { CandleData, CandleStick } from '../types/perps-types';\n\n/**\n * Maximum length for market filter patterns (prevents DoS attacks)\n */\nexport const MAX_MARKET_PATTERN_LENGTH = 100;\n\nexport type MarketPatternMatcher = RegExp | string;\n\nexport type CompiledMarketPattern = {\n pattern: string;\n matcher: MarketPatternMatcher;\n};\n\nexport const escapeRegex = (str: string): string =>\n str.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&');\n\nexport const validateMarketPattern = (pattern: string): boolean => {\n if (!pattern || pattern.trim().length === 0) {\n throw new Error('Market pattern cannot be empty');\n }\n\n const normalizedPattern = pattern.trim();\n\n if (normalizedPattern.length > MAX_MARKET_PATTERN_LENGTH) {\n throw new Error(\n `Market pattern exceeds maximum length (${MAX_MARKET_PATTERN_LENGTH} chars): ${normalizedPattern}`,\n );\n }\n\n const dangerousChars = /[\\\\()[\\]{}^$+?.|]/u;\n if (dangerousChars.test(normalizedPattern)) {\n throw new Error(\n `Market pattern contains invalid regex characters: ${normalizedPattern}`,\n );\n }\n\n const validPattern = /^[a-zA-Z0-9:_\\-*]+$/u;\n if (!validPattern.test(normalizedPattern)) {\n throw new Error(\n `Market pattern contains invalid characters: ${normalizedPattern}`,\n );\n }\n\n return true;\n};\n\nexport const compileMarketPattern = (pattern: string): MarketPatternMatcher => {\n const normalizedPattern = pattern.trim();\n validateMarketPattern(normalizedPattern);\n\n if (normalizedPattern.endsWith(':*')) {\n const prefix = normalizedPattern.slice(0, -2);\n return new RegExp(`^${escapeRegex(prefix)}:`, 'u');\n }\n\n if (!normalizedPattern.includes(':')) {\n return new RegExp(`^${escapeRegex(normalizedPattern)}:`, 'u');\n }\n\n return normalizedPattern;\n};\n\nexport const matchesMarketPattern = (\n symbol: string,\n matcher: MarketPatternMatcher,\n): boolean => {\n if (typeof matcher === 'string') {\n return symbol === matcher;\n }\n\n return matcher.test(symbol);\n};\n\nexport const shouldIncludeMarket = (\n symbol: string,\n dex: string | null,\n hip3Enabled: boolean,\n compiledEnabledPatterns: CompiledMarketPattern[],\n compiledBlockedPatterns: CompiledMarketPattern[],\n): boolean => {\n if (dex === null) {\n return true;\n }\n\n if (!hip3Enabled) {\n return false;\n }\n\n if (compiledEnabledPatterns.length > 0) {\n const whitelisted = compiledEnabledPatterns.some(({ matcher }) =>\n matchesMarketPattern(symbol, matcher),\n );\n if (!whitelisted) {\n return false;\n }\n }\n\n if (compiledBlockedPatterns.length === 0) {\n return true;\n }\n\n const blacklisted = compiledBlockedPatterns.some(({ matcher }) =>\n matchesMarketPattern(symbol, matcher),\n );\n\n return !blacklisted;\n};\n\nexport const getPerpsDisplaySymbol = (symbol: string): string => {\n if (!symbol || typeof symbol !== 'string') {\n return symbol;\n }\n\n const colonIndex = symbol.indexOf(':');\n if (colonIndex > 0 && colonIndex < symbol.length - 1) {\n return symbol.substring(colonIndex + 1);\n }\n\n return symbol;\n};\n\nexport const getPerpsDexFromSymbol = (symbol: string): string | null => {\n if (!symbol || typeof symbol !== 'string') {\n return null;\n }\n\n const colonIndex = symbol.indexOf(':');\n if (colonIndex > 0 && colonIndex < symbol.length - 1) {\n return symbol.substring(0, colonIndex);\n }\n\n return null;\n};\n\ntype FundingCountdownParams = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n};\n\nexport const calculateFundingCountdown = (\n params?: FundingCountdownParams,\n): string => {\n const now = new Date();\n const nowMs = now.getTime();\n\n if (params?.nextFundingTime && params.nextFundingTime > nowMs) {\n const msUntilFunding = params.nextFundingTime - nowMs;\n const hoursUntilFunding = msUntilFunding / (1000 * 60 * 60);\n\n if (hoursUntilFunding <= 1.1) {\n const totalSeconds = Math.floor(msUntilFunding / 1000);\n\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n const formattedHours = String(hours).padStart(2, '0');\n const formattedMinutes = String(minutes).padStart(2, '0');\n const formattedSeconds = String(seconds).padStart(2, '0');\n\n return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;\n }\n }\n\n const utcMinutes = now.getUTCMinutes();\n const utcSeconds = now.getUTCSeconds();\n\n const minutesUntilNextHour = 59 - utcMinutes;\n const secondsUntilNextHour = 60 - utcSeconds;\n\n const finalSeconds = secondsUntilNextHour === 60 ? 0 : secondsUntilNextHour;\n const finalMinutes =\n secondsUntilNextHour === 60\n ? minutesUntilNextHour + 1\n : minutesUntilNextHour;\n\n const finalHours = finalMinutes === 60 ? 1 : 0;\n const adjustedMinutes = finalMinutes === 60 ? 0 : finalMinutes;\n\n const formattedHours = String(finalHours).padStart(2, '0');\n const formattedMinutes = String(adjustedMinutes).padStart(2, '0');\n const formattedSeconds = String(finalSeconds).padStart(2, '0');\n\n return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;\n};\n\nexport const calculate24hHighLow = (\n candleData: CandleData | null,\n): { high: number; low: number } => {\n if (!candleData?.candles || candleData.candles.length === 0) {\n return { high: 0, low: 0 };\n }\n\n const now = Date.now();\n const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;\n\n let last24hCandles = candleData.candles.filter(\n (candle: CandleStick) => candle.time >= twentyFourHoursAgo,\n );\n\n if (last24hCandles.length === 0) {\n last24hCandles = [...candleData.candles];\n }\n\n const highs = last24hCandles.map((candle: CandleStick) =>\n parseFloat(candle.high),\n );\n const lows = last24hCandles.map((candle: CandleStick) =>\n parseFloat(candle.low),\n );\n\n return {\n high: Math.max(...highs),\n low: Math.min(...lows),\n };\n};\n\nexport const filterMarketsByQuery = (\n markets: PerpsMarketData[],\n searchQuery: string,\n): PerpsMarketData[] => {\n if (!searchQuery?.trim()) {\n return markets;\n }\n\n const lowerQuery = searchQuery.toLowerCase().trim();\n\n return markets.filter(\n (market) =>\n market.symbol?.toLowerCase().includes(lowerQuery) ||\n market.name?.toLowerCase().includes(lowerQuery),\n );\n};\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PerpsMarketData } from "../types/index.cjs";
|
|
2
|
+
import type { CandleData } from "../types/perps-types.cjs";
|
|
3
|
+
/**
|
|
4
|
+
* Maximum length for market filter patterns (prevents DoS attacks)
|
|
5
|
+
*/
|
|
6
|
+
export declare const MAX_MARKET_PATTERN_LENGTH = 100;
|
|
7
|
+
export type MarketPatternMatcher = RegExp | string;
|
|
8
|
+
export type CompiledMarketPattern = {
|
|
9
|
+
pattern: string;
|
|
10
|
+
matcher: MarketPatternMatcher;
|
|
11
|
+
};
|
|
12
|
+
export declare const escapeRegex: (str: string) => string;
|
|
13
|
+
export declare const validateMarketPattern: (pattern: string) => boolean;
|
|
14
|
+
export declare const compileMarketPattern: (pattern: string) => MarketPatternMatcher;
|
|
15
|
+
export declare const matchesMarketPattern: (symbol: string, matcher: MarketPatternMatcher) => boolean;
|
|
16
|
+
export declare const shouldIncludeMarket: (symbol: string, dex: string | null, hip3Enabled: boolean, compiledEnabledPatterns: CompiledMarketPattern[], compiledBlockedPatterns: CompiledMarketPattern[]) => boolean;
|
|
17
|
+
export declare const getPerpsDisplaySymbol: (symbol: string) => string;
|
|
18
|
+
export declare const getPerpsDexFromSymbol: (symbol: string) => string | null;
|
|
19
|
+
type FundingCountdownParams = {
|
|
20
|
+
nextFundingTime?: number;
|
|
21
|
+
fundingIntervalHours?: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const calculateFundingCountdown: (params?: FundingCountdownParams) => string;
|
|
24
|
+
export declare const calculate24hHighLow: (candleData: CandleData | null) => {
|
|
25
|
+
high: number;
|
|
26
|
+
low: number;
|
|
27
|
+
};
|
|
28
|
+
export declare const filterMarketsByQuery: (markets: PerpsMarketData[], searchQuery: string) => PerpsMarketData[];
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=marketUtils.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketUtils.d.cts","sourceRoot":"","sources":["../../src/utils/marketUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,2BAAiB;AAChD,OAAO,KAAK,EAAE,UAAU,EAAe,iCAA6B;AAEpE;;GAEG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,WAAW,QAAS,MAAM,KAAG,MACG,CAAC;AAE9C,eAAO,MAAM,qBAAqB,YAAa,MAAM,KAAG,OA4BvD,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,oBActD,CAAC;AAEF,eAAO,MAAM,oBAAoB,WACvB,MAAM,WACL,oBAAoB,KAC5B,OAMF,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACtB,MAAM,OACT,MAAM,GAAG,IAAI,eACL,OAAO,2BACK,qBAAqB,EAAE,2BACvB,qBAAqB,EAAE,KAC/C,OA2BF,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAWtD,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAAM,GAAG,IAW/D,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,yBAAyB,YAC3B,sBAAsB,KAC9B,MA2CF,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAClB,UAAU,GAAG,IAAI,KAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CA2B7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,YACtB,eAAe,EAAE,eACb,MAAM,KAClB,eAAe,EAYjB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { PerpsMarketData } from "../types/index.mjs";
|
|
2
|
+
import type { CandleData } from "../types/perps-types.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Maximum length for market filter patterns (prevents DoS attacks)
|
|
5
|
+
*/
|
|
6
|
+
export declare const MAX_MARKET_PATTERN_LENGTH = 100;
|
|
7
|
+
export type MarketPatternMatcher = RegExp | string;
|
|
8
|
+
export type CompiledMarketPattern = {
|
|
9
|
+
pattern: string;
|
|
10
|
+
matcher: MarketPatternMatcher;
|
|
11
|
+
};
|
|
12
|
+
export declare const escapeRegex: (str: string) => string;
|
|
13
|
+
export declare const validateMarketPattern: (pattern: string) => boolean;
|
|
14
|
+
export declare const compileMarketPattern: (pattern: string) => MarketPatternMatcher;
|
|
15
|
+
export declare const matchesMarketPattern: (symbol: string, matcher: MarketPatternMatcher) => boolean;
|
|
16
|
+
export declare const shouldIncludeMarket: (symbol: string, dex: string | null, hip3Enabled: boolean, compiledEnabledPatterns: CompiledMarketPattern[], compiledBlockedPatterns: CompiledMarketPattern[]) => boolean;
|
|
17
|
+
export declare const getPerpsDisplaySymbol: (symbol: string) => string;
|
|
18
|
+
export declare const getPerpsDexFromSymbol: (symbol: string) => string | null;
|
|
19
|
+
type FundingCountdownParams = {
|
|
20
|
+
nextFundingTime?: number;
|
|
21
|
+
fundingIntervalHours?: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const calculateFundingCountdown: (params?: FundingCountdownParams) => string;
|
|
24
|
+
export declare const calculate24hHighLow: (candleData: CandleData | null) => {
|
|
25
|
+
high: number;
|
|
26
|
+
low: number;
|
|
27
|
+
};
|
|
28
|
+
export declare const filterMarketsByQuery: (markets: PerpsMarketData[], searchQuery: string) => PerpsMarketData[];
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=marketUtils.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketUtils.d.mts","sourceRoot":"","sources":["../../src/utils/marketUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,2BAAiB;AAChD,OAAO,KAAK,EAAE,UAAU,EAAe,iCAA6B;AAEpE;;GAEG;AACH,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,WAAW,QAAS,MAAM,KAAG,MACG,CAAC;AAE9C,eAAO,MAAM,qBAAqB,YAAa,MAAM,KAAG,OA4BvD,CAAC;AAEF,eAAO,MAAM,oBAAoB,YAAa,MAAM,KAAG,oBActD,CAAC;AAEF,eAAO,MAAM,oBAAoB,WACvB,MAAM,WACL,oBAAoB,KAC5B,OAMF,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACtB,MAAM,OACT,MAAM,GAAG,IAAI,eACL,OAAO,2BACK,qBAAqB,EAAE,2BACvB,qBAAqB,EAAE,KAC/C,OA2BF,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAWtD,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAAM,GAAG,IAW/D,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,yBAAyB,YAC3B,sBAAsB,KAC9B,MA2CF,CAAC;AAEF,eAAO,MAAM,mBAAmB,eAClB,UAAU,GAAG,IAAI,KAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CA2B7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,YACtB,eAAe,EAAE,eACb,MAAM,KAClB,eAAe,EAYjB,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maximum length for market filter patterns (prevents DoS attacks)
|
|
3
|
+
*/
|
|
4
|
+
export const MAX_MARKET_PATTERN_LENGTH = 100;
|
|
5
|
+
export const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
6
|
+
export const validateMarketPattern = (pattern) => {
|
|
7
|
+
if (!pattern || pattern.trim().length === 0) {
|
|
8
|
+
throw new Error('Market pattern cannot be empty');
|
|
9
|
+
}
|
|
10
|
+
const normalizedPattern = pattern.trim();
|
|
11
|
+
if (normalizedPattern.length > MAX_MARKET_PATTERN_LENGTH) {
|
|
12
|
+
throw new Error(`Market pattern exceeds maximum length (${MAX_MARKET_PATTERN_LENGTH} chars): ${normalizedPattern}`);
|
|
13
|
+
}
|
|
14
|
+
const dangerousChars = /[\\()[\]{}^$+?.|]/u;
|
|
15
|
+
if (dangerousChars.test(normalizedPattern)) {
|
|
16
|
+
throw new Error(`Market pattern contains invalid regex characters: ${normalizedPattern}`);
|
|
17
|
+
}
|
|
18
|
+
const validPattern = /^[a-zA-Z0-9:_\-*]+$/u;
|
|
19
|
+
if (!validPattern.test(normalizedPattern)) {
|
|
20
|
+
throw new Error(`Market pattern contains invalid characters: ${normalizedPattern}`);
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
export const compileMarketPattern = (pattern) => {
|
|
25
|
+
const normalizedPattern = pattern.trim();
|
|
26
|
+
validateMarketPattern(normalizedPattern);
|
|
27
|
+
if (normalizedPattern.endsWith(':*')) {
|
|
28
|
+
const prefix = normalizedPattern.slice(0, -2);
|
|
29
|
+
return new RegExp(`^${escapeRegex(prefix)}:`, 'u');
|
|
30
|
+
}
|
|
31
|
+
if (!normalizedPattern.includes(':')) {
|
|
32
|
+
return new RegExp(`^${escapeRegex(normalizedPattern)}:`, 'u');
|
|
33
|
+
}
|
|
34
|
+
return normalizedPattern;
|
|
35
|
+
};
|
|
36
|
+
export const matchesMarketPattern = (symbol, matcher) => {
|
|
37
|
+
if (typeof matcher === 'string') {
|
|
38
|
+
return symbol === matcher;
|
|
39
|
+
}
|
|
40
|
+
return matcher.test(symbol);
|
|
41
|
+
};
|
|
42
|
+
export const shouldIncludeMarket = (symbol, dex, hip3Enabled, compiledEnabledPatterns, compiledBlockedPatterns) => {
|
|
43
|
+
if (dex === null) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
if (!hip3Enabled) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (compiledEnabledPatterns.length > 0) {
|
|
50
|
+
const whitelisted = compiledEnabledPatterns.some(({ matcher }) => matchesMarketPattern(symbol, matcher));
|
|
51
|
+
if (!whitelisted) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (compiledBlockedPatterns.length === 0) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const blacklisted = compiledBlockedPatterns.some(({ matcher }) => matchesMarketPattern(symbol, matcher));
|
|
59
|
+
return !blacklisted;
|
|
60
|
+
};
|
|
61
|
+
export const getPerpsDisplaySymbol = (symbol) => {
|
|
62
|
+
if (!symbol || typeof symbol !== 'string') {
|
|
63
|
+
return symbol;
|
|
64
|
+
}
|
|
65
|
+
const colonIndex = symbol.indexOf(':');
|
|
66
|
+
if (colonIndex > 0 && colonIndex < symbol.length - 1) {
|
|
67
|
+
return symbol.substring(colonIndex + 1);
|
|
68
|
+
}
|
|
69
|
+
return symbol;
|
|
70
|
+
};
|
|
71
|
+
export const getPerpsDexFromSymbol = (symbol) => {
|
|
72
|
+
if (!symbol || typeof symbol !== 'string') {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const colonIndex = symbol.indexOf(':');
|
|
76
|
+
if (colonIndex > 0 && colonIndex < symbol.length - 1) {
|
|
77
|
+
return symbol.substring(0, colonIndex);
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
export const calculateFundingCountdown = (params) => {
|
|
82
|
+
const now = new Date();
|
|
83
|
+
const nowMs = now.getTime();
|
|
84
|
+
if (params?.nextFundingTime && params.nextFundingTime > nowMs) {
|
|
85
|
+
const msUntilFunding = params.nextFundingTime - nowMs;
|
|
86
|
+
const hoursUntilFunding = msUntilFunding / (1000 * 60 * 60);
|
|
87
|
+
if (hoursUntilFunding <= 1.1) {
|
|
88
|
+
const totalSeconds = Math.floor(msUntilFunding / 1000);
|
|
89
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
90
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
91
|
+
const seconds = totalSeconds % 60;
|
|
92
|
+
const formattedHours = String(hours).padStart(2, '0');
|
|
93
|
+
const formattedMinutes = String(minutes).padStart(2, '0');
|
|
94
|
+
const formattedSeconds = String(seconds).padStart(2, '0');
|
|
95
|
+
return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const utcMinutes = now.getUTCMinutes();
|
|
99
|
+
const utcSeconds = now.getUTCSeconds();
|
|
100
|
+
const minutesUntilNextHour = 59 - utcMinutes;
|
|
101
|
+
const secondsUntilNextHour = 60 - utcSeconds;
|
|
102
|
+
const finalSeconds = secondsUntilNextHour === 60 ? 0 : secondsUntilNextHour;
|
|
103
|
+
const finalMinutes = secondsUntilNextHour === 60
|
|
104
|
+
? minutesUntilNextHour + 1
|
|
105
|
+
: minutesUntilNextHour;
|
|
106
|
+
const finalHours = finalMinutes === 60 ? 1 : 0;
|
|
107
|
+
const adjustedMinutes = finalMinutes === 60 ? 0 : finalMinutes;
|
|
108
|
+
const formattedHours = String(finalHours).padStart(2, '0');
|
|
109
|
+
const formattedMinutes = String(adjustedMinutes).padStart(2, '0');
|
|
110
|
+
const formattedSeconds = String(finalSeconds).padStart(2, '0');
|
|
111
|
+
return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
|
|
112
|
+
};
|
|
113
|
+
export const calculate24hHighLow = (candleData) => {
|
|
114
|
+
if (!candleData?.candles || candleData.candles.length === 0) {
|
|
115
|
+
return { high: 0, low: 0 };
|
|
116
|
+
}
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;
|
|
119
|
+
let last24hCandles = candleData.candles.filter((candle) => candle.time >= twentyFourHoursAgo);
|
|
120
|
+
if (last24hCandles.length === 0) {
|
|
121
|
+
last24hCandles = [...candleData.candles];
|
|
122
|
+
}
|
|
123
|
+
const highs = last24hCandles.map((candle) => parseFloat(candle.high));
|
|
124
|
+
const lows = last24hCandles.map((candle) => parseFloat(candle.low));
|
|
125
|
+
return {
|
|
126
|
+
high: Math.max(...highs),
|
|
127
|
+
low: Math.min(...lows),
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
export const filterMarketsByQuery = (markets, searchQuery) => {
|
|
131
|
+
if (!searchQuery?.trim()) {
|
|
132
|
+
return markets;
|
|
133
|
+
}
|
|
134
|
+
const lowerQuery = searchQuery.toLowerCase().trim();
|
|
135
|
+
return markets.filter((market) => market.symbol?.toLowerCase().includes(lowerQuery) ||
|
|
136
|
+
market.name?.toLowerCase().includes(lowerQuery));
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=marketUtils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketUtils.mjs","sourceRoot":"","sources":["../../src/utils/marketUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PerpsMarketData } from '../types';\nimport type { CandleData, CandleStick } from '../types/perps-types';\n\n/**\n * Maximum length for market filter patterns (prevents DoS attacks)\n */\nexport const MAX_MARKET_PATTERN_LENGTH = 100;\n\nexport type MarketPatternMatcher = RegExp | string;\n\nexport type CompiledMarketPattern = {\n pattern: string;\n matcher: MarketPatternMatcher;\n};\n\nexport const escapeRegex = (str: string): string =>\n str.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&');\n\nexport const validateMarketPattern = (pattern: string): boolean => {\n if (!pattern || pattern.trim().length === 0) {\n throw new Error('Market pattern cannot be empty');\n }\n\n const normalizedPattern = pattern.trim();\n\n if (normalizedPattern.length > MAX_MARKET_PATTERN_LENGTH) {\n throw new Error(\n `Market pattern exceeds maximum length (${MAX_MARKET_PATTERN_LENGTH} chars): ${normalizedPattern}`,\n );\n }\n\n const dangerousChars = /[\\\\()[\\]{}^$+?.|]/u;\n if (dangerousChars.test(normalizedPattern)) {\n throw new Error(\n `Market pattern contains invalid regex characters: ${normalizedPattern}`,\n );\n }\n\n const validPattern = /^[a-zA-Z0-9:_\\-*]+$/u;\n if (!validPattern.test(normalizedPattern)) {\n throw new Error(\n `Market pattern contains invalid characters: ${normalizedPattern}`,\n );\n }\n\n return true;\n};\n\nexport const compileMarketPattern = (pattern: string): MarketPatternMatcher => {\n const normalizedPattern = pattern.trim();\n validateMarketPattern(normalizedPattern);\n\n if (normalizedPattern.endsWith(':*')) {\n const prefix = normalizedPattern.slice(0, -2);\n return new RegExp(`^${escapeRegex(prefix)}:`, 'u');\n }\n\n if (!normalizedPattern.includes(':')) {\n return new RegExp(`^${escapeRegex(normalizedPattern)}:`, 'u');\n }\n\n return normalizedPattern;\n};\n\nexport const matchesMarketPattern = (\n symbol: string,\n matcher: MarketPatternMatcher,\n): boolean => {\n if (typeof matcher === 'string') {\n return symbol === matcher;\n }\n\n return matcher.test(symbol);\n};\n\nexport const shouldIncludeMarket = (\n symbol: string,\n dex: string | null,\n hip3Enabled: boolean,\n compiledEnabledPatterns: CompiledMarketPattern[],\n compiledBlockedPatterns: CompiledMarketPattern[],\n): boolean => {\n if (dex === null) {\n return true;\n }\n\n if (!hip3Enabled) {\n return false;\n }\n\n if (compiledEnabledPatterns.length > 0) {\n const whitelisted = compiledEnabledPatterns.some(({ matcher }) =>\n matchesMarketPattern(symbol, matcher),\n );\n if (!whitelisted) {\n return false;\n }\n }\n\n if (compiledBlockedPatterns.length === 0) {\n return true;\n }\n\n const blacklisted = compiledBlockedPatterns.some(({ matcher }) =>\n matchesMarketPattern(symbol, matcher),\n );\n\n return !blacklisted;\n};\n\nexport const getPerpsDisplaySymbol = (symbol: string): string => {\n if (!symbol || typeof symbol !== 'string') {\n return symbol;\n }\n\n const colonIndex = symbol.indexOf(':');\n if (colonIndex > 0 && colonIndex < symbol.length - 1) {\n return symbol.substring(colonIndex + 1);\n }\n\n return symbol;\n};\n\nexport const getPerpsDexFromSymbol = (symbol: string): string | null => {\n if (!symbol || typeof symbol !== 'string') {\n return null;\n }\n\n const colonIndex = symbol.indexOf(':');\n if (colonIndex > 0 && colonIndex < symbol.length - 1) {\n return symbol.substring(0, colonIndex);\n }\n\n return null;\n};\n\ntype FundingCountdownParams = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n};\n\nexport const calculateFundingCountdown = (\n params?: FundingCountdownParams,\n): string => {\n const now = new Date();\n const nowMs = now.getTime();\n\n if (params?.nextFundingTime && params.nextFundingTime > nowMs) {\n const msUntilFunding = params.nextFundingTime - nowMs;\n const hoursUntilFunding = msUntilFunding / (1000 * 60 * 60);\n\n if (hoursUntilFunding <= 1.1) {\n const totalSeconds = Math.floor(msUntilFunding / 1000);\n\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n const formattedHours = String(hours).padStart(2, '0');\n const formattedMinutes = String(minutes).padStart(2, '0');\n const formattedSeconds = String(seconds).padStart(2, '0');\n\n return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;\n }\n }\n\n const utcMinutes = now.getUTCMinutes();\n const utcSeconds = now.getUTCSeconds();\n\n const minutesUntilNextHour = 59 - utcMinutes;\n const secondsUntilNextHour = 60 - utcSeconds;\n\n const finalSeconds = secondsUntilNextHour === 60 ? 0 : secondsUntilNextHour;\n const finalMinutes =\n secondsUntilNextHour === 60\n ? minutesUntilNextHour + 1\n : minutesUntilNextHour;\n\n const finalHours = finalMinutes === 60 ? 1 : 0;\n const adjustedMinutes = finalMinutes === 60 ? 0 : finalMinutes;\n\n const formattedHours = String(finalHours).padStart(2, '0');\n const formattedMinutes = String(adjustedMinutes).padStart(2, '0');\n const formattedSeconds = String(finalSeconds).padStart(2, '0');\n\n return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;\n};\n\nexport const calculate24hHighLow = (\n candleData: CandleData | null,\n): { high: number; low: number } => {\n if (!candleData?.candles || candleData.candles.length === 0) {\n return { high: 0, low: 0 };\n }\n\n const now = Date.now();\n const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;\n\n let last24hCandles = candleData.candles.filter(\n (candle: CandleStick) => candle.time >= twentyFourHoursAgo,\n );\n\n if (last24hCandles.length === 0) {\n last24hCandles = [...candleData.candles];\n }\n\n const highs = last24hCandles.map((candle: CandleStick) =>\n parseFloat(candle.high),\n );\n const lows = last24hCandles.map((candle: CandleStick) =>\n parseFloat(candle.low),\n );\n\n return {\n high: Math.max(...highs),\n low: Math.min(...lows),\n };\n};\n\nexport const filterMarketsByQuery = (\n markets: PerpsMarketData[],\n searchQuery: string,\n): PerpsMarketData[] => {\n if (!searchQuery?.trim()) {\n return markets;\n }\n\n const lowerQuery = searchQuery.toLowerCase().trim();\n\n return markets.filter(\n (market) =>\n market.symbol?.toLowerCase().includes(lowerQuery) ||\n market.name?.toLowerCase().includes(lowerQuery),\n );\n};\n"]}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MYX SDK Adapter Utilities
|
|
4
|
+
*
|
|
5
|
+
* Stage 1 adapters for transforming between MetaMask Perps API types and MYX SDK types.
|
|
6
|
+
* Only includes adapters needed for market display and price fetching.
|
|
7
|
+
*
|
|
8
|
+
* Portable: no mobile-specific imports.
|
|
9
|
+
* Formatters are injected via MarketDataFormatters interface (same pattern as marketDataTransform.ts).
|
|
10
|
+
*
|
|
11
|
+
* Key differences from HyperLiquid:
|
|
12
|
+
* - Prices use 30 decimals
|
|
13
|
+
* - Sizes use 18 decimals (vs HyperLiquid's szDecimals per asset)
|
|
14
|
+
* - Multiple pools can exist per symbol (MPM model)
|
|
15
|
+
* - USDT collateral (vs USDC)
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.extractSymbolFromPoolId = exports.buildSymbolPoolsMap = exports.buildPoolSymbolMap = exports.isOverlappingMarket = exports.filterMYXExclusiveMarkets = exports.adaptMarketDataFromMYX = exports.adaptPriceFromMYX = exports.adaptMarketFromMYX = void 0;
|
|
19
|
+
const myxConfig_1 = require("../constants/myxConfig.cjs");
|
|
20
|
+
const myx_types_1 = require("../types/myx-types.cjs");
|
|
21
|
+
/**
|
|
22
|
+
* Format a price change value with sign prefix.
|
|
23
|
+
* Uses injected formatters (same pattern as marketDataTransform.ts formatChange).
|
|
24
|
+
*
|
|
25
|
+
* @param change - The price change value to format.
|
|
26
|
+
* @param formatters - Injectable formatters for platform-agnostic formatting.
|
|
27
|
+
* @returns The formatted change string with sign and dollar symbol.
|
|
28
|
+
*/
|
|
29
|
+
function formatChange(change, formatters) {
|
|
30
|
+
if (isNaN(change) || !isFinite(change)) {
|
|
31
|
+
return '$0.00';
|
|
32
|
+
}
|
|
33
|
+
if (change === 0) {
|
|
34
|
+
return '$0.00';
|
|
35
|
+
}
|
|
36
|
+
const formatted = formatters.formatPerpsFiat(Math.abs(change), {
|
|
37
|
+
ranges: formatters.priceRangesUniversal,
|
|
38
|
+
});
|
|
39
|
+
const valueWithoutDollar = formatted.replace('$', '');
|
|
40
|
+
return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;
|
|
41
|
+
}
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Market Transformation
|
|
44
|
+
// ============================================================================
|
|
45
|
+
/**
|
|
46
|
+
* Transform MYX Pool/Market info to MetaMask Perps API MarketInfo format
|
|
47
|
+
*
|
|
48
|
+
* @param pool - Pool symbol data from MYX SDK (PoolSymbolAllResponse)
|
|
49
|
+
* @returns MetaMask Perps API market info object
|
|
50
|
+
*/
|
|
51
|
+
function adaptMarketFromMYX(pool) {
|
|
52
|
+
// Extract base symbol from pool data
|
|
53
|
+
const symbol = pool.baseSymbol || extractSymbolFromPoolId(pool.poolId);
|
|
54
|
+
// MYX uses fixed 18 decimals for sizes
|
|
55
|
+
const szDecimals = 18;
|
|
56
|
+
// Default max leverage - MYX supports up to 100x on most markets
|
|
57
|
+
// Will be refined when pool level config is fetched
|
|
58
|
+
const maxLeverage = 100;
|
|
59
|
+
return {
|
|
60
|
+
name: symbol,
|
|
61
|
+
szDecimals,
|
|
62
|
+
maxLeverage,
|
|
63
|
+
marginTableId: 0, // MYX doesn't use margin tables like HyperLiquid
|
|
64
|
+
minimumOrderSize: 10, // MYX minimum order size is $10
|
|
65
|
+
providerId: 'myx',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
exports.adaptMarketFromMYX = adaptMarketFromMYX;
|
|
69
|
+
/**
|
|
70
|
+
* Convert MYX ticker data to price and change values
|
|
71
|
+
*
|
|
72
|
+
* @param ticker - Ticker data from MYX SDK
|
|
73
|
+
* @returns Object with price string and 24h change percentage
|
|
74
|
+
*/
|
|
75
|
+
function adaptPriceFromMYX(ticker) {
|
|
76
|
+
// MYX ticker prices are in 30-decimal format
|
|
77
|
+
const priceNum = (0, myxConfig_1.fromMYXPrice)(ticker.price);
|
|
78
|
+
// Change is provided as a percentage string (e.g., "2.5" means 2.5%)
|
|
79
|
+
const change24h = ticker.change ? parseFloat(ticker.change) : 0;
|
|
80
|
+
return {
|
|
81
|
+
price: priceNum.toString(),
|
|
82
|
+
change24h,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
exports.adaptPriceFromMYX = adaptPriceFromMYX;
|
|
86
|
+
/**
|
|
87
|
+
* Transform MYX pool and ticker to PerpsMarketData for UI display
|
|
88
|
+
*
|
|
89
|
+
* @param pool - Pool symbol data from MYX SDK
|
|
90
|
+
* @param ticker - Optional ticker data for price info
|
|
91
|
+
* @param formatters - Injectable formatters for platform-agnostic formatting
|
|
92
|
+
* @returns Formatted market data for UI display
|
|
93
|
+
*/
|
|
94
|
+
function adaptMarketDataFromMYX(pool, ticker, formatters) {
|
|
95
|
+
const symbol = pool.baseSymbol || extractSymbolFromPoolId(pool.poolId);
|
|
96
|
+
// Get price data from ticker if available
|
|
97
|
+
let price = '0';
|
|
98
|
+
let change24h = 0;
|
|
99
|
+
let volume = '0';
|
|
100
|
+
if (ticker) {
|
|
101
|
+
const priceData = adaptPriceFromMYX(ticker);
|
|
102
|
+
price = priceData.price;
|
|
103
|
+
change24h = priceData.change24h;
|
|
104
|
+
// Volume is already in USD (not 30-decimal format)
|
|
105
|
+
volume = ticker.volume || '0';
|
|
106
|
+
}
|
|
107
|
+
// Format using injected formatters (consistent with HyperLiquid via marketDataTransform.ts)
|
|
108
|
+
const priceNum = parseFloat(price);
|
|
109
|
+
const formattedPrice = formatters.formatPerpsFiat(priceNum);
|
|
110
|
+
const priceChange = priceNum * (change24h / 100);
|
|
111
|
+
const formattedChange = formatChange(priceChange, formatters);
|
|
112
|
+
const formattedChangePercent = formatters.formatPercentage(change24h);
|
|
113
|
+
const formattedVolume = formatters.formatVolume(parseFloat(volume));
|
|
114
|
+
return {
|
|
115
|
+
symbol,
|
|
116
|
+
name: getTokenName(symbol),
|
|
117
|
+
maxLeverage: '100x', // MYX default
|
|
118
|
+
price: formattedPrice,
|
|
119
|
+
change24h: formattedChange,
|
|
120
|
+
change24hPercent: formattedChangePercent,
|
|
121
|
+
volume: formattedVolume,
|
|
122
|
+
providerId: 'myx',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
exports.adaptMarketDataFromMYX = adaptMarketDataFromMYX;
|
|
126
|
+
// ============================================================================
|
|
127
|
+
// Market Filtering
|
|
128
|
+
// ============================================================================
|
|
129
|
+
/**
|
|
130
|
+
* Filter MYX markets to only include MYX-exclusive markets
|
|
131
|
+
* Removes markets that overlap with HyperLiquid
|
|
132
|
+
*
|
|
133
|
+
* @param pools - Array of MYX pool symbols
|
|
134
|
+
* @returns Filtered array with only MYX-exclusive markets
|
|
135
|
+
*/
|
|
136
|
+
function filterMYXExclusiveMarkets(pools) {
|
|
137
|
+
return pools.filter((pool) => {
|
|
138
|
+
const symbol = pool.baseSymbol || extractSymbolFromPoolId(pool.poolId);
|
|
139
|
+
// Exclude markets that overlap with HyperLiquid
|
|
140
|
+
return !myx_types_1.MYX_HL_OVERLAPPING_MARKETS.includes(symbol);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
exports.filterMYXExclusiveMarkets = filterMYXExclusiveMarkets;
|
|
144
|
+
/**
|
|
145
|
+
* Check if a symbol overlaps with HyperLiquid markets
|
|
146
|
+
*
|
|
147
|
+
* @param symbol - Market symbol to check
|
|
148
|
+
* @returns true if the symbol is available on both MYX and HyperLiquid
|
|
149
|
+
*/
|
|
150
|
+
function isOverlappingMarket(symbol) {
|
|
151
|
+
return myx_types_1.MYX_HL_OVERLAPPING_MARKETS.includes(symbol);
|
|
152
|
+
}
|
|
153
|
+
exports.isOverlappingMarket = isOverlappingMarket;
|
|
154
|
+
// ============================================================================
|
|
155
|
+
// Pool ID Utilities
|
|
156
|
+
// ============================================================================
|
|
157
|
+
/**
|
|
158
|
+
* Build a map of poolId to symbol for quick lookup
|
|
159
|
+
*
|
|
160
|
+
* @param pools - Array of MYX pool symbols
|
|
161
|
+
* @returns Map of poolId to symbol
|
|
162
|
+
*/
|
|
163
|
+
function buildPoolSymbolMap(pools) {
|
|
164
|
+
const map = new Map();
|
|
165
|
+
for (const pool of pools) {
|
|
166
|
+
const symbol = pool.baseSymbol || extractSymbolFromPoolId(pool.poolId);
|
|
167
|
+
map.set(pool.poolId, symbol);
|
|
168
|
+
}
|
|
169
|
+
return map;
|
|
170
|
+
}
|
|
171
|
+
exports.buildPoolSymbolMap = buildPoolSymbolMap;
|
|
172
|
+
/**
|
|
173
|
+
* Build a map of symbol to poolIds (for multi-pool support)
|
|
174
|
+
*
|
|
175
|
+
* @param pools - Array of MYX pool symbols
|
|
176
|
+
* @returns Map of symbol to array of poolIds
|
|
177
|
+
*/
|
|
178
|
+
function buildSymbolPoolsMap(pools) {
|
|
179
|
+
const map = new Map();
|
|
180
|
+
for (const pool of pools) {
|
|
181
|
+
const symbol = pool.baseSymbol || extractSymbolFromPoolId(pool.poolId);
|
|
182
|
+
const existing = map.get(symbol) ?? [];
|
|
183
|
+
existing.push(pool.poolId);
|
|
184
|
+
map.set(symbol, existing);
|
|
185
|
+
}
|
|
186
|
+
return map;
|
|
187
|
+
}
|
|
188
|
+
exports.buildSymbolPoolsMap = buildSymbolPoolsMap;
|
|
189
|
+
/**
|
|
190
|
+
* Extract symbol from pool ID
|
|
191
|
+
* Pool IDs typically contain the symbol as a suffix or can be parsed
|
|
192
|
+
*
|
|
193
|
+
* @param poolId - MYX pool ID string
|
|
194
|
+
* @returns Extracted symbol or poolId as fallback
|
|
195
|
+
*/
|
|
196
|
+
function extractSymbolFromPoolId(poolId) {
|
|
197
|
+
// Pool IDs in MYX typically look like "0x..." hex addresses
|
|
198
|
+
// The actual symbol comes from the pool's baseSymbol field
|
|
199
|
+
// This is a fallback when baseSymbol is not available
|
|
200
|
+
return poolId;
|
|
201
|
+
}
|
|
202
|
+
exports.extractSymbolFromPoolId = extractSymbolFromPoolId;
|
|
203
|
+
/**
|
|
204
|
+
* Get full token name from symbol
|
|
205
|
+
* Returns the symbol as name if not found (MYX-specific tokens)
|
|
206
|
+
*
|
|
207
|
+
* @param symbol - The market symbol to look up.
|
|
208
|
+
* @returns The human-readable token name, or the symbol itself if not found.
|
|
209
|
+
*/
|
|
210
|
+
function getTokenName(symbol) {
|
|
211
|
+
const tokenNames = {
|
|
212
|
+
BTC: 'Bitcoin',
|
|
213
|
+
ETH: 'Ethereum',
|
|
214
|
+
BNB: 'BNB',
|
|
215
|
+
MYX: 'MYX Protocol',
|
|
216
|
+
RHEA: 'Rhea Finance',
|
|
217
|
+
PARTI: 'Particle Network',
|
|
218
|
+
SKYAI: 'SkyAI',
|
|
219
|
+
PUMP: 'PumpFun',
|
|
220
|
+
WLFI: 'World Liberty Financial',
|
|
221
|
+
};
|
|
222
|
+
return tokenNames[symbol] || symbol;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=myxAdapter.cjs.map
|