@drift-labs/common 1.0.18 → 1.0.20
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/actionHelpers.d.ts +9 -9
- package/lib/common-ui-utils/commonUiUtils.d.ts +4 -1
- package/lib/common-ui-utils/commonUiUtils.js.map +1 -1
- package/lib/common-ui-utils/user.js +3 -1
- package/lib/common-ui-utils/user.js.map +1 -1
- package/lib/constants/predictionMarket.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +10 -10
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +4 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +2 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -1
- package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +5 -0
- package/lib/drift/Drift/clients/CentralServerDrift/index.js +9 -3
- package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/index.d.ts +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.js +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.d.ts +34 -0
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.js +45 -0
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +8 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +8 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +8 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +6 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +5 -3
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/types.d.ts +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/types.js.map +1 -1
- package/lib/drift/base/actions/user/create.d.ts +9 -2
- package/lib/drift/base/actions/user/create.js +10 -6
- package/lib/drift/base/actions/user/create.js.map +1 -1
- package/lib/drift/base/details/user/balances.d.ts +1 -1
- package/lib/drift/base/details/user/positions.d.ts +1 -1
- package/lib/drift/cli.js +28 -6
- package/lib/drift/cli.js.map +1 -1
- package/lib/drift/utils/funding.d.ts +0 -1
- package/lib/serializableTypes.d.ts +10 -0
- package/lib/serializableTypes.js +317 -217
- package/lib/serializableTypes.js.map +1 -1
- package/lib/types/UIMarket.d.ts +2 -2
- package/lib/utils/NumLib.d.ts +4 -4
- package/lib/utils/ResultSlotIncrementer.d.ts +4 -0
- package/lib/utils/ResultSlotIncrementer.js +8 -0
- package/lib/utils/ResultSlotIncrementer.js.map +1 -1
- package/lib/utils/index.d.ts +2 -2
- package/lib/utils/math.d.ts +3 -3
- package/package.json +8 -5
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export declare const ACTION_HELPERS: {
|
|
2
2
|
ACCOUNT_DELETION_HELPERS: {
|
|
3
|
-
accountHasOpenOrders: (user: import("
|
|
4
|
-
accountHasOpenPerpPositions: (user: import("
|
|
5
|
-
accountHasOpenSpotPositions: (user: import("
|
|
6
|
-
getAccountDeletionStepsToTake: (user: import("
|
|
7
|
-
getAccountCanBeDeletedInstantly: (user: import("
|
|
8
|
-
getStatsAccountIsPastDeletionCutoff: (userStatsAccount: import("
|
|
9
|
-
tryDeleteUserAccount: (driftClient: import("
|
|
10
|
-
getIdleWaitTimeMinutes: (user: import("
|
|
11
|
-
getStatsAccountDeletionWaitTime: (userStatsAccount: import("
|
|
3
|
+
accountHasOpenOrders: (user: import("@drift-labs/sdk").User) => boolean;
|
|
4
|
+
accountHasOpenPerpPositions: (user: import("@drift-labs/sdk").User) => boolean;
|
|
5
|
+
accountHasOpenSpotPositions: (user: import("@drift-labs/sdk").User) => boolean;
|
|
6
|
+
getAccountDeletionStepsToTake: (user: import("@drift-labs/sdk").User, userStatsAccount: import("@drift-labs/sdk").UserStatsAccount, currentSlot: number) => ("askToCloseAllPositionsOrdersBorrows" | "sendAccountDeletionIx" | "sendBalanceWithdrawalIx" | "sendTriggerAccountIdleIx" | "askToWait")[];
|
|
7
|
+
getAccountCanBeDeletedInstantly: (user: import("@drift-labs/sdk").User, userStatsAccount: import("@drift-labs/sdk").UserStatsAccount, currentSlot: number) => "no" | "yes" | "no-wait-for-idle" | "yes-after-making-idle";
|
|
8
|
+
getStatsAccountIsPastDeletionCutoff: (userStatsAccount: import("@drift-labs/sdk").UserStatsAccount) => boolean;
|
|
9
|
+
tryDeleteUserAccount: (driftClient: import("@drift-labs/sdk").DriftClient, user: import("@drift-labs/sdk").User, userStatsAccount: import("@drift-labs/sdk").UserStatsAccount, latestSlot: number) => Promise<string>;
|
|
10
|
+
getIdleWaitTimeMinutes: (user: import("@drift-labs/sdk").User, currentSlot: number) => number;
|
|
11
|
+
getStatsAccountDeletionWaitTime: (userStatsAccount: import("@drift-labs/sdk").UserStatsAccount) => number;
|
|
12
12
|
};
|
|
13
13
|
};
|
|
@@ -90,7 +90,7 @@ export declare const COMMON_UI_UTILS: {
|
|
|
90
90
|
getMarketStepSize: (driftClient: DriftClient, marketId: import("src/types").MarketId) => BN;
|
|
91
91
|
getMarketStepSizeDecimals: (driftClient: DriftClient, marketId: import("src/types").MarketId) => number;
|
|
92
92
|
isEntirePositionOrder: (orderAmount: BigNum) => boolean;
|
|
93
|
-
getMarginUsedForPosition: (user: User, marketIndex: number, includeOpenOrders?: boolean) =>
|
|
93
|
+
getMarginUsedForPosition: (user: User, marketIndex: number, includeOpenOrders?: boolean) => any;
|
|
94
94
|
validateLeverageChange: ({ user, marketIndex, newLeverage, }: {
|
|
95
95
|
user: User;
|
|
96
96
|
marketIndex: number;
|
|
@@ -161,6 +161,9 @@ export declare const COMMON_UI_UTILS: {
|
|
|
161
161
|
getIdAndAuthorityFromKey: (key: string) => {
|
|
162
162
|
userId: number;
|
|
163
163
|
userAuthority: PublicKey;
|
|
164
|
+
} | {
|
|
165
|
+
userId: undefined;
|
|
166
|
+
userAuthority: undefined;
|
|
164
167
|
};
|
|
165
168
|
getLimitAuctionParams: ({ direction, inputPrice, startPriceFromSettings, duration, auctionStartPriceOffset, oraclePriceBands, }: {
|
|
166
169
|
direction: PositionDirection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commonUiUtils.js","sourceRoot":"","sources":["../../src/common-ui-utils/commonUiUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tAMM_RESERVE_PRECISION_EXP,\n\tAMM_TO_QUOTE_PRECISION_RATIO,\n\tBASE_PRECISION_EXP,\n\tBN,\n\tBigNum,\n\tDriftClient,\n\tIWalletV2,\n\tMarketType,\n\tOptionalOrderParams,\n\tOrderType,\n\tPRICE_PRECISION,\n\tPRICE_PRECISION_EXP,\n\tPositionDirection,\n\tPublicKey,\n\tQUOTE_PRECISION_EXP,\n\tSpotMarketConfig,\n\tUser,\n\tUserAccount,\n\tZERO,\n\tderiveOracleAuctionParams,\n\tgetMarketOrderParams,\n\tisVariant,\n} from '@drift-labs/sdk';\nimport { ENUM_UTILS, sleep } from '../utils';\nimport {\n\tAccountInfo,\n\tConnection,\n\tKeypair,\n\tParsedAccountData,\n} from '@solana/web3.js';\nimport bcrypt from 'bcryptjs-react';\nimport nacl, { sign } from 'tweetnacl';\nimport { getAssociatedTokenAddress } from '@solana/spl-token';\nimport { AuctionParams, TradeOffsetPrice } from 'src/types';\nimport { USER_UTILS } from './user';\nimport { TRADING_UTILS } from './trading';\nimport { MARKET_UTILS } from './market';\nimport { ORDER_COMMON_UTILS } from './order';\nimport { EMPTY_AUCTION_PARAMS } from '../constants/trade';\n\n// Cache for common UI string patterns to reduce memory allocation\nconst uiStringCache = new Map<string, string>();\nconst MAX_UI_STRING_CACHE_SIZE = 2000;\n\n// Helper function to cache common string patterns\nfunction getCachedUiString(\n\tpattern: string,\n\t...values: (string | number)[]\n): string {\n\tconst cacheKey = `${pattern}:${values.join(':')}`;\n\n\tif (uiStringCache.has(cacheKey)) {\n\t\treturn uiStringCache.get(cacheKey)!;\n\t}\n\n\tlet result: string;\n\tswitch (pattern) {\n\t\tcase 'abbreviate': {\n\t\t\tconst [authString, length] = values as [string, number];\n\t\t\tresult = `${authString.slice(0, length)}...${authString.slice(-length)}`;\n\t\t\tbreak;\n\t\t}\n\t\tcase 'userKey': {\n\t\t\tconst [userId, authority] = values as [number, string];\n\t\t\tresult = `${userId}_${authority}`;\n\t\t\tbreak;\n\t\t}\n\t\tcase 'marketKey': {\n\t\t\tconst [marketType, marketIndex] = values as [string, number];\n\t\t\tresult = `${marketType}_${marketIndex}`;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tresult = values.join('_');\n\t}\n\n\t// Cache if not too large\n\tif (uiStringCache.size < MAX_UI_STRING_CACHE_SIZE) {\n\t\tuiStringCache.set(cacheKey, result);\n\t}\n\n\treturn result;\n}\n\n// When creating an account, try 5 times over 5 seconds to wait for the new account to hit the blockchain.\nconst ACCOUNT_INITIALIZATION_RETRY_DELAY_MS = 1000;\nconst ACCOUNT_INITIALIZATION_RETRY_ATTEMPTS = 5;\n\nconst abbreviateAddress = (address: string | PublicKey, length = 4) => {\n\tif (!address) return '';\n\tconst authString = address.toString();\n\treturn getCachedUiString('abbreviate', authString, length);\n};\n\n/**\n * Get a unique key for an authority's subaccount\n * @param userId\n * @param authority\n * @returns\n */\nconst getUserKey = (userId: number, authority: PublicKey) => {\n\tif (userId == undefined || !authority) return '';\n\treturn getCachedUiString('userKey', userId, authority.toString());\n};\n\n/**\n * Get the authority and subAccountId from a user's account key\n * @param key\n * @returns\n */\nconst getIdAndAuthorityFromKey = (\n\tkey: string\n): { userId: number; userAuthority: PublicKey } => {\n\tconst splitKey = key?.split('_');\n\n\tif (!splitKey || splitKey.length !== 2)\n\t\treturn { userId: undefined, userAuthority: undefined };\n\n\treturn {\n\t\tuserId: Number(splitKey[0]),\n\t\tuserAuthority: new PublicKey(splitKey[1]),\n\t};\n};\n\nconst fetchCurrentSubaccounts = (driftClient: DriftClient): UserAccount[] => {\n\treturn driftClient.getUsers().map((user) => user.getUserAccount());\n};\n\nconst fetchUserClientsAndAccounts = (\n\tdriftClient: DriftClient\n): { user: User; userAccount: UserAccount }[] => {\n\tconst accounts = fetchCurrentSubaccounts(driftClient);\n\tconst allUsersAndUserAccounts = accounts.map((acct) => {\n\t\treturn {\n\t\t\tuser: driftClient.getUser(acct.subAccountId, acct.authority),\n\t\t\tuserAccount: acct,\n\t\t};\n\t});\n\n\treturn allUsersAndUserAccounts;\n};\n\nconst awaitAccountInitializationChainState = async (\n\tdriftClient: DriftClient,\n\tuserId: number,\n\tauthority: PublicKey\n) => {\n\tconst user = driftClient.getUser(userId, authority);\n\n\tif (!user.isSubscribed) {\n\t\tawait user.subscribe();\n\t}\n\n\tlet retryCount = 0;\n\n\tdo {\n\t\ttry {\n\t\t\tawait updateUserAccount(user);\n\t\t\tif (user?.getUserAccountAndSlot()?.data !== undefined) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tretryCount++;\n\t\t\tawait sleep(ACCOUNT_INITIALIZATION_RETRY_DELAY_MS);\n\t\t}\n\t} while (retryCount < ACCOUNT_INITIALIZATION_RETRY_ATTEMPTS);\n\n\tthrow new Error('awaitAccountInitializationFailed');\n};\n\n/**\n * Using your own callback to do the account initialization, this method will run the initialization step, switch to the drift user, await for the account to be available on chain, subscribe to the user account, and switch to the user account using the drift client.\n *\n * It provides extra callbacks to handle steps directly after the initialiation tx, and after fully initializing+subscribing to the account.\n *\n * Callbacks available:\n * - initializationStep: This callback should send the transaction to initialize the user account\n * - postInitializationStep: This callback will run after the successful initialization transaction, but before trying to load/subscribe to the new account\n * - handleSuccessStep: This callback will run after everything has initialized+subscribed successfully\n *\n * // TODO : Need to do the subscription step\n */\nconst initializeAndSubscribeToNewUserAccount = async (\n\tdriftClient: DriftClient,\n\tuserIdToInit: number,\n\tauthority: PublicKey,\n\tcallbacks: {\n\t\tinitializationStep: () => Promise<boolean>;\n\t\tpostInitializationStep?: () => Promise<boolean>;\n\t\thandleSuccessStep?: (accountAlreadyExisted: boolean) => Promise<boolean>;\n\t}\n): Promise<\n\t| 'ok'\n\t| 'failed_initializationStep'\n\t| 'failed_postInitializationStep'\n\t| 'failed_awaitAccountInitializationChainState'\n\t| 'failed_handleSuccessStep'\n> => {\n\tawait driftClient.addUser(userIdToInit, authority);\n\n\tconst accountAlreadyExisted = await driftClient\n\t\t.getUser(userIdToInit)\n\t\t?.exists();\n\n\t// Do the account initialization step\n\tlet result = await callbacks.initializationStep();\n\n\t// Fetch account to make sure it's loaded\n\tawait updateUserAccount(driftClient.getUser(userIdToInit));\n\n\tif (!result) {\n\t\treturn 'failed_initializationStep';\n\t}\n\n\t// Do the post-initialization step\n\tresult = callbacks.postInitializationStep\n\t\t? await callbacks.postInitializationStep()\n\t\t: result;\n\n\tif (!result) {\n\t\treturn 'failed_postInitializationStep';\n\t}\n\n\t// Await the account initialization step to update the blockchain\n\tresult = await awaitAccountInitializationChainState(\n\t\tdriftClient,\n\t\tuserIdToInit,\n\t\tauthority\n\t);\n\n\tif (!result) {\n\t\treturn 'failed_awaitAccountInitializationChainState';\n\t}\n\n\tawait driftClient.switchActiveUser(userIdToInit, authority);\n\n\t// Do the subscription step\n\n\t// Run the success handler\n\tresult = callbacks.handleSuccessStep\n\t\t? await callbacks.handleSuccessStep(accountAlreadyExisted)\n\t\t: result;\n\n\tif (!result) {\n\t\treturn 'failed_handleSuccessStep';\n\t}\n\n\treturn 'ok';\n};\n\nasync function updateUserAccount(user: User): Promise<void> {\n\tconst publicKey = user.userAccountPublicKey;\n\ttry {\n\t\tconst dataAndContext =\n\t\t\tawait user.driftClient.program.account.user.fetchAndContext(\n\t\t\t\tpublicKey,\n\t\t\t\t'processed'\n\t\t\t);\n\t\tuser.accountSubscriber.updateData(\n\t\t\tdataAndContext.data as UserAccount,\n\t\t\tdataAndContext.context.slot\n\t\t);\n\t} catch (e) {\n\t\t// noop\n\t}\n}\n\nconst getMarketKey = (marketIndex: number, marketType: MarketType) =>\n\tgetCachedUiString('marketKey', ENUM_UTILS.toStr(marketType), marketIndex);\n\n/**\n * Creates an IWallet wrapper, with redundant methods. If a `walletPubKey` is passed in,\n * the `publicKey` will be based on that.\n */\nconst createPlaceholderIWallet = (walletPubKey?: PublicKey) => {\n\tconst newKeypair = walletPubKey\n\t\t? new Keypair({\n\t\t\t\tpublicKey: walletPubKey.toBytes(),\n\t\t\t\tsecretKey: new Keypair().publicKey.toBytes(),\n\t\t })\n\t\t: new Keypair();\n\n\tconst newWallet: IWalletV2 = {\n\t\tpublicKey: newKeypair.publicKey,\n\t\t//@ts-ignore\n\t\tsignTransaction: () => {\n\t\t\treturn Promise.resolve();\n\t\t},\n\t\t//@ts-ignore\n\t\tsignAllTransactions: () => {\n\t\t\treturn Promise.resolve();\n\t\t},\n\t\t//@ts-ignore\n\t\tsignMessage: () => {\n\t\t\treturn Promise.resolve();\n\t\t},\n\t};\n\n\treturn newWallet;\n};\n\nconst getSignatureVerificationMessageForSettings = (\n\tauthority: PublicKey,\n\tsignTs: number\n): Uint8Array => {\n\treturn new TextEncoder().encode(\n\t\t`Verify you are the owner of this wallet to update trade settings: \\n${authority.toBase58()}\\n\\nThis signature will be valid for the next 30 minutes.\\n\\nTS: ${signTs.toString()}`\n\t);\n};\n\nconst verifySignature = (\n\tsignature: Uint8Array,\n\tmessage: Uint8Array,\n\tpubKey: PublicKey\n): boolean => {\n\treturn sign.detached.verify(message, signature, pubKey.toBytes());\n};\n\nconst hashSignature = async (signature: string): Promise<string> => {\n\tbcrypt.setRandomFallback((num: number) => {\n\t\treturn Array.from(nacl.randomBytes(num));\n\t});\n\tconst hashedSignature = await bcrypt.hash(signature, bcrypt.genSaltSync(10));\n\treturn hashedSignature;\n};\n\nconst compareSignatures = async (\n\toriginal: string,\n\thashed: string\n): Promise<boolean> => {\n\tconst signaturesMatch = await bcrypt.compare(original, hashed);\n\treturn signaturesMatch;\n};\n\n/* Trading-related helper functions */\n\nconst calculateAverageEntryPrice = (\n\tquoteAssetAmount: BigNum,\n\tbaseAssetAmount: BigNum\n): BigNum => {\n\tif (baseAssetAmount.eqZero()) return BigNum.zero();\n\n\treturn BigNum.from(\n\t\tquoteAssetAmount.val\n\t\t\t.mul(PRICE_PRECISION)\n\t\t\t.mul(AMM_TO_QUOTE_PRECISION_RATIO)\n\t\t\t.div(baseAssetAmount.shiftTo(BASE_PRECISION_EXP).val)\n\t\t\t.abs(),\n\t\tPRICE_PRECISION_EXP\n\t);\n};\n\nconst getMarketOrderLimitPrice = ({\n\tdirection,\n\tbaselinePrice,\n\tslippageTolerance,\n}: {\n\tdirection: PositionDirection;\n\tbaselinePrice: BN;\n\tslippageTolerance: number;\n}): BN => {\n\tlet limitPrice;\n\n\tif (!baselinePrice) return ZERO;\n\n\tif (slippageTolerance === 0) return baselinePrice;\n\n\t// infinite slippage capped at 15% currently\n\tif (slippageTolerance == undefined) slippageTolerance = 15;\n\n\t// if manually entered, cap at 99%\n\tif (slippageTolerance > 99) slippageTolerance = 99;\n\n\tlet limitPricePctDiff;\n\tif (isVariant(direction, 'long')) {\n\t\tlimitPricePctDiff = PRICE_PRECISION.add(\n\t\t\tnew BN(slippageTolerance * PRICE_PRECISION.toNumber()).div(new BN(100))\n\t\t);\n\t\tlimitPrice = baselinePrice.mul(limitPricePctDiff).div(PRICE_PRECISION);\n\t} else {\n\t\tlimitPricePctDiff = PRICE_PRECISION.sub(\n\t\t\tnew BN(slippageTolerance * PRICE_PRECISION.toNumber()).div(new BN(100))\n\t\t);\n\t\tlimitPrice = baselinePrice.mul(limitPricePctDiff).div(PRICE_PRECISION);\n\t}\n\n\treturn limitPrice;\n};\n\nconst getMarketAuctionParams = ({\n\tdirection,\n\tstartPriceFromSettings,\n\tendPriceFromSettings,\n\tlimitPrice,\n\tduration,\n\tauctionStartPriceOffset,\n\tauctionEndPriceOffset,\n\tadditionalEndPriceBuffer,\n\tforceUpToSlippage,\n\tbestBidPrice,\n\tbestAskPrice,\n\tensureCrossingEndPrice,\n}: {\n\tdirection: PositionDirection;\n\tstartPriceFromSettings: BN;\n\tendPriceFromSettings: BN;\n\t/**\n\t * Limit price is the oracle limit price - market orders use the oracle order type under the hood on Drift UI\n\t * So oracle limit price is the oracle price + oracle offset\n\t */\n\tlimitPrice: BN;\n\tduration: number;\n\tauctionStartPriceOffset: number;\n\tauctionEndPriceOffset: number;\n\tadditionalEndPriceBuffer?: BN;\n\tforceUpToSlippage?: boolean;\n\tbestBidPrice?: BN;\n\tbestAskPrice?: BN;\n\tensureCrossingEndPrice?: boolean;\n}): AuctionParams => {\n\tlet auctionStartPrice: BN;\n\tlet auctionEndPrice: BN;\n\tlet constrainedBySlippage: boolean;\n\n\tconst auctionEndPriceBuffer = BigNum.from(PRICE_PRECISION).scale(\n\t\tMath.abs(auctionEndPriceOffset * 100),\n\t\t10000\n\t).val;\n\n\tconst auctionStartPriceBuffer = BigNum.from(startPriceFromSettings).scale(\n\t\tMath.abs(auctionStartPriceOffset * 100),\n\t\t10000\n\t).val;\n\n\tif (isVariant(direction, 'long')) {\n\t\tauctionStartPrice = startPriceFromSettings.sub(auctionStartPriceBuffer);\n\n\t\tconst worstPriceToUse = BN.max(\n\t\t\tendPriceFromSettings,\n\t\t\tstartPriceFromSettings\n\t\t); // Handles edge cases like if the worst price on the book was better than the oracle price, and the settings are asking to be relative to the oracle price\n\n\t\tauctionEndPrice = PRICE_PRECISION.add(auctionEndPriceBuffer)\n\t\t\t.mul(worstPriceToUse)\n\t\t\t.div(PRICE_PRECISION);\n\n\t\tconstrainedBySlippage = limitPrice.lt(auctionEndPrice);\n\n\t\t// if forceUpToSlippage is passed, use max slippage price as end price\n\t\tif (forceUpToSlippage) {\n\t\t\tauctionEndPrice = limitPrice;\n\t\t\tconstrainedBySlippage = false;\n\t\t} else {\n\t\t\t// use BEST (limit price, auction end price) as end price\n\t\t\tauctionEndPrice = BN.min(limitPrice, auctionEndPrice);\n\t\t}\n\n\t\t// apply additional buffer if provided\n\t\tif (additionalEndPriceBuffer) {\n\t\t\tauctionEndPrice = auctionEndPrice.add(additionalEndPriceBuffer);\n\t\t\tconstrainedBySlippage = limitPrice.lt(auctionEndPrice);\n\t\t}\n\n\t\t// if ensureCrossingEndPrice is passed, ensure auction end price crosses bestAskPrice\n\t\tif (ensureCrossingEndPrice && bestAskPrice) {\n\t\t\tauctionEndPrice = BN.max(\n\t\t\t\tauctionEndPrice,\n\t\t\t\tbestAskPrice.add(auctionEndPriceBuffer)\n\t\t\t);\n\t\t}\n\n\t\tauctionStartPrice = BN.min(auctionStartPrice, auctionEndPrice);\n\t} else {\n\t\tauctionStartPrice = startPriceFromSettings.add(auctionStartPriceBuffer);\n\n\t\tconst worstPriceToUse = BN.min(\n\t\t\tendPriceFromSettings,\n\t\t\tstartPriceFromSettings\n\t\t); // Handles edge cases like if the worst price on the book was better than the oracle price, and the settings are asking to be relative to the oracle price\n\n\t\tauctionEndPrice = PRICE_PRECISION.sub(auctionEndPriceBuffer)\n\t\t\t.mul(worstPriceToUse)\n\t\t\t.div(PRICE_PRECISION);\n\n\t\tconstrainedBySlippage = limitPrice.gt(auctionEndPrice);\n\n\t\t// if forceUpToSlippage is passed, use max slippage price as end price\n\t\tif (forceUpToSlippage) {\n\t\t\tauctionEndPrice = limitPrice;\n\t\t\tconstrainedBySlippage = false;\n\t\t} else {\n\t\t\t// use BEST (limit price, auction end price) as end price\n\t\t\tauctionEndPrice = BN.max(limitPrice, auctionEndPrice);\n\t\t}\n\n\t\t// apply additional buffer if provided\n\t\tif (additionalEndPriceBuffer) {\n\t\t\tauctionEndPrice = auctionEndPrice.sub(additionalEndPriceBuffer);\n\t\t\tconstrainedBySlippage = limitPrice.gt(auctionEndPrice);\n\t\t}\n\n\t\t// if ensureCrossingEndPrice is passed, ensure auction end price crosses bestBidPrice\n\t\tif (ensureCrossingEndPrice && bestBidPrice) {\n\t\t\tauctionEndPrice = BN.min(\n\t\t\t\tauctionEndPrice,\n\t\t\t\tbestBidPrice.sub(auctionEndPriceBuffer)\n\t\t\t);\n\t\t}\n\n\t\tauctionStartPrice = BN.max(auctionStartPrice, auctionEndPrice);\n\t}\n\n\treturn {\n\t\tauctionStartPrice,\n\t\tauctionEndPrice,\n\t\tauctionDuration: duration,\n\t\tconstrainedBySlippage,\n\t};\n};\n\n/**\n * Helper function which derived market order params from the CORE data that is used to create them.\n * @param param0\n * @returns\n */\nconst deriveMarketOrderParams = ({\n\tmarketType,\n\tmarketIndex,\n\tdirection,\n\tmaxLeverageSelected,\n\tmaxLeverageOrderSize,\n\tbaseAmount,\n\treduceOnly,\n\tallowInfSlippage,\n\toraclePrice,\n\tbestPrice,\n\tentryPrice,\n\tworstPrice,\n\tmarkPrice,\n\tauctionDuration,\n\tauctionStartPriceOffset,\n\tauctionEndPriceOffset,\n\tauctionStartPriceOffsetFrom,\n\tauctionEndPriceOffsetFrom,\n\tauctionPriceCaps,\n\tslippageTolerance,\n\tisOracleOrder,\n\tadditionalEndPriceBuffer,\n\tforceUpToSlippage,\n\tbestBidPrice,\n\tbestAskPrice,\n\tensureCrossingEndPrice,\n}: {\n\tmarketType: MarketType;\n\tmarketIndex: number;\n\tdirection: PositionDirection;\n\tmaxLeverageSelected: boolean;\n\tmaxLeverageOrderSize: BN;\n\tbaseAmount: BN;\n\treduceOnly: boolean;\n\tallowInfSlippage: boolean;\n\toraclePrice: BN;\n\tbestPrice: BN;\n\tentryPrice: BN;\n\tworstPrice: BN;\n\tmarkPrice: BN;\n\tauctionDuration: number;\n\tauctionStartPriceOffset: number;\n\tauctionEndPriceOffset: number;\n\tauctionPriceCaps?: {\n\t\tmin: BN;\n\t\tmax: BN;\n\t};\n\tauctionStartPriceOffsetFrom: TradeOffsetPrice;\n\tauctionEndPriceOffsetFrom: TradeOffsetPrice;\n\tslippageTolerance: number;\n\tisOracleOrder?: boolean;\n\tadditionalEndPriceBuffer?: BN;\n\tforceUpToSlippage?: boolean;\n\tbestBidPrice?: BN;\n\tbestAskPrice?: BN;\n\tensureCrossingEndPrice?: boolean;\n}): OptionalOrderParams & { constrainedBySlippage?: boolean } => {\n\tconst priceObject = getPriceObject({\n\t\toraclePrice,\n\t\tmarkPrice,\n\t\tbestOffer: bestPrice,\n\t\tentryPrice,\n\t\tworstPrice,\n\t\tdirection,\n\t});\n\n\t// max slippage price\n\tlet limitPrice = getMarketOrderLimitPrice({\n\t\tdirection,\n\t\tbaselinePrice: priceObject[auctionStartPriceOffsetFrom],\n\t\tslippageTolerance: allowInfSlippage ? undefined : slippageTolerance,\n\t});\n\n\tif (additionalEndPriceBuffer) {\n\t\tlimitPrice = isVariant(direction, 'long')\n\t\t\t? limitPrice.add(additionalEndPriceBuffer)\n\t\t\t: limitPrice.sub(additionalEndPriceBuffer);\n\t}\n\n\tconst auctionParams = getMarketAuctionParams({\n\t\tdirection,\n\t\tstartPriceFromSettings: priceObject[auctionStartPriceOffsetFrom],\n\t\tendPriceFromSettings: priceObject[auctionEndPriceOffsetFrom],\n\t\tlimitPrice,\n\t\tduration: auctionDuration,\n\t\tauctionStartPriceOffset: auctionStartPriceOffset,\n\t\tauctionEndPriceOffset: auctionEndPriceOffset,\n\t\tadditionalEndPriceBuffer,\n\t\tforceUpToSlippage,\n\t\tbestBidPrice,\n\t\tbestAskPrice,\n\t\tensureCrossingEndPrice,\n\t});\n\n\tlet orderParams = getMarketOrderParams({\n\t\tmarketType,\n\t\tmarketIndex,\n\t\tdirection,\n\t\tbaseAssetAmount: maxLeverageSelected ? maxLeverageOrderSize : baseAmount,\n\t\treduceOnly,\n\t\tprice: allowInfSlippage ? undefined : limitPrice,\n\t\t...auctionParams,\n\t});\n\n\tif (isOracleOrder) {\n\t\t// wont work if oracle is zero\n\t\tif (!oraclePrice.eq(ZERO)) {\n\t\t\tconst oracleAuctionParams = deriveOracleAuctionParams({\n\t\t\t\tdirection: direction,\n\t\t\t\toraclePrice,\n\t\t\t\tauctionStartPrice: auctionParams.auctionStartPrice,\n\t\t\t\tauctionEndPrice: auctionParams.auctionEndPrice,\n\t\t\t\tlimitPrice: auctionParams.auctionEndPrice,\n\t\t\t\tauctionPriceCaps: auctionPriceCaps,\n\t\t\t});\n\n\t\t\torderParams = {\n\t\t\t\t...orderParams,\n\t\t\t\t...oracleAuctionParams,\n\t\t\t\tprice: undefined,\n\t\t\t\torderType: OrderType.ORACLE,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn orderParams;\n};\n\nconst getLimitAuctionParams = ({\n\tdirection,\n\tinputPrice,\n\tstartPriceFromSettings,\n\tduration,\n\tauctionStartPriceOffset,\n\toraclePriceBands,\n}: {\n\tdirection: PositionDirection;\n\tinputPrice: BigNum;\n\tstartPriceFromSettings: BN;\n\tduration: number;\n\tauctionStartPriceOffset: number;\n\toraclePriceBands?: [BN, BN];\n}): AuctionParams => {\n\tlet limitAuctionParams = EMPTY_AUCTION_PARAMS;\n\n\tconst auctionStartPriceBuffer = inputPrice.scale(\n\t\tMath.abs(auctionStartPriceOffset * 100),\n\t\t10000\n\t).val;\n\n\tif (\n\t\tisVariant(direction, 'long') &&\n\t\tstartPriceFromSettings &&\n\t\tstartPriceFromSettings.lt(inputPrice.val) &&\n\t\tstartPriceFromSettings.gt(ZERO)\n\t) {\n\t\tlimitAuctionParams = {\n\t\t\tauctionStartPrice: startPriceFromSettings.sub(auctionStartPriceBuffer),\n\t\t\tauctionEndPrice: inputPrice.val,\n\t\t\tauctionDuration: duration,\n\t\t};\n\t} else if (\n\t\tisVariant(direction, 'short') &&\n\t\tstartPriceFromSettings &&\n\t\tstartPriceFromSettings.gt(ZERO) &&\n\t\tstartPriceFromSettings.gt(inputPrice.val)\n\t) {\n\t\tlimitAuctionParams = {\n\t\t\tauctionStartPrice: startPriceFromSettings.add(auctionStartPriceBuffer),\n\t\t\tauctionEndPrice: inputPrice.val,\n\t\t\tauctionDuration: duration,\n\t\t};\n\t}\n\n\tif (oraclePriceBands && limitAuctionParams.auctionDuration) {\n\t\tconst [minPrice, maxPrice] = oraclePriceBands;\n\n\t\t// start and end price cant be outside of the oracle price bands\n\t\tlimitAuctionParams.auctionStartPrice = BN.max(\n\t\t\tBN.min(limitAuctionParams.auctionStartPrice, maxPrice),\n\t\t\tminPrice\n\t\t);\n\n\t\tlimitAuctionParams.auctionEndPrice = BN.max(\n\t\t\tBN.min(limitAuctionParams.auctionEndPrice, maxPrice),\n\t\t\tminPrice\n\t\t);\n\t}\n\n\treturn limitAuctionParams;\n};\n\nconst getPriceObject = ({\n\toraclePrice,\n\tbestOffer,\n\tentryPrice,\n\tworstPrice,\n\tmarkPrice,\n\tdirection,\n}: {\n\toraclePrice: BN;\n\tbestOffer: BN;\n\tentryPrice: BN;\n\tworstPrice: BN;\n\tmarkPrice: BN;\n\tdirection: PositionDirection;\n}) => {\n\tlet best: BN;\n\n\tconst nonZeroOptions = [oraclePrice, bestOffer, markPrice].filter(\n\t\t(price) => price !== undefined && price?.gt(ZERO)\n\t);\n\n\tif (nonZeroOptions.length === 0) {\n\t\t// console.error('Unable to create valid auction params');\n\t\treturn {\n\t\t\toracle: ZERO,\n\t\t\tbestOffer: ZERO,\n\t\t\tentry: ZERO,\n\t\t\tbest: ZERO,\n\t\t\tworst: ZERO,\n\t\t\tmark: ZERO,\n\t\t};\n\t}\n\n\tif (isVariant(direction, 'long')) {\n\t\tbest = nonZeroOptions.reduce((a, b) => (a.lt(b) ? a : b)); // lowest price\n\t} else {\n\t\tbest = nonZeroOptions.reduce((a, b) => (a.gt(b) ? a : b)); // highest price\n\t}\n\n\t// if zero values come through, fallback to nonzero value\n\treturn {\n\t\toracle: oraclePrice?.gt(ZERO) ? oraclePrice : best,\n\t\tbestOffer: bestOffer?.gt(ZERO) ? bestOffer : best,\n\t\tentry: entryPrice,\n\t\tbest,\n\t\tworst: worstPrice,\n\t\tmark: markPrice?.gt(ZERO) ? markPrice : best,\n\t};\n};\n\n/* LP Utils */\nconst getLpSharesAmountForQuote = (\n\tdriftClient: DriftClient,\n\tmarketIndex: number,\n\tquoteAmount: BN\n): BigNum => {\n\tconst tenMillionBigNum = BigNum.fromPrint('10000000', QUOTE_PRECISION_EXP);\n\n\tconst pricePerLpShare = BigNum.from(\n\t\tdriftClient.getQuoteValuePerLpShare(marketIndex),\n\t\tQUOTE_PRECISION_EXP\n\t);\n\n\treturn BigNum.from(quoteAmount, QUOTE_PRECISION_EXP)\n\t\t.scale(\n\t\t\ttenMillionBigNum.toNum(),\n\t\t\tpricePerLpShare.mul(tenMillionBigNum).toNum()\n\t\t)\n\t\t.shiftTo(AMM_RESERVE_PRECISION_EXP);\n};\n\nconst getQuoteValueForLpShares = (\n\tdriftClient: DriftClient,\n\tmarketIndex: number,\n\tsharesAmount: BN\n): BigNum => {\n\tconst pricePerLpShare = BigNum.from(\n\t\tdriftClient.getQuoteValuePerLpShare(marketIndex),\n\t\tQUOTE_PRECISION_EXP\n\t).shiftTo(AMM_RESERVE_PRECISION_EXP);\n\tconst lpSharesBigNum = BigNum.from(sharesAmount, AMM_RESERVE_PRECISION_EXP);\n\treturn lpSharesBigNum.mul(pricePerLpShare).shiftTo(QUOTE_PRECISION_EXP);\n};\n\nconst getTokenAddress = (\n\tmintAddress: PublicKey,\n\tuserPubKey: PublicKey\n): Promise<PublicKey> => {\n\treturn getAssociatedTokenAddress(mintAddress, userPubKey, true);\n};\n\nconst getBalanceFromTokenAccountResult = (account: {\n\tpubkey: PublicKey;\n\taccount: AccountInfo<ParsedAccountData>;\n}) => {\n\treturn account?.account.data?.parsed?.info?.tokenAmount?.uiAmount;\n};\n\nconst getTokenAccount = async (\n\tconnection: Connection,\n\tmintAddress: PublicKey,\n\tuserPubKey: PublicKey\n): Promise<{\n\ttokenAccount: {\n\t\tpubkey: PublicKey;\n\t\taccount: import('@solana/web3.js').AccountInfo<\n\t\t\timport('@solana/web3.js').ParsedAccountData\n\t\t>;\n\t};\n\ttokenAccountWarning: boolean;\n}> => {\n\tconst tokenAccounts = await connection.getParsedTokenAccountsByOwner(\n\t\tuserPubKey,\n\t\t{ mint: mintAddress }\n\t);\n\n\tconst associatedAddress = await getAssociatedTokenAddress(\n\t\tmintAddress,\n\t\tuserPubKey,\n\t\ttrue\n\t);\n\n\tconst targetAccount =\n\t\ttokenAccounts.value.filter((account) =>\n\t\t\taccount.pubkey.equals(associatedAddress)\n\t\t)[0] || tokenAccounts.value[0];\n\n\tconst anotherBalanceExists = tokenAccounts.value.find((account) => {\n\t\treturn (\n\t\t\t!!getBalanceFromTokenAccountResult(account) &&\n\t\t\t!account.pubkey.equals(targetAccount.pubkey)\n\t\t);\n\t});\n\n\tlet tokenAccountWarning = false;\n\n\tif (anotherBalanceExists) {\n\t\ttokenAccountWarning = true;\n\t}\n\n\treturn {\n\t\ttokenAccount: targetAccount,\n\t\ttokenAccountWarning,\n\t};\n};\n\nconst getMultipleAccounts = async (\n\tconnection: any,\n\tkeys: string[],\n\tcommitment: string\n) => {\n\tconst result = await Promise.all(\n\t\tchunks(keys, 99).map((chunk) =>\n\t\t\tgetMultipleAccountsCore(connection, chunk, commitment)\n\t\t)\n\t);\n\n\tconst array = result\n\t\t.map(\n\t\t\t(a) =>\n\t\t\t\ta.array\n\t\t\t\t\t.map((acc) => {\n\t\t\t\t\t\tif (!acc) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { data, ...rest } = acc;\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\t...rest,\n\t\t\t\t\t\t\tdata: Buffer.from(data[0], 'base64'),\n\t\t\t\t\t\t} as AccountInfo<Buffer>;\n\t\t\t\t\t\treturn obj;\n\t\t\t\t\t})\n\t\t\t\t\t.filter((_) => _) as AccountInfo<Buffer>[]\n\t\t)\n\t\t.flat();\n\treturn { keys, array };\n};\n\nconst getMultipleAccountsCore = async (\n\tconnection: any,\n\tkeys: string[],\n\tcommitment: string\n) => {\n\tconst args = connection._buildArgs([keys], commitment, 'base64');\n\n\tconst unsafeRes = await connection._rpcRequest('getMultipleAccounts', args);\n\tif (unsafeRes.error) {\n\t\tthrow new Error(\n\t\t\t'failed to get info about account ' + unsafeRes.error.message\n\t\t);\n\t}\n\n\tif (unsafeRes.result.value) {\n\t\tconst array = unsafeRes.result.value as AccountInfo<string[]>[];\n\t\treturn { keys, array };\n\t}\n\n\t// TODO: fix\n\tthrow new Error();\n};\n\nconst userExists = async (\n\tdriftClient: DriftClient,\n\tuserId: number,\n\tauthority: PublicKey\n) => {\n\tlet userAccountExists = false;\n\n\ttry {\n\t\tconst user = driftClient.getUser(userId, authority);\n\t\tuserAccountExists = await user.exists();\n\t} catch (e) {\n\t\t// user account does not exist so we leave userAccountExists false\n\t}\n\n\treturn userAccountExists;\n};\n\nfunction chunks<T>(array: T[], size: number): T[][] {\n\treturn Array.apply(0, new Array(Math.ceil(array.length / size))).map(\n\t\t(_, index) => array.slice(index * size, (index + 1) * size)\n\t);\n}\n\n/**\n * Trim trailing zeros from a numerical string\n * @param str - numerical string to format\n * @param zerosToShow - max number of zeros to show after the decimal. Similar to number.toFixed() but won't trim non-zero values. Optional, default value is 1\n */\nconst trimTrailingZeros = (str: string, zerosToShow = 1) => {\n\t// Ignore strings with no decimal point\n\tif (!str.includes('.')) return str;\n\n\tconst sides = str.split('.');\n\n\tsides[1] = sides[1].replace(/0+$/, '');\n\n\tif (sides[1].length < zerosToShow) {\n\t\tconst zerosToAdd = zerosToShow - sides[1].length;\n\t\tsides[1] = `${sides[1]}${Array(zerosToAdd).fill('0').join('')}`;\n\t}\n\n\tif (sides[1].length === 0) {\n\t\treturn sides[0];\n\t} else {\n\t\treturn sides.join('.');\n\t}\n};\n\nconst formatTokenInputCurried =\n\t(setAmount: (amount: string) => void, spotMarketConfig: SpotMarketConfig) =>\n\t(newAmount: string) => {\n\t\tif (isNaN(+newAmount)) return;\n\n\t\tif (newAmount === '') {\n\t\t\tsetAmount('');\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastChar = newAmount[newAmount.length - 1];\n\n\t\t// if last char of string is a decimal point, don't format\n\t\tif (lastChar === '.') {\n\t\t\tsetAmount(newAmount);\n\t\t\treturn;\n\t\t}\n\n\t\tif (lastChar === '0') {\n\t\t\t// if last char of string is a zero in the decimal places, cut it off if it exceeds precision\n\t\t\tconst numOfDigitsAfterDecimal = newAmount.split('.')[1]?.length ?? 0;\n\t\t\tif (numOfDigitsAfterDecimal > spotMarketConfig.precisionExp.toNumber()) {\n\t\t\t\tsetAmount(newAmount.slice(0, -1));\n\t\t\t} else {\n\t\t\t\tsetAmount(newAmount);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst formattedAmount = Number(\n\t\t\t(+newAmount).toFixed(spotMarketConfig.precisionExp.toNumber())\n\t\t);\n\t\tsetAmount(formattedAmount.toString());\n\t};\n\n// --- Export The Utils\n\nexport const COMMON_UI_UTILS = {\n\tabbreviateAddress,\n\tcalculateAverageEntryPrice,\n\tchunks,\n\tcompareSignatures,\n\tcreatePlaceholderIWallet,\n\tderiveMarketOrderParams,\n\tfetchCurrentSubaccounts,\n\tfetchUserClientsAndAccounts,\n\tformatTokenInputCurried,\n\tgetBalanceFromTokenAccountResult,\n\tgetIdAndAuthorityFromKey,\n\tgetLimitAuctionParams,\n\tgetLpSharesAmountForQuote,\n\tgetMarketAuctionParams,\n\tgetMarketKey,\n\tgetMarketOrderLimitPrice,\n\tgetMultipleAccounts,\n\tgetMultipleAccountsCore,\n\tgetPriceObject,\n\tgetQuoteValueForLpShares,\n\tgetSignatureVerificationMessageForSettings,\n\tgetTokenAccount,\n\tgetTokenAddress,\n\tgetUserKey,\n\thashSignature,\n\tinitializeAndSubscribeToNewUserAccount,\n\tuserExists,\n\tverifySignature,\n\ttrimTrailingZeros,\n\t...USER_UTILS,\n\t...TRADING_UTILS,\n\t...MARKET_UTILS,\n\t...ORDER_COMMON_UTILS,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"commonUiUtils.js","sourceRoot":"","sources":["../../src/common-ui-utils/commonUiUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tAMM_RESERVE_PRECISION_EXP,\n\tAMM_TO_QUOTE_PRECISION_RATIO,\n\tBASE_PRECISION_EXP,\n\tBN,\n\tBigNum,\n\tDriftClient,\n\tIWalletV2,\n\tMarketType,\n\tOptionalOrderParams,\n\tOrderType,\n\tPRICE_PRECISION,\n\tPRICE_PRECISION_EXP,\n\tPositionDirection,\n\tPublicKey,\n\tQUOTE_PRECISION_EXP,\n\tSpotMarketConfig,\n\tUser,\n\tUserAccount,\n\tZERO,\n\tderiveOracleAuctionParams,\n\tgetMarketOrderParams,\n\tisVariant,\n} from '@drift-labs/sdk';\nimport { ENUM_UTILS, sleep } from '../utils';\nimport {\n\tAccountInfo,\n\tConnection,\n\tKeypair,\n\tParsedAccountData,\n} from '@solana/web3.js';\nimport bcrypt from 'bcryptjs-react';\nimport nacl, { sign } from 'tweetnacl';\nimport { getAssociatedTokenAddress } from '@solana/spl-token';\nimport { AuctionParams, TradeOffsetPrice } from 'src/types';\nimport { USER_UTILS } from './user';\nimport { TRADING_UTILS } from './trading';\nimport { MARKET_UTILS } from './market';\nimport { ORDER_COMMON_UTILS } from './order';\nimport { EMPTY_AUCTION_PARAMS } from '../constants/trade';\n\n// Cache for common UI string patterns to reduce memory allocation\nconst uiStringCache = new Map<string, string>();\nconst MAX_UI_STRING_CACHE_SIZE = 2000;\n\n// Helper function to cache common string patterns\nfunction getCachedUiString(\n\tpattern: string,\n\t...values: (string | number)[]\n): string {\n\tconst cacheKey = `${pattern}:${values.join(':')}`;\n\n\tif (uiStringCache.has(cacheKey)) {\n\t\treturn uiStringCache.get(cacheKey)!;\n\t}\n\n\tlet result: string;\n\tswitch (pattern) {\n\t\tcase 'abbreviate': {\n\t\t\tconst [authString, length] = values as [string, number];\n\t\t\tresult = `${authString.slice(0, length)}...${authString.slice(-length)}`;\n\t\t\tbreak;\n\t\t}\n\t\tcase 'userKey': {\n\t\t\tconst [userId, authority] = values as [number, string];\n\t\t\tresult = `${userId}_${authority}`;\n\t\t\tbreak;\n\t\t}\n\t\tcase 'marketKey': {\n\t\t\tconst [marketType, marketIndex] = values as [string, number];\n\t\t\tresult = `${marketType}_${marketIndex}`;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tresult = values.join('_');\n\t}\n\n\t// Cache if not too large\n\tif (uiStringCache.size < MAX_UI_STRING_CACHE_SIZE) {\n\t\tuiStringCache.set(cacheKey, result);\n\t}\n\n\treturn result;\n}\n\n// When creating an account, try 5 times over 5 seconds to wait for the new account to hit the blockchain.\nconst ACCOUNT_INITIALIZATION_RETRY_DELAY_MS = 1000;\nconst ACCOUNT_INITIALIZATION_RETRY_ATTEMPTS = 5;\n\nconst abbreviateAddress = (address: string | PublicKey, length = 4) => {\n\tif (!address) return '';\n\tconst authString = address.toString();\n\treturn getCachedUiString('abbreviate', authString, length);\n};\n\n/**\n * Get a unique key for an authority's subaccount\n * @param userId\n * @param authority\n * @returns\n */\nconst getUserKey = (userId: number, authority: PublicKey) => {\n\tif (userId == undefined || !authority) return '';\n\treturn getCachedUiString('userKey', userId, authority.toString());\n};\n\n/**\n * Get the authority and subAccountId from a user's account key\n * @param key\n * @returns\n */\nconst getIdAndAuthorityFromKey = (\n\tkey: string\n):\n\t| { userId: number; userAuthority: PublicKey }\n\t| { userId: undefined; userAuthority: undefined } => {\n\tconst splitKey = key?.split('_');\n\n\tif (!splitKey || splitKey.length !== 2)\n\t\treturn { userId: undefined, userAuthority: undefined };\n\n\treturn {\n\t\tuserId: Number(splitKey[0]),\n\t\tuserAuthority: new PublicKey(splitKey[1]),\n\t};\n};\n\nconst fetchCurrentSubaccounts = (driftClient: DriftClient): UserAccount[] => {\n\treturn driftClient.getUsers().map((user) => user.getUserAccount());\n};\n\nconst fetchUserClientsAndAccounts = (\n\tdriftClient: DriftClient\n): { user: User; userAccount: UserAccount }[] => {\n\tconst accounts = fetchCurrentSubaccounts(driftClient);\n\tconst allUsersAndUserAccounts = accounts.map((acct) => {\n\t\treturn {\n\t\t\tuser: driftClient.getUser(acct.subAccountId, acct.authority),\n\t\t\tuserAccount: acct,\n\t\t};\n\t});\n\n\treturn allUsersAndUserAccounts;\n};\n\nconst awaitAccountInitializationChainState = async (\n\tdriftClient: DriftClient,\n\tuserId: number,\n\tauthority: PublicKey\n) => {\n\tconst user = driftClient.getUser(userId, authority);\n\n\tif (!user.isSubscribed) {\n\t\tawait user.subscribe();\n\t}\n\n\tlet retryCount = 0;\n\n\tdo {\n\t\ttry {\n\t\t\tawait updateUserAccount(user);\n\t\t\tif (user?.getUserAccountAndSlot()?.data !== undefined) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tretryCount++;\n\t\t\tawait sleep(ACCOUNT_INITIALIZATION_RETRY_DELAY_MS);\n\t\t}\n\t} while (retryCount < ACCOUNT_INITIALIZATION_RETRY_ATTEMPTS);\n\n\tthrow new Error('awaitAccountInitializationFailed');\n};\n\n/**\n * Using your own callback to do the account initialization, this method will run the initialization step, switch to the drift user, await for the account to be available on chain, subscribe to the user account, and switch to the user account using the drift client.\n *\n * It provides extra callbacks to handle steps directly after the initialiation tx, and after fully initializing+subscribing to the account.\n *\n * Callbacks available:\n * - initializationStep: This callback should send the transaction to initialize the user account\n * - postInitializationStep: This callback will run after the successful initialization transaction, but before trying to load/subscribe to the new account\n * - handleSuccessStep: This callback will run after everything has initialized+subscribed successfully\n *\n * // TODO : Need to do the subscription step\n */\nconst initializeAndSubscribeToNewUserAccount = async (\n\tdriftClient: DriftClient,\n\tuserIdToInit: number,\n\tauthority: PublicKey,\n\tcallbacks: {\n\t\tinitializationStep: () => Promise<boolean>;\n\t\tpostInitializationStep?: () => Promise<boolean>;\n\t\thandleSuccessStep?: (accountAlreadyExisted: boolean) => Promise<boolean>;\n\t}\n): Promise<\n\t| 'ok'\n\t| 'failed_initializationStep'\n\t| 'failed_postInitializationStep'\n\t| 'failed_awaitAccountInitializationChainState'\n\t| 'failed_handleSuccessStep'\n> => {\n\tawait driftClient.addUser(userIdToInit, authority);\n\n\tconst accountAlreadyExisted = await driftClient\n\t\t.getUser(userIdToInit)\n\t\t?.exists();\n\n\t// Do the account initialization step\n\tlet result = await callbacks.initializationStep();\n\n\t// Fetch account to make sure it's loaded\n\tawait updateUserAccount(driftClient.getUser(userIdToInit));\n\n\tif (!result) {\n\t\treturn 'failed_initializationStep';\n\t}\n\n\t// Do the post-initialization step\n\tresult = callbacks.postInitializationStep\n\t\t? await callbacks.postInitializationStep()\n\t\t: result;\n\n\tif (!result) {\n\t\treturn 'failed_postInitializationStep';\n\t}\n\n\t// Await the account initialization step to update the blockchain\n\tresult = await awaitAccountInitializationChainState(\n\t\tdriftClient,\n\t\tuserIdToInit,\n\t\tauthority\n\t);\n\n\tif (!result) {\n\t\treturn 'failed_awaitAccountInitializationChainState';\n\t}\n\n\tawait driftClient.switchActiveUser(userIdToInit, authority);\n\n\t// Do the subscription step\n\n\t// Run the success handler\n\tresult = callbacks.handleSuccessStep\n\t\t? await callbacks.handleSuccessStep(accountAlreadyExisted)\n\t\t: result;\n\n\tif (!result) {\n\t\treturn 'failed_handleSuccessStep';\n\t}\n\n\treturn 'ok';\n};\n\nasync function updateUserAccount(user: User): Promise<void> {\n\tconst publicKey = user.userAccountPublicKey;\n\ttry {\n\t\tconst dataAndContext =\n\t\t\tawait user.driftClient.program.account.user.fetchAndContext(\n\t\t\t\tpublicKey,\n\t\t\t\t'processed'\n\t\t\t);\n\t\tuser.accountSubscriber.updateData(\n\t\t\tdataAndContext.data as UserAccount,\n\t\t\tdataAndContext.context.slot\n\t\t);\n\t} catch (e) {\n\t\t// noop\n\t}\n}\n\nconst getMarketKey = (marketIndex: number, marketType: MarketType) =>\n\tgetCachedUiString('marketKey', ENUM_UTILS.toStr(marketType), marketIndex);\n\n/**\n * Creates an IWallet wrapper, with redundant methods. If a `walletPubKey` is passed in,\n * the `publicKey` will be based on that.\n */\nconst createPlaceholderIWallet = (walletPubKey?: PublicKey) => {\n\tconst newKeypair = walletPubKey\n\t\t? new Keypair({\n\t\t\t\tpublicKey: walletPubKey.toBytes(),\n\t\t\t\tsecretKey: new Keypair().publicKey.toBytes(),\n\t\t })\n\t\t: new Keypair();\n\n\tconst newWallet: IWalletV2 = {\n\t\tpublicKey: newKeypair.publicKey,\n\t\t//@ts-ignore\n\t\tsignTransaction: () => {\n\t\t\treturn Promise.resolve();\n\t\t},\n\t\t//@ts-ignore\n\t\tsignAllTransactions: () => {\n\t\t\treturn Promise.resolve();\n\t\t},\n\t\t//@ts-ignore\n\t\tsignMessage: () => {\n\t\t\treturn Promise.resolve();\n\t\t},\n\t};\n\n\treturn newWallet;\n};\n\nconst getSignatureVerificationMessageForSettings = (\n\tauthority: PublicKey,\n\tsignTs: number\n): Uint8Array => {\n\treturn new TextEncoder().encode(\n\t\t`Verify you are the owner of this wallet to update trade settings: \\n${authority.toBase58()}\\n\\nThis signature will be valid for the next 30 minutes.\\n\\nTS: ${signTs.toString()}`\n\t);\n};\n\nconst verifySignature = (\n\tsignature: Uint8Array,\n\tmessage: Uint8Array,\n\tpubKey: PublicKey\n): boolean => {\n\treturn sign.detached.verify(message, signature, pubKey.toBytes());\n};\n\nconst hashSignature = async (signature: string): Promise<string> => {\n\tbcrypt.setRandomFallback((num: number) => {\n\t\treturn Array.from(nacl.randomBytes(num));\n\t});\n\tconst hashedSignature = await bcrypt.hash(signature, bcrypt.genSaltSync(10));\n\treturn hashedSignature;\n};\n\nconst compareSignatures = async (\n\toriginal: string,\n\thashed: string\n): Promise<boolean> => {\n\tconst signaturesMatch = await bcrypt.compare(original, hashed);\n\treturn signaturesMatch;\n};\n\n/* Trading-related helper functions */\n\nconst calculateAverageEntryPrice = (\n\tquoteAssetAmount: BigNum,\n\tbaseAssetAmount: BigNum\n): BigNum => {\n\tif (baseAssetAmount.eqZero()) return BigNum.zero();\n\n\treturn BigNum.from(\n\t\tquoteAssetAmount.val\n\t\t\t.mul(PRICE_PRECISION)\n\t\t\t.mul(AMM_TO_QUOTE_PRECISION_RATIO)\n\t\t\t.div(baseAssetAmount.shiftTo(BASE_PRECISION_EXP).val)\n\t\t\t.abs(),\n\t\tPRICE_PRECISION_EXP\n\t);\n};\n\nconst getMarketOrderLimitPrice = ({\n\tdirection,\n\tbaselinePrice,\n\tslippageTolerance,\n}: {\n\tdirection: PositionDirection;\n\tbaselinePrice: BN;\n\tslippageTolerance: number;\n}): BN => {\n\tlet limitPrice;\n\n\tif (!baselinePrice) return ZERO;\n\n\tif (slippageTolerance === 0) return baselinePrice;\n\n\t// infinite slippage capped at 15% currently\n\tif (slippageTolerance == undefined) slippageTolerance = 15;\n\n\t// if manually entered, cap at 99%\n\tif (slippageTolerance > 99) slippageTolerance = 99;\n\n\tlet limitPricePctDiff;\n\tif (isVariant(direction, 'long')) {\n\t\tlimitPricePctDiff = PRICE_PRECISION.add(\n\t\t\tnew BN(slippageTolerance * PRICE_PRECISION.toNumber()).div(new BN(100))\n\t\t);\n\t\tlimitPrice = baselinePrice.mul(limitPricePctDiff).div(PRICE_PRECISION);\n\t} else {\n\t\tlimitPricePctDiff = PRICE_PRECISION.sub(\n\t\t\tnew BN(slippageTolerance * PRICE_PRECISION.toNumber()).div(new BN(100))\n\t\t);\n\t\tlimitPrice = baselinePrice.mul(limitPricePctDiff).div(PRICE_PRECISION);\n\t}\n\n\treturn limitPrice;\n};\n\nconst getMarketAuctionParams = ({\n\tdirection,\n\tstartPriceFromSettings,\n\tendPriceFromSettings,\n\tlimitPrice,\n\tduration,\n\tauctionStartPriceOffset,\n\tauctionEndPriceOffset,\n\tadditionalEndPriceBuffer,\n\tforceUpToSlippage,\n\tbestBidPrice,\n\tbestAskPrice,\n\tensureCrossingEndPrice,\n}: {\n\tdirection: PositionDirection;\n\tstartPriceFromSettings: BN;\n\tendPriceFromSettings: BN;\n\t/**\n\t * Limit price is the oracle limit price - market orders use the oracle order type under the hood on Drift UI\n\t * So oracle limit price is the oracle price + oracle offset\n\t */\n\tlimitPrice: BN;\n\tduration: number;\n\tauctionStartPriceOffset: number;\n\tauctionEndPriceOffset: number;\n\tadditionalEndPriceBuffer?: BN;\n\tforceUpToSlippage?: boolean;\n\tbestBidPrice?: BN;\n\tbestAskPrice?: BN;\n\tensureCrossingEndPrice?: boolean;\n}): AuctionParams => {\n\tlet auctionStartPrice: BN;\n\tlet auctionEndPrice: BN;\n\tlet constrainedBySlippage: boolean;\n\n\tconst auctionEndPriceBuffer = BigNum.from(PRICE_PRECISION).scale(\n\t\tMath.abs(auctionEndPriceOffset * 100),\n\t\t10000\n\t).val;\n\n\tconst auctionStartPriceBuffer = BigNum.from(startPriceFromSettings).scale(\n\t\tMath.abs(auctionStartPriceOffset * 100),\n\t\t10000\n\t).val;\n\n\tif (isVariant(direction, 'long')) {\n\t\tauctionStartPrice = startPriceFromSettings.sub(auctionStartPriceBuffer);\n\n\t\tconst worstPriceToUse = BN.max(\n\t\t\tendPriceFromSettings,\n\t\t\tstartPriceFromSettings\n\t\t); // Handles edge cases like if the worst price on the book was better than the oracle price, and the settings are asking to be relative to the oracle price\n\n\t\tauctionEndPrice = PRICE_PRECISION.add(auctionEndPriceBuffer)\n\t\t\t.mul(worstPriceToUse)\n\t\t\t.div(PRICE_PRECISION);\n\n\t\tconstrainedBySlippage = limitPrice.lt(auctionEndPrice);\n\n\t\t// if forceUpToSlippage is passed, use max slippage price as end price\n\t\tif (forceUpToSlippage) {\n\t\t\tauctionEndPrice = limitPrice;\n\t\t\tconstrainedBySlippage = false;\n\t\t} else {\n\t\t\t// use BEST (limit price, auction end price) as end price\n\t\t\tauctionEndPrice = BN.min(limitPrice, auctionEndPrice);\n\t\t}\n\n\t\t// apply additional buffer if provided\n\t\tif (additionalEndPriceBuffer) {\n\t\t\tauctionEndPrice = auctionEndPrice.add(additionalEndPriceBuffer);\n\t\t\tconstrainedBySlippage = limitPrice.lt(auctionEndPrice);\n\t\t}\n\n\t\t// if ensureCrossingEndPrice is passed, ensure auction end price crosses bestAskPrice\n\t\tif (ensureCrossingEndPrice && bestAskPrice) {\n\t\t\tauctionEndPrice = BN.max(\n\t\t\t\tauctionEndPrice,\n\t\t\t\tbestAskPrice.add(auctionEndPriceBuffer)\n\t\t\t);\n\t\t}\n\n\t\tauctionStartPrice = BN.min(auctionStartPrice, auctionEndPrice);\n\t} else {\n\t\tauctionStartPrice = startPriceFromSettings.add(auctionStartPriceBuffer);\n\n\t\tconst worstPriceToUse = BN.min(\n\t\t\tendPriceFromSettings,\n\t\t\tstartPriceFromSettings\n\t\t); // Handles edge cases like if the worst price on the book was better than the oracle price, and the settings are asking to be relative to the oracle price\n\n\t\tauctionEndPrice = PRICE_PRECISION.sub(auctionEndPriceBuffer)\n\t\t\t.mul(worstPriceToUse)\n\t\t\t.div(PRICE_PRECISION);\n\n\t\tconstrainedBySlippage = limitPrice.gt(auctionEndPrice);\n\n\t\t// if forceUpToSlippage is passed, use max slippage price as end price\n\t\tif (forceUpToSlippage) {\n\t\t\tauctionEndPrice = limitPrice;\n\t\t\tconstrainedBySlippage = false;\n\t\t} else {\n\t\t\t// use BEST (limit price, auction end price) as end price\n\t\t\tauctionEndPrice = BN.max(limitPrice, auctionEndPrice);\n\t\t}\n\n\t\t// apply additional buffer if provided\n\t\tif (additionalEndPriceBuffer) {\n\t\t\tauctionEndPrice = auctionEndPrice.sub(additionalEndPriceBuffer);\n\t\t\tconstrainedBySlippage = limitPrice.gt(auctionEndPrice);\n\t\t}\n\n\t\t// if ensureCrossingEndPrice is passed, ensure auction end price crosses bestBidPrice\n\t\tif (ensureCrossingEndPrice && bestBidPrice) {\n\t\t\tauctionEndPrice = BN.min(\n\t\t\t\tauctionEndPrice,\n\t\t\t\tbestBidPrice.sub(auctionEndPriceBuffer)\n\t\t\t);\n\t\t}\n\n\t\tauctionStartPrice = BN.max(auctionStartPrice, auctionEndPrice);\n\t}\n\n\treturn {\n\t\tauctionStartPrice,\n\t\tauctionEndPrice,\n\t\tauctionDuration: duration,\n\t\tconstrainedBySlippage,\n\t};\n};\n\n/**\n * Helper function which derived market order params from the CORE data that is used to create them.\n * @param param0\n * @returns\n */\nconst deriveMarketOrderParams = ({\n\tmarketType,\n\tmarketIndex,\n\tdirection,\n\tmaxLeverageSelected,\n\tmaxLeverageOrderSize,\n\tbaseAmount,\n\treduceOnly,\n\tallowInfSlippage,\n\toraclePrice,\n\tbestPrice,\n\tentryPrice,\n\tworstPrice,\n\tmarkPrice,\n\tauctionDuration,\n\tauctionStartPriceOffset,\n\tauctionEndPriceOffset,\n\tauctionStartPriceOffsetFrom,\n\tauctionEndPriceOffsetFrom,\n\tauctionPriceCaps,\n\tslippageTolerance,\n\tisOracleOrder,\n\tadditionalEndPriceBuffer,\n\tforceUpToSlippage,\n\tbestBidPrice,\n\tbestAskPrice,\n\tensureCrossingEndPrice,\n}: {\n\tmarketType: MarketType;\n\tmarketIndex: number;\n\tdirection: PositionDirection;\n\tmaxLeverageSelected: boolean;\n\tmaxLeverageOrderSize: BN;\n\tbaseAmount: BN;\n\treduceOnly: boolean;\n\tallowInfSlippage: boolean;\n\toraclePrice: BN;\n\tbestPrice: BN;\n\tentryPrice: BN;\n\tworstPrice: BN;\n\tmarkPrice: BN;\n\tauctionDuration: number;\n\tauctionStartPriceOffset: number;\n\tauctionEndPriceOffset: number;\n\tauctionPriceCaps?: {\n\t\tmin: BN;\n\t\tmax: BN;\n\t};\n\tauctionStartPriceOffsetFrom: TradeOffsetPrice;\n\tauctionEndPriceOffsetFrom: TradeOffsetPrice;\n\tslippageTolerance: number;\n\tisOracleOrder?: boolean;\n\tadditionalEndPriceBuffer?: BN;\n\tforceUpToSlippage?: boolean;\n\tbestBidPrice?: BN;\n\tbestAskPrice?: BN;\n\tensureCrossingEndPrice?: boolean;\n}): OptionalOrderParams & { constrainedBySlippage?: boolean } => {\n\tconst priceObject = getPriceObject({\n\t\toraclePrice,\n\t\tmarkPrice,\n\t\tbestOffer: bestPrice,\n\t\tentryPrice,\n\t\tworstPrice,\n\t\tdirection,\n\t});\n\n\t// max slippage price\n\tlet limitPrice = getMarketOrderLimitPrice({\n\t\tdirection,\n\t\tbaselinePrice: priceObject[auctionStartPriceOffsetFrom],\n\t\tslippageTolerance: allowInfSlippage ? undefined : slippageTolerance,\n\t});\n\n\tif (additionalEndPriceBuffer) {\n\t\tlimitPrice = isVariant(direction, 'long')\n\t\t\t? limitPrice.add(additionalEndPriceBuffer)\n\t\t\t: limitPrice.sub(additionalEndPriceBuffer);\n\t}\n\n\tconst auctionParams = getMarketAuctionParams({\n\t\tdirection,\n\t\tstartPriceFromSettings: priceObject[auctionStartPriceOffsetFrom],\n\t\tendPriceFromSettings: priceObject[auctionEndPriceOffsetFrom],\n\t\tlimitPrice,\n\t\tduration: auctionDuration,\n\t\tauctionStartPriceOffset: auctionStartPriceOffset,\n\t\tauctionEndPriceOffset: auctionEndPriceOffset,\n\t\tadditionalEndPriceBuffer,\n\t\tforceUpToSlippage,\n\t\tbestBidPrice,\n\t\tbestAskPrice,\n\t\tensureCrossingEndPrice,\n\t});\n\n\tlet orderParams = getMarketOrderParams({\n\t\tmarketType,\n\t\tmarketIndex,\n\t\tdirection,\n\t\tbaseAssetAmount: maxLeverageSelected ? maxLeverageOrderSize : baseAmount,\n\t\treduceOnly,\n\t\tprice: allowInfSlippage ? undefined : limitPrice,\n\t\t...auctionParams,\n\t});\n\n\tif (isOracleOrder) {\n\t\t// wont work if oracle is zero\n\t\tif (!oraclePrice.eq(ZERO)) {\n\t\t\tconst oracleAuctionParams = deriveOracleAuctionParams({\n\t\t\t\tdirection: direction,\n\t\t\t\toraclePrice,\n\t\t\t\tauctionStartPrice: auctionParams.auctionStartPrice,\n\t\t\t\tauctionEndPrice: auctionParams.auctionEndPrice,\n\t\t\t\tlimitPrice: auctionParams.auctionEndPrice,\n\t\t\t\tauctionPriceCaps: auctionPriceCaps,\n\t\t\t});\n\n\t\t\torderParams = {\n\t\t\t\t...orderParams,\n\t\t\t\t...oracleAuctionParams,\n\t\t\t\tprice: undefined,\n\t\t\t\torderType: OrderType.ORACLE,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn orderParams;\n};\n\nconst getLimitAuctionParams = ({\n\tdirection,\n\tinputPrice,\n\tstartPriceFromSettings,\n\tduration,\n\tauctionStartPriceOffset,\n\toraclePriceBands,\n}: {\n\tdirection: PositionDirection;\n\tinputPrice: BigNum;\n\tstartPriceFromSettings: BN;\n\tduration: number;\n\tauctionStartPriceOffset: number;\n\toraclePriceBands?: [BN, BN];\n}): AuctionParams => {\n\tlet limitAuctionParams = EMPTY_AUCTION_PARAMS;\n\n\tconst auctionStartPriceBuffer = inputPrice.scale(\n\t\tMath.abs(auctionStartPriceOffset * 100),\n\t\t10000\n\t).val;\n\n\tif (\n\t\tisVariant(direction, 'long') &&\n\t\tstartPriceFromSettings &&\n\t\tstartPriceFromSettings.lt(inputPrice.val) &&\n\t\tstartPriceFromSettings.gt(ZERO)\n\t) {\n\t\tlimitAuctionParams = {\n\t\t\tauctionStartPrice: startPriceFromSettings.sub(auctionStartPriceBuffer),\n\t\t\tauctionEndPrice: inputPrice.val,\n\t\t\tauctionDuration: duration,\n\t\t};\n\t} else if (\n\t\tisVariant(direction, 'short') &&\n\t\tstartPriceFromSettings &&\n\t\tstartPriceFromSettings.gt(ZERO) &&\n\t\tstartPriceFromSettings.gt(inputPrice.val)\n\t) {\n\t\tlimitAuctionParams = {\n\t\t\tauctionStartPrice: startPriceFromSettings.add(auctionStartPriceBuffer),\n\t\t\tauctionEndPrice: inputPrice.val,\n\t\t\tauctionDuration: duration,\n\t\t};\n\t}\n\n\tif (oraclePriceBands && limitAuctionParams.auctionDuration) {\n\t\tconst [minPrice, maxPrice] = oraclePriceBands;\n\n\t\t// start and end price cant be outside of the oracle price bands\n\t\tlimitAuctionParams.auctionStartPrice = BN.max(\n\t\t\tBN.min(limitAuctionParams.auctionStartPrice, maxPrice),\n\t\t\tminPrice\n\t\t);\n\n\t\tlimitAuctionParams.auctionEndPrice = BN.max(\n\t\t\tBN.min(limitAuctionParams.auctionEndPrice, maxPrice),\n\t\t\tminPrice\n\t\t);\n\t}\n\n\treturn limitAuctionParams;\n};\n\nconst getPriceObject = ({\n\toraclePrice,\n\tbestOffer,\n\tentryPrice,\n\tworstPrice,\n\tmarkPrice,\n\tdirection,\n}: {\n\toraclePrice: BN;\n\tbestOffer: BN;\n\tentryPrice: BN;\n\tworstPrice: BN;\n\tmarkPrice: BN;\n\tdirection: PositionDirection;\n}) => {\n\tlet best: BN;\n\n\tconst nonZeroOptions = [oraclePrice, bestOffer, markPrice].filter(\n\t\t(price) => price !== undefined && price?.gt(ZERO)\n\t);\n\n\tif (nonZeroOptions.length === 0) {\n\t\t// console.error('Unable to create valid auction params');\n\t\treturn {\n\t\t\toracle: ZERO,\n\t\t\tbestOffer: ZERO,\n\t\t\tentry: ZERO,\n\t\t\tbest: ZERO,\n\t\t\tworst: ZERO,\n\t\t\tmark: ZERO,\n\t\t};\n\t}\n\n\tif (isVariant(direction, 'long')) {\n\t\tbest = nonZeroOptions.reduce((a, b) => (a.lt(b) ? a : b)); // lowest price\n\t} else {\n\t\tbest = nonZeroOptions.reduce((a, b) => (a.gt(b) ? a : b)); // highest price\n\t}\n\n\t// if zero values come through, fallback to nonzero value\n\treturn {\n\t\toracle: oraclePrice?.gt(ZERO) ? oraclePrice : best,\n\t\tbestOffer: bestOffer?.gt(ZERO) ? bestOffer : best,\n\t\tentry: entryPrice,\n\t\tbest,\n\t\tworst: worstPrice,\n\t\tmark: markPrice?.gt(ZERO) ? markPrice : best,\n\t};\n};\n\n/* LP Utils */\nconst getLpSharesAmountForQuote = (\n\tdriftClient: DriftClient,\n\tmarketIndex: number,\n\tquoteAmount: BN\n): BigNum => {\n\tconst tenMillionBigNum = BigNum.fromPrint('10000000', QUOTE_PRECISION_EXP);\n\n\tconst pricePerLpShare = BigNum.from(\n\t\tdriftClient.getQuoteValuePerLpShare(marketIndex),\n\t\tQUOTE_PRECISION_EXP\n\t);\n\n\treturn BigNum.from(quoteAmount, QUOTE_PRECISION_EXP)\n\t\t.scale(\n\t\t\ttenMillionBigNum.toNum(),\n\t\t\tpricePerLpShare.mul(tenMillionBigNum).toNum()\n\t\t)\n\t\t.shiftTo(AMM_RESERVE_PRECISION_EXP);\n};\n\nconst getQuoteValueForLpShares = (\n\tdriftClient: DriftClient,\n\tmarketIndex: number,\n\tsharesAmount: BN\n): BigNum => {\n\tconst pricePerLpShare = BigNum.from(\n\t\tdriftClient.getQuoteValuePerLpShare(marketIndex),\n\t\tQUOTE_PRECISION_EXP\n\t).shiftTo(AMM_RESERVE_PRECISION_EXP);\n\tconst lpSharesBigNum = BigNum.from(sharesAmount, AMM_RESERVE_PRECISION_EXP);\n\treturn lpSharesBigNum.mul(pricePerLpShare).shiftTo(QUOTE_PRECISION_EXP);\n};\n\nconst getTokenAddress = (\n\tmintAddress: PublicKey,\n\tuserPubKey: PublicKey\n): Promise<PublicKey> => {\n\treturn getAssociatedTokenAddress(mintAddress, userPubKey, true);\n};\n\nconst getBalanceFromTokenAccountResult = (account: {\n\tpubkey: PublicKey;\n\taccount: AccountInfo<ParsedAccountData>;\n}) => {\n\treturn account?.account.data?.parsed?.info?.tokenAmount?.uiAmount;\n};\n\nconst getTokenAccount = async (\n\tconnection: Connection,\n\tmintAddress: PublicKey,\n\tuserPubKey: PublicKey\n): Promise<{\n\ttokenAccount: {\n\t\tpubkey: PublicKey;\n\t\taccount: import('@solana/web3.js').AccountInfo<\n\t\t\timport('@solana/web3.js').ParsedAccountData\n\t\t>;\n\t};\n\ttokenAccountWarning: boolean;\n}> => {\n\tconst tokenAccounts = await connection.getParsedTokenAccountsByOwner(\n\t\tuserPubKey,\n\t\t{ mint: mintAddress }\n\t);\n\n\tconst associatedAddress = await getAssociatedTokenAddress(\n\t\tmintAddress,\n\t\tuserPubKey,\n\t\ttrue\n\t);\n\n\tconst targetAccount =\n\t\ttokenAccounts.value.filter((account) =>\n\t\t\taccount.pubkey.equals(associatedAddress)\n\t\t)[0] || tokenAccounts.value[0];\n\n\tconst anotherBalanceExists = tokenAccounts.value.find((account) => {\n\t\treturn (\n\t\t\t!!getBalanceFromTokenAccountResult(account) &&\n\t\t\t!account.pubkey.equals(targetAccount.pubkey)\n\t\t);\n\t});\n\n\tlet tokenAccountWarning = false;\n\n\tif (anotherBalanceExists) {\n\t\ttokenAccountWarning = true;\n\t}\n\n\treturn {\n\t\ttokenAccount: targetAccount,\n\t\ttokenAccountWarning,\n\t};\n};\n\nconst getMultipleAccounts = async (\n\tconnection: any,\n\tkeys: string[],\n\tcommitment: string\n) => {\n\tconst result = await Promise.all(\n\t\tchunks(keys, 99).map((chunk) =>\n\t\t\tgetMultipleAccountsCore(connection, chunk, commitment)\n\t\t)\n\t);\n\n\tconst array = result\n\t\t.map(\n\t\t\t(a) =>\n\t\t\t\ta.array\n\t\t\t\t\t.map((acc) => {\n\t\t\t\t\t\tif (!acc) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { data, ...rest } = acc;\n\t\t\t\t\t\tconst obj = {\n\t\t\t\t\t\t\t...rest,\n\t\t\t\t\t\t\tdata: Buffer.from(data[0], 'base64'),\n\t\t\t\t\t\t} as AccountInfo<Buffer>;\n\t\t\t\t\t\treturn obj;\n\t\t\t\t\t})\n\t\t\t\t\t.filter((_) => _) as AccountInfo<Buffer>[]\n\t\t)\n\t\t.flat();\n\treturn { keys, array };\n};\n\nconst getMultipleAccountsCore = async (\n\tconnection: any,\n\tkeys: string[],\n\tcommitment: string\n) => {\n\tconst args = connection._buildArgs([keys], commitment, 'base64');\n\n\tconst unsafeRes = await connection._rpcRequest('getMultipleAccounts', args);\n\tif (unsafeRes.error) {\n\t\tthrow new Error(\n\t\t\t'failed to get info about account ' + unsafeRes.error.message\n\t\t);\n\t}\n\n\tif (unsafeRes.result.value) {\n\t\tconst array = unsafeRes.result.value as AccountInfo<string[]>[];\n\t\treturn { keys, array };\n\t}\n\n\t// TODO: fix\n\tthrow new Error();\n};\n\nconst userExists = async (\n\tdriftClient: DriftClient,\n\tuserId: number,\n\tauthority: PublicKey\n) => {\n\tlet userAccountExists = false;\n\n\ttry {\n\t\tconst user = driftClient.getUser(userId, authority);\n\t\tuserAccountExists = await user.exists();\n\t} catch (e) {\n\t\t// user account does not exist so we leave userAccountExists false\n\t}\n\n\treturn userAccountExists;\n};\n\nfunction chunks<T>(array: T[], size: number): T[][] {\n\treturn Array.apply(0, new Array(Math.ceil(array.length / size))).map(\n\t\t(_, index) => array.slice(index * size, (index + 1) * size)\n\t);\n}\n\n/**\n * Trim trailing zeros from a numerical string\n * @param str - numerical string to format\n * @param zerosToShow - max number of zeros to show after the decimal. Similar to number.toFixed() but won't trim non-zero values. Optional, default value is 1\n */\nconst trimTrailingZeros = (str: string, zerosToShow = 1) => {\n\t// Ignore strings with no decimal point\n\tif (!str.includes('.')) return str;\n\n\tconst sides = str.split('.');\n\n\tsides[1] = sides[1].replace(/0+$/, '');\n\n\tif (sides[1].length < zerosToShow) {\n\t\tconst zerosToAdd = zerosToShow - sides[1].length;\n\t\tsides[1] = `${sides[1]}${Array(zerosToAdd).fill('0').join('')}`;\n\t}\n\n\tif (sides[1].length === 0) {\n\t\treturn sides[0];\n\t} else {\n\t\treturn sides.join('.');\n\t}\n};\n\nconst formatTokenInputCurried =\n\t(setAmount: (amount: string) => void, spotMarketConfig: SpotMarketConfig) =>\n\t(newAmount: string) => {\n\t\tif (isNaN(+newAmount)) return;\n\n\t\tif (newAmount === '') {\n\t\t\tsetAmount('');\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastChar = newAmount[newAmount.length - 1];\n\n\t\t// if last char of string is a decimal point, don't format\n\t\tif (lastChar === '.') {\n\t\t\tsetAmount(newAmount);\n\t\t\treturn;\n\t\t}\n\n\t\tif (lastChar === '0') {\n\t\t\t// if last char of string is a zero in the decimal places, cut it off if it exceeds precision\n\t\t\tconst numOfDigitsAfterDecimal = newAmount.split('.')[1]?.length ?? 0;\n\t\t\tif (numOfDigitsAfterDecimal > spotMarketConfig.precisionExp.toNumber()) {\n\t\t\t\tsetAmount(newAmount.slice(0, -1));\n\t\t\t} else {\n\t\t\t\tsetAmount(newAmount);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst formattedAmount = Number(\n\t\t\t(+newAmount).toFixed(spotMarketConfig.precisionExp.toNumber())\n\t\t);\n\t\tsetAmount(formattedAmount.toString());\n\t};\n\n// --- Export The Utils\n\nexport const COMMON_UI_UTILS = {\n\tabbreviateAddress,\n\tcalculateAverageEntryPrice,\n\tchunks,\n\tcompareSignatures,\n\tcreatePlaceholderIWallet,\n\tderiveMarketOrderParams,\n\tfetchCurrentSubaccounts,\n\tfetchUserClientsAndAccounts,\n\tformatTokenInputCurried,\n\tgetBalanceFromTokenAccountResult,\n\tgetIdAndAuthorityFromKey,\n\tgetLimitAuctionParams,\n\tgetLpSharesAmountForQuote,\n\tgetMarketAuctionParams,\n\tgetMarketKey,\n\tgetMarketOrderLimitPrice,\n\tgetMultipleAccounts,\n\tgetMultipleAccountsCore,\n\tgetPriceObject,\n\tgetQuoteValueForLpShares,\n\tgetSignatureVerificationMessageForSettings,\n\tgetTokenAccount,\n\tgetTokenAddress,\n\tgetUserKey,\n\thashSignature,\n\tinitializeAndSubscribeToNewUserAccount,\n\tuserExists,\n\tverifySignature,\n\ttrimTrailingZeros,\n\t...USER_UTILS,\n\t...TRADING_UTILS,\n\t...MARKET_UTILS,\n\t...ORDER_COMMON_UTILS,\n};\n"]}
|
|
@@ -83,7 +83,9 @@ const getOpenPositionData = (driftClient, userPositions, user, perpMarketLookup,
|
|
|
83
83
|
markPrice,
|
|
84
84
|
entryPrice,
|
|
85
85
|
exitPrice: estExitPrice,
|
|
86
|
-
liqPrice: user.
|
|
86
|
+
liqPrice: user.isPerpPositionIsolated(position)
|
|
87
|
+
? user.liquidationPrice(position.marketIndex, sdk_1.ZERO, undefined, undefined, undefined, undefined, undefined, 'Isolated')
|
|
88
|
+
: user.liquidationPrice(position.marketIndex, sdk_1.ZERO),
|
|
87
89
|
quoteAssetNotionalAmount: position.quoteAssetAmount,
|
|
88
90
|
quoteEntryAmount: position.quoteEntryAmount,
|
|
89
91
|
quoteBreakEvenAmount: position.quoteBreakEvenAmount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/common-ui-utils/user.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBASE_PRECISION_EXP,\n\tBN,\n\tBigNum,\n\tDriftClient,\n\tMarketStatus,\n\tONE,\n\tPRICE_PRECISION,\n\tPRICE_PRECISION_EXP,\n\tPerpMarketConfig,\n\tPerpPosition,\n\tPositionDirection,\n\tPublicKey,\n\tQUOTE_PRECISION_EXP,\n\tQUOTE_SPOT_MARKET_INDEX,\n\tUser,\n\tZERO,\n\tcalculateClaimablePnl,\n\tcalculateCostBasis,\n\tcalculateEntryPrice,\n\tcalculateFeesAndFundingPnl,\n\tcalculatePositionPNL,\n\tgetUserAccountPublicKeySync,\n\tcalculateUnsettledFundingPnl,\n\tisOracleValid,\n\tAMM_RESERVE_PRECISION,\n} from '@drift-labs/sdk';\nimport { OpenPosition, UIMarket } from '../types';\nimport { TRADING_UTILS } from './trading';\nimport { ENUM_UTILS } from '../utils';\n\nconst getOpenPositionData = (\n\tdriftClient: DriftClient,\n\tuserPositions: PerpPosition[],\n\tuser: User,\n\tperpMarketLookup: PerpMarketConfig[],\n\tmarkPriceCallback?: (marketIndex: number) => BN\n): OpenPosition[] => {\n\tconst oracleGuardRails = driftClient.getStateAccount().oracleGuardRails;\n\n\tconst newResult: OpenPosition[] = userPositions\n\t\t.filter(\n\t\t\t(position) =>\n\t\t\t\t!position.baseAssetAmount.eq(ZERO) ||\n\t\t\t\t!position.quoteAssetAmount.eq(ZERO) ||\n\t\t\t\t!position.lpShares.eq(ZERO)\n\t\t)\n\t\t.map((position) => {\n\t\t\tconst perpMarketConfig = perpMarketLookup[position.marketIndex];\n\t\t\tconst perpMarket = driftClient.getPerpMarketAccount(position.marketIndex);\n\n\t\t\tconst usdcSpotMarket = driftClient.getSpotMarketAccount(\n\t\t\t\tQUOTE_SPOT_MARKET_INDEX\n\t\t\t);\n\n\t\t\tconst oraclePriceData = driftClient.getOracleDataForPerpMarket(\n\t\t\t\tposition.marketIndex\n\t\t\t);\n\n\t\t\tlet oraclePrice = oraclePriceData.price;\n\n\t\t\t// mark price fetched with a callback so we don't need extra dlob server calls. fallback to oracle\n\t\t\tlet markPrice = markPriceCallback\n\t\t\t\t? markPriceCallback(position.marketIndex) ?? oraclePriceData.price\n\t\t\t\t: oraclePriceData.price;\n\n\t\t\tlet estExitPrice = user.getPositionEstimatedExitPriceAndPnl(\n\t\t\t\tposition,\n\t\t\t\tposition.baseAssetAmount\n\t\t\t)[0];\n\n\t\t\tconst entryPrice = calculateEntryPrice(position);\n\n\t\t\tconst isShort = position.baseAssetAmount.isNeg();\n\n\t\t\tif (UIMarket.checkIsPredictionMarket(perpMarketConfig)) {\n\t\t\t\tconst isResolved =\n\t\t\t\t\tENUM_UTILS.match(perpMarket?.status, MarketStatus.SETTLEMENT) ||\n\t\t\t\t\tENUM_UTILS.match(perpMarket?.status, MarketStatus.DELISTED);\n\n\t\t\t\tif (isResolved) {\n\t\t\t\t\tconst resolvedToNo = perpMarket.expiryPrice.lte(\n\t\t\t\t\t\tZERO.add(perpMarket.amm.orderTickSize)\n\t\t\t\t\t);\n\n\t\t\t\t\tconst price = resolvedToNo\n\t\t\t\t\t\t? ZERO.mul(PRICE_PRECISION)\n\t\t\t\t\t\t: ONE.mul(PRICE_PRECISION);\n\n\t\t\t\t\testExitPrice = price;\n\t\t\t\t\tmarkPrice = price;\n\t\t\t\t\toraclePrice = price;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if for any reason oracle or mark price blips to 0, fallback to the other one so we don't show a crazy pnl\n\t\t\tif (markPrice.lte(ZERO) && oraclePrice.gt(ZERO)) {\n\t\t\t\tmarkPrice = oraclePrice;\n\t\t\t}\n\n\t\t\tif (oraclePrice.lte(ZERO) && markPrice.gt(ZERO)) {\n\t\t\t\toraclePrice = markPrice;\n\t\t\t}\n\n\t\t\tconst pnlVsMark = TRADING_UTILS.calculatePotentialProfit({\n\t\t\t\tcurrentPositionSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\tcurrentPositionDirection: isShort\n\t\t\t\t\t? PositionDirection.SHORT\n\t\t\t\t\t: PositionDirection.LONG,\n\t\t\t\tcurrentPositionEntryPrice: BigNum.from(entryPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttradeDirection: isShort\n\t\t\t\t\t? PositionDirection.LONG\n\t\t\t\t\t: PositionDirection.SHORT,\n\t\t\t\texitBaseSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\texitPrice: BigNum.from(markPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttakerFeeBps: 0,\n\t\t\t}).estimatedProfit.shiftTo(QUOTE_PRECISION_EXP).val;\n\n\t\t\tconst pnlVsOracle = TRADING_UTILS.calculatePotentialProfit({\n\t\t\t\tcurrentPositionSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\tcurrentPositionDirection: isShort\n\t\t\t\t\t? PositionDirection.SHORT\n\t\t\t\t\t: PositionDirection.LONG,\n\t\t\t\tcurrentPositionEntryPrice: BigNum.from(entryPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttradeDirection: isShort\n\t\t\t\t\t? PositionDirection.LONG\n\t\t\t\t\t: PositionDirection.SHORT,\n\t\t\t\texitBaseSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\texitPrice: BigNum.from(oraclePrice, PRICE_PRECISION_EXP),\n\t\t\t\ttakerFeeBps: 0,\n\t\t\t}).estimatedProfit.shiftTo(QUOTE_PRECISION_EXP).val;\n\n\t\t\treturn {\n\t\t\t\tmarketIndex: position.marketIndex,\n\t\t\t\tmarketSymbol: perpMarketConfig.symbol,\n\t\t\t\tdirection: isShort ? 'short' : 'long',\n\t\t\t\tnotional: position.baseAssetAmount\n\t\t\t\t\t.abs()\n\t\t\t\t\t.mul(markPrice)\n\t\t\t\t\t.div(AMM_RESERVE_PRECISION),\n\t\t\t\tbaseSize: position.baseAssetAmount,\n\t\t\t\tmarkPrice,\n\t\t\t\tentryPrice,\n\t\t\t\texitPrice: estExitPrice,\n\t\t\t\tliqPrice: user.liquidationPrice(position.marketIndex, ZERO),\n\t\t\t\tquoteAssetNotionalAmount: position.quoteAssetAmount,\n\t\t\t\tquoteEntryAmount: position.quoteEntryAmount,\n\t\t\t\tquoteBreakEvenAmount: position.quoteBreakEvenAmount,\n\t\t\t\tpnlVsMark,\n\t\t\t\tpnlVsOracle,\n\t\t\t\tunsettledPnl: calculateClaimablePnl(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\tusdcSpotMarket,\n\t\t\t\t\tposition,\n\t\t\t\t\toraclePriceData\n\t\t\t\t),\n\t\t\t\tunsettledFundingPnl: calculateUnsettledFundingPnl(perpMarket, position),\n\t\t\t\t// Includes both settled and unsettled funding as well as fees\n\t\t\t\tfeesAndFundingPnl: calculateFeesAndFundingPnl(perpMarket, position),\n\t\t\t\ttotalUnrealizedPnl: calculatePositionPNL(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\tposition,\n\t\t\t\t\ttrue,\n\t\t\t\t\toraclePriceData\n\t\t\t\t),\n\t\t\t\tunrealizedFundingPnl: user.getUnrealizedFundingPNL(\n\t\t\t\t\tposition.marketIndex\n\t\t\t\t),\n\t\t\t\tlastCumulativeFundingRate: position.lastCumulativeFundingRate,\n\t\t\t\topenOrders: position.openOrders,\n\t\t\t\tcostBasis: calculateCostBasis(position),\n\t\t\t\trealizedPnl: position.settledPnl,\n\t\t\t\tpnlIsClaimable: isOracleValid(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\toraclePriceData,\n\t\t\t\t\toracleGuardRails,\n\t\t\t\t\tperpMarket.amm.lastUpdateSlot?.toNumber()\n\t\t\t\t),\n\t\t\t\tlpShares: position.lpShares,\n\t\t\t\tremainderBaseAmount: position.remainderBaseAssetAmount ?? 0,\n\t\t\t\tlpDeriskPrice: user.liquidationPrice(\n\t\t\t\t\tposition.marketIndex,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t'Initial',\n\t\t\t\t\ttrue\n\t\t\t\t),\n\t\t\t\tmaxMarginRatio: position.maxMarginRatio,\n\t\t\t};\n\t\t});\n\n\treturn newResult;\n};\n\nconst checkIfUserAccountExists = async (\n\tdriftClient: DriftClient,\n\tconfig:\n\t\t| {\n\t\t\t\ttype: 'userPubKey';\n\t\t\t\tuserPubKey: PublicKey;\n\t\t }\n\t\t| {\n\t\t\t\ttype: 'subAccountId';\n\t\t\t\tsubAccountId: number;\n\t\t\t\tauthority: PublicKey;\n\t\t }\n) => {\n\tlet userPubKey: PublicKey;\n\n\tif (config.type === 'userPubKey') {\n\t\tuserPubKey = config.userPubKey;\n\t} else {\n\t\tuserPubKey = getUserAccountPublicKeySync(\n\t\t\tdriftClient.program.programId,\n\t\t\tconfig.authority,\n\t\t\tconfig.subAccountId\n\t\t);\n\t}\n\n\tconst accountInfo = await driftClient.connection.getAccountInfo(userPubKey);\n\n\treturn accountInfo !== null;\n};\n\n/**\n * A user's max leverage for a market is stored on-chain in the `PerpPosition` struct of the `UserAccount`.\n * There are a few scenarios for how a market's max leverage is defined:\n *\n * 1. When the user does not have a position (\"empty\" or not) in the market in their `UserAccount` data,\n * and creates an order for the market, an \"empty\" `PerpPosition` will be upsert to the `UserAccount` data,\n * and will contain the max margin ratio set by the user. Note that the `UserAccount` data can store up\n * to 8 `PerpPosition` structs, and most of the time the majority of the `PerpPosition` structs will be\n * \"empty\" if the user does not have the max 8 perp positions open. The max leverage is then derived from\n * the max margin ratio set in the `PerpPosition` struct.\n *\n * 2. If the user has a position (\"empty\" or not), but no open orders and is provided with a saved max leverage,\n * the saved max leverage is used.\n *\n * 3. When the user does not have a position (\"empty\" or not), it is expected of the UI to store and persist\n * the max leverage in the UI client.\n *\n * 4. In cases where the user has a position before the market max leverage feature was shipped, the\n * position is not expected to have a max margin ratio set, and the UI should display the regular max\n * leverage for the market, unless the user is already in High Leverage Mode, in which case the UI should\n * display the high leverage max leverage for the market (if any).\n */\nconst getUserMaxLeverageForMarket = (\n\tuser: User | undefined,\n\tmarketIndex: number,\n\tmarketLeverageDetails: {\n\t\tregularMaxLeverage: number;\n\t\thighLeverageMaxLeverage: number;\n\t\thasHighLeverage: boolean;\n\t},\n\tuiSavedMaxLeverage?: number\n) => {\n\t// if no saved max leverage is provided, return the regular max leverage for the market\n\tconst DEFAULT_MAX_LEVERAGE =\n\t\tuiSavedMaxLeverage ?? marketLeverageDetails.regularMaxLeverage;\n\n\tif (!user) {\n\t\treturn DEFAULT_MAX_LEVERAGE;\n\t}\n\n\tconst openOrClosedPosition = user.getPerpPosition(marketIndex); // this position does not have to be open, it can be a closed position (a.k.a \"empty\") but has max margin ratio set.\n\n\tif (!openOrClosedPosition) {\n\t\treturn DEFAULT_MAX_LEVERAGE;\n\t}\n\n\tconst positionHasMaxMarginRatioSet = !!openOrClosedPosition.maxMarginRatio;\n\tconst isPositionOpen = !openOrClosedPosition.baseAssetAmount.eq(ZERO);\n\tconst hasNoOpenOrders = openOrClosedPosition.openOrders === 0;\n\n\tif (positionHasMaxMarginRatioSet) {\n\t\t// Special case: open position with no orders - use UI saved value if available\n\t\tif (isPositionOpen && hasNoOpenOrders && uiSavedMaxLeverage) {\n\t\t\treturn uiSavedMaxLeverage;\n\t\t}\n\n\t\treturn parseFloat(\n\t\t\t((1 / openOrClosedPosition.maxMarginRatio) * 10000).toFixed(2)\n\t\t);\n\t}\n\n\tif (isPositionOpen) {\n\t\t// user has an existing position from before PML ship (this means no max margin ratio set onchain yet)\n\t\t// display max leverage for the leverage mode their account is in\n\t\tconst isUserInHighLeverageMode = user.isHighLeverageMode('Initial');\n\t\tconst grandfatheredMaxLev = isUserInHighLeverageMode\n\t\t\t? marketLeverageDetails.hasHighLeverage\n\t\t\t\t? marketLeverageDetails.highLeverageMaxLeverage\n\t\t\t\t: marketLeverageDetails.regularMaxLeverage\n\t\t\t: marketLeverageDetails.regularMaxLeverage;\n\t\treturn grandfatheredMaxLev;\n\t}\n\n\t// user has closed position with no margin ratio set, return default value\n\treturn DEFAULT_MAX_LEVERAGE;\n};\n\nexport const USER_UTILS = {\n\tgetOpenPositionData,\n\tcheckIfUserAccountExists,\n\tgetUserMaxLeverageForMarket,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/common-ui-utils/user.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBASE_PRECISION_EXP,\n\tBN,\n\tBigNum,\n\tDriftClient,\n\tMarketStatus,\n\tONE,\n\tPRICE_PRECISION,\n\tPRICE_PRECISION_EXP,\n\tPerpMarketConfig,\n\tPerpPosition,\n\tPositionDirection,\n\tPublicKey,\n\tQUOTE_PRECISION_EXP,\n\tQUOTE_SPOT_MARKET_INDEX,\n\tUser,\n\tZERO,\n\tcalculateClaimablePnl,\n\tcalculateCostBasis,\n\tcalculateEntryPrice,\n\tcalculateFeesAndFundingPnl,\n\tcalculatePositionPNL,\n\tgetUserAccountPublicKeySync,\n\tcalculateUnsettledFundingPnl,\n\tisOracleValid,\n\tAMM_RESERVE_PRECISION,\n} from '@drift-labs/sdk';\nimport { OpenPosition, UIMarket } from '../types';\nimport { TRADING_UTILS } from './trading';\nimport { ENUM_UTILS } from '../utils';\n\nconst getOpenPositionData = (\n\tdriftClient: DriftClient,\n\tuserPositions: PerpPosition[],\n\tuser: User,\n\tperpMarketLookup: PerpMarketConfig[],\n\tmarkPriceCallback?: (marketIndex: number) => BN\n): OpenPosition[] => {\n\tconst oracleGuardRails = driftClient.getStateAccount().oracleGuardRails;\n\n\tconst newResult: OpenPosition[] = userPositions\n\t\t.filter(\n\t\t\t(position) =>\n\t\t\t\t!position.baseAssetAmount.eq(ZERO) ||\n\t\t\t\t!position.quoteAssetAmount.eq(ZERO) ||\n\t\t\t\t!position.lpShares.eq(ZERO)\n\t\t)\n\t\t.map((position) => {\n\t\t\tconst perpMarketConfig = perpMarketLookup[position.marketIndex];\n\t\t\tconst perpMarket = driftClient.getPerpMarketAccount(position.marketIndex);\n\n\t\t\tconst usdcSpotMarket = driftClient.getSpotMarketAccount(\n\t\t\t\tQUOTE_SPOT_MARKET_INDEX\n\t\t\t);\n\n\t\t\tconst oraclePriceData = driftClient.getOracleDataForPerpMarket(\n\t\t\t\tposition.marketIndex\n\t\t\t);\n\n\t\t\tlet oraclePrice = oraclePriceData.price;\n\n\t\t\t// mark price fetched with a callback so we don't need extra dlob server calls. fallback to oracle\n\t\t\tlet markPrice = markPriceCallback\n\t\t\t\t? markPriceCallback(position.marketIndex) ?? oraclePriceData.price\n\t\t\t\t: oraclePriceData.price;\n\n\t\t\tlet estExitPrice = user.getPositionEstimatedExitPriceAndPnl(\n\t\t\t\tposition,\n\t\t\t\tposition.baseAssetAmount\n\t\t\t)[0];\n\n\t\t\tconst entryPrice = calculateEntryPrice(position);\n\n\t\t\tconst isShort = position.baseAssetAmount.isNeg();\n\n\t\t\tif (UIMarket.checkIsPredictionMarket(perpMarketConfig)) {\n\t\t\t\tconst isResolved =\n\t\t\t\t\tENUM_UTILS.match(perpMarket?.status, MarketStatus.SETTLEMENT) ||\n\t\t\t\t\tENUM_UTILS.match(perpMarket?.status, MarketStatus.DELISTED);\n\n\t\t\t\tif (isResolved) {\n\t\t\t\t\tconst resolvedToNo = perpMarket.expiryPrice.lte(\n\t\t\t\t\t\tZERO.add(perpMarket.amm.orderTickSize)\n\t\t\t\t\t);\n\n\t\t\t\t\tconst price = resolvedToNo\n\t\t\t\t\t\t? ZERO.mul(PRICE_PRECISION)\n\t\t\t\t\t\t: ONE.mul(PRICE_PRECISION);\n\n\t\t\t\t\testExitPrice = price;\n\t\t\t\t\tmarkPrice = price;\n\t\t\t\t\toraclePrice = price;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if for any reason oracle or mark price blips to 0, fallback to the other one so we don't show a crazy pnl\n\t\t\tif (markPrice.lte(ZERO) && oraclePrice.gt(ZERO)) {\n\t\t\t\tmarkPrice = oraclePrice;\n\t\t\t}\n\n\t\t\tif (oraclePrice.lte(ZERO) && markPrice.gt(ZERO)) {\n\t\t\t\toraclePrice = markPrice;\n\t\t\t}\n\n\t\t\tconst pnlVsMark = TRADING_UTILS.calculatePotentialProfit({\n\t\t\t\tcurrentPositionSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\tcurrentPositionDirection: isShort\n\t\t\t\t\t? PositionDirection.SHORT\n\t\t\t\t\t: PositionDirection.LONG,\n\t\t\t\tcurrentPositionEntryPrice: BigNum.from(entryPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttradeDirection: isShort\n\t\t\t\t\t? PositionDirection.LONG\n\t\t\t\t\t: PositionDirection.SHORT,\n\t\t\t\texitBaseSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\texitPrice: BigNum.from(markPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttakerFeeBps: 0,\n\t\t\t}).estimatedProfit.shiftTo(QUOTE_PRECISION_EXP).val;\n\n\t\t\tconst pnlVsOracle = TRADING_UTILS.calculatePotentialProfit({\n\t\t\t\tcurrentPositionSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\tcurrentPositionDirection: isShort\n\t\t\t\t\t? PositionDirection.SHORT\n\t\t\t\t\t: PositionDirection.LONG,\n\t\t\t\tcurrentPositionEntryPrice: BigNum.from(entryPrice, PRICE_PRECISION_EXP),\n\t\t\t\ttradeDirection: isShort\n\t\t\t\t\t? PositionDirection.LONG\n\t\t\t\t\t: PositionDirection.SHORT,\n\t\t\t\texitBaseSize: BigNum.from(\n\t\t\t\t\tposition.baseAssetAmount.abs(),\n\t\t\t\t\tBASE_PRECISION_EXP\n\t\t\t\t),\n\t\t\t\texitPrice: BigNum.from(oraclePrice, PRICE_PRECISION_EXP),\n\t\t\t\ttakerFeeBps: 0,\n\t\t\t}).estimatedProfit.shiftTo(QUOTE_PRECISION_EXP).val;\n\n\t\t\treturn {\n\t\t\t\tmarketIndex: position.marketIndex,\n\t\t\t\tmarketSymbol: perpMarketConfig.symbol,\n\t\t\t\tdirection: isShort ? 'short' : 'long',\n\t\t\t\tnotional: position.baseAssetAmount\n\t\t\t\t\t.abs()\n\t\t\t\t\t.mul(markPrice)\n\t\t\t\t\t.div(AMM_RESERVE_PRECISION),\n\t\t\t\tbaseSize: position.baseAssetAmount,\n\t\t\t\tmarkPrice,\n\t\t\t\tentryPrice,\n\t\t\t\texitPrice: estExitPrice,\n\t\t\t\tliqPrice: user.isPerpPositionIsolated(position)\n\t\t\t\t\t? user.liquidationPrice(\n\t\t\t\t\t\t\tposition.marketIndex,\n\t\t\t\t\t\t\tZERO,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t'Isolated'\n\t\t\t\t\t )\n\t\t\t\t\t: user.liquidationPrice(position.marketIndex, ZERO),\n\t\t\t\tquoteAssetNotionalAmount: position.quoteAssetAmount,\n\t\t\t\tquoteEntryAmount: position.quoteEntryAmount,\n\t\t\t\tquoteBreakEvenAmount: position.quoteBreakEvenAmount,\n\t\t\t\tpnlVsMark,\n\t\t\t\tpnlVsOracle,\n\t\t\t\tunsettledPnl: calculateClaimablePnl(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\tusdcSpotMarket,\n\t\t\t\t\tposition,\n\t\t\t\t\toraclePriceData\n\t\t\t\t),\n\t\t\t\tunsettledFundingPnl: calculateUnsettledFundingPnl(perpMarket, position),\n\t\t\t\t// Includes both settled and unsettled funding as well as fees\n\t\t\t\tfeesAndFundingPnl: calculateFeesAndFundingPnl(perpMarket, position),\n\t\t\t\ttotalUnrealizedPnl: calculatePositionPNL(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\tposition,\n\t\t\t\t\ttrue,\n\t\t\t\t\toraclePriceData\n\t\t\t\t),\n\t\t\t\tunrealizedFundingPnl: user.getUnrealizedFundingPNL(\n\t\t\t\t\tposition.marketIndex\n\t\t\t\t),\n\t\t\t\tlastCumulativeFundingRate: position.lastCumulativeFundingRate,\n\t\t\t\topenOrders: position.openOrders,\n\t\t\t\tcostBasis: calculateCostBasis(position),\n\t\t\t\trealizedPnl: position.settledPnl,\n\t\t\t\tpnlIsClaimable: isOracleValid(\n\t\t\t\t\tperpMarket,\n\t\t\t\t\toraclePriceData,\n\t\t\t\t\toracleGuardRails,\n\t\t\t\t\tperpMarket.amm.lastUpdateSlot?.toNumber()\n\t\t\t\t),\n\t\t\t\tlpShares: position.lpShares,\n\t\t\t\tremainderBaseAmount: position.remainderBaseAssetAmount ?? 0,\n\t\t\t\tlpDeriskPrice: user.liquidationPrice(\n\t\t\t\t\tposition.marketIndex,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t'Initial',\n\t\t\t\t\ttrue\n\t\t\t\t),\n\t\t\t\tmaxMarginRatio: position.maxMarginRatio,\n\t\t\t};\n\t\t});\n\n\treturn newResult;\n};\n\nconst checkIfUserAccountExists = async (\n\tdriftClient: DriftClient,\n\tconfig:\n\t\t| {\n\t\t\t\ttype: 'userPubKey';\n\t\t\t\tuserPubKey: PublicKey;\n\t\t }\n\t\t| {\n\t\t\t\ttype: 'subAccountId';\n\t\t\t\tsubAccountId: number;\n\t\t\t\tauthority: PublicKey;\n\t\t }\n) => {\n\tlet userPubKey: PublicKey;\n\n\tif (config.type === 'userPubKey') {\n\t\tuserPubKey = config.userPubKey;\n\t} else {\n\t\tuserPubKey = getUserAccountPublicKeySync(\n\t\t\tdriftClient.program.programId,\n\t\t\tconfig.authority,\n\t\t\tconfig.subAccountId\n\t\t);\n\t}\n\n\tconst accountInfo = await driftClient.connection.getAccountInfo(userPubKey);\n\n\treturn accountInfo !== null;\n};\n\n/**\n * A user's max leverage for a market is stored on-chain in the `PerpPosition` struct of the `UserAccount`.\n * There are a few scenarios for how a market's max leverage is defined:\n *\n * 1. When the user does not have a position (\"empty\" or not) in the market in their `UserAccount` data,\n * and creates an order for the market, an \"empty\" `PerpPosition` will be upsert to the `UserAccount` data,\n * and will contain the max margin ratio set by the user. Note that the `UserAccount` data can store up\n * to 8 `PerpPosition` structs, and most of the time the majority of the `PerpPosition` structs will be\n * \"empty\" if the user does not have the max 8 perp positions open. The max leverage is then derived from\n * the max margin ratio set in the `PerpPosition` struct.\n *\n * 2. If the user has a position (\"empty\" or not), but no open orders and is provided with a saved max leverage,\n * the saved max leverage is used.\n *\n * 3. When the user does not have a position (\"empty\" or not), it is expected of the UI to store and persist\n * the max leverage in the UI client.\n *\n * 4. In cases where the user has a position before the market max leverage feature was shipped, the\n * position is not expected to have a max margin ratio set, and the UI should display the regular max\n * leverage for the market, unless the user is already in High Leverage Mode, in which case the UI should\n * display the high leverage max leverage for the market (if any).\n */\nconst getUserMaxLeverageForMarket = (\n\tuser: User | undefined,\n\tmarketIndex: number,\n\tmarketLeverageDetails: {\n\t\tregularMaxLeverage: number;\n\t\thighLeverageMaxLeverage: number;\n\t\thasHighLeverage: boolean;\n\t},\n\tuiSavedMaxLeverage?: number\n) => {\n\t// if no saved max leverage is provided, return the regular max leverage for the market\n\tconst DEFAULT_MAX_LEVERAGE =\n\t\tuiSavedMaxLeverage ?? marketLeverageDetails.regularMaxLeverage;\n\n\tif (!user) {\n\t\treturn DEFAULT_MAX_LEVERAGE;\n\t}\n\n\tconst openOrClosedPosition = user.getPerpPosition(marketIndex); // this position does not have to be open, it can be a closed position (a.k.a \"empty\") but has max margin ratio set.\n\n\tif (!openOrClosedPosition) {\n\t\treturn DEFAULT_MAX_LEVERAGE;\n\t}\n\n\tconst positionHasMaxMarginRatioSet = !!openOrClosedPosition.maxMarginRatio;\n\tconst isPositionOpen = !openOrClosedPosition.baseAssetAmount.eq(ZERO);\n\tconst hasNoOpenOrders = openOrClosedPosition.openOrders === 0;\n\n\tif (positionHasMaxMarginRatioSet) {\n\t\t// Special case: open position with no orders - use UI saved value if available\n\t\tif (isPositionOpen && hasNoOpenOrders && uiSavedMaxLeverage) {\n\t\t\treturn uiSavedMaxLeverage;\n\t\t}\n\n\t\treturn parseFloat(\n\t\t\t((1 / openOrClosedPosition.maxMarginRatio) * 10000).toFixed(2)\n\t\t);\n\t}\n\n\tif (isPositionOpen) {\n\t\t// user has an existing position from before PML ship (this means no max margin ratio set onchain yet)\n\t\t// display max leverage for the leverage mode their account is in\n\t\tconst isUserInHighLeverageMode = user.isHighLeverageMode('Initial');\n\t\tconst grandfatheredMaxLev = isUserInHighLeverageMode\n\t\t\t? marketLeverageDetails.hasHighLeverage\n\t\t\t\t? marketLeverageDetails.highLeverageMaxLeverage\n\t\t\t\t: marketLeverageDetails.regularMaxLeverage\n\t\t\t: marketLeverageDetails.regularMaxLeverage;\n\t\treturn grandfatheredMaxLev;\n\t}\n\n\t// user has closed position with no margin ratio set, return default value\n\treturn DEFAULT_MAX_LEVERAGE;\n};\n\nexport const USER_UTILS = {\n\tgetOpenPositionData,\n\tcheckIfUserAccountExists,\n\tgetUserMaxLeverageForMarket,\n};\n"]}
|
|
@@ -22,16 +22,16 @@ export declare class DriftL2OrderbookManager {
|
|
|
22
22
|
marketSlot: number;
|
|
23
23
|
marketIndex: number;
|
|
24
24
|
marketName: string;
|
|
25
|
-
marketType?: import("
|
|
26
|
-
oracleData: import("
|
|
27
|
-
markPrice:
|
|
28
|
-
bestBidPrice:
|
|
29
|
-
bestAskPrice:
|
|
30
|
-
spreadPct:
|
|
31
|
-
spreadQuote:
|
|
32
|
-
mmOracleData?: import("
|
|
33
|
-
asks: import("
|
|
34
|
-
bids: import("
|
|
25
|
+
marketType?: import("@drift-labs/sdk").MarketType;
|
|
26
|
+
oracleData: import("@drift-labs/sdk").OraclePriceData;
|
|
27
|
+
markPrice: BN;
|
|
28
|
+
bestBidPrice: BN;
|
|
29
|
+
bestAskPrice: BN;
|
|
30
|
+
spreadPct: BN;
|
|
31
|
+
spreadQuote: BN;
|
|
32
|
+
mmOracleData?: import("@drift-labs/sdk").MMOraclePriceData;
|
|
33
|
+
asks: import("@drift-labs/sdk").L2Level[];
|
|
34
|
+
bids: import("@drift-labs/sdk").L2Level[];
|
|
35
35
|
slot?: number;
|
|
36
36
|
};
|
|
37
37
|
get subscriptionConfig(): DriftL2OrderbookSubscription;
|
|
@@ -326,6 +326,7 @@ class DriftOperations {
|
|
|
326
326
|
optionalAuctionParamsInputs: params.orderConfig.optionalAuctionParamsInputs,
|
|
327
327
|
builderParams: params.builderParams,
|
|
328
328
|
positionMaxLeverage: params.positionMaxLeverage,
|
|
329
|
+
isolatedPositionDeposit: params.isolatedPositionDeposit,
|
|
329
330
|
});
|
|
330
331
|
return swiftOrderResult;
|
|
331
332
|
}
|
|
@@ -342,6 +343,7 @@ class DriftOperations {
|
|
|
342
343
|
dlobServerHttpUrl: this.dlobServerHttpUrl,
|
|
343
344
|
useSwift: false,
|
|
344
345
|
positionMaxLeverage: params.positionMaxLeverage,
|
|
346
|
+
isolatedPositionDeposit: params.isolatedPositionDeposit,
|
|
345
347
|
});
|
|
346
348
|
const { txSig } = await this.driftClient.sendTransaction(result);
|
|
347
349
|
return txSig;
|
|
@@ -379,6 +381,7 @@ class DriftOperations {
|
|
|
379
381
|
},
|
|
380
382
|
builderParams: params.builderParams,
|
|
381
383
|
positionMaxLeverage: params.positionMaxLeverage,
|
|
384
|
+
isolatedPositionDeposit: params.isolatedPositionDeposit,
|
|
382
385
|
});
|
|
383
386
|
return swiftOrderResult;
|
|
384
387
|
}
|
|
@@ -400,6 +403,7 @@ class DriftOperations {
|
|
|
400
403
|
useSwift: false,
|
|
401
404
|
txParams: this.getTxParams(),
|
|
402
405
|
positionMaxLeverage: params.positionMaxLeverage,
|
|
406
|
+
isolatedPositionDeposit: params.isolatedPositionDeposit,
|
|
403
407
|
});
|
|
404
408
|
const { txSig } = await this.driftClient.sendTransaction(txn);
|
|
405
409
|
return txSig;
|