@drift-labs/common 1.0.0
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/lib/Config.d.ts +26 -0
- package/lib/Config.js +29 -0
- package/lib/Config.js.map +1 -0
- package/lib/EnvironmentConstants.d.ts +40 -0
- package/lib/EnvironmentConstants.js +64 -0
- package/lib/EnvironmentConstants.js.map +1 -0
- package/lib/actions/actionHelpers/accountDeletionHelpers.d.ts +16 -0
- package/lib/actions/actionHelpers/accountDeletionHelpers.js +151 -0
- package/lib/actions/actionHelpers/accountDeletionHelpers.js.map +1 -0
- package/lib/actions/actionHelpers/actionHelpers.d.ts +13 -0
- package/lib/actions/actionHelpers/actionHelpers.js +8 -0
- package/lib/actions/actionHelpers/actionHelpers.js.map +1 -0
- package/lib/chartConstants.d.ts +2 -0
- package/lib/chartConstants.js +14 -0
- package/lib/chartConstants.js.map +1 -0
- package/lib/clients/candleClient.d.ts +74 -0
- package/lib/clients/candleClient.js +364 -0
- package/lib/clients/candleClient.js.map +1 -0
- package/lib/clients/dataApiWsClient.d.ts +33 -0
- package/lib/clients/dataApiWsClient.js +118 -0
- package/lib/clients/dataApiWsClient.js.map +1 -0
- package/lib/clients/index.d.ts +1 -0
- package/lib/clients/index.js +19 -0
- package/lib/clients/index.js.map +1 -0
- package/lib/clients/marketDataFeed.d.ts +42 -0
- package/lib/clients/marketDataFeed.js +422 -0
- package/lib/clients/marketDataFeed.js.map +1 -0
- package/lib/clients/redisClient.d.ts +89 -0
- package/lib/clients/redisClient.js +647 -0
- package/lib/clients/redisClient.js.map +1 -0
- package/lib/clients/swiftClient.d.ts +57 -0
- package/lib/clients/swiftClient.js +289 -0
- package/lib/clients/swiftClient.js.map +1 -0
- package/lib/clients/tvFeed.d.ts +63 -0
- package/lib/clients/tvFeed.js +351 -0
- package/lib/clients/tvFeed.js.map +1 -0
- package/lib/common-ui-utils/commonUiUtils.d.ts +211 -0
- package/lib/common-ui-utils/commonUiUtils.js +624 -0
- package/lib/common-ui-utils/commonUiUtils.js.map +1 -0
- package/lib/common-ui-utils/index.d.ts +6 -0
- package/lib/common-ui-utils/index.js +23 -0
- package/lib/common-ui-utils/index.js.map +1 -0
- package/lib/common-ui-utils/market.d.ts +27 -0
- package/lib/common-ui-utils/market.js +80 -0
- package/lib/common-ui-utils/market.js.map +1 -0
- package/lib/common-ui-utils/order.d.ts +11 -0
- package/lib/common-ui-utils/order.js +161 -0
- package/lib/common-ui-utils/order.js.map +1 -0
- package/lib/common-ui-utils/settings/settings.d.ts +51 -0
- package/lib/common-ui-utils/settings/settings.js +84 -0
- package/lib/common-ui-utils/settings/settings.js.map +1 -0
- package/lib/common-ui-utils/trading.d.ts +56 -0
- package/lib/common-ui-utils/trading.js +200 -0
- package/lib/common-ui-utils/trading.js.map +1 -0
- package/lib/common-ui-utils/user.d.ts +13 -0
- package/lib/common-ui-utils/user.js +124 -0
- package/lib/common-ui-utils/user.js.map +1 -0
- package/lib/constants/autogenerated/driftErrors.json +1787 -0
- package/lib/constants/autogenerated/jup-v4-error-codes.json +67 -0
- package/lib/constants/autogenerated/jup-v6-error-codes.json +115 -0
- package/lib/constants/dev.d.ts +15 -0
- package/lib/constants/dev.js +19 -0
- package/lib/constants/dev.js.map +1 -0
- package/lib/constants/geoblockList.d.ts +4 -0
- package/lib/constants/geoblockList.js +32 -0
- package/lib/constants/geoblockList.js.map +1 -0
- package/lib/constants/index.d.ts +9 -0
- package/lib/constants/index.js +26 -0
- package/lib/constants/index.js.map +1 -0
- package/lib/constants/markets.d.ts +1 -0
- package/lib/constants/markets.js +5 -0
- package/lib/constants/markets.js.map +1 -0
- package/lib/constants/misc.d.ts +23 -0
- package/lib/constants/misc.js +27 -0
- package/lib/constants/misc.js.map +1 -0
- package/lib/constants/orders.d.ts +12 -0
- package/lib/constants/orders.js +79 -0
- package/lib/constants/orders.js.map +1 -0
- package/lib/constants/pools.d.ts +5 -0
- package/lib/constants/pools.js +9 -0
- package/lib/constants/pools.js.map +1 -0
- package/lib/constants/predictionMarket.d.ts +3 -0
- package/lib/constants/predictionMarket.js +7 -0
- package/lib/constants/predictionMarket.js.map +1 -0
- package/lib/constants/superstake.d.ts +22 -0
- package/lib/constants/superstake.js +45 -0
- package/lib/constants/superstake.js.map +1 -0
- package/lib/constants/trade.d.ts +2 -0
- package/lib/constants/trade.js +9 -0
- package/lib/constants/trade.js.map +1 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +68 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js +146 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js.map +1 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.d.ts +204 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +530 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +90 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js +3 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -0
- package/lib/drift/Drift/clients/AuthorityDrift/SubscriptionManager.d.ts +139 -0
- package/lib/drift/Drift/clients/AuthorityDrift/SubscriptionManager.js +287 -0
- package/lib/drift/Drift/clients/AuthorityDrift/SubscriptionManager.js.map +1 -0
- package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +242 -0
- package/lib/drift/Drift/clients/AuthorityDrift/index.js +503 -0
- package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -0
- package/lib/drift/Drift/clients/CentralServerDrift.d.ts +91 -0
- package/lib/drift/Drift/clients/CentralServerDrift.js +326 -0
- package/lib/drift/Drift/clients/CentralServerDrift.js.map +1 -0
- package/lib/drift/Drift/clients/index.d.ts +3 -0
- package/lib/drift/Drift/clients/index.js +20 -0
- package/lib/drift/Drift/clients/index.js.map +1 -0
- package/lib/drift/Drift/constants/blockchain.d.ts +24 -0
- package/lib/drift/Drift/constants/blockchain.js +32 -0
- package/lib/drift/Drift/constants/blockchain.js.map +1 -0
- package/lib/drift/Drift/constants/errors.d.ts +6 -0
- package/lib/drift/Drift/constants/errors.js +14 -0
- package/lib/drift/Drift/constants/errors.js.map +1 -0
- package/lib/drift/Drift/constants/index.d.ts +3 -0
- package/lib/drift/Drift/constants/index.js +20 -0
- package/lib/drift/Drift/constants/index.js.map +1 -0
- package/lib/drift/Drift/constants/orderbook.d.ts +7 -0
- package/lib/drift/Drift/constants/orderbook.js +10 -0
- package/lib/drift/Drift/constants/orderbook.js.map +1 -0
- package/lib/drift/Drift/data/PollingDlob.d.ts +154 -0
- package/lib/drift/Drift/data/PollingDlob.js +387 -0
- package/lib/drift/Drift/data/PollingDlob.js.map +1 -0
- package/lib/drift/Drift/data/index.d.ts +1 -0
- package/lib/drift/Drift/data/index.js +18 -0
- package/lib/drift/Drift/data/index.js.map +1 -0
- package/lib/drift/Drift/index.d.ts +4 -0
- package/lib/drift/Drift/index.js +21 -0
- package/lib/drift/Drift/index.js.map +1 -0
- package/lib/drift/Drift/stores/MarkPriceCache.d.ts +27 -0
- package/lib/drift/Drift/stores/MarkPriceCache.js +59 -0
- package/lib/drift/Drift/stores/MarkPriceCache.js.map +1 -0
- package/lib/drift/Drift/stores/OraclePriceCache.d.ts +21 -0
- package/lib/drift/Drift/stores/OraclePriceCache.js +57 -0
- package/lib/drift/Drift/stores/OraclePriceCache.js.map +1 -0
- package/lib/drift/Drift/stores/UserAccountCache.d.ts +49 -0
- package/lib/drift/Drift/stores/UserAccountCache.js +107 -0
- package/lib/drift/Drift/stores/UserAccountCache.js.map +1 -0
- package/lib/drift/Drift/stores/index.d.ts +3 -0
- package/lib/drift/Drift/stores/index.js +20 -0
- package/lib/drift/Drift/stores/index.js.map +1 -0
- package/lib/drift/base/actions/index.d.ts +4 -0
- package/lib/drift/base/actions/index.js +21 -0
- package/lib/drift/base/actions/index.js.map +1 -0
- package/lib/drift/base/actions/perp/index.d.ts +2 -0
- package/lib/drift/base/actions/perp/index.js +19 -0
- package/lib/drift/base/actions/perp/index.js.map +1 -0
- package/lib/drift/base/actions/perp/settleFunding.d.ts +25 -0
- package/lib/drift/base/actions/perp/settleFunding.js +41 -0
- package/lib/drift/base/actions/perp/settleFunding.js.map +1 -0
- package/lib/drift/base/actions/perp/settlePnl.d.ts +35 -0
- package/lib/drift/base/actions/perp/settlePnl.js +44 -0
- package/lib/drift/base/actions/perp/settlePnl.js.map +1 -0
- package/lib/drift/base/actions/spot/borrow.d.ts +1 -0
- package/lib/drift/base/actions/spot/borrow.js +8 -0
- package/lib/drift/base/actions/spot/borrow.js.map +1 -0
- package/lib/drift/base/actions/spot/deposit.d.ts +40 -0
- package/lib/drift/base/actions/spot/deposit.js +82 -0
- package/lib/drift/base/actions/spot/deposit.js.map +1 -0
- package/lib/drift/base/actions/spot/index.d.ts +3 -0
- package/lib/drift/base/actions/spot/index.js +20 -0
- package/lib/drift/base/actions/spot/index.js.map +1 -0
- package/lib/drift/base/actions/spot/withdraw.d.ts +16 -0
- package/lib/drift/base/actions/spot/withdraw.js +39 -0
- package/lib/drift/base/actions/spot/withdraw.js.map +1 -0
- package/lib/drift/base/actions/trade/cancelOrder.d.ts +47 -0
- package/lib/drift/base/actions/trade/cancelOrder.js +55 -0
- package/lib/drift/base/actions/trade/cancelOrder.js.map +1 -0
- package/lib/drift/base/actions/trade/editOrder.d.ts +55 -0
- package/lib/drift/base/actions/trade/editOrder.js +35 -0
- package/lib/drift/base/actions/trade/editOrder.js.map +1 -0
- package/lib/drift/base/actions/trade/index.d.ts +4 -0
- package/lib/drift/base/actions/trade/index.js +21 -0
- package/lib/drift/base/actions/trade/index.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.d.ts +3 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.js +20 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +84 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +293 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +19 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +161 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +166 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +156 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -0
- package/lib/drift/base/actions/trade/swap.d.ts +62 -0
- package/lib/drift/base/actions/trade/swap.js +60 -0
- package/lib/drift/base/actions/trade/swap.js.map +1 -0
- package/lib/drift/base/actions/user/create.d.ts +75 -0
- package/lib/drift/base/actions/user/create.js +104 -0
- package/lib/drift/base/actions/user/create.js.map +1 -0
- package/lib/drift/base/actions/user/delete.d.ts +47 -0
- package/lib/drift/base/actions/user/delete.js +39 -0
- package/lib/drift/base/actions/user/delete.js.map +1 -0
- package/lib/drift/base/actions/user/index.d.ts +1 -0
- package/lib/drift/base/actions/user/index.js +18 -0
- package/lib/drift/base/actions/user/index.js.map +1 -0
- package/lib/drift/base/constants/accountNames.d.ts +1 -0
- package/lib/drift/base/constants/accountNames.js +13 -0
- package/lib/drift/base/constants/accountNames.js.map +1 -0
- package/lib/drift/base/details/index.d.ts +2 -0
- package/lib/drift/base/details/index.js +19 -0
- package/lib/drift/base/details/index.js.map +1 -0
- package/lib/drift/base/details/market/funding.d.ts +9 -0
- package/lib/drift/base/details/market/funding.js +50 -0
- package/lib/drift/base/details/market/funding.js.map +1 -0
- package/lib/drift/base/details/market/index.d.ts +2 -0
- package/lib/drift/base/details/market/index.js +19 -0
- package/lib/drift/base/details/market/index.js.map +1 -0
- package/lib/drift/base/details/market/openInterest.d.ts +5 -0
- package/lib/drift/base/details/market/openInterest.js +12 -0
- package/lib/drift/base/details/market/openInterest.js.map +1 -0
- package/lib/drift/base/details/user/balances.d.ts +40 -0
- package/lib/drift/base/details/user/balances.js +39 -0
- package/lib/drift/base/details/user/balances.js.map +1 -0
- package/lib/drift/base/details/user/index.d.ts +4 -0
- package/lib/drift/base/details/user/index.js +21 -0
- package/lib/drift/base/details/user/index.js.map +1 -0
- package/lib/drift/base/details/user/marginInfo.d.ts +29 -0
- package/lib/drift/base/details/user/marginInfo.js +49 -0
- package/lib/drift/base/details/user/marginInfo.js.map +1 -0
- package/lib/drift/base/details/user/orders.d.ts +3 -0
- package/lib/drift/base/details/user/orders.js +11 -0
- package/lib/drift/base/details/user/orders.js.map +1 -0
- package/lib/drift/base/details/user/positions.d.ts +70 -0
- package/lib/drift/base/details/user/positions.js +146 -0
- package/lib/drift/base/details/user/positions.js.map +1 -0
- package/lib/drift/cli.d.ts +25 -0
- package/lib/drift/cli.js +900 -0
- package/lib/drift/cli.js.map +1 -0
- package/lib/drift/constants/apiUrls.d.ts +27 -0
- package/lib/drift/constants/apiUrls.js +31 -0
- package/lib/drift/constants/apiUrls.js.map +1 -0
- package/lib/drift/example.d.ts +19 -0
- package/lib/drift/example.js +249 -0
- package/lib/drift/example.js.map +1 -0
- package/lib/drift/index.d.ts +3 -0
- package/lib/drift/index.js +20 -0
- package/lib/drift/index.js.map +1 -0
- package/lib/drift/utils/auctionParamsResponseMapper.d.ts +45 -0
- package/lib/drift/utils/auctionParamsResponseMapper.js +148 -0
- package/lib/drift/utils/auctionParamsResponseMapper.js.map +1 -0
- package/lib/drift/utils/funding.d.ts +2 -0
- package/lib/drift/utils/funding.js +9 -0
- package/lib/drift/utils/funding.js.map +1 -0
- package/lib/drift/utils/index.d.ts +3 -0
- package/lib/drift/utils/index.js +23 -0
- package/lib/drift/utils/index.js.map +1 -0
- package/lib/drift/utils/orderParams.d.ts +48 -0
- package/lib/drift/utils/orderParams.js +140 -0
- package/lib/drift/utils/orderParams.js.map +1 -0
- package/lib/index.d.ts +45 -0
- package/lib/index.js +68 -0
- package/lib/index.js.map +1 -0
- package/lib/serializableTypes.d.ts +961 -0
- package/lib/serializableTypes.js +3887 -0
- package/lib/serializableTypes.js.map +1 -0
- package/lib/types/MarketId.d.ts +26 -0
- package/lib/types/MarketId.js +64 -0
- package/lib/types/MarketId.js.map +1 -0
- package/lib/types/Superstake.d.ts +7 -0
- package/lib/types/Superstake.js +3 -0
- package/lib/types/Superstake.js.map +1 -0
- package/lib/types/UIEnv.d.ts +26 -0
- package/lib/types/UIEnv.js +49 -0
- package/lib/types/UIEnv.js.map +1 -0
- package/lib/types/UIMarket.d.ts +94 -0
- package/lib/types/UIMarket.js +224 -0
- package/lib/types/UIMarket.js.map +1 -0
- package/lib/types/candles.d.ts +4 -0
- package/lib/types/candles.js +9 -0
- package/lib/types/candles.js.map +1 -0
- package/lib/types/dataServer.d.ts +53 -0
- package/lib/types/dataServer.js +3 -0
- package/lib/types/dataServer.js.map +1 -0
- package/lib/types/historyServer.d.ts +38 -0
- package/lib/types/historyServer.js +11 -0
- package/lib/types/historyServer.js.map +1 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +29 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/leaderboard.d.ts +80 -0
- package/lib/types/leaderboard.js +11 -0
- package/lib/types/leaderboard.js.map +1 -0
- package/lib/types/remote-configs.d.ts +61 -0
- package/lib/types/remote-configs.js +3 -0
- package/lib/types/remote-configs.js.map +1 -0
- package/lib/types/trade.d.ts +18 -0
- package/lib/types/trade.js +3 -0
- package/lib/types/trade.js.map +1 -0
- package/lib/types/user.d.ts +40 -0
- package/lib/types/user.js +3 -0
- package/lib/types/user.js.map +1 -0
- package/lib/types/utility.d.ts +15 -0
- package/lib/types/utility.js +3 -0
- package/lib/types/utility.js.map +1 -0
- package/lib/utils/CircularBuffers/CircularBuffer.d.ts +22 -0
- package/lib/utils/CircularBuffers/CircularBuffer.js +73 -0
- package/lib/utils/CircularBuffers/CircularBuffer.js.map +1 -0
- package/lib/utils/CircularBuffers/UniqueCircularBuffer.d.ts +19 -0
- package/lib/utils/CircularBuffers/UniqueCircularBuffer.js +78 -0
- package/lib/utils/CircularBuffers/UniqueCircularBuffer.js.map +1 -0
- package/lib/utils/CircularBuffers/index.d.ts +2 -0
- package/lib/utils/CircularBuffers/index.js +19 -0
- package/lib/utils/CircularBuffers/index.js.map +1 -0
- package/lib/utils/MultiplexWebSocket.d.ts +95 -0
- package/lib/utils/MultiplexWebSocket.js +416 -0
- package/lib/utils/MultiplexWebSocket.js.map +1 -0
- package/lib/utils/NumLib.d.ts +106 -0
- package/lib/utils/NumLib.js +300 -0
- package/lib/utils/NumLib.js.map +1 -0
- package/lib/utils/SharedInterval.d.ts +21 -0
- package/lib/utils/SharedInterval.js +47 -0
- package/lib/utils/SharedInterval.js.map +1 -0
- package/lib/utils/SlotBasedResultValidator.d.ts +9 -0
- package/lib/utils/SlotBasedResultValidator.js +27 -0
- package/lib/utils/SlotBasedResultValidator.js.map +1 -0
- package/lib/utils/Stopwatch.d.ts +15 -0
- package/lib/utils/Stopwatch.js +31 -0
- package/lib/utils/Stopwatch.js.map +1 -0
- package/lib/utils/StrictEventEmitter.d.ts +15 -0
- package/lib/utils/StrictEventEmitter.js +55 -0
- package/lib/utils/StrictEventEmitter.js.map +1 -0
- package/lib/utils/WalletConnectionState.d.ts +31 -0
- package/lib/utils/WalletConnectionState.js +83 -0
- package/lib/utils/WalletConnectionState.js.map +1 -0
- package/lib/utils/assert.d.ts +1 -0
- package/lib/utils/assert.js +10 -0
- package/lib/utils/assert.js.map +1 -0
- package/lib/utils/candles/Candle.d.ts +94 -0
- package/lib/utils/candles/Candle.js +580 -0
- package/lib/utils/candles/Candle.js.map +1 -0
- package/lib/utils/candles/types.d.ts +8 -0
- package/lib/utils/candles/types.js +3 -0
- package/lib/utils/candles/types.js.map +1 -0
- package/lib/utils/dlob-server/DlobServerWebsocketUtils.d.ts +57 -0
- package/lib/utils/dlob-server/DlobServerWebsocketUtils.js +137 -0
- package/lib/utils/dlob-server/DlobServerWebsocketUtils.js.map +1 -0
- package/lib/utils/driftEvents.d.ts +10 -0
- package/lib/utils/driftEvents.js +123 -0
- package/lib/utils/driftEvents.js.map +1 -0
- package/lib/utils/equalityChecks.d.ts +12 -0
- package/lib/utils/equalityChecks.js +71 -0
- package/lib/utils/equalityChecks.js.map +1 -0
- package/lib/utils/featureFlags.d.ts +3 -0
- package/lib/utils/featureFlags.js +7 -0
- package/lib/utils/featureFlags.js.map +1 -0
- package/lib/utils/geoblock/index.d.ts +4 -0
- package/lib/utils/geoblock/index.js +20 -0
- package/lib/utils/geoblock/index.js.map +1 -0
- package/lib/utils/index.d.ts +181 -0
- package/lib/utils/index.js +608 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/insuranceFund.d.ts +15 -0
- package/lib/utils/insuranceFund.js +84 -0
- package/lib/utils/insuranceFund.js.map +1 -0
- package/lib/utils/logger.d.ts +5 -0
- package/lib/utils/logger.js +53 -0
- package/lib/utils/logger.js.map +1 -0
- package/lib/utils/math.d.ts +10 -0
- package/lib/utils/math.js +89 -0
- package/lib/utils/math.js.map +1 -0
- package/lib/utils/orderbook/index.d.ts +65 -0
- package/lib/utils/orderbook/index.js +80 -0
- package/lib/utils/orderbook/index.js.map +1 -0
- package/lib/utils/pollingSequenceGuard.d.ts +9 -0
- package/lib/utils/pollingSequenceGuard.js +24 -0
- package/lib/utils/pollingSequenceGuard.js.map +1 -0
- package/lib/utils/priority-fees/PriorityFeeCalculator.d.ts +24 -0
- package/lib/utils/priority-fees/PriorityFeeCalculator.js +53 -0
- package/lib/utils/priority-fees/PriorityFeeCalculator.js.map +1 -0
- package/lib/utils/priority-fees/PriorityFeeStrategies.d.ts +5 -0
- package/lib/utils/priority-fees/PriorityFeeStrategies.js +43 -0
- package/lib/utils/priority-fees/PriorityFeeStrategies.js.map +1 -0
- package/lib/utils/priority-fees/index.d.ts +2 -0
- package/lib/utils/priority-fees/index.js +19 -0
- package/lib/utils/priority-fees/index.js.map +1 -0
- package/lib/utils/priorityFees.d.ts +14 -0
- package/lib/utils/priorityFees.js +68 -0
- package/lib/utils/priorityFees.js.map +1 -0
- package/lib/utils/rpcLatency.d.ts +7 -0
- package/lib/utils/rpcLatency.js +49 -0
- package/lib/utils/rpcLatency.js.map +1 -0
- package/lib/utils/rxjs.d.ts +11 -0
- package/lib/utils/rxjs.js +24 -0
- package/lib/utils/rxjs.js.map +1 -0
- package/lib/utils/s3Buckets.d.ts +43 -0
- package/lib/utils/s3Buckets.js +108 -0
- package/lib/utils/s3Buckets.js.map +1 -0
- package/lib/utils/superstake.d.ts +86 -0
- package/lib/utils/superstake.js +224 -0
- package/lib/utils/superstake.js.map +1 -0
- package/lib/utils/token.d.ts +16 -0
- package/lib/utils/token.js +44 -0
- package/lib/utils/token.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG = exports.DEFAULT_ORDERBOOK_CHANNEL = exports.DEFAULT_ORDERBOOK_GROUPING = void 0;
|
|
4
|
+
exports.DEFAULT_ORDERBOOK_GROUPING = 100;
|
|
5
|
+
exports.DEFAULT_ORDERBOOK_CHANNEL = 'orderbook_indicative';
|
|
6
|
+
exports.DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG = {
|
|
7
|
+
channel: exports.DEFAULT_ORDERBOOK_CHANNEL,
|
|
8
|
+
grouping: exports.DEFAULT_ORDERBOOK_GROUPING,
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=orderbook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderbook.js","sourceRoot":"","sources":["../../../../src/drift/Drift/constants/orderbook.ts"],"names":[],"mappings":";;;AAKa,QAAA,0BAA0B,GAAsB,GAAG,CAAC;AACpD,QAAA,yBAAyB,GACrC,sBAAsB,CAAC;AAEX,QAAA,qCAAqC,GAAG;IACpD,OAAO,EAAE,iCAAyB;IAClC,QAAQ,EAAE,kCAA0B;CACpC,CAAC","sourcesContent":["import {\n\tDlobServerChannel,\n\tOrderbookGrouping,\n} from '../../../utils/dlob-server/DlobServerWebsocketUtils';\n\nexport const DEFAULT_ORDERBOOK_GROUPING: OrderbookGrouping = 100;\nexport const DEFAULT_ORDERBOOK_CHANNEL: DlobServerChannel =\n\t'orderbook_indicative';\n\nexport const DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG = {\n\tchannel: DEFAULT_ORDERBOOK_CHANNEL,\n\tgrouping: DEFAULT_ORDERBOOK_GROUPING,\n};\n"]}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { MarketId, MarketKey } from '../../../types/MarketId';
|
|
3
|
+
import { L2WithOracleAndMarketData } from '../../../utils/orderbook';
|
|
4
|
+
export interface PollingConfig {
|
|
5
|
+
driftDlobServerHttpUrl: string;
|
|
6
|
+
indicativeLiquidityEnabled?: boolean;
|
|
7
|
+
groupingSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface PollingInterval {
|
|
10
|
+
id: string;
|
|
11
|
+
intervalMultiplier: number;
|
|
12
|
+
depth: number;
|
|
13
|
+
markets: Set<MarketKey>;
|
|
14
|
+
/**
|
|
15
|
+
* Used to track markets that were added to an interval in the current tick, so that they get polled on the next tick regardless of interval multiplier.
|
|
16
|
+
* Otherwise, they would only get polled on the next interval, which could be a long time if the interval multiplier is high.
|
|
17
|
+
*/
|
|
18
|
+
newlyAddedMarkets: Set<MarketKey>;
|
|
19
|
+
}
|
|
20
|
+
export interface MarketPollingData {
|
|
21
|
+
marketId: MarketId;
|
|
22
|
+
data: L2WithOracleAndMarketData;
|
|
23
|
+
}
|
|
24
|
+
export interface BulkL2FetchingQueryParams {
|
|
25
|
+
marketIndex: number;
|
|
26
|
+
marketType: string;
|
|
27
|
+
depth: number;
|
|
28
|
+
includeVamm: boolean;
|
|
29
|
+
includePhoenix: boolean;
|
|
30
|
+
includeOpenbook: boolean;
|
|
31
|
+
includeSerum: boolean;
|
|
32
|
+
includeOracle: boolean;
|
|
33
|
+
includeIndicative: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface BulkL2FetchingParams {
|
|
36
|
+
markets: (BulkL2FetchingQueryParams & {
|
|
37
|
+
intervalMultiplier: number;
|
|
38
|
+
})[];
|
|
39
|
+
grouping?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare const POLLING_INTERVALS: {
|
|
42
|
+
readonly LIVE_MARKET: 1;
|
|
43
|
+
readonly BACKGROUND_DEEP: 3;
|
|
44
|
+
readonly BACKGROUND_SHALLOW: 30;
|
|
45
|
+
readonly IDLE_1: 30;
|
|
46
|
+
readonly IDLE_2: 60;
|
|
47
|
+
};
|
|
48
|
+
export declare const POLLING_DEPTHS: {
|
|
49
|
+
readonly SHALLOW: 1;
|
|
50
|
+
readonly DEEP: 1;
|
|
51
|
+
readonly ORDERBOOK: 100;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* PollingDlob - A configurable market data polling system.
|
|
55
|
+
* The Drift DLOB (decentralized limit orderbook) server stores the current live state of the orderbook
|
|
56
|
+
* across all Drift markets. This class is used to poll the DLOB server for the markets' current mark price,
|
|
57
|
+
* while oracle price data is also provided alongside.
|
|
58
|
+
*
|
|
59
|
+
* Example usage:
|
|
60
|
+
* ```typescript
|
|
61
|
+
* import { PollingDlob, MarketId } from '@drift/common';
|
|
62
|
+
*
|
|
63
|
+
* const pollingDlob = new PollingDlob({
|
|
64
|
+
* dlobServerHttpUrl: 'https://dlob.drift.trade',
|
|
65
|
+
* indicativeLiquidityEnabled: true
|
|
66
|
+
* });
|
|
67
|
+
*
|
|
68
|
+
* // Add different polling intervals
|
|
69
|
+
* pollingDlob.addInterval('live', 1, 100); // Every 1s with depth 100
|
|
70
|
+
* pollingDlob.addInterval('background', 3, 1); // Every 3s with depth 1
|
|
71
|
+
* pollingDlob.addInterval('idle', 30, 1); // Every 30s with depth 1
|
|
72
|
+
*
|
|
73
|
+
* // Add markets to intervals
|
|
74
|
+
* const perpMarket = MarketId.createPerpMarket(0);
|
|
75
|
+
* const spotMarket = MarketId.createSpotMarket(0);
|
|
76
|
+
*
|
|
77
|
+
* pollingDlob.addMarketToInterval('live', perpMarket);
|
|
78
|
+
* pollingDlob.addMarketToInterval('background', spotMarket);
|
|
79
|
+
*
|
|
80
|
+
* // Subscribe to data updates
|
|
81
|
+
* pollingDlob.onData().subscribe(marketData => {
|
|
82
|
+
* marketData.forEach(({ marketId, data, intervalId }) => {
|
|
83
|
+
* console.log(`Market ${marketId.key} data from ${intervalId}:`, data);
|
|
84
|
+
* });
|
|
85
|
+
* });
|
|
86
|
+
*
|
|
87
|
+
* // Subscribe to errors
|
|
88
|
+
* pollingDlob.onError().subscribe(error => {
|
|
89
|
+
* console.error('Polling error:', error);
|
|
90
|
+
* });
|
|
91
|
+
*
|
|
92
|
+
* // Start polling
|
|
93
|
+
* pollingDlob.start();
|
|
94
|
+
*
|
|
95
|
+
* // Stop when done
|
|
96
|
+
* // pollingDlob.stop();
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export declare class PollingDlob {
|
|
100
|
+
private config;
|
|
101
|
+
private baseTickIntervalMs;
|
|
102
|
+
private intervals;
|
|
103
|
+
private _marketToIntervalMap;
|
|
104
|
+
private dataSubject;
|
|
105
|
+
private errorSubject;
|
|
106
|
+
private isStarted;
|
|
107
|
+
private intervalHandle;
|
|
108
|
+
private tickCounter;
|
|
109
|
+
private consecutiveEmptyResponseCount;
|
|
110
|
+
private consecutiveErrorCount;
|
|
111
|
+
private readonly maxConsecutiveEmptyResponses;
|
|
112
|
+
private readonly maxConsecutiveErrors;
|
|
113
|
+
constructor(config: PollingConfig);
|
|
114
|
+
getPollingIntervalForMarket(marketKey: MarketKey): PollingInterval | undefined;
|
|
115
|
+
addInterval(id: string, intervalMultiplier: number, depth: number): void;
|
|
116
|
+
removeInterval(id: string): void;
|
|
117
|
+
/**
|
|
118
|
+
* Add a market to an interval.
|
|
119
|
+
* If the market is already in an interval, it will be removed from the existing interval.
|
|
120
|
+
* Newly added markets will be polled on the next tick regardless of interval multiplier.
|
|
121
|
+
*/
|
|
122
|
+
addMarketToInterval(intervalId: string, marketKey: MarketKey): void;
|
|
123
|
+
addMarketsToInterval(intervalId: string, marketKeys: MarketKey[]): void;
|
|
124
|
+
removeMarketFromInterval(intervalId: string, marketKey: MarketKey): void;
|
|
125
|
+
getMarketInterval(marketKey: MarketKey): string | undefined;
|
|
126
|
+
onData(): Observable<MarketPollingData[]>;
|
|
127
|
+
onError(): Observable<Error>;
|
|
128
|
+
start(): Promise<void>;
|
|
129
|
+
stop(): void;
|
|
130
|
+
isRunning(): boolean;
|
|
131
|
+
getConfig(): PollingConfig;
|
|
132
|
+
updateConfig(newConfig: Partial<PollingConfig>): void;
|
|
133
|
+
getMarketCount(): number;
|
|
134
|
+
getIntervalCount(): number;
|
|
135
|
+
getAllMarkets(): MarketKey[];
|
|
136
|
+
getMarketsForInterval(intervalId: string): MarketKey[];
|
|
137
|
+
getStats(): {
|
|
138
|
+
isRunning: boolean;
|
|
139
|
+
tickCounter: number;
|
|
140
|
+
intervalCount: number;
|
|
141
|
+
marketCount: number;
|
|
142
|
+
consecutiveEmptyResponses: number;
|
|
143
|
+
consecutiveErrors: number;
|
|
144
|
+
};
|
|
145
|
+
resetErrorCounters(): void;
|
|
146
|
+
/**
|
|
147
|
+
* Factory method to create a PollingDlob with common interval configurations
|
|
148
|
+
*/
|
|
149
|
+
static createWithCommonIntervals(config: PollingConfig): PollingDlob;
|
|
150
|
+
private tick;
|
|
151
|
+
private fetchBulkMarketL2Data;
|
|
152
|
+
private bulkDlobL2Fetcher;
|
|
153
|
+
private encodeQueryParams;
|
|
154
|
+
}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PollingDlob = exports.POLLING_DEPTHS = exports.POLLING_INTERVALS = void 0;
|
|
4
|
+
const rxjs_1 = require("rxjs");
|
|
5
|
+
const MarketId_1 = require("../../../types/MarketId");
|
|
6
|
+
const orderbook_1 = require("../../../utils/orderbook");
|
|
7
|
+
const pollingSequenceGuard_1 = require("../../../utils/pollingSequenceGuard");
|
|
8
|
+
const blockchain_1 = require("../constants/blockchain");
|
|
9
|
+
const BACKGROUND_L2_POLLING_KEY = Symbol('BACKGROUND_L2_POLLING_KEY');
|
|
10
|
+
// Predefined interval multipliers from the original React hook
|
|
11
|
+
exports.POLLING_INTERVALS = {
|
|
12
|
+
LIVE_MARKET: 1,
|
|
13
|
+
BACKGROUND_DEEP: 3, // Can be configured to 2 for interim usage
|
|
14
|
+
BACKGROUND_SHALLOW: 30,
|
|
15
|
+
IDLE_1: 30,
|
|
16
|
+
IDLE_2: 60,
|
|
17
|
+
};
|
|
18
|
+
exports.POLLING_DEPTHS = {
|
|
19
|
+
SHALLOW: 1,
|
|
20
|
+
DEEP: 1,
|
|
21
|
+
ORDERBOOK: 100,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* PollingDlob - A configurable market data polling system.
|
|
25
|
+
* The Drift DLOB (decentralized limit orderbook) server stores the current live state of the orderbook
|
|
26
|
+
* across all Drift markets. This class is used to poll the DLOB server for the markets' current mark price,
|
|
27
|
+
* while oracle price data is also provided alongside.
|
|
28
|
+
*
|
|
29
|
+
* Example usage:
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { PollingDlob, MarketId } from '@drift/common';
|
|
32
|
+
*
|
|
33
|
+
* const pollingDlob = new PollingDlob({
|
|
34
|
+
* dlobServerHttpUrl: 'https://dlob.drift.trade',
|
|
35
|
+
* indicativeLiquidityEnabled: true
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Add different polling intervals
|
|
39
|
+
* pollingDlob.addInterval('live', 1, 100); // Every 1s with depth 100
|
|
40
|
+
* pollingDlob.addInterval('background', 3, 1); // Every 3s with depth 1
|
|
41
|
+
* pollingDlob.addInterval('idle', 30, 1); // Every 30s with depth 1
|
|
42
|
+
*
|
|
43
|
+
* // Add markets to intervals
|
|
44
|
+
* const perpMarket = MarketId.createPerpMarket(0);
|
|
45
|
+
* const spotMarket = MarketId.createSpotMarket(0);
|
|
46
|
+
*
|
|
47
|
+
* pollingDlob.addMarketToInterval('live', perpMarket);
|
|
48
|
+
* pollingDlob.addMarketToInterval('background', spotMarket);
|
|
49
|
+
*
|
|
50
|
+
* // Subscribe to data updates
|
|
51
|
+
* pollingDlob.onData().subscribe(marketData => {
|
|
52
|
+
* marketData.forEach(({ marketId, data, intervalId }) => {
|
|
53
|
+
* console.log(`Market ${marketId.key} data from ${intervalId}:`, data);
|
|
54
|
+
* });
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* // Subscribe to errors
|
|
58
|
+
* pollingDlob.onError().subscribe(error => {
|
|
59
|
+
* console.error('Polling error:', error);
|
|
60
|
+
* });
|
|
61
|
+
*
|
|
62
|
+
* // Start polling
|
|
63
|
+
* pollingDlob.start();
|
|
64
|
+
*
|
|
65
|
+
* // Stop when done
|
|
66
|
+
* // pollingDlob.stop();
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
class PollingDlob {
|
|
70
|
+
constructor(config) {
|
|
71
|
+
this.baseTickIntervalMs = 1000;
|
|
72
|
+
this.intervals = new Map();
|
|
73
|
+
this._marketToIntervalMap = new Map();
|
|
74
|
+
this.dataSubject = new rxjs_1.Subject();
|
|
75
|
+
this.errorSubject = new rxjs_1.Subject();
|
|
76
|
+
this.isStarted = false;
|
|
77
|
+
this.intervalHandle = null;
|
|
78
|
+
this.tickCounter = 0;
|
|
79
|
+
this.consecutiveEmptyResponseCount = 0;
|
|
80
|
+
this.consecutiveErrorCount = 0;
|
|
81
|
+
this.maxConsecutiveEmptyResponses = 3;
|
|
82
|
+
this.maxConsecutiveErrors = 5;
|
|
83
|
+
this.config = {
|
|
84
|
+
indicativeLiquidityEnabled: true,
|
|
85
|
+
...config,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
getPollingIntervalForMarket(marketKey) {
|
|
89
|
+
const intervalId = this._marketToIntervalMap.get(marketKey);
|
|
90
|
+
if (!intervalId) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
return this.intervals.get(intervalId);
|
|
94
|
+
}
|
|
95
|
+
addInterval(id, intervalMultiplier, depth) {
|
|
96
|
+
if (this.intervals.has(id)) {
|
|
97
|
+
throw new Error(`Interval with id '${id}' already exists`);
|
|
98
|
+
}
|
|
99
|
+
this.intervals.set(id, {
|
|
100
|
+
id,
|
|
101
|
+
intervalMultiplier,
|
|
102
|
+
depth,
|
|
103
|
+
markets: new Set(),
|
|
104
|
+
newlyAddedMarkets: new Set(),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
removeInterval(id) {
|
|
108
|
+
const interval = this.intervals.get(id);
|
|
109
|
+
if (!interval) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Remove all markets from this interval
|
|
113
|
+
interval.markets.forEach((market) => {
|
|
114
|
+
this._marketToIntervalMap.delete(market);
|
|
115
|
+
});
|
|
116
|
+
this.intervals.delete(id);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Add a market to an interval.
|
|
120
|
+
* If the market is already in an interval, it will be removed from the existing interval.
|
|
121
|
+
* Newly added markets will be polled on the next tick regardless of interval multiplier.
|
|
122
|
+
*/
|
|
123
|
+
addMarketToInterval(intervalId, marketKey) {
|
|
124
|
+
const interval = this.intervals.get(intervalId);
|
|
125
|
+
if (!interval) {
|
|
126
|
+
throw new Error(`Interval with id '${intervalId}' does not exist`);
|
|
127
|
+
}
|
|
128
|
+
// Remove market from any existing interval first
|
|
129
|
+
const existingIntervalId = this._marketToIntervalMap.get(marketKey);
|
|
130
|
+
if (existingIntervalId === intervalId) {
|
|
131
|
+
// market is already in the interval
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (existingIntervalId) {
|
|
135
|
+
this.removeMarketFromInterval(existingIntervalId, marketKey);
|
|
136
|
+
}
|
|
137
|
+
interval.markets.add(marketKey);
|
|
138
|
+
// Mark as newly added so it gets polled on the next tick
|
|
139
|
+
interval.newlyAddedMarkets.add(marketKey);
|
|
140
|
+
this._marketToIntervalMap.set(marketKey, intervalId);
|
|
141
|
+
}
|
|
142
|
+
addMarketsToInterval(intervalId, marketKeys) {
|
|
143
|
+
for (const marketKey of marketKeys) {
|
|
144
|
+
this.addMarketToInterval(intervalId, marketKey);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
removeMarketFromInterval(intervalId, marketKey) {
|
|
148
|
+
const interval = this.intervals.get(intervalId);
|
|
149
|
+
if (!interval) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
interval.markets.delete(marketKey);
|
|
153
|
+
interval.newlyAddedMarkets.delete(marketKey);
|
|
154
|
+
this._marketToIntervalMap.delete(marketKey);
|
|
155
|
+
}
|
|
156
|
+
getMarketInterval(marketKey) {
|
|
157
|
+
return this._marketToIntervalMap.get(marketKey);
|
|
158
|
+
}
|
|
159
|
+
onData() {
|
|
160
|
+
return this.dataSubject.asObservable();
|
|
161
|
+
}
|
|
162
|
+
onError() {
|
|
163
|
+
return this.errorSubject.asObservable();
|
|
164
|
+
}
|
|
165
|
+
start() {
|
|
166
|
+
if (this.isStarted) {
|
|
167
|
+
return Promise.resolve();
|
|
168
|
+
}
|
|
169
|
+
this.isStarted = true;
|
|
170
|
+
this.tickCounter = 0;
|
|
171
|
+
const firstTickPromise = this.tick();
|
|
172
|
+
this.intervalHandle = setInterval(() => {
|
|
173
|
+
this.tick();
|
|
174
|
+
}, this.baseTickIntervalMs);
|
|
175
|
+
return firstTickPromise;
|
|
176
|
+
}
|
|
177
|
+
stop() {
|
|
178
|
+
if (!this.isStarted) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.isStarted = false;
|
|
182
|
+
if (this.intervalHandle) {
|
|
183
|
+
clearInterval(this.intervalHandle);
|
|
184
|
+
this.intervalHandle = null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
isRunning() {
|
|
188
|
+
return this.isStarted;
|
|
189
|
+
}
|
|
190
|
+
getConfig() {
|
|
191
|
+
return { ...this.config };
|
|
192
|
+
}
|
|
193
|
+
updateConfig(newConfig) {
|
|
194
|
+
this.config = { ...this.config, ...newConfig };
|
|
195
|
+
}
|
|
196
|
+
getMarketCount() {
|
|
197
|
+
return this._marketToIntervalMap.size;
|
|
198
|
+
}
|
|
199
|
+
getIntervalCount() {
|
|
200
|
+
return this.intervals.size;
|
|
201
|
+
}
|
|
202
|
+
getAllMarkets() {
|
|
203
|
+
const allMarkets = [];
|
|
204
|
+
this.intervals.forEach((interval) => {
|
|
205
|
+
allMarkets.push(...Array.from(interval.markets));
|
|
206
|
+
});
|
|
207
|
+
return allMarkets;
|
|
208
|
+
}
|
|
209
|
+
getMarketsForInterval(intervalId) {
|
|
210
|
+
const interval = this.intervals.get(intervalId);
|
|
211
|
+
return interval ? Array.from(interval.markets) : [];
|
|
212
|
+
}
|
|
213
|
+
getStats() {
|
|
214
|
+
return {
|
|
215
|
+
isRunning: this.isStarted,
|
|
216
|
+
tickCounter: this.tickCounter,
|
|
217
|
+
intervalCount: this.intervals.size,
|
|
218
|
+
marketCount: this._marketToIntervalMap.size,
|
|
219
|
+
consecutiveEmptyResponses: this.consecutiveEmptyResponseCount,
|
|
220
|
+
consecutiveErrors: this.consecutiveErrorCount,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
resetErrorCounters() {
|
|
224
|
+
this.consecutiveEmptyResponseCount = 0;
|
|
225
|
+
this.consecutiveErrorCount = 0;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Factory method to create a PollingDlob with common interval configurations
|
|
229
|
+
*/
|
|
230
|
+
static createWithCommonIntervals(config) {
|
|
231
|
+
const pollingDlob = new PollingDlob(config);
|
|
232
|
+
// Add common intervals based on the original React hook
|
|
233
|
+
pollingDlob.addInterval(blockchain_1.PollingCategory.SELECTED_MARKET, exports.POLLING_INTERVALS.LIVE_MARKET, exports.POLLING_DEPTHS.ORDERBOOK);
|
|
234
|
+
pollingDlob.addInterval(blockchain_1.PollingCategory.USER_INVOLVED, exports.POLLING_INTERVALS.BACKGROUND_DEEP, exports.POLLING_DEPTHS.DEEP);
|
|
235
|
+
pollingDlob.addInterval(blockchain_1.PollingCategory.USER_NOT_INVOLVED, exports.POLLING_INTERVALS.BACKGROUND_SHALLOW, exports.POLLING_DEPTHS.SHALLOW);
|
|
236
|
+
return pollingDlob;
|
|
237
|
+
}
|
|
238
|
+
async tick() {
|
|
239
|
+
this.tickCounter++;
|
|
240
|
+
// Find intervals that should be polled this tick
|
|
241
|
+
const intervalsToPoll = Array.from(this.intervals.values()).filter((interval) => {
|
|
242
|
+
const hasMarkets = interval.markets.size > 0;
|
|
243
|
+
const hasNewlyAddedMarkets = interval.newlyAddedMarkets.size > 0;
|
|
244
|
+
const isFirstTick = this.tickCounter === 1;
|
|
245
|
+
const isRegularInterval = this.tickCounter % interval.intervalMultiplier === 0;
|
|
246
|
+
return (hasMarkets &&
|
|
247
|
+
(isFirstTick || isRegularInterval || hasNewlyAddedMarkets));
|
|
248
|
+
});
|
|
249
|
+
if (intervalsToPoll.length === 0) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
const allMarketPollingData = [];
|
|
254
|
+
// Combine all markets from different intervals into a single request
|
|
255
|
+
const combinedMarketRequests = [];
|
|
256
|
+
for (const interval of intervalsToPoll) {
|
|
257
|
+
const marketsArray = Array.from(interval.markets);
|
|
258
|
+
if (marketsArray.length === 0) {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
for (const marketKey of marketsArray) {
|
|
262
|
+
combinedMarketRequests.push({
|
|
263
|
+
marketId: MarketId_1.MarketId.getMarketIdFromKey(marketKey),
|
|
264
|
+
depth: interval.depth,
|
|
265
|
+
intervalMultiplier: interval.intervalMultiplier,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (combinedMarketRequests.length === 0) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// Make a single bulk fetch for all markets
|
|
273
|
+
const l2Data = await this.fetchBulkMarketL2Data(combinedMarketRequests.map((req) => ({
|
|
274
|
+
marketId: req.marketId,
|
|
275
|
+
depth: req.depth,
|
|
276
|
+
intervalMultiplier: req.intervalMultiplier,
|
|
277
|
+
})));
|
|
278
|
+
// Map the results back to MarketPollingData with correct interval IDs
|
|
279
|
+
const intervalData = l2Data.map((data, index) => ({
|
|
280
|
+
marketId: combinedMarketRequests[index].marketId,
|
|
281
|
+
data,
|
|
282
|
+
}));
|
|
283
|
+
allMarketPollingData.push(...intervalData);
|
|
284
|
+
if (allMarketPollingData.length > 0) {
|
|
285
|
+
this.consecutiveEmptyResponseCount = 0;
|
|
286
|
+
this.consecutiveErrorCount = 0;
|
|
287
|
+
this.dataSubject.next(allMarketPollingData);
|
|
288
|
+
// Clear newly added markets flags for intervals that were polled
|
|
289
|
+
intervalsToPoll.forEach((interval) => {
|
|
290
|
+
interval.newlyAddedMarkets.clear();
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.consecutiveEmptyResponseCount++;
|
|
295
|
+
if (this.consecutiveEmptyResponseCount >=
|
|
296
|
+
this.maxConsecutiveEmptyResponses) {
|
|
297
|
+
this.errorSubject.next(new Error(`Received ${this.maxConsecutiveEmptyResponses} consecutive empty responses`));
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
this.consecutiveErrorCount++;
|
|
303
|
+
const errorInstance = error instanceof Error ? error : new Error(String(error));
|
|
304
|
+
if (this.consecutiveErrorCount >= this.maxConsecutiveErrors) {
|
|
305
|
+
this.errorSubject.next(new Error(`Received ${this.maxConsecutiveErrors} consecutive errors. Latest: ${errorInstance.message}`));
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
this.errorSubject.next(errorInstance);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async fetchBulkMarketL2Data(markets) {
|
|
313
|
+
const fetchingParams = {
|
|
314
|
+
markets: markets.map((m) => {
|
|
315
|
+
var _a;
|
|
316
|
+
return ({
|
|
317
|
+
marketIndex: m.marketId.marketIndex,
|
|
318
|
+
marketType: m.marketId.marketTypeStr,
|
|
319
|
+
depth: m.depth,
|
|
320
|
+
includeVamm: m.marketId.isPerp,
|
|
321
|
+
includePhoenix: m.marketId.isSpot,
|
|
322
|
+
includeSerum: m.marketId.isSpot,
|
|
323
|
+
includeOpenbook: m.marketId.isSpot,
|
|
324
|
+
includeOracle: true,
|
|
325
|
+
includeIndicative: (_a = this.config.indicativeLiquidityEnabled) !== null && _a !== void 0 ? _a : false,
|
|
326
|
+
intervalMultiplier: m.intervalMultiplier,
|
|
327
|
+
});
|
|
328
|
+
}),
|
|
329
|
+
grouping: this.config.groupingSize,
|
|
330
|
+
};
|
|
331
|
+
return this.bulkDlobL2Fetcher(fetchingParams);
|
|
332
|
+
}
|
|
333
|
+
async bulkDlobL2Fetcher(params) {
|
|
334
|
+
const queryParamsMap = {
|
|
335
|
+
marketType: params.markets.map((market) => market.marketType).join(','),
|
|
336
|
+
marketIndex: params.markets.map((market) => market.marketIndex).join(','),
|
|
337
|
+
depth: params.markets.map((market) => market.depth).join(','),
|
|
338
|
+
includeVamm: params.markets.map((market) => market.includeVamm).join(','),
|
|
339
|
+
includePhoenix: params.markets
|
|
340
|
+
.map((market) => market.includePhoenix)
|
|
341
|
+
.join(','),
|
|
342
|
+
includeOpenbook: params.markets
|
|
343
|
+
.map((market) => market.includeOpenbook)
|
|
344
|
+
.join(','),
|
|
345
|
+
includeSerum: params.markets
|
|
346
|
+
.map((market) => market.includeSerum)
|
|
347
|
+
.join(','),
|
|
348
|
+
grouping: params.grouping
|
|
349
|
+
? params.markets.map(() => params.grouping).join(',')
|
|
350
|
+
: undefined,
|
|
351
|
+
includeOracle: params.markets
|
|
352
|
+
.map((market) => market.includeOracle)
|
|
353
|
+
.join(','),
|
|
354
|
+
includeIndicative: params.markets
|
|
355
|
+
.map((market) => market.includeIndicative)
|
|
356
|
+
.join(','),
|
|
357
|
+
};
|
|
358
|
+
const queryParams = this.encodeQueryParams(queryParamsMap);
|
|
359
|
+
// Use cached endpoint when exclusively fetching background markets
|
|
360
|
+
const useCachedEndpoint = !params.markets.some((market) => market.depth !== 1);
|
|
361
|
+
const endpoint = useCachedEndpoint
|
|
362
|
+
? `${this.config.driftDlobServerHttpUrl}/batchL2Cache`
|
|
363
|
+
: `${this.config.driftDlobServerHttpUrl}/batchL2`;
|
|
364
|
+
return new Promise((resolve, reject) => {
|
|
365
|
+
pollingSequenceGuard_1.PollingSequenceGuard.fetch(BACKGROUND_L2_POLLING_KEY, () => {
|
|
366
|
+
return fetch(`${endpoint}?${queryParams}`);
|
|
367
|
+
})
|
|
368
|
+
.then(async (response) => {
|
|
369
|
+
const responseData = await response.json();
|
|
370
|
+
const resultsArray = responseData.l2s;
|
|
371
|
+
const deserializedL2 = resultsArray.map(orderbook_1.deserializeL2Response);
|
|
372
|
+
resolve(deserializedL2);
|
|
373
|
+
})
|
|
374
|
+
.catch((error) => {
|
|
375
|
+
reject(error);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
encodeQueryParams(params) {
|
|
380
|
+
return Object.entries(params)
|
|
381
|
+
.filter(([_, value]) => value !== undefined)
|
|
382
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
383
|
+
.join('&');
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
exports.PollingDlob = PollingDlob;
|
|
387
|
+
//# sourceMappingURL=PollingDlob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PollingDlob.js","sourceRoot":"","sources":["../../../../src/drift/Drift/data/PollingDlob.ts"],"names":[],"mappings":"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","sourcesContent":["import { Subject, Observable } from 'rxjs';\nimport { MarketId, MarketKey } from '../../../types/MarketId';\nimport {\n\tL2WithOracleAndMarketData,\n\tRawL2Output,\n\tdeserializeL2Response,\n} from '../../../utils/orderbook';\nimport { PollingSequenceGuard } from '../../../utils/pollingSequenceGuard';\nimport { PollingCategory } from '../constants/blockchain';\n\nexport interface PollingConfig {\n\tdriftDlobServerHttpUrl: string;\n\tindicativeLiquidityEnabled?: boolean;\n\tgroupingSize?: number;\n}\n\nexport interface PollingInterval {\n\tid: string;\n\tintervalMultiplier: number;\n\tdepth: number;\n\tmarkets: Set<MarketKey>;\n\t/**\n\t * Used to track markets that were added to an interval in the current tick, so that they get polled on the next tick regardless of interval multiplier.\n\t * Otherwise, they would only get polled on the next interval, which could be a long time if the interval multiplier is high.\n\t */\n\tnewlyAddedMarkets: Set<MarketKey>;\n}\n\nexport interface MarketPollingData {\n\tmarketId: MarketId;\n\tdata: L2WithOracleAndMarketData;\n}\n\nexport interface BulkL2FetchingQueryParams {\n\tmarketIndex: number;\n\tmarketType: string;\n\tdepth: number;\n\tincludeVamm: boolean;\n\tincludePhoenix: boolean;\n\tincludeOpenbook: boolean;\n\tincludeSerum: boolean;\n\tincludeOracle: boolean;\n\tincludeIndicative: boolean;\n}\n\nexport interface BulkL2FetchingParams {\n\tmarkets: (BulkL2FetchingQueryParams & { intervalMultiplier: number })[];\n\tgrouping?: number;\n}\n\nconst BACKGROUND_L2_POLLING_KEY = Symbol('BACKGROUND_L2_POLLING_KEY');\n\n// Predefined interval multipliers from the original React hook\nexport const POLLING_INTERVALS = {\n\tLIVE_MARKET: 1,\n\tBACKGROUND_DEEP: 3, // Can be configured to 2 for interim usage\n\tBACKGROUND_SHALLOW: 30,\n\tIDLE_1: 30,\n\tIDLE_2: 60,\n} as const;\n\nexport const POLLING_DEPTHS = {\n\tSHALLOW: 1,\n\tDEEP: 1,\n\tORDERBOOK: 100,\n} as const;\n\n/**\n * PollingDlob - A configurable market data polling system.\n * The Drift DLOB (decentralized limit orderbook) server stores the current live state of the orderbook\n * across all Drift markets. This class is used to poll the DLOB server for the markets' current mark price,\n * while oracle price data is also provided alongside.\n *\n * Example usage:\n * ```typescript\n * import { PollingDlob, MarketId } from '@drift/common';\n *\n * const pollingDlob = new PollingDlob({\n * dlobServerHttpUrl: 'https://dlob.drift.trade',\n * indicativeLiquidityEnabled: true\n * });\n *\n * // Add different polling intervals\n * pollingDlob.addInterval('live', 1, 100); // Every 1s with depth 100\n * pollingDlob.addInterval('background', 3, 1); // Every 3s with depth 1\n * pollingDlob.addInterval('idle', 30, 1); // Every 30s with depth 1\n *\n * // Add markets to intervals\n * const perpMarket = MarketId.createPerpMarket(0);\n * const spotMarket = MarketId.createSpotMarket(0);\n *\n * pollingDlob.addMarketToInterval('live', perpMarket);\n * pollingDlob.addMarketToInterval('background', spotMarket);\n *\n * // Subscribe to data updates\n * pollingDlob.onData().subscribe(marketData => {\n * marketData.forEach(({ marketId, data, intervalId }) => {\n * console.log(`Market ${marketId.key} data from ${intervalId}:`, data);\n * });\n * });\n *\n * // Subscribe to errors\n * pollingDlob.onError().subscribe(error => {\n * console.error('Polling error:', error);\n * });\n *\n * // Start polling\n * pollingDlob.start();\n *\n * // Stop when done\n * // pollingDlob.stop();\n * ```\n */\n\nexport class PollingDlob {\n\tprivate config: PollingConfig;\n\tprivate baseTickIntervalMs = 1000;\n\tprivate intervals: Map<string, PollingInterval> = new Map();\n\tprivate _marketToIntervalMap: Map<MarketKey, string> = new Map();\n\tprivate dataSubject: Subject<MarketPollingData[]> = new Subject();\n\tprivate errorSubject: Subject<Error> = new Subject();\n\tprivate isStarted = false;\n\tprivate intervalHandle: NodeJS.Timeout | null = null;\n\tprivate tickCounter = 0;\n\tprivate consecutiveEmptyResponseCount = 0;\n\tprivate consecutiveErrorCount = 0;\n\tprivate readonly maxConsecutiveEmptyResponses = 3;\n\tprivate readonly maxConsecutiveErrors = 5;\n\n\tconstructor(config: PollingConfig) {\n\t\tthis.config = {\n\t\t\tindicativeLiquidityEnabled: true,\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic getPollingIntervalForMarket(\n\t\tmarketKey: MarketKey\n\t): PollingInterval | undefined {\n\t\tconst intervalId = this._marketToIntervalMap.get(marketKey);\n\t\tif (!intervalId) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn this.intervals.get(intervalId);\n\t}\n\n\tpublic addInterval(\n\t\tid: string,\n\t\tintervalMultiplier: number,\n\t\tdepth: number\n\t): void {\n\t\tif (this.intervals.has(id)) {\n\t\t\tthrow new Error(`Interval with id '${id}' already exists`);\n\t\t}\n\n\t\tthis.intervals.set(id, {\n\t\t\tid,\n\t\t\tintervalMultiplier,\n\t\t\tdepth,\n\t\t\tmarkets: new Set(),\n\t\t\tnewlyAddedMarkets: new Set(),\n\t\t});\n\t}\n\n\tpublic removeInterval(id: string): void {\n\t\tconst interval = this.intervals.get(id);\n\t\tif (!interval) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove all markets from this interval\n\t\tinterval.markets.forEach((market) => {\n\t\t\tthis._marketToIntervalMap.delete(market);\n\t\t});\n\n\t\tthis.intervals.delete(id);\n\t}\n\n\t/**\n\t * Add a market to an interval.\n\t * If the market is already in an interval, it will be removed from the existing interval.\n\t * Newly added markets will be polled on the next tick regardless of interval multiplier.\n\t */\n\tpublic addMarketToInterval(intervalId: string, marketKey: MarketKey): void {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\tif (!interval) {\n\t\t\tthrow new Error(`Interval with id '${intervalId}' does not exist`);\n\t\t}\n\n\t\t// Remove market from any existing interval first\n\t\tconst existingIntervalId = this._marketToIntervalMap.get(marketKey);\n\n\t\tif (existingIntervalId === intervalId) {\n\t\t\t// market is already in the interval\n\t\t\treturn;\n\t\t}\n\n\t\tif (existingIntervalId) {\n\t\t\tthis.removeMarketFromInterval(existingIntervalId, marketKey);\n\t\t}\n\n\t\tinterval.markets.add(marketKey);\n\t\t// Mark as newly added so it gets polled on the next tick\n\t\tinterval.newlyAddedMarkets.add(marketKey);\n\t\tthis._marketToIntervalMap.set(marketKey, intervalId);\n\t}\n\n\tpublic addMarketsToInterval(\n\t\tintervalId: string,\n\t\tmarketKeys: MarketKey[]\n\t): void {\n\t\tfor (const marketKey of marketKeys) {\n\t\t\tthis.addMarketToInterval(intervalId, marketKey);\n\t\t}\n\t}\n\n\tpublic removeMarketFromInterval(\n\t\tintervalId: string,\n\t\tmarketKey: MarketKey\n\t): void {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\tif (!interval) {\n\t\t\treturn;\n\t\t}\n\n\t\tinterval.markets.delete(marketKey);\n\t\tinterval.newlyAddedMarkets.delete(marketKey);\n\t\tthis._marketToIntervalMap.delete(marketKey);\n\t}\n\n\tpublic getMarketInterval(marketKey: MarketKey): string | undefined {\n\t\treturn this._marketToIntervalMap.get(marketKey);\n\t}\n\n\tpublic onData(): Observable<MarketPollingData[]> {\n\t\treturn this.dataSubject.asObservable();\n\t}\n\n\tpublic onError(): Observable<Error> {\n\t\treturn this.errorSubject.asObservable();\n\t}\n\n\tpublic start(): Promise<void> {\n\t\tif (this.isStarted) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tthis.isStarted = true;\n\t\tthis.tickCounter = 0;\n\n\t\tconst firstTickPromise = this.tick();\n\n\t\tthis.intervalHandle = setInterval(() => {\n\t\t\tthis.tick();\n\t\t}, this.baseTickIntervalMs);\n\n\t\treturn firstTickPromise;\n\t}\n\n\tpublic stop(): void {\n\t\tif (!this.isStarted) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isStarted = false;\n\n\t\tif (this.intervalHandle) {\n\t\t\tclearInterval(this.intervalHandle);\n\t\t\tthis.intervalHandle = null;\n\t\t}\n\t}\n\n\tpublic isRunning(): boolean {\n\t\treturn this.isStarted;\n\t}\n\n\tpublic getConfig(): PollingConfig {\n\t\treturn { ...this.config };\n\t}\n\n\tpublic updateConfig(newConfig: Partial<PollingConfig>): void {\n\t\tthis.config = { ...this.config, ...newConfig };\n\t}\n\n\tpublic getMarketCount(): number {\n\t\treturn this._marketToIntervalMap.size;\n\t}\n\n\tpublic getIntervalCount(): number {\n\t\treturn this.intervals.size;\n\t}\n\n\tpublic getAllMarkets(): MarketKey[] {\n\t\tconst allMarkets: MarketKey[] = [];\n\t\tthis.intervals.forEach((interval) => {\n\t\t\tallMarkets.push(...Array.from(interval.markets));\n\t\t});\n\t\treturn allMarkets;\n\t}\n\n\tpublic getMarketsForInterval(intervalId: string): MarketKey[] {\n\t\tconst interval = this.intervals.get(intervalId);\n\t\treturn interval ? Array.from(interval.markets) : [];\n\t}\n\n\tpublic getStats(): {\n\t\tisRunning: boolean;\n\t\ttickCounter: number;\n\t\tintervalCount: number;\n\t\tmarketCount: number;\n\t\tconsecutiveEmptyResponses: number;\n\t\tconsecutiveErrors: number;\n\t} {\n\t\treturn {\n\t\t\tisRunning: this.isStarted,\n\t\t\ttickCounter: this.tickCounter,\n\t\t\tintervalCount: this.intervals.size,\n\t\t\tmarketCount: this._marketToIntervalMap.size,\n\t\t\tconsecutiveEmptyResponses: this.consecutiveEmptyResponseCount,\n\t\t\tconsecutiveErrors: this.consecutiveErrorCount,\n\t\t};\n\t}\n\n\tpublic resetErrorCounters(): void {\n\t\tthis.consecutiveEmptyResponseCount = 0;\n\t\tthis.consecutiveErrorCount = 0;\n\t}\n\n\t/**\n\t * Factory method to create a PollingDlob with common interval configurations\n\t */\n\tpublic static createWithCommonIntervals(config: PollingConfig): PollingDlob {\n\t\tconst pollingDlob = new PollingDlob(config);\n\n\t\t// Add common intervals based on the original React hook\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.SELECTED_MARKET,\n\t\t\tPOLLING_INTERVALS.LIVE_MARKET,\n\t\t\tPOLLING_DEPTHS.ORDERBOOK\n\t\t);\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.USER_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_DEEP,\n\t\t\tPOLLING_DEPTHS.DEEP\n\t\t);\n\t\tpollingDlob.addInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_SHALLOW,\n\t\t\tPOLLING_DEPTHS.SHALLOW\n\t\t);\n\n\t\treturn pollingDlob;\n\t}\n\n\tprivate async tick(): Promise<void> {\n\t\tthis.tickCounter++;\n\n\t\t// Find intervals that should be polled this tick\n\t\tconst intervalsToPoll = Array.from(this.intervals.values()).filter(\n\t\t\t(interval) => {\n\t\t\t\tconst hasMarkets = interval.markets.size > 0;\n\t\t\t\tconst hasNewlyAddedMarkets = interval.newlyAddedMarkets.size > 0;\n\t\t\t\tconst isFirstTick = this.tickCounter === 1;\n\t\t\t\tconst isRegularInterval =\n\t\t\t\t\tthis.tickCounter % interval.intervalMultiplier === 0;\n\n\t\t\t\treturn (\n\t\t\t\t\thasMarkets &&\n\t\t\t\t\t(isFirstTick || isRegularInterval || hasNewlyAddedMarkets)\n\t\t\t\t);\n\t\t\t}\n\t\t);\n\n\t\tif (intervalsToPoll.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst allMarketPollingData: MarketPollingData[] = [];\n\n\t\t\t// Combine all markets from different intervals into a single request\n\t\t\tconst combinedMarketRequests: {\n\t\t\t\tmarketId: MarketId;\n\t\t\t\tdepth: number;\n\t\t\t\tintervalMultiplier: number;\n\t\t\t}[] = [];\n\n\t\t\tfor (const interval of intervalsToPoll) {\n\t\t\t\tconst marketsArray = Array.from(interval.markets);\n\t\t\t\tif (marketsArray.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (const marketKey of marketsArray) {\n\t\t\t\t\tcombinedMarketRequests.push({\n\t\t\t\t\t\tmarketId: MarketId.getMarketIdFromKey(marketKey),\n\t\t\t\t\t\tdepth: interval.depth,\n\t\t\t\t\t\tintervalMultiplier: interval.intervalMultiplier,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (combinedMarketRequests.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make a single bulk fetch for all markets\n\t\t\tconst l2Data = await this.fetchBulkMarketL2Data(\n\t\t\t\tcombinedMarketRequests.map((req) => ({\n\t\t\t\t\tmarketId: req.marketId,\n\t\t\t\t\tdepth: req.depth,\n\t\t\t\t\tintervalMultiplier: req.intervalMultiplier,\n\t\t\t\t}))\n\t\t\t);\n\n\t\t\t// Map the results back to MarketPollingData with correct interval IDs\n\t\t\tconst intervalData: MarketPollingData[] = l2Data.map((data, index) => ({\n\t\t\t\tmarketId: combinedMarketRequests[index].marketId,\n\t\t\t\tdata,\n\t\t\t}));\n\n\t\t\tallMarketPollingData.push(...intervalData);\n\n\t\t\tif (allMarketPollingData.length > 0) {\n\t\t\t\tthis.consecutiveEmptyResponseCount = 0;\n\t\t\t\tthis.consecutiveErrorCount = 0;\n\t\t\t\tthis.dataSubject.next(allMarketPollingData);\n\n\t\t\t\t// Clear newly added markets flags for intervals that were polled\n\t\t\t\tintervalsToPoll.forEach((interval) => {\n\t\t\t\t\tinterval.newlyAddedMarkets.clear();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.consecutiveEmptyResponseCount++;\n\t\t\t\tif (\n\t\t\t\t\tthis.consecutiveEmptyResponseCount >=\n\t\t\t\t\tthis.maxConsecutiveEmptyResponses\n\t\t\t\t) {\n\t\t\t\t\tthis.errorSubject.next(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Received ${this.maxConsecutiveEmptyResponses} consecutive empty responses`\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.consecutiveErrorCount++;\n\t\t\tconst errorInstance =\n\t\t\t\terror instanceof Error ? error : new Error(String(error));\n\n\t\t\tif (this.consecutiveErrorCount >= this.maxConsecutiveErrors) {\n\t\t\t\tthis.errorSubject.next(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Received ${this.maxConsecutiveErrors} consecutive errors. Latest: ${errorInstance.message}`\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.errorSubject.next(errorInstance);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async fetchBulkMarketL2Data(\n\t\tmarkets: {\n\t\t\tmarketId: MarketId;\n\t\t\tdepth: number;\n\t\t\tintervalMultiplier: number;\n\t\t}[]\n\t): Promise<L2WithOracleAndMarketData[]> {\n\t\tconst fetchingParams: BulkL2FetchingParams = {\n\t\t\tmarkets: markets.map((m) => ({\n\t\t\t\tmarketIndex: m.marketId.marketIndex,\n\t\t\t\tmarketType: m.marketId.marketTypeStr,\n\t\t\t\tdepth: m.depth,\n\t\t\t\tincludeVamm: m.marketId.isPerp,\n\t\t\t\tincludePhoenix: m.marketId.isSpot,\n\t\t\t\tincludeSerum: m.marketId.isSpot,\n\t\t\t\tincludeOpenbook: m.marketId.isSpot,\n\t\t\t\tincludeOracle: true,\n\t\t\t\tincludeIndicative: this.config.indicativeLiquidityEnabled ?? false,\n\t\t\t\tintervalMultiplier: m.intervalMultiplier,\n\t\t\t})),\n\t\t\tgrouping: this.config.groupingSize,\n\t\t};\n\n\t\treturn this.bulkDlobL2Fetcher(fetchingParams);\n\t}\n\n\tprivate async bulkDlobL2Fetcher(\n\t\tparams: BulkL2FetchingParams\n\t): Promise<L2WithOracleAndMarketData[]> {\n\t\tconst queryParamsMap: {\n\t\t\t[K in keyof BulkL2FetchingQueryParams]: string;\n\t\t} & {\n\t\t\tgrouping?: string;\n\t\t} = {\n\t\t\tmarketType: params.markets.map((market) => market.marketType).join(','),\n\t\t\tmarketIndex: params.markets.map((market) => market.marketIndex).join(','),\n\t\t\tdepth: params.markets.map((market) => market.depth).join(','),\n\t\t\tincludeVamm: params.markets.map((market) => market.includeVamm).join(','),\n\t\t\tincludePhoenix: params.markets\n\t\t\t\t.map((market) => market.includePhoenix)\n\t\t\t\t.join(','),\n\t\t\tincludeOpenbook: params.markets\n\t\t\t\t.map((market) => market.includeOpenbook)\n\t\t\t\t.join(','),\n\t\t\tincludeSerum: params.markets\n\t\t\t\t.map((market) => market.includeSerum)\n\t\t\t\t.join(','),\n\t\t\tgrouping: params.grouping\n\t\t\t\t? params.markets.map(() => params.grouping).join(',')\n\t\t\t\t: undefined,\n\t\t\tincludeOracle: params.markets\n\t\t\t\t.map((market) => market.includeOracle)\n\t\t\t\t.join(','),\n\t\t\tincludeIndicative: params.markets\n\t\t\t\t.map((market) => market.includeIndicative)\n\t\t\t\t.join(','),\n\t\t};\n\n\t\tconst queryParams = this.encodeQueryParams(queryParamsMap);\n\n\t\t// Use cached endpoint when exclusively fetching background markets\n\t\tconst useCachedEndpoint = !params.markets.some(\n\t\t\t(market) => market.depth !== 1\n\t\t);\n\n\t\tconst endpoint = useCachedEndpoint\n\t\t\t? `${this.config.driftDlobServerHttpUrl}/batchL2Cache`\n\t\t\t: `${this.config.driftDlobServerHttpUrl}/batchL2`;\n\n\t\treturn new Promise<L2WithOracleAndMarketData[]>((resolve, reject) => {\n\t\t\tPollingSequenceGuard.fetch(BACKGROUND_L2_POLLING_KEY, () => {\n\t\t\t\treturn fetch(`${endpoint}?${queryParams}`);\n\t\t\t})\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tconst responseData = await response.json();\n\t\t\t\t\tconst resultsArray = responseData.l2s as RawL2Output[];\n\t\t\t\t\tconst deserializedL2 = resultsArray.map(deserializeL2Response);\n\t\t\t\t\tresolve(deserializedL2);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t});\n\t}\n\n\tprivate encodeQueryParams(\n\t\tparams: Record<string, string | undefined>\n\t): string {\n\t\treturn Object.entries(params)\n\t\t\t.filter(([_, value]) => value !== undefined)\n\t\t\t.map(\n\t\t\t\t([key, value]) =>\n\t\t\t\t\t`${encodeURIComponent(key)}=${encodeURIComponent(value!)}`\n\t\t\t)\n\t\t\t.join('&');\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PollingDlob';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./PollingDlob"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/drift/Drift/data/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B","sourcesContent":["export * from './PollingDlob';\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./clients"), exports);
|
|
18
|
+
__exportStar(require("./constants"), exports);
|
|
19
|
+
__exportStar(require("./data"), exports);
|
|
20
|
+
__exportStar(require("./stores"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|