@drift-labs/common 1.0.49 → 1.0.51
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/actions/actionHelpers/accountDeletionHelpers.js +2 -2
- package/lib/actions/actionHelpers/accountDeletionHelpers.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +7 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -1
- package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +6 -1
- package/lib/drift/Drift/clients/CentralServerDrift/index.js +27 -3
- package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
- package/lib/drift/base/actions/user/delete.d.ts +9 -16
- package/lib/drift/base/actions/user/delete.js +20 -15
- package/lib/drift/base/actions/user/delete.js.map +1 -1
- package/lib/drift/base/actions/user/index.d.ts +2 -0
- package/lib/drift/base/actions/user/index.js +2 -0
- package/lib/drift/base/actions/user/index.js.map +1 -1
- package/lib/drift/base/actions/user/update-username.d.ts +13 -0
- package/lib/drift/base/actions/user/update-username.js +26 -0
- package/lib/drift/base/actions/user/update-username.js.map +1 -0
- package/package.json +2 -2
|
@@ -50,8 +50,8 @@ const getAccountCanBeDeletedInstantly = (user, userStatsAccount, currentSlot) =>
|
|
|
50
50
|
const statsAccountIsPastDeletionCutoff = getStatsAccountIsPastDeletionCutoff(userStatsAccount);
|
|
51
51
|
const userIsIdle = user.getUserAccount().idle;
|
|
52
52
|
const userCanBeMarkedIdle = user.canMakeIdle(new sdk_1.BN(currentSlot));
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
53
|
+
const accountHasOpenPerpSpotOrOrders = accountHasOpenPositionsOrOrders(user);
|
|
54
|
+
if (accountHasOpenPerpSpotOrOrders) {
|
|
55
55
|
return 'no';
|
|
56
56
|
}
|
|
57
57
|
if (statsAccountIsPastDeletionCutoff || userIsIdle) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountDeletionHelpers.js","sourceRoot":"","sources":["../../../src/actions/actionHelpers/accountDeletionHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tACCOUNT_AGE_DELETION_CUTOFF_SECONDS,\n\tBN,\n\tDriftClient,\n\tIDLE_TIME_SLOTS,\n\tSLOT_TIME_ESTIMATE_MS,\n\tUser,\n\tUserStats,\n\tUserStatsAccount,\n\tZERO,\n\tisVariant,\n\tpositionIsAvailable,\n} from '@drift-labs/sdk';\nimport { TransactionInstruction } from '@solana/web3.js';\n\ntype AccountDeletionStep =\n\t| 'askToCloseAllPositionsOrdersBorrows'\n\t| 'sendAccountDeletionIx'\n\t| 'sendBalanceWithdrawalIx'\n\t| 'sendTriggerAccountIdleIx'\n\t| 'askToWait';\n\nconst getStatsAccountDeletionWaitTime = (\n\tuserStatsAccount: UserStatsAccount\n) => {\n\tconst estimatedAgeSeconds =\n\t\tMath.round(Date.now() / 1000) -\n\t\tUserStats.getOldestActionTs(userStatsAccount);\n\n\treturn Math.max(ACCOUNT_AGE_DELETION_CUTOFF_SECONDS - estimatedAgeSeconds, 0);\n};\n\nconst getStatsAccountIsPastDeletionCutoff = (\n\tuserStatsAccount: UserStatsAccount\n) => {\n\tconst estimatedAgeSeconds =\n\t\tMath.round(Date.now() / 1000) -\n\t\tUserStats.getOldestActionTs(userStatsAccount);\n\n\treturn estimatedAgeSeconds >= ACCOUNT_AGE_DELETION_CUTOFF_SECONDS;\n};\n\nconst accountHasOpenPerpPositions = (user: User) => {\n\tconst userAccount = user.getUserAccount();\n\tfor (const perpPosition of userAccount.perpPositions) {\n\t\tif (!positionIsAvailable(perpPosition)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nconst accountHasOpenSpotPositions = (user: User) => {\n\tconst userAccount = user.getUserAccount();\n\tfor (const spotPosition of userAccount.spotPositions) {\n\t\tif (spotPosition.scaledBalance.gt(ZERO)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nconst accountHasOpenOrders = (user: User) => {\n\tconst userAccount = user.getUserAccount();\n\treturn userAccount.orders.some((order) => isVariant(order.status, 'open'));\n};\n\nconst accountHasOpenPositionsOrOrders = (user: User) => {\n\tif (accountHasOpenPerpPositions(user)) {\n\t\treturn true;\n\t}\n\n\tif (accountHasOpenSpotPositions(user)) {\n\t\treturn true;\n\t}\n\n\tif (accountHasOpenOrders(user)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\ntype CanBeDeletedState =\n\t| 'no'\n\t| 'yes'\n\t| 'no-wait-for-idle'\n\t| 'yes-after-making-idle';\n\nconst getAccountCanBeDeletedInstantly = (\n\tuser: User,\n\tuserStatsAccount: UserStatsAccount,\n\tcurrentSlot: number\n): CanBeDeletedState => {\n\tconst statsAccountIsPastDeletionCutoff =\n\t\tgetStatsAccountIsPastDeletionCutoff(userStatsAccount);\n\n\tconst userIsIdle = user.getUserAccount().idle;\n\n\tconst userCanBeMarkedIdle = user.canMakeIdle(new BN(currentSlot));\n\n\tconst accountHasNoOpenPositionsOrOrders =\n\t\t!accountHasOpenPositionsOrOrders(user);\n\n\tif (!accountHasNoOpenPositionsOrOrders) {\n\t\treturn 'no';\n\t}\n\n\tif (statsAccountIsPastDeletionCutoff || userIsIdle) {\n\t\treturn 'yes';\n\t}\n\n\tif (!userCanBeMarkedIdle) {\n\t\treturn 'no-wait-for-idle';\n\t}\n\n\treturn 'yes-after-making-idle';\n};\n\n/**\n * To try improve the UX we want to abstract away the different account states and deletion compliance. This method returns the steps required to give the best UX for account deletion depending on the incoming account state. A short explanation of the logic:\n *\n * States that affect whether an account can be deleted:\n * - A user stats account that is older than 13 days => All accounts can be deleted\n * - A user account that is idle => The user account in question can be deleted\n * - A user account that can be marked idle => The user account in question can be deleted after sending a markIdle instruction\n * - A user that is not/can not be idle (yet), with no stats account older than 13 days => wait until the account is idle and then try again. If the user has open perp positions, orders or borrows, they need to be closed first as well.\n * @param userAccount\n * @param userStatsAccount\n */\nconst getAccountDeletionStepsToTake = (\n\tuser: User,\n\tuserStatsAccount: UserStatsAccount,\n\tcurrentSlot: number\n): AccountDeletionStep[] => {\n\tconst userAccount = user.getUserAccount();\n\tconst statsAccountIsPastDeletionCutoff =\n\t\tgetStatsAccountIsPastDeletionCutoff(userStatsAccount);\n\n\t// Account is past deletion cutoff\n\tif (statsAccountIsPastDeletionCutoff) {\n\t\treturn ['sendAccountDeletionIx'];\n\t}\n\n\t// Account needs to be unwound first\n\tconst hasOpenPositionsOrOrders = accountHasOpenPositionsOrOrders(user);\n\n\tif (hasOpenPositionsOrOrders) {\n\t\treturn ['askToCloseAllPositionsOrdersBorrows'];\n\t}\n\n\t// Account is idle and can be deleted\n\tconst userAccountIsIdle = userAccount.idle;\n\n\tif (userAccountIsIdle) {\n\t\treturn ['sendAccountDeletionIx'];\n\t}\n\n\t// Account can be marked idle and then deleted\n\tconst canBeMarkedIdle = user.canMakeIdle(new BN(currentSlot));\n\n\tif (canBeMarkedIdle) {\n\t\treturn ['sendTriggerAccountIdleIx', 'sendAccountDeletionIx'];\n\t}\n\n\t// Account is not idle and can not be marked idle yet, wait until it is (or can be marked) idle and then try again\n\treturn ['askToWait'];\n};\n\n/**\n * Builds the necessary transaction to delete a user account. This method will throw an error if the account cannot be deleted instantly.\n * @param driftClient\n * @param user\n * @param userStatsAccount\n * @param latestSlot\n * @returns\n */\nconst tryDeleteUserAccount = async (\n\tdriftClient: DriftClient,\n\tuser: User,\n\tuserStatsAccount: UserStatsAccount,\n\tlatestSlot: number\n) => {\n\tconst canBeDeleted = getAccountCanBeDeletedInstantly(\n\t\tuser,\n\t\tuserStatsAccount,\n\t\tlatestSlot\n\t);\n\n\tif (canBeDeleted === 'no' || canBeDeleted === 'no-wait-for-idle') {\n\t\tthrow new Error('Account cannot be deleted');\n\t}\n\n\tconst Ixs: TransactionInstruction[] = [];\n\n\tif (canBeDeleted === 'yes-after-making-idle') {\n\t\t// Create the make idle instruction\n\t\tIxs.push(\n\t\t\tawait driftClient.getUpdateUserIdleIx(\n\t\t\t\tuser.userAccountPublicKey,\n\t\t\t\tuser.getUserAccount()\n\t\t\t)\n\t\t);\n\t}\n\n\t// Create the delete account instruction\n\tIxs.push(await driftClient.getUserDeletionIx(user.userAccountPublicKey));\n\n\t// Create a transaction from the instructions\n\tconst tx = await driftClient.buildTransaction(Ixs);\n\n\tconst { txSig } = await driftClient.sendTransaction(tx);\n\n\tconst userMapKey = driftClient.getUserMapKey(\n\t\tuser.getUserAccount().subAccountId,\n\t\tdriftClient.wallet.publicKey\n\t);\n\tawait driftClient.users.get(userMapKey)?.unsubscribe();\n\tdriftClient.users.delete(userMapKey);\n\n\treturn txSig;\n};\n\nexport const getIdleWaitTimeMinutes = (user: User, currentSlot: number) => {\n\tconst lastActiveSlot = user.getUserAccount().lastActiveSlot;\n\n\tconst inactiveAccountTime = Math.max(\n\t\tcurrentSlot - lastActiveSlot.toNumber(),\n\t\t0\n\t);\n\n\tconst slotsToWait = IDLE_TIME_SLOTS - inactiveAccountTime;\n\n\tconst secondsPerSlot = SLOT_TIME_ESTIMATE_MS / 1000;\n\n\tconst timeEstimateSeconds = slotsToWait * secondsPerSlot;\n\n\tconst minutesEstimate = Math.ceil(timeEstimateSeconds / 60);\n\n\treturn minutesEstimate;\n};\n\nexport const ACCOUNT_DELETION_HELPERS = {\n\taccountHasOpenOrders,\n\taccountHasOpenPerpPositions,\n\taccountHasOpenSpotPositions,\n\tgetAccountDeletionStepsToTake,\n\tgetAccountCanBeDeletedInstantly,\n\tgetStatsAccountIsPastDeletionCutoff,\n\ttryDeleteUserAccount,\n\tgetIdleWaitTimeMinutes,\n\tgetStatsAccountDeletionWaitTime,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"accountDeletionHelpers.js","sourceRoot":"","sources":["../../../src/actions/actionHelpers/accountDeletionHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tACCOUNT_AGE_DELETION_CUTOFF_SECONDS,\n\tBN,\n\tDriftClient,\n\tIDLE_TIME_SLOTS,\n\tSLOT_TIME_ESTIMATE_MS,\n\tUser,\n\tUserStats,\n\tUserStatsAccount,\n\tZERO,\n\tisVariant,\n\tpositionIsAvailable,\n} from '@drift-labs/sdk';\nimport { TransactionInstruction } from '@solana/web3.js';\n\ntype AccountDeletionStep =\n\t| 'askToCloseAllPositionsOrdersBorrows'\n\t| 'sendAccountDeletionIx'\n\t| 'sendBalanceWithdrawalIx'\n\t| 'sendTriggerAccountIdleIx'\n\t| 'askToWait';\n\nconst getStatsAccountDeletionWaitTime = (\n\tuserStatsAccount: UserStatsAccount\n) => {\n\tconst estimatedAgeSeconds =\n\t\tMath.round(Date.now() / 1000) -\n\t\tUserStats.getOldestActionTs(userStatsAccount);\n\n\treturn Math.max(ACCOUNT_AGE_DELETION_CUTOFF_SECONDS - estimatedAgeSeconds, 0);\n};\n\nconst getStatsAccountIsPastDeletionCutoff = (\n\tuserStatsAccount: UserStatsAccount\n) => {\n\tconst estimatedAgeSeconds =\n\t\tMath.round(Date.now() / 1000) -\n\t\tUserStats.getOldestActionTs(userStatsAccount);\n\n\treturn estimatedAgeSeconds >= ACCOUNT_AGE_DELETION_CUTOFF_SECONDS;\n};\n\nconst accountHasOpenPerpPositions = (user: User) => {\n\tconst userAccount = user.getUserAccount();\n\tfor (const perpPosition of userAccount.perpPositions) {\n\t\tif (!positionIsAvailable(perpPosition)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nconst accountHasOpenSpotPositions = (user: User) => {\n\tconst userAccount = user.getUserAccount();\n\tfor (const spotPosition of userAccount.spotPositions) {\n\t\tif (spotPosition.scaledBalance.gt(ZERO)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nconst accountHasOpenOrders = (user: User) => {\n\tconst userAccount = user.getUserAccount();\n\treturn userAccount.orders.some((order) => isVariant(order.status, 'open'));\n};\n\nconst accountHasOpenPositionsOrOrders = (user: User) => {\n\tif (accountHasOpenPerpPositions(user)) {\n\t\treturn true;\n\t}\n\n\tif (accountHasOpenSpotPositions(user)) {\n\t\treturn true;\n\t}\n\n\tif (accountHasOpenOrders(user)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\ntype CanBeDeletedState =\n\t| 'no'\n\t| 'yes'\n\t| 'no-wait-for-idle'\n\t| 'yes-after-making-idle';\n\nconst getAccountCanBeDeletedInstantly = (\n\tuser: User,\n\tuserStatsAccount: UserStatsAccount,\n\tcurrentSlot: number\n): CanBeDeletedState => {\n\tconst statsAccountIsPastDeletionCutoff =\n\t\tgetStatsAccountIsPastDeletionCutoff(userStatsAccount);\n\n\tconst userIsIdle = user.getUserAccount().idle;\n\n\tconst userCanBeMarkedIdle = user.canMakeIdle(new BN(currentSlot));\n\n\tconst accountHasOpenPerpSpotOrOrders = accountHasOpenPositionsOrOrders(user);\n\n\tif (accountHasOpenPerpSpotOrOrders) {\n\t\treturn 'no';\n\t}\n\n\tif (statsAccountIsPastDeletionCutoff || userIsIdle) {\n\t\treturn 'yes';\n\t}\n\n\tif (!userCanBeMarkedIdle) {\n\t\treturn 'no-wait-for-idle';\n\t}\n\n\treturn 'yes-after-making-idle';\n};\n\n/**\n * To try improve the UX we want to abstract away the different account states and deletion compliance. This method returns the steps required to give the best UX for account deletion depending on the incoming account state. A short explanation of the logic:\n *\n * States that affect whether an account can be deleted:\n * - A user stats account that is older than 13 days => All accounts can be deleted\n * - A user account that is idle => The user account in question can be deleted\n * - A user account that can be marked idle => The user account in question can be deleted after sending a markIdle instruction\n * - A user that is not/can not be idle (yet), with no stats account older than 13 days => wait until the account is idle and then try again. If the user has open perp positions, orders or borrows, they need to be closed first as well.\n * @param userAccount\n * @param userStatsAccount\n */\nconst getAccountDeletionStepsToTake = (\n\tuser: User,\n\tuserStatsAccount: UserStatsAccount,\n\tcurrentSlot: number\n): AccountDeletionStep[] => {\n\tconst userAccount = user.getUserAccount();\n\tconst statsAccountIsPastDeletionCutoff =\n\t\tgetStatsAccountIsPastDeletionCutoff(userStatsAccount);\n\n\t// Account is past deletion cutoff\n\tif (statsAccountIsPastDeletionCutoff) {\n\t\treturn ['sendAccountDeletionIx'];\n\t}\n\n\t// Account needs to be unwound first\n\tconst hasOpenPositionsOrOrders = accountHasOpenPositionsOrOrders(user);\n\n\tif (hasOpenPositionsOrOrders) {\n\t\treturn ['askToCloseAllPositionsOrdersBorrows'];\n\t}\n\n\t// Account is idle and can be deleted\n\tconst userAccountIsIdle = userAccount.idle;\n\n\tif (userAccountIsIdle) {\n\t\treturn ['sendAccountDeletionIx'];\n\t}\n\n\t// Account can be marked idle and then deleted\n\tconst canBeMarkedIdle = user.canMakeIdle(new BN(currentSlot));\n\n\tif (canBeMarkedIdle) {\n\t\treturn ['sendTriggerAccountIdleIx', 'sendAccountDeletionIx'];\n\t}\n\n\t// Account is not idle and can not be marked idle yet, wait until it is (or can be marked) idle and then try again\n\treturn ['askToWait'];\n};\n\n/**\n * Builds the necessary transaction to delete a user account. This method will throw an error if the account cannot be deleted instantly.\n * @param driftClient\n * @param user\n * @param userStatsAccount\n * @param latestSlot\n * @returns\n */\nconst tryDeleteUserAccount = async (\n\tdriftClient: DriftClient,\n\tuser: User,\n\tuserStatsAccount: UserStatsAccount,\n\tlatestSlot: number\n) => {\n\tconst canBeDeleted = getAccountCanBeDeletedInstantly(\n\t\tuser,\n\t\tuserStatsAccount,\n\t\tlatestSlot\n\t);\n\n\tif (canBeDeleted === 'no' || canBeDeleted === 'no-wait-for-idle') {\n\t\tthrow new Error('Account cannot be deleted');\n\t}\n\n\tconst Ixs: TransactionInstruction[] = [];\n\n\tif (canBeDeleted === 'yes-after-making-idle') {\n\t\t// Create the make idle instruction\n\t\tIxs.push(\n\t\t\tawait driftClient.getUpdateUserIdleIx(\n\t\t\t\tuser.userAccountPublicKey,\n\t\t\t\tuser.getUserAccount()\n\t\t\t)\n\t\t);\n\t}\n\n\t// Create the delete account instruction\n\tIxs.push(await driftClient.getUserDeletionIx(user.userAccountPublicKey));\n\n\t// Create a transaction from the instructions\n\tconst tx = await driftClient.buildTransaction(Ixs);\n\n\tconst { txSig } = await driftClient.sendTransaction(tx);\n\n\tconst userMapKey = driftClient.getUserMapKey(\n\t\tuser.getUserAccount().subAccountId,\n\t\tdriftClient.wallet.publicKey\n\t);\n\tawait driftClient.users.get(userMapKey)?.unsubscribe();\n\tdriftClient.users.delete(userMapKey);\n\n\treturn txSig;\n};\n\nexport const getIdleWaitTimeMinutes = (user: User, currentSlot: number) => {\n\tconst lastActiveSlot = user.getUserAccount().lastActiveSlot;\n\n\tconst inactiveAccountTime = Math.max(\n\t\tcurrentSlot - lastActiveSlot.toNumber(),\n\t\t0\n\t);\n\n\tconst slotsToWait = IDLE_TIME_SLOTS - inactiveAccountTime;\n\n\tconst secondsPerSlot = SLOT_TIME_ESTIMATE_MS / 1000;\n\n\tconst timeEstimateSeconds = slotsToWait * secondsPerSlot;\n\n\tconst minutesEstimate = Math.ceil(timeEstimateSeconds / 60);\n\n\treturn minutesEstimate;\n};\n\nexport const ACCOUNT_DELETION_HELPERS = {\n\taccountHasOpenOrders,\n\taccountHasOpenPerpPositions,\n\taccountHasOpenSpotPositions,\n\tgetAccountDeletionStepsToTake,\n\tgetAccountCanBeDeletedInstantly,\n\tgetStatsAccountIsPastDeletionCutoff,\n\ttryDeleteUserAccount,\n\tgetIdleWaitTimeMinutes,\n\tgetStatsAccountDeletionWaitTime,\n};\n"]}
|
|
@@ -160,13 +160,19 @@ class DriftOperations {
|
|
|
160
160
|
* ```
|
|
161
161
|
*/
|
|
162
162
|
async deleteUser(subAccountId) {
|
|
163
|
+
var _a;
|
|
163
164
|
const user = this.getUserAccountCache().getUser(subAccountId, this.driftClient.wallet.publicKey);
|
|
165
|
+
const userStatsAccount = (_a = this.driftClient.userStats) === null || _a === void 0 ? void 0 : _a.getAccount();
|
|
164
166
|
if (!user) {
|
|
165
167
|
throw new Error('User not found');
|
|
166
168
|
}
|
|
169
|
+
if (!userStatsAccount) {
|
|
170
|
+
throw new Error('User stats account not found');
|
|
171
|
+
}
|
|
167
172
|
const deleteTxn = await (0, delete_1.deleteUserTxn)({
|
|
168
173
|
driftClient: this.driftClient,
|
|
169
|
-
|
|
174
|
+
user: user.userClient,
|
|
175
|
+
userStatsAccount,
|
|
170
176
|
txParams: this.getTxParams(),
|
|
171
177
|
});
|
|
172
178
|
const { txSig } = await this.driftClient.sendTransaction(deleteTxn);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/drift/Drift/clients/AuthorityDrift/DriftOperations/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBigNum,\n\tDriftClient,\n\tJupiterClient,\n\tMarketType,\n\tMAX_LEVERAGE_ORDER_SIZE,\n\tQuoteResponse,\n\tSwapMode,\n\tTxParams,\n\tUnifiedSwapClient,\n\tUser,\n\tUserStatsAccount,\n\tZERO,\n} from '@drift-labs/sdk';\nimport { TransactionSignature } from '@solana/web3.js';\nimport { MARKET_UTILS } from '../../../../../common-ui-utils/market';\nimport { MAIN_POOL_ID } from '../../../../../constants';\nimport { TRADING_UTILS } from '../../../../../common-ui-utils/trading';\nimport { UserAccountCache } from '../../../stores/UserAccountCache';\nimport { createDepositTxn } from '../../../../base/actions/spot/deposit';\nimport { createUserAndDepositCollateralBaseTxn } from '../../../../base/actions/user/create';\nimport { createWithdrawTxn } from '../../../../base/actions/spot/withdraw';\nimport { deleteUserTxn } from '../../../../base/actions/user/delete';\nimport { createSettlePnlTxn } from '../../../../base/actions/perp/settlePnl';\nimport {\n\tCreateUserAndDepositParams,\n\tDepositParams,\n\tWithdrawParams,\n\tPerpOrderParams,\n\tSwapParams,\n\tSettleAccountPnlParams,\n\tCancelOrdersParams,\n\tCreateRevenueShareEscrowParams,\n} from './types';\nimport { createCancelOrdersTxn } from '../../../../base/actions/trade/cancelOrder';\nimport {\n\tcreateOpenPerpMarketOrder,\n\tOpenPerpMarketOrderParams,\n} from '../../../../base/actions/trade/openPerpOrder/openPerpMarketOrder';\nimport { createSwapTxn } from '../../../../base/actions/trade/swap';\nimport { createOpenPerpNonMarketOrder } from '../../../../base/actions/trade/openPerpOrder/openPerpNonMarketOrder';\nimport { createRevenueShareEscrowTxn } from '../../../../base/actions/builder/createRevenueShareEscrow';\n\n/**\n * Handles majority of the relevant operations on the Drift program including deposits,\n * withdrawals, position management, and trading operations.\n *\n * This class encapsulates the trading logic and provides a clean API for\n * executing various trading operations while handling common patterns like\n * token address resolution and transaction preparation.\n */\nexport class DriftOperations {\n\tstatic readonly DEFAULT_TX_PARAMS: TxParams = {\n\t\tcomputeUnitsPrice: 50_000,\n\t\tuseSimulatedComputeUnits: true,\n\t\tcomputeUnitsBufferMultiplier: 1.3,\n\t};\n\n\tstatic readonly MAX_COMPUTE_UNITS_PRICE = 1e15 / 10 / 1_400_000; // 1e15 = 1 SOL worth of micro lamports; 1e15 / 10 = 0.1 SOL worth of micro lamports; 1.4M = max compute units;\n\n\t/**\n\t * Creates a new DriftOperations instance.\n\t *\n\t * @param driftClient - The DriftClient instance for executing transactions\n\t * @param getUserAccountCache - Function to get the user account cache. We lazily load the user account cache, so that we always get the latest user account data.\n\t * @param getPriorityFee - Function to get current priority fee in micro lamports\n\t */\n\tconstructor(\n\t\tprivate driftClient: DriftClient,\n\t\tprivate getUserAccountCache: () => UserAccountCache,\n\t\tprivate dlobServerHttpUrl: string,\n\t\tprivate swiftServerUrl: string,\n\t\tprivate getPriorityFee: () => number\n\t) {}\n\n\t/**\n\t * Gets transaction parameters with dynamic priority fees.\n\t * Falls back to default if priority fee function is not available.\n\t */\n\tgetTxParams(overrides?: Partial<TxParams>): TxParams {\n\t\tconst unsafePriorityFee = Math.floor(\n\t\t\tthis.getPriorityFee() ??\n\t\t\t\tDriftOperations.DEFAULT_TX_PARAMS.computeUnitsPrice\n\t\t);\n\n\t\tconst safePriorityFee = Math.min(\n\t\t\tunsafePriorityFee,\n\t\t\tDriftOperations.MAX_COMPUTE_UNITS_PRICE\n\t\t);\n\n\t\treturn {\n\t\t\t...DriftOperations.DEFAULT_TX_PARAMS,\n\t\t\tcomputeUnitsPrice: safePriorityFee,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a new user account and deposits initial collateral.\n\t *\n\t * This method handles the complete onboarding flow for new users including:\n\t * - Validating that the subaccount doesn't already exist\n\t * - Resolving referrer information if provided\n\t * - Getting the correct token address for deposits\n\t * - Creating the user account with custom leverage settings\n\t * - Subscribing to the new user's account updates\n\t *\n\t * @param params - The parameters for user creation and initial deposit\n\t * @returns Promise resolving to transaction signature and user account public key\n\t *\n\t * @throws Error if subaccount already exists\n\t *\n\t * @example\n\t * ```typescript\n\t * const result = await tradingOps.createUserAndDeposit({\n\t * depositAmount: new BigNum(100),\n\t * depositSpotMarketIndex: 0, // USDC\n\t * name: \"Trading Account\",\n\t * maxLeverage: 5,\n\t * subAccountId: 0\n\t * });\n\t * ```\n\t */\n\tasync createUserAndDeposit(params: CreateUserAndDepositParams): Promise<{\n\t\ttxSig: TransactionSignature;\n\t\tuser: User;\n\t}> {\n\t\tconst {\n\t\t\tdepositAmount,\n\t\t\tdepositSpotMarketIndex,\n\t\t\tnewAccountName,\n\t\t\tmaxLeverage,\n\t\t\tpoolId = MAIN_POOL_ID,\n\t\t\treferrerName,\n\t\t} = params;\n\n\t\tconst spotMarketConfig = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tdepositSpotMarketIndex\n\t\t);\n\n\t\tconst customMaxMarginRatio = TRADING_UTILS.convertLeverageToMarginRatio(\n\t\t\tmaxLeverage ?? 0\n\t\t);\n\n\t\tlet userStatsAccount: UserStatsAccount | undefined = undefined;\n\n\t\ttry {\n\t\t\tuserStatsAccount = this.driftClient.userStats?.getAccount();\n\t\t} catch (error) {\n\t\t\t// ignore\n\t\t}\n\n\t\tconst { transaction, subAccountId } =\n\t\t\tawait createUserAndDepositCollateralBaseTxn({\n\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\tamount: depositAmount.val,\n\t\t\t\tspotMarketConfig: spotMarketConfig,\n\t\t\t\tauthority: this.driftClient.wallet.publicKey,\n\t\t\t\tuserStatsAccount: userStatsAccount,\n\t\t\t\taccountName: newAccountName,\n\t\t\t\treferrerName,\n\t\t\t\tcustomMaxMarginRatio,\n\t\t\t\tpoolId,\n\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(transaction);\n\n\t\tawait this.driftClient.addUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t); // adds user to driftclient's user map, subscribes to user account data\n\t\tconst user = this.driftClient.getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tuser.eventEmitter.on('update', () => {\n\t\t\tthis.getUserAccountCache().updateUserAccount(user);\n\t\t});\n\n\t\treturn {\n\t\t\ttxSig,\n\t\t\tuser,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a RevenueShareEscrow account for the user.\n\t *\n\t * @param params - The parameters for creating a RevenueShareEscrow account\n\t * @returns Promise resolving to the transaction signature of the creation\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.createRevenueShareEscrow({\n\t * numOrders: 16,\n\t * builder: {\n\t * builderAuthority: new PublicKey(\"builderAuthority\"),\n\t * maxFeeTenthBps: 100,\n\t * },\n\t * });\n\t * ```\n\t */\n\tasync createRevenueShareEscrow(\n\t\tparams: CreateRevenueShareEscrowParams\n\t): Promise<TransactionSignature> {\n\t\tconst txn = await createRevenueShareEscrowTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tauthority: this.driftClient.wallet.publicKey,\n\t\t\tnumOrders: params.numOrders ?? 16,\n\t\t\tbuilder: params.builder,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Deletes a user account.\n\t *\n\t * This method removes a user's sub-account from the Drift.\n\t *\n\t * @param subAccountId - The ID of the sub-account to delete\n\t * @returns A promise that resolves to the transaction signature of the deletion\n\t *\n\t * @throws {Error} When the user account is not found in the cache\n\t *\n\t * @example\n\t * ```typescript\n\t * // Delete user sub-account with ID 0\n\t * const txSignature = await tradingOps.deleteUser(0);\n\t * console.log('User deleted with transaction:', txSignature);\n\t * ```\n\t */\n\tasync deleteUser(subAccountId: number): Promise<TransactionSignature> {\n\t\tconst user = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!user) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst deleteTxn = await deleteUserTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuserPublicKey: user.userClient.userAccountPublicKey,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(deleteTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Deposits collateral into a user's spot market position.\n\t *\n\t * This method handles depositing tokens into a user's account, with optional\n\t * support for max borrow repayment scenarios where the deposit amount may be\n\t * over-estimated to ensure complete repayment of borrowed funds.\n\t *\n\t * @param params - The deposit parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.deposit({\n\t * subAccountId: 0,\n\t * amount: new BigNum(50),\n\t * spotMarketIndex: 0, // USDC\n\t * isMaxBorrowRepayment: false\n\t * });\n\t * ```\n\t */\n\tasync deposit(params: DepositParams): Promise<TransactionSignature> {\n\t\tconst { subAccountId, amount, spotMarketIndex, isMaxBorrowRepayment } =\n\t\t\tparams;\n\n\t\tconst spotMarketConfig = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tspotMarketIndex\n\t\t);\n\n\t\tconst user = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!user) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst depositTxn = await createDepositTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: user.userClient,\n\t\t\tamount: amount,\n\t\t\tspotMarketConfig: spotMarketConfig,\n\t\t\tisMaxBorrowRepayment,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(depositTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Withdraws collateral from a user's spot market position.\n\t *\n\t * This method handles withdrawing tokens from a user's account with options\n\t * for borrowing (if allowBorrow is true) or reduce-only withdrawals. For max\n\t * withdrawals with reduce-only, the amount is over-estimated to ensure\n\t * complete withdrawal.\n\t *\n\t * @param params - The withdrawal parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.withdraw({\n\t * subAccountId: 0,\n\t * amount: new BigNum(25),\n\t * spotMarketIndex: 0, // USDC\n\t * allowBorrow: false,\n\t * isMax: false\n\t * });\n\t * ```\n\t */\n\tasync withdraw(params: WithdrawParams): Promise<TransactionSignature> {\n\t\tconst {\n\t\t\tsubAccountId,\n\t\t\tamount,\n\t\t\tspotMarketIndex,\n\t\t\tisBorrow = false,\n\t\t\tisMax = false,\n\t\t} = params;\n\n\t\tconst spotMarketConfig = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tspotMarketIndex\n\t\t);\n\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst withdrawTxn = await createWithdrawTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tamount,\n\t\t\tspotMarketConfig,\n\t\t\tuser: accountData.userClient,\n\t\t\tisBorrow,\n\t\t\tisMax,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(withdrawTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Opens a perpetual market order (placeholder for future implementation).\n\t *\n\t * This method will handle opening long or short positions in perpetual markets\n\t * with support for market and limit orders, reduce-only orders, and post-only orders.\n\t *\n\t * @param params - The perp order parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.openPerpMarketOrder({\n\t * marketIndex: 0, // SOL-PERP\n\t * direction: 'long',\n\t * baseAssetAmount: new BigNum(1), // 1 SOL\n\t * orderType: 'market',\n\t * subAccountId: 0\n\t * });\n\t * ```\n\t */\n\tasync openPerpOrder(\n\t\tparams: PerpOrderParams\n\t): Promise<TransactionSignature | void> {\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tparams.subAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst user = accountData.userClient;\n\n\t\tconst processBracketOrders = (bracketOrdersInput?: {\n\t\t\ttakeProfitPrice?: BigNum;\n\t\t\tstopLossPrice?: BigNum;\n\t\t}) => {\n\t\t\tconst bracketOrders: OpenPerpMarketOrderParams['bracketOrders'] = {};\n\n\t\t\tif (bracketOrdersInput?.takeProfitPrice) {\n\t\t\t\tbracketOrders.takeProfit = {\n\t\t\t\t\ttriggerPrice: bracketOrdersInput.takeProfitPrice.val,\n\t\t\t\t\tbaseAssetAmount: params.size.val,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (bracketOrdersInput?.stopLossPrice) {\n\t\t\t\tbracketOrders.stopLoss = {\n\t\t\t\t\ttriggerPrice: bracketOrdersInput.stopLossPrice.val,\n\t\t\t\t\tbaseAssetAmount: params.size.val,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn bracketOrders;\n\t\t};\n\n\t\tconst amountBN = params.isMaxLeverage\n\t\t\t? MAX_LEVERAGE_ORDER_SIZE\n\t\t\t: params.size.val;\n\n\t\tswitch (params.orderConfig.orderType) {\n\t\t\tcase 'market': {\n\t\t\t\tconst useSwift = !params.orderConfig.disableSwift;\n\n\t\t\t\tconst bracketOrders = processBracketOrders(\n\t\t\t\t\tparams.orderConfig.bracketOrders\n\t\t\t\t);\n\n\t\t\t\t// we split the logic for SWIFT and non-SWIFT orders to achieve better type inference\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\twallet: {\n\t\t\t\t\t\t\t\t// @ts-ignore TODO: we might want to add signMessage to the IWallet interface\n\t\t\t\t\t\t\t\tsignMessage: this.driftClient.wallet.signMessage,\n\t\t\t\t\t\t\t\ttakerAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t\tsigningAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tswiftServerUrl: this.swiftServerUrl,\n\t\t\t\t\t\t\t...params.orderConfig.swiftOptions,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\tdlobServerHttpUrl: this.dlobServerHttpUrl,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\toptionalAuctionParamsInputs:\n\t\t\t\t\t\t\tparams.orderConfig.optionalAuctionParamsInputs,\n\t\t\t\t\t\tbuilderParams: params.builderParams,\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn swiftOrderResult;\n\t\t\t\t} else {\n\t\t\t\t\tconst result = await createOpenPerpMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\toptionalAuctionParamsInputs:\n\t\t\t\t\t\t\tparams.orderConfig.optionalAuctionParamsInputs,\n\t\t\t\t\t\tdlobServerHttpUrl: this.dlobServerHttpUrl,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(result);\n\n\t\t\t\t\treturn txSig;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'limit': {\n\t\t\t\tconst useSwift = !params.orderConfig.disableSwift;\n\n\t\t\t\tconst bracketOrders = processBracketOrders(\n\t\t\t\t\tparams.orderConfig.bracketOrders\n\t\t\t\t);\n\n\t\t\t\t// we split the logic for SWIFT and non-SWIFT orders to achieve better type inference\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\torderConfig: {\n\t\t\t\t\t\t\torderType: 'limit',\n\t\t\t\t\t\t\tlimitPrice: params.orderConfig.limitPrice.val,\n\t\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\t},\n\t\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\t\tpostOnly: params.postOnly,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\twallet: {\n\t\t\t\t\t\t\t\t// @ts-ignore TODO: we might want to add signMessage to the IWallet interface\n\t\t\t\t\t\t\t\tsignMessage: this.driftClient.wallet.signMessage,\n\t\t\t\t\t\t\t\ttakerAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t\tsigningAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tswiftServerUrl: this.swiftServerUrl,\n\t\t\t\t\t\t\t...params.orderConfig.swiftOptions,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuilderParams: params.builderParams,\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn swiftOrderResult;\n\t\t\t\t} else {\n\t\t\t\t\tconst txn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\torderConfig: {\n\t\t\t\t\t\t\torderType: 'limit',\n\t\t\t\t\t\t\tlimitPrice: params.orderConfig.limitPrice.val,\n\t\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\t},\n\t\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\t\tpostOnly: params.postOnly,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\t\t\t\treturn txSig;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'takeProfit':\n\t\t\tcase 'stopLoss': {\n\t\t\t\tconst txn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tamount: amountBN,\n\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\torderConfig: {\n\t\t\t\t\t\torderType: params.orderConfig.orderType,\n\t\t\t\t\t\ttriggerPrice: params.orderConfig.triggerPrice.val,\n\t\t\t\t\t\tlimitPrice: params.orderConfig.limitPrice?.val ?? ZERO,\n\t\t\t\t\t},\n\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\tuseSwift: false,\n\t\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t});\n\n\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\t\t\treturn txSig;\n\t\t\t}\n\t\t\tcase 'oracleLimit': {\n\t\t\t\tconst txn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tamount: amountBN,\n\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\torderConfig: {\n\t\t\t\t\t\torderType: 'oracleLimit',\n\t\t\t\t\t\toraclePriceOffset: params.orderConfig.oraclePriceOffset.val,\n\t\t\t\t\t},\n\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\tuseSwift: false,\n\t\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t});\n\n\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\t\t\treturn txSig;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustiveCheck: never = params.orderConfig;\n\t\t\t\tthrow new Error('Invalid order type');\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getSwapQuote(\n\t\tparams: Omit<SwapParams, 'quote'> & {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t}\n\t): Promise<QuoteResponse> {\n\t\tconst jupiterClient = new JupiterClient({\n\t\t\tconnection: this.driftClient.connection,\n\t\t});\n\n\t\tconst inputMint = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tparams.fromMarketIndex\n\t\t).mint;\n\t\tconst outputMint = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tparams.toMarketIndex\n\t\t).mint;\n\n\t\tconst jupiterQuote = await jupiterClient.getQuote({\n\t\t\tinputMint,\n\t\t\toutputMint,\n\t\t\tamount: params.amount.val,\n\t\t\tslippageBps: params.slippageBps,\n\t\t\tswapMode: params.swapMode,\n\t\t\tonlyDirectRoutes: params.onlyDirectRoutes,\n\t\t});\n\n\t\treturn jupiterQuote;\n\t}\n\n\t/**\n\t * Executes a swap between two spot markets (placeholder for future implementation).\n\t *\n\t * This method will handle swapping between different spot markets through\n\t * the Drift protocol's swap functionality.\n\t *\n\t * @param params - The swap parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.executeSwap({\n\t * fromMarketIndex: 0, // USDC\n\t * toMarketIndex: 1, // SOL\n\t * amount: new BigNum(100),\n\t * subAccountId: 0,\n\t * minReceiveAmount: new BigNum(0.5)\n\t * });\n\t * ```\n\t */\n\tasync swap(params: SwapParams): Promise<TransactionSignature> {\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tparams.subAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst auth =\n\t\t\tparams.swapClientType?.type === 'titan'\n\t\t\t\t? {\n\t\t\t\t\t\tauthToken: params.swapClientType.authToken,\n\t\t\t\t\t\turl: params.swapClientType.url,\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tconst swapClient = new UnifiedSwapClient({\n\t\t\tclientType: params.swapClientType?.type ?? 'jupiter',\n\t\t\tconnection: this.driftClient.connection,\n\t\t\t...auth,\n\t\t});\n\n\t\tconst swapQuote = params.quote\n\t\t\t? params.quote\n\t\t\t: await this.getSwapQuote(params);\n\n\t\tconst swapTxn = await createSwapTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tswapClient,\n\t\t\tuser: accountData.userClient,\n\t\t\tswapFromMarketIndex: params.fromMarketIndex,\n\t\t\tswapToMarketIndex: params.toMarketIndex,\n\t\t\tamount: params.amount.val,\n\t\t\tquote: swapQuote,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(swapTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Settles P&L and funding for all perp position.\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.settlePnl({\n\t * subAccountId: 0,\n\t * marketIndex: 0, // SOL-PERP\n\t * counterpartySubAccountId: 1\n\t * });\n\t * ```\n\t */\n\tasync settleAccountPnl(\n\t\tparams: SettleAccountPnlParams\n\t): Promise<TransactionSignature> {\n\t\tconst { subAccountId } = params;\n\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst marketIndexes = accountData.openPerpPositions.map(\n\t\t\t(position) => position.marketIndex\n\t\t);\n\n\t\tconst settlePnlTxn = await createSettlePnlTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: accountData.userClient,\n\t\t\tmarketIndexes,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(settlePnlTxn);\n\n\t\treturn txSig;\n\t}\n\n\tasync cancelOrders(\n\t\tparams: CancelOrdersParams\n\t): Promise<TransactionSignature> {\n\t\tconst { subAccountId, orderIds } = params;\n\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst cancelOrdersTxn = await createCancelOrdersTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: accountData.userClient,\n\t\t\torderIds,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(cancelOrdersTxn);\n\n\t\treturn txSig;\n\t}\n}\n\n/**\n * TODO:\n * - transfer between subaccounts\n * - close position?\n * - close multiple positions\n * - edit open order\n * - create user only\n *\n * - open spot order\n * - rename subaccount\n * - withdraw dust positions\n */\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/drift/Drift/clients/AuthorityDrift/DriftOperations/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBigNum,\n\tDriftClient,\n\tJupiterClient,\n\tMarketType,\n\tMAX_LEVERAGE_ORDER_SIZE,\n\tQuoteResponse,\n\tSwapMode,\n\tTxParams,\n\tUnifiedSwapClient,\n\tUser,\n\tUserStatsAccount,\n\tZERO,\n} from '@drift-labs/sdk';\nimport { TransactionSignature } from '@solana/web3.js';\nimport { MARKET_UTILS } from '../../../../../common-ui-utils/market';\nimport { MAIN_POOL_ID } from '../../../../../constants';\nimport { TRADING_UTILS } from '../../../../../common-ui-utils/trading';\nimport { UserAccountCache } from '../../../stores/UserAccountCache';\nimport { createDepositTxn } from '../../../../base/actions/spot/deposit';\nimport { createUserAndDepositCollateralBaseTxn } from '../../../../base/actions/user/create';\nimport { createWithdrawTxn } from '../../../../base/actions/spot/withdraw';\nimport { deleteUserTxn } from '../../../../base/actions/user/delete';\nimport { createSettlePnlTxn } from '../../../../base/actions/perp/settlePnl';\nimport {\n\tCreateUserAndDepositParams,\n\tDepositParams,\n\tWithdrawParams,\n\tPerpOrderParams,\n\tSwapParams,\n\tSettleAccountPnlParams,\n\tCancelOrdersParams,\n\tCreateRevenueShareEscrowParams,\n} from './types';\nimport { createCancelOrdersTxn } from '../../../../base/actions/trade/cancelOrder';\nimport {\n\tcreateOpenPerpMarketOrder,\n\tOpenPerpMarketOrderParams,\n} from '../../../../base/actions/trade/openPerpOrder/openPerpMarketOrder';\nimport { createSwapTxn } from '../../../../base/actions/trade/swap';\nimport { createOpenPerpNonMarketOrder } from '../../../../base/actions/trade/openPerpOrder/openPerpNonMarketOrder';\nimport { createRevenueShareEscrowTxn } from '../../../../base/actions/builder/createRevenueShareEscrow';\n\n/**\n * Handles majority of the relevant operations on the Drift program including deposits,\n * withdrawals, position management, and trading operations.\n *\n * This class encapsulates the trading logic and provides a clean API for\n * executing various trading operations while handling common patterns like\n * token address resolution and transaction preparation.\n */\nexport class DriftOperations {\n\tstatic readonly DEFAULT_TX_PARAMS: TxParams = {\n\t\tcomputeUnitsPrice: 50_000,\n\t\tuseSimulatedComputeUnits: true,\n\t\tcomputeUnitsBufferMultiplier: 1.3,\n\t};\n\n\tstatic readonly MAX_COMPUTE_UNITS_PRICE = 1e15 / 10 / 1_400_000; // 1e15 = 1 SOL worth of micro lamports; 1e15 / 10 = 0.1 SOL worth of micro lamports; 1.4M = max compute units;\n\n\t/**\n\t * Creates a new DriftOperations instance.\n\t *\n\t * @param driftClient - The DriftClient instance for executing transactions\n\t * @param getUserAccountCache - Function to get the user account cache. We lazily load the user account cache, so that we always get the latest user account data.\n\t * @param getPriorityFee - Function to get current priority fee in micro lamports\n\t */\n\tconstructor(\n\t\tprivate driftClient: DriftClient,\n\t\tprivate getUserAccountCache: () => UserAccountCache,\n\t\tprivate dlobServerHttpUrl: string,\n\t\tprivate swiftServerUrl: string,\n\t\tprivate getPriorityFee: () => number\n\t) {}\n\n\t/**\n\t * Gets transaction parameters with dynamic priority fees.\n\t * Falls back to default if priority fee function is not available.\n\t */\n\tgetTxParams(overrides?: Partial<TxParams>): TxParams {\n\t\tconst unsafePriorityFee = Math.floor(\n\t\t\tthis.getPriorityFee() ??\n\t\t\t\tDriftOperations.DEFAULT_TX_PARAMS.computeUnitsPrice\n\t\t);\n\n\t\tconst safePriorityFee = Math.min(\n\t\t\tunsafePriorityFee,\n\t\t\tDriftOperations.MAX_COMPUTE_UNITS_PRICE\n\t\t);\n\n\t\treturn {\n\t\t\t...DriftOperations.DEFAULT_TX_PARAMS,\n\t\t\tcomputeUnitsPrice: safePriorityFee,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a new user account and deposits initial collateral.\n\t *\n\t * This method handles the complete onboarding flow for new users including:\n\t * - Validating that the subaccount doesn't already exist\n\t * - Resolving referrer information if provided\n\t * - Getting the correct token address for deposits\n\t * - Creating the user account with custom leverage settings\n\t * - Subscribing to the new user's account updates\n\t *\n\t * @param params - The parameters for user creation and initial deposit\n\t * @returns Promise resolving to transaction signature and user account public key\n\t *\n\t * @throws Error if subaccount already exists\n\t *\n\t * @example\n\t * ```typescript\n\t * const result = await tradingOps.createUserAndDeposit({\n\t * depositAmount: new BigNum(100),\n\t * depositSpotMarketIndex: 0, // USDC\n\t * name: \"Trading Account\",\n\t * maxLeverage: 5,\n\t * subAccountId: 0\n\t * });\n\t * ```\n\t */\n\tasync createUserAndDeposit(params: CreateUserAndDepositParams): Promise<{\n\t\ttxSig: TransactionSignature;\n\t\tuser: User;\n\t}> {\n\t\tconst {\n\t\t\tdepositAmount,\n\t\t\tdepositSpotMarketIndex,\n\t\t\tnewAccountName,\n\t\t\tmaxLeverage,\n\t\t\tpoolId = MAIN_POOL_ID,\n\t\t\treferrerName,\n\t\t} = params;\n\n\t\tconst spotMarketConfig = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tdepositSpotMarketIndex\n\t\t);\n\n\t\tconst customMaxMarginRatio = TRADING_UTILS.convertLeverageToMarginRatio(\n\t\t\tmaxLeverage ?? 0\n\t\t);\n\n\t\tlet userStatsAccount: UserStatsAccount | undefined = undefined;\n\n\t\ttry {\n\t\t\tuserStatsAccount = this.driftClient.userStats?.getAccount();\n\t\t} catch (error) {\n\t\t\t// ignore\n\t\t}\n\n\t\tconst { transaction, subAccountId } =\n\t\t\tawait createUserAndDepositCollateralBaseTxn({\n\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\tamount: depositAmount.val,\n\t\t\t\tspotMarketConfig: spotMarketConfig,\n\t\t\t\tauthority: this.driftClient.wallet.publicKey,\n\t\t\t\tuserStatsAccount: userStatsAccount,\n\t\t\t\taccountName: newAccountName,\n\t\t\t\treferrerName,\n\t\t\t\tcustomMaxMarginRatio,\n\t\t\t\tpoolId,\n\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(transaction);\n\n\t\tawait this.driftClient.addUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t); // adds user to driftclient's user map, subscribes to user account data\n\t\tconst user = this.driftClient.getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tuser.eventEmitter.on('update', () => {\n\t\t\tthis.getUserAccountCache().updateUserAccount(user);\n\t\t});\n\n\t\treturn {\n\t\t\ttxSig,\n\t\t\tuser,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a RevenueShareEscrow account for the user.\n\t *\n\t * @param params - The parameters for creating a RevenueShareEscrow account\n\t * @returns Promise resolving to the transaction signature of the creation\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.createRevenueShareEscrow({\n\t * numOrders: 16,\n\t * builder: {\n\t * builderAuthority: new PublicKey(\"builderAuthority\"),\n\t * maxFeeTenthBps: 100,\n\t * },\n\t * });\n\t * ```\n\t */\n\tasync createRevenueShareEscrow(\n\t\tparams: CreateRevenueShareEscrowParams\n\t): Promise<TransactionSignature> {\n\t\tconst txn = await createRevenueShareEscrowTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tauthority: this.driftClient.wallet.publicKey,\n\t\t\tnumOrders: params.numOrders ?? 16,\n\t\t\tbuilder: params.builder,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Deletes a user account.\n\t *\n\t * This method removes a user's sub-account from the Drift.\n\t *\n\t * @param subAccountId - The ID of the sub-account to delete\n\t * @returns A promise that resolves to the transaction signature of the deletion\n\t *\n\t * @throws {Error} When the user account is not found in the cache\n\t *\n\t * @example\n\t * ```typescript\n\t * // Delete user sub-account with ID 0\n\t * const txSignature = await tradingOps.deleteUser(0);\n\t * console.log('User deleted with transaction:', txSignature);\n\t * ```\n\t */\n\tasync deleteUser(subAccountId: number): Promise<TransactionSignature> {\n\t\tconst user = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\t\tconst userStatsAccount = this.driftClient.userStats?.getAccount();\n\n\t\tif (!user) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tif (!userStatsAccount) {\n\t\t\tthrow new Error('User stats account not found');\n\t\t}\n\n\t\tconst deleteTxn = await deleteUserTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: user.userClient,\n\t\t\tuserStatsAccount,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(deleteTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Deposits collateral into a user's spot market position.\n\t *\n\t * This method handles depositing tokens into a user's account, with optional\n\t * support for max borrow repayment scenarios where the deposit amount may be\n\t * over-estimated to ensure complete repayment of borrowed funds.\n\t *\n\t * @param params - The deposit parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.deposit({\n\t * subAccountId: 0,\n\t * amount: new BigNum(50),\n\t * spotMarketIndex: 0, // USDC\n\t * isMaxBorrowRepayment: false\n\t * });\n\t * ```\n\t */\n\tasync deposit(params: DepositParams): Promise<TransactionSignature> {\n\t\tconst { subAccountId, amount, spotMarketIndex, isMaxBorrowRepayment } =\n\t\t\tparams;\n\n\t\tconst spotMarketConfig = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tspotMarketIndex\n\t\t);\n\n\t\tconst user = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!user) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst depositTxn = await createDepositTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: user.userClient,\n\t\t\tamount: amount,\n\t\t\tspotMarketConfig: spotMarketConfig,\n\t\t\tisMaxBorrowRepayment,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(depositTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Withdraws collateral from a user's spot market position.\n\t *\n\t * This method handles withdrawing tokens from a user's account with options\n\t * for borrowing (if allowBorrow is true) or reduce-only withdrawals. For max\n\t * withdrawals with reduce-only, the amount is over-estimated to ensure\n\t * complete withdrawal.\n\t *\n\t * @param params - The withdrawal parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.withdraw({\n\t * subAccountId: 0,\n\t * amount: new BigNum(25),\n\t * spotMarketIndex: 0, // USDC\n\t * allowBorrow: false,\n\t * isMax: false\n\t * });\n\t * ```\n\t */\n\tasync withdraw(params: WithdrawParams): Promise<TransactionSignature> {\n\t\tconst {\n\t\t\tsubAccountId,\n\t\t\tamount,\n\t\t\tspotMarketIndex,\n\t\t\tisBorrow = false,\n\t\t\tisMax = false,\n\t\t} = params;\n\n\t\tconst spotMarketConfig = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tspotMarketIndex\n\t\t);\n\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst withdrawTxn = await createWithdrawTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tamount,\n\t\t\tspotMarketConfig,\n\t\t\tuser: accountData.userClient,\n\t\t\tisBorrow,\n\t\t\tisMax,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(withdrawTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Opens a perpetual market order (placeholder for future implementation).\n\t *\n\t * This method will handle opening long or short positions in perpetual markets\n\t * with support for market and limit orders, reduce-only orders, and post-only orders.\n\t *\n\t * @param params - The perp order parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.openPerpMarketOrder({\n\t * marketIndex: 0, // SOL-PERP\n\t * direction: 'long',\n\t * baseAssetAmount: new BigNum(1), // 1 SOL\n\t * orderType: 'market',\n\t * subAccountId: 0\n\t * });\n\t * ```\n\t */\n\tasync openPerpOrder(\n\t\tparams: PerpOrderParams\n\t): Promise<TransactionSignature | void> {\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tparams.subAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst user = accountData.userClient;\n\n\t\tconst processBracketOrders = (bracketOrdersInput?: {\n\t\t\ttakeProfitPrice?: BigNum;\n\t\t\tstopLossPrice?: BigNum;\n\t\t}) => {\n\t\t\tconst bracketOrders: OpenPerpMarketOrderParams['bracketOrders'] = {};\n\n\t\t\tif (bracketOrdersInput?.takeProfitPrice) {\n\t\t\t\tbracketOrders.takeProfit = {\n\t\t\t\t\ttriggerPrice: bracketOrdersInput.takeProfitPrice.val,\n\t\t\t\t\tbaseAssetAmount: params.size.val,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (bracketOrdersInput?.stopLossPrice) {\n\t\t\t\tbracketOrders.stopLoss = {\n\t\t\t\t\ttriggerPrice: bracketOrdersInput.stopLossPrice.val,\n\t\t\t\t\tbaseAssetAmount: params.size.val,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn bracketOrders;\n\t\t};\n\n\t\tconst amountBN = params.isMaxLeverage\n\t\t\t? MAX_LEVERAGE_ORDER_SIZE\n\t\t\t: params.size.val;\n\n\t\tswitch (params.orderConfig.orderType) {\n\t\t\tcase 'market': {\n\t\t\t\tconst useSwift = !params.orderConfig.disableSwift;\n\n\t\t\t\tconst bracketOrders = processBracketOrders(\n\t\t\t\t\tparams.orderConfig.bracketOrders\n\t\t\t\t);\n\n\t\t\t\t// we split the logic for SWIFT and non-SWIFT orders to achieve better type inference\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\twallet: {\n\t\t\t\t\t\t\t\t// @ts-ignore TODO: we might want to add signMessage to the IWallet interface\n\t\t\t\t\t\t\t\tsignMessage: this.driftClient.wallet.signMessage,\n\t\t\t\t\t\t\t\ttakerAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t\tsigningAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tswiftServerUrl: this.swiftServerUrl,\n\t\t\t\t\t\t\t...params.orderConfig.swiftOptions,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\tdlobServerHttpUrl: this.dlobServerHttpUrl,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\toptionalAuctionParamsInputs:\n\t\t\t\t\t\t\tparams.orderConfig.optionalAuctionParamsInputs,\n\t\t\t\t\t\tbuilderParams: params.builderParams,\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn swiftOrderResult;\n\t\t\t\t} else {\n\t\t\t\t\tconst result = await createOpenPerpMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\toptionalAuctionParamsInputs:\n\t\t\t\t\t\t\tparams.orderConfig.optionalAuctionParamsInputs,\n\t\t\t\t\t\tdlobServerHttpUrl: this.dlobServerHttpUrl,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(result);\n\n\t\t\t\t\treturn txSig;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'limit': {\n\t\t\t\tconst useSwift = !params.orderConfig.disableSwift;\n\n\t\t\t\tconst bracketOrders = processBracketOrders(\n\t\t\t\t\tparams.orderConfig.bracketOrders\n\t\t\t\t);\n\n\t\t\t\t// we split the logic for SWIFT and non-SWIFT orders to achieve better type inference\n\t\t\t\tif (useSwift) {\n\t\t\t\t\tconst swiftOrderResult = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\torderConfig: {\n\t\t\t\t\t\t\torderType: 'limit',\n\t\t\t\t\t\t\tlimitPrice: params.orderConfig.limitPrice.val,\n\t\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\t},\n\t\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\t\tpostOnly: params.postOnly,\n\t\t\t\t\t\tuseSwift: true,\n\t\t\t\t\t\tswiftOptions: {\n\t\t\t\t\t\t\twallet: {\n\t\t\t\t\t\t\t\t// @ts-ignore TODO: we might want to add signMessage to the IWallet interface\n\t\t\t\t\t\t\t\tsignMessage: this.driftClient.wallet.signMessage,\n\t\t\t\t\t\t\t\ttakerAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t\tsigningAuthority: this.driftClient.wallet.publicKey,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tswiftServerUrl: this.swiftServerUrl,\n\t\t\t\t\t\t\t...params.orderConfig.swiftOptions,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbuilderParams: params.builderParams,\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn swiftOrderResult;\n\t\t\t\t} else {\n\t\t\t\t\tconst txn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\t\tamount: amountBN,\n\t\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\t\torderConfig: {\n\t\t\t\t\t\t\torderType: 'limit',\n\t\t\t\t\t\t\tlimitPrice: params.orderConfig.limitPrice.val,\n\t\t\t\t\t\t\tbracketOrders,\n\t\t\t\t\t\t},\n\t\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\t\tpostOnly: params.postOnly,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t\t\tmarginMode: params.marginMode,\n\t\t\t\t\t\tisolatedPositionDepositsOverride:\n\t\t\t\t\t\t\tparams.isolatedPositionDepositsOverride,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\t\t\t\treturn txSig;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase 'takeProfit':\n\t\t\tcase 'stopLoss': {\n\t\t\t\tconst txn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tamount: amountBN,\n\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\torderConfig: {\n\t\t\t\t\t\torderType: params.orderConfig.orderType,\n\t\t\t\t\t\ttriggerPrice: params.orderConfig.triggerPrice.val,\n\t\t\t\t\t\tlimitPrice: params.orderConfig.limitPrice?.val ?? ZERO,\n\t\t\t\t\t},\n\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\tuseSwift: false,\n\t\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t});\n\n\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\t\t\treturn txSig;\n\t\t\t}\n\t\t\tcase 'oracleLimit': {\n\t\t\t\tconst txn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\tdriftClient: this.driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tamount: amountBN,\n\t\t\t\t\tassetType: params.assetType,\n\t\t\t\t\torderConfig: {\n\t\t\t\t\t\torderType: 'oracleLimit',\n\t\t\t\t\t\toraclePriceOffset: params.orderConfig.oraclePriceOffset.val,\n\t\t\t\t\t},\n\t\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\t\tuseSwift: false,\n\t\t\t\t\ttxParams: this.getTxParams(),\n\t\t\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t\t\t});\n\n\t\t\t\tconst { txSig } = await this.driftClient.sendTransaction(txn);\n\n\t\t\t\treturn txSig;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustiveCheck: never = params.orderConfig;\n\t\t\t\tthrow new Error('Invalid order type');\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getSwapQuote(\n\t\tparams: Omit<SwapParams, 'quote'> & {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t}\n\t): Promise<QuoteResponse> {\n\t\tconst jupiterClient = new JupiterClient({\n\t\t\tconnection: this.driftClient.connection,\n\t\t});\n\n\t\tconst inputMint = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tparams.fromMarketIndex\n\t\t).mint;\n\t\tconst outputMint = MARKET_UTILS.getMarketConfig(\n\t\t\tthis.driftClient.env,\n\t\t\tMarketType.SPOT,\n\t\t\tparams.toMarketIndex\n\t\t).mint;\n\n\t\tconst jupiterQuote = await jupiterClient.getQuote({\n\t\t\tinputMint,\n\t\t\toutputMint,\n\t\t\tamount: params.amount.val,\n\t\t\tslippageBps: params.slippageBps,\n\t\t\tswapMode: params.swapMode,\n\t\t\tonlyDirectRoutes: params.onlyDirectRoutes,\n\t\t});\n\n\t\treturn jupiterQuote;\n\t}\n\n\t/**\n\t * Executes a swap between two spot markets (placeholder for future implementation).\n\t *\n\t * This method will handle swapping between different spot markets through\n\t * the Drift protocol's swap functionality.\n\t *\n\t * @param params - The swap parameters\n\t * @returns Promise resolving to the transaction signature\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.executeSwap({\n\t * fromMarketIndex: 0, // USDC\n\t * toMarketIndex: 1, // SOL\n\t * amount: new BigNum(100),\n\t * subAccountId: 0,\n\t * minReceiveAmount: new BigNum(0.5)\n\t * });\n\t * ```\n\t */\n\tasync swap(params: SwapParams): Promise<TransactionSignature> {\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tparams.subAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst auth =\n\t\t\tparams.swapClientType?.type === 'titan'\n\t\t\t\t? {\n\t\t\t\t\t\tauthToken: params.swapClientType.authToken,\n\t\t\t\t\t\turl: params.swapClientType.url,\n\t\t\t\t }\n\t\t\t\t: undefined;\n\n\t\tconst swapClient = new UnifiedSwapClient({\n\t\t\tclientType: params.swapClientType?.type ?? 'jupiter',\n\t\t\tconnection: this.driftClient.connection,\n\t\t\t...auth,\n\t\t});\n\n\t\tconst swapQuote = params.quote\n\t\t\t? params.quote\n\t\t\t: await this.getSwapQuote(params);\n\n\t\tconst swapTxn = await createSwapTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tswapClient,\n\t\t\tuser: accountData.userClient,\n\t\t\tswapFromMarketIndex: params.fromMarketIndex,\n\t\t\tswapToMarketIndex: params.toMarketIndex,\n\t\t\tamount: params.amount.val,\n\t\t\tquote: swapQuote,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(swapTxn);\n\n\t\treturn txSig;\n\t}\n\n\t/**\n\t * Settles P&L and funding for all perp position.\n\t *\n\t * @example\n\t * ```typescript\n\t * const txSig = await tradingOps.settlePnl({\n\t * subAccountId: 0,\n\t * marketIndex: 0, // SOL-PERP\n\t * counterpartySubAccountId: 1\n\t * });\n\t * ```\n\t */\n\tasync settleAccountPnl(\n\t\tparams: SettleAccountPnlParams\n\t): Promise<TransactionSignature> {\n\t\tconst { subAccountId } = params;\n\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst marketIndexes = accountData.openPerpPositions.map(\n\t\t\t(position) => position.marketIndex\n\t\t);\n\n\t\tconst settlePnlTxn = await createSettlePnlTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: accountData.userClient,\n\t\t\tmarketIndexes,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(settlePnlTxn);\n\n\t\treturn txSig;\n\t}\n\n\tasync cancelOrders(\n\t\tparams: CancelOrdersParams\n\t): Promise<TransactionSignature> {\n\t\tconst { subAccountId, orderIds } = params;\n\n\t\tconst accountData = this.getUserAccountCache().getUser(\n\t\t\tsubAccountId,\n\t\t\tthis.driftClient.wallet.publicKey\n\t\t);\n\n\t\tif (!accountData) {\n\t\t\tthrow new Error('User not found');\n\t\t}\n\n\t\tconst cancelOrdersTxn = await createCancelOrdersTxn({\n\t\t\tdriftClient: this.driftClient,\n\t\t\tuser: accountData.userClient,\n\t\t\torderIds,\n\t\t\ttxParams: this.getTxParams(),\n\t\t});\n\n\t\tconst { txSig } = await this.driftClient.sendTransaction(cancelOrdersTxn);\n\n\t\treturn txSig;\n\t}\n}\n\n/**\n * TODO:\n * - transfer between subaccounts\n * - close position?\n * - close multiple positions\n * - edit open order\n * - create user only\n *\n * - open spot order\n * - rename subaccount\n * - withdraw dust positions\n */\n"]}
|
|
@@ -22,6 +22,11 @@ export declare class CentralServerDrift {
|
|
|
22
22
|
* Handles priority fee tracking and calculation for optimized transaction costs.
|
|
23
23
|
*/
|
|
24
24
|
private priorityFeeSubscriber;
|
|
25
|
+
/**
|
|
26
|
+
* Mutex to serialize driftClientContextWrapper calls, preventing
|
|
27
|
+
* concurrent mutations of shared DriftClient state.
|
|
28
|
+
*/
|
|
29
|
+
private _mutex;
|
|
25
30
|
readonly markets: CentralServerDriftMarkets;
|
|
26
31
|
/**
|
|
27
32
|
* @param solanaRpcEndpoint - The Solana RPC endpoint to use for reading RPC data.
|
|
@@ -103,7 +108,7 @@ export declare class CentralServerDrift {
|
|
|
103
108
|
*/
|
|
104
109
|
externalWallet?: PublicKey;
|
|
105
110
|
}): Promise<VersionedTransaction | Transaction>;
|
|
106
|
-
getDeleteUserTxn(
|
|
111
|
+
getDeleteUserTxn(user: User, options?: {
|
|
107
112
|
txParams?: TxParams;
|
|
108
113
|
}): Promise<VersionedTransaction | Transaction>;
|
|
109
114
|
getWithdrawTxn(userAccountPublicKey: PublicKey, amount: BN, spotMarketIndex: number, options?: {
|
|
@@ -36,6 +36,11 @@ class CentralServerDrift {
|
|
|
36
36
|
* @param supportedSpotMarkets - The spot markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/spotMarkets.ts for all available markets. It is recommended to only include markets that will be used.
|
|
37
37
|
*/
|
|
38
38
|
constructor(config) {
|
|
39
|
+
/**
|
|
40
|
+
* Mutex to serialize driftClientContextWrapper calls, preventing
|
|
41
|
+
* concurrent mutations of shared DriftClient state.
|
|
42
|
+
*/
|
|
43
|
+
this._mutex = Promise.resolve();
|
|
39
44
|
const driftEnv = config.driftEnv;
|
|
40
45
|
const connection = new web3_js_1.Connection(config.solanaRpcEndpoint);
|
|
41
46
|
const driftProgramID = new sdk_1.PublicKey(sdk_1.DRIFT_PROGRAM_ID);
|
|
@@ -151,6 +156,14 @@ class CentralServerDrift {
|
|
|
151
156
|
* @returns The result of the operation
|
|
152
157
|
*/
|
|
153
158
|
async driftClientContextWrapper(userAccountPublicKey, operation, externalWallet) {
|
|
159
|
+
// Acquire mutex — wait for any previous operation to finish
|
|
160
|
+
let release;
|
|
161
|
+
const acquire = new Promise((resolve) => {
|
|
162
|
+
release = resolve;
|
|
163
|
+
});
|
|
164
|
+
const prev = this._mutex;
|
|
165
|
+
this._mutex = acquire;
|
|
166
|
+
await prev;
|
|
154
167
|
const user = new sdk_1.User({
|
|
155
168
|
driftClient: this._driftClient,
|
|
156
169
|
userAccountPublicKey,
|
|
@@ -192,8 +205,12 @@ class CentralServerDrift {
|
|
|
192
205
|
finally {
|
|
193
206
|
// Cleanup: Always restore original state and unsubscribe
|
|
194
207
|
this._driftClient.wallet = originalWallet;
|
|
208
|
+
//@ts-ignore
|
|
209
|
+
this._driftClient.provider.wallet = originalWallet;
|
|
195
210
|
this._driftClient.txHandler.updateWallet(originalWallet);
|
|
196
211
|
this._driftClient.authority = originalAuthority;
|
|
212
|
+
// clear cached PDA so it doesn't leak between requests
|
|
213
|
+
this._driftClient.userStatsAccountPublicKey = undefined;
|
|
197
214
|
try {
|
|
198
215
|
await user.unsubscribe();
|
|
199
216
|
this._driftClient.users.clear();
|
|
@@ -202,6 +219,8 @@ class CentralServerDrift {
|
|
|
202
219
|
console.warn('Error during cleanup:', cleanupError);
|
|
203
220
|
// Don't throw cleanup errors, but log them
|
|
204
221
|
}
|
|
222
|
+
// Release mutex — let next queued operation proceed
|
|
223
|
+
release();
|
|
205
224
|
}
|
|
206
225
|
}
|
|
207
226
|
/**
|
|
@@ -285,12 +304,17 @@ class CentralServerDrift {
|
|
|
285
304
|
return depositTxn;
|
|
286
305
|
}, options === null || options === void 0 ? void 0 : options.externalWallet);
|
|
287
306
|
}
|
|
288
|
-
async getDeleteUserTxn(
|
|
289
|
-
return this.driftClientContextWrapper(userAccountPublicKey, async () => {
|
|
307
|
+
async getDeleteUserTxn(user, options) {
|
|
308
|
+
return this.driftClientContextWrapper(user.userAccountPublicKey, async () => {
|
|
290
309
|
var _a;
|
|
310
|
+
const userStatsAccount = await (0, sdk_1.fetchUserStatsAccount)(this._driftClient.connection, this._driftClient.program, user.getUserAccount().authority);
|
|
311
|
+
if (!userStatsAccount) {
|
|
312
|
+
throw new Error('User stats account not found');
|
|
313
|
+
}
|
|
291
314
|
return (0, delete_1.deleteUserTxn)({
|
|
292
315
|
driftClient: this._driftClient,
|
|
293
|
-
|
|
316
|
+
user,
|
|
317
|
+
userStatsAccount,
|
|
294
318
|
txParams: (_a = options === null || options === void 0 ? void 0 : options.txParams) !== null && _a !== void 0 ? _a : this.getTxParams(),
|
|
295
319
|
});
|
|
296
320
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/CentralServerDrift/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBigNum,\n\tBN,\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDevnetPerpMarkets,\n\tDevnetSpotMarkets,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tfetchUserStatsAccount,\n\tgetMarketsAndOraclesForSubscription,\n\tMainnetPerpMarkets,\n\tMainnetSpotMarkets,\n\tMarketType,\n\tMIN_I64,\n\tOneShotUserAccountSubscriber,\n\tOrderTriggerCondition,\n\tPerpMarketConfig,\n\tPositionDirection,\n\tPriorityFeeMethod,\n\tPriorityFeeSubscriber,\n\tPriorityFeeSubscriberConfig,\n\tPublicKey,\n\tSettlePnlMode,\n\tSpotMarketConfig,\n\tSwapMode,\n\tTxParams,\n\tUnifiedQuoteResponse,\n\tUnifiedSwapClient,\n\tUser,\n\tWhileValidTxSender,\n\tZERO,\n} from '@drift-labs/sdk';\nimport {\n\tConnection,\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n} 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\tHIGH_ACTIVITY_MARKET_ACCOUNTS,\n} from '../../constants';\nimport { createDepositTxn } from '../../../base/actions/spot/deposit';\nimport { createWithdrawTxn } from '../../../base/actions/spot/withdraw';\nimport { getTokenAddressForDepositAndWithdraw } from '../../../../utils/token';\nimport { createSettleFundingTxn } from '../../../base/actions/perp/settleFunding';\nimport {\n\tcreateSettlePnlIx,\n\tcreateSettlePnlTxn,\n} from '../../../base/actions/perp/settlePnl';\nimport {\n\tcreateOpenPerpMarketOrder,\n\tcreateOpenPerpMarketOrderIxs,\n\tcreateSwiftMarketOrderMessage,\n} from '../../../base/actions/trade/openPerpOrder/openPerpMarketOrder';\nimport {\n\tcreateOpenPerpNonMarketOrder,\n\tcreateSwiftLimitOrderMessage,\n} from '../../../base/actions/trade/openPerpOrder/openPerpNonMarketOrder';\nimport { SwiftOrderMessage } from '../../../base/actions/trade/openPerpOrder/openSwiftOrder';\nimport { LimitOrderParamsOrderConfig } from '../../../base/actions/trade/openPerpOrder/types';\nimport { createEditOrderTxn } from '../../../base/actions/trade/editOrder';\nimport { createCancelOrdersTxn } from '../../../base/actions/trade/cancelOrder';\nimport { createSwapTxn } from '../../../base/actions/trade/swap';\nimport { createUserAndDepositCollateralBaseTxn } from '../../../base/actions/user/create';\nimport { deleteUserTxn } from '../../../base/actions/user/delete';\nimport { createRevenueShareEscrowTxn } from '../../../base/actions/builder/createRevenueShareEscrow';\nimport { createRevenueShareAccountTxn } from '../../../base/actions/builder/createRevenueShareAccount';\nimport { configureBuilderTxn } from '../../../base/actions/builder/configureBuilder';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport {\n\tCentralServerGetOpenPerpMarketOrderTxnParams,\n\tCentralServerGetOpenPerpNonMarketOrderTxnParams,\n\tCentralServerGetWithdrawIsolatedPerpPositionCollateralTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionTxnParams,\n\tCentralServerGetDepositAndOpenIsolatedPerpPositionTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionToWalletTxnParams,\n} from './types';\nimport { CentralServerDriftMarkets } from './markets';\nimport { DriftOperations } from '../AuthorityDrift/DriftOperations';\n\nexport type {\n\tCentralServerGetOpenPerpMarketOrderTxnParams,\n\tCentralServerGetOpenPerpNonMarketOrderTxnParams,\n\tCentralServerSwiftOrderOptions,\n\tCentralServerGetWithdrawIsolatedPerpPositionCollateralTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionTxnParams,\n\tCentralServerGetDepositAndOpenIsolatedPerpPositionTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionToWalletTxnParams,\n} from './types';\nexport type { SwiftOrderMessage } from '../../../base/actions/trade/openPerpOrder/openSwiftOrder';\n\n/**\n * A Drift client that fetches user data on-demand, while market data is continuously subscribed to.\n *\n * This is useful for an API server that fetches user data on-demand, and return transaction messages specific to a given user\n */\nexport class CentralServerDrift {\n\tprivate _driftClient: DriftClient;\n\tprivate _perpMarketConfigs: PerpMarketConfig[];\n\tprivate _spotMarketConfigs: SpotMarketConfig[];\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};\n\n\t/**\n\t * Handles priority fee tracking and calculation for optimized transaction costs.\n\t */\n\tprivate priorityFeeSubscriber!: PriorityFeeSubscriber;\n\n\tpublic readonly markets: CentralServerDriftMarkets;\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 supportedPerpMarkets - The perp markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/perpMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t * @param supportedSpotMarkets - The spot markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/spotMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t */\n\tconstructor(config: {\n\t\tsolanaRpcEndpoint: string;\n\t\tdriftEnv: DriftEnv;\n\t\tsupportedPerpMarkets: number[];\n\t\tsupportedSpotMarkets: number[];\n\t\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\t\tpriorityFeeSubscriberConfig?: Partial<PriorityFeeSubscriberConfig>;\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\n\t\tconst wallet = COMMON_UI_UTILS.createPlaceholderIWallet(); // use random wallet to initialize a central-server instance\n\n\t\tconst allPerpMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetPerpMarkets : MainnetPerpMarkets;\n\t\tconst allSpotMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetSpotMarkets : MainnetSpotMarkets;\n\t\tthis._perpMarketConfigs = config.supportedPerpMarkets.map((marketIndex) =>\n\t\t\tallPerpMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\t\tthis._spotMarketConfigs = config.supportedSpotMarkets.map((marketIndex) =>\n\t\t\tallSpotMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\n\t\tconst oracleInfos = getMarketsAndOraclesForSubscription(\n\t\t\tdriftEnv,\n\t\t\tthis._perpMarketConfigs,\n\t\t\tthis._spotMarketConfigs\n\t\t);\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: false,\n\t\t\tincludeDelegates: false,\n\t\t\tskipLoadUsers: true,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes: this._perpMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\tspotMarketIndexes: this._spotMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\toracleInfos: oracleInfos.oracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis._driftClient = new DriftClient(driftClientConfig);\n\t\tthis.markets = new CentralServerDriftMarkets(this._driftClient);\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\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\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\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\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\taddresses: HIGH_ACTIVITY_MARKET_ACCOUNTS,\n\t\t\t...config.priorityFeeSubscriberConfig,\n\t\t};\n\n\t\tthis.priorityFeeSubscriber = new PriorityFeeSubscriber(priorityFeeConfig);\n\t}\n\n\tpublic get driftClient() {\n\t\treturn this._driftClient;\n\t}\n\n\tpublic async subscribe() {\n\t\tawait this._driftClient.subscribe();\n\t\tawait this.priorityFeeSubscriber.subscribe();\n\t}\n\n\tpublic async unsubscribe() {\n\t\tawait this._driftClient.unsubscribe();\n\t\tawait this.priorityFeeSubscriber.unsubscribe();\n\t}\n\n\t/**\n\t * Temporarily swaps the DriftClient wallet/authority context to build transactions\n\t * for a given authority, then restores the original state.\n\t *\n\t * Use this for authority-based operations that don't require a User account subscription\n\t * (e.g. creating revenue share accounts, managing builders).\n\t *\n\t * @param authority - The authority to set on the DriftClient\n\t * @param operation - The transaction creation operation to execute\n\t * @returns The result of the operation\n\t */\n\tprivate async authorityContextWrapper<T>(\n\t\tauthority: PublicKey,\n\t\toperation: () => Promise<T>\n\t): Promise<T> {\n\t\tconst originalWallet = this._driftClient.wallet;\n\t\tconst originalAuthority = this._driftClient.authority;\n\n\t\tconst authorityWallet = {\n\t\t\tpublicKey: authority,\n\t\t\tsignTransaction: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t\tsignAllTransactions: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t};\n\n\t\ttry {\n\t\t\tthis._driftClient.wallet = authorityWallet;\n\t\t\t// @ts-ignore\n\t\t\tthis._driftClient.provider.wallet = authorityWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(authorityWallet);\n\t\t\tthis._driftClient.authority = authority;\n\n\t\t\treturn await operation();\n\t\t} finally {\n\t\t\tthis._driftClient.wallet = originalWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(originalWallet);\n\t\t\t// @ts-ignore\n\t\t\tthis._driftClient.provider.wallet = originalWallet;\n\t\t\tthis._driftClient.authority = originalAuthority;\n\t\t}\n\t}\n\n\t/**\n\t * Manages DriftClient state for transaction creation with proper setup and cleanup.\n\t * This abstraction handles:\n\t * - User creation and subscription\n\t * - Authority management\n\t * - Wallet replacement for correct transaction signing\n\t * - Cleanup and state restoration\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t * @param operation - The transaction creation operation to execute\n\t * @returns The result of the operation\n\t */\n\tprivate async driftClientContextWrapper<T>(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toperation: (user: User) => Promise<T>,\n\t\texternalWallet?: PublicKey\n\t): Promise<T> {\n\t\tconst user = new User({\n\t\t\tdriftClient: this._driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: new OneShotUserAccountSubscriber(\n\t\t\t\t\tthis._driftClient.program,\n\t\t\t\t\tuserAccountPublicKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\n\t\t// Store original state\n\t\tconst originalWallet = this._driftClient.wallet;\n\t\tconst originalAuthority = this._driftClient.authority;\n\n\t\ttry {\n\t\t\t// Setup: Subscribe to user and configure DriftClient\n\t\t\tawait user.subscribe();\n\n\t\t\tconst authority = user.getUserAccount().authority;\n\t\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\t\t\tthis._driftClient.authority = authority;\n\n\t\t\tconst success = await this._driftClient.addUser(subAccountId, authority);\n\t\t\tawait this._driftClient.switchActiveUser(subAccountId, authority);\n\n\t\t\tif (!success) {\n\t\t\t\tthrow new Error('Failed to add user to DriftClient');\n\t\t\t}\n\n\t\t\t// Replace wallet with user's authority to ensure correct transaction signing\n\t\t\t// This is necessary because DriftClient adds wallet.publicKey to instructions\n\t\t\tconst userWallet = {\n\t\t\t\tpublicKey: externalWallet ?? authority,\n\t\t\t\tsignTransaction: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t\tsignAllTransactions: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t};\n\n\t\t\t// Update wallet in all places that reference it\n\t\t\tthis._driftClient.wallet = userWallet;\n\t\t\t//@ts-ignore\n\t\t\tthis._driftClient.provider.wallet = userWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(userWallet);\n\n\t\t\t// Execute the operation\n\t\t\tconst result = await operation(user);\n\n\t\t\treturn result;\n\t\t} finally {\n\t\t\t// Cleanup: Always restore original state and unsubscribe\n\t\t\tthis._driftClient.wallet = originalWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(originalWallet);\n\t\t\tthis._driftClient.authority = originalAuthority;\n\n\t\t\ttry {\n\t\t\t\tawait user.unsubscribe();\n\t\t\t\tthis._driftClient.users.clear();\n\t\t\t} catch (cleanupError) {\n\t\t\t\tconsole.warn('Error during cleanup:', cleanupError);\n\t\t\t\t// Don't throw cleanup errors, but log them\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns a User object for a given user account public key. This fetches the user account data once.\n\t *\n\t * You may read more about the User object [here](https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/user.ts)\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t */\n\tpublic async getUser(userAccountPublicKey: PublicKey): Promise<User> {\n\t\tconst oneShotUserAccountSubscriber = new OneShotUserAccountSubscriber(\n\t\t\tthis._driftClient.program,\n\t\t\tuserAccountPublicKey,\n\t\t\tundefined,\n\t\t\tundefined\n\t\t);\n\t\tconst user = new User({\n\t\t\tdriftClient: this._driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: oneShotUserAccountSubscriber,\n\t\t\t},\n\t\t});\n\t\tawait user.subscribe();\n\t\treturn user;\n\t}\n\n\t/**\n\t * Gets transaction parameters with dynamic priority fees.\n\t * Falls back to default if priority fee function is not available.\n\t */\n\tgetTxParams(overrides?: Partial<TxParams>): TxParams {\n\t\tconst unsafePriorityFee = Math.floor(\n\t\t\tthis.priorityFeeSubscriber.getCustomStrategyResult() ??\n\t\t\t\tDriftOperations.DEFAULT_TX_PARAMS.computeUnitsPrice\n\t\t);\n\n\t\tconst safePriorityFee = Math.min(\n\t\t\tunsafePriorityFee,\n\t\t\tDriftOperations.MAX_COMPUTE_UNITS_PRICE\n\t\t);\n\n\t\treturn {\n\t\t\t...DriftOperations.DEFAULT_TX_PARAMS,\n\t\t\tcomputeUnitsPrice: safePriorityFee,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\tpublic async getCreateAndDepositTxn(\n\t\tauthority: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\treferrerName?: string;\n\t\t\taccountName?: string;\n\t\t\tpoolId?: number;\n\t\t\tfromSubAccountId?: number;\n\t\t\tcustomMaxMarginRatio?: number;\n\t\t\ttxParams?: TxParams;\n\t\t\t/**\n\t\t\t * Optional external wallet to deposit from. If provided, the deposit will be made\n\t\t\t * from this wallet instead of the authority wallet.\n\t\t\t */\n\t\t\texternalWallet?: PublicKey;\n\t\t}\n\t): Promise<{\n\t\ttransaction: VersionedTransaction | Transaction;\n\t\tuserAccountPublicKey: PublicKey;\n\t\tsubAccountId: number;\n\t}> {\n\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t);\n\n\t\tif (!spotMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t);\n\t\t}\n\n\t\tconst userStatsAccount = await fetchUserStatsAccount(\n\t\t\tthis._driftClient.connection,\n\t\t\tthis._driftClient.program,\n\t\t\tauthority\n\t\t);\n\n\t\treturn this.authorityContextWrapper(\n\t\t\toptions?.externalWallet ?? authority,\n\t\t\tasync () => {\n\t\t\t\tthis._driftClient.authority = authority;\n\t\t\t\t// Clear userStatsAccountPublicKey cache so it's recalculated for the new authority\n\t\t\t\t// @ts-ignore - accessing private property for cache invalidation\n\t\t\t\tthis._driftClient.userStatsAccountPublicKey = undefined;\n\n\t\t\t\treturn await createUserAndDepositCollateralBaseTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tamount,\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\tauthority,\n\t\t\t\t\tuserStatsAccount,\n\t\t\t\t\treferrerName: options?.referrerName,\n\t\t\t\t\taccountName: options?.accountName,\n\t\t\t\t\tpoolId: options?.poolId,\n\t\t\t\t\tfromSubAccountId: options?.fromSubAccountId,\n\t\t\t\t\tcustomMaxMarginRatio: options?.customMaxMarginRatio,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t\texternalWallet: options?.externalWallet,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getDepositTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t\t/**\n\t\t\t * Optional external wallet to deposit from. If provided, the deposit will be made\n\t\t\t * from this wallet instead of the user's authority wallet.\n\t\t\t */\n\t\t\texternalWallet?: PublicKey;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst depositTxn = await createDepositTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t\texternalWallet: options?.externalWallet,\n\t\t\t\t});\n\n\t\t\t\treturn depositTxn;\n\t\t\t},\n\t\t\toptions?.externalWallet\n\t\t);\n\t}\n\n\tpublic async getDeleteUserTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(userAccountPublicKey, async () => {\n\t\t\treturn deleteUserTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tuserPublicKey: userAccountPublicKey,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic async getWithdrawTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\tisBorrow?: boolean;\n\t\t\tisMax?: boolean;\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst withdrawTxn = await createWithdrawTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\tisBorrow: options?.isBorrow,\n\t\t\t\t\tisMax: options?.isMax,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\n\t\t\t\treturn withdrawTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettleFundingTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settleFundingTxn = await createSettleFundingTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\n\t\t\t\treturn settleFundingTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettlePnlTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketIndexes: number[],\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settlePnlTxn = await createSettlePnlTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndexes,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\n\t\t\t\treturn settlePnlTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t// overloads for better type inference\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<true>\n\t): Promise<SwiftOrderMessage>;\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams:\n\t\t\t| CentralServerGetOpenPerpMarketOrderTxnParams<true>\n\t\t\t| CentralServerGetOpenPerpMarketOrderTxnParams<false>\n\t): Promise<SwiftOrderMessage | Transaction | VersionedTransaction> {\n\t\tconst { userAccountPublicKey, useSwift, ...genericRest } = params;\n\n\t\tif (useSwift) {\n\t\t\tconst { swiftOptions, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpMarketOrderTxnParams<true>;\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<SwiftOrderMessage> => {\n\t\t\t\t\treturn createSwiftMarketOrderMessage({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t\tuserSigningSlotBuffer: swiftOptions?.userSigningSlotBuffer,\n\t\t\t\t\t\tisDelegate: swiftOptions?.isDelegate ?? !!rest.mainSignerOverride,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tconst { txParams, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpMarketOrderTxnParams<false>;\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<Transaction | VersionedTransaction> => {\n\t\t\t\t\tconst openPerpMarketOrderTxn = await createOpenPerpMarketOrder({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t\ttxParams: txParams ?? this.getTxParams(),\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpMarketOrderTxn as Transaction | VersionedTransaction;\n\t\t\t\t},\n\t\t\t\trest.mainSignerOverride\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a perp non-market order with amount and asset type\n\t */\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<true>\n\t): Promise<SwiftOrderMessage>;\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams:\n\t\t\t| CentralServerGetOpenPerpNonMarketOrderTxnParams<true>\n\t\t\t| CentralServerGetOpenPerpNonMarketOrderTxnParams<false>\n\t): Promise<SwiftOrderMessage | Transaction | VersionedTransaction> {\n\t\tconst { userAccountPublicKey, useSwift, ...genericRest } = params;\n\n\t\tif (useSwift) {\n\t\t\tconst { swiftOptions, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpNonMarketOrderTxnParams<true>;\n\n\t\t\tif (rest.orderConfig.orderType !== 'limit') {\n\t\t\t\tthrow new Error('Only limit orders are supported with Swift');\n\t\t\t}\n\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<SwiftOrderMessage> => {\n\t\t\t\t\treturn createSwiftLimitOrderMessage({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\torderConfig: rest.orderConfig as LimitOrderParamsOrderConfig,\n\t\t\t\t\t\tuserSigningSlotBuffer: swiftOptions?.userSigningSlotBuffer,\n\t\t\t\t\t\tisDelegate: swiftOptions?.isDelegate ?? !!rest.mainSignerOverride,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tconst { txParams, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpNonMarketOrderTxnParams<false>;\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<Transaction | VersionedTransaction> => {\n\t\t\t\t\tconst openPerpNonMarketOrderTxn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\ttxParams: txParams ?? this.getTxParams(),\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpNonMarketOrderTxn as\n\t\t\t\t\t\t| Transaction\n\t\t\t\t\t\t| VersionedTransaction;\n\t\t\t\t},\n\t\t\t\trest.mainSignerOverride\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a transaction to withdraw collateral from an isolated perp position back to cross. Often to be called after fully closing position\n\t */\n\tpublic async getWithdrawIsolatedPerpPositionCollateralTxn(\n\t\tparams: CentralServerGetWithdrawIsolatedPerpPositionCollateralTxnParams\n\t): Promise<VersionedTransaction | Transaction> {\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tparams.userAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = params.mainSignerOverride;\n\t\t\t\tconst ixs: import('@solana/web3.js').TransactionInstruction[] = [];\n\t\t\t\tconst shouldSettlePnl =\n\t\t\t\t\tparams.settlePnlFirst ?? params.isFullWithdrawal ?? false;\n\t\t\t\tif (shouldSettlePnl) {\n\t\t\t\t\tconst settleIx = await createSettlePnlIx({\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tmarketIndexes: [params.marketIndex],\n\t\t\t\t\t\tmode: SettlePnlMode.TRY_SETTLE,\n\t\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\t});\n\t\t\t\t\tixs.push(settleIx);\n\t\t\t\t}\n\t\t\t\tconst position =\n\t\t\t\t\tuser.getUserAccount().perpPositions[params.marketIndex];\n\t\t\t\tconst transferAmount =\n\t\t\t\t\tparams.isFullWithdrawal && position.baseAssetAmount.eq(ZERO)\n\t\t\t\t\t\t? MIN_I64\n\t\t\t\t\t\t: params.amount.neg();\n\t\t\t\tconst transferIx =\n\t\t\t\t\tawait this._driftClient.getTransferIsolatedPerpPositionDepositIx(\n\t\t\t\t\t\ttransferAmount,\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tuser.getUserAccount().subAccountId,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tsigningAuthority\n\t\t\t\t\t);\n\t\t\t\tixs.push(transferIx);\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\tparams.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Single transaction: close isolated position + optionally withdraw collateral.\n\t * Without placeAndTake that atomically fills the close, the entire transaction may FAIL:\n\t * the withdraw ix runs after the close, and if the close did not fill in this tx,\n\t * the whole tx will fail. Strongly consider placeAndTake: { enable: true, referrerInfo: undefined }\n\t * when closing and withdrawing in the same tx.\n\t */\n\tpublic async getCloseAndWithdrawIsolatedPerpPositionTxn(\n\t\tparams: CentralServerGetCloseAndWithdrawIsolatedPerpPositionTxnParams\n\t): Promise<VersionedTransaction | Transaction> {\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tparams.userAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = params.mainSignerOverride;\n\t\t\t\tconst ixs: TransactionInstruction[] = [];\n\t\t\t\tif (\n\t\t\t\t\tparams.settlePnlBeforeClose &&\n\t\t\t\t\tparams.withdrawCollateralAfterClose\n\t\t\t\t) {\n\t\t\t\t\tconst settleIx = await createSettlePnlIx({\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tmarketIndexes: [params.marketIndex],\n\t\t\t\t\t\tmode: SettlePnlMode.TRY_SETTLE,\n\t\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\t});\n\t\t\t\t\tixs.push(settleIx);\n\t\t\t\t}\n\t\t\t\tconst closeIxs = await createOpenPerpMarketOrderIxs({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tamount: params.baseAssetAmount,\n\t\t\t\t\tassetType: params.assetType ?? 'base',\n\t\t\t\t\treduceOnly: true,\n\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\tpositionMaxLeverage: 0,\n\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\tplaceAndTake: params.placeAndTake,\n\t\t\t\t});\n\t\t\t\tixs.push(...closeIxs);\n\t\t\t\tif (params.withdrawCollateralAfterClose) {\n\t\t\t\t\tconst transferIx =\n\t\t\t\t\t\tawait this._driftClient.getTransferIsolatedPerpPositionDepositIx(\n\t\t\t\t\t\t\tMIN_I64,\n\t\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\t\tuser.getUserAccount().subAccountId,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tsigningAuthority\n\t\t\t\t\t\t);\n\t\t\t\t\tixs.push(transferIx);\n\t\t\t\t}\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\tparams.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Deposit from wallet + open isolated perp position in one transaction.\n\t * Flow: deposit from wallet directly into isolated, then place order.\n\t */\n\tpublic async getDepositAndOpenIsolatedPerpPositionTxn(\n\t\tparams: CentralServerGetDepositAndOpenIsolatedPerpPositionTxnParams\n\t): Promise<Transaction | VersionedTransaction> {\n\t\tconst { depositAmount, userAccountPublicKey, ...rest } = params;\n\t\tif (!depositAmount || depositAmount.isZero()) {\n\t\t\tthrow new Error('depositAmount is required and must be non-zero');\n\t\t}\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = rest.mainSignerOverride;\n\t\t\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\n\t\t\t\tconst perpMarketAccount = this._driftClient.getPerpMarketAccount(\n\t\t\t\t\tparams.marketIndex\n\t\t\t\t);\n\t\t\t\tconst quoteSpotMarketIndex = perpMarketAccount.quoteSpotMarketIndex;\n\t\t\t\tconst spotMarketAccount =\n\t\t\t\t\tthis._driftClient.getSpotMarketAccount(quoteSpotMarketIndex);\n\t\t\t\tconst depositor = signingAuthority ?? user.getUserAccount().authority;\n\t\t\t\tconst userTokenAccount = await getTokenAddressForDepositAndWithdraw(\n\t\t\t\t\tspotMarketAccount,\n\t\t\t\t\tdepositor\n\t\t\t\t);\n\n\t\t\t\tconst depositIx =\n\t\t\t\t\tawait this._driftClient.getDepositIntoIsolatedPerpPositionIx(\n\t\t\t\t\t\tdepositAmount,\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tuserTokenAccount,\n\t\t\t\t\t\tsubAccountId\n\t\t\t\t\t);\n\n\t\t\t\tconst orderIxs = await createOpenPerpMarketOrderIxs({\n\t\t\t\t\t...rest,\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t});\n\n\t\t\t\tconst ixs = [depositIx, ...orderIxs];\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\trest.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Close isolated position + withdraw to wallet in one transaction.\n\t * Flow: close order, then withdraw from isolated directly to wallet (bundle handles settle if needed).\n\t * Without placeAndTake that atomically fills the close, the entire transaction may FAIL:\n\t * the withdraw runs after the close, and if the close did not fill in this tx, the withdraw may fail depending on withdraw amount.\n\t * Strongly consider placeAndTake: { enable: true, referrerInfo: undefined } when closing and withdrawing.\n\t */\n\tpublic async getCloseAndWithdrawIsolatedPerpPositionToWalletTxn(\n\t\tparams: CentralServerGetCloseAndWithdrawIsolatedPerpPositionToWalletTxnParams\n\t): Promise<VersionedTransaction | Transaction> {\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tparams.userAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = params.mainSignerOverride;\n\t\t\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\n\t\t\t\tconst closeIxs = await createOpenPerpMarketOrderIxs({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tamount: params.baseAssetAmount,\n\t\t\t\t\tassetType: params.assetType ?? 'base',\n\t\t\t\t\treduceOnly: true,\n\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\tpositionMaxLeverage: 0,\n\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\tplaceAndTake: params.placeAndTake,\n\t\t\t\t});\n\n\t\t\t\tconst perpMarketAccount = this._driftClient.getPerpMarketAccount(\n\t\t\t\t\tparams.marketIndex\n\t\t\t\t);\n\t\t\t\tconst quoteSpotMarketIndex = perpMarketAccount.quoteSpotMarketIndex;\n\t\t\t\tconst spotMarketAccount =\n\t\t\t\t\tthis._driftClient.getSpotMarketAccount(quoteSpotMarketIndex);\n\t\t\t\tconst withdrawToAuthority =\n\t\t\t\t\tparams.mainSignerOverride ?? user.getUserAccount().authority;\n\t\t\t\tconst userTokenAccount = await getTokenAddressForDepositAndWithdraw(\n\t\t\t\t\tspotMarketAccount,\n\t\t\t\t\twithdrawToAuthority\n\t\t\t\t);\n\n\t\t\t\tconst withdrawAmount =\n\t\t\t\t\tparams.estimatedWithdrawAmount ??\n\t\t\t\t\tthis._driftClient.getIsolatedPerpPositionTokenAmount(\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tsubAccountId\n\t\t\t\t\t);\n\t\t\t\tconst withdrawIxs =\n\t\t\t\t\tawait this._driftClient.getWithdrawFromIsolatedPerpPositionIxsBundle(\n\t\t\t\t\t\twithdrawAmount,\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tsubAccountId,\n\t\t\t\t\t\tuserTokenAccount\n\t\t\t\t\t);\n\n\t\t\t\tconst ixs = [...closeIxs, ...withdrawIxs];\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\tparams.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to edit an existing order\n\t */\n\tpublic async getEditOrderTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderId: number,\n\t\teditOrderParams: {\n\t\t\tnewDirection?: PositionDirection;\n\t\t\tnewBaseAmount?: BN;\n\t\t\tnewLimitPrice?: BN;\n\t\t\tnewOraclePriceOffset?: number;\n\t\t\tnewTriggerPrice?: BN;\n\t\t\tnewTriggerCondition?: OrderTriggerCondition;\n\t\t\tauctionDuration?: number;\n\t\t\tauctionStartPrice?: BN;\n\t\t\tauctionEndPrice?: BN;\n\t\t\treduceOnly?: boolean;\n\t\t\tpostOnly?: boolean;\n\t\t\tbitFlags?: number;\n\t\t\tmaxTs?: BN;\n\t\t\tpolicy?: number;\n\t\t\tpositionMaxLeverage?: number;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst editOrderTxn = await createEditOrderTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderId,\n\t\t\t\t\teditOrderParams,\n\t\t\t\t});\n\n\t\t\t\treturn editOrderTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel specific orders by their IDs\n\t */\n\tpublic async getCancelOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderIds: number[]\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst cancelOrdersTxn = await createCancelOrdersTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderIds,\n\t\t\t\t});\n\n\t\t\t\treturn cancelOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel all orders for a user\n\t */\n\tpublic async getCancelAllOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketType?: MarketType,\n\t\tmarketIndex?: number,\n\t\tdirection?: PositionDirection\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst ix = await this._driftClient.getCancelOrdersIx(\n\t\t\t\t\tmarketType ?? null,\n\t\t\t\t\tmarketIndex ?? null,\n\t\t\t\t\tdirection ?? null,\n\t\t\t\t\tuser.getUserAccount().subAccountId\n\t\t\t\t);\n\n\t\t\t\tconst cancelAllOrdersTxn = await this._driftClient.buildTransaction(ix);\n\n\t\t\t\treturn cancelAllOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a swap transaction between two spot markets using Jupiter\n\t */\n\tpublic async getSwapTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tfromMarketIndex: number,\n\t\ttoMarketIndex: number,\n\t\tamount: BN,\n\t\toptions?: {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t\tquote?: UnifiedQuoteResponse;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst fromSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === fromMarketIndex\n\t\t\t\t);\n\t\t\t\tconst toSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === toMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!fromSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`From spot market config not found for index ${fromMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!toSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`To spot market config not found for index ${toMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst swapClient = new UnifiedSwapClient({\n\t\t\t\t\tclientType: 'jupiter',\n\t\t\t\t\tconnection: this._driftClient.connection,\n\t\t\t\t});\n\n\t\t\t\t// Get quote if not provided\n\t\t\t\tlet quote = options?.quote;\n\t\t\t\tif (!quote) {\n\t\t\t\t\tquote = await swapClient.getQuote({\n\t\t\t\t\t\tinputMint: fromSpotMarketConfig.mint,\n\t\t\t\t\t\toutputMint: toSpotMarketConfig.mint,\n\t\t\t\t\t\tamount,\n\t\t\t\t\t\tslippageBps: options?.slippageBps ?? 10, // Default 0.1%\n\t\t\t\t\t\tswapMode: options?.swapMode ?? 'ExactIn',\n\t\t\t\t\t\tonlyDirectRoutes: options?.onlyDirectRoutes ?? false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst swapTxn = await createSwapTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tswapClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tswapFromMarketIndex: fromMarketIndex,\n\t\t\t\t\tswapToMarketIndex: toMarketIndex,\n\t\t\t\t\tamount,\n\t\t\t\t\tquote,\n\t\t\t\t\ttxParams: {\n\t\t\t\t\t\tuseSimulatedComputeUnits: true,\n\t\t\t\t\t\tcomputeUnitsBufferMultiplier: 1.5,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn swapTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to initialize a RevenueShareEscrow account for a user.\n\t * Optionally bundles an initial builder approval in the same transaction.\n\t */\n\tpublic async getCreateRevenueShareEscrowTxn(\n\t\tauthority: PublicKey,\n\t\toptions?: {\n\t\t\tnumOrders?: number;\n\t\t\tbuilder?: {\n\t\t\t\tbuilderAuthority: PublicKey;\n\t\t\t\tmaxFeeTenthBps: number;\n\t\t\t};\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.authorityContextWrapper(authority, () =>\n\t\t\tcreateRevenueShareEscrowTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tauthority,\n\t\t\t\tnumOrders: options?.numOrders ?? 16,\n\t\t\t\tbuilder: options?.builder,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to initialize a RevenueShare account for a builder.\n\t * This must be initialized before a builder can receive builder fees.\n\t */\n\tpublic async getCreateRevenueShareAccountTxn(\n\t\tauthority: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.authorityContextWrapper(authority, () =>\n\t\t\tcreateRevenueShareAccountTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tauthority,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to configure a builder's approval status and fee cap.\n\t * Handles approve, update, and revoke operations.\n\t * Set maxFeeTenthBps to 0 to revoke a builder.\n\t */\n\tpublic async getConfigureApprovedBuilderTxn(\n\t\tauthority: PublicKey,\n\t\tbuilderAuthority: PublicKey,\n\t\tmaxFeeTenthBps: number,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.authorityContextWrapper(authority, () =>\n\t\t\tconfigureBuilderTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tauthority,\n\t\t\t\tbuilderAuthority,\n\t\t\t\tmaxFeeTenthBps,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t})\n\t\t);\n\t}\n\n\tpublic async sendSignedTransaction(tx: VersionedTransaction | Transaction) {\n\t\treturn this._driftClient.sendTransaction(tx, undefined, undefined, true);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/Drift/clients/CentralServerDrift/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBigNum,\n\tBN,\n\tCustomizedCadenceBulkAccountLoader,\n\tDelistedMarketSetting,\n\tDevnetPerpMarkets,\n\tDevnetSpotMarkets,\n\tDRIFT_PROGRAM_ID,\n\tDriftClient,\n\tDriftClientConfig,\n\tDriftEnv,\n\tfetchUserStatsAccount,\n\tgetMarketsAndOraclesForSubscription,\n\tMainnetPerpMarkets,\n\tMainnetSpotMarkets,\n\tMarketType,\n\tMIN_I64,\n\tOneShotUserAccountSubscriber,\n\tOrderTriggerCondition,\n\tPerpMarketConfig,\n\tPositionDirection,\n\tPriorityFeeMethod,\n\tPriorityFeeSubscriber,\n\tPriorityFeeSubscriberConfig,\n\tPublicKey,\n\tSettlePnlMode,\n\tSpotMarketConfig,\n\tSwapMode,\n\tTxParams,\n\tUnifiedQuoteResponse,\n\tUnifiedSwapClient,\n\tUser,\n\tWhileValidTxSender,\n\tZERO,\n} from '@drift-labs/sdk';\nimport {\n\tConnection,\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n} 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\tHIGH_ACTIVITY_MARKET_ACCOUNTS,\n} from '../../constants';\nimport { createDepositTxn } from '../../../base/actions/spot/deposit';\nimport { createWithdrawTxn } from '../../../base/actions/spot/withdraw';\nimport { getTokenAddressForDepositAndWithdraw } from '../../../../utils/token';\nimport { createSettleFundingTxn } from '../../../base/actions/perp/settleFunding';\nimport {\n\tcreateSettlePnlIx,\n\tcreateSettlePnlTxn,\n} from '../../../base/actions/perp/settlePnl';\nimport {\n\tcreateOpenPerpMarketOrder,\n\tcreateOpenPerpMarketOrderIxs,\n\tcreateSwiftMarketOrderMessage,\n} from '../../../base/actions/trade/openPerpOrder/openPerpMarketOrder';\nimport {\n\tcreateOpenPerpNonMarketOrder,\n\tcreateSwiftLimitOrderMessage,\n} from '../../../base/actions/trade/openPerpOrder/openPerpNonMarketOrder';\nimport { SwiftOrderMessage } from '../../../base/actions/trade/openPerpOrder/openSwiftOrder';\nimport { LimitOrderParamsOrderConfig } from '../../../base/actions/trade/openPerpOrder/types';\nimport { createEditOrderTxn } from '../../../base/actions/trade/editOrder';\nimport { createCancelOrdersTxn } from '../../../base/actions/trade/cancelOrder';\nimport { createSwapTxn } from '../../../base/actions/trade/swap';\nimport { createUserAndDepositCollateralBaseTxn } from '../../../base/actions/user/create';\nimport { deleteUserTxn } from '../../../base/actions/user/delete';\nimport { createRevenueShareEscrowTxn } from '../../../base/actions/builder/createRevenueShareEscrow';\nimport { createRevenueShareAccountTxn } from '../../../base/actions/builder/createRevenueShareAccount';\nimport { configureBuilderTxn } from '../../../base/actions/builder/configureBuilder';\nimport { EnvironmentConstants } from '../../../../EnvironmentConstants';\nimport {\n\tCentralServerGetOpenPerpMarketOrderTxnParams,\n\tCentralServerGetOpenPerpNonMarketOrderTxnParams,\n\tCentralServerGetWithdrawIsolatedPerpPositionCollateralTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionTxnParams,\n\tCentralServerGetDepositAndOpenIsolatedPerpPositionTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionToWalletTxnParams,\n} from './types';\nimport { CentralServerDriftMarkets } from './markets';\nimport { DriftOperations } from '../AuthorityDrift/DriftOperations';\n\nexport type {\n\tCentralServerGetOpenPerpMarketOrderTxnParams,\n\tCentralServerGetOpenPerpNonMarketOrderTxnParams,\n\tCentralServerSwiftOrderOptions,\n\tCentralServerGetWithdrawIsolatedPerpPositionCollateralTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionTxnParams,\n\tCentralServerGetDepositAndOpenIsolatedPerpPositionTxnParams,\n\tCentralServerGetCloseAndWithdrawIsolatedPerpPositionToWalletTxnParams,\n} from './types';\nexport type { SwiftOrderMessage } from '../../../base/actions/trade/openPerpOrder/openSwiftOrder';\n\n/**\n * A Drift client that fetches user data on-demand, while market data is continuously subscribed to.\n *\n * This is useful for an API server that fetches user data on-demand, and return transaction messages specific to a given user\n */\nexport class CentralServerDrift {\n\tprivate _driftClient: DriftClient;\n\tprivate _perpMarketConfigs: PerpMarketConfig[];\n\tprivate _spotMarketConfigs: SpotMarketConfig[];\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};\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 * Mutex to serialize driftClientContextWrapper calls, preventing\n\t * concurrent mutations of shared DriftClient state.\n\t */\n\tprivate _mutex: Promise<void> = Promise.resolve();\n\n\tpublic readonly markets: CentralServerDriftMarkets;\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 supportedPerpMarkets - The perp markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/perpMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t * @param supportedSpotMarkets - The spot markets indexes to support. See https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/constants/spotMarkets.ts for all available markets. It is recommended to only include markets that will be used.\n\t */\n\tconstructor(config: {\n\t\tsolanaRpcEndpoint: string;\n\t\tdriftEnv: DriftEnv;\n\t\tsupportedPerpMarkets: number[];\n\t\tsupportedSpotMarkets: number[];\n\t\tadditionalDriftClientConfig?: Partial<Omit<DriftClientConfig, 'env'>>;\n\t\tpriorityFeeSubscriberConfig?: Partial<PriorityFeeSubscriberConfig>;\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\n\t\tconst wallet = COMMON_UI_UTILS.createPlaceholderIWallet(); // use random wallet to initialize a central-server instance\n\n\t\tconst allPerpMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetPerpMarkets : MainnetPerpMarkets;\n\t\tconst allSpotMarketConfigs =\n\t\t\tdriftEnv === 'devnet' ? DevnetSpotMarkets : MainnetSpotMarkets;\n\t\tthis._perpMarketConfigs = config.supportedPerpMarkets.map((marketIndex) =>\n\t\t\tallPerpMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\t\tthis._spotMarketConfigs = config.supportedSpotMarkets.map((marketIndex) =>\n\t\t\tallSpotMarketConfigs.find((market) => market.marketIndex === marketIndex)\n\t\t);\n\n\t\tconst oracleInfos = getMarketsAndOraclesForSubscription(\n\t\t\tdriftEnv,\n\t\t\tthis._perpMarketConfigs,\n\t\t\tthis._spotMarketConfigs\n\t\t);\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: false,\n\t\t\tincludeDelegates: false,\n\t\t\tskipLoadUsers: true,\n\t\t\tdelistedMarketSetting: DelistedMarketSetting.Unsubscribe,\n\t\t\tperpMarketIndexes: this._perpMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\tspotMarketIndexes: this._spotMarketConfigs.map(\n\t\t\t\t(market) => market.marketIndex\n\t\t\t),\n\t\t\toracleInfos: oracleInfos.oracleInfos,\n\t\t\t...config.additionalDriftClientConfig,\n\t\t};\n\t\tthis._driftClient = new DriftClient(driftClientConfig);\n\t\tthis.markets = new CentralServerDriftMarkets(this._driftClient);\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\t// set up Drift endpoints\n\t\tconst driftDlobServerHttpUrlToUse =\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\tthis._driftEndpoints = {\n\t\t\tdlobServerHttpUrl: driftDlobServerHttpUrlToUse,\n\t\t\tswiftServerUrl: swiftServerUrlToUse,\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\taddresses: HIGH_ACTIVITY_MARKET_ACCOUNTS,\n\t\t\t...config.priorityFeeSubscriberConfig,\n\t\t};\n\n\t\tthis.priorityFeeSubscriber = new PriorityFeeSubscriber(priorityFeeConfig);\n\t}\n\n\tpublic get driftClient() {\n\t\treturn this._driftClient;\n\t}\n\n\tpublic async subscribe() {\n\t\tawait this._driftClient.subscribe();\n\t\tawait this.priorityFeeSubscriber.subscribe();\n\t}\n\n\tpublic async unsubscribe() {\n\t\tawait this._driftClient.unsubscribe();\n\t\tawait this.priorityFeeSubscriber.unsubscribe();\n\t}\n\n\t/**\n\t * Temporarily swaps the DriftClient wallet/authority context to build transactions\n\t * for a given authority, then restores the original state.\n\t *\n\t * Use this for authority-based operations that don't require a User account subscription\n\t * (e.g. creating revenue share accounts, managing builders).\n\t *\n\t * @param authority - The authority to set on the DriftClient\n\t * @param operation - The transaction creation operation to execute\n\t * @returns The result of the operation\n\t */\n\tprivate async authorityContextWrapper<T>(\n\t\tauthority: PublicKey,\n\t\toperation: () => Promise<T>\n\t): Promise<T> {\n\t\tconst originalWallet = this._driftClient.wallet;\n\t\tconst originalAuthority = this._driftClient.authority;\n\n\t\tconst authorityWallet = {\n\t\t\tpublicKey: authority,\n\t\t\tsignTransaction: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t\tsignAllTransactions: () =>\n\t\t\t\tPromise.reject('This is a placeholder - do not sign with this wallet'),\n\t\t};\n\n\t\ttry {\n\t\t\tthis._driftClient.wallet = authorityWallet;\n\t\t\t// @ts-ignore\n\t\t\tthis._driftClient.provider.wallet = authorityWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(authorityWallet);\n\t\t\tthis._driftClient.authority = authority;\n\n\t\t\treturn await operation();\n\t\t} finally {\n\t\t\tthis._driftClient.wallet = originalWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(originalWallet);\n\t\t\t// @ts-ignore\n\t\t\tthis._driftClient.provider.wallet = originalWallet;\n\t\t\tthis._driftClient.authority = originalAuthority;\n\t\t}\n\t}\n\n\t/**\n\t * Manages DriftClient state for transaction creation with proper setup and cleanup.\n\t * This abstraction handles:\n\t * - User creation and subscription\n\t * - Authority management\n\t * - Wallet replacement for correct transaction signing\n\t * - Cleanup and state restoration\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t * @param operation - The transaction creation operation to execute\n\t * @returns The result of the operation\n\t */\n\tprivate async driftClientContextWrapper<T>(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toperation: (user: User) => Promise<T>,\n\t\texternalWallet?: PublicKey\n\t): Promise<T> {\n\t\t// Acquire mutex — wait for any previous operation to finish\n\t\tlet release: () => void;\n\t\tconst acquire = new Promise<void>((resolve) => {\n\t\t\trelease = resolve;\n\t\t});\n\t\tconst prev = this._mutex;\n\t\tthis._mutex = acquire;\n\t\tawait prev;\n\n\t\tconst user = new User({\n\t\t\tdriftClient: this._driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: new OneShotUserAccountSubscriber(\n\t\t\t\t\tthis._driftClient.program,\n\t\t\t\t\tuserAccountPublicKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\n\t\t// Store original state\n\t\tconst originalWallet = this._driftClient.wallet;\n\t\tconst originalAuthority = this._driftClient.authority;\n\n\t\ttry {\n\t\t\t// Setup: Subscribe to user and configure DriftClient\n\t\t\tawait user.subscribe();\n\n\t\t\tconst authority = user.getUserAccount().authority;\n\t\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\t\t\tthis._driftClient.authority = authority;\n\n\t\t\tconst success = await this._driftClient.addUser(subAccountId, authority);\n\t\t\tawait this._driftClient.switchActiveUser(subAccountId, authority);\n\n\t\t\tif (!success) {\n\t\t\t\tthrow new Error('Failed to add user to DriftClient');\n\t\t\t}\n\n\t\t\t// Replace wallet with user's authority to ensure correct transaction signing\n\t\t\t// This is necessary because DriftClient adds wallet.publicKey to instructions\n\t\t\tconst userWallet = {\n\t\t\t\tpublicKey: externalWallet ?? authority,\n\t\t\t\tsignTransaction: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t\tsignAllTransactions: () =>\n\t\t\t\t\tPromise.reject(\n\t\t\t\t\t\t'This is a placeholder - do not sign with this wallet'\n\t\t\t\t\t),\n\t\t\t};\n\n\t\t\t// Update wallet in all places that reference it\n\t\t\tthis._driftClient.wallet = userWallet;\n\t\t\t//@ts-ignore\n\t\t\tthis._driftClient.provider.wallet = userWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(userWallet);\n\n\t\t\t// Execute the operation\n\t\t\tconst result = await operation(user);\n\n\t\t\treturn result;\n\t\t} finally {\n\t\t\t// Cleanup: Always restore original state and unsubscribe\n\t\t\tthis._driftClient.wallet = originalWallet;\n\t\t\t//@ts-ignore\n\t\t\tthis._driftClient.provider.wallet = originalWallet;\n\t\t\tthis._driftClient.txHandler.updateWallet(originalWallet);\n\t\t\tthis._driftClient.authority = originalAuthority;\n\t\t\t// clear cached PDA so it doesn't leak between requests\n\t\t\tthis._driftClient.userStatsAccountPublicKey = undefined;\n\n\t\t\ttry {\n\t\t\t\tawait user.unsubscribe();\n\t\t\t\tthis._driftClient.users.clear();\n\t\t\t} catch (cleanupError) {\n\t\t\t\tconsole.warn('Error during cleanup:', cleanupError);\n\t\t\t\t// Don't throw cleanup errors, but log them\n\t\t\t}\n\n\t\t\t// Release mutex — let next queued operation proceed\n\t\t\trelease!();\n\t\t}\n\t}\n\n\t/**\n\t * Returns a User object for a given user account public key. This fetches the user account data once.\n\t *\n\t * You may read more about the User object [here](https://github.com/drift-labs/protocol-v2/blob/master/sdk/src/user.ts)\n\t *\n\t * @param userAccountPublicKey - The user account public key\n\t */\n\tpublic async getUser(userAccountPublicKey: PublicKey): Promise<User> {\n\t\tconst oneShotUserAccountSubscriber = new OneShotUserAccountSubscriber(\n\t\t\tthis._driftClient.program,\n\t\t\tuserAccountPublicKey,\n\t\t\tundefined,\n\t\t\tundefined\n\t\t);\n\t\tconst user = new User({\n\t\t\tdriftClient: this._driftClient,\n\t\t\tuserAccountPublicKey,\n\t\t\taccountSubscription: {\n\t\t\t\ttype: 'custom',\n\t\t\t\tuserAccountSubscriber: oneShotUserAccountSubscriber,\n\t\t\t},\n\t\t});\n\t\tawait user.subscribe();\n\t\treturn user;\n\t}\n\n\t/**\n\t * Gets transaction parameters with dynamic priority fees.\n\t * Falls back to default if priority fee function is not available.\n\t */\n\tgetTxParams(overrides?: Partial<TxParams>): TxParams {\n\t\tconst unsafePriorityFee = Math.floor(\n\t\t\tthis.priorityFeeSubscriber.getCustomStrategyResult() ??\n\t\t\t\tDriftOperations.DEFAULT_TX_PARAMS.computeUnitsPrice\n\t\t);\n\n\t\tconst safePriorityFee = Math.min(\n\t\t\tunsafePriorityFee,\n\t\t\tDriftOperations.MAX_COMPUTE_UNITS_PRICE\n\t\t);\n\n\t\treturn {\n\t\t\t...DriftOperations.DEFAULT_TX_PARAMS,\n\t\t\tcomputeUnitsPrice: safePriorityFee,\n\t\t\t...overrides,\n\t\t};\n\t}\n\n\tpublic async getCreateAndDepositTxn(\n\t\tauthority: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\treferrerName?: string;\n\t\t\taccountName?: string;\n\t\t\tpoolId?: number;\n\t\t\tfromSubAccountId?: number;\n\t\t\tcustomMaxMarginRatio?: number;\n\t\t\ttxParams?: TxParams;\n\t\t\t/**\n\t\t\t * Optional external wallet to deposit from. If provided, the deposit will be made\n\t\t\t * from this wallet instead of the authority wallet.\n\t\t\t */\n\t\t\texternalWallet?: PublicKey;\n\t\t}\n\t): Promise<{\n\t\ttransaction: VersionedTransaction | Transaction;\n\t\tuserAccountPublicKey: PublicKey;\n\t\tsubAccountId: number;\n\t}> {\n\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t);\n\n\t\tif (!spotMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t);\n\t\t}\n\n\t\tconst userStatsAccount = await fetchUserStatsAccount(\n\t\t\tthis._driftClient.connection,\n\t\t\tthis._driftClient.program,\n\t\t\tauthority\n\t\t);\n\n\t\treturn this.authorityContextWrapper(\n\t\t\toptions?.externalWallet ?? authority,\n\t\t\tasync () => {\n\t\t\t\tthis._driftClient.authority = authority;\n\t\t\t\t// Clear userStatsAccountPublicKey cache so it's recalculated for the new authority\n\t\t\t\t// @ts-ignore - accessing private property for cache invalidation\n\t\t\t\tthis._driftClient.userStatsAccountPublicKey = undefined;\n\n\t\t\t\treturn await createUserAndDepositCollateralBaseTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tamount,\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\tauthority,\n\t\t\t\t\tuserStatsAccount,\n\t\t\t\t\treferrerName: options?.referrerName,\n\t\t\t\t\taccountName: options?.accountName,\n\t\t\t\t\tpoolId: options?.poolId,\n\t\t\t\t\tfromSubAccountId: options?.fromSubAccountId,\n\t\t\t\t\tcustomMaxMarginRatio: options?.customMaxMarginRatio,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t\texternalWallet: options?.externalWallet,\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getDepositTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t\t/**\n\t\t\t * Optional external wallet to deposit from. If provided, the deposit will be made\n\t\t\t * from this wallet instead of the user's authority wallet.\n\t\t\t */\n\t\t\texternalWallet?: PublicKey;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst depositTxn = await createDepositTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t\texternalWallet: options?.externalWallet,\n\t\t\t\t});\n\n\t\t\t\treturn depositTxn;\n\t\t\t},\n\t\t\toptions?.externalWallet\n\t\t);\n\t}\n\n\tpublic async getDeleteUserTxn(\n\t\tuser: User,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuser.userAccountPublicKey,\n\t\t\tasync () => {\n\t\t\t\tconst userStatsAccount = await fetchUserStatsAccount(\n\t\t\t\t\tthis._driftClient.connection,\n\t\t\t\t\tthis._driftClient.program,\n\t\t\t\t\tuser.getUserAccount().authority\n\t\t\t\t);\n\n\t\t\t\tif (!userStatsAccount) {\n\t\t\t\t\tthrow new Error('User stats account not found');\n\t\t\t\t}\n\n\t\t\t\treturn deleteUserTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tuserStatsAccount,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getWithdrawTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tamount: BN,\n\t\tspotMarketIndex: number,\n\t\toptions?: {\n\t\t\tisBorrow?: boolean;\n\t\t\tisMax?: boolean;\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst spotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === spotMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!spotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Spot market config not found for index ${spotMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst withdrawTxn = await createWithdrawTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tamount: BigNum.from(amount, spotMarketConfig.precisionExp),\n\t\t\t\t\tspotMarketConfig,\n\t\t\t\t\tisBorrow: options?.isBorrow,\n\t\t\t\t\tisMax: options?.isMax,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\n\t\t\t\treturn withdrawTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettleFundingTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settleFundingTxn = await createSettleFundingTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\n\t\t\t\treturn settleFundingTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\tpublic async getSettlePnlTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketIndexes: number[],\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst settlePnlTxn = await createSettlePnlTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndexes,\n\t\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t\t});\n\n\t\t\t\treturn settlePnlTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t// overloads for better type inference\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<true>\n\t): Promise<SwiftOrderMessage>;\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpMarketOrderTxn(\n\t\tparams:\n\t\t\t| CentralServerGetOpenPerpMarketOrderTxnParams<true>\n\t\t\t| CentralServerGetOpenPerpMarketOrderTxnParams<false>\n\t): Promise<SwiftOrderMessage | Transaction | VersionedTransaction> {\n\t\tconst { userAccountPublicKey, useSwift, ...genericRest } = params;\n\n\t\tif (useSwift) {\n\t\t\tconst { swiftOptions, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpMarketOrderTxnParams<true>;\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<SwiftOrderMessage> => {\n\t\t\t\t\treturn createSwiftMarketOrderMessage({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t\tuserSigningSlotBuffer: swiftOptions?.userSigningSlotBuffer,\n\t\t\t\t\t\tisDelegate: swiftOptions?.isDelegate ?? !!rest.mainSignerOverride,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tconst { txParams, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpMarketOrderTxnParams<false>;\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<Transaction | VersionedTransaction> => {\n\t\t\t\t\tconst openPerpMarketOrderTxn = await createOpenPerpMarketOrder({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\t\ttxParams: txParams ?? this.getTxParams(),\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpMarketOrderTxn as Transaction | VersionedTransaction;\n\t\t\t\t},\n\t\t\t\trest.mainSignerOverride\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a perp non-market order with amount and asset type\n\t */\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<true>\n\t): Promise<SwiftOrderMessage>;\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams: CentralServerGetOpenPerpNonMarketOrderTxnParams<false>\n\t): Promise<Transaction | VersionedTransaction>;\n\tpublic async getOpenPerpNonMarketOrderTxn(\n\t\tparams:\n\t\t\t| CentralServerGetOpenPerpNonMarketOrderTxnParams<true>\n\t\t\t| CentralServerGetOpenPerpNonMarketOrderTxnParams<false>\n\t): Promise<SwiftOrderMessage | Transaction | VersionedTransaction> {\n\t\tconst { userAccountPublicKey, useSwift, ...genericRest } = params;\n\n\t\tif (useSwift) {\n\t\t\tconst { swiftOptions, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpNonMarketOrderTxnParams<true>;\n\n\t\t\tif (rest.orderConfig.orderType !== 'limit') {\n\t\t\t\tthrow new Error('Only limit orders are supported with Swift');\n\t\t\t}\n\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<SwiftOrderMessage> => {\n\t\t\t\t\treturn createSwiftLimitOrderMessage({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\torderConfig: rest.orderConfig as LimitOrderParamsOrderConfig,\n\t\t\t\t\t\tuserSigningSlotBuffer: swiftOptions?.userSigningSlotBuffer,\n\t\t\t\t\t\tisDelegate: swiftOptions?.isDelegate ?? !!rest.mainSignerOverride,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tconst { txParams, ...rest } =\n\t\t\t\tgenericRest as CentralServerGetOpenPerpNonMarketOrderTxnParams<false>;\n\t\t\treturn this.driftClientContextWrapper(\n\t\t\t\tuserAccountPublicKey,\n\t\t\t\tasync (user): Promise<Transaction | VersionedTransaction> => {\n\t\t\t\t\tconst openPerpNonMarketOrderTxn = await createOpenPerpNonMarketOrder({\n\t\t\t\t\t\t...rest,\n\t\t\t\t\t\tuseSwift: false,\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\ttxParams: txParams ?? this.getTxParams(),\n\t\t\t\t\t});\n\t\t\t\t\treturn openPerpNonMarketOrderTxn as\n\t\t\t\t\t\t| Transaction\n\t\t\t\t\t\t| VersionedTransaction;\n\t\t\t\t},\n\t\t\t\trest.mainSignerOverride\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a transaction to withdraw collateral from an isolated perp position back to cross. Often to be called after fully closing position\n\t */\n\tpublic async getWithdrawIsolatedPerpPositionCollateralTxn(\n\t\tparams: CentralServerGetWithdrawIsolatedPerpPositionCollateralTxnParams\n\t): Promise<VersionedTransaction | Transaction> {\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tparams.userAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = params.mainSignerOverride;\n\t\t\t\tconst ixs: import('@solana/web3.js').TransactionInstruction[] = [];\n\t\t\t\tconst shouldSettlePnl =\n\t\t\t\t\tparams.settlePnlFirst ?? params.isFullWithdrawal ?? false;\n\t\t\t\tif (shouldSettlePnl) {\n\t\t\t\t\tconst settleIx = await createSettlePnlIx({\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tmarketIndexes: [params.marketIndex],\n\t\t\t\t\t\tmode: SettlePnlMode.TRY_SETTLE,\n\t\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\t});\n\t\t\t\t\tixs.push(settleIx);\n\t\t\t\t}\n\t\t\t\tconst position =\n\t\t\t\t\tuser.getUserAccount().perpPositions[params.marketIndex];\n\t\t\t\tconst transferAmount =\n\t\t\t\t\tparams.isFullWithdrawal && position.baseAssetAmount.eq(ZERO)\n\t\t\t\t\t\t? MIN_I64\n\t\t\t\t\t\t: params.amount.neg();\n\t\t\t\tconst transferIx =\n\t\t\t\t\tawait this._driftClient.getTransferIsolatedPerpPositionDepositIx(\n\t\t\t\t\t\ttransferAmount,\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tuser.getUserAccount().subAccountId,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tsigningAuthority\n\t\t\t\t\t);\n\t\t\t\tixs.push(transferIx);\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\tparams.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Single transaction: close isolated position + optionally withdraw collateral.\n\t * Without placeAndTake that atomically fills the close, the entire transaction may FAIL:\n\t * the withdraw ix runs after the close, and if the close did not fill in this tx,\n\t * the whole tx will fail. Strongly consider placeAndTake: { enable: true, referrerInfo: undefined }\n\t * when closing and withdrawing in the same tx.\n\t */\n\tpublic async getCloseAndWithdrawIsolatedPerpPositionTxn(\n\t\tparams: CentralServerGetCloseAndWithdrawIsolatedPerpPositionTxnParams\n\t): Promise<VersionedTransaction | Transaction> {\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tparams.userAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = params.mainSignerOverride;\n\t\t\t\tconst ixs: TransactionInstruction[] = [];\n\t\t\t\tif (\n\t\t\t\t\tparams.settlePnlBeforeClose &&\n\t\t\t\t\tparams.withdrawCollateralAfterClose\n\t\t\t\t) {\n\t\t\t\t\tconst settleIx = await createSettlePnlIx({\n\t\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tmarketIndexes: [params.marketIndex],\n\t\t\t\t\t\tmode: SettlePnlMode.TRY_SETTLE,\n\t\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\t});\n\t\t\t\t\tixs.push(settleIx);\n\t\t\t\t}\n\t\t\t\tconst closeIxs = await createOpenPerpMarketOrderIxs({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tamount: params.baseAssetAmount,\n\t\t\t\t\tassetType: params.assetType ?? 'base',\n\t\t\t\t\treduceOnly: true,\n\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\tpositionMaxLeverage: 0,\n\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\tplaceAndTake: params.placeAndTake,\n\t\t\t\t});\n\t\t\t\tixs.push(...closeIxs);\n\t\t\t\tif (params.withdrawCollateralAfterClose) {\n\t\t\t\t\tconst transferIx =\n\t\t\t\t\t\tawait this._driftClient.getTransferIsolatedPerpPositionDepositIx(\n\t\t\t\t\t\t\tMIN_I64,\n\t\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\t\tuser.getUserAccount().subAccountId,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tsigningAuthority\n\t\t\t\t\t\t);\n\t\t\t\t\tixs.push(transferIx);\n\t\t\t\t}\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\tparams.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Deposit from wallet + open isolated perp position in one transaction.\n\t * Flow: deposit from wallet directly into isolated, then place order.\n\t */\n\tpublic async getDepositAndOpenIsolatedPerpPositionTxn(\n\t\tparams: CentralServerGetDepositAndOpenIsolatedPerpPositionTxnParams\n\t): Promise<Transaction | VersionedTransaction> {\n\t\tconst { depositAmount, userAccountPublicKey, ...rest } = params;\n\t\tif (!depositAmount || depositAmount.isZero()) {\n\t\t\tthrow new Error('depositAmount is required and must be non-zero');\n\t\t}\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = rest.mainSignerOverride;\n\t\t\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\n\t\t\t\tconst perpMarketAccount = this._driftClient.getPerpMarketAccount(\n\t\t\t\t\tparams.marketIndex\n\t\t\t\t);\n\t\t\t\tconst quoteSpotMarketIndex = perpMarketAccount.quoteSpotMarketIndex;\n\t\t\t\tconst spotMarketAccount =\n\t\t\t\t\tthis._driftClient.getSpotMarketAccount(quoteSpotMarketIndex);\n\t\t\t\tconst depositor = signingAuthority ?? user.getUserAccount().authority;\n\t\t\t\tconst userTokenAccount = await getTokenAddressForDepositAndWithdraw(\n\t\t\t\t\tspotMarketAccount,\n\t\t\t\t\tdepositor\n\t\t\t\t);\n\n\t\t\t\tconst depositIx =\n\t\t\t\t\tawait this._driftClient.getDepositIntoIsolatedPerpPositionIx(\n\t\t\t\t\t\tdepositAmount,\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tuserTokenAccount,\n\t\t\t\t\t\tsubAccountId\n\t\t\t\t\t);\n\n\t\t\t\tconst orderIxs = await createOpenPerpMarketOrderIxs({\n\t\t\t\t\t...rest,\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t});\n\n\t\t\t\tconst ixs = [depositIx, ...orderIxs];\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\trest.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Close isolated position + withdraw to wallet in one transaction.\n\t * Flow: close order, then withdraw from isolated directly to wallet (bundle handles settle if needed).\n\t * Without placeAndTake that atomically fills the close, the entire transaction may FAIL:\n\t * the withdraw runs after the close, and if the close did not fill in this tx, the withdraw may fail depending on withdraw amount.\n\t * Strongly consider placeAndTake: { enable: true, referrerInfo: undefined } when closing and withdrawing.\n\t */\n\tpublic async getCloseAndWithdrawIsolatedPerpPositionToWalletTxn(\n\t\tparams: CentralServerGetCloseAndWithdrawIsolatedPerpPositionToWalletTxnParams\n\t): Promise<VersionedTransaction | Transaction> {\n\t\tconst perpMarketConfig = this._perpMarketConfigs.find(\n\t\t\t(m) => m.marketIndex === params.marketIndex\n\t\t);\n\t\tif (!perpMarketConfig) {\n\t\t\tthrow new Error(\n\t\t\t\t`Perp market config not found for index ${params.marketIndex}`\n\t\t\t);\n\t\t}\n\t\treturn this.driftClientContextWrapper(\n\t\t\tparams.userAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst signingAuthority = params.mainSignerOverride;\n\t\t\t\tconst subAccountId = user.getUserAccount().subAccountId;\n\n\t\t\t\tconst closeIxs = await createOpenPerpMarketOrderIxs({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tmarketIndex: params.marketIndex,\n\t\t\t\t\tdirection: params.direction,\n\t\t\t\t\tamount: params.baseAssetAmount,\n\t\t\t\t\tassetType: params.assetType ?? 'base',\n\t\t\t\t\treduceOnly: true,\n\t\t\t\t\tdlobServerHttpUrl: this._driftEndpoints.dlobServerHttpUrl,\n\t\t\t\t\tpositionMaxLeverage: 0,\n\t\t\t\t\tmainSignerOverride: signingAuthority,\n\t\t\t\t\tplaceAndTake: params.placeAndTake,\n\t\t\t\t});\n\n\t\t\t\tconst perpMarketAccount = this._driftClient.getPerpMarketAccount(\n\t\t\t\t\tparams.marketIndex\n\t\t\t\t);\n\t\t\t\tconst quoteSpotMarketIndex = perpMarketAccount.quoteSpotMarketIndex;\n\t\t\t\tconst spotMarketAccount =\n\t\t\t\t\tthis._driftClient.getSpotMarketAccount(quoteSpotMarketIndex);\n\t\t\t\tconst withdrawToAuthority =\n\t\t\t\t\tparams.mainSignerOverride ?? user.getUserAccount().authority;\n\t\t\t\tconst userTokenAccount = await getTokenAddressForDepositAndWithdraw(\n\t\t\t\t\tspotMarketAccount,\n\t\t\t\t\twithdrawToAuthority\n\t\t\t\t);\n\n\t\t\t\tconst withdrawAmount =\n\t\t\t\t\tparams.estimatedWithdrawAmount ??\n\t\t\t\t\tthis._driftClient.getIsolatedPerpPositionTokenAmount(\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tsubAccountId\n\t\t\t\t\t);\n\t\t\t\tconst withdrawIxs =\n\t\t\t\t\tawait this._driftClient.getWithdrawFromIsolatedPerpPositionIxsBundle(\n\t\t\t\t\t\twithdrawAmount,\n\t\t\t\t\t\tparams.marketIndex,\n\t\t\t\t\t\tsubAccountId,\n\t\t\t\t\t\tuserTokenAccount\n\t\t\t\t\t);\n\n\t\t\t\tconst ixs = [...closeIxs, ...withdrawIxs];\n\t\t\t\treturn this._driftClient.buildTransaction(\n\t\t\t\t\tixs,\n\t\t\t\t\tparams.txParams ?? this.getTxParams()\n\t\t\t\t);\n\t\t\t},\n\t\t\tparams.mainSignerOverride\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to edit an existing order\n\t */\n\tpublic async getEditOrderTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderId: number,\n\t\teditOrderParams: {\n\t\t\tnewDirection?: PositionDirection;\n\t\t\tnewBaseAmount?: BN;\n\t\t\tnewLimitPrice?: BN;\n\t\t\tnewOraclePriceOffset?: number;\n\t\t\tnewTriggerPrice?: BN;\n\t\t\tnewTriggerCondition?: OrderTriggerCondition;\n\t\t\tauctionDuration?: number;\n\t\t\tauctionStartPrice?: BN;\n\t\t\tauctionEndPrice?: BN;\n\t\t\treduceOnly?: boolean;\n\t\t\tpostOnly?: boolean;\n\t\t\tbitFlags?: number;\n\t\t\tmaxTs?: BN;\n\t\t\tpolicy?: number;\n\t\t\tpositionMaxLeverage?: number;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst editOrderTxn = await createEditOrderTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderId,\n\t\t\t\t\teditOrderParams,\n\t\t\t\t});\n\n\t\t\t\treturn editOrderTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel specific orders by their IDs\n\t */\n\tpublic async getCancelOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\torderIds: number[]\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst cancelOrdersTxn = await createCancelOrdersTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\torderIds,\n\t\t\t\t});\n\n\t\t\t\treturn cancelOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to cancel all orders for a user\n\t */\n\tpublic async getCancelAllOrdersTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tmarketType?: MarketType,\n\t\tmarketIndex?: number,\n\t\tdirection?: PositionDirection\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst ix = await this._driftClient.getCancelOrdersIx(\n\t\t\t\t\tmarketType ?? null,\n\t\t\t\t\tmarketIndex ?? null,\n\t\t\t\t\tdirection ?? null,\n\t\t\t\t\tuser.getUserAccount().subAccountId\n\t\t\t\t);\n\n\t\t\t\tconst cancelAllOrdersTxn = await this._driftClient.buildTransaction(ix);\n\n\t\t\t\treturn cancelAllOrdersTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a swap transaction between two spot markets using Jupiter\n\t */\n\tpublic async getSwapTxn(\n\t\tuserAccountPublicKey: PublicKey,\n\t\tfromMarketIndex: number,\n\t\ttoMarketIndex: number,\n\t\tamount: BN,\n\t\toptions?: {\n\t\t\tslippageBps?: number;\n\t\t\tswapMode?: SwapMode;\n\t\t\tonlyDirectRoutes?: boolean;\n\t\t\tquote?: UnifiedQuoteResponse;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.driftClientContextWrapper(\n\t\t\tuserAccountPublicKey,\n\t\t\tasync (user) => {\n\t\t\t\tconst fromSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === fromMarketIndex\n\t\t\t\t);\n\t\t\t\tconst toSpotMarketConfig = this._spotMarketConfigs.find(\n\t\t\t\t\t(market) => market.marketIndex === toMarketIndex\n\t\t\t\t);\n\n\t\t\t\tif (!fromSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`From spot market config not found for index ${fromMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!toSpotMarketConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`To spot market config not found for index ${toMarketIndex}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst swapClient = new UnifiedSwapClient({\n\t\t\t\t\tclientType: 'jupiter',\n\t\t\t\t\tconnection: this._driftClient.connection,\n\t\t\t\t});\n\n\t\t\t\t// Get quote if not provided\n\t\t\t\tlet quote = options?.quote;\n\t\t\t\tif (!quote) {\n\t\t\t\t\tquote = await swapClient.getQuote({\n\t\t\t\t\t\tinputMint: fromSpotMarketConfig.mint,\n\t\t\t\t\t\toutputMint: toSpotMarketConfig.mint,\n\t\t\t\t\t\tamount,\n\t\t\t\t\t\tslippageBps: options?.slippageBps ?? 10, // Default 0.1%\n\t\t\t\t\t\tswapMode: options?.swapMode ?? 'ExactIn',\n\t\t\t\t\t\tonlyDirectRoutes: options?.onlyDirectRoutes ?? false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst swapTxn = await createSwapTxn({\n\t\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\t\tswapClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tswapFromMarketIndex: fromMarketIndex,\n\t\t\t\t\tswapToMarketIndex: toMarketIndex,\n\t\t\t\t\tamount,\n\t\t\t\t\tquote,\n\t\t\t\t\ttxParams: {\n\t\t\t\t\t\tuseSimulatedComputeUnits: true,\n\t\t\t\t\t\tcomputeUnitsBufferMultiplier: 1.5,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn swapTxn;\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to initialize a RevenueShareEscrow account for a user.\n\t * Optionally bundles an initial builder approval in the same transaction.\n\t */\n\tpublic async getCreateRevenueShareEscrowTxn(\n\t\tauthority: PublicKey,\n\t\toptions?: {\n\t\t\tnumOrders?: number;\n\t\t\tbuilder?: {\n\t\t\t\tbuilderAuthority: PublicKey;\n\t\t\t\tmaxFeeTenthBps: number;\n\t\t\t};\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.authorityContextWrapper(authority, () =>\n\t\t\tcreateRevenueShareEscrowTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tauthority,\n\t\t\t\tnumOrders: options?.numOrders ?? 16,\n\t\t\t\tbuilder: options?.builder,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to initialize a RevenueShare account for a builder.\n\t * This must be initialized before a builder can receive builder fees.\n\t */\n\tpublic async getCreateRevenueShareAccountTxn(\n\t\tauthority: PublicKey,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.authorityContextWrapper(authority, () =>\n\t\t\tcreateRevenueShareAccountTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tauthority,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Create a transaction to configure a builder's approval status and fee cap.\n\t * Handles approve, update, and revoke operations.\n\t * Set maxFeeTenthBps to 0 to revoke a builder.\n\t */\n\tpublic async getConfigureApprovedBuilderTxn(\n\t\tauthority: PublicKey,\n\t\tbuilderAuthority: PublicKey,\n\t\tmaxFeeTenthBps: number,\n\t\toptions?: {\n\t\t\ttxParams?: TxParams;\n\t\t}\n\t): Promise<VersionedTransaction | Transaction> {\n\t\treturn this.authorityContextWrapper(authority, () =>\n\t\t\tconfigureBuilderTxn({\n\t\t\t\tdriftClient: this._driftClient,\n\t\t\t\tauthority,\n\t\t\t\tbuilderAuthority,\n\t\t\t\tmaxFeeTenthBps,\n\t\t\t\ttxParams: options?.txParams ?? this.getTxParams(),\n\t\t\t})\n\t\t);\n\t}\n\n\tpublic async sendSignedTransaction(tx: VersionedTransaction | Transaction) {\n\t\treturn this._driftClient.sendTransaction(tx, undefined, undefined, true);\n\t}\n}\n"]}
|
|
@@ -1,30 +1,23 @@
|
|
|
1
|
-
import { DriftClient,
|
|
1
|
+
import { DriftClient, TxParams, User, UserStatsAccount } from '@drift-labs/sdk';
|
|
2
2
|
/**
|
|
3
3
|
* Parameters required for deleting a user instruction
|
|
4
4
|
*/
|
|
5
|
-
interface
|
|
5
|
+
interface DeleteUserIxsParams {
|
|
6
6
|
/** The Drift protocol client instance */
|
|
7
7
|
driftClient: DriftClient;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
user: User;
|
|
9
|
+
userStatsAccount: UserStatsAccount;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Creates
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const deleteIx = await deleteUserIx({
|
|
17
|
-
* driftClient: driftClient,
|
|
18
|
-
* user: userClient
|
|
19
|
-
* });
|
|
20
|
-
* ```
|
|
12
|
+
* Creates user deletion instructions. If the account is a fresh non-idle account,
|
|
13
|
+
* includes an idle instruction before the deletion instruction.
|
|
21
14
|
*/
|
|
22
|
-
export declare const
|
|
15
|
+
export declare const deleteUserIxs: ({ driftClient, user, userStatsAccount, }: DeleteUserIxsParams) => Promise<import("@solana/web3.js").TransactionInstruction[]>;
|
|
23
16
|
/**
|
|
24
17
|
* Parameters required for creating a user deletion transaction
|
|
25
18
|
* Extends DeleteUserIxParams with optional transaction parameters
|
|
26
19
|
*/
|
|
27
|
-
interface DeleteUserTxnParams extends
|
|
20
|
+
interface DeleteUserTxnParams extends DeleteUserIxsParams {
|
|
28
21
|
/** Optional transaction parameters for customizing the transaction */
|
|
29
22
|
txParams?: TxParams;
|
|
30
23
|
}
|
|
@@ -43,5 +36,5 @@ interface DeleteUserTxnParams extends DeleteUserIxParams {
|
|
|
43
36
|
* const signature = await driftClient.sendTransaction(deleteTxn);
|
|
44
37
|
* ```
|
|
45
38
|
*/
|
|
46
|
-
export declare const deleteUserTxn: ({ driftClient,
|
|
39
|
+
export declare const deleteUserTxn: ({ driftClient, user, userStatsAccount, txParams, }: DeleteUserTxnParams) => Promise<import("@solana/web3.js").Transaction | import("@solana/web3.js").VersionedTransaction>;
|
|
47
40
|
export {};
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deleteUserTxn = exports.
|
|
3
|
+
exports.deleteUserTxn = exports.deleteUserIxs = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* Creates
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* const deleteIx = await deleteUserIx({
|
|
10
|
-
* driftClient: driftClient,
|
|
11
|
-
* user: userClient
|
|
12
|
-
* });
|
|
13
|
-
* ```
|
|
5
|
+
* Creates user deletion instructions. If the account is a fresh non-idle account,
|
|
6
|
+
* includes an idle instruction before the deletion instruction.
|
|
14
7
|
*/
|
|
15
|
-
const
|
|
16
|
-
|
|
8
|
+
const deleteUserIxs = async ({ driftClient, user, userStatsAccount, }) => {
|
|
9
|
+
const { canDelete, reason } = user.canBeDeleted(userStatsAccount);
|
|
10
|
+
const userPublicKey = user.userAccountPublicKey;
|
|
11
|
+
if (canDelete) {
|
|
12
|
+
return [await driftClient.getUserDeletionIx(userPublicKey)];
|
|
13
|
+
}
|
|
14
|
+
if (reason === 'is-not-idle-fresh-account') {
|
|
15
|
+
const [idleIx, deleteIx] = await Promise.all([
|
|
16
|
+
driftClient.getUpdateUserIdleIx(userPublicKey, user.getUserAccount()),
|
|
17
|
+
driftClient.getUserDeletionIx(userPublicKey),
|
|
18
|
+
]);
|
|
19
|
+
return [idleIx, deleteIx];
|
|
20
|
+
}
|
|
21
|
+
throw new Error(reason);
|
|
17
22
|
};
|
|
18
|
-
exports.
|
|
23
|
+
exports.deleteUserIxs = deleteUserIxs;
|
|
19
24
|
/**
|
|
20
25
|
* Creates a user deletion transaction.
|
|
21
26
|
*
|
|
@@ -31,8 +36,8 @@ exports.deleteUserIx = deleteUserIx;
|
|
|
31
36
|
* const signature = await driftClient.sendTransaction(deleteTxn);
|
|
32
37
|
* ```
|
|
33
38
|
*/
|
|
34
|
-
const deleteUserTxn = async ({ driftClient,
|
|
35
|
-
const deleteIx = await (0, exports.
|
|
39
|
+
const deleteUserTxn = async ({ driftClient, user, userStatsAccount, txParams, }) => {
|
|
40
|
+
const deleteIx = await (0, exports.deleteUserIxs)({ driftClient, user, userStatsAccount });
|
|
36
41
|
return driftClient.buildTransaction(deleteIx, txParams);
|
|
37
42
|
};
|
|
38
43
|
exports.deleteUserTxn = deleteUserTxn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../../src/drift/base/actions/user/delete.ts"],"names":[],"mappings":";;;AAYA
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../../src/drift/base/actions/user/delete.ts"],"names":[],"mappings":";;;AAYA;;;GAGG;AACI,MAAM,aAAa,GAAG,KAAK,EAAE,EACnC,WAAW,EACX,IAAI,EACJ,gBAAgB,GACK,EAAE,EAAE;IACzB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAElE,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAEhD,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,WAAW,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,MAAM,KAAK,2BAA2B,EAAE,CAAC;QAC5C,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC5C,WAAW,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;YACrE,WAAW,CAAC,iBAAiB,CAAC,aAAa,CAAC;SAC5C,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC,CAAC;AAtBW,QAAA,aAAa,iBAsBxB;AAWF;;;;;;;;;;;;;;GAcG;AACI,MAAM,aAAa,GAAG,KAAK,EAAE,EACnC,WAAW,EACX,IAAI,EACJ,gBAAgB,EAChB,QAAQ,GACa,EAAE,EAAE;IACzB,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC9E,OAAO,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC,CAAC;AARW,QAAA,aAAa,iBAQxB","sourcesContent":["import { DriftClient, TxParams, User, UserStatsAccount } from '@drift-labs/sdk';\n\n/**\n * Parameters required for deleting a user instruction\n */\ninterface DeleteUserIxsParams {\n\t/** The Drift protocol client instance */\n\tdriftClient: DriftClient;\n\tuser: User;\n\tuserStatsAccount: UserStatsAccount;\n}\n\n/**\n * Creates user deletion instructions. If the account is a fresh non-idle account,\n * includes an idle instruction before the deletion instruction.\n */\nexport const deleteUserIxs = async ({\n\tdriftClient,\n\tuser,\n\tuserStatsAccount,\n}: DeleteUserIxsParams) => {\n\tconst { canDelete, reason } = user.canBeDeleted(userStatsAccount);\n\n\tconst userPublicKey = user.userAccountPublicKey;\n\n\tif (canDelete) {\n\t\treturn [await driftClient.getUserDeletionIx(userPublicKey)];\n\t}\n\n\tif (reason === 'is-not-idle-fresh-account') {\n\t\tconst [idleIx, deleteIx] = await Promise.all([\n\t\t\tdriftClient.getUpdateUserIdleIx(userPublicKey, user.getUserAccount()),\n\t\t\tdriftClient.getUserDeletionIx(userPublicKey),\n\t\t]);\n\t\treturn [idleIx, deleteIx];\n\t}\n\n\tthrow new Error(reason);\n};\n\n/**\n * Parameters required for creating a user deletion transaction\n * Extends DeleteUserIxParams with optional transaction parameters\n */\ninterface DeleteUserTxnParams extends DeleteUserIxsParams {\n\t/** Optional transaction parameters for customizing the transaction */\n\ttxParams?: TxParams;\n}\n\n/**\n * Creates a user deletion transaction.\n *\n * @example\n * ```typescript\n * const deleteTxn = await deleteUserTxn({\n * driftClient: driftClient,\n * user: userClient,\n * txParams: { useSimulatedComputeUnits: true }\n * });\n *\n * // Sign and send the transaction\n * const signature = await driftClient.sendTransaction(deleteTxn);\n * ```\n */\nexport const deleteUserTxn = async ({\n\tdriftClient,\n\tuser,\n\tuserStatsAccount,\n\ttxParams,\n}: DeleteUserTxnParams) => {\n\tconst deleteIx = await deleteUserIxs({ driftClient, user, userStatsAccount });\n\treturn driftClient.buildTransaction(deleteIx, txParams);\n};\n"]}
|
|
@@ -15,4 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./create"), exports);
|
|
18
|
+
__exportStar(require("./delete"), exports);
|
|
19
|
+
__exportStar(require("./update-username"), exports);
|
|
18
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/base/actions/user/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB","sourcesContent":["export * from './create';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/drift/base/actions/user/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,oDAAkC","sourcesContent":["export * from './create';\nexport * from './delete';\nexport * from './update-username';\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DriftClient, PublicKey, TxParams } from '@drift-labs/sdk';
|
|
2
|
+
interface UpdateUserNameIxParams {
|
|
3
|
+
driftClient: DriftClient;
|
|
4
|
+
newName: string;
|
|
5
|
+
userAccountPublicKey: PublicKey;
|
|
6
|
+
subAccountId: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const updateUserNameIx: ({ driftClient, newName, userAccountPublicKey, subAccountId, }: UpdateUserNameIxParams) => Promise<import("@solana/web3.js").TransactionInstruction>;
|
|
9
|
+
interface UpdateUserNameTxnParams extends UpdateUserNameIxParams {
|
|
10
|
+
txParams?: TxParams;
|
|
11
|
+
}
|
|
12
|
+
export declare const updateUserNameTxn: ({ driftClient, newName, userAccountPublicKey, subAccountId, txParams, }: UpdateUserNameTxnParams) => Promise<import("@solana/web3.js").Transaction | import("@solana/web3.js").VersionedTransaction>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateUserNameTxn = exports.updateUserNameIx = void 0;
|
|
4
|
+
const sdk_1 = require("@drift-labs/sdk");
|
|
5
|
+
const updateUserNameIx = async ({ driftClient, newName, userAccountPublicKey, subAccountId, }) => {
|
|
6
|
+
const nameBuffer = (0, sdk_1.encodeName)(newName);
|
|
7
|
+
const ix = await driftClient.program.instruction.updateUserName(subAccountId, nameBuffer, {
|
|
8
|
+
accounts: {
|
|
9
|
+
user: userAccountPublicKey,
|
|
10
|
+
authority: driftClient.wallet.publicKey,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
return ix;
|
|
14
|
+
};
|
|
15
|
+
exports.updateUserNameIx = updateUserNameIx;
|
|
16
|
+
const updateUserNameTxn = async ({ driftClient, newName, userAccountPublicKey, subAccountId, txParams, }) => {
|
|
17
|
+
const ix = await (0, exports.updateUserNameIx)({
|
|
18
|
+
driftClient,
|
|
19
|
+
newName,
|
|
20
|
+
userAccountPublicKey,
|
|
21
|
+
subAccountId,
|
|
22
|
+
});
|
|
23
|
+
return driftClient.buildTransaction(ix, txParams);
|
|
24
|
+
};
|
|
25
|
+
exports.updateUserNameTxn = updateUserNameTxn;
|
|
26
|
+
//# sourceMappingURL=update-username.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-username.js","sourceRoot":"","sources":["../../../../../src/drift/base/actions/user/update-username.ts"],"names":[],"mappings":";;;AAAA,yCAA+E;AASxE,MAAM,gBAAgB,GAAG,KAAK,EAAE,EACtC,WAAW,EACX,OAAO,EACP,oBAAoB,EACpB,YAAY,GACY,EAAE,EAAE;IAC5B,MAAM,UAAU,GAAG,IAAA,gBAAU,EAAC,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAC9D,YAAY,EACZ,UAAU,EACV;QACC,QAAQ,EAAE;YACT,IAAI,EAAE,oBAAoB;YAC1B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,SAAS;SACvC;KACD,CACD,CAAC;IACF,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AAlBW,QAAA,gBAAgB,oBAkB3B;AAMK,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACvC,WAAW,EACX,OAAO,EACP,oBAAoB,EACpB,YAAY,EACZ,QAAQ,GACiB,EAAE,EAAE;IAC7B,MAAM,EAAE,GAAG,MAAM,IAAA,wBAAgB,EAAC;QACjC,WAAW;QACX,OAAO;QACP,oBAAoB;QACpB,YAAY;KACZ,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B","sourcesContent":["import { DriftClient, encodeName, PublicKey, TxParams } from '@drift-labs/sdk';\n\ninterface UpdateUserNameIxParams {\n\tdriftClient: DriftClient;\n\tnewName: string;\n\tuserAccountPublicKey: PublicKey;\n\tsubAccountId: number;\n}\n\nexport const updateUserNameIx = async ({\n\tdriftClient,\n\tnewName,\n\tuserAccountPublicKey,\n\tsubAccountId,\n}: UpdateUserNameIxParams) => {\n\tconst nameBuffer = encodeName(newName);\n\tconst ix = await driftClient.program.instruction.updateUserName(\n\t\tsubAccountId,\n\t\tnameBuffer,\n\t\t{\n\t\t\taccounts: {\n\t\t\t\tuser: userAccountPublicKey,\n\t\t\t\tauthority: driftClient.wallet.publicKey,\n\t\t\t},\n\t\t}\n\t);\n\treturn ix;\n};\n\ninterface UpdateUserNameTxnParams extends UpdateUserNameIxParams {\n\ttxParams?: TxParams;\n}\n\nexport const updateUserNameTxn = async ({\n\tdriftClient,\n\tnewName,\n\tuserAccountPublicKey,\n\tsubAccountId,\n\ttxParams,\n}: UpdateUserNameTxnParams) => {\n\tconst ix = await updateUserNameIx({\n\t\tdriftClient,\n\t\tnewName,\n\t\tuserAccountPublicKey,\n\t\tsubAccountId,\n\t});\n\treturn driftClient.buildTransaction(ix, txParams);\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drift-labs/common",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.51",
|
|
4
4
|
"description": "Common functions for Drift",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
],
|
|
21
21
|
"author": "Drift Labs",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@drift-labs/sdk": "^2.
|
|
23
|
+
"@drift-labs/sdk": "^2.159.0-beta.2",
|
|
24
24
|
"@slack/web-api": "6.4.0",
|
|
25
25
|
"@solana/spl-token": "^0.4.14",
|
|
26
26
|
"@solana/web3.js": "1.98.0",
|