@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,56 @@
|
|
|
1
|
+
import { BN, BigNum, DriftClient, PositionDirection, User } from '@drift-labs/sdk';
|
|
2
|
+
import { MarketId, UIOrderType } from 'src/types';
|
|
3
|
+
/**
|
|
4
|
+
* Checks if a given order amount represents an entire position order
|
|
5
|
+
* by comparing it with MAX_LEVERAGE_ORDER_SIZE
|
|
6
|
+
* @param orderAmount - The BigNum order amount to check
|
|
7
|
+
* @returns true if the order is for the entire position, false otherwise
|
|
8
|
+
*/
|
|
9
|
+
export declare const isEntirePositionOrder: (orderAmount: BigNum) => boolean;
|
|
10
|
+
export declare const TRADING_UTILS: {
|
|
11
|
+
calculatePnlPctFromPosition: (pnl: BN, quoteEntryAmount: BN, leverage?: number) => number;
|
|
12
|
+
calculatePotentialProfit: (props: {
|
|
13
|
+
currentPositionSize: BigNum;
|
|
14
|
+
currentPositionDirection: PositionDirection;
|
|
15
|
+
currentPositionEntryPrice: BigNum;
|
|
16
|
+
tradeDirection: PositionDirection;
|
|
17
|
+
/**
|
|
18
|
+
* Amount of position being closed in base asset size
|
|
19
|
+
*/
|
|
20
|
+
exitBaseSize: BigNum;
|
|
21
|
+
/**
|
|
22
|
+
* Either the user's limit price (for limit orders) or the estimated exit price (for market orders)
|
|
23
|
+
*/
|
|
24
|
+
exitPrice: BigNum;
|
|
25
|
+
takerFeeBps: number;
|
|
26
|
+
slippageTolerance?: number;
|
|
27
|
+
isMarketOrder?: boolean;
|
|
28
|
+
}) => {
|
|
29
|
+
estimatedProfit: BigNum;
|
|
30
|
+
estimatedProfitBeforeFees: BigNum;
|
|
31
|
+
estimatedTakerFee: BigNum;
|
|
32
|
+
notionalSizeAtEntry: BigNum;
|
|
33
|
+
notionalSizeAtExit: BigNum;
|
|
34
|
+
};
|
|
35
|
+
calculateLiquidationPriceAfterPerpTrade: ({ estEntryPrice, orderType, perpMarketIndex, tradeBaseSize, isLong, userClient, oraclePrice, limitPrice, offsetCollateral, precision, isEnteringHighLeverageMode, capLiqPrice, }: {
|
|
36
|
+
estEntryPrice: BN;
|
|
37
|
+
orderType: UIOrderType;
|
|
38
|
+
perpMarketIndex: number;
|
|
39
|
+
tradeBaseSize: BN;
|
|
40
|
+
isLong: boolean;
|
|
41
|
+
userClient: User;
|
|
42
|
+
oraclePrice: BN;
|
|
43
|
+
limitPrice?: BN;
|
|
44
|
+
offsetCollateral?: BN;
|
|
45
|
+
precision?: number;
|
|
46
|
+
isEnteringHighLeverageMode?: boolean;
|
|
47
|
+
capLiqPrice?: boolean;
|
|
48
|
+
}) => number;
|
|
49
|
+
checkIsMarketOrderType: (orderType: UIOrderType) => boolean;
|
|
50
|
+
convertLeverageToMarginRatio: (leverage: number) => number | undefined;
|
|
51
|
+
getMarketTickSize: (driftClient: DriftClient, marketId: MarketId) => BN;
|
|
52
|
+
getMarketTickSizeDecimals: (driftClient: DriftClient, marketId: MarketId) => number;
|
|
53
|
+
getMarketStepSize: (driftClient: DriftClient, marketId: MarketId) => BN;
|
|
54
|
+
getMarketStepSizeDecimals: (driftClient: DriftClient, marketId: MarketId) => number;
|
|
55
|
+
isEntirePositionOrder: (orderAmount: BigNum) => boolean;
|
|
56
|
+
};
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TRADING_UTILS = exports.isEntirePositionOrder = void 0;
|
|
4
|
+
const sdk_1 = require("@drift-labs/sdk");
|
|
5
|
+
const calculatePnlPctFromPosition = (pnl, quoteEntryAmount, leverage) => {
|
|
6
|
+
if (!quoteEntryAmount || quoteEntryAmount.eq(sdk_1.ZERO))
|
|
7
|
+
return 0;
|
|
8
|
+
return (sdk_1.BigNum.from(pnl, sdk_1.QUOTE_PRECISION_EXP)
|
|
9
|
+
.shift(5)
|
|
10
|
+
.div(sdk_1.BigNum.from(quoteEntryAmount.abs(), sdk_1.QUOTE_PRECISION_EXP))
|
|
11
|
+
.toNum() *
|
|
12
|
+
100 *
|
|
13
|
+
(leverage !== null && leverage !== void 0 ? leverage : 1));
|
|
14
|
+
};
|
|
15
|
+
const POTENTIAL_PROFIT_DEFAULT_STATE = {
|
|
16
|
+
estimatedProfit: sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP),
|
|
17
|
+
estimatedProfitBeforeFees: sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP),
|
|
18
|
+
estimatedTakerFee: sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP),
|
|
19
|
+
notionalSizeAtEntry: sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP),
|
|
20
|
+
notionalSizeAtExit: sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP),
|
|
21
|
+
};
|
|
22
|
+
const calculatePotentialProfit = (props) => {
|
|
23
|
+
let estimatedProfit = sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP);
|
|
24
|
+
let estimatedProfitBeforeFees = sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP);
|
|
25
|
+
let estimatedTakerFee = sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP);
|
|
26
|
+
let notionalSizeAtEntry = sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP);
|
|
27
|
+
let notionalSizeAtExit = sdk_1.BigNum.zero(sdk_1.PRICE_PRECISION_EXP);
|
|
28
|
+
const isClosingLong = (0, sdk_1.isVariant)(props.currentPositionDirection, 'long') &&
|
|
29
|
+
(0, sdk_1.isVariant)(props.tradeDirection, 'short');
|
|
30
|
+
const isClosingShort = (0, sdk_1.isVariant)(props.currentPositionDirection, 'short') &&
|
|
31
|
+
(0, sdk_1.isVariant)(props.tradeDirection, 'long');
|
|
32
|
+
if (!isClosingLong && !isClosingShort)
|
|
33
|
+
return POTENTIAL_PROFIT_DEFAULT_STATE;
|
|
34
|
+
if (!props.exitBaseSize)
|
|
35
|
+
return POTENTIAL_PROFIT_DEFAULT_STATE;
|
|
36
|
+
if (props.exitBaseSize.eqZero() ||
|
|
37
|
+
props.currentPositionSize.lt(props.exitBaseSize)) {
|
|
38
|
+
return POTENTIAL_PROFIT_DEFAULT_STATE;
|
|
39
|
+
}
|
|
40
|
+
const baseSizeBeingClosed = props.exitBaseSize.lte(props.currentPositionSize)
|
|
41
|
+
? props.exitBaseSize
|
|
42
|
+
: props.currentPositionSize;
|
|
43
|
+
// Notional size of amount being closed at entry and exit
|
|
44
|
+
notionalSizeAtEntry = baseSizeBeingClosed.mul(props.currentPositionEntryPrice.shiftTo(baseSizeBeingClosed.precision));
|
|
45
|
+
notionalSizeAtExit = baseSizeBeingClosed.mul(props.exitPrice.shiftTo(baseSizeBeingClosed.precision));
|
|
46
|
+
if (isClosingLong) {
|
|
47
|
+
estimatedProfitBeforeFees = notionalSizeAtExit.sub(notionalSizeAtEntry);
|
|
48
|
+
}
|
|
49
|
+
else if (isClosingShort) {
|
|
50
|
+
estimatedProfitBeforeFees = notionalSizeAtEntry.sub(notionalSizeAtExit);
|
|
51
|
+
}
|
|
52
|
+
// subtract takerFee if applicable
|
|
53
|
+
if (props.takerFeeBps > 0) {
|
|
54
|
+
const takerFeeDenominator = Math.floor(100 / (props.takerFeeBps * 0.01));
|
|
55
|
+
estimatedTakerFee = notionalSizeAtExit.scale(1, takerFeeDenominator);
|
|
56
|
+
estimatedProfit = estimatedProfitBeforeFees.sub(estimatedTakerFee.shiftTo(estimatedProfitBeforeFees.precision));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
estimatedProfit = estimatedProfitBeforeFees;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
estimatedProfit,
|
|
63
|
+
estimatedProfitBeforeFees,
|
|
64
|
+
estimatedTakerFee,
|
|
65
|
+
notionalSizeAtEntry,
|
|
66
|
+
notionalSizeAtExit,
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Check if the order type is a market order or oracle market order
|
|
71
|
+
*/
|
|
72
|
+
const checkIsMarketOrderType = (orderType) => {
|
|
73
|
+
return orderType === 'market' || orderType === 'oracle';
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Calculate the liquidation price of a position after a trade. Requires DriftClient to be subscribed.
|
|
77
|
+
* If the order type is limit order, a limit price must be provided.
|
|
78
|
+
*/
|
|
79
|
+
const calculateLiquidationPriceAfterPerpTrade = ({ estEntryPrice, orderType, perpMarketIndex, tradeBaseSize, isLong, userClient, oraclePrice, limitPrice, offsetCollateral, precision = 2, isEnteringHighLeverageMode, capLiqPrice, }) => {
|
|
80
|
+
var _a, _b;
|
|
81
|
+
const ALLOWED_ORDER_TYPES = [
|
|
82
|
+
'limit',
|
|
83
|
+
'market',
|
|
84
|
+
'oracle',
|
|
85
|
+
'stopMarket',
|
|
86
|
+
'stopLimit',
|
|
87
|
+
'oracleLimit',
|
|
88
|
+
];
|
|
89
|
+
if (!ALLOWED_ORDER_TYPES.includes(orderType)) {
|
|
90
|
+
console.error('Invalid order type for perp trade liquidation price calculation', orderType);
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
if (orderType === 'limit' && !limitPrice) {
|
|
94
|
+
console.error('Limit order must have a limit price for perp trade liquidation price calculation');
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
const signedBaseSize = isLong ? tradeBaseSize : tradeBaseSize.neg();
|
|
98
|
+
const priceToUse = [
|
|
99
|
+
'limit',
|
|
100
|
+
'stopMarket',
|
|
101
|
+
'stopLimit',
|
|
102
|
+
'oracleLimit',
|
|
103
|
+
].includes(orderType)
|
|
104
|
+
? limitPrice
|
|
105
|
+
: estEntryPrice;
|
|
106
|
+
const liqPriceBn = userClient.liquidationPrice(perpMarketIndex, signedBaseSize, priceToUse, undefined, undefined, // we can exclude open orders since open orders will be cancelled first (which results in reducing account leverage) before actual liquidation
|
|
107
|
+
offsetCollateral, isEnteringHighLeverageMode);
|
|
108
|
+
if (liqPriceBn.isNeg()) {
|
|
109
|
+
// means no liquidation price
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
// Check if user has a spot position using the same oracle as the perp market
|
|
113
|
+
// If so, force capLiqPrice to be false to avoid incorrect price capping
|
|
114
|
+
// Technically in this case, liq price could be lower for a short or higher for a long
|
|
115
|
+
const perpMarketOracle = (_b = (_a = userClient.driftClient.getPerpMarketAccount(perpMarketIndex)) === null || _a === void 0 ? void 0 : _a.amm) === null || _b === void 0 ? void 0 : _b.oracle;
|
|
116
|
+
const spotMarketWithSameOracle = userClient.driftClient
|
|
117
|
+
.getSpotMarketAccounts()
|
|
118
|
+
.find((market) => market.oracle.equals(perpMarketOracle));
|
|
119
|
+
let hasSpotPositionWithSameOracle = false;
|
|
120
|
+
if (spotMarketWithSameOracle) {
|
|
121
|
+
const spotPosition = userClient.getSpotPosition(spotMarketWithSameOracle.marketIndex);
|
|
122
|
+
hasSpotPositionWithSameOracle = !!spotPosition;
|
|
123
|
+
}
|
|
124
|
+
const effectiveCapLiqPrice = hasSpotPositionWithSameOracle
|
|
125
|
+
? false
|
|
126
|
+
: capLiqPrice;
|
|
127
|
+
const cappedLiqPriceBn = effectiveCapLiqPrice
|
|
128
|
+
? isLong
|
|
129
|
+
? sdk_1.BN.min(liqPriceBn, oraclePrice)
|
|
130
|
+
: sdk_1.BN.max(liqPriceBn, oraclePrice)
|
|
131
|
+
: liqPriceBn;
|
|
132
|
+
const liqPriceBigNum = sdk_1.BigNum.from(cappedLiqPriceBn, sdk_1.PRICE_PRECISION_EXP);
|
|
133
|
+
const liqPriceNum = Math.round(liqPriceBigNum.toNum() * 10 ** precision) / 10 ** precision;
|
|
134
|
+
return liqPriceNum;
|
|
135
|
+
};
|
|
136
|
+
const convertLeverageToMarginRatio = (leverage) => {
|
|
137
|
+
if (!leverage)
|
|
138
|
+
return undefined;
|
|
139
|
+
return (1 / leverage) * sdk_1.MARGIN_PRECISION.toNumber();
|
|
140
|
+
};
|
|
141
|
+
const getMarketTickSize = (driftClient, marketId) => {
|
|
142
|
+
const marketAccount = marketId.isPerp
|
|
143
|
+
? driftClient.getPerpMarketAccount(marketId.marketIndex)
|
|
144
|
+
: driftClient.getSpotMarketAccount(marketId.marketIndex);
|
|
145
|
+
if (!marketAccount)
|
|
146
|
+
return sdk_1.ZERO;
|
|
147
|
+
if (marketId.isPerp) {
|
|
148
|
+
return marketAccount.amm.orderTickSize;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
return marketAccount.orderTickSize;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const getMarketTickSizeDecimals = (driftClient, marketId) => {
|
|
155
|
+
const tickSize = getMarketTickSize(driftClient, marketId);
|
|
156
|
+
const decimalPlaces = Math.max(0, Math.floor(Math.log10(sdk_1.PRICE_PRECISION.div(tickSize.eq(sdk_1.ZERO) ? sdk_1.ONE : tickSize).toNumber())));
|
|
157
|
+
return decimalPlaces;
|
|
158
|
+
};
|
|
159
|
+
const getMarketStepSize = (driftClient, marketId) => {
|
|
160
|
+
const marketAccount = marketId.isPerp
|
|
161
|
+
? driftClient.getPerpMarketAccount(marketId.marketIndex)
|
|
162
|
+
: driftClient.getSpotMarketAccount(marketId.marketIndex);
|
|
163
|
+
if (!marketAccount)
|
|
164
|
+
return sdk_1.ZERO;
|
|
165
|
+
if (marketId.isPerp) {
|
|
166
|
+
return marketAccount.amm.orderStepSize;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return marketAccount.orderStepSize;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
const getMarketStepSizeDecimals = (driftClient, marketId) => {
|
|
173
|
+
const stepSize = getMarketStepSize(driftClient, marketId);
|
|
174
|
+
const decimalPlaces = Math.max(0, Math.floor(Math.log10(sdk_1.AMM_RESERVE_PRECISION.div(stepSize.eq(sdk_1.ZERO) ? sdk_1.ONE : stepSize).toNumber())));
|
|
175
|
+
return decimalPlaces;
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Checks if a given order amount represents an entire position order
|
|
179
|
+
* by comparing it with MAX_LEVERAGE_ORDER_SIZE
|
|
180
|
+
* @param orderAmount - The BigNum order amount to check
|
|
181
|
+
* @returns true if the order is for the entire position, false otherwise
|
|
182
|
+
*/
|
|
183
|
+
const isEntirePositionOrder = (orderAmount) => {
|
|
184
|
+
const maxLeverageSize = new sdk_1.BigNum(sdk_1.MAX_LEVERAGE_ORDER_SIZE, orderAmount.precision);
|
|
185
|
+
return Math.abs(maxLeverageSize.sub(orderAmount).toNum()) < 1;
|
|
186
|
+
};
|
|
187
|
+
exports.isEntirePositionOrder = isEntirePositionOrder;
|
|
188
|
+
exports.TRADING_UTILS = {
|
|
189
|
+
calculatePnlPctFromPosition,
|
|
190
|
+
calculatePotentialProfit,
|
|
191
|
+
calculateLiquidationPriceAfterPerpTrade,
|
|
192
|
+
checkIsMarketOrderType,
|
|
193
|
+
convertLeverageToMarginRatio,
|
|
194
|
+
getMarketTickSize,
|
|
195
|
+
getMarketTickSizeDecimals,
|
|
196
|
+
getMarketStepSize,
|
|
197
|
+
getMarketStepSizeDecimals,
|
|
198
|
+
isEntirePositionOrder: exports.isEntirePositionOrder,
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=trading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trading.js","sourceRoot":"","sources":["../../src/common-ui-utils/trading.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tAMM_RESERVE_PRECISION,\n\tBN,\n\tBigNum,\n\tDriftClient,\n\tMARGIN_PRECISION,\n\tMAX_LEVERAGE_ORDER_SIZE,\n\tONE,\n\tPRICE_PRECISION,\n\tPRICE_PRECISION_EXP,\n\tPerpMarketAccount,\n\tPositionDirection,\n\tQUOTE_PRECISION_EXP,\n\tSpotMarketAccount,\n\tUser,\n\tZERO,\n\tisVariant,\n} from '@drift-labs/sdk';\nimport { MarketId, UIOrderType } from 'src/types';\n\nconst calculatePnlPctFromPosition = (\n\tpnl: BN,\n\tquoteEntryAmount: BN,\n\tleverage?: number\n): number => {\n\tif (!quoteEntryAmount || quoteEntryAmount.eq(ZERO)) return 0;\n\n\treturn (\n\t\tBigNum.from(pnl, QUOTE_PRECISION_EXP)\n\t\t\t.shift(5)\n\t\t\t.div(BigNum.from(quoteEntryAmount.abs(), QUOTE_PRECISION_EXP))\n\t\t\t.toNum() *\n\t\t100 *\n\t\t(leverage ?? 1)\n\t);\n};\n\nconst POTENTIAL_PROFIT_DEFAULT_STATE = {\n\testimatedProfit: BigNum.zero(PRICE_PRECISION_EXP),\n\testimatedProfitBeforeFees: BigNum.zero(PRICE_PRECISION_EXP),\n\testimatedTakerFee: BigNum.zero(PRICE_PRECISION_EXP),\n\tnotionalSizeAtEntry: BigNum.zero(PRICE_PRECISION_EXP),\n\tnotionalSizeAtExit: BigNum.zero(PRICE_PRECISION_EXP),\n};\n\nconst calculatePotentialProfit = (props: {\n\tcurrentPositionSize: BigNum;\n\tcurrentPositionDirection: PositionDirection;\n\tcurrentPositionEntryPrice: BigNum;\n\ttradeDirection: PositionDirection;\n\t/**\n\t * Amount of position being closed in base asset size\n\t */\n\texitBaseSize: BigNum;\n\t/**\n\t * Either the user's limit price (for limit orders) or the estimated exit price (for market orders)\n\t */\n\texitPrice: BigNum;\n\ttakerFeeBps: number;\n\tslippageTolerance?: number;\n\tisMarketOrder?: boolean;\n}): {\n\testimatedProfit: BigNum;\n\testimatedProfitBeforeFees: BigNum;\n\testimatedTakerFee: BigNum;\n\tnotionalSizeAtEntry: BigNum;\n\tnotionalSizeAtExit: BigNum;\n} => {\n\tlet estimatedProfit = BigNum.zero(PRICE_PRECISION_EXP);\n\tlet estimatedProfitBeforeFees = BigNum.zero(PRICE_PRECISION_EXP);\n\tlet estimatedTakerFee = BigNum.zero(PRICE_PRECISION_EXP);\n\tlet notionalSizeAtEntry = BigNum.zero(PRICE_PRECISION_EXP);\n\tlet notionalSizeAtExit = BigNum.zero(PRICE_PRECISION_EXP);\n\n\tconst isClosingLong =\n\t\tisVariant(props.currentPositionDirection, 'long') &&\n\t\tisVariant(props.tradeDirection, 'short');\n\tconst isClosingShort =\n\t\tisVariant(props.currentPositionDirection, 'short') &&\n\t\tisVariant(props.tradeDirection, 'long');\n\n\tif (!isClosingLong && !isClosingShort) return POTENTIAL_PROFIT_DEFAULT_STATE;\n\tif (!props.exitBaseSize) return POTENTIAL_PROFIT_DEFAULT_STATE;\n\n\tif (\n\t\tprops.exitBaseSize.eqZero() ||\n\t\tprops.currentPositionSize.lt(props.exitBaseSize)\n\t) {\n\t\treturn POTENTIAL_PROFIT_DEFAULT_STATE;\n\t}\n\n\tconst baseSizeBeingClosed = props.exitBaseSize.lte(props.currentPositionSize)\n\t\t? props.exitBaseSize\n\t\t: props.currentPositionSize;\n\n\t// Notional size of amount being closed at entry and exit\n\tnotionalSizeAtEntry = baseSizeBeingClosed.mul(\n\t\tprops.currentPositionEntryPrice.shiftTo(baseSizeBeingClosed.precision)\n\t);\n\tnotionalSizeAtExit = baseSizeBeingClosed.mul(\n\t\tprops.exitPrice.shiftTo(baseSizeBeingClosed.precision)\n\t);\n\n\tif (isClosingLong) {\n\t\testimatedProfitBeforeFees = notionalSizeAtExit.sub(notionalSizeAtEntry);\n\t} else if (isClosingShort) {\n\t\testimatedProfitBeforeFees = notionalSizeAtEntry.sub(notionalSizeAtExit);\n\t}\n\n\t// subtract takerFee if applicable\n\tif (props.takerFeeBps > 0) {\n\t\tconst takerFeeDenominator = Math.floor(100 / (props.takerFeeBps * 0.01));\n\t\testimatedTakerFee = notionalSizeAtExit.scale(1, takerFeeDenominator);\n\t\testimatedProfit = estimatedProfitBeforeFees.sub(\n\t\t\testimatedTakerFee.shiftTo(estimatedProfitBeforeFees.precision)\n\t\t);\n\t} else {\n\t\testimatedProfit = estimatedProfitBeforeFees;\n\t}\n\n\treturn {\n\t\testimatedProfit,\n\t\testimatedProfitBeforeFees,\n\t\testimatedTakerFee,\n\t\tnotionalSizeAtEntry,\n\t\tnotionalSizeAtExit,\n\t};\n};\n\n/**\n * Check if the order type is a market order or oracle market order\n */\nconst checkIsMarketOrderType = (orderType: UIOrderType) => {\n\treturn orderType === 'market' || orderType === 'oracle';\n};\n\n/**\n * Calculate the liquidation price of a position after a trade. Requires DriftClient to be subscribed.\n * If the order type is limit order, a limit price must be provided.\n */\nconst calculateLiquidationPriceAfterPerpTrade = ({\n\testEntryPrice,\n\torderType,\n\tperpMarketIndex,\n\ttradeBaseSize,\n\tisLong,\n\tuserClient,\n\toraclePrice,\n\tlimitPrice,\n\toffsetCollateral,\n\tprecision = 2,\n\tisEnteringHighLeverageMode,\n\tcapLiqPrice,\n}: {\n\testEntryPrice: BN;\n\torderType: UIOrderType;\n\tperpMarketIndex: number;\n\ttradeBaseSize: BN;\n\tisLong: boolean;\n\tuserClient: User;\n\toraclePrice: BN;\n\tlimitPrice?: BN;\n\toffsetCollateral?: BN;\n\tprecision?: number;\n\tisEnteringHighLeverageMode?: boolean;\n\tcapLiqPrice?: boolean;\n}) => {\n\tconst ALLOWED_ORDER_TYPES: UIOrderType[] = [\n\t\t'limit',\n\t\t'market',\n\t\t'oracle',\n\t\t'stopMarket',\n\t\t'stopLimit',\n\t\t'oracleLimit',\n\t];\n\n\tif (!ALLOWED_ORDER_TYPES.includes(orderType)) {\n\t\tconsole.error(\n\t\t\t'Invalid order type for perp trade liquidation price calculation',\n\t\t\torderType\n\t\t);\n\t\treturn 0;\n\t}\n\n\tif (orderType === 'limit' && !limitPrice) {\n\t\tconsole.error(\n\t\t\t'Limit order must have a limit price for perp trade liquidation price calculation'\n\t\t);\n\t\treturn 0;\n\t}\n\n\tconst signedBaseSize = isLong ? tradeBaseSize : tradeBaseSize.neg();\n\tconst priceToUse = [\n\t\t'limit',\n\t\t'stopMarket',\n\t\t'stopLimit',\n\t\t'oracleLimit',\n\t].includes(orderType)\n\t\t? limitPrice\n\t\t: estEntryPrice;\n\n\tconst liqPriceBn = userClient.liquidationPrice(\n\t\tperpMarketIndex,\n\t\tsignedBaseSize,\n\t\tpriceToUse,\n\t\tundefined,\n\t\tundefined, // we can exclude open orders since open orders will be cancelled first (which results in reducing account leverage) before actual liquidation\n\t\toffsetCollateral,\n\t\tisEnteringHighLeverageMode\n\t);\n\n\tif (liqPriceBn.isNeg()) {\n\t\t// means no liquidation price\n\t\treturn 0;\n\t}\n\n\t// Check if user has a spot position using the same oracle as the perp market\n\t// If so, force capLiqPrice to be false to avoid incorrect price capping\n\t// Technically in this case, liq price could be lower for a short or higher for a long\n\tconst perpMarketOracle =\n\t\tuserClient.driftClient.getPerpMarketAccount(perpMarketIndex)?.amm?.oracle;\n\n\tconst spotMarketWithSameOracle = userClient.driftClient\n\t\t.getSpotMarketAccounts()\n\t\t.find((market) => market.oracle.equals(perpMarketOracle));\n\n\tlet hasSpotPositionWithSameOracle = false;\n\tif (spotMarketWithSameOracle) {\n\t\tconst spotPosition = userClient.getSpotPosition(\n\t\t\tspotMarketWithSameOracle.marketIndex\n\t\t);\n\t\thasSpotPositionWithSameOracle = !!spotPosition;\n\t}\n\n\tconst effectiveCapLiqPrice = hasSpotPositionWithSameOracle\n\t\t? false\n\t\t: capLiqPrice;\n\n\tconst cappedLiqPriceBn = effectiveCapLiqPrice\n\t\t? isLong\n\t\t\t? BN.min(liqPriceBn, oraclePrice)\n\t\t\t: BN.max(liqPriceBn, oraclePrice)\n\t\t: liqPriceBn;\n\n\tconst liqPriceBigNum = BigNum.from(cappedLiqPriceBn, PRICE_PRECISION_EXP);\n\n\tconst liqPriceNum =\n\t\tMath.round(liqPriceBigNum.toNum() * 10 ** precision) / 10 ** precision;\n\n\treturn liqPriceNum;\n};\n\nconst convertLeverageToMarginRatio = (leverage: number): number | undefined => {\n\tif (!leverage) return undefined;\n\treturn (1 / leverage) * MARGIN_PRECISION.toNumber();\n};\n\nconst getMarketTickSize = (\n\tdriftClient: DriftClient,\n\tmarketId: MarketId\n): BN => {\n\tconst marketAccount = marketId.isPerp\n\t\t? driftClient.getPerpMarketAccount(marketId.marketIndex)\n\t\t: driftClient.getSpotMarketAccount(marketId.marketIndex);\n\tif (!marketAccount) return ZERO;\n\n\tif (marketId.isPerp) {\n\t\treturn (marketAccount as PerpMarketAccount).amm.orderTickSize;\n\t} else {\n\t\treturn (marketAccount as SpotMarketAccount).orderTickSize;\n\t}\n};\n\nconst getMarketTickSizeDecimals = (\n\tdriftClient: DriftClient,\n\tmarketId: MarketId\n) => {\n\tconst tickSize = getMarketTickSize(driftClient, marketId);\n\n\tconst decimalPlaces = Math.max(\n\t\t0,\n\t\tMath.floor(\n\t\t\tMath.log10(\n\t\t\t\tPRICE_PRECISION.div(tickSize.eq(ZERO) ? ONE : tickSize).toNumber()\n\t\t\t)\n\t\t)\n\t);\n\n\treturn decimalPlaces;\n};\n\nconst getMarketStepSize = (driftClient: DriftClient, marketId: MarketId) => {\n\tconst marketAccount = marketId.isPerp\n\t\t? driftClient.getPerpMarketAccount(marketId.marketIndex)\n\t\t: driftClient.getSpotMarketAccount(marketId.marketIndex);\n\tif (!marketAccount) return ZERO;\n\n\tif (marketId.isPerp) {\n\t\treturn (marketAccount as PerpMarketAccount).amm.orderStepSize;\n\t} else {\n\t\treturn (marketAccount as SpotMarketAccount).orderStepSize;\n\t}\n};\n\nconst getMarketStepSizeDecimals = (\n\tdriftClient: DriftClient,\n\tmarketId: MarketId\n) => {\n\tconst stepSize = getMarketStepSize(driftClient, marketId);\n\n\tconst decimalPlaces = Math.max(\n\t\t0,\n\t\tMath.floor(\n\t\t\tMath.log10(\n\t\t\t\tAMM_RESERVE_PRECISION.div(stepSize.eq(ZERO) ? ONE : stepSize).toNumber()\n\t\t\t)\n\t\t)\n\t);\n\n\treturn decimalPlaces;\n};\n\n/**\n * Checks if a given order amount represents an entire position order\n * by comparing it with MAX_LEVERAGE_ORDER_SIZE\n * @param orderAmount - The BigNum order amount to check\n * @returns true if the order is for the entire position, false otherwise\n */\nexport const isEntirePositionOrder = (orderAmount: BigNum): boolean => {\n\tconst maxLeverageSize = new BigNum(\n\t\tMAX_LEVERAGE_ORDER_SIZE,\n\t\torderAmount.precision\n\t);\n\treturn Math.abs(maxLeverageSize.sub(orderAmount).toNum()) < 1;\n};\n\nexport const TRADING_UTILS = {\n\tcalculatePnlPctFromPosition,\n\tcalculatePotentialProfit,\n\tcalculateLiquidationPriceAfterPerpTrade,\n\tcheckIsMarketOrderType,\n\tconvertLeverageToMarginRatio,\n\tgetMarketTickSize,\n\tgetMarketTickSizeDecimals,\n\tgetMarketStepSize,\n\tgetMarketStepSizeDecimals,\n\tisEntirePositionOrder,\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BN, DriftClient, PerpMarketConfig, PerpPosition, PublicKey, User } from '@drift-labs/sdk';
|
|
2
|
+
import { OpenPosition } from '../types';
|
|
3
|
+
export declare const USER_UTILS: {
|
|
4
|
+
getOpenPositionData: (driftClient: DriftClient, userPositions: PerpPosition[], user: User, perpMarketLookup: PerpMarketConfig[], markPriceCallback?: (marketIndex: number) => BN) => OpenPosition[];
|
|
5
|
+
checkIfUserAccountExists: (driftClient: DriftClient, config: {
|
|
6
|
+
type: 'userPubKey';
|
|
7
|
+
userPubKey: PublicKey;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'subAccountId';
|
|
10
|
+
subAccountId: number;
|
|
11
|
+
authority: PublicKey;
|
|
12
|
+
}) => Promise<boolean>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.USER_UTILS = void 0;
|
|
4
|
+
const sdk_1 = require("@drift-labs/sdk");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const trading_1 = require("./trading");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
const getOpenPositionData = (driftClient, userPositions, user, perpMarketLookup, markPriceCallback) => {
|
|
9
|
+
const oracleGuardRails = driftClient.getStateAccount().oracleGuardRails;
|
|
10
|
+
const newResult = userPositions
|
|
11
|
+
.filter((position) => !position.baseAssetAmount.eq(sdk_1.ZERO) ||
|
|
12
|
+
!position.quoteAssetAmount.eq(sdk_1.ZERO) ||
|
|
13
|
+
!position.lpShares.eq(sdk_1.ZERO))
|
|
14
|
+
.map((position) => {
|
|
15
|
+
var _a, _b, _c;
|
|
16
|
+
const perpMarketConfig = perpMarketLookup[position.marketIndex];
|
|
17
|
+
const perpMarket = driftClient.getPerpMarketAccount(position.marketIndex);
|
|
18
|
+
const usdcSpotMarket = driftClient.getSpotMarketAccount(sdk_1.QUOTE_SPOT_MARKET_INDEX);
|
|
19
|
+
const oraclePriceData = driftClient.getOracleDataForPerpMarket(position.marketIndex);
|
|
20
|
+
let oraclePrice = oraclePriceData.price;
|
|
21
|
+
// mark price fetched with a callback so we don't need extra dlob server calls. fallback to oracle
|
|
22
|
+
let markPrice = markPriceCallback
|
|
23
|
+
? (_a = markPriceCallback(position.marketIndex)) !== null && _a !== void 0 ? _a : oraclePriceData.price
|
|
24
|
+
: oraclePriceData.price;
|
|
25
|
+
let estExitPrice = user.getPositionEstimatedExitPriceAndPnl(position, position.baseAssetAmount)[0];
|
|
26
|
+
const entryPrice = (0, sdk_1.calculateEntryPrice)(position);
|
|
27
|
+
const isShort = position.baseAssetAmount.isNeg();
|
|
28
|
+
if (types_1.UIMarket.checkIsPredictionMarket(perpMarketConfig)) {
|
|
29
|
+
const isResolved = utils_1.ENUM_UTILS.match(perpMarket === null || perpMarket === void 0 ? void 0 : perpMarket.status, sdk_1.MarketStatus.SETTLEMENT) ||
|
|
30
|
+
utils_1.ENUM_UTILS.match(perpMarket === null || perpMarket === void 0 ? void 0 : perpMarket.status, sdk_1.MarketStatus.DELISTED);
|
|
31
|
+
if (isResolved) {
|
|
32
|
+
const resolvedToNo = perpMarket.expiryPrice.lte(sdk_1.ZERO.add(perpMarket.amm.orderTickSize));
|
|
33
|
+
const price = resolvedToNo
|
|
34
|
+
? sdk_1.ZERO.mul(sdk_1.PRICE_PRECISION)
|
|
35
|
+
: sdk_1.ONE.mul(sdk_1.PRICE_PRECISION);
|
|
36
|
+
estExitPrice = price;
|
|
37
|
+
markPrice = price;
|
|
38
|
+
oraclePrice = price;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// if for any reason oracle or mark price blips to 0, fallback to the other one so we don't show a crazy pnl
|
|
42
|
+
if (markPrice.lte(sdk_1.ZERO) && oraclePrice.gt(sdk_1.ZERO)) {
|
|
43
|
+
markPrice = oraclePrice;
|
|
44
|
+
}
|
|
45
|
+
if (oraclePrice.lte(sdk_1.ZERO) && markPrice.gt(sdk_1.ZERO)) {
|
|
46
|
+
oraclePrice = markPrice;
|
|
47
|
+
}
|
|
48
|
+
const pnlVsMark = trading_1.TRADING_UTILS.calculatePotentialProfit({
|
|
49
|
+
currentPositionSize: sdk_1.BigNum.from(position.baseAssetAmount.abs(), sdk_1.BASE_PRECISION_EXP),
|
|
50
|
+
currentPositionDirection: isShort
|
|
51
|
+
? sdk_1.PositionDirection.SHORT
|
|
52
|
+
: sdk_1.PositionDirection.LONG,
|
|
53
|
+
currentPositionEntryPrice: sdk_1.BigNum.from(entryPrice, sdk_1.PRICE_PRECISION_EXP),
|
|
54
|
+
tradeDirection: isShort
|
|
55
|
+
? sdk_1.PositionDirection.LONG
|
|
56
|
+
: sdk_1.PositionDirection.SHORT,
|
|
57
|
+
exitBaseSize: sdk_1.BigNum.from(position.baseAssetAmount.abs(), sdk_1.BASE_PRECISION_EXP),
|
|
58
|
+
exitPrice: sdk_1.BigNum.from(markPrice, sdk_1.PRICE_PRECISION_EXP),
|
|
59
|
+
takerFeeBps: 0,
|
|
60
|
+
}).estimatedProfit.shiftTo(sdk_1.QUOTE_PRECISION_EXP).val;
|
|
61
|
+
const pnlVsOracle = trading_1.TRADING_UTILS.calculatePotentialProfit({
|
|
62
|
+
currentPositionSize: sdk_1.BigNum.from(position.baseAssetAmount.abs(), sdk_1.BASE_PRECISION_EXP),
|
|
63
|
+
currentPositionDirection: isShort
|
|
64
|
+
? sdk_1.PositionDirection.SHORT
|
|
65
|
+
: sdk_1.PositionDirection.LONG,
|
|
66
|
+
currentPositionEntryPrice: sdk_1.BigNum.from(entryPrice, sdk_1.PRICE_PRECISION_EXP),
|
|
67
|
+
tradeDirection: isShort
|
|
68
|
+
? sdk_1.PositionDirection.LONG
|
|
69
|
+
: sdk_1.PositionDirection.SHORT,
|
|
70
|
+
exitBaseSize: sdk_1.BigNum.from(position.baseAssetAmount.abs(), sdk_1.BASE_PRECISION_EXP),
|
|
71
|
+
exitPrice: sdk_1.BigNum.from(oraclePrice, sdk_1.PRICE_PRECISION_EXP),
|
|
72
|
+
takerFeeBps: 0,
|
|
73
|
+
}).estimatedProfit.shiftTo(sdk_1.QUOTE_PRECISION_EXP).val;
|
|
74
|
+
return {
|
|
75
|
+
marketIndex: position.marketIndex,
|
|
76
|
+
marketSymbol: perpMarketConfig.symbol,
|
|
77
|
+
direction: isShort ? 'short' : 'long',
|
|
78
|
+
notional: user
|
|
79
|
+
.getPerpPositionValue(position.marketIndex, oraclePriceData)
|
|
80
|
+
.abs(),
|
|
81
|
+
baseSize: position.baseAssetAmount,
|
|
82
|
+
markPrice,
|
|
83
|
+
entryPrice,
|
|
84
|
+
exitPrice: estExitPrice,
|
|
85
|
+
liqPrice: user.liquidationPrice(position.marketIndex, sdk_1.ZERO),
|
|
86
|
+
quoteAssetNotionalAmount: position.quoteAssetAmount,
|
|
87
|
+
quoteEntryAmount: position.quoteEntryAmount,
|
|
88
|
+
quoteBreakEvenAmount: position.quoteBreakEvenAmount,
|
|
89
|
+
pnlVsMark,
|
|
90
|
+
pnlVsOracle,
|
|
91
|
+
unsettledPnl: (0, sdk_1.calculateClaimablePnl)(perpMarket, usdcSpotMarket, position, oraclePriceData),
|
|
92
|
+
unsettledFundingPnl: (0, sdk_1.calculateUnsettledFundingPnl)(perpMarket, position),
|
|
93
|
+
// Includes both settled and unsettled funding as well as fees
|
|
94
|
+
feesAndFundingPnl: (0, sdk_1.calculateFeesAndFundingPnl)(perpMarket, position),
|
|
95
|
+
totalUnrealizedPnl: (0, sdk_1.calculatePositionPNL)(perpMarket, position, true, oraclePriceData),
|
|
96
|
+
unrealizedFundingPnl: user.getUnrealizedFundingPNL(position.marketIndex),
|
|
97
|
+
lastCumulativeFundingRate: position.lastCumulativeFundingRate,
|
|
98
|
+
openOrders: position.openOrders,
|
|
99
|
+
costBasis: (0, sdk_1.calculateCostBasis)(position),
|
|
100
|
+
realizedPnl: position.settledPnl,
|
|
101
|
+
pnlIsClaimable: (0, sdk_1.isOracleValid)(perpMarket, oraclePriceData, oracleGuardRails, (_b = perpMarket.amm.lastUpdateSlot) === null || _b === void 0 ? void 0 : _b.toNumber()),
|
|
102
|
+
lpShares: position.lpShares,
|
|
103
|
+
remainderBaseAmount: (_c = position.remainderBaseAssetAmount) !== null && _c !== void 0 ? _c : 0,
|
|
104
|
+
lpDeriskPrice: user.liquidationPrice(position.marketIndex, undefined, undefined, 'Initial', true),
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
return newResult;
|
|
108
|
+
};
|
|
109
|
+
const checkIfUserAccountExists = async (driftClient, config) => {
|
|
110
|
+
let userPubKey;
|
|
111
|
+
if (config.type === 'userPubKey') {
|
|
112
|
+
userPubKey = config.userPubKey;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
userPubKey = (0, sdk_1.getUserAccountPublicKeySync)(driftClient.program.programId, config.authority, config.subAccountId);
|
|
116
|
+
}
|
|
117
|
+
const accountInfo = await driftClient.connection.getAccountInfo(userPubKey);
|
|
118
|
+
return accountInfo !== null;
|
|
119
|
+
};
|
|
120
|
+
exports.USER_UTILS = {
|
|
121
|
+
getOpenPositionData,
|
|
122
|
+
checkIfUserAccountExists,
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/common-ui-utils/user.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBASE_PRECISION_EXP,\n\tBN,\n\tBigNum,\n\tDriftClient,\n\tMarketStatus,\n\tONE,\n\tPRICE_PRECISION,\n\tPRICE_PRECISION_EXP,\n\tPerpMarketConfig,\n\tPerpPosition,\n\tPositionDirection,\n\tPublicKey,\n\tQUOTE_PRECISION_EXP,\n\tQUOTE_SPOT_MARKET_INDEX,\n\tUser,\n\tZERO,\n\tcalculateClaimablePnl,\n\tcalculateCostBasis,\n\tcalculateEntryPrice,\n\tcalculateFeesAndFundingPnl,\n\tcalculatePositionPNL,\n\tgetUserAccountPublicKeySync,\n\tcalculateUnsettledFundingPnl,\n\tisOracleValid,\n} from '@drift-labs/sdk';\nimport { OpenPosition, UIMarket } from '../types';\nimport { TRADING_UTILS } from './trading';\nimport { ENUM_UTILS } from '../utils';\n\nconst getOpenPositionData = (\n\tdriftClient: DriftClient,\n\tuserPositions: PerpPosition[],\n\tuser: User,\n\tperpMarketLookup: PerpMarketConfig[],\n\tmarkPriceCallback?: (marketIndex: number) => BN\n): OpenPosition[] => {\n\tconst oracleGuardRails = driftClient.getStateAccount().oracleGuardRails;\n\n\tconst newResult: OpenPosition[] = userPositions\n\t\t.filter(\n\t\t\t(position) =>\n\t\t\t\t!position.baseAssetAmount.eq(ZERO) ||\n\t\t\t\t!position.quoteAssetAmount.eq(ZERO) ||\n\t\t\t\t!position.lpShares.eq(ZERO)\n\t\t)\n\t\t.map((position) => {\n\t\t\tconst perpMarketConfig = perpMarketLookup[position.marketIndex];\n\t\t\tconst perpMarket = driftClient.getPerpMarketAccount(position.marketIndex);\n\n\t\t\tconst usdcSpotMarket = driftClient.getSpotMarketAccount(\n\t\t\t\tQUOTE_SPOT_MARKET_INDEX\n\t\t\t);\n\n\t\t\tconst oraclePriceData = driftClient.getOracleDataForPerpMarket(\n\t\t\t\tposition.marketIndex\n\t\t\t);\n\n\t\t\tlet oraclePrice = oraclePriceData.price;\n\n\t\t\t// mark price fetched with a callback so we don't need extra dlob server calls. fallback to oracle\n\t\t\tlet markPrice = markPriceCallback\n\t\t\t\t? markPriceCallback(position.marketIndex) ?? oraclePriceData.price\n\t\t\t\t: oraclePriceData.price;\n\n\t\t\tlet estExitPrice = user.getPositionEstimatedExitPriceAndPnl(\n\t\t\t\tposition,\n\t\t\t\tposition.baseAssetAmount\n\t\t\t)[0];\n\n\t\t\tconst entryPrice = calculateEntryPrice(position);\n\n\t\t\tconst isShort = position.baseAssetAmount.isNeg();\n\n\t\t\tif (UIMarket.checkIsPredictionMarket(perpMarketConfig)) {\n\t\t\t\tconst isResolved =\n\t\t\t\t\tENUM_UTILS.match(perpMarket?.status, MarketStatus.SETTLEMENT) ||\n\t\t\t\t\tENUM_UTILS.match(perpMarket?.status, MarketStatus.DELISTED);\n\n\t\t\t\tif (isResolved) {\n\t\t\t\t\tconst resolvedToNo = perpMarket.expiryPrice.lte(\n\t\t\t\t\t\tZERO.add(perpMarket.amm.orderTickSize)\n\t\t\t\t\t);\n\n\t\t\t\t\tconst price = resolvedToNo\n\t\t\t\t\t\t? ZERO.mul(PRICE_PRECISION)\n\t\t\t\t\t\t: ONE.mul(PRICE_PRECISION);\n\n\t\t\t\t\testExitPrice = price;\n\t\t\t\t\tmarkPrice = price;\n\t\t\t\t\toraclePrice = price;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if for any reason oracle or mark price blips to 0, fallback to the other one so we don't show a crazy pnl\n\t\t\tif (markPrice.lte(ZERO) && oraclePrice.gt(ZERO)) {\n\t\t\t\tmarkPrice = oraclePrice;\n\t\t\t}\n\n\t\t\tif (oraclePrice.lte(ZERO) && markPrice.gt(ZERO)) {\n\t\t\t\toraclePrice = markPrice;\n\t\t\t}\n\n\t\t\tconst pnlVsMark = TRADING_UTILS.calculatePotentialProfit({\n\t\t\t\tcurrentPositionSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\tcurrentPositionDirection: isShort\n\t\t\t\t\t? PositionDirection.SHORT\n\t\t\t\t\t: PositionDirection.LONG,\n\t\t\t\tcurrentPositionEntryPrice: BigNum.from(entryPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttradeDirection: isShort\n\t\t\t\t\t? PositionDirection.LONG\n\t\t\t\t\t: PositionDirection.SHORT,\n\t\t\t\texitBaseSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\texitPrice: BigNum.from(markPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttakerFeeBps: 0,\n\t\t\t}).estimatedProfit.shiftTo(QUOTE_PRECISION_EXP).val;\n\n\t\t\tconst pnlVsOracle = TRADING_UTILS.calculatePotentialProfit({\n\t\t\t\tcurrentPositionSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\tcurrentPositionDirection: isShort\n\t\t\t\t\t? PositionDirection.SHORT\n\t\t\t\t\t: PositionDirection.LONG,\n\t\t\t\tcurrentPositionEntryPrice: BigNum.from(entryPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttradeDirection: isShort\n\t\t\t\t\t? PositionDirection.LONG\n\t\t\t\t\t: PositionDirection.SHORT,\n\t\t\t\texitBaseSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\texitPrice: BigNum.from(oraclePrice, PRICE_PRECISION_EXP),\n\t\t\t\ttakerFeeBps: 0,\n\t\t\t}).estimatedProfit.shiftTo(QUOTE_PRECISION_EXP).val;\n\n\t\t\treturn {\n\t\t\t\tmarketIndex: position.marketIndex,\n\t\t\t\tmarketSymbol: perpMarketConfig.symbol,\n\t\t\t\tdirection: isShort ? 'short' : 'long',\n\t\t\t\tnotional: user\n\t\t\t\t\t.getPerpPositionValue(position.marketIndex, oraclePriceData)\n\t\t\t\t\t.abs(),\n\t\t\t\tbaseSize: position.baseAssetAmount,\n\t\t\t\tmarkPrice,\n\t\t\t\tentryPrice,\n\t\t\t\texitPrice: estExitPrice,\n\t\t\t\tliqPrice: user.liquidationPrice(position.marketIndex, ZERO),\n\t\t\t\tquoteAssetNotionalAmount: position.quoteAssetAmount,\n\t\t\t\tquoteEntryAmount: position.quoteEntryAmount,\n\t\t\t\tquoteBreakEvenAmount: position.quoteBreakEvenAmount,\n\t\t\t\tpnlVsMark,\n\t\t\t\tpnlVsOracle,\n\t\t\t\tunsettledPnl: calculateClaimablePnl(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\tusdcSpotMarket,\n\t\t\t\t\tposition,\n\t\t\t\t\toraclePriceData\n\t\t\t\t),\n\t\t\t\tunsettledFundingPnl: calculateUnsettledFundingPnl(perpMarket, position),\n\t\t\t\t// Includes both settled and unsettled funding as well as fees\n\t\t\t\tfeesAndFundingPnl: calculateFeesAndFundingPnl(perpMarket, position),\n\t\t\t\ttotalUnrealizedPnl: calculatePositionPNL(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\tposition,\n\t\t\t\t\ttrue,\n\t\t\t\t\toraclePriceData\n\t\t\t\t),\n\t\t\t\tunrealizedFundingPnl: user.getUnrealizedFundingPNL(\n\t\t\t\t\tposition.marketIndex\n\t\t\t\t),\n\t\t\t\tlastCumulativeFundingRate: position.lastCumulativeFundingRate,\n\t\t\t\topenOrders: position.openOrders,\n\t\t\t\tcostBasis: calculateCostBasis(position),\n\t\t\t\trealizedPnl: position.settledPnl,\n\t\t\t\tpnlIsClaimable: isOracleValid(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\toraclePriceData,\n\t\t\t\t\toracleGuardRails,\n\t\t\t\t\tperpMarket.amm.lastUpdateSlot?.toNumber()\n\t\t\t\t),\n\t\t\t\tlpShares: position.lpShares,\n\t\t\t\tremainderBaseAmount: position.remainderBaseAssetAmount ?? 0,\n\t\t\t\tlpDeriskPrice: user.liquidationPrice(\n\t\t\t\t\tposition.marketIndex,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t'Initial',\n\t\t\t\t\ttrue\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\n\treturn newResult;\n};\n\nconst checkIfUserAccountExists = async (\n\tdriftClient: DriftClient,\n\tconfig:\n\t\t| {\n\t\t\t\ttype: 'userPubKey';\n\t\t\t\tuserPubKey: PublicKey;\n\t\t }\n\t\t| {\n\t\t\t\ttype: 'subAccountId';\n\t\t\t\tsubAccountId: number;\n\t\t\t\tauthority: PublicKey;\n\t\t }\n) => {\n\tlet userPubKey: PublicKey;\n\n\tif (config.type === 'userPubKey') {\n\t\tuserPubKey = config.userPubKey;\n\t} else {\n\t\tuserPubKey = getUserAccountPublicKeySync(\n\t\t\tdriftClient.program.programId,\n\t\t\tconfig.authority,\n\t\t\tconfig.subAccountId\n\t\t);\n\t}\n\n\tconst accountInfo = await driftClient.connection.getAccountInfo(userPubKey);\n\n\treturn accountInfo !== null;\n};\n\nexport const USER_UTILS = {\n\tgetOpenPositionData,\n\tcheckIfUserAccountExists,\n};\n"]}
|