@drift-labs/common 1.0.13 → 1.0.16
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/clients/DlobWebsocketClient.d.ts +82 -0
- package/lib/clients/DlobWebsocketClient.js +226 -0
- package/lib/clients/DlobWebsocketClient.js.map +1 -0
- package/lib/clients/swiftClient.js +1 -0
- package/lib/clients/swiftClient.js.map +1 -1
- package/lib/common-ui-utils/commonUiUtils.d.ts +22 -3
- package/lib/common-ui-utils/commonUiUtils.js +15 -8
- package/lib/common-ui-utils/commonUiUtils.js.map +1 -1
- package/lib/common-ui-utils/market.d.ts +5 -0
- package/lib/common-ui-utils/market.js +19 -11
- package/lib/common-ui-utils/market.js.map +1 -1
- package/lib/common-ui-utils/order.d.ts +8 -1
- package/lib/common-ui-utils/order.js +3 -2
- package/lib/common-ui-utils/order.js.map +1 -1
- package/lib/common-ui-utils/user.d.ts +5 -0
- package/lib/common-ui-utils/user.js +58 -3
- package/lib/common-ui-utils/user.js.map +1 -1
- package/lib/constants/markets.d.ts +4 -0
- package/lib/constants/markets.js +5 -1
- package/lib/constants/markets.js.map +1 -1
- package/lib/constants/superstake.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
- package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +3 -2
- package/lib/drift/Drift/clients/CentralServerDrift/index.js +52 -49
- package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
- package/lib/drift/Drift/data/PollingDlob.d.ts +1 -1
- package/lib/drift/Drift/data/PollingDlob.js.map +1 -1
- package/lib/drift/base/actions/trade/editOrder.d.ts +3 -0
- package/lib/drift/base/actions/trade/editOrder.js.map +1 -1
- package/lib/drift/base/actions/trade/index.d.ts +1 -0
- package/lib/drift/base/actions/trade/index.js +1 -0
- package/lib/drift/base/actions/trade/index.js.map +1 -1
- package/lib/drift/base/actions/trade/margin.d.ts +24 -0
- package/lib/drift/base/actions/trade/margin.js +48 -0
- package/lib/drift/base/actions/trade/margin.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/auction.d.ts +3 -1
- package/lib/drift/base/actions/trade/openPerpOrder/auction.js +2 -2
- package/lib/drift/base/actions/trade/openPerpOrder/auction.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.d.ts +2 -6
- package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +6 -3
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +6 -6
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +2 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +3 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +2 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/swap.d.ts +18 -11
- package/lib/drift/base/actions/trade/swap.js +40 -17
- package/lib/drift/base/actions/trade/swap.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/utils/MultiplexWebSocket.d.ts +4 -2
- package/lib/utils/MultiplexWebSocket.js +18 -9
- package/lib/utils/MultiplexWebSocket.js.map +1 -1
- package/lib/utils/ResultSlotIncrementer.d.ts +31 -0
- package/lib/utils/ResultSlotIncrementer.js +83 -0
- package/lib/utils/ResultSlotIncrementer.js.map +1 -0
- package/lib/utils/index.d.ts +3 -1
- package/lib/utils/index.js +7 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/math.js +1 -1
- package/lib/utils/math.js.map +1 -1
- package/lib/utils/orderbook/constants.d.ts +2 -0
- package/lib/utils/orderbook/constants.js +5 -0
- package/lib/utils/orderbook/constants.js.map +1 -0
- package/lib/utils/orderbook/index.d.ts +38 -59
- package/lib/utils/orderbook/index.js +285 -1
- package/lib/utils/orderbook/index.js.map +1 -1
- package/lib/utils/orderbook/types.d.ts +101 -0
- package/lib/utils/orderbook/types.js +9 -0
- package/lib/utils/orderbook/types.js.map +1 -0
- package/lib/utils/signedMsgs.d.ts +1 -0
- package/lib/utils/signedMsgs.js +10 -0
- package/lib/utils/signedMsgs.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +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\tmaxMarginRatio: position.maxMarginRatio,\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"]}
|
|
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\tAMM_RESERVE_PRECISION,\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: position.baseAssetAmount\n\t\t\t\t\t.abs()\n\t\t\t\t\t.mul(markPrice)\n\t\t\t\t\t.div(AMM_RESERVE_PRECISION),\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\tmaxMarginRatio: position.maxMarginRatio,\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\n/**\n * A user's max leverage for a market is stored on-chain in the `PerpPosition` struct of the `UserAccount`.\n * There are a few scenarios for how a market's max leverage is defined:\n *\n * 1. When the user does not have a position (\"empty\" or not) in the market in their `UserAccount` data,\n * and creates an order for the market, an \"empty\" `PerpPosition` will be added to the `UserAccount` data,\n * and will contain the max margin ratio set by the user. Note that the `UserAccount` data can store up\n * to 8 `PerpPosition` structs, and most of the time the majority of the `PerpPosition` structs will be\n * \"empty\" if the user does not have the max 8 perp positions open.\n *\n * 2. When the user has a position (\"empty\" or not), the max margin ratio is retrieved from the `PerpPosition` struct.\n *\n * 3. When the user does not have a position (\"empty\" or not), it is expected of the UI to store and persist\n * the max leverage in the UI client.\n *\n * 4. In cases where the user has a position before the market max leverage feature was shipped, the\n * position is not expected to have a max margin ratio set, and the UI should display the regular max\n * leverage for the market, unless the user is already in High Leverage Mode, in which case the UI should\n * display the high leverage max leverage for the market (if any).\n */\nconst getUserMaxLeverageForMarket = (\n\tuser: User | undefined,\n\tmarketIndex: number,\n\tmarketLeverageDetails: {\n\t\tregularMaxLeverage: number;\n\t\thighLeverageMaxLeverage: number;\n\t\thasHighLeverage: boolean;\n\t},\n\tuiSavedMaxLeverage?: number\n) => {\n\t// if no saved max leverage is provided, return the regular max leverage for the market\n\tconst DEFAULT_MAX_LEVERAGE =\n\t\tuiSavedMaxLeverage ?? marketLeverageDetails.regularMaxLeverage;\n\n\tif (!user) {\n\t\treturn DEFAULT_MAX_LEVERAGE;\n\t}\n\n\tconst openOrClosedPosition = user.getPerpPosition(marketIndex); // this position does not have to be open, it can be a closed position (a.k.a \"empty\") but has max margin ratio set.\n\n\tif (!openOrClosedPosition) {\n\t\treturn DEFAULT_MAX_LEVERAGE;\n\t}\n\n\tconst positionHasMaxMarginRatioSet = !!openOrClosedPosition.maxMarginRatio;\n\n\tif (positionHasMaxMarginRatioSet) {\n\t\treturn parseFloat(\n\t\t\t((1 / openOrClosedPosition.maxMarginRatio) * 10000).toFixed(2)\n\t\t);\n\t} else {\n\t\tconst isOpenPositionWithoutMaxMarginRatio =\n\t\t\t!openOrClosedPosition.baseAssetAmount.eq(ZERO);\n\n\t\tif (isOpenPositionWithoutMaxMarginRatio) {\n\t\t\t// user has an existing position from before PML ship (this means no max margin ratio set onchain)\n\t\t\t// display max leverage for the leverage mode their account is in\n\t\t\tconst isUserInHighLeverageMode = user.isHighLeverageMode('Initial');\n\t\t\tconst grandfatheredMaxLev = isUserInHighLeverageMode\n\t\t\t\t? marketLeverageDetails.hasHighLeverage\n\t\t\t\t\t? marketLeverageDetails.highLeverageMaxLeverage\n\t\t\t\t\t: marketLeverageDetails.regularMaxLeverage\n\t\t\t\t: marketLeverageDetails.regularMaxLeverage;\n\t\t\treturn grandfatheredMaxLev;\n\t\t} else {\n\t\t\t// user has closed position with no margin ratio set, return default value\n\t\t\treturn DEFAULT_MAX_LEVERAGE;\n\t\t}\n\t}\n};\n\nexport const USER_UTILS = {\n\tgetOpenPositionData,\n\tcheckIfUserAccountExists,\n\tgetUserMaxLeverageForMarket,\n};\n"]}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
export declare const USDC_SPOT_MARKET_INDEX = 0;
|
|
2
|
+
export declare const SOL_SPOT_MARKET_INDEX = 1;
|
|
3
|
+
export declare const WBTC_SPOT_MARKET_INDEX = 3;
|
|
4
|
+
export declare const WETH_SPOT_MARKET_INDEX = 4;
|
|
5
|
+
export declare const CBBTC_SPOT_MARKET_INDEX = 27;
|
|
2
6
|
export declare const DEFAULT_MAX_MARKET_LEVERAGE = 10;
|
package/lib/constants/markets.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_MAX_MARKET_LEVERAGE = exports.USDC_SPOT_MARKET_INDEX = void 0;
|
|
3
|
+
exports.DEFAULT_MAX_MARKET_LEVERAGE = exports.CBBTC_SPOT_MARKET_INDEX = exports.WETH_SPOT_MARKET_INDEX = exports.WBTC_SPOT_MARKET_INDEX = exports.SOL_SPOT_MARKET_INDEX = exports.USDC_SPOT_MARKET_INDEX = void 0;
|
|
4
4
|
exports.USDC_SPOT_MARKET_INDEX = 0;
|
|
5
|
+
exports.SOL_SPOT_MARKET_INDEX = 1;
|
|
6
|
+
exports.WBTC_SPOT_MARKET_INDEX = 3;
|
|
7
|
+
exports.WETH_SPOT_MARKET_INDEX = 4;
|
|
8
|
+
exports.CBBTC_SPOT_MARKET_INDEX = 27;
|
|
5
9
|
exports.DEFAULT_MAX_MARKET_LEVERAGE = 10;
|
|
6
10
|
//# sourceMappingURL=markets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markets.js","sourceRoot":"","sources":["../../src/constants/markets.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"markets.js","sourceRoot":"","sources":["../../src/constants/markets.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAC1B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAE7B,QAAA,2BAA2B,GAAG,EAAE,CAAC","sourcesContent":["export const USDC_SPOT_MARKET_INDEX = 0;\nexport const SOL_SPOT_MARKET_INDEX = 1;\nexport const WBTC_SPOT_MARKET_INDEX = 3;\nexport const WETH_SPOT_MARKET_INDEX = 4;\nexport const CBBTC_SPOT_MARKET_INDEX = 27;\n\nexport const DEFAULT_MAX_MARKET_LEVERAGE = 10;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superstake.js","sourceRoot":"","sources":["../../src/constants/superstake.ts"],"names":[],"mappings":";;;AAAA,yCAAuE;AAiB1D,QAAA,KAAK,GAAQ;IACzB,MAAM,EAAE,MAAM;IACd,gBAAgB,EAAE,iBAAiB;IACnC,UAAU,EAAE,wBAAkB,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,CAAC;IACd,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,IAAI;CACrB,CAAC;AAEW,QAAA,QAAQ,GAAQ;IAC5B,MAAM,EAAE,SAAS;IACjB,gBAAgB,EAAE,qBAAqB;IACvC,UAAU,EAAE,wBAAkB,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,GAAG;IACpB,eAAe,EAAE,IAAI;CACrB,CAAC;AAEW,QAAA,KAAK,GAAQ;IACzB,MAAM,EAAE,MAAM;IACd,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,wBAAkB,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,GAAG;IACpB,oBAAoB,EAAE,MAAM;IAC5B,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF;;GAEG;AACU,QAAA,kBAAkB,GAAU,CAAC,aAAK,EAAE,gBAAQ,EAAE,aAAK,CAAC,CAAC;AAElE;;GAEG;AACU,QAAA,sBAAsB,GAAwB;IAC1D,CAAC,aAAK,CAAC,MAAM,CAAC,EAAE,aAAK;IACrB,CAAC,gBAAQ,CAAC,MAAM,CAAC,EAAE,gBAAQ;IAC3B,CAAC,aAAK,CAAC,MAAM,CAAC,EAAE,aAAK;CACrB,CAAC","sourcesContent":["import { MainnetSpotMarkets, SpotMarketConfig } from '@drift-labs/sdk';\n\nexport type LST = {\n\tsymbol: string; // symbol is added as a config because JitoSOL's symbol in the spotMarket is jitoSOL\n\tdriftAccountName: string;\n\tspotMarket: SpotMarketConfig;\n\tlogoUrl: string;\n\t// maxLeverage set manually for now, but would be nice if we make it derived from the asset weight later on\n\tmaxLeverage: number;\n\t// Default leverage to start the form out with when switching to the lst\n\tdefaultLeverage: number;\n\t// Symbol of the token offered as emissions if there's an emissions APY on top of the normal APY\n\temissionsTokenSymbol?: string;\n\t// use direct route for
|
|
1
|
+
{"version":3,"file":"superstake.js","sourceRoot":"","sources":["../../src/constants/superstake.ts"],"names":[],"mappings":";;;AAAA,yCAAuE;AAiB1D,QAAA,KAAK,GAAQ;IACzB,MAAM,EAAE,MAAM;IACd,gBAAgB,EAAE,iBAAiB;IACnC,UAAU,EAAE,wBAAkB,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,CAAC;IACd,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,IAAI;CACrB,CAAC;AAEW,QAAA,QAAQ,GAAQ;IAC5B,MAAM,EAAE,SAAS;IACjB,gBAAgB,EAAE,qBAAqB;IACvC,UAAU,EAAE,wBAAkB,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,GAAG;IACpB,eAAe,EAAE,IAAI;CACrB,CAAC;AAEW,QAAA,KAAK,GAAQ;IACzB,MAAM,EAAE,MAAM;IACd,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,wBAAkB,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,GAAG;IAChB,eAAe,EAAE,GAAG;IACpB,oBAAoB,EAAE,MAAM;IAC5B,eAAe,EAAE,IAAI;CACrB,CAAC;AAEF;;GAEG;AACU,QAAA,kBAAkB,GAAU,CAAC,aAAK,EAAE,gBAAQ,EAAE,aAAK,CAAC,CAAC;AAElE;;GAEG;AACU,QAAA,sBAAsB,GAAwB;IAC1D,CAAC,aAAK,CAAC,MAAM,CAAC,EAAE,aAAK;IACrB,CAAC,gBAAQ,CAAC,MAAM,CAAC,EAAE,gBAAQ;IAC3B,CAAC,aAAK,CAAC,MAAM,CAAC,EAAE,aAAK;CACrB,CAAC","sourcesContent":["import { MainnetSpotMarkets, SpotMarketConfig } from '@drift-labs/sdk';\n\nexport type LST = {\n\tsymbol: string; // symbol is added as a config because JitoSOL's symbol in the spotMarket is jitoSOL\n\tdriftAccountName: string;\n\tspotMarket: SpotMarketConfig;\n\tlogoUrl: string;\n\t// maxLeverage set manually for now, but would be nice if we make it derived from the asset weight later on\n\tmaxLeverage: number;\n\t// Default leverage to start the form out with when switching to the lst\n\tdefaultLeverage: number;\n\t// Symbol of the token offered as emissions if there's an emissions APY on top of the normal APY\n\temissionsTokenSymbol?: string;\n\t// use direct route for swap\n\tonlyDirectRoute?: boolean;\n};\n\nexport const M_SOL: LST = {\n\tsymbol: 'mSOL',\n\tdriftAccountName: 'Super Stake SOL',\n\tspotMarket: MainnetSpotMarkets[2],\n\tlogoUrl: '/mSol.svg',\n\tmaxLeverage: 3,\n\tdefaultLeverage: 2,\n\tonlyDirectRoute: true,\n};\n\nexport const JITO_SOL: LST = {\n\tsymbol: 'JitoSOL',\n\tdriftAccountName: 'Super Stake JitoSOL',\n\tspotMarket: MainnetSpotMarkets[6],\n\tlogoUrl: '/jitoSol.svg',\n\tmaxLeverage: 1.8,\n\tdefaultLeverage: 1.4,\n\tonlyDirectRoute: true,\n};\n\nexport const B_SOL: LST = {\n\tsymbol: 'bSOL',\n\tdriftAccountName: 'Super Stake bSOL',\n\tspotMarket: MainnetSpotMarkets[8],\n\tlogoUrl: '/bsol.svg',\n\tmaxLeverage: 2.5,\n\tdefaultLeverage: 1.8,\n\temissionsTokenSymbol: 'BLZE',\n\tonlyDirectRoute: true,\n};\n\n/**\n * All LSTs that support one-click superstaking\n */\nexport const SUPERSTAKE_ALL_LST: LST[] = [M_SOL, JITO_SOL, B_SOL];\n\n/**\n * All LSTs that support one-click superstaking\n */\nexport const SUPERSTAKE_ALL_LST_MAP: Record<string, LST> = {\n\t[M_SOL.symbol]: M_SOL,\n\t[JITO_SOL.symbol]: JITO_SOL,\n\t[B_SOL.symbol]: B_SOL,\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Subscription } from 'rxjs';
|
|
2
2
|
import { MarketId } from '../../../../types';
|
|
3
|
-
import { L2WithOracleAndMarketData } from '../../../../utils/orderbook';
|
|
3
|
+
import { L2WithOracleAndMarketData } from '../../../../utils/orderbook/types';
|
|
4
4
|
import { OrderbookGrouping } from '../../../../utils/dlob-server/DlobServerWebsocketUtils';
|
|
5
5
|
interface DriftL2OrderbookSubscription {
|
|
6
6
|
marketId: MarketId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DriftL2OrderbookManager.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.ts"],"names":[],"mappings":";;;AAAA,+BAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"DriftL2OrderbookManager.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Subject, Subscription } from 'rxjs';\nimport { MarketId } from '../../../../types';\nimport { deserializeL2Response } from '../../../../utils/orderbook';\nimport {\n\tL2WithOracleAndMarketData,\n\tRawL2Output,\n} from '../../../../utils/orderbook/types';\nimport { MultiplexWebSocket } from '../../../../utils/MultiplexWebSocket';\nimport {\n\tDLOB_SERVER_WEBSOCKET_UTILS,\n\tOrderbookGrouping,\n} from '../../../../utils/dlob-server/DlobServerWebsocketUtils';\n\ninterface DriftL2OrderbookSubscription {\n\tmarketId: MarketId;\n\tchannel: 'orderbook_indicative' | 'orderbook';\n\tgrouping: OrderbookGrouping;\n}\n\ninterface DlobMessage {\n\tchannel: string;\n\tdata: string;\n\terror?: any;\n}\n\nexport interface DriftL2OrderbookManagerConfig {\n\twsUrl: string;\n\tsubscriptionConfig?: DriftL2OrderbookSubscription;\n}\n\nexport class DriftL2OrderbookManager {\n\tprivate _orderbook: L2WithOracleAndMarketData | null = null;\n\tprivate wsUrl: string;\n\tprivate _subscriptionConfig?: DriftL2OrderbookSubscription;\n\tprivate updatesSubject$ = new Subject<L2WithOracleAndMarketData>();\n\tprivate websocketSubscription: { unsubscribe: () => void } | null = null;\n\n\tconstructor(config: DriftL2OrderbookManagerConfig) {\n\t\tthis.wsUrl = config.wsUrl;\n\t\tthis._subscriptionConfig = config.subscriptionConfig;\n\t}\n\n\tget store() {\n\t\treturn this._orderbook ? { ...this._orderbook } : null;\n\t}\n\n\tget subscriptionConfig() {\n\t\treturn this._subscriptionConfig;\n\t}\n\n\t/**\n\t * Subscribe to orderbook updates via websocket\n\t */\n\tpublic async subscribe(): Promise<void> {\n\t\tif (this.websocketSubscription) {\n\t\t\tconsole.error('There is already a subscription to the orderbook');\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._subscriptionConfig) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst subscriptionId = `orderbook-${Date.now()}`;\n\t\tconst grouping = this._subscriptionConfig.grouping;\n\n\t\tconst subscribeMessage = JSON.stringify(\n\t\t\tDLOB_SERVER_WEBSOCKET_UTILS.getSubscriptionProps({\n\t\t\t\ttype: 'orderbook_indicative',\n\t\t\t\tmarket: this._subscriptionConfig.marketId,\n\t\t\t\tgrouping,\n\t\t\t})\n\t\t);\n\n\t\tconst unsubscribeMessage = JSON.stringify(\n\t\t\tDLOB_SERVER_WEBSOCKET_UTILS.getUnsubscriptionProps({\n\t\t\t\ttype: 'orderbook_indicative',\n\t\t\t\tmarket: this._subscriptionConfig.marketId,\n\t\t\t\tgrouping,\n\t\t\t})\n\t\t);\n\n\t\tconst messageFilter = DLOB_SERVER_WEBSOCKET_UTILS.getMessageFilter({\n\t\t\ttype: this._subscriptionConfig.channel,\n\t\t\tmarket: this._subscriptionConfig.marketId,\n\t\t\tgrouping,\n\t\t});\n\n\t\tthis.websocketSubscription = MultiplexWebSocket.createWebSocketSubscription(\n\t\t\t{\n\t\t\t\twsUrl: this.wsUrl,\n\t\t\t\tsubscriptionId,\n\t\t\t\tsubscribeMessage,\n\t\t\t\tunsubscribeMessage,\n\t\t\t\tonMessage: (message: DlobMessage) => {\n\t\t\t\t\tthis.handleWebSocketMessage(message);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconsole.error('OrderbookManager WebSocket error:', error);\n\t\t\t\t},\n\t\t\t\tmessageFilter: (message: DlobMessage) => {\n\t\t\t\t\treturn messageFilter(message);\n\t\t\t\t},\n\t\t\t\terrorMessageFilter: (message: DlobMessage) => {\n\t\t\t\t\treturn !!message.error;\n\t\t\t\t},\n\t\t\t\tonClose: () => {\n\t\t\t\t\tconsole.log('OrderbookManager WebSocket connection closed');\n\t\t\t\t},\n\t\t\t\tenableHeartbeatMonitoring: true,\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Unsubscribe from orderbook updates\n\t */\n\tpublic unsubscribe(): void {\n\t\tif (this.websocketSubscription) {\n\t\t\tthis.websocketSubscription.unsubscribe();\n\t\t\tthis.websocketSubscription = null;\n\t\t}\n\t}\n\n\t/**\n\t * Update market keys for subscription\n\t */\n\tpublic updateSubscription(\n\t\torderbookSubscription: Pick<DriftL2OrderbookSubscription, 'marketId'> &\n\t\t\tPartial<DriftL2OrderbookSubscription>\n\t): void {\n\t\t// check if subscription config is changing\n\n\t\tthis._subscriptionConfig = {\n\t\t\t...this._subscriptionConfig,\n\t\t\t...orderbookSubscription,\n\t\t};\n\n\t\tthis.unsubscribe();\n\t\tthis.subscribe();\n\t}\n\n\tprivate tryParse(data: unknown): unknown {\n\t\ttry {\n\t\t\treturn JSON.parse(data as string, (key, value) => {\n\t\t\t\t// If the value is a number and it's too large to be safely represented as a JavaScript number,\n\t\t\t\t// convert it to a string to prevent precision loss\n\t\t\t\tif (typeof value === 'number' && !Number.isSafeInteger(value)) {\n\t\t\t\t\treturn value.toString();\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t});\n\t\t} catch (e) {\n\t\t\treturn data;\n\t\t}\n\t}\n\n\t/**\n\t * Handle incoming websocket messages\n\t */\n\tprivate handleWebSocketMessage({ data }: DlobMessage): void {\n\t\ttry {\n\t\t\tconst parsedData = this.tryParse(data) as RawL2Output;\n\n\t\t\t// TODO: result slot incrementer\n\n\t\t\tconst deserializedOrderbook = deserializeL2Response(parsedData);\n\t\t\tthis._orderbook = deserializedOrderbook;\n\t\t\tthis.updatesSubject$.next(deserializedOrderbook);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error processing orderbook websocket message:', error);\n\t\t}\n\t}\n\n\t/**\n\t * Get orderbook data for a specific market\n\t */\n\tpublic getOrderbookData(): L2WithOracleAndMarketData | null {\n\t\treturn this._orderbook || null;\n\t}\n\n\t/**\n\t * Subscribe to orderbook updates\n\t */\n\tpublic onUpdate(\n\t\tcallback: (orderbookLookup: L2WithOracleAndMarketData) => void\n\t): Subscription {\n\t\treturn this.updatesSubject$.subscribe(callback);\n\t}\n\n\t/**\n\t * Destroy the manager and clean up resources\n\t */\n\tpublic destroy(): void {\n\t\tthis.unsubscribe();\n\t\tthis.updatesSubject$.complete();\n\t\tthis._orderbook = null;\n\t}\n}\n"]}
|
|
@@ -9,7 +9,7 @@ import { Subscription } from 'rxjs';
|
|
|
9
9
|
import { EnhancedAccountData, UserAccountLookup } from '../../stores/UserAccountCache';
|
|
10
10
|
import { PriorityFeeSubscriberConfig } from '@drift-labs/sdk';
|
|
11
11
|
import { CreateUserAndDepositParams, DepositParams, WithdrawParams, PerpOrderParams, SwapParams, SettleAccountPnlParams, CancelOrdersParams, CreateRevenueShareEscrowParams } from './DriftOperations/types';
|
|
12
|
-
import { L2WithOracleAndMarketData } from '../../../../utils/orderbook';
|
|
12
|
+
import { L2WithOracleAndMarketData } from '../../../../utils/orderbook/types';
|
|
13
13
|
import { OrderbookGrouping } from '../../../../utils/dlob-server/DlobServerWebsocketUtils';
|
|
14
14
|
export interface AuthorityDriftConfig {
|
|
15
15
|
solanaRpcEndpoint: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/AuthorityDrift/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAoByB;AACzB,6CAA8E;AAC9E,6EAA4E;AAC5E,+CAQyB;AACzB,6CAA6C;AAC7C,+DAAkE;AAClE,wDAIgC;AAChC,2EAAwE;AACxE,gEAA8E;AAC9E,oEAGuC;AACvC,uEAAoE;AAEpE,oEAIuC;AACvC,6CAA+C;AAC/C,yDAA2D;AAC3D,yCAIyB;AACzB,+DAA4D;AAC5D,uDAAoD;AAWpD,+CAAgD;AAEhD,mDAAuD;AACvD,yDAGmC;AAGnC;;;;;;;GAOG;AACH,SAAS,eAAe,CACvB,OAAY,EACZ,YAAoB,EACpB,UAA8B;IAE9B,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;IAExC,UAAU,CAAC,KAAK,GAAG,UAAgC,GAAG,IAAW;QAChE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAa,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,OAAO,UAAU,CAAC;AACnB,CAAC;AAiBD;;;;;GAKG;AACH,MAAa,cAAc;IAqG1B;;;;;;;OAOG;IACH,YAAY,MAA4B;;QA5FxC;;WAEG;QACK,4BAAuB,GAAwB,IAAI,CAAC;QAE5D;;WAEG;QACK,0BAAqB,GAAwB,IAAI,CAAC;QA2C1D;;;WAGG;QACO,kBAAa,GAAY,KAAK,CAAC;QAEzC;;;;;;;WAOG;QACK,wBAAmB,GAAoB,IAAI,CAAC;QAEpD;;WAEG;QACK,qBAAgB,GAAe,EAAE,CAAC;QAElC,uBAAkB,GAAuB,EAAE,CAAC;QAC5C,uBAAkB,GAAuB,EAAE,CAAC;QAoBnD,0BAA0B;QAC1B,IAAI,CAAC,mBAAmB,GAAG,MAAA,MAAM,CAAC,mBAAmB,mCAAI,IAAI,CAAC;QAE9D,MAAM,mBAAmB,GAAG,iBAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAC3D,CAAC,YAAY,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CACrE,CAAC;QACF,MAAM,mBAAmB,GAAG,iBAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAC3D,CAAC,YAAY,EAAE,EAAE,CAAC,gBAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,CAAC,CACrE,CAAC;QAEF,IAAI,CAAC,gBAAgB,GAAG,MAAA,MAAM,CAAC,eAAe,mCAAI;YACjD,GAAG,mBAAmB;YACtB,GAAG,mBAAmB;SACtB,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5D,qBAAY,CAAC,eAAe,CAC3B,MAAM,CAAC,QAAQ,EACf,gBAAU,CAAC,IAAI,EACf,MAAM,CAAC,WAAW,CAClB,CACD,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5D,qBAAY,CAAC,eAAe,CAC3B,MAAM,CAAC,QAAQ,EACf,gBAAU,CAAC,IAAI,EACf,MAAM,CAAC,WAAW,CAClB,CACD,CAAC;QAEF,yBAAyB;QACzB,MAAM,2BAA2B,GAChC,MAAA,MAAM,CAAC,sBAAsB,mCAC7B,2CAAoB,CAAC,iBAAiB,CACrC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAChD,CAAC;QACH,MAAM,mBAAmB,GACxB,2CAAoB,CAAC,cAAc,CAClC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CACpD,CAAC;QACH,MAAM,0BAA0B,GAC/B,MAAA,MAAA,MAAM,CAAC,eAAe,0CAAE,gBAAgB,mCACxC,2CAAoB,CAAC,eAAe,CACnC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAChD,CAAC;QACH,IAAI,CAAC,eAAe,GAAG;YACtB,iBAAiB,EAAE,2BAA2B;YAC9C,cAAc,EAAE,mBAAmB;YACnC,qBAAqB,EAAE,0BAA0B;SACjD,CAAC;QAEF,2CAA2C;QAC3C,IAAA,mBAAU,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5B,4BAA4B;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,CAAC,CAAC;QACxD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,CAAC,0BAA0B,CAC9B,0BAA0B,EAC1B,MAAA,MAAM,CAAC,eAAe,0CAAE,iBAAiB,CACzC,CAAC;QACF,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACzE,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,EAAE,mBAAmB,CAAC,CAAC;IAC3E,CAAC;IAED,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;IAC3C,CAAC;IAED,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IACrC,CAAC;IAED,IAAW,cAAc;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IACnC,CAAC;IAED,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IACrC,CAAC;IAED,IAAW,cAAc;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IACrC,CAAC;IAED,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAC/B,CAAC;IAED,IAAW,eAAe;QACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;QAIxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAED,IAAY,eAAe,CAAC,eAA2B;QACtD,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,eAAe;aACvC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;aAClC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACf,qBAAY,CAAC,eAAe,CAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,EACrB,gBAAU,CAAC,IAAI,EACf,MAAM,CAAC,WAAW,CAClB,CACD,CAAC;QACH,IAAI,CAAC,kBAAkB,GAAG,eAAe;aACvC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;aACjC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACf,qBAAY,CAAC,eAAe,CAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,EACrB,gBAAU,CAAC,IAAI,EACf,MAAM,CAAC,WAAW,CAClB,CACD,CAAC;IACJ,CAAC;IAED,IAAW,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IAChC,CAAC;IAED,IAAW,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IAChC,CAAC;IAEO,gBAAgB,CAAC,WAAwB;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,+BAAc,EAAE,CAAC;QAC5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,mCAAgB,EAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,mCAAgB,CAC5C,WAAW,EACX,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,eAAe,CACpB,CAAC;IACH,CAAC;IAEO,0BAA0B,CACjC,qBAA6B,EAC7B,oBAAuC,sCAA0B;QAEjE,IAAI,CAAC,iBAAiB,GAAG,IAAI,iDAAuB,CAAC;YACpD,KAAK,EAAE,qBAAqB;YAC5B,kBAAkB,EAAE,IAAI,CAAC,mBAAmB;gBAC3C,CAAC,CAAC;oBACA,GAAG,iDAAqC;oBACxC,QAAQ,EAAE,iBAAiB;oBAC3B,QAAQ,EAAE,IAAI,CAAC,mBAAmB;iBACjC;gBACH,CAAC,CAAC,SAAS;SACZ,CAAC,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,sBAA8B;QAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,yBAAW,CAAC;YACnC,sBAAsB,EAAE,sBAAsB;SAC9C,CAAC,CAAC;IACJ,CAAC;IAEO,+BAA+B,CACtC,MAA6C;QAE7C,iFAAiF;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3D,UAAU,EAAE,MAAM,CAAC,aAAa;YAChC,WAAW,EAAE,MAAM,CAAC,WAAW;SAC/B,CAAC,CAAC,CAAC;QAEJ,MAAM,iBAAiB,GAAgC;YACtD,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU;YACvC,iBAAiB,EAAE,uBAAiB,CAAC,MAAM;YAC3C,YAAY;YACZ,SAAS,EAAE,yCAA6B;YACxC,GAAG,MAAM;SACT,CAAC;QAEF,IAAI,CAAC,qBAAqB,GAAG,IAAI,2BAAqB,CAAC,iBAAiB,CAAC,CAAC;IAC3E,CAAC;IAEO,gBAAgB,CACvB,MAAyD;;QAEzD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,IAAI,mBAAS,CAAC,sBAAgB,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,wCAAkC,CAC3D,UAAU,EACV,6CAAiC,EACjC,uDAA2C,CAC3C,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAA,MAAM,CAAC,MAAM,mCAAI,+BAAe,CAAC,wBAAwB,EAAE,CAAC;QAC3E,MAAM,oBAAoB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAE5C,MAAM,WAAW,GAChB,MAAA,MAAA,MAAM,CAAC,eAAe,0CACnB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EACjC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACf,qBAAY,CAAC,eAAe,CAC3B,QAAQ,EACR,gBAAU,CAAC,IAAI,EACf,MAAM,CAAC,WAAW,CAClB,CACD,mCAAI,iBAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,WAAW,GAChB,MAAA,MAAA,MAAM,CAAC,eAAe,0CACnB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAClC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACf,qBAAY,CAAC,eAAe,CAC3B,QAAQ,EACR,gBAAU,CAAC,IAAI,EACf,MAAM,CAAC,WAAW,CAClB,CACD,mCAAI,iBAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAC1D,IAAA,yCAAmC,EAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAEzE,MAAM,iBAAiB,GAAsB;YAC5C,GAAG,EAAE,QAAQ;YACb,UAAU;YACV,MAAM;YACN,SAAS,EAAE,cAAc;YACzB,mBAAmB,EAAE,KAAK;YAC1B,mBAAmB,EAAE;gBACpB,IAAI,EAAE,SAAS;gBACf,aAAa;aACb;YACD,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,oBAAoB;YACnC,qBAAqB,EAAE,2BAAqB,CAAC,WAAW;YACxD,iBAAiB;YACjB,iBAAiB;YACjB,WAAW;YACX,GAAG,MAAM,CAAC,2BAA2B;SACrC,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,iBAAW,CAAC,iBAAiB,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,IAAI,wBAAkB,CAAC;YACvC,UAAU;YACV,MAAM;YACN,qBAAqB,EAAE,EAAE;YACzB,2BAA2B,EAAE,EAAE;YAC/B,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;YACtC,oBAAoB,EAAE,mDAAuC;YAC7D,UAAU,EAAE,4CAAgC;SAC5C,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEtC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEO,qBAAqB;QAC5B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAC3D,CAAC,aAAa,EAAE,EAAE;;YACjB,MAAM,SAAS,GAAG,IAAI,gBAAQ,CAC7B,aAAa,CAAC,WAAW,EACzB,kBAAU,CAAC,KAAK,CAAC,aAAa,CAAC,UAAoB,CAAe,CAClE,CAAC,GAAG,CAAC;YAEN,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAE1C,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;gBACrC,SAAS;gBACT,SAAS;gBACT,OAAO,EAAE,aAAa,CAAC,YAAY;gBACnC,OAAO,EAAE,aAAa,CAAC,YAAY;gBACnC,cAAc,EAAE,MAAA,aAAa,CAAC,IAAI,mCAAI,CAAC;aACvC,CAAC,CAAC;YAEH,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC;gBACzC,GAAG,aAAa,CAAC,UAAU;gBAC3B,SAAS;aACT,CAAC,CAAC;QACJ,CAAC,CACD,CAAC;IACH,CAAC;IAEO,gBAAgB;QACvB,2GAA2G;QAE3G,IAAI,CAAC,YAAY,CAAC,WAAW,CAC5B,2BAAe,CAAC,aAAa,EAC7B,+BAAiB,CAAC,eAAe,EACjC,4BAAc,CAAC,IAAI,CACnB,CAAC,CAAC,uCAAuC;QAC1C,IAAI,CAAC,YAAY,CAAC,WAAW,CAC5B,2BAAe,CAAC,iBAAiB,EACjC,+BAAiB,CAAC,kBAAkB,EACpC,4BAAc,CAAC,OAAO,CACtB,CAAC,CAAC,2CAA2C;QAE9C,iGAAiG;QACjG,IAAI,CAAC,YAAY,CAAC,oBAAoB,CACrC,2BAAe,CAAC,iBAAiB,EACjC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QAEF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,YAAY;aAC9C,MAAM,EAAE;aACR,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;YACnB,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;;gBACjD,OAAO;oBACN,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG;oBAClC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS;oBACpC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,YAAY;oBACrC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,YAAY;oBACrC,cAAc,EAAE,MAAA,UAAU,CAAC,IAAI,CAAC,IAAI,mCAAI,CAAC;iBACzC,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;gBACnD,OAAO;oBACN,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG;oBAClC,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU;iBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,iBAAiB,CAAC,CAAC;YAC5D,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,GAAG,mBAAmB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB,CACzB,iBAAyB,EACzB,cAAsB;QAEtB,gCAAgC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,iCAAe,CACzC,IAAI,CAAC,YAAY,EACjB,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAC5B,iBAAiB,EACjB,cAAc,EACd,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAC1D,CAAC;QAEF,8EAA8E;QAC9E,IAAI,CAAC,mBAAmB,GAAG,IAAI,yCAAmB,CACjD,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,CACxB,CAAC;IACH,CAAC;IAEO,0BAA0B;;QACjC,MAAA,IAAI,CAAC,uBAAuB,0CAAE,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAEpC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAEO,wBAAwB;;QAC/B,MAAA,IAAI,CAAC,qBAAqB,0CAAE,WAAW,EAAE,CAAC;QAC1C,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAElC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,SAAS;QACrB,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;;YACjC,IAAI,CAAC;gBACJ,IAAI,CAAC,aAAa,GAAG,MAAA,CAAC,MAAM,IAAA,wBAAa,GAAE,CAAC,mCAAI,KAAK,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;gBACxD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,wCAAwC;YACrE,CAAC;QACF,CAAC,CAAC;QAEF,gEAAgE;QAChE,MAAM,qBAAqB,GAAG,cAAc,EAAE,CAAC;QAC/C,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1D,MAAM,2BAA2B,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC;QAC3E,MAAM,yBAAyB,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAErE,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QAEpC,uCAAuC;QACvC,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACrE,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM;gBAClC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5D,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAE9D,IACC,CAAC,aAAa;gBACd,oCAAwB,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAC9C,kBAAU,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CACpD,EACA,CAAC;gBACF,OAAO,KAAK,CAAC;YACd,CAAC;YAED,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC;QAC9C,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QACtE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,MAAM,sDAAsD,GAC3D,IAAI,CAAC,mBAAmB,CAAC,+CAA+C,CACvE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAC5B,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC;YACjB,uBAAuB;YACvB,sDAAsD;YACtD,2BAA2B;YAC3B,qBAAqB;YACrB,yBAAyB;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,CAAC,0BAA0B,EAAE,CAAC;QAEtD,6DAA6D;IAC9D,CAAC;IAEM,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAEjC,MAAM,6BAA6B,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QACtE,MAAM,6BAA6B,GAClC,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,CAAC;QAE1C,MAAM,OAAO,CAAC,GAAG,CAChB,CAAC,6BAA6B,EAAE,6BAA6B,CAAC,CAAC,MAAM,CACpE,OAAO,CACP,CACD,CAAC;QAEF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACrC,CAAC;IAEM,oBAAoB,CAC1B,QAAkD;QAElD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,kBAAkB,CAAC,QAA8C;QACvE,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAEM,mBAAmB,CACzB,QAAoD;QAEpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAEM,iBAAiB,CACvB,QAAwD;QAExD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,eAAe,CAAC,MAAe,EAAE,kBAA2B;QACxE,OAAO,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC7E,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,sBAAuC;QACvE,MAAM,wBAAwB,GAC7B,CAAC,CAAC,sBAAsB,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,IAAI,2BAA2B;YACtF,CAAC,CAAC,CAAC,sBAAsB,IAAI,yCAAyC;gBACrE,CAAC,CAAC,IAAI,CAAC,mBAAmB;gBAC1B,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAC/B,OAAO;QACR,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,mBAAmB,GAAG,sBAAsB,CAAC;QAElD,gEAAgE;QAChE,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,oBAAoB,CAChC,MAAkC;QAKlC,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,wBAAwB,CACpC,MAAsC;QAEtC,OAAO,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,OAAO,CAAC,MAAqB;QACzC,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,QAAQ,CAAC,MAAsB;QAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;OAKG;IAEU,AAAN,KAAK,CAAC,aAAa,CACzB,MAAuB;QAEvB,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,IAAI,CAAC,MAAkB;QACnC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,YAAY,CACxB,MAIC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,gBAAgB,CAC5B,MAA8B;QAE9B,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,UAAU,CAAC,YAAoB;QAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,YAAY,CACxB,MAA0B;QAE1B,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEM,WAAW,CAAC,SAA6B;QAC/C,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACD;AA5uBD,wCA4uBC;AA/Da;IADZ,eAAe;;;;mDAKf","sourcesContent":["import {\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tgetMarketsAndOraclesForSubscription,\n\tIWallet,\n\tMarketType,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tQuoteResponse,\n\tSpotMarketConfig,\n\tSpotMarkets,\n\tSwapMode,\n\tUser,\n\tWhileValidTxSender,\n\tIWalletV2,\n\tTxParams,\n} from '@drift-labs/sdk';\nimport { Connection, PublicKey, TransactionSignature } from '@solana/web3.js';\nimport { COMMON_UI_UTILS } from '../../../../common-ui-utils/commonUiUtils';\nimport {\n\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS,\n\tDEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\tDEFAULT_TX_SENDER_RETRY_INTERVAL,\n\tDELISTED_MARKET_STATUSES,\n\tHIGH_ACTIVITY_MARKET_ACCOUNTS,\n\tPollingCategory,\n} from '../../constants';\nimport { MarketId } from '../../../../types';\nimport { MARKET_UTILS } from '../../../../common-ui-utils/market';\nimport {\n\tPOLLING_DEPTHS,\n\tPOLLING_INTERVALS,\n\tPollingDlob,\n} from '../../data/PollingDlob';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport { MarkPriceLookup, MarkPriceCache } from '../../stores/MarkPriceCache';\nimport {\n\tOraclePriceLookup,\n\tOraclePriceCache,\n} from '../../stores/OraclePriceCache';\nimport { DriftL2OrderbookManager } from './DriftL2OrderbookManager';\nimport { Subscription } from 'rxjs';\nimport {\n\tEnhancedAccountData,\n\tUserAccountCache,\n\tUserAccountLookup,\n} from '../../stores/UserAccountCache';\nimport { ENUM_UTILS } from '../../../../utils';\nimport { checkGeoBlock } from '../../../../utils/geoblock';\nimport {\n\tPriorityFeeSubscriber,\n\tPriorityFeeSubscriberConfig,\n\tPriorityFeeMethod,\n} from '@drift-labs/sdk';\nimport { SubscriptionManager } from './SubscriptionManager';\nimport { DriftOperations } from './DriftOperations';\nimport {\n\tCreateUserAndDepositParams,\n\tDepositParams,\n\tWithdrawParams,\n\tPerpOrderParams,\n\tSwapParams,\n\tSettleAccountPnlParams,\n\tCancelOrdersParams,\n\tCreateRevenueShareEscrowParams,\n} from './DriftOperations/types';\nimport { Initialize } from '../../../../Config';\nimport { L2WithOracleAndMarketData } from '../../../../utils/orderbook';\nimport { GeoBlockError } from '../../constants/errors';\nimport {\n\tDEFAULT_ORDERBOOK_GROUPING,\n\tDEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,\n} from '../../constants/orderbook';\nimport { OrderbookGrouping } from '../../../../utils/dlob-server/DlobServerWebsocketUtils';\n\n/**\n * Decorator that prevents method execution if the user is geographically blocked.\n * Throws a GeoBlockError if the user is blocked.\n *\n * @param target - The class prototype\n * @param propertyName - The method name\n * @param descriptor - The method descriptor\n */\nfunction enforceGeoBlock(\n\t_target: any,\n\tpropertyName: string,\n\tdescriptor: PropertyDescriptor\n): PropertyDescriptor {\n\tconst originalMethod = descriptor.value;\n\n\tdescriptor.value = function (this: AuthorityDrift, ...args: any[]) {\n\t\tif (this._isGeoBlocked) {\n\t\t\tthrow new GeoBlockError(propertyName);\n\t\t}\n\t\treturn originalMethod.apply(this, args);\n\t};\n\n\treturn descriptor;\n}\n\nexport interface AuthorityDriftConfig {\n\tsolanaRpcEndpoint: string;\n\tdriftEnv: DriftEnv;\n\twallet?: IWalletV2;\n\tdriftDlobServerHttpUrl?: string;\n\ttradableMarkets?: MarketId[];\n\tselectedTradeMarket?: MarketId;\n\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\tpriorityFeeSubscriberConfig?: Partial<PriorityFeeSubscriberConfig>;\n\torderbookConfig?: {\n\t\tdlobWebSocketUrl?: string;\n\t\torderbookGrouping?: OrderbookGrouping;\n\t};\n}\n\n/**\n * A Drift client that is used to subscribe to all accounts for a given authority.\n *\n * This is useful for applications that want to subscribe to all user accounts for a given authority,\n * such as a UI to trade on Drift or a wallet application that allows trading on Drift.\n */\nexport class AuthorityDrift {\n\t/**\n\t * Handles all Drift program interactions e.g. trading, read account details, etc.\n\t */\n\tprivate _driftClient!: DriftClient;\n\n\t/**\n\t * Handles bulk account loading from the RPC.\n\t */\n\tprivate accountLoader!: CustomizedCadenceBulkAccountLoader;\n\n\t/**\n\t * Handles polling the DLOB server for mark price and oracle price data for markets.\n\t * It is also the fallback source for orderbook data, if the websocket DLOB subscriber is unavailable.\n\t */\n\tprivate _pollingDlob!: PollingDlob;\n\n\t/**\n\t * Subscription to the polling DLOB data.\n\t */\n\tprivate pollingDlobSubscription: Subscription | null = null;\n\n\t/**\n\t * Subscription to the orderbook data.\n\t */\n\tprivate orderbookSubscription: Subscription | null = null;\n\n\t/**\n\t * Handles all trading operations including deposits, withdrawals, and position management.\n\t */\n\tprivate driftOperations!: DriftOperations;\n\n\t/**\n\t * Manages all subscription operations including user accounts, market subscriptions, and polling optimization.\n\t */\n\tprivate subscriptionManager!: SubscriptionManager;\n\n\t/**\n\t * Stores the fetched mark prices for all tradable markets.\n\t * Mark price sources includes:\n\t * - Websocket DLOB subscriber (active market, derived when fetching orderbook data)\n\t * - Polling DLOB server (all non-active markets)\n\t */\n\tprivate _markPriceCache!: MarkPriceCache;\n\n\t/**\n\t * Stores the fetched oracle prices for all tradable markets.\n\t * Oracle price sources includes:\n\t * - DriftClient oracle account subscriptions\n\t * - Polling DLOB server (all non-active markets)\n\t */\n\tprivate _oraclePriceCache!: OraclePriceCache;\n\n\t/**\n\t * Stores the fetched user account data for all user accounts.\n\t */\n\tprivate _userAccountCache!: UserAccountCache;\n\n\t/**\n\t * Manages real-time orderbook subscriptions via websocket.\n\t */\n\tprivate _orderbookManager!: DriftL2OrderbookManager;\n\n\t/**\n\t * Handles priority fee tracking and calculation for optimized transaction costs.\n\t */\n\tprivate priorityFeeSubscriber!: PriorityFeeSubscriber;\n\n\t/**\n\t * Stores whether the user is geographically blocked from using the service.\n\t * This is checked during subscription and cached for decorator use.\n\t */\n\tprotected _isGeoBlocked: boolean = false;\n\n\t/**\n\t * The selected trade market to use for the drift client. This is used to subscribe to the market account,\n\t * oracle data and mark price more frequently compared to the other markets.\n\t *\n\t * Example usage:\n\t * - When the UI wants to display the orderbook of this market.\n\t * - When the user is interacting with the trade form to trade on this market.\n\t */\n\tprivate selectedTradeMarket: MarketId | null = null;\n\n\t/**\n\t * The markets that are tradable through this client. This affects oracle price, mark price and market account subscriptions.\n\t */\n\tprivate _tradableMarkets: MarketId[] = [];\n\n\tprivate _spotMarketConfigs: SpotMarketConfig[] = [];\n\tprivate _perpMarketConfigs: PerpMarketConfig[] = [];\n\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tprivate _driftEndpoints: {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t\torderbookWebsocketUrl: string;\n\t};\n\n\t/**\n\t * @param solanaRpcEndpoint - The Solana RPC endpoint to use for reading RPC data.\n\t * @param driftEnv - The drift environment to use for the drift client.\n\t * @param authority - The authority (wallet) whose user accounts to subscribe to.\n\t * @param tradableMarkets - The markets that are tradable through this client.\n\t * @param selectedTradeMarket - The active trade market to use for the drift client. This is used to subscribe to the market account, oracle data and mark price more frequently compared to the other markets.\n\t * @param additionalDriftClientConfig - Additional DriftClient config to use for the DriftClient.\n\t */\n\tconstructor(config: AuthorityDriftConfig) {\n\t\t// set up tradable markets\n\t\tthis.selectedTradeMarket = config.selectedTradeMarket ?? null;\n\n\t\tconst perpTradableMarkets = PerpMarkets[config.driftEnv].map(\n\t\t\t(marketConfig) => MarketId.createPerpMarket(marketConfig.marketIndex)\n\t\t);\n\t\tconst spotTradableMarkets = SpotMarkets[config.driftEnv].map(\n\t\t\t(marketConfig) => MarketId.createSpotMarket(marketConfig.marketIndex)\n\t\t);\n\n\t\tthis._tradableMarkets = config.tradableMarkets ?? [\n\t\t\t...perpTradableMarkets,\n\t\t\t...spotTradableMarkets,\n\t\t];\n\t\tthis._spotMarketConfigs = spotTradableMarkets.map((market) =>\n\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\tconfig.driftEnv,\n\t\t\t\tMarketType.SPOT,\n\t\t\t\tmarket.marketIndex\n\t\t\t)\n\t\t);\n\t\tthis._perpMarketConfigs = perpTradableMarkets.map((market) =>\n\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\tconfig.driftEnv,\n\t\t\t\tMarketType.PERP,\n\t\t\t\tmarket.marketIndex\n\t\t\t)\n\t\t);\n\n\t\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\n\t\t\tconfig.driftDlobServerHttpUrl ??\n\t\t\tEnvironmentConstants.dlobServerHttpUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tconst swiftServerUrlToUse =\n\t\t\tEnvironmentConstants.swiftServerUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'staging' : 'mainnet'\n\t\t\t];\n\t\tconst orderbookWebsocketUrlToUse =\n\t\t\tconfig.orderbookConfig?.dlobWebSocketUrl ??\n\t\t\tEnvironmentConstants.dlobServerWsUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\n\t\t\torderbookWebsocketUrl: orderbookWebsocketUrlToUse,\n\t\t};\n\n\t\t// we set this up because SerializableTypes\n\t\tInitialize(config.driftEnv);\n\n\t\t// set up clients and stores\n\t\tconst driftClient = this.setupDriftClient(config);\n\t\tthis.initializePollingDlob(driftDlobServerHttpUrlToUse);\n\t\tthis.initializeStores(driftClient);\n\t\tthis.initializeOrderbookManager(\n\t\t\torderbookWebsocketUrlToUse,\n\t\t\tconfig.orderbookConfig?.orderbookGrouping\n\t\t);\n\t\tthis.initializePriorityFeeSubscriber(config.priorityFeeSubscriberConfig);\n\t\tthis.initializeManagers(driftDlobServerHttpUrlToUse, swiftServerUrlToUse);\n\t}\n\n\tpublic get driftClient(): DriftClient {\n\t\treturn this._driftClient;\n\t}\n\n\tpublic get authority(): PublicKey {\n\t\treturn this._driftClient.wallet.publicKey;\n\t}\n\n\tpublic get pollingDlob(): PollingDlob {\n\t\treturn this._pollingDlob;\n\t}\n\n\tpublic get oraclePriceCache(): OraclePriceLookup {\n\t\treturn this._oraclePriceCache.store;\n\t}\n\n\tpublic get markPriceCache(): MarkPriceLookup {\n\t\treturn this._markPriceCache.store;\n\t}\n\n\tpublic get userAccountCache(): UserAccountLookup {\n\t\treturn this._userAccountCache.store;\n\t}\n\n\tpublic get orderbookCache(): L2WithOracleAndMarketData | null {\n\t\treturn this._orderbookManager.store;\n\t}\n\n\tpublic get orderbookManager(): DriftL2OrderbookManager {\n\t\treturn this._orderbookManager;\n\t}\n\n\tpublic get tradableMarkets(): MarketId[] {\n\t\treturn this._tradableMarkets;\n\t}\n\n\t/**\n\t * Gets the current geoblock status of the user.\n\t *\n\t * @returns True if the user is geographically blocked, false otherwise\n\t */\n\tpublic get isGeoBlocked(): boolean {\n\t\treturn this._isGeoBlocked;\n\t}\n\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tpublic get driftEndpoints(): {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t} {\n\t\treturn this._driftEndpoints;\n\t}\n\n\tprivate set tradableMarkets(tradableMarkets: MarketId[]) {\n\t\tthis._tradableMarkets = tradableMarkets;\n\t\tthis._spotMarketConfigs = tradableMarkets\n\t\t\t.filter((market) => !market.isPerp)\n\t\t\t.map((market) =>\n\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\tthis._driftClient.env,\n\t\t\t\t\tMarketType.SPOT,\n\t\t\t\t\tmarket.marketIndex\n\t\t\t\t)\n\t\t\t);\n\t\tthis._perpMarketConfigs = tradableMarkets\n\t\t\t.filter((market) => market.isPerp)\n\t\t\t.map((market) =>\n\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\tthis._driftClient.env,\n\t\t\t\t\tMarketType.PERP,\n\t\t\t\t\tmarket.marketIndex\n\t\t\t\t)\n\t\t\t);\n\t}\n\n\tpublic get spotMarketConfigs(): SpotMarketConfig[] {\n\t\treturn this._spotMarketConfigs;\n\t}\n\n\tpublic get perpMarketConfigs(): PerpMarketConfig[] {\n\t\treturn this._perpMarketConfigs;\n\t}\n\n\tprivate initializeStores(driftClient: DriftClient) {\n\t\tthis._markPriceCache = new MarkPriceCache();\n\t\tthis._oraclePriceCache = new OraclePriceCache();\n\t\tthis._userAccountCache = new UserAccountCache(\n\t\t\tdriftClient,\n\t\t\tthis._oraclePriceCache,\n\t\t\tthis._markPriceCache\n\t\t);\n\t}\n\n\tprivate initializeOrderbookManager(\n\t\torderbookWebsocketUrl: string,\n\t\torderbookGrouping: OrderbookGrouping = DEFAULT_ORDERBOOK_GROUPING\n\t) {\n\t\tthis._orderbookManager = new DriftL2OrderbookManager({\n\t\t\twsUrl: orderbookWebsocketUrl,\n\t\t\tsubscriptionConfig: this.selectedTradeMarket\n\t\t\t\t? {\n\t\t\t\t\t\t...DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,\n\t\t\t\t\t\tgrouping: orderbookGrouping,\n\t\t\t\t\t\tmarketId: this.selectedTradeMarket,\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t});\n\t}\n\n\tprivate initializePollingDlob(driftDlobServerHttpUrl: string) {\n\t\tthis._pollingDlob = new PollingDlob({\n\t\t\tdriftDlobServerHttpUrl: driftDlobServerHttpUrl,\n\t\t});\n\t}\n\n\tprivate initializePriorityFeeSubscriber(\n\t\tconfig?: Partial<PriorityFeeSubscriberConfig>\n\t) {\n\t\t// Convert tradable markets to DriftMarketInfo format for priority fee subscriber\n\t\tconst driftMarkets = this._tradableMarkets.map((market) => ({\n\t\t\tmarketType: market.marketTypeStr,\n\t\t\tmarketIndex: market.marketIndex,\n\t\t}));\n\n\t\tconst priorityFeeConfig: PriorityFeeSubscriberConfig = {\n\t\t\tconnection: this.driftClient.connection,\n\t\t\tpriorityFeeMethod: PriorityFeeMethod.SOLANA,\n\t\t\tdriftMarkets,\n\t\t\taddresses: HIGH_ACTIVITY_MARKET_ACCOUNTS,\n\t\t\t...config,\n\t\t};\n\n\t\tthis.priorityFeeSubscriber = new PriorityFeeSubscriber(priorityFeeConfig);\n\t}\n\n\tprivate setupDriftClient(\n\t\tconfig: Omit<AuthorityDriftConfig, 'onUserAccountUpdate'>\n\t) {\n\t\tconst driftEnv = config.driftEnv;\n\n\t\tconst connection = new Connection(config.solanaRpcEndpoint);\n\t\tconst driftProgramID = new PublicKey(DRIFT_PROGRAM_ID);\n\t\tconst accountLoader = new CustomizedCadenceBulkAccountLoader(\n\t\t\tconnection,\n\t\t\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\t\t\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS\n\t\t);\n\t\tthis.accountLoader = accountLoader;\n\n\t\tconst wallet = config.wallet ?? COMMON_UI_UTILS.createPlaceholderIWallet();\n\t\tconst skipInitialUsersLoad = !config.wallet;\n\n\t\tconst perpMarkets =\n\t\t\tconfig.tradableMarkets\n\t\t\t\t?.filter((market) => market.isPerp)\n\t\t\t\t.map((market) =>\n\t\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\t\tdriftEnv,\n\t\t\t\t\t\tMarketType.PERP,\n\t\t\t\t\t\tmarket.marketIndex\n\t\t\t\t\t)\n\t\t\t\t) ?? PerpMarkets[driftEnv];\n\t\tconst spotMarkets =\n\t\t\tconfig.tradableMarkets\n\t\t\t\t?.filter((market) => !market.isPerp)\n\t\t\t\t.map((market) =>\n\t\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\t\tdriftEnv,\n\t\t\t\t\t\tMarketType.SPOT,\n\t\t\t\t\t\tmarket.marketIndex\n\t\t\t\t\t)\n\t\t\t\t) ?? SpotMarkets[driftEnv];\n\t\tconst { perpMarketIndexes, spotMarketIndexes, oracleInfos } =\n\t\t\tgetMarketsAndOraclesForSubscription(driftEnv, perpMarkets, spotMarkets);\n\n\t\tconst driftClientConfig: DriftClientConfig = {\n\t\t\tenv: driftEnv,\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tprogramID: driftProgramID,\n\t\t\tenableMetricsEvents: false,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'polling',\n\t\t\t\taccountLoader,\n\t\t\t},\n\t\t\tuserStats: true,\n\t\t\tincludeDelegates: true,\n\t\t\tskipLoadUsers: skipInitialUsersLoad,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes,\n\t\t\tspotMarketIndexes,\n\t\t\toracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis._driftClient = new DriftClient(driftClientConfig);\n\n\t\tconst txSender = new WhileValidTxSender({\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tadditionalConnections: [],\n\t\t\tadditionalTxSenderCallbacks: [],\n\t\t\ttxHandler: this._driftClient.txHandler,\n\t\t\tconfirmationStrategy: DEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\t\t\tretrySleep: DEFAULT_TX_SENDER_RETRY_INTERVAL,\n\t\t});\n\n\t\tthis._driftClient.txSender = txSender;\n\n\t\treturn this._driftClient;\n\t}\n\n\tprivate setupOrderbookManager() {\n\t\tthis.orderbookSubscription = this._orderbookManager.onUpdate(\n\t\t\t(orderbookData) => {\n\t\t\t\tconst marketKey = new MarketId(\n\t\t\t\t\torderbookData.marketIndex,\n\t\t\t\t\tENUM_UTILS.toObj(orderbookData.marketType as string) as MarketType\n\t\t\t\t).key;\n\n\t\t\t\tconst markPrice = orderbookData.markPrice;\n\n\t\t\t\tthis._markPriceCache.updateMarkPrices({\n\t\t\t\t\tmarketKey,\n\t\t\t\t\tmarkPrice,\n\t\t\t\t\tbestAsk: orderbookData.bestAskPrice,\n\t\t\t\t\tbestBid: orderbookData.bestBidPrice,\n\t\t\t\t\tlastUpdateSlot: orderbookData.slot ?? 0,\n\t\t\t\t});\n\n\t\t\t\tthis._oraclePriceCache.updateOraclePrices({\n\t\t\t\t\t...orderbookData.oracleData,\n\t\t\t\t\tmarketKey,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate setupPollingDlob() {\n\t\t// DriftL2OrderbookManager will handle the fetching of data for the selected trade market through websocket\n\n\t\tthis._pollingDlob.addInterval(\n\t\t\tPollingCategory.USER_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_DEEP,\n\t\t\tPOLLING_DEPTHS.DEEP\n\t\t); // markets that the user is involved in\n\t\tthis._pollingDlob.addInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_SHALLOW,\n\t\t\tPOLLING_DEPTHS.SHALLOW\n\t\t); // markets that the user is not involved in\n\n\t\t// add all markets to the user-not-involved interval first, until user-involved markets are known\n\t\tthis._pollingDlob.addMarketsToInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tthis._tradableMarkets.map((market) => market.key)\n\t\t);\n\n\t\tthis.pollingDlobSubscription = this._pollingDlob\n\t\t\t.onData()\n\t\t\t.subscribe((data) => {\n\t\t\t\tconst updatedMarkPrices = data.map((marketData) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarketKey: marketData.marketId.key,\n\t\t\t\t\t\tmarkPrice: marketData.data.markPrice,\n\t\t\t\t\t\tbestBid: marketData.data.bestBidPrice,\n\t\t\t\t\t\tbestAsk: marketData.data.bestAskPrice,\n\t\t\t\t\t\tlastUpdateSlot: marketData.data.slot ?? 0,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tconst updatedOraclePrices = data.map((marketData) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarketKey: marketData.marketId.key,\n\t\t\t\t\t\t...marketData.data.oracleData,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tthis._markPriceCache.updateMarkPrices(...updatedMarkPrices);\n\t\t\t\tthis._oraclePriceCache.updateOraclePrices(...updatedOraclePrices);\n\t\t\t});\n\t}\n\n\tprivate initializeManagers(\n\t\tdlobServerHttpUrl: string,\n\t\tswiftServerUrl: string\n\t) {\n\t\t// Initialize trading operations\n\t\tthis.driftOperations = new DriftOperations(\n\t\t\tthis._driftClient,\n\t\t\t() => this._userAccountCache,\n\t\t\tdlobServerHttpUrl,\n\t\t\tswiftServerUrl,\n\t\t\t() => this.priorityFeeSubscriber.getCustomStrategyResult()\n\t\t);\n\n\t\t// Initialize subscription manager with all subscription and market operations\n\t\tthis.subscriptionManager = new SubscriptionManager(\n\t\t\tthis._driftClient,\n\t\t\tthis.accountLoader,\n\t\t\tthis._pollingDlob,\n\t\t\tthis._orderbookManager,\n\t\t\tthis._userAccountCache,\n\t\t\tthis._tradableMarkets,\n\t\t\tthis.selectedTradeMarket\n\t\t);\n\t}\n\n\tprivate unsubscribeFromPollingDlob() {\n\t\tthis.pollingDlobSubscription?.unsubscribe();\n\t\tthis.pollingDlobSubscription = null;\n\n\t\tthis._pollingDlob.stop();\n\t}\n\n\tprivate unsubscribeFromOrderbook() {\n\t\tthis.orderbookSubscription?.unsubscribe();\n\t\tthis.orderbookSubscription = null;\n\n\t\tthis._orderbookManager.unsubscribe();\n\t}\n\n\tpublic async subscribe() {\n\t\tconst handleGeoBlock = async () => {\n\t\t\ttry {\n\t\t\t\tthis._isGeoBlocked = (await checkGeoBlock()) ?? false;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn('Failed to check geoblock status:', error);\n\t\t\t\tthis._isGeoBlocked = false; // Default to not blocked if check fails\n\t\t\t}\n\t\t};\n\n\t\t// async logic that doesn't require DriftClient to be subscribed\n\t\tconst handleGeoBlockPromise = handleGeoBlock();\n\t\tconst pollingDlobStartPromise = this._pollingDlob.start();\n\t\tconst priorityFeeSubscribePromise = this.priorityFeeSubscriber.subscribe();\n\t\tconst orderbookSubscribePromise = this._orderbookManager.subscribe();\n\n\t\tawait this._driftClient.subscribe();\n\n\t\t// filter out markets that are delisted\n\t\tconst actualTradableMarkets = this._tradableMarkets.filter((market) => {\n\t\t\tconst marketAccount = market.isPerp\n\t\t\t\t? this._driftClient.getPerpMarketAccount(market.marketIndex)\n\t\t\t\t: this._driftClient.getSpotMarketAccount(market.marketIndex);\n\n\t\t\tif (\n\t\t\t\t!marketAccount ||\n\t\t\t\tDELISTED_MARKET_STATUSES.some((marketStatus) =>\n\t\t\t\t\tENUM_UTILS.match(marketAccount.status, marketStatus)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tthis._tradableMarkets = actualTradableMarkets;\n\t\tthis.subscriptionManager.updateTradableMarkets(actualTradableMarkets);\n\t\tthis.setupPollingDlob();\n\t\tthis.setupOrderbookManager();\n\n\t\tconst subscribeToNonWhitelistedButUserInvolvedMarketsPromise =\n\t\t\tthis.subscriptionManager.subscribeToNonWhitelistedButUserInvolvedMarkets(\n\t\t\t\tthis._driftClient.getUsers()\n\t\t\t);\n\n\t\tawait Promise.all([\n\t\t\tpollingDlobStartPromise,\n\t\t\tsubscribeToNonWhitelistedButUserInvolvedMarketsPromise,\n\t\t\tpriorityFeeSubscribePromise,\n\t\t\thandleGeoBlockPromise,\n\t\t\torderbookSubscribePromise,\n\t\t]);\n\n\t\tthis.subscriptionManager.subscribeToAllUsersUpdates();\n\n\t\t// TODO: subscribe to oracle price updates from drift client?\n\t}\n\n\tpublic async unsubscribe() {\n\t\tthis.unsubscribeFromPollingDlob();\n\t\tthis.unsubscribeFromOrderbook();\n\t\tthis._userAccountCache.destroy();\n\t\tthis._markPriceCache.destroy();\n\t\tthis._orderbookManager.destroy();\n\n\t\tconst driftClientUnsubscribePromise = this._driftClient.unsubscribe();\n\t\tconst priorityFeeUnsubscribePromise =\n\t\t\tthis.priorityFeeSubscriber.unsubscribe();\n\n\t\tawait Promise.all(\n\t\t\t[driftClientUnsubscribePromise, priorityFeeUnsubscribePromise].filter(\n\t\t\t\tBoolean\n\t\t\t)\n\t\t);\n\n\t\tthis.pollingDlobSubscription = null;\n\t}\n\n\tpublic onOraclePricesUpdate(\n\t\tcallback: (oraclePrice: OraclePriceLookup) => void\n\t) {\n\t\treturn this._oraclePriceCache.onUpdate(callback);\n\t}\n\n\tpublic onMarkPricesUpdate(callback: (markPrice: MarkPriceLookup) => void) {\n\t\treturn this._markPriceCache.onUpdate(callback);\n\t}\n\n\tpublic onUserAccountUpdate(\n\t\tcallback: (userAccount: EnhancedAccountData) => void\n\t) {\n\t\treturn this._userAccountCache.onUpdate(callback);\n\t}\n\n\tpublic onOrderbookUpdate(\n\t\tcallback: (orderbook: L2WithOracleAndMarketData) => void\n\t) {\n\t\treturn this._orderbookManager.onUpdate(callback);\n\t}\n\n\t/**\n\t * Updates the authority (wallet) for the drift client and reestablishes subscriptions.\n\t *\n\t * @param wallet - The new wallet to use as authority\n\t * @param activeSubAccountId - Optional subaccount ID to switch to after wallet update\n\t */\n\tpublic async updateAuthority(wallet: IWallet, activeSubAccountId?: number) {\n\t\treturn this.subscriptionManager.updateAuthority(wallet, activeSubAccountId);\n\t}\n\n\t/**\n\t * Updates the selected trade market and optimizes subscription polling.\n\t *\n\t * @param newSelectedTradeMarket - The new market to prioritize for trading\n\t */\n\tpublic updateSelectedTradeMarket(newSelectedTradeMarket: MarketId | null) {\n\t\tconst isNewSelectedTradeMarket =\n\t\t\t!!newSelectedTradeMarket !== !!this.selectedTradeMarket || // only one of them is null\n\t\t\t(!!newSelectedTradeMarket && // or both are not null and are different\n\t\t\t\t!!this.selectedTradeMarket &&\n\t\t\t\t!this.selectedTradeMarket.equals(newSelectedTradeMarket));\n\n\t\tif (!isNewSelectedTradeMarket) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Update the local reference\n\t\tthis.selectedTradeMarket = newSelectedTradeMarket;\n\n\t\t// Delegate to subscription manager for all polling optimization\n\t\tthis.subscriptionManager.updateSelectedTradeMarket(newSelectedTradeMarket);\n\t}\n\n\t/**\n\t * Creates a new user account and deposits initial collateral.\n\t *\n\t * @param params - Parameters for creating user and depositing collateral\n\t * @returns Promise resolving to transaction signature and user account public key\n\t */\n\tpublic async createUserAndDeposit(\n\t\tparams: CreateUserAndDepositParams\n\t): Promise<{\n\t\ttxSig: TransactionSignature;\n\t\tuser: User;\n\t}> {\n\t\treturn this.driftOperations.createUserAndDeposit(params);\n\t}\n\n\t/**\n\t * Creates a RevenueShareEscrow account for the user.\n\t *\n\t * @param params - Parameters for creating a RevenueShareEscrow account\n\t * @returns Promise resolving to the transaction signature of the creation\n\t */\n\tpublic async createRevenueShareEscrow(\n\t\tparams: CreateRevenueShareEscrowParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.createRevenueShareEscrow(params);\n\t}\n\n\t/**\n\t * Deposits collateral into a user's spot market position.\n\t *\n\t * @param params - Parameters for the deposit operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async deposit(params: DepositParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.deposit(params);\n\t}\n\n\t/**\n\t * Withdraws collateral from a user's spot market position.\n\t *\n\t * @param params - Parameters for the withdrawal operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async withdraw(params: WithdrawParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.withdraw(params);\n\t}\n\n\t/**\n\t * Opens a perpetual market order.\n\t *\n\t * @param params - Parameters for the perp order\n\t * @returns Promise resolving to the transaction signature\n\t */\n\t@enforceGeoBlock\n\tpublic async openPerpOrder(\n\t\tparams: PerpOrderParams\n\t): Promise<TransactionSignature | void> {\n\t\treturn this.driftOperations.openPerpOrder(params);\n\t}\n\n\t/**\n\t * Executes a swap between two spot markets.\n\t *\n\t * @param params - Parameters for the swap operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async swap(params: SwapParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.swap(params);\n\t}\n\n\tpublic async getSwapQuote(\n\t\tparams: Omit<SwapParams, 'jupiterQuote'> & {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t}\n\t): Promise<QuoteResponse> {\n\t\treturn this.driftOperations.getSwapQuote(params);\n\t}\n\n\t/**\n\t * Settles profit and loss for a perpetual position.\n\t *\n\t * @param params - Parameters for the settle PnL operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async settleAccountPnl(\n\t\tparams: SettleAccountPnlParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.settleAccountPnl(params);\n\t}\n\n\t/**\n\t * Deletes a user account from the Drift protocol.\n\t *\n\t * @param subAccountId - The ID of the sub-account to delete\n\t * @returns Promise resolving to the transaction signature of the deletion\n\t */\n\tpublic async deleteUser(subAccountId: number): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.deleteUser(subAccountId);\n\t}\n\n\t/**\n\t * Cancels a list of open orders.\n\t *\n\t * @param params - See `CancelOrdersParams`\n\t * @returns Promise resolving to the transaction signature of the cancellation\n\t */\n\tpublic async cancelOrders(\n\t\tparams: CancelOrdersParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.cancelOrders(params);\n\t}\n\n\tpublic getTxParams(overrides?: Partial<TxParams>): TxParams {\n\t\treturn this.driftOperations.getTxParams(overrides);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/AuthorityDrift/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tgetMarketsAndOraclesForSubscription,\n\tIWallet,\n\tMarketType,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tQuoteResponse,\n\tSpotMarketConfig,\n\tSpotMarkets,\n\tSwapMode,\n\tUser,\n\tWhileValidTxSender,\n\tIWalletV2,\n\tTxParams,\n} from '@drift-labs/sdk';\nimport { Connection, PublicKey, TransactionSignature } from '@solana/web3.js';\nimport { COMMON_UI_UTILS } from '../../../../common-ui-utils/commonUiUtils';\nimport {\n\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS,\n\tDEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\tDEFAULT_TX_SENDER_RETRY_INTERVAL,\n\tDELISTED_MARKET_STATUSES,\n\tHIGH_ACTIVITY_MARKET_ACCOUNTS,\n\tPollingCategory,\n} from '../../constants';\nimport { MarketId } from '../../../../types';\nimport { MARKET_UTILS } from '../../../../common-ui-utils/market';\nimport {\n\tPOLLING_DEPTHS,\n\tPOLLING_INTERVALS,\n\tPollingDlob,\n} from '../../data/PollingDlob';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport { MarkPriceLookup, MarkPriceCache } from '../../stores/MarkPriceCache';\nimport {\n\tOraclePriceLookup,\n\tOraclePriceCache,\n} from '../../stores/OraclePriceCache';\nimport { DriftL2OrderbookManager } from './DriftL2OrderbookManager';\nimport { Subscription } from 'rxjs';\nimport {\n\tEnhancedAccountData,\n\tUserAccountCache,\n\tUserAccountLookup,\n} from '../../stores/UserAccountCache';\nimport { ENUM_UTILS } from '../../../../utils';\nimport { checkGeoBlock } from '../../../../utils/geoblock';\nimport {\n\tPriorityFeeSubscriber,\n\tPriorityFeeSubscriberConfig,\n\tPriorityFeeMethod,\n} from '@drift-labs/sdk';\nimport { SubscriptionManager } from './SubscriptionManager';\nimport { DriftOperations } from './DriftOperations';\nimport {\n\tCreateUserAndDepositParams,\n\tDepositParams,\n\tWithdrawParams,\n\tPerpOrderParams,\n\tSwapParams,\n\tSettleAccountPnlParams,\n\tCancelOrdersParams,\n\tCreateRevenueShareEscrowParams,\n} from './DriftOperations/types';\nimport { Initialize } from '../../../../Config';\nimport { L2WithOracleAndMarketData } from '../../../../utils/orderbook/types';\nimport { GeoBlockError } from '../../constants/errors';\nimport {\n\tDEFAULT_ORDERBOOK_GROUPING,\n\tDEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,\n} from '../../constants/orderbook';\nimport { OrderbookGrouping } from '../../../../utils/dlob-server/DlobServerWebsocketUtils';\n\n/**\n * Decorator that prevents method execution if the user is geographically blocked.\n * Throws a GeoBlockError if the user is blocked.\n *\n * @param target - The class prototype\n * @param propertyName - The method name\n * @param descriptor - The method descriptor\n */\nfunction enforceGeoBlock(\n\t_target: any,\n\tpropertyName: string,\n\tdescriptor: PropertyDescriptor\n): PropertyDescriptor {\n\tconst originalMethod = descriptor.value;\n\n\tdescriptor.value = function (this: AuthorityDrift, ...args: any[]) {\n\t\tif (this._isGeoBlocked) {\n\t\t\tthrow new GeoBlockError(propertyName);\n\t\t}\n\t\treturn originalMethod.apply(this, args);\n\t};\n\n\treturn descriptor;\n}\n\nexport interface AuthorityDriftConfig {\n\tsolanaRpcEndpoint: string;\n\tdriftEnv: DriftEnv;\n\twallet?: IWalletV2;\n\tdriftDlobServerHttpUrl?: string;\n\ttradableMarkets?: MarketId[];\n\tselectedTradeMarket?: MarketId;\n\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\tpriorityFeeSubscriberConfig?: Partial<PriorityFeeSubscriberConfig>;\n\torderbookConfig?: {\n\t\tdlobWebSocketUrl?: string;\n\t\torderbookGrouping?: OrderbookGrouping;\n\t};\n}\n\n/**\n * A Drift client that is used to subscribe to all accounts for a given authority.\n *\n * This is useful for applications that want to subscribe to all user accounts for a given authority,\n * such as a UI to trade on Drift or a wallet application that allows trading on Drift.\n */\nexport class AuthorityDrift {\n\t/**\n\t * Handles all Drift program interactions e.g. trading, read account details, etc.\n\t */\n\tprivate _driftClient!: DriftClient;\n\n\t/**\n\t * Handles bulk account loading from the RPC.\n\t */\n\tprivate accountLoader!: CustomizedCadenceBulkAccountLoader;\n\n\t/**\n\t * Handles polling the DLOB server for mark price and oracle price data for markets.\n\t * It is also the fallback source for orderbook data, if the websocket DLOB subscriber is unavailable.\n\t */\n\tprivate _pollingDlob!: PollingDlob;\n\n\t/**\n\t * Subscription to the polling DLOB data.\n\t */\n\tprivate pollingDlobSubscription: Subscription | null = null;\n\n\t/**\n\t * Subscription to the orderbook data.\n\t */\n\tprivate orderbookSubscription: Subscription | null = null;\n\n\t/**\n\t * Handles all trading operations including deposits, withdrawals, and position management.\n\t */\n\tprivate driftOperations!: DriftOperations;\n\n\t/**\n\t * Manages all subscription operations including user accounts, market subscriptions, and polling optimization.\n\t */\n\tprivate subscriptionManager!: SubscriptionManager;\n\n\t/**\n\t * Stores the fetched mark prices for all tradable markets.\n\t * Mark price sources includes:\n\t * - Websocket DLOB subscriber (active market, derived when fetching orderbook data)\n\t * - Polling DLOB server (all non-active markets)\n\t */\n\tprivate _markPriceCache!: MarkPriceCache;\n\n\t/**\n\t * Stores the fetched oracle prices for all tradable markets.\n\t * Oracle price sources includes:\n\t * - DriftClient oracle account subscriptions\n\t * - Polling DLOB server (all non-active markets)\n\t */\n\tprivate _oraclePriceCache!: OraclePriceCache;\n\n\t/**\n\t * Stores the fetched user account data for all user accounts.\n\t */\n\tprivate _userAccountCache!: UserAccountCache;\n\n\t/**\n\t * Manages real-time orderbook subscriptions via websocket.\n\t */\n\tprivate _orderbookManager!: DriftL2OrderbookManager;\n\n\t/**\n\t * Handles priority fee tracking and calculation for optimized transaction costs.\n\t */\n\tprivate priorityFeeSubscriber!: PriorityFeeSubscriber;\n\n\t/**\n\t * Stores whether the user is geographically blocked from using the service.\n\t * This is checked during subscription and cached for decorator use.\n\t */\n\tprotected _isGeoBlocked: boolean = false;\n\n\t/**\n\t * The selected trade market to use for the drift client. This is used to subscribe to the market account,\n\t * oracle data and mark price more frequently compared to the other markets.\n\t *\n\t * Example usage:\n\t * - When the UI wants to display the orderbook of this market.\n\t * - When the user is interacting with the trade form to trade on this market.\n\t */\n\tprivate selectedTradeMarket: MarketId | null = null;\n\n\t/**\n\t * The markets that are tradable through this client. This affects oracle price, mark price and market account subscriptions.\n\t */\n\tprivate _tradableMarkets: MarketId[] = [];\n\n\tprivate _spotMarketConfigs: SpotMarketConfig[] = [];\n\tprivate _perpMarketConfigs: PerpMarketConfig[] = [];\n\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tprivate _driftEndpoints: {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t\torderbookWebsocketUrl: string;\n\t};\n\n\t/**\n\t * @param solanaRpcEndpoint - The Solana RPC endpoint to use for reading RPC data.\n\t * @param driftEnv - The drift environment to use for the drift client.\n\t * @param authority - The authority (wallet) whose user accounts to subscribe to.\n\t * @param tradableMarkets - The markets that are tradable through this client.\n\t * @param selectedTradeMarket - The active trade market to use for the drift client. This is used to subscribe to the market account, oracle data and mark price more frequently compared to the other markets.\n\t * @param additionalDriftClientConfig - Additional DriftClient config to use for the DriftClient.\n\t */\n\tconstructor(config: AuthorityDriftConfig) {\n\t\t// set up tradable markets\n\t\tthis.selectedTradeMarket = config.selectedTradeMarket ?? null;\n\n\t\tconst perpTradableMarkets = PerpMarkets[config.driftEnv].map(\n\t\t\t(marketConfig) => MarketId.createPerpMarket(marketConfig.marketIndex)\n\t\t);\n\t\tconst spotTradableMarkets = SpotMarkets[config.driftEnv].map(\n\t\t\t(marketConfig) => MarketId.createSpotMarket(marketConfig.marketIndex)\n\t\t);\n\n\t\tthis._tradableMarkets = config.tradableMarkets ?? [\n\t\t\t...perpTradableMarkets,\n\t\t\t...spotTradableMarkets,\n\t\t];\n\t\tthis._spotMarketConfigs = spotTradableMarkets.map((market) =>\n\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\tconfig.driftEnv,\n\t\t\t\tMarketType.SPOT,\n\t\t\t\tmarket.marketIndex\n\t\t\t)\n\t\t);\n\t\tthis._perpMarketConfigs = perpTradableMarkets.map((market) =>\n\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\tconfig.driftEnv,\n\t\t\t\tMarketType.PERP,\n\t\t\t\tmarket.marketIndex\n\t\t\t)\n\t\t);\n\n\t\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\n\t\t\tconfig.driftDlobServerHttpUrl ??\n\t\t\tEnvironmentConstants.dlobServerHttpUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tconst swiftServerUrlToUse =\n\t\t\tEnvironmentConstants.swiftServerUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'staging' : 'mainnet'\n\t\t\t];\n\t\tconst orderbookWebsocketUrlToUse =\n\t\t\tconfig.orderbookConfig?.dlobWebSocketUrl ??\n\t\t\tEnvironmentConstants.dlobServerWsUrl[\n\t\t\t\tconfig.driftEnv === 'devnet' ? 'dev' : 'mainnet'\n\t\t\t];\n\t\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\n\t\t\torderbookWebsocketUrl: orderbookWebsocketUrlToUse,\n\t\t};\n\n\t\t// we set this up because SerializableTypes\n\t\tInitialize(config.driftEnv);\n\n\t\t// set up clients and stores\n\t\tconst driftClient = this.setupDriftClient(config);\n\t\tthis.initializePollingDlob(driftDlobServerHttpUrlToUse);\n\t\tthis.initializeStores(driftClient);\n\t\tthis.initializeOrderbookManager(\n\t\t\torderbookWebsocketUrlToUse,\n\t\t\tconfig.orderbookConfig?.orderbookGrouping\n\t\t);\n\t\tthis.initializePriorityFeeSubscriber(config.priorityFeeSubscriberConfig);\n\t\tthis.initializeManagers(driftDlobServerHttpUrlToUse, swiftServerUrlToUse);\n\t}\n\n\tpublic get driftClient(): DriftClient {\n\t\treturn this._driftClient;\n\t}\n\n\tpublic get authority(): PublicKey {\n\t\treturn this._driftClient.wallet.publicKey;\n\t}\n\n\tpublic get pollingDlob(): PollingDlob {\n\t\treturn this._pollingDlob;\n\t}\n\n\tpublic get oraclePriceCache(): OraclePriceLookup {\n\t\treturn this._oraclePriceCache.store;\n\t}\n\n\tpublic get markPriceCache(): MarkPriceLookup {\n\t\treturn this._markPriceCache.store;\n\t}\n\n\tpublic get userAccountCache(): UserAccountLookup {\n\t\treturn this._userAccountCache.store;\n\t}\n\n\tpublic get orderbookCache(): L2WithOracleAndMarketData | null {\n\t\treturn this._orderbookManager.store;\n\t}\n\n\tpublic get orderbookManager(): DriftL2OrderbookManager {\n\t\treturn this._orderbookManager;\n\t}\n\n\tpublic get tradableMarkets(): MarketId[] {\n\t\treturn this._tradableMarkets;\n\t}\n\n\t/**\n\t * Gets the current geoblock status of the user.\n\t *\n\t * @returns True if the user is geographically blocked, false otherwise\n\t */\n\tpublic get isGeoBlocked(): boolean {\n\t\treturn this._isGeoBlocked;\n\t}\n\n\t/**\n\t * The public endpoints that can be used to retrieve Drift data / interact with the Drift program.\n\t */\n\tpublic get driftEndpoints(): {\n\t\tdlobServerHttpUrl: string;\n\t\tswiftServerUrl: string;\n\t} {\n\t\treturn this._driftEndpoints;\n\t}\n\n\tprivate set tradableMarkets(tradableMarkets: MarketId[]) {\n\t\tthis._tradableMarkets = tradableMarkets;\n\t\tthis._spotMarketConfigs = tradableMarkets\n\t\t\t.filter((market) => !market.isPerp)\n\t\t\t.map((market) =>\n\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\tthis._driftClient.env,\n\t\t\t\t\tMarketType.SPOT,\n\t\t\t\t\tmarket.marketIndex\n\t\t\t\t)\n\t\t\t);\n\t\tthis._perpMarketConfigs = tradableMarkets\n\t\t\t.filter((market) => market.isPerp)\n\t\t\t.map((market) =>\n\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\tthis._driftClient.env,\n\t\t\t\t\tMarketType.PERP,\n\t\t\t\t\tmarket.marketIndex\n\t\t\t\t)\n\t\t\t);\n\t}\n\n\tpublic get spotMarketConfigs(): SpotMarketConfig[] {\n\t\treturn this._spotMarketConfigs;\n\t}\n\n\tpublic get perpMarketConfigs(): PerpMarketConfig[] {\n\t\treturn this._perpMarketConfigs;\n\t}\n\n\tprivate initializeStores(driftClient: DriftClient) {\n\t\tthis._markPriceCache = new MarkPriceCache();\n\t\tthis._oraclePriceCache = new OraclePriceCache();\n\t\tthis._userAccountCache = new UserAccountCache(\n\t\t\tdriftClient,\n\t\t\tthis._oraclePriceCache,\n\t\t\tthis._markPriceCache\n\t\t);\n\t}\n\n\tprivate initializeOrderbookManager(\n\t\torderbookWebsocketUrl: string,\n\t\torderbookGrouping: OrderbookGrouping = DEFAULT_ORDERBOOK_GROUPING\n\t) {\n\t\tthis._orderbookManager = new DriftL2OrderbookManager({\n\t\t\twsUrl: orderbookWebsocketUrl,\n\t\t\tsubscriptionConfig: this.selectedTradeMarket\n\t\t\t\t? {\n\t\t\t\t\t\t...DEFAULT_ORDERBOOK_SUBSCRIPTION_CONFIG,\n\t\t\t\t\t\tgrouping: orderbookGrouping,\n\t\t\t\t\t\tmarketId: this.selectedTradeMarket,\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t});\n\t}\n\n\tprivate initializePollingDlob(driftDlobServerHttpUrl: string) {\n\t\tthis._pollingDlob = new PollingDlob({\n\t\t\tdriftDlobServerHttpUrl: driftDlobServerHttpUrl,\n\t\t});\n\t}\n\n\tprivate initializePriorityFeeSubscriber(\n\t\tconfig?: Partial<PriorityFeeSubscriberConfig>\n\t) {\n\t\t// Convert tradable markets to DriftMarketInfo format for priority fee subscriber\n\t\tconst driftMarkets = this._tradableMarkets.map((market) => ({\n\t\t\tmarketType: market.marketTypeStr,\n\t\t\tmarketIndex: market.marketIndex,\n\t\t}));\n\n\t\tconst priorityFeeConfig: PriorityFeeSubscriberConfig = {\n\t\t\tconnection: this.driftClient.connection,\n\t\t\tpriorityFeeMethod: PriorityFeeMethod.SOLANA,\n\t\t\tdriftMarkets,\n\t\t\taddresses: HIGH_ACTIVITY_MARKET_ACCOUNTS,\n\t\t\t...config,\n\t\t};\n\n\t\tthis.priorityFeeSubscriber = new PriorityFeeSubscriber(priorityFeeConfig);\n\t}\n\n\tprivate setupDriftClient(\n\t\tconfig: Omit<AuthorityDriftConfig, 'onUserAccountUpdate'>\n\t) {\n\t\tconst driftEnv = config.driftEnv;\n\n\t\tconst connection = new Connection(config.solanaRpcEndpoint);\n\t\tconst driftProgramID = new PublicKey(DRIFT_PROGRAM_ID);\n\t\tconst accountLoader = new CustomizedCadenceBulkAccountLoader(\n\t\t\tconnection,\n\t\t\tDEFAULT_ACCOUNT_LOADER_COMMITMENT,\n\t\t\tDEFAULT_ACCOUNT_LOADER_POLLING_FREQUENCY_MS\n\t\t);\n\t\tthis.accountLoader = accountLoader;\n\n\t\tconst wallet = config.wallet ?? COMMON_UI_UTILS.createPlaceholderIWallet();\n\t\tconst skipInitialUsersLoad = !config.wallet;\n\n\t\tconst perpMarkets =\n\t\t\tconfig.tradableMarkets\n\t\t\t\t?.filter((market) => market.isPerp)\n\t\t\t\t.map((market) =>\n\t\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\t\tdriftEnv,\n\t\t\t\t\t\tMarketType.PERP,\n\t\t\t\t\t\tmarket.marketIndex\n\t\t\t\t\t)\n\t\t\t\t) ?? PerpMarkets[driftEnv];\n\t\tconst spotMarkets =\n\t\t\tconfig.tradableMarkets\n\t\t\t\t?.filter((market) => !market.isPerp)\n\t\t\t\t.map((market) =>\n\t\t\t\t\tMARKET_UTILS.getMarketConfig(\n\t\t\t\t\t\tdriftEnv,\n\t\t\t\t\t\tMarketType.SPOT,\n\t\t\t\t\t\tmarket.marketIndex\n\t\t\t\t\t)\n\t\t\t\t) ?? SpotMarkets[driftEnv];\n\t\tconst { perpMarketIndexes, spotMarketIndexes, oracleInfos } =\n\t\t\tgetMarketsAndOraclesForSubscription(driftEnv, perpMarkets, spotMarkets);\n\n\t\tconst driftClientConfig: DriftClientConfig = {\n\t\t\tenv: driftEnv,\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tprogramID: driftProgramID,\n\t\t\tenableMetricsEvents: false,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'polling',\n\t\t\t\taccountLoader,\n\t\t\t},\n\t\t\tuserStats: true,\n\t\t\tincludeDelegates: true,\n\t\t\tskipLoadUsers: skipInitialUsersLoad,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes,\n\t\t\tspotMarketIndexes,\n\t\t\toracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis._driftClient = new DriftClient(driftClientConfig);\n\n\t\tconst txSender = new WhileValidTxSender({\n\t\t\tconnection,\n\t\t\twallet,\n\t\t\tadditionalConnections: [],\n\t\t\tadditionalTxSenderCallbacks: [],\n\t\t\ttxHandler: this._driftClient.txHandler,\n\t\t\tconfirmationStrategy: DEFAULT_TX_SENDER_CONFIRMATION_STRATEGY,\n\t\t\tretrySleep: DEFAULT_TX_SENDER_RETRY_INTERVAL,\n\t\t});\n\n\t\tthis._driftClient.txSender = txSender;\n\n\t\treturn this._driftClient;\n\t}\n\n\tprivate setupOrderbookManager() {\n\t\tthis.orderbookSubscription = this._orderbookManager.onUpdate(\n\t\t\t(orderbookData) => {\n\t\t\t\tconst marketKey = new MarketId(\n\t\t\t\t\torderbookData.marketIndex,\n\t\t\t\t\tENUM_UTILS.toObj(orderbookData.marketType as string) as MarketType\n\t\t\t\t).key;\n\n\t\t\t\tconst markPrice = orderbookData.markPrice;\n\n\t\t\t\tthis._markPriceCache.updateMarkPrices({\n\t\t\t\t\tmarketKey,\n\t\t\t\t\tmarkPrice,\n\t\t\t\t\tbestAsk: orderbookData.bestAskPrice,\n\t\t\t\t\tbestBid: orderbookData.bestBidPrice,\n\t\t\t\t\tlastUpdateSlot: orderbookData.slot ?? 0,\n\t\t\t\t});\n\n\t\t\t\tthis._oraclePriceCache.updateOraclePrices({\n\t\t\t\t\t...orderbookData.oracleData,\n\t\t\t\t\tmarketKey,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate setupPollingDlob() {\n\t\t// DriftL2OrderbookManager will handle the fetching of data for the selected trade market through websocket\n\n\t\tthis._pollingDlob.addInterval(\n\t\t\tPollingCategory.USER_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_DEEP,\n\t\t\tPOLLING_DEPTHS.DEEP\n\t\t); // markets that the user is involved in\n\t\tthis._pollingDlob.addInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tPOLLING_INTERVALS.BACKGROUND_SHALLOW,\n\t\t\tPOLLING_DEPTHS.SHALLOW\n\t\t); // markets that the user is not involved in\n\n\t\t// add all markets to the user-not-involved interval first, until user-involved markets are known\n\t\tthis._pollingDlob.addMarketsToInterval(\n\t\t\tPollingCategory.USER_NOT_INVOLVED,\n\t\t\tthis._tradableMarkets.map((market) => market.key)\n\t\t);\n\n\t\tthis.pollingDlobSubscription = this._pollingDlob\n\t\t\t.onData()\n\t\t\t.subscribe((data) => {\n\t\t\t\tconst updatedMarkPrices = data.map((marketData) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarketKey: marketData.marketId.key,\n\t\t\t\t\t\tmarkPrice: marketData.data.markPrice,\n\t\t\t\t\t\tbestBid: marketData.data.bestBidPrice,\n\t\t\t\t\t\tbestAsk: marketData.data.bestAskPrice,\n\t\t\t\t\t\tlastUpdateSlot: marketData.data.slot ?? 0,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tconst updatedOraclePrices = data.map((marketData) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarketKey: marketData.marketId.key,\n\t\t\t\t\t\t...marketData.data.oracleData,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tthis._markPriceCache.updateMarkPrices(...updatedMarkPrices);\n\t\t\t\tthis._oraclePriceCache.updateOraclePrices(...updatedOraclePrices);\n\t\t\t});\n\t}\n\n\tprivate initializeManagers(\n\t\tdlobServerHttpUrl: string,\n\t\tswiftServerUrl: string\n\t) {\n\t\t// Initialize trading operations\n\t\tthis.driftOperations = new DriftOperations(\n\t\t\tthis._driftClient,\n\t\t\t() => this._userAccountCache,\n\t\t\tdlobServerHttpUrl,\n\t\t\tswiftServerUrl,\n\t\t\t() => this.priorityFeeSubscriber.getCustomStrategyResult()\n\t\t);\n\n\t\t// Initialize subscription manager with all subscription and market operations\n\t\tthis.subscriptionManager = new SubscriptionManager(\n\t\t\tthis._driftClient,\n\t\t\tthis.accountLoader,\n\t\t\tthis._pollingDlob,\n\t\t\tthis._orderbookManager,\n\t\t\tthis._userAccountCache,\n\t\t\tthis._tradableMarkets,\n\t\t\tthis.selectedTradeMarket\n\t\t);\n\t}\n\n\tprivate unsubscribeFromPollingDlob() {\n\t\tthis.pollingDlobSubscription?.unsubscribe();\n\t\tthis.pollingDlobSubscription = null;\n\n\t\tthis._pollingDlob.stop();\n\t}\n\n\tprivate unsubscribeFromOrderbook() {\n\t\tthis.orderbookSubscription?.unsubscribe();\n\t\tthis.orderbookSubscription = null;\n\n\t\tthis._orderbookManager.unsubscribe();\n\t}\n\n\tpublic async subscribe() {\n\t\tconst handleGeoBlock = async () => {\n\t\t\ttry {\n\t\t\t\tthis._isGeoBlocked = (await checkGeoBlock()) ?? false;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn('Failed to check geoblock status:', error);\n\t\t\t\tthis._isGeoBlocked = false; // Default to not blocked if check fails\n\t\t\t}\n\t\t};\n\n\t\t// async logic that doesn't require DriftClient to be subscribed\n\t\tconst handleGeoBlockPromise = handleGeoBlock();\n\t\tconst pollingDlobStartPromise = this._pollingDlob.start();\n\t\tconst priorityFeeSubscribePromise = this.priorityFeeSubscriber.subscribe();\n\t\tconst orderbookSubscribePromise = this._orderbookManager.subscribe();\n\n\t\tawait this._driftClient.subscribe();\n\n\t\t// filter out markets that are delisted\n\t\tconst actualTradableMarkets = this._tradableMarkets.filter((market) => {\n\t\t\tconst marketAccount = market.isPerp\n\t\t\t\t? this._driftClient.getPerpMarketAccount(market.marketIndex)\n\t\t\t\t: this._driftClient.getSpotMarketAccount(market.marketIndex);\n\n\t\t\tif (\n\t\t\t\t!marketAccount ||\n\t\t\t\tDELISTED_MARKET_STATUSES.some((marketStatus) =>\n\t\t\t\t\tENUM_UTILS.match(marketAccount.status, marketStatus)\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\tthis._tradableMarkets = actualTradableMarkets;\n\t\tthis.subscriptionManager.updateTradableMarkets(actualTradableMarkets);\n\t\tthis.setupPollingDlob();\n\t\tthis.setupOrderbookManager();\n\n\t\tconst subscribeToNonWhitelistedButUserInvolvedMarketsPromise =\n\t\t\tthis.subscriptionManager.subscribeToNonWhitelistedButUserInvolvedMarkets(\n\t\t\t\tthis._driftClient.getUsers()\n\t\t\t);\n\n\t\tawait Promise.all([\n\t\t\tpollingDlobStartPromise,\n\t\t\tsubscribeToNonWhitelistedButUserInvolvedMarketsPromise,\n\t\t\tpriorityFeeSubscribePromise,\n\t\t\thandleGeoBlockPromise,\n\t\t\torderbookSubscribePromise,\n\t\t]);\n\n\t\tthis.subscriptionManager.subscribeToAllUsersUpdates();\n\n\t\t// TODO: subscribe to oracle price updates from drift client?\n\t}\n\n\tpublic async unsubscribe() {\n\t\tthis.unsubscribeFromPollingDlob();\n\t\tthis.unsubscribeFromOrderbook();\n\t\tthis._userAccountCache.destroy();\n\t\tthis._markPriceCache.destroy();\n\t\tthis._orderbookManager.destroy();\n\n\t\tconst driftClientUnsubscribePromise = this._driftClient.unsubscribe();\n\t\tconst priorityFeeUnsubscribePromise =\n\t\t\tthis.priorityFeeSubscriber.unsubscribe();\n\n\t\tawait Promise.all(\n\t\t\t[driftClientUnsubscribePromise, priorityFeeUnsubscribePromise].filter(\n\t\t\t\tBoolean\n\t\t\t)\n\t\t);\n\n\t\tthis.pollingDlobSubscription = null;\n\t}\n\n\tpublic onOraclePricesUpdate(\n\t\tcallback: (oraclePrice: OraclePriceLookup) => void\n\t) {\n\t\treturn this._oraclePriceCache.onUpdate(callback);\n\t}\n\n\tpublic onMarkPricesUpdate(callback: (markPrice: MarkPriceLookup) => void) {\n\t\treturn this._markPriceCache.onUpdate(callback);\n\t}\n\n\tpublic onUserAccountUpdate(\n\t\tcallback: (userAccount: EnhancedAccountData) => void\n\t) {\n\t\treturn this._userAccountCache.onUpdate(callback);\n\t}\n\n\tpublic onOrderbookUpdate(\n\t\tcallback: (orderbook: L2WithOracleAndMarketData) => void\n\t) {\n\t\treturn this._orderbookManager.onUpdate(callback);\n\t}\n\n\t/**\n\t * Updates the authority (wallet) for the drift client and reestablishes subscriptions.\n\t *\n\t * @param wallet - The new wallet to use as authority\n\t * @param activeSubAccountId - Optional subaccount ID to switch to after wallet update\n\t */\n\tpublic async updateAuthority(wallet: IWallet, activeSubAccountId?: number) {\n\t\treturn this.subscriptionManager.updateAuthority(wallet, activeSubAccountId);\n\t}\n\n\t/**\n\t * Updates the selected trade market and optimizes subscription polling.\n\t *\n\t * @param newSelectedTradeMarket - The new market to prioritize for trading\n\t */\n\tpublic updateSelectedTradeMarket(newSelectedTradeMarket: MarketId | null) {\n\t\tconst isNewSelectedTradeMarket =\n\t\t\t!!newSelectedTradeMarket !== !!this.selectedTradeMarket || // only one of them is null\n\t\t\t(!!newSelectedTradeMarket && // or both are not null and are different\n\t\t\t\t!!this.selectedTradeMarket &&\n\t\t\t\t!this.selectedTradeMarket.equals(newSelectedTradeMarket));\n\n\t\tif (!isNewSelectedTradeMarket) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Update the local reference\n\t\tthis.selectedTradeMarket = newSelectedTradeMarket;\n\n\t\t// Delegate to subscription manager for all polling optimization\n\t\tthis.subscriptionManager.updateSelectedTradeMarket(newSelectedTradeMarket);\n\t}\n\n\t/**\n\t * Creates a new user account and deposits initial collateral.\n\t *\n\t * @param params - Parameters for creating user and depositing collateral\n\t * @returns Promise resolving to transaction signature and user account public key\n\t */\n\tpublic async createUserAndDeposit(\n\t\tparams: CreateUserAndDepositParams\n\t): Promise<{\n\t\ttxSig: TransactionSignature;\n\t\tuser: User;\n\t}> {\n\t\treturn this.driftOperations.createUserAndDeposit(params);\n\t}\n\n\t/**\n\t * Creates a RevenueShareEscrow account for the user.\n\t *\n\t * @param params - Parameters for creating a RevenueShareEscrow account\n\t * @returns Promise resolving to the transaction signature of the creation\n\t */\n\tpublic async createRevenueShareEscrow(\n\t\tparams: CreateRevenueShareEscrowParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.createRevenueShareEscrow(params);\n\t}\n\n\t/**\n\t * Deposits collateral into a user's spot market position.\n\t *\n\t * @param params - Parameters for the deposit operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async deposit(params: DepositParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.deposit(params);\n\t}\n\n\t/**\n\t * Withdraws collateral from a user's spot market position.\n\t *\n\t * @param params - Parameters for the withdrawal operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async withdraw(params: WithdrawParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.withdraw(params);\n\t}\n\n\t/**\n\t * Opens a perpetual market order.\n\t *\n\t * @param params - Parameters for the perp order\n\t * @returns Promise resolving to the transaction signature\n\t */\n\t@enforceGeoBlock\n\tpublic async openPerpOrder(\n\t\tparams: PerpOrderParams\n\t): Promise<TransactionSignature | void> {\n\t\treturn this.driftOperations.openPerpOrder(params);\n\t}\n\n\t/**\n\t * Executes a swap between two spot markets.\n\t *\n\t * @param params - Parameters for the swap operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async swap(params: SwapParams): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.swap(params);\n\t}\n\n\tpublic async getSwapQuote(\n\t\tparams: Omit<SwapParams, 'jupiterQuote'> & {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t}\n\t): Promise<QuoteResponse> {\n\t\treturn this.driftOperations.getSwapQuote(params);\n\t}\n\n\t/**\n\t * Settles profit and loss for a perpetual position.\n\t *\n\t * @param params - Parameters for the settle PnL operation\n\t * @returns Promise resolving to the transaction signature\n\t */\n\tpublic async settleAccountPnl(\n\t\tparams: SettleAccountPnlParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.settleAccountPnl(params);\n\t}\n\n\t/**\n\t * Deletes a user account from the Drift protocol.\n\t *\n\t * @param subAccountId - The ID of the sub-account to delete\n\t * @returns Promise resolving to the transaction signature of the deletion\n\t */\n\tpublic async deleteUser(subAccountId: number): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.deleteUser(subAccountId);\n\t}\n\n\t/**\n\t * Cancels a list of open orders.\n\t *\n\t * @param params - See `CancelOrdersParams`\n\t * @returns Promise resolving to the transaction signature of the cancellation\n\t */\n\tpublic async cancelOrders(\n\t\tparams: CancelOrdersParams\n\t): Promise<TransactionSignature> {\n\t\treturn this.driftOperations.cancelOrders(params);\n\t}\n\n\tpublic getTxParams(overrides?: Partial<TxParams>): TxParams {\n\t\treturn this.driftOperations.getTxParams(overrides);\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BN, DriftClientConfig, DriftEnv, MarketType, OrderTriggerCondition, PositionDirection, PublicKey, QuoteResponse, SwapMode, TxParams, User } from '@drift-labs/sdk';
|
|
1
|
+
import { BN, DriftClient, DriftClientConfig, DriftEnv, MarketType, OrderTriggerCondition, PositionDirection, PublicKey, QuoteResponse, SwapMode, TxParams, User } from '@drift-labs/sdk';
|
|
2
2
|
import { Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
3
3
|
import { CentralServerGetOpenPerpMarketOrderTxnParams, CentralServerGetOpenPerpNonMarketOrderTxnParams } from './types';
|
|
4
4
|
import { CentralServerDriftMarkets } from './markets';
|
|
@@ -8,7 +8,7 @@ import { CentralServerDriftMarkets } from './markets';
|
|
|
8
8
|
* This is useful for an API server that fetches user data on-demand, and return transaction messages specific to a given user
|
|
9
9
|
*/
|
|
10
10
|
export declare class CentralServerDrift {
|
|
11
|
-
private
|
|
11
|
+
private _driftClient;
|
|
12
12
|
private _perpMarketConfigs;
|
|
13
13
|
private _spotMarketConfigs;
|
|
14
14
|
/**
|
|
@@ -29,6 +29,7 @@ export declare class CentralServerDrift {
|
|
|
29
29
|
supportedSpotMarkets: number[];
|
|
30
30
|
additionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;
|
|
31
31
|
});
|
|
32
|
+
get driftClient(): DriftClient;
|
|
32
33
|
subscribe(): Promise<void>;
|
|
33
34
|
unsubscribe(): Promise<void>;
|
|
34
35
|
/**
|