@drift-labs/common 1.0.1 → 1.0.3

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.
Files changed (92) hide show
  1. package/lib/clients/swiftClient.d.ts +5 -1
  2. package/lib/clients/swiftClient.js +17 -7
  3. package/lib/clients/swiftClient.js.map +1 -1
  4. package/lib/clients/tvFeed.d.ts +3 -1
  5. package/lib/clients/tvFeed.js +27 -13
  6. package/lib/clients/tvFeed.js.map +1 -1
  7. package/lib/common-ui-utils/commonUiUtils.d.ts +7 -0
  8. package/lib/common-ui-utils/market.d.ts +6 -1
  9. package/lib/common-ui-utils/market.js +46 -0
  10. package/lib/common-ui-utils/market.js.map +1 -1
  11. package/lib/common-ui-utils/order.d.ts +8 -1
  12. package/lib/common-ui-utils/order.js +39 -0
  13. package/lib/common-ui-utils/order.js.map +1 -1
  14. package/lib/common-ui-utils/user.js +1 -0
  15. package/lib/common-ui-utils/user.js.map +1 -1
  16. package/lib/constants/markets.d.ts +1 -0
  17. package/lib/constants/markets.js +2 -1
  18. package/lib/constants/markets.js.map +1 -1
  19. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.d.ts +1 -6
  20. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +17 -28
  21. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -1
  22. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +6 -2
  23. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -1
  24. package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +1 -2
  25. package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
  26. package/lib/drift/Drift/clients/CentralServerDrift.d.ts +10 -5
  27. package/lib/drift/Drift/clients/CentralServerDrift.js +5 -48
  28. package/lib/drift/Drift/clients/CentralServerDrift.js.map +1 -1
  29. package/lib/drift/Drift/constants/errors.d.ts +9 -1
  30. package/lib/drift/Drift/constants/errors.js +13 -2
  31. package/lib/drift/Drift/constants/errors.js.map +1 -1
  32. package/lib/drift/Drift/data/PollingDlob.d.ts +0 -20
  33. package/lib/drift/Drift/data/PollingDlob.js +2 -78
  34. package/lib/drift/Drift/data/PollingDlob.js.map +1 -1
  35. package/lib/drift/base/actions/perp/settlePnl.d.ts +3 -3
  36. package/lib/drift/base/actions/perp/settlePnl.js +3 -3
  37. package/lib/drift/base/actions/perp/settlePnl.js.map +1 -1
  38. package/lib/drift/base/actions/spot/index.d.ts +0 -1
  39. package/lib/drift/base/actions/spot/index.js +0 -1
  40. package/lib/drift/base/actions/spot/index.js.map +1 -1
  41. package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.d.ts +81 -0
  42. package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.js +255 -0
  43. package/lib/drift/base/actions/trade/openPerpOrder/dlobServer/index.js.map +1 -0
  44. package/lib/drift/base/actions/trade/openPerpOrder/index.d.ts +2 -0
  45. package/lib/drift/base/actions/trade/openPerpOrder/index.js +2 -0
  46. package/lib/drift/base/actions/trade/openPerpOrder/index.js.map +1 -1
  47. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +53 -43
  48. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +180 -201
  49. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
  50. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +37 -9
  51. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +194 -83
  52. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
  53. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +40 -27
  54. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +111 -32
  55. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
  56. package/lib/drift/base/actions/trade/openPerpOrder/types.d.ts +64 -0
  57. package/lib/drift/base/actions/trade/openPerpOrder/types.js +3 -0
  58. package/lib/drift/base/actions/trade/openPerpOrder/types.js.map +1 -0
  59. package/lib/drift/base/actions/user/create.js +9 -3
  60. package/lib/drift/base/actions/user/create.js.map +1 -1
  61. package/lib/drift/cli.js +114 -71
  62. package/lib/drift/cli.js.map +1 -1
  63. package/lib/drift/index.d.ts +1 -0
  64. package/lib/drift/index.js +1 -0
  65. package/lib/drift/index.js.map +1 -1
  66. package/lib/drift/utils/auctionParamsResponseMapper.d.ts +25 -23
  67. package/lib/drift/utils/auctionParamsResponseMapper.js +4 -6
  68. package/lib/drift/utils/auctionParamsResponseMapper.js.map +1 -1
  69. package/lib/drift/utils/index.d.ts +1 -1
  70. package/lib/drift/utils/index.js +1 -4
  71. package/lib/drift/utils/index.js.map +1 -1
  72. package/lib/drift/utils/orderParams.d.ts +3 -28
  73. package/lib/drift/utils/orderParams.js +9 -1
  74. package/lib/drift/utils/orderParams.js.map +1 -1
  75. package/lib/index.d.ts +2 -0
  76. package/lib/index.js +2 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/types/user.d.ts +1 -0
  79. package/lib/types/user.js.map +1 -1
  80. package/lib/utils/fetch.d.ts +1 -0
  81. package/lib/utils/fetch.js +11 -0
  82. package/lib/utils/fetch.js.map +1 -0
  83. package/lib/utils/orderbook/index.d.ts +18 -0
  84. package/lib/utils/orderbook/index.js +68 -1
  85. package/lib/utils/orderbook/index.js.map +1 -1
  86. package/lib/utils/priceImpact.d.ts +14 -0
  87. package/lib/utils/priceImpact.js +71 -0
  88. package/lib/utils/priceImpact.js.map +1 -0
  89. package/package.json +1 -1
  90. package/lib/drift/base/actions/spot/borrow.d.ts +0 -1
  91. package/lib/drift/base/actions/spot/borrow.js +0 -8
  92. package/lib/drift/base/actions/spot/borrow.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { AccountInfo, Connection, PublicKey } from '@solana/web3.js';
3
- import { DriftClient, MarketType, OrderType } from '@drift-labs/sdk';
3
+ import { DriftClient, MarketType, OrderType, SignedMsgOrderParamsDelegateMessage, SignedMsgOrderParamsMessage } from '@drift-labs/sdk';
4
4
  import { Observable, Subscriber } from 'rxjs';
5
5
  export type SwiftServerOrderProcessResponse = {
6
6
  error?: string;
@@ -28,6 +28,10 @@ export interface SwiftOrderConfirmedEvent extends BaseSwiftOrderEvent {
28
28
  orderId: string;
29
29
  }
30
30
  export type SwiftOrderEvent = SwiftOrderErroredEvent | SwiftOrderConfirmedEvent | SwiftOrderSentEvent;
31
+ export type SwiftOrderEventWithParams<T extends SwiftOrderEvent> = T & {
32
+ swiftOrderUuid: Uint8Array;
33
+ orderParamsMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage;
34
+ };
31
35
  export declare class SwiftClient {
32
36
  private static baseUrl;
33
37
  private static swiftClientConsumer?;
@@ -57,15 +57,20 @@ class SwiftClient {
57
57
  try {
58
58
  resBody =
59
59
  (await response.json());
60
+ res({
61
+ success: response.ok,
62
+ body: resBody,
63
+ status: response.status,
64
+ });
60
65
  }
61
66
  catch (err) {
62
67
  (0, logger_1.allEnvDlog)('swiftClient', 'Error reading response body', err);
68
+ res({
69
+ success: false,
70
+ body: err,
71
+ status: response.status,
72
+ });
63
73
  }
64
- res({
65
- success: response.ok,
66
- body: resBody,
67
- status: response.status,
68
- });
69
74
  })
70
75
  .catch((err) => {
71
76
  res({ success: false, body: err, status: 0 });
@@ -73,7 +78,7 @@ class SwiftClient {
73
78
  });
74
79
  }
75
80
  static async sendSwiftOrder(marketIndex, marketType, message, signature, takerPubkey, signingAuthority) {
76
- var _a, _b;
81
+ var _a, _b, _c;
77
82
  const requestPayload = {
78
83
  market_index: marketIndex,
79
84
  market_type: (0, sdk_1.isVariant)(marketType, 'perp') ? 'perp' : 'spot',
@@ -87,7 +92,8 @@ class SwiftClient {
87
92
  console.error(`Non-200 status code received for sent Swift order: ${response.status}`);
88
93
  (0, logger_1.allEnvDlog)('swiftClient', 'full non-200 response body', response.body);
89
94
  return {
90
- message: ((_b = response.body) === null || _b === void 0 ? void 0 : _b.message) ||
95
+ message: ((_b = response.body) === null || _b === void 0 ? void 0 : _b.error) ||
96
+ ((_c = response.body) === null || _c === void 0 ? void 0 : _c.message) ||
91
97
  `HTTP ${response.status}: Error from Swift server`,
92
98
  status: response.status,
93
99
  success: false,
@@ -110,6 +116,10 @@ class SwiftClient {
110
116
  connection
111
117
  .getAccountInfo(signedMsgUserOrdersAccount, 'confirmed')
112
118
  .then((accountInfo) => {
119
+ if (!accountInfo) {
120
+ reject(new Error('Swift message account not found'));
121
+ return;
122
+ }
113
123
  const order = this.findOrderInSignedMsgUserOrdersAccount(client, accountInfo, signedMsgOrderUuid);
114
124
  if (order) {
115
125
  (0, logger_1.allEnvDlog)('swiftClient', 'confirmed in initial fetch orderID\n', order.orderId);
@@ -1 +1 @@
1
- {"version":3,"file":"swiftClient.js","sourceRoot":"","sources":["../../src/clients/swiftClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport {\n\tDriftClient,\n\tMarketType,\n\tOrderType,\n\tSignedMsgUserOrdersAccount,\n\tdigestSignature,\n\tisVariant,\n} from '@drift-labs/sdk';\nimport { Observable, Subscriber } from 'rxjs';\nimport { allEnvDlog } from '../utils/logger';\nexport type SwiftServerOrderProcessResponse = {\n\terror?: string;\n\tmessage: string;\n};\n\ntype ClientResponse<T = void> = Promise<{\n\tsuccess: boolean;\n\tbody?: T;\n\tmessage?: string;\n\tstatus?: number;\n}>;\n\ntype BaseSwiftOrderEvent = {\n\thash: string;\n};\n\nexport interface SwiftOrderSentEvent extends BaseSwiftOrderEvent {\n\ttype: 'sent';\n}\n\nexport interface SwiftOrderErroredEvent extends BaseSwiftOrderEvent {\n\ttype: 'errored' | 'expired';\n\tmessage?: string;\n\tstatus?: number;\n}\n\nexport interface SwiftOrderConfirmedEvent extends BaseSwiftOrderEvent {\n\ttype: 'confirmed';\n\torderId: string;\n}\n\nexport type SwiftOrderEvent =\n\t| SwiftOrderErroredEvent\n\t| SwiftOrderConfirmedEvent\n\t| SwiftOrderSentEvent;\n\nexport class SwiftClient {\n\tprivate static baseUrl = '';\n\tprivate static swiftClientConsumer?: string;\n\n\tstatic supportedOrderTypes: OrderType[] = [OrderType.MARKET, OrderType.LIMIT];\n\n\tpublic static init(baseUrl: string, swiftClientConsumer?: string) {\n\t\tthis.baseUrl = baseUrl;\n\t\tthis.swiftClientConsumer = swiftClientConsumer;\n\t}\n\n\tprivate static get(url: string) {\n\t\tif (!this.baseUrl) {\n\t\t\tthrow new Error('SwiftClient not initialized');\n\t\t}\n\n\t\treturn new Promise<{ success: boolean; body: string; status: number }>(\n\t\t\t(res) => {\n\t\t\t\tconst headers = new Headers({\n\t\t\t\t\t...this.getSwiftHeaders(),\n\t\t\t\t});\n\n\t\t\t\tfetch(`${this.baseUrl}${url}`, {\n\t\t\t\t\theaders,\n\t\t\t\t})\n\t\t\t\t\t.then(async (response) => {\n\t\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\t\tres({\n\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\tbody: await response.text(),\n\t\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\tbody: await response.text(),\n\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tres({ success: false, body: err, status: 0 });\n\t\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate static post(url: string, bodyObject: any) {\n\t\tif (!this.baseUrl) {\n\t\t\tthrow new Error('SwiftClient not initialized');\n\t\t}\n\n\t\tconst requestOptions = {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { ...this.getSwiftHeaders() },\n\t\t\tbody: JSON.stringify(bodyObject),\n\t\t};\n\n\t\treturn new Promise<{\n\t\t\tsuccess: boolean;\n\t\t\tbody: SwiftServerOrderProcessResponse;\n\t\t\tstatus: number;\n\t\t}>((res) => {\n\t\t\tconst postRequest = new Request(`${this.baseUrl}${url}`, requestOptions);\n\n\t\t\tfetch(postRequest)\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tlet resBody: SwiftServerOrderProcessResponse | null = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresBody =\n\t\t\t\t\t\t\t(await response.json()) as SwiftServerOrderProcessResponse;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tallEnvDlog('swiftClient', 'Error reading response body', err);\n\t\t\t\t\t}\n\t\t\t\t\tres({\n\t\t\t\t\t\tsuccess: response.ok,\n\t\t\t\t\t\tbody: resBody,\n\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tres({ success: false, body: err, status: 0 });\n\t\t\t\t});\n\t\t});\n\t}\n\n\tstatic async sendSwiftOrder(\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tsigningAuthority?: PublicKey\n\t): ClientResponse<{\n\t\thash: string;\n\t}> {\n\t\tconst requestPayload = {\n\t\t\tmarket_index: marketIndex,\n\t\t\tmarket_type: isVariant(marketType, 'perp') ? 'perp' : 'spot',\n\t\t\tmessage,\n\t\t\tsignature: signature.toString('base64'),\n\t\t\tsigning_authority: signingAuthority?.toBase58() ?? '',\n\t\t\ttaker_authority: takerPubkey.toBase58(),\n\t\t};\n\n\t\tconst response = await this.post('/orders', requestPayload);\n\n\t\tif (response.status !== 200) {\n\t\t\tconsole.error(\n\t\t\t\t`Non-200 status code received for sent Swift order: ${response.status}`\n\t\t\t);\n\t\t\tallEnvDlog('swiftClient', 'full non-200 response body', response.body);\n\t\t\treturn {\n\t\t\t\tmessage:\n\t\t\t\t\tresponse.body?.message ||\n\t\t\t\t\t`HTTP ${response.status}: Error from Swift server`,\n\t\t\t\tstatus: response.status,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmessage: `Successfully sent Swift order`,\n\t\t\tbody: {\n\t\t\t\thash: digestSignature(Uint8Array.from(signature)),\n\t\t\t},\n\t\t\tsuccess: true,\n\t\t\tstatus: 200,\n\t\t};\n\t}\n\n\tstatic async confirmSwiftOrderWS(\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tsignedMsgUserOrdersAccount: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array,\n\t\tconfirmDuration: number\n\t): Promise<number | undefined> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\treject(new Error('Order not found'));\n\t\t\t}, confirmDuration);\n\n\t\t\tconnection\n\t\t\t\t.getAccountInfo(signedMsgUserOrdersAccount, 'confirmed')\n\t\t\t\t.then((accountInfo) => {\n\t\t\t\t\tconst order = this.findOrderInSignedMsgUserOrdersAccount(\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\taccountInfo,\n\t\t\t\t\t\tsignedMsgOrderUuid\n\t\t\t\t\t);\n\n\t\t\t\t\tif (order) {\n\t\t\t\t\t\tallEnvDlog(\n\t\t\t\t\t\t\t'swiftClient',\n\t\t\t\t\t\t\t'confirmed in initial fetch orderID\\n',\n\t\t\t\t\t\t\torder.orderId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tresolve(order.orderId);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tconst subId = connection.onAccountChange(\n\t\t\t\tsignedMsgUserOrdersAccount,\n\t\t\t\t(accountInfo) => {\n\t\t\t\t\tconst order = this.findOrderInSignedMsgUserOrdersAccount(\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\taccountInfo,\n\t\t\t\t\t\tsignedMsgOrderUuid\n\t\t\t\t\t);\n\t\t\t\t\tif (order) {\n\t\t\t\t\t\tallEnvDlog(\n\t\t\t\t\t\t\t'swiftClient',\n\t\t\t\t\t\t\t'confirmed in onAccountChange orderID\\n',\n\t\t\t\t\t\t\torder.orderId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconnection.removeAccountChangeListener(subId);\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tresolve(order.orderId);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'confirmed'\n\t\t\t);\n\t\t});\n\t}\n\n\tstatic findOrderInSignedMsgUserOrdersAccount(\n\t\tclient: DriftClient,\n\t\tordersAccount: AccountInfo<Buffer>,\n\t\tsignedMsgOrderUuid: Uint8Array\n\t) {\n\t\tconst accountDecoder =\n\t\t\tclient.program.account.signedMsgUserOrders.coder.accounts.decodeUnchecked.bind(\n\t\t\t\tclient.program.account.signedMsgUserOrders.coder.accounts\n\t\t\t);\n\t\tconst decodedAccount = accountDecoder(\n\t\t\t'SignedMsgUserOrders',\n\t\t\tordersAccount.data\n\t\t) as SignedMsgUserOrdersAccount;\n\t\tallEnvDlog(\n\t\t\t'swiftClient findOrder',\n\t\t\t'decodedAccount\\n',\n\t\t\tdecodedAccount,\n\t\t\tsignedMsgOrderUuid.toString()\n\t\t);\n\t\tconst order = decodedAccount.signedMsgOrderData.find(\n\t\t\t(order) => order.uuid.toString() === signedMsgOrderUuid.toString()\n\t\t);\n\t\tallEnvDlog('swiftClient findOrder', 'order\\n', order);\n\t\treturn order;\n\t}\n\n\tstatic async confirmSwiftOrder(\n\t\thash: string,\n\t\tconfirmDuration: number\n\t): Promise<\n\t\tClientResponse<\n\t\t\t| {\n\t\t\t\t\torderId: string;\n\t\t\t\t\tstatus: 'confirmed';\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tstatus: 'expired';\n\t\t\t }\n\t\t>\n\t> {\n\t\tconst expireTime = Date.now() + confirmDuration;\n\n\t\twhile (Date.now() < expireTime) {\n\t\t\tconst confirmResponse = await this.get(\n\t\t\t\t`/confirmation/hash-status?hash=${encodeURIComponent(hash)}`\n\t\t\t);\n\n\t\t\tif (confirmResponse.status === 200) {\n\t\t\t\tconsole.log('Confirmed hash: ', hash);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'Confirmed hash: ' + hash,\n\t\t\t\t\tbody: {\n\t\t\t\t\t\torderId: confirmResponse.body,\n\t\t\t\t\t\tstatus: 'confirmed',\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else if (\n\t\t\t\tconfirmResponse.status >= 500 ||\n\t\t\t\tconfirmResponse.status < 200\n\t\t\t) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t}\n\n\t\tconsole.error('Failed to confirm hash: ', hash);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tstatus: 408,\n\t\t\tmessage: 'Failed to confirm hash: ' + hash,\n\t\t\tbody: {\n\t\t\t\tstatus: 'expired',\n\t\t\t},\n\t\t};\n\t}\n\n\tstatic async handleSwiftOrderSubscriber(\n\t\tsubscriber: Subscriber<SwiftOrderEvent>,\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority?: PublicKey\n\t) {\n\t\t// First send the order\n\t\tconst sendResponse = await this.sendSwiftOrder(\n\t\t\tmarketIndex,\n\t\t\tmarketType,\n\t\t\tmessage,\n\t\t\tsignature,\n\t\t\ttakerPubkey,\n\t\t\tsigningAuthority\n\t\t);\n\n\t\tif (!sendResponse.success) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'errored',\n\t\t\t\thash: '',\n\t\t\t\tmessage: sendResponse.message,\n\t\t\t\tstatus: sendResponse.status,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t\treturn;\n\t\t} else {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'sent',\n\t\t\t\thash: sendResponse.body.hash,\n\t\t\t});\n\t\t}\n\n\t\tconst hash = sendResponse.body.hash;\n\n\t\t// Then confirm it\n\t\tconst confirmResponse = await this.confirmSwiftOrder(hash, confirmDuration);\n\n\t\tif (!confirmResponse.success) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: confirmResponse.body.status as 'expired',\n\t\t\t\thash,\n\t\t\t\tmessage: confirmResponse.message,\n\t\t\t\tstatus: confirmResponse.status,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t}\n\t\tif (confirmResponse.body.status === 'confirmed') {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'confirmed',\n\t\t\t\torderId: confirmResponse.body.orderId,\n\t\t\t\thash,\n\t\t\t});\n\t\t\tsubscriber.complete();\n\t\t}\n\t}\n\tstatic async handleSwiftOrderSubscriberWS(\n\t\tsubscriber: Subscriber<SwiftOrderEvent>,\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tsignedMsgUserOrdersAccountPubkey: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority?: PublicKey\n\t) {\n\t\t// First send the order\n\t\tconst sendResponse = await this.sendSwiftOrder(\n\t\t\tmarketIndex,\n\t\t\tmarketType,\n\t\t\tmessage,\n\t\t\tsignature,\n\t\t\ttakerPubkey,\n\t\t\tsigningAuthority\n\t\t);\n\t\tallEnvDlog('swiftClient', 'sendResponse\\n', sendResponse);\n\n\t\tif (!sendResponse.success) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'errored',\n\t\t\t\thash: '',\n\t\t\t\tmessage: 'Error from swift node: ' + sendResponse.message,\n\t\t\t\tstatus: sendResponse.status,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t\treturn;\n\t\t} else {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'sent',\n\t\t\t\thash: sendResponse.body.hash,\n\t\t\t});\n\t\t}\n\n\t\tconst hash = sendResponse.body.hash;\n\n\t\t// Then confirm it\n\t\tconst orderID = await this.confirmSwiftOrderWS(\n\t\t\tconnection,\n\t\t\tclient,\n\t\t\tsignedMsgUserOrdersAccountPubkey,\n\t\t\tsignedMsgOrderUuid,\n\t\t\tconfirmDuration\n\t\t).catch((err) => {\n\t\t\tallEnvDlog('swiftClient', 'confirmSwiftOrderWS error', err);\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'expired',\n\t\t\t\thash,\n\t\t\t\tmessage: 'Order failed to confirm',\n\t\t\t\tstatus: 408,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t});\n\n\t\tif (!orderID) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'expired',\n\t\t\t\thash,\n\t\t\t\tmessage: 'Order failed to confirm',\n\t\t\t\tstatus: 408,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t} else {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'confirmed',\n\t\t\t\torderId: orderID.toString(),\n\t\t\t\thash,\n\t\t\t});\n\t\t\tsubscriber.complete();\n\t\t}\n\t}\n\n\tpublic static sendAndConfirmSwiftOrder(\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority: PublicKey\n\t): Observable<SwiftOrderEvent> {\n\t\treturn new Observable<SwiftOrderEvent>((subscriber) => {\n\t\t\tthis.handleSwiftOrderSubscriber(\n\t\t\t\tsubscriber,\n\t\t\t\tmarketIndex,\n\t\t\t\tmarketType,\n\t\t\t\tmessage,\n\t\t\t\tsignature,\n\t\t\t\ttakerPubkey,\n\t\t\t\tconfirmDuration,\n\t\t\t\tsigningAuthority\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static sendAndConfirmSwiftOrderWS(\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tsignedMsgUserOrdersAccountPubkey: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority: PublicKey\n\t): Observable<SwiftOrderEvent> {\n\t\treturn new Observable<SwiftOrderEvent>((subscriber) => {\n\t\t\tthis.handleSwiftOrderSubscriberWS(\n\t\t\t\tsubscriber,\n\t\t\t\tconnection,\n\t\t\t\tclient,\n\t\t\t\tmarketIndex,\n\t\t\t\tmarketType,\n\t\t\t\tmessage,\n\t\t\t\tsignature,\n\t\t\t\ttakerPubkey,\n\t\t\t\tsignedMsgUserOrdersAccountPubkey,\n\t\t\t\tsignedMsgOrderUuid,\n\t\t\t\tconfirmDuration,\n\t\t\t\tsigningAuthority\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static async isSwiftServerHealthy(): Promise<boolean> {\n\t\tconst response = await this.get('/health');\n\t\treturn response.status === 200;\n\t}\n\n\tprivate static getSwiftHeaders(): Record<string, string> {\n\t\treturn {\n\t\t\t'Content-Type': 'application/json',\n\t\t\t'X-Swift-Client-Consumer': this.swiftClientConsumer ?? 'default',\n\t\t};\n\t}\n\n\tpublic static isSupportedOrderType(orderType: OrderType) {\n\t\treturn this.supportedOrderTypes.includes(orderType);\n\t}\n}\n"]}
1
+ {"version":3,"file":"swiftClient.js","sourceRoot":"","sources":["../../src/clients/swiftClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport {\n\tDriftClient,\n\tMarketType,\n\tOrderType,\n\tSignedMsgOrderParamsDelegateMessage,\n\tSignedMsgOrderParamsMessage,\n\tSignedMsgUserOrdersAccount,\n\tdigestSignature,\n\tisVariant,\n} from '@drift-labs/sdk';\nimport { Observable, Subscriber } from 'rxjs';\nimport { allEnvDlog } from '../utils/logger';\nexport type SwiftServerOrderProcessResponse = {\n\terror?: string;\n\tmessage: string;\n};\n\ntype ClientResponse<T = void> = Promise<{\n\tsuccess: boolean;\n\tbody?: T;\n\tmessage?: string;\n\tstatus?: number;\n}>;\n\ntype BaseSwiftOrderEvent = {\n\thash: string;\n};\n\nexport interface SwiftOrderSentEvent extends BaseSwiftOrderEvent {\n\ttype: 'sent';\n}\n\nexport interface SwiftOrderErroredEvent extends BaseSwiftOrderEvent {\n\ttype: 'errored' | 'expired';\n\tmessage?: string;\n\tstatus?: number;\n}\n\nexport interface SwiftOrderConfirmedEvent extends BaseSwiftOrderEvent {\n\ttype: 'confirmed';\n\torderId: string;\n}\n\nexport type SwiftOrderEvent =\n\t| SwiftOrderErroredEvent\n\t| SwiftOrderConfirmedEvent\n\t| SwiftOrderSentEvent;\n\nexport type SwiftOrderEventWithParams<T extends SwiftOrderEvent> = T & {\n\tswiftOrderUuid: Uint8Array;\n\torderParamsMessage:\n\t\t| SignedMsgOrderParamsMessage\n\t\t| SignedMsgOrderParamsDelegateMessage;\n};\n\nexport class SwiftClient {\n\tprivate static baseUrl = '';\n\tprivate static swiftClientConsumer?: string;\n\n\tstatic supportedOrderTypes: OrderType[] = [OrderType.MARKET, OrderType.LIMIT];\n\n\tpublic static init(baseUrl: string, swiftClientConsumer?: string) {\n\t\tthis.baseUrl = baseUrl;\n\t\tthis.swiftClientConsumer = swiftClientConsumer;\n\t}\n\n\tprivate static get(url: string) {\n\t\tif (!this.baseUrl) {\n\t\t\tthrow new Error('SwiftClient not initialized');\n\t\t}\n\n\t\treturn new Promise<{ success: boolean; body: string; status: number }>(\n\t\t\t(res) => {\n\t\t\t\tconst headers = new Headers({\n\t\t\t\t\t...this.getSwiftHeaders(),\n\t\t\t\t});\n\n\t\t\t\tfetch(`${this.baseUrl}${url}`, {\n\t\t\t\t\theaders,\n\t\t\t\t})\n\t\t\t\t\t.then(async (response) => {\n\t\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\t\tres({\n\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\tbody: await response.text(),\n\t\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\tbody: await response.text(),\n\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\tres({ success: false, body: err, status: 0 });\n\t\t\t\t\t});\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate static post(url: string, bodyObject: any) {\n\t\tif (!this.baseUrl) {\n\t\t\tthrow new Error('SwiftClient not initialized');\n\t\t}\n\n\t\tconst requestOptions = {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { ...this.getSwiftHeaders() },\n\t\t\tbody: JSON.stringify(bodyObject),\n\t\t};\n\n\t\treturn new Promise<{\n\t\t\tsuccess: boolean;\n\t\t\tbody: SwiftServerOrderProcessResponse;\n\t\t\tstatus: number;\n\t\t}>((res) => {\n\t\t\tconst postRequest = new Request(`${this.baseUrl}${url}`, requestOptions);\n\n\t\t\tfetch(postRequest)\n\t\t\t\t.then(async (response) => {\n\t\t\t\t\tlet resBody: SwiftServerOrderProcessResponse | null = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresBody =\n\t\t\t\t\t\t\t(await response.json()) as SwiftServerOrderProcessResponse;\n\n\t\t\t\t\t\tres({\n\t\t\t\t\t\t\tsuccess: response.ok,\n\t\t\t\t\t\t\tbody: resBody,\n\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tallEnvDlog('swiftClient', 'Error reading response body', err);\n\n\t\t\t\t\t\tres({\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tbody: err as any,\n\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tres({ success: false, body: err, status: 0 });\n\t\t\t\t});\n\t\t});\n\t}\n\n\tstatic async sendSwiftOrder(\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tsigningAuthority?: PublicKey\n\t): ClientResponse<{\n\t\thash: string;\n\t}> {\n\t\tconst requestPayload = {\n\t\t\tmarket_index: marketIndex,\n\t\t\tmarket_type: isVariant(marketType, 'perp') ? 'perp' : 'spot',\n\t\t\tmessage,\n\t\t\tsignature: signature.toString('base64'),\n\t\t\tsigning_authority: signingAuthority?.toBase58() ?? '',\n\t\t\ttaker_authority: takerPubkey.toBase58(),\n\t\t};\n\n\t\tconst response = await this.post('/orders', requestPayload);\n\n\t\tif (response.status !== 200) {\n\t\t\tconsole.error(\n\t\t\t\t`Non-200 status code received for sent Swift order: ${response.status}`\n\t\t\t);\n\t\t\tallEnvDlog('swiftClient', 'full non-200 response body', response.body);\n\t\t\treturn {\n\t\t\t\tmessage:\n\t\t\t\t\tresponse.body?.error ||\n\t\t\t\t\tresponse.body?.message ||\n\t\t\t\t\t`HTTP ${response.status}: Error from Swift server`,\n\t\t\t\tstatus: response.status,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmessage: `Successfully sent Swift order`,\n\t\t\tbody: {\n\t\t\t\thash: digestSignature(Uint8Array.from(signature)),\n\t\t\t},\n\t\t\tsuccess: true,\n\t\t\tstatus: 200,\n\t\t};\n\t}\n\n\tstatic async confirmSwiftOrderWS(\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tsignedMsgUserOrdersAccount: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array,\n\t\tconfirmDuration: number\n\t): Promise<number | undefined> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\treject(new Error('Order not found'));\n\t\t\t}, confirmDuration);\n\n\t\t\tconnection\n\t\t\t\t.getAccountInfo(signedMsgUserOrdersAccount, 'confirmed')\n\t\t\t\t.then((accountInfo) => {\n\t\t\t\t\tif (!accountInfo) {\n\t\t\t\t\t\treject(new Error('Swift message account not found'));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst order = this.findOrderInSignedMsgUserOrdersAccount(\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\taccountInfo,\n\t\t\t\t\t\tsignedMsgOrderUuid\n\t\t\t\t\t);\n\n\t\t\t\t\tif (order) {\n\t\t\t\t\t\tallEnvDlog(\n\t\t\t\t\t\t\t'swiftClient',\n\t\t\t\t\t\t\t'confirmed in initial fetch orderID\\n',\n\t\t\t\t\t\t\torder.orderId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tresolve(order.orderId);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tconst subId = connection.onAccountChange(\n\t\t\t\tsignedMsgUserOrdersAccount,\n\t\t\t\t(accountInfo) => {\n\t\t\t\t\tconst order = this.findOrderInSignedMsgUserOrdersAccount(\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\taccountInfo,\n\t\t\t\t\t\tsignedMsgOrderUuid\n\t\t\t\t\t);\n\t\t\t\t\tif (order) {\n\t\t\t\t\t\tallEnvDlog(\n\t\t\t\t\t\t\t'swiftClient',\n\t\t\t\t\t\t\t'confirmed in onAccountChange orderID\\n',\n\t\t\t\t\t\t\torder.orderId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconnection.removeAccountChangeListener(subId);\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tresolve(order.orderId);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'confirmed'\n\t\t\t);\n\t\t});\n\t}\n\n\tstatic findOrderInSignedMsgUserOrdersAccount(\n\t\tclient: DriftClient,\n\t\tordersAccount: AccountInfo<Buffer>,\n\t\tsignedMsgOrderUuid: Uint8Array\n\t) {\n\t\tconst accountDecoder =\n\t\t\tclient.program.account.signedMsgUserOrders.coder.accounts.decodeUnchecked.bind(\n\t\t\t\tclient.program.account.signedMsgUserOrders.coder.accounts\n\t\t\t);\n\t\tconst decodedAccount = accountDecoder(\n\t\t\t'SignedMsgUserOrders',\n\t\t\tordersAccount.data\n\t\t) as SignedMsgUserOrdersAccount;\n\t\tallEnvDlog(\n\t\t\t'swiftClient findOrder',\n\t\t\t'decodedAccount\\n',\n\t\t\tdecodedAccount,\n\t\t\tsignedMsgOrderUuid.toString()\n\t\t);\n\t\tconst order = decodedAccount.signedMsgOrderData.find(\n\t\t\t(order) => order.uuid.toString() === signedMsgOrderUuid.toString()\n\t\t);\n\t\tallEnvDlog('swiftClient findOrder', 'order\\n', order);\n\t\treturn order;\n\t}\n\n\tstatic async confirmSwiftOrder(\n\t\thash: string,\n\t\tconfirmDuration: number\n\t): Promise<\n\t\tClientResponse<\n\t\t\t| {\n\t\t\t\t\torderId: string;\n\t\t\t\t\tstatus: 'confirmed';\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tstatus: 'expired';\n\t\t\t }\n\t\t>\n\t> {\n\t\tconst expireTime = Date.now() + confirmDuration;\n\n\t\twhile (Date.now() < expireTime) {\n\t\t\tconst confirmResponse = await this.get(\n\t\t\t\t`/confirmation/hash-status?hash=${encodeURIComponent(hash)}`\n\t\t\t);\n\n\t\t\tif (confirmResponse.status === 200) {\n\t\t\t\tconsole.log('Confirmed hash: ', hash);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tstatus: 200,\n\t\t\t\t\tmessage: 'Confirmed hash: ' + hash,\n\t\t\t\t\tbody: {\n\t\t\t\t\t\torderId: confirmResponse.body,\n\t\t\t\t\t\tstatus: 'confirmed',\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} else if (\n\t\t\t\tconfirmResponse.status >= 500 ||\n\t\t\t\tconfirmResponse.status < 200\n\t\t\t) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t}\n\n\t\tconsole.error('Failed to confirm hash: ', hash);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tstatus: 408,\n\t\t\tmessage: 'Failed to confirm hash: ' + hash,\n\t\t\tbody: {\n\t\t\t\tstatus: 'expired',\n\t\t\t},\n\t\t};\n\t}\n\n\tstatic async handleSwiftOrderSubscriber(\n\t\tsubscriber: Subscriber<SwiftOrderEvent>,\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority?: PublicKey\n\t) {\n\t\t// First send the order\n\t\tconst sendResponse = await this.sendSwiftOrder(\n\t\t\tmarketIndex,\n\t\t\tmarketType,\n\t\t\tmessage,\n\t\t\tsignature,\n\t\t\ttakerPubkey,\n\t\t\tsigningAuthority\n\t\t);\n\n\t\tif (!sendResponse.success) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'errored',\n\t\t\t\thash: '',\n\t\t\t\tmessage: sendResponse.message,\n\t\t\t\tstatus: sendResponse.status,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t\treturn;\n\t\t} else {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'sent',\n\t\t\t\thash: sendResponse.body.hash,\n\t\t\t});\n\t\t}\n\n\t\tconst hash = sendResponse.body.hash;\n\n\t\t// Then confirm it\n\t\tconst confirmResponse = await this.confirmSwiftOrder(hash, confirmDuration);\n\n\t\tif (!confirmResponse.success) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: confirmResponse.body.status as 'expired',\n\t\t\t\thash,\n\t\t\t\tmessage: confirmResponse.message,\n\t\t\t\tstatus: confirmResponse.status,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t}\n\t\tif (confirmResponse.body.status === 'confirmed') {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'confirmed',\n\t\t\t\torderId: confirmResponse.body.orderId,\n\t\t\t\thash,\n\t\t\t});\n\t\t\tsubscriber.complete();\n\t\t}\n\t}\n\tstatic async handleSwiftOrderSubscriberWS(\n\t\tsubscriber: Subscriber<SwiftOrderEvent>,\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tsignedMsgUserOrdersAccountPubkey: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority?: PublicKey\n\t) {\n\t\t// First send the order\n\t\tconst sendResponse = await this.sendSwiftOrder(\n\t\t\tmarketIndex,\n\t\t\tmarketType,\n\t\t\tmessage,\n\t\t\tsignature,\n\t\t\ttakerPubkey,\n\t\t\tsigningAuthority\n\t\t);\n\t\tallEnvDlog('swiftClient', 'sendResponse\\n', sendResponse);\n\n\t\tif (!sendResponse.success) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'errored',\n\t\t\t\thash: '',\n\t\t\t\tmessage: 'Error from swift node: ' + sendResponse.message,\n\t\t\t\tstatus: sendResponse.status,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t\treturn;\n\t\t} else {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'sent',\n\t\t\t\thash: sendResponse.body.hash,\n\t\t\t});\n\t\t}\n\n\t\tconst hash = sendResponse.body.hash;\n\n\t\t// Then confirm it\n\t\tconst orderID = await this.confirmSwiftOrderWS(\n\t\t\tconnection,\n\t\t\tclient,\n\t\t\tsignedMsgUserOrdersAccountPubkey,\n\t\t\tsignedMsgOrderUuid,\n\t\t\tconfirmDuration\n\t\t).catch((err) => {\n\t\t\tallEnvDlog('swiftClient', 'confirmSwiftOrderWS error', err);\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'expired',\n\t\t\t\thash,\n\t\t\t\tmessage: 'Order failed to confirm',\n\t\t\t\tstatus: 408,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t});\n\n\t\tif (!orderID) {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'expired',\n\t\t\t\thash,\n\t\t\t\tmessage: 'Order failed to confirm',\n\t\t\t\tstatus: 408,\n\t\t\t});\n\t\t\tsubscriber.error();\n\t\t} else {\n\t\t\tsubscriber.next({\n\t\t\t\ttype: 'confirmed',\n\t\t\t\torderId: orderID.toString(),\n\t\t\t\thash,\n\t\t\t});\n\t\t\tsubscriber.complete();\n\t\t}\n\t}\n\n\tpublic static sendAndConfirmSwiftOrder(\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority: PublicKey\n\t): Observable<SwiftOrderEvent> {\n\t\treturn new Observable<SwiftOrderEvent>((subscriber) => {\n\t\t\tthis.handleSwiftOrderSubscriber(\n\t\t\t\tsubscriber,\n\t\t\t\tmarketIndex,\n\t\t\t\tmarketType,\n\t\t\t\tmessage,\n\t\t\t\tsignature,\n\t\t\t\ttakerPubkey,\n\t\t\t\tconfirmDuration,\n\t\t\t\tsigningAuthority\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static sendAndConfirmSwiftOrderWS(\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tmarketIndex: number,\n\t\tmarketType: MarketType,\n\t\tmessage: string,\n\t\tsignature: Buffer,\n\t\ttakerPubkey: PublicKey,\n\t\tsignedMsgUserOrdersAccountPubkey: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array,\n\t\tconfirmDuration: number,\n\t\tsigningAuthority: PublicKey\n\t): Observable<SwiftOrderEvent> {\n\t\treturn new Observable<SwiftOrderEvent>((subscriber) => {\n\t\t\tthis.handleSwiftOrderSubscriberWS(\n\t\t\t\tsubscriber,\n\t\t\t\tconnection,\n\t\t\t\tclient,\n\t\t\t\tmarketIndex,\n\t\t\t\tmarketType,\n\t\t\t\tmessage,\n\t\t\t\tsignature,\n\t\t\t\ttakerPubkey,\n\t\t\t\tsignedMsgUserOrdersAccountPubkey,\n\t\t\t\tsignedMsgOrderUuid,\n\t\t\t\tconfirmDuration,\n\t\t\t\tsigningAuthority\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static async isSwiftServerHealthy(): Promise<boolean> {\n\t\tconst response = await this.get('/health');\n\t\treturn response.status === 200;\n\t}\n\n\tprivate static getSwiftHeaders(): Record<string, string> {\n\t\treturn {\n\t\t\t'Content-Type': 'application/json',\n\t\t\t'X-Swift-Client-Consumer': this.swiftClientConsumer ?? 'default',\n\t\t};\n\t}\n\n\tpublic static isSupportedOrderType(orderType: OrderType) {\n\t\treturn this.supportedOrderTypes.includes(orderType);\n\t}\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { DriftClient, PerpMarketConfig, SpotMarketConfig } from '@drift-labs/sdk';
2
2
  import { CandleType, JsonTrade } from '../types';
3
3
  import { UIEnv } from '../types/UIEnv';
4
+ type MarketDecimalConfig = Record<string, number>;
4
5
  type TVBar = {
5
6
  /** Bar time.
6
7
  * Amount of **milliseconds** since Unix epoch start in **UTC** timezone.
@@ -32,7 +33,8 @@ export declare class DriftTvFeed {
32
33
  private perpMarketConfigs;
33
34
  private spotMarketConfigs;
34
35
  private tvAppTradeDataManager;
35
- constructor(env: UIEnv, candleType: CandleType, driftClient: DriftClient, perpMarketConfigs: PerpMarketConfig[], spotMarketConfigs: SpotMarketConfig[], tvAppTradeDataManager?: TvAppTradeDataManager);
36
+ private marketDecimalConfig;
37
+ constructor(env: UIEnv, candleType: CandleType, driftClient: DriftClient, perpMarketConfigs: PerpMarketConfig[], spotMarketConfigs: SpotMarketConfig[], tvAppTradeDataManager?: TvAppTradeDataManager, marketDecimalConfig?: MarketDecimalConfig);
36
38
  resetCache(): void;
37
39
  private searchMarkets;
38
40
  onReady(callback: any): void;
@@ -6,6 +6,7 @@ const types_1 = require("../types");
6
6
  const Candle_1 = require("../utils/candles/Candle");
7
7
  const pollingSequenceGuard_1 = require("../utils/pollingSequenceGuard");
8
8
  const candleClient_1 = require("./candleClient");
9
+ const market_1 = require("../common-ui-utils/market");
9
10
  const DRIFT_V2_START_TS = 1668470400; // 15th November 2022 ... 2022-11-15T00:00:00.000Z
10
11
  const resolutions = [
11
12
  '1',
@@ -110,7 +111,7 @@ const SpotMarketConfigToTVMarketInfo = (marketConfig) => {
110
111
  };
111
112
  };
112
113
  class DriftTvFeed {
113
- constructor(env, candleType, driftClient, perpMarketConfigs, spotMarketConfigs, tvAppTradeDataManager) {
114
+ constructor(env, candleType, driftClient, perpMarketConfigs, spotMarketConfigs, tvAppTradeDataManager, marketDecimalConfig) {
114
115
  this.searchMarkets = (symbol) => {
115
116
  const res = [];
116
117
  const currentPerpMarkets = this.perpMarketConfigs;
@@ -175,6 +176,7 @@ class DriftTvFeed {
175
176
  this.perpMarketConfigs = perpMarketConfigs;
176
177
  this.spotMarketConfigs = spotMarketConfigs;
177
178
  this.tvAppTradeDataManager = tvAppTradeDataManager;
179
+ this.marketDecimalConfig = marketDecimalConfig;
178
180
  }
179
181
  resetCache() {
180
182
  var _a;
@@ -193,24 +195,36 @@ class DriftTvFeed {
193
195
  onResult(res);
194
196
  }
195
197
  resolveSymbol(symbolName, onResolve, onError) {
198
+ var _a;
196
199
  const targetMarket = findMarketBySymbol(symbolName, this.perpMarketConfigs, this.spotMarketConfigs);
197
200
  if (targetMarket) {
198
201
  const tvMarketName = targetMarket.config.symbol;
199
- let tickSize;
200
- if (targetMarket.type === 'perp') {
201
- tickSize = this.driftClient
202
- .getPerpMarketAccount(targetMarket.config.marketIndex)
203
- .amm.orderTickSize.toNumber();
202
+ // Use market-specific decimal precision from configuration
203
+ const baseAssetSymbol = market_1.MARKET_UTILS.getBaseAssetSymbol(symbolName);
204
+ const marketDecimals = (_a = this.marketDecimalConfig) === null || _a === void 0 ? void 0 : _a[baseAssetSymbol];
205
+ let priceScale;
206
+ if (marketDecimals !== undefined) {
207
+ // Use configured market decimals
208
+ priceScale = 10 ** marketDecimals;
204
209
  }
205
210
  else {
206
- tickSize = this.driftClient
207
- .getSpotMarketAccount(targetMarket.config.marketIndex)
208
- .orderTickSize.toNumber();
211
+ // Fall back to original tick size calculation
212
+ let tickSize;
213
+ if (targetMarket.type === 'perp') {
214
+ tickSize = this.driftClient
215
+ .getPerpMarketAccount(targetMarket.config.marketIndex)
216
+ .amm.orderTickSize.toNumber();
217
+ }
218
+ else {
219
+ tickSize = this.driftClient
220
+ .getSpotMarketAccount(targetMarket.config.marketIndex)
221
+ .orderTickSize.toNumber();
222
+ }
223
+ const pricePrecisionExp = sdk_1.PRICE_PRECISION_EXP.toNumber();
224
+ const tickSizeExp = Math.ceil(Math.log10(tickSize));
225
+ const priceScaleExponent = Math.max(0, pricePrecisionExp - tickSizeExp);
226
+ priceScale = 10 ** priceScaleExponent;
209
227
  }
210
- const pricePrecisionExp = sdk_1.PRICE_PRECISION_EXP.toNumber();
211
- const tickSizeExp = Math.ceil(Math.log10(tickSize));
212
- const priceScaleExponent = Math.max(0, pricePrecisionExp - tickSizeExp);
213
- const priceScale = 10 ** priceScaleExponent;
214
228
  onResolve({
215
229
  name: tvMarketName,
216
230
  full_name: tvMarketName,
@@ -1 +1 @@
1
- {"version":3,"file":"tvFeed.js","sourceRoot":"","sources":["../../src/clients/tvFeed.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCandleResolution,\n\tDriftClient,\n\tPerpMarketConfig,\n\tPRICE_PRECISION_EXP,\n\tSpotMarketConfig,\n} from '@drift-labs/sdk';\nimport { CandleType, JsonCandle, JsonTrade, MarketId } from '../types';\nimport { UIEnv } from '../types/UIEnv';\nimport { Candle } from '../utils/candles/Candle';\nimport { PollingSequenceGuard } from '../utils/pollingSequenceGuard';\nimport { CandleClient } from './candleClient';\n\nconst DRIFT_V2_START_TS = 1668470400; // 15th November 2022 ... 2022-11-15T00:00:00.000Z\n\nconst resolutions = [\n\t'1',\n\t'3',\n\t'5',\n\t'15',\n\t'30',\n\t'60',\n\t'240',\n\t'6H',\n\t'8H',\n\t'1D',\n\t'3D',\n\t'1W',\n\t'1M',\n];\n\nconst tvResolutionStringToStandardResolutionString = (\n\ttvResolutionString\n): CandleResolution => {\n\tswitch (tvResolutionString) {\n\t\tcase '1':\n\t\t\treturn '1';\n\t\tcase '5':\n\t\t\treturn '5';\n\t\tcase '15':\n\t\t\treturn '15';\n\t\tcase '60':\n\t\t\treturn '60';\n\t\tcase '240':\n\t\t\treturn '240';\n\t\tcase 'D':\n\t\tcase '1D':\n\t\t\treturn 'D';\n\t\tcase 'W':\n\t\tcase '1W':\n\t\t\treturn 'W';\n\t\tcase 'M':\n\t\tcase '1M':\n\t\t\treturn 'M';\n\t}\n};\n\ntype TVMarketInfo = {\n\tsymbol: string;\n\tfull_name: string;\n\tdescription: string;\n\texchange: string;\n\tticker: string;\n\ttype: string;\n};\n\nconst DATAFEED_CONFIG = {\n\texchanges: [],\n\tsupported_resolutions: [...resolutions],\n\tcurrency_codes: [],\n\tsupports_marks: true,\n\tsupports_time: false,\n\tsupports_timescale_marks: false,\n\tsymbols_types: [],\n};\n\ntype TVBar = {\n\t/** Bar time.\n\t * Amount of **milliseconds** since Unix epoch start in **UTC** timezone.\n\t * `time` for daily, weekly, and monthly bars is expected to be a trading day (not session start day) at 00:00 UTC.\n\t * The library adjusts time according to `session` from {@link LibrarySymbolInfo}.\n\t */\n\ttime: number;\n\t/** Opening price */\n\topen: number;\n\t/** High price */\n\thigh: number;\n\t/** Low price */\n\tlow: number;\n\t/** Closing price */\n\tclose: number;\n\t/** Trading Volume */\n\tvolume?: number;\n};\n\nconst findMarketBySymbol = (\n\tsymbol: string,\n\tperpMarketConfigs: PerpMarketConfig[],\n\tspotMarketConfigs: SpotMarketConfig[]\n):\n\t| {\n\t\t\ttype: 'perp';\n\t\t\tconfig: PerpMarketConfig;\n\t }\n\t| {\n\t\t\ttype: 'spot';\n\t\t\tconfig: SpotMarketConfig;\n\t } => {\n\tif (!symbol) {\n\t\tthrow new Error(`TVFeed::No symbol provided`);\n\t}\n\n\tconst sanitisedSymbol = symbol.toLowerCase().replace('/usdc', ''); // Lowercase and replace /usdc (for spot markets) to santise symbol for lookup\n\n\tconst isPerp = sanitisedSymbol.toLowerCase().includes('perp');\n\n\tconst matchingMarketConfig = isPerp\n\t\t? perpMarketConfigs.find((mkt) =>\n\t\t\t\tmkt.symbol.toLowerCase().includes(sanitisedSymbol.toLowerCase())\n\t\t )\n\t\t: spotMarketConfigs.find((mkt) =>\n\t\t\t\tmkt.symbol.toLowerCase().includes(sanitisedSymbol.toLowerCase())\n\t\t );\n\n\tif (!matchingMarketConfig) {\n\t\tthrow new Error(`TVFeed::No market found for symbol ${symbol}`);\n\t}\n\n\tif (isPerp) {\n\t\treturn {\n\t\t\ttype: 'perp',\n\t\t\tconfig: matchingMarketConfig as PerpMarketConfig,\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'spot',\n\t\tconfig: matchingMarketConfig as SpotMarketConfig,\n\t};\n};\n\nconst candleFetchingPollKey = Symbol('candleFetchingPollKey');\n\nconst candleToTvBar = (candle: JsonCandle, candleType: CandleType): TVBar => {\n\tconst useOraclePrice = candleType === CandleType.ORACLE_PRICE;\n\n\treturn {\n\t\ttime: candle.ts * 1000,\n\t\topen: useOraclePrice ? candle.oracleOpen : candle.fillOpen,\n\t\thigh: useOraclePrice ? candle.oracleHigh : candle.fillHigh,\n\t\tlow: useOraclePrice ? candle.oracleLow : candle.fillLow,\n\t\tclose: useOraclePrice ? candle.oracleClose : candle.fillClose,\n\t\tvolume: candle.quoteVolume,\n\t};\n};\n\nconst PerpMarketConfigToTVMarketInfo = (\n\tmarketConfig: PerpMarketConfig\n): TVMarketInfo => {\n\treturn {\n\t\tsymbol: marketConfig.symbol,\n\t\tfull_name: marketConfig.fullName,\n\t\tdescription: marketConfig.fullName,\n\t\texchange: 'Drift',\n\t\tticker: marketConfig.symbol,\n\t\ttype: 'crypto',\n\t};\n};\n\nconst SpotMarketConfigToTVMarketInfo = (\n\tmarketConfig: SpotMarketConfig\n): TVMarketInfo => {\n\treturn {\n\t\tsymbol: marketConfig.symbol,\n\t\tfull_name: marketConfig.symbol,\n\t\tdescription: marketConfig.symbol,\n\t\texchange: 'Drift',\n\t\tticker: marketConfig.symbol,\n\t\ttype: 'crypto',\n\t};\n};\n\ninterface TvAppTradeDataManager {\n\tgetFilledOrdersData(startDate: number, endDate: number): Promise<JsonTrade[]>;\n\tgetCurrentSubAccountAddress(): string | null;\n}\n\nexport class DriftTvFeed {\n\tprivate env: UIEnv;\n\tprivate candleType: CandleType;\n\tprivate candleClient: CandleClient;\n\tprivate driftClient: DriftClient;\n\tprivate onResetCache: () => void;\n\tprivate perpMarketConfigs: PerpMarketConfig[];\n\tprivate spotMarketConfigs: SpotMarketConfig[];\n\tprivate tvAppTradeDataManager: TvAppTradeDataManager | undefined;\n\n\tconstructor(\n\t\tenv: UIEnv,\n\t\tcandleType: CandleType,\n\t\tdriftClient: DriftClient,\n\t\tperpMarketConfigs: PerpMarketConfig[],\n\t\tspotMarketConfigs: SpotMarketConfig[],\n\t\ttvAppTradeDataManager?: TvAppTradeDataManager\n\t) {\n\t\tthis.env = env;\n\t\tthis.candleType = candleType;\n\t\tthis.candleClient = new CandleClient();\n\t\tthis.driftClient = driftClient;\n\t\tthis.perpMarketConfigs = perpMarketConfigs;\n\t\tthis.spotMarketConfigs = spotMarketConfigs;\n\t\tthis.tvAppTradeDataManager = tvAppTradeDataManager;\n\t}\n\n\tpublic resetCache() {\n\t\tthis.onResetCache?.();\n\t}\n\n\tprivate searchMarkets = (symbol: string): TVMarketInfo[] => {\n\t\tconst res: Pick<\n\t\t\tTVMarketInfo,\n\t\t\t'symbol' | 'ticker' | 'full_name' | 'description'\n\t\t>[] = [];\n\n\t\tconst currentPerpMarkets = this.perpMarketConfigs;\n\t\tconst currentSpotMarkets = this.spotMarketConfigs;\n\n\t\tif (!symbol) {\n\t\t\tres.push(PerpMarketConfigToTVMarketInfo(currentPerpMarkets[0]));\n\t\t} else {\n\t\t\tfor (const market of currentPerpMarkets) {\n\t\t\t\tconst lowerCaseMarket = market.symbol.toLowerCase();\n\t\t\t\tif (lowerCaseMarket.includes(symbol.toLowerCase())) {\n\t\t\t\t\tres.push(PerpMarketConfigToTVMarketInfo(market));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const market of currentSpotMarkets) {\n\t\t\t\tconst lowerCaseMarket = market.symbol.toLowerCase();\n\t\t\t\tif (lowerCaseMarket.includes(symbol.toLowerCase())) {\n\t\t\t\t\tres.push(SpotMarketConfigToTVMarketInfo(market));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res.map((mkt) => {\n\t\t\treturn {\n\t\t\t\t...mkt,\n\t\t\t\texchange: 'Drift',\n\t\t\t\ttype: 'crypto',\n\t\t\t};\n\t\t});\n\t};\n\n\t// IExternalDatafeed implementation\n\tonReady(callback) {\n\t\t// using setTimeout because tradingview wants this to resolve asynchronously\n\t\tsetTimeout(() => callback(DATAFEED_CONFIG), 0);\n\t}\n\n\t// IDatafeedChartApi implementation\n\tsearchSymbols(\n\t\tuserInput: string,\n\t\t_exchange: string,\n\t\t_symbolType: string,\n\t\tonResult\n\t): void {\n\t\tif (!userInput) return onResult([]);\n\n\t\tconst res = this.searchMarkets(userInput);\n\n\t\tonResult(res);\n\t}\n\n\tresolveSymbol(symbolName: string, onResolve, onError): void {\n\t\tconst targetMarket = findMarketBySymbol(\n\t\t\tsymbolName,\n\t\t\tthis.perpMarketConfigs,\n\t\t\tthis.spotMarketConfigs\n\t\t);\n\n\t\tif (targetMarket) {\n\t\t\tconst tvMarketName = targetMarket.config.symbol;\n\n\t\t\tlet tickSize: number;\n\n\t\t\tif (targetMarket.type === 'perp') {\n\t\t\t\ttickSize = this.driftClient\n\t\t\t\t\t.getPerpMarketAccount(targetMarket.config.marketIndex)\n\t\t\t\t\t.amm.orderTickSize.toNumber();\n\t\t\t} else {\n\t\t\t\ttickSize = this.driftClient\n\t\t\t\t\t.getSpotMarketAccount(targetMarket.config.marketIndex)\n\t\t\t\t\t.orderTickSize.toNumber();\n\t\t\t}\n\n\t\t\tconst pricePrecisionExp = PRICE_PRECISION_EXP.toNumber();\n\t\t\tconst tickSizeExp = Math.ceil(Math.log10(tickSize));\n\t\t\tconst priceScaleExponent = Math.max(0, pricePrecisionExp - tickSizeExp);\n\t\t\tconst priceScale = 10 ** priceScaleExponent;\n\n\t\t\tonResolve({\n\t\t\t\tname: tvMarketName,\n\t\t\t\tfull_name: tvMarketName,\n\t\t\t\tdescription: tvMarketName,\n\t\t\t\texchange: 'Drift',\n\t\t\t\tticker: targetMarket.config.symbol,\n\t\t\t\ttype: 'crypto',\n\t\t\t\tsession: '24x7',\n\t\t\t\ttimezone: 'Etc/UTC',\n\t\t\t\tlisted_exchange: 'Drift',\n\t\t\t\tformat: 'price',\n\t\t\t\tpricescale: priceScale,\n\t\t\t\tminmov: 1,\n\t\t\t\tsupported_resolutions: [...resolutions],\n\t\t\t\thas_intraday: true,\n\t\t\t\tintraday_multipliers: ['1', '5', '15', '60', '240'],\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tonError(`Couldn't find market for symbol ${symbolName}`);\n\t}\n\n\t/**\n\t * TradingView sometimes asks for a FROM timestamp halfway between two candles, this isn't compatible with the new candles API so we round these down the nearest candle - which should be the exact same candle!!\n\t * @param timestamp\n\t * @param resolution\n\t * @returns\n\t */\n\tprivate roundFromTimestampToExactCandleTs = (\n\t\ttimestamp: number,\n\t\tresolution: CandleResolution\n\t) => {\n\t\tconst ROUND_UP = true;\n\n\t\tconst timestampMs = timestamp * 1000;\n\t\tconst candleLengthMs = Candle.resolutionStringToCandleLengthMs(resolution);\n\n\t\tconst remainderMs = timestampMs % candleLengthMs;\n\n\t\tif (remainderMs === 0) {\n\t\t\treturn timestamp;\n\t\t}\n\n\t\tconst roundedDownTimestampMs = timestampMs - remainderMs;\n\n\t\tconst roundedTimestampMs = ROUND_UP\n\t\t\t? roundedDownTimestampMs + candleLengthMs\n\t\t\t: roundedDownTimestampMs;\n\n\t\treturn roundedTimestampMs / 1000;\n\t};\n\n\tprivate formatTVRequestedRange = (\n\t\tfromTs: number,\n\t\ttoTs: number,\n\t\tresolution: CandleResolution\n\t) => {\n\t\tconst formattedFromTs = this.roundFromTimestampToExactCandleTs(\n\t\t\tfromTs,\n\t\t\tresolution\n\t\t); // TradingView sometimes asks for a FROM timestamp halfway between two candles, so we round down to the nearest candle\n\n\t\tconst formattedToTs = Math.floor(Math.min(toTs, Date.now() / 1000)); // TradingView sometimes asks for a TO timestamp in the future, so we cap it at the current timestamp\n\n\t\treturn {\n\t\t\tfrom: formattedFromTs,\n\t\t\tto: formattedToTs,\n\t\t};\n\t};\n\t// https://www.tradingview.com/charting-library-docs/latest/api/interfaces/Charting_Library.Mark/ reference for marks type\n\tasync getMarks(_symbolInfo, startDate, endDate, onDataCallback, _resolution) {\n\t\tif (!this.tvAppTradeDataManager) {\n\t\t\treturn;\n\t\t}\n\t\tconst orderHistory = await this.tvAppTradeDataManager.getFilledOrdersData(\n\t\t\tstartDate,\n\t\t\tendDate\n\t\t);\n\n\t\tconst currentUserAccount =\n\t\t\tthis.tvAppTradeDataManager.getCurrentSubAccountAddress();\n\n\t\tconst tradeMarks = orderHistory.map((trade) => {\n\t\t\tconst currentUserIsMaker = trade.maker === currentUserAccount;\n\t\t\tconst currentUserIsTaker = trade.taker === currentUserAccount;\n\n\t\t\tlet isLong: boolean;\n\t\t\tif (currentUserIsMaker) {\n\t\t\t\tisLong = trade.makerOrderDirection === 'long';\n\t\t\t} else if (currentUserIsTaker) {\n\t\t\t\tisLong = trade.takerOrderDirection === 'long';\n\t\t\t}\n\n\t\t\tconst color = isLong ? '#5DD5A0' : '#FF615C';\n\t\t\tconst baseAmount = Number(trade.baseAssetAmountFilled);\n\t\t\tconst quoteAmount = Number(trade.quoteAssetAmountFilled);\n\t\t\tconst avgPrice = quoteAmount / baseAmount;\n\n\t\t\tconst formatPrice = (price: number): string => {\n\t\t\t\tif (price >= 1) {\n\t\t\t\t\treturn price.toLocaleString('en-US', {\n\t\t\t\t\t\tminimumFractionDigits: 2,\n\t\t\t\t\t\tmaximumFractionDigits: 2,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (price === 0) return '0.0000';\n\t\t\t\t\tif (price < 0.00001) return '<0.00001';\n\t\t\t\t\treturn price.toFixed(4);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid: trade.txSig,\n\t\t\t\ttime: trade.ts,\n\t\t\t\tcolor: {\n\t\t\t\t\tbackground: color,\n\t\t\t\t\tborder: '#152A44',\n\t\t\t\t},\n\t\t\t\tborderWidth: 1,\n\t\t\t\thoveredBorderWidth: 1,\n\t\t\t\ttext: `${isLong ? 'Long' : 'Short'} at $${formatPrice(avgPrice)}`,\n\t\t\t\tlabel: isLong ? 'B' : 'S',\n\t\t\t\tlabelFontColor: '#000000',\n\t\t\t\tminSize: 16,\n\t\t\t};\n\t\t});\n\n\t\tonDataCallback(tradeMarks);\n\t}\n\n\tasync getBars(\n\t\tsymbolInfo: {\n\t\t\tname: string;\n\t\t\tticker?: string;\n\t\t},\n\t\tresolution: string,\n\t\tperiodParams: {\n\t\t\tcountBack: number;\n\t\t\tfrom: number;\n\t\t\tto: number;\n\t\t},\n\t\tonResult: (\n\t\t\tbars: TVBar[],\n\t\t\tmeta?: {\n\t\t\t\tnoData: boolean;\n\t\t\t}\n\t\t) => void,\n\t\t_onError\n\t) {\n\t\t// Can automatically return no data if the requested range is before the Drift V2 launch\n\t\tif (periodParams.to < DRIFT_V2_START_TS) {\n\t\t\tonResult([], {\n\t\t\t\tnoData: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst symbolToUse = symbolInfo.ticker ?? symbolInfo.name;\n\n\t\tconst targetResolution =\n\t\t\ttvResolutionStringToStandardResolutionString(resolution);\n\t\tconst targetMarket = findMarketBySymbol(\n\t\t\tsymbolToUse,\n\t\t\tthis.perpMarketConfigs,\n\t\t\tthis.spotMarketConfigs\n\t\t);\n\t\tconst targetMarketId =\n\t\t\ttargetMarket.type === 'perp'\n\t\t\t\t? MarketId.createPerpMarket(targetMarket.config.marketIndex)\n\t\t\t\t: MarketId.createSpotMarket(targetMarket.config.marketIndex);\n\n\t\tconst fetchCandles = async () => {\n\t\t\tconst formattedTsRange = this.formatTVRequestedRange(\n\t\t\t\tperiodParams.from,\n\t\t\t\tperiodParams.to,\n\t\t\t\ttargetResolution\n\t\t\t);\n\n\t\t\tconst candles = await this.candleClient.fetch({\n\t\t\t\tenv: this.env,\n\t\t\t\tmarketId: targetMarketId,\n\t\t\t\tresolution: targetResolution,\n\t\t\t\tfromTs: formattedTsRange.from,\n\t\t\t\ttoTs: formattedTsRange.to,\n\t\t\t});\n\t\t\treturn candles;\n\t\t};\n\n\t\tconst candlesResult = await PollingSequenceGuard.fetch(\n\t\t\tcandleFetchingPollKey,\n\t\t\tfetchCandles\n\t\t);\n\n\t\tif (candlesResult.length === 0) {\n\t\t\tonResult([], {\n\t\t\t\tnoData: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst bars = candlesResult.map((candle) =>\n\t\t\tcandleToTvBar(candle, this.candleType)\n\t\t);\n\n\t\tonResult(bars, {\n\t\t\tnoData: candlesResult.length === 0,\n\t\t});\n\n\t\treturn;\n\t}\n\n\tasync subscribeBars(\n\t\tsymbolInfo,\n\t\tresolution,\n\t\tonTick,\n\t\tsubscriberGuid: string,\n\t\tonResetCache\n\t) {\n\t\tthis.onResetCache = onResetCache;\n\n\t\tconst targetResolution =\n\t\t\ttvResolutionStringToStandardResolutionString(resolution);\n\t\tconst targetMarket = findMarketBySymbol(\n\t\t\tsymbolInfo.ticker,\n\t\t\tthis.perpMarketConfigs,\n\t\t\tthis.spotMarketConfigs\n\t\t);\n\t\tconst targetMarketId =\n\t\t\ttargetMarket.type === 'perp'\n\t\t\t\t? MarketId.createPerpMarket(targetMarket.config.marketIndex)\n\t\t\t\t: MarketId.createSpotMarket(targetMarket.config.marketIndex);\n\n\t\t// First create the subscription and wait for it to be ready\n\t\tawait this.candleClient.subscribe(\n\t\t\t{\n\t\t\t\tresolution: targetResolution,\n\t\t\t\tmarketId: targetMarketId,\n\t\t\t\tenv: this.env,\n\t\t\t},\n\t\t\tsubscriberGuid\n\t\t);\n\n\t\t// Then set up the event listener once the eventBus exists\n\t\tthis.candleClient.on(subscriberGuid, 'candle-update', (newCandle) => {\n\t\t\tconst newBar = candleToTvBar(newCandle, this.candleType);\n\n\t\t\tonTick(newBar);\n\t\t});\n\t}\n\n\tunsubscribeBars(listenerGuid: string): void {\n\t\tthis.candleClient.unsubscribe(listenerGuid);\n\t}\n}\n"]}
1
+ {"version":3,"file":"tvFeed.js","sourceRoot":"","sources":["../../src/clients/tvFeed.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tCandleResolution,\n\tDriftClient,\n\tPerpMarketConfig,\n\tPRICE_PRECISION_EXP,\n\tSpotMarketConfig,\n} from '@drift-labs/sdk';\nimport { CandleType, JsonCandle, JsonTrade, MarketId } from '../types';\nimport { UIEnv } from '../types/UIEnv';\nimport { Candle } from '../utils/candles/Candle';\nimport { PollingSequenceGuard } from '../utils/pollingSequenceGuard';\nimport { CandleClient } from './candleClient';\nimport { MARKET_UTILS } from '../common-ui-utils/market';\n\nconst DRIFT_V2_START_TS = 1668470400; // 15th November 2022 ... 2022-11-15T00:00:00.000Z\n\ntype MarketDecimalConfig = Record<string, number>;\n\nconst resolutions = [\n\t'1',\n\t'3',\n\t'5',\n\t'15',\n\t'30',\n\t'60',\n\t'240',\n\t'6H',\n\t'8H',\n\t'1D',\n\t'3D',\n\t'1W',\n\t'1M',\n];\n\nconst tvResolutionStringToStandardResolutionString = (\n\ttvResolutionString\n): CandleResolution => {\n\tswitch (tvResolutionString) {\n\t\tcase '1':\n\t\t\treturn '1';\n\t\tcase '5':\n\t\t\treturn '5';\n\t\tcase '15':\n\t\t\treturn '15';\n\t\tcase '60':\n\t\t\treturn '60';\n\t\tcase '240':\n\t\t\treturn '240';\n\t\tcase 'D':\n\t\tcase '1D':\n\t\t\treturn 'D';\n\t\tcase 'W':\n\t\tcase '1W':\n\t\t\treturn 'W';\n\t\tcase 'M':\n\t\tcase '1M':\n\t\t\treturn 'M';\n\t}\n};\n\ntype TVMarketInfo = {\n\tsymbol: string;\n\tfull_name: string;\n\tdescription: string;\n\texchange: string;\n\tticker: string;\n\ttype: string;\n};\n\nconst DATAFEED_CONFIG = {\n\texchanges: [],\n\tsupported_resolutions: [...resolutions],\n\tcurrency_codes: [],\n\tsupports_marks: true,\n\tsupports_time: false,\n\tsupports_timescale_marks: false,\n\tsymbols_types: [],\n};\n\ntype TVBar = {\n\t/** Bar time.\n\t * Amount of **milliseconds** since Unix epoch start in **UTC** timezone.\n\t * `time` for daily, weekly, and monthly bars is expected to be a trading day (not session start day) at 00:00 UTC.\n\t * The library adjusts time according to `session` from {@link LibrarySymbolInfo}.\n\t */\n\ttime: number;\n\t/** Opening price */\n\topen: number;\n\t/** High price */\n\thigh: number;\n\t/** Low price */\n\tlow: number;\n\t/** Closing price */\n\tclose: number;\n\t/** Trading Volume */\n\tvolume?: number;\n};\n\nconst findMarketBySymbol = (\n\tsymbol: string,\n\tperpMarketConfigs: PerpMarketConfig[],\n\tspotMarketConfigs: SpotMarketConfig[]\n):\n\t| {\n\t\t\ttype: 'perp';\n\t\t\tconfig: PerpMarketConfig;\n\t }\n\t| {\n\t\t\ttype: 'spot';\n\t\t\tconfig: SpotMarketConfig;\n\t } => {\n\tif (!symbol) {\n\t\tthrow new Error(`TVFeed::No symbol provided`);\n\t}\n\n\tconst sanitisedSymbol = symbol.toLowerCase().replace('/usdc', ''); // Lowercase and replace /usdc (for spot markets) to santise symbol for lookup\n\n\tconst isPerp = sanitisedSymbol.toLowerCase().includes('perp');\n\n\tconst matchingMarketConfig = isPerp\n\t\t? perpMarketConfigs.find((mkt) =>\n\t\t\t\tmkt.symbol.toLowerCase().includes(sanitisedSymbol.toLowerCase())\n\t\t )\n\t\t: spotMarketConfigs.find((mkt) =>\n\t\t\t\tmkt.symbol.toLowerCase().includes(sanitisedSymbol.toLowerCase())\n\t\t );\n\n\tif (!matchingMarketConfig) {\n\t\tthrow new Error(`TVFeed::No market found for symbol ${symbol}`);\n\t}\n\n\tif (isPerp) {\n\t\treturn {\n\t\t\ttype: 'perp',\n\t\t\tconfig: matchingMarketConfig as PerpMarketConfig,\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'spot',\n\t\tconfig: matchingMarketConfig as SpotMarketConfig,\n\t};\n};\n\nconst candleFetchingPollKey = Symbol('candleFetchingPollKey');\n\nconst candleToTvBar = (candle: JsonCandle, candleType: CandleType): TVBar => {\n\tconst useOraclePrice = candleType === CandleType.ORACLE_PRICE;\n\n\treturn {\n\t\ttime: candle.ts * 1000,\n\t\topen: useOraclePrice ? candle.oracleOpen : candle.fillOpen,\n\t\thigh: useOraclePrice ? candle.oracleHigh : candle.fillHigh,\n\t\tlow: useOraclePrice ? candle.oracleLow : candle.fillLow,\n\t\tclose: useOraclePrice ? candle.oracleClose : candle.fillClose,\n\t\tvolume: candle.quoteVolume,\n\t};\n};\n\nconst PerpMarketConfigToTVMarketInfo = (\n\tmarketConfig: PerpMarketConfig\n): TVMarketInfo => {\n\treturn {\n\t\tsymbol: marketConfig.symbol,\n\t\tfull_name: marketConfig.fullName,\n\t\tdescription: marketConfig.fullName,\n\t\texchange: 'Drift',\n\t\tticker: marketConfig.symbol,\n\t\ttype: 'crypto',\n\t};\n};\n\nconst SpotMarketConfigToTVMarketInfo = (\n\tmarketConfig: SpotMarketConfig\n): TVMarketInfo => {\n\treturn {\n\t\tsymbol: marketConfig.symbol,\n\t\tfull_name: marketConfig.symbol,\n\t\tdescription: marketConfig.symbol,\n\t\texchange: 'Drift',\n\t\tticker: marketConfig.symbol,\n\t\ttype: 'crypto',\n\t};\n};\n\ninterface TvAppTradeDataManager {\n\tgetFilledOrdersData(startDate: number, endDate: number): Promise<JsonTrade[]>;\n\tgetCurrentSubAccountAddress(): string | null;\n}\n\nexport class DriftTvFeed {\n\tprivate env: UIEnv;\n\tprivate candleType: CandleType;\n\tprivate candleClient: CandleClient;\n\tprivate driftClient: DriftClient;\n\tprivate onResetCache: () => void;\n\tprivate perpMarketConfigs: PerpMarketConfig[];\n\tprivate spotMarketConfigs: SpotMarketConfig[];\n\tprivate tvAppTradeDataManager: TvAppTradeDataManager | undefined;\n\tprivate marketDecimalConfig: MarketDecimalConfig | undefined;\n\n\tconstructor(\n\t\tenv: UIEnv,\n\t\tcandleType: CandleType,\n\t\tdriftClient: DriftClient,\n\t\tperpMarketConfigs: PerpMarketConfig[],\n\t\tspotMarketConfigs: SpotMarketConfig[],\n\t\ttvAppTradeDataManager?: TvAppTradeDataManager,\n\t\tmarketDecimalConfig?: MarketDecimalConfig\n\t) {\n\t\tthis.env = env;\n\t\tthis.candleType = candleType;\n\t\tthis.candleClient = new CandleClient();\n\t\tthis.driftClient = driftClient;\n\t\tthis.perpMarketConfigs = perpMarketConfigs;\n\t\tthis.spotMarketConfigs = spotMarketConfigs;\n\t\tthis.tvAppTradeDataManager = tvAppTradeDataManager;\n\t\tthis.marketDecimalConfig = marketDecimalConfig;\n\t}\n\n\tpublic resetCache() {\n\t\tthis.onResetCache?.();\n\t}\n\n\tprivate searchMarkets = (symbol: string): TVMarketInfo[] => {\n\t\tconst res: Pick<\n\t\t\tTVMarketInfo,\n\t\t\t'symbol' | 'ticker' | 'full_name' | 'description'\n\t\t>[] = [];\n\n\t\tconst currentPerpMarkets = this.perpMarketConfigs;\n\t\tconst currentSpotMarkets = this.spotMarketConfigs;\n\n\t\tif (!symbol) {\n\t\t\tres.push(PerpMarketConfigToTVMarketInfo(currentPerpMarkets[0]));\n\t\t} else {\n\t\t\tfor (const market of currentPerpMarkets) {\n\t\t\t\tconst lowerCaseMarket = market.symbol.toLowerCase();\n\t\t\t\tif (lowerCaseMarket.includes(symbol.toLowerCase())) {\n\t\t\t\t\tres.push(PerpMarketConfigToTVMarketInfo(market));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const market of currentSpotMarkets) {\n\t\t\t\tconst lowerCaseMarket = market.symbol.toLowerCase();\n\t\t\t\tif (lowerCaseMarket.includes(symbol.toLowerCase())) {\n\t\t\t\t\tres.push(SpotMarketConfigToTVMarketInfo(market));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res.map((mkt) => {\n\t\t\treturn {\n\t\t\t\t...mkt,\n\t\t\t\texchange: 'Drift',\n\t\t\t\ttype: 'crypto',\n\t\t\t};\n\t\t});\n\t};\n\n\t// IExternalDatafeed implementation\n\tonReady(callback) {\n\t\t// using setTimeout because tradingview wants this to resolve asynchronously\n\t\tsetTimeout(() => callback(DATAFEED_CONFIG), 0);\n\t}\n\n\t// IDatafeedChartApi implementation\n\tsearchSymbols(\n\t\tuserInput: string,\n\t\t_exchange: string,\n\t\t_symbolType: string,\n\t\tonResult\n\t): void {\n\t\tif (!userInput) return onResult([]);\n\n\t\tconst res = this.searchMarkets(userInput);\n\n\t\tonResult(res);\n\t}\n\n\tresolveSymbol(symbolName: string, onResolve, onError): void {\n\t\tconst targetMarket = findMarketBySymbol(\n\t\t\tsymbolName,\n\t\t\tthis.perpMarketConfigs,\n\t\t\tthis.spotMarketConfigs\n\t\t);\n\n\t\tif (targetMarket) {\n\t\t\tconst tvMarketName = targetMarket.config.symbol;\n\n\t\t\t// Use market-specific decimal precision from configuration\n\t\t\tconst baseAssetSymbol = MARKET_UTILS.getBaseAssetSymbol(symbolName);\n\t\t\tconst marketDecimals = this.marketDecimalConfig?.[baseAssetSymbol];\n\n\t\t\tlet priceScale: number;\n\n\t\t\tif (marketDecimals !== undefined) {\n\t\t\t\t// Use configured market decimals\n\t\t\t\tpriceScale = 10 ** marketDecimals;\n\t\t\t} else {\n\t\t\t\t// Fall back to original tick size calculation\n\t\t\t\tlet tickSize: number;\n\n\t\t\t\tif (targetMarket.type === 'perp') {\n\t\t\t\t\ttickSize = this.driftClient\n\t\t\t\t\t\t.getPerpMarketAccount(targetMarket.config.marketIndex)\n\t\t\t\t\t\t.amm.orderTickSize.toNumber();\n\t\t\t\t} else {\n\t\t\t\t\ttickSize = this.driftClient\n\t\t\t\t\t\t.getSpotMarketAccount(targetMarket.config.marketIndex)\n\t\t\t\t\t\t.orderTickSize.toNumber();\n\t\t\t\t}\n\n\t\t\t\tconst pricePrecisionExp = PRICE_PRECISION_EXP.toNumber();\n\t\t\t\tconst tickSizeExp = Math.ceil(Math.log10(tickSize));\n\t\t\t\tconst priceScaleExponent = Math.max(0, pricePrecisionExp - tickSizeExp);\n\t\t\t\tpriceScale = 10 ** priceScaleExponent;\n\t\t\t}\n\n\t\t\tonResolve({\n\t\t\t\tname: tvMarketName,\n\t\t\t\tfull_name: tvMarketName,\n\t\t\t\tdescription: tvMarketName,\n\t\t\t\texchange: 'Drift',\n\t\t\t\tticker: targetMarket.config.symbol,\n\t\t\t\ttype: 'crypto',\n\t\t\t\tsession: '24x7',\n\t\t\t\ttimezone: 'Etc/UTC',\n\t\t\t\tlisted_exchange: 'Drift',\n\t\t\t\tformat: 'price',\n\t\t\t\tpricescale: priceScale,\n\t\t\t\tminmov: 1,\n\t\t\t\tsupported_resolutions: [...resolutions],\n\t\t\t\thas_intraday: true,\n\t\t\t\tintraday_multipliers: ['1', '5', '15', '60', '240'],\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tonError(`Couldn't find market for symbol ${symbolName}`);\n\t}\n\n\t/**\n\t * TradingView sometimes asks for a FROM timestamp halfway between two candles, this isn't compatible with the new candles API so we round these down the nearest candle - which should be the exact same candle!!\n\t * @param timestamp\n\t * @param resolution\n\t * @returns\n\t */\n\tprivate roundFromTimestampToExactCandleTs = (\n\t\ttimestamp: number,\n\t\tresolution: CandleResolution\n\t) => {\n\t\tconst ROUND_UP = true;\n\n\t\tconst timestampMs = timestamp * 1000;\n\t\tconst candleLengthMs = Candle.resolutionStringToCandleLengthMs(resolution);\n\n\t\tconst remainderMs = timestampMs % candleLengthMs;\n\n\t\tif (remainderMs === 0) {\n\t\t\treturn timestamp;\n\t\t}\n\n\t\tconst roundedDownTimestampMs = timestampMs - remainderMs;\n\n\t\tconst roundedTimestampMs = ROUND_UP\n\t\t\t? roundedDownTimestampMs + candleLengthMs\n\t\t\t: roundedDownTimestampMs;\n\n\t\treturn roundedTimestampMs / 1000;\n\t};\n\n\tprivate formatTVRequestedRange = (\n\t\tfromTs: number,\n\t\ttoTs: number,\n\t\tresolution: CandleResolution\n\t) => {\n\t\tconst formattedFromTs = this.roundFromTimestampToExactCandleTs(\n\t\t\tfromTs,\n\t\t\tresolution\n\t\t); // TradingView sometimes asks for a FROM timestamp halfway between two candles, so we round down to the nearest candle\n\n\t\tconst formattedToTs = Math.floor(Math.min(toTs, Date.now() / 1000)); // TradingView sometimes asks for a TO timestamp in the future, so we cap it at the current timestamp\n\n\t\treturn {\n\t\t\tfrom: formattedFromTs,\n\t\t\tto: formattedToTs,\n\t\t};\n\t};\n\t// https://www.tradingview.com/charting-library-docs/latest/api/interfaces/Charting_Library.Mark/ reference for marks type\n\tasync getMarks(_symbolInfo, startDate, endDate, onDataCallback, _resolution) {\n\t\tif (!this.tvAppTradeDataManager) {\n\t\t\treturn;\n\t\t}\n\t\tconst orderHistory = await this.tvAppTradeDataManager.getFilledOrdersData(\n\t\t\tstartDate,\n\t\t\tendDate\n\t\t);\n\n\t\tconst currentUserAccount =\n\t\t\tthis.tvAppTradeDataManager.getCurrentSubAccountAddress();\n\n\t\tconst tradeMarks = orderHistory.map((trade) => {\n\t\t\tconst currentUserIsMaker = trade.maker === currentUserAccount;\n\t\t\tconst currentUserIsTaker = trade.taker === currentUserAccount;\n\n\t\t\tlet isLong: boolean;\n\t\t\tif (currentUserIsMaker) {\n\t\t\t\tisLong = trade.makerOrderDirection === 'long';\n\t\t\t} else if (currentUserIsTaker) {\n\t\t\t\tisLong = trade.takerOrderDirection === 'long';\n\t\t\t}\n\n\t\t\tconst color = isLong ? '#5DD5A0' : '#FF615C';\n\t\t\tconst baseAmount = Number(trade.baseAssetAmountFilled);\n\t\t\tconst quoteAmount = Number(trade.quoteAssetAmountFilled);\n\t\t\tconst avgPrice = quoteAmount / baseAmount;\n\n\t\t\tconst formatPrice = (price: number): string => {\n\t\t\t\tif (price >= 1) {\n\t\t\t\t\treturn price.toLocaleString('en-US', {\n\t\t\t\t\t\tminimumFractionDigits: 2,\n\t\t\t\t\t\tmaximumFractionDigits: 2,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (price === 0) return '0.0000';\n\t\t\t\t\tif (price < 0.00001) return '<0.00001';\n\t\t\t\t\treturn price.toFixed(4);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tid: trade.txSig,\n\t\t\t\ttime: trade.ts,\n\t\t\t\tcolor: {\n\t\t\t\t\tbackground: color,\n\t\t\t\t\tborder: '#152A44',\n\t\t\t\t},\n\t\t\t\tborderWidth: 1,\n\t\t\t\thoveredBorderWidth: 1,\n\t\t\t\ttext: `${isLong ? 'Long' : 'Short'} at $${formatPrice(avgPrice)}`,\n\t\t\t\tlabel: isLong ? 'B' : 'S',\n\t\t\t\tlabelFontColor: '#000000',\n\t\t\t\tminSize: 16,\n\t\t\t};\n\t\t});\n\n\t\tonDataCallback(tradeMarks);\n\t}\n\n\tasync getBars(\n\t\tsymbolInfo: {\n\t\t\tname: string;\n\t\t\tticker?: string;\n\t\t},\n\t\tresolution: string,\n\t\tperiodParams: {\n\t\t\tcountBack: number;\n\t\t\tfrom: number;\n\t\t\tto: number;\n\t\t},\n\t\tonResult: (\n\t\t\tbars: TVBar[],\n\t\t\tmeta?: {\n\t\t\t\tnoData: boolean;\n\t\t\t}\n\t\t) => void,\n\t\t_onError\n\t) {\n\t\t// Can automatically return no data if the requested range is before the Drift V2 launch\n\t\tif (periodParams.to < DRIFT_V2_START_TS) {\n\t\t\tonResult([], {\n\t\t\t\tnoData: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst symbolToUse = symbolInfo.ticker ?? symbolInfo.name;\n\n\t\tconst targetResolution =\n\t\t\ttvResolutionStringToStandardResolutionString(resolution);\n\t\tconst targetMarket = findMarketBySymbol(\n\t\t\tsymbolToUse,\n\t\t\tthis.perpMarketConfigs,\n\t\t\tthis.spotMarketConfigs\n\t\t);\n\t\tconst targetMarketId =\n\t\t\ttargetMarket.type === 'perp'\n\t\t\t\t? MarketId.createPerpMarket(targetMarket.config.marketIndex)\n\t\t\t\t: MarketId.createSpotMarket(targetMarket.config.marketIndex);\n\n\t\tconst fetchCandles = async () => {\n\t\t\tconst formattedTsRange = this.formatTVRequestedRange(\n\t\t\t\tperiodParams.from,\n\t\t\t\tperiodParams.to,\n\t\t\t\ttargetResolution\n\t\t\t);\n\n\t\t\tconst candles = await this.candleClient.fetch({\n\t\t\t\tenv: this.env,\n\t\t\t\tmarketId: targetMarketId,\n\t\t\t\tresolution: targetResolution,\n\t\t\t\tfromTs: formattedTsRange.from,\n\t\t\t\ttoTs: formattedTsRange.to,\n\t\t\t});\n\t\t\treturn candles;\n\t\t};\n\n\t\tconst candlesResult = await PollingSequenceGuard.fetch(\n\t\t\tcandleFetchingPollKey,\n\t\t\tfetchCandles\n\t\t);\n\n\t\tif (candlesResult.length === 0) {\n\t\t\tonResult([], {\n\t\t\t\tnoData: true,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst bars = candlesResult.map((candle) =>\n\t\t\tcandleToTvBar(candle, this.candleType)\n\t\t);\n\n\t\tonResult(bars, {\n\t\t\tnoData: candlesResult.length === 0,\n\t\t});\n\n\t\treturn;\n\t}\n\n\tasync subscribeBars(\n\t\tsymbolInfo,\n\t\tresolution,\n\t\tonTick,\n\t\tsubscriberGuid: string,\n\t\tonResetCache\n\t) {\n\t\tthis.onResetCache = onResetCache;\n\n\t\tconst targetResolution =\n\t\t\ttvResolutionStringToStandardResolutionString(resolution);\n\t\tconst targetMarket = findMarketBySymbol(\n\t\t\tsymbolInfo.ticker,\n\t\t\tthis.perpMarketConfigs,\n\t\t\tthis.spotMarketConfigs\n\t\t);\n\t\tconst targetMarketId =\n\t\t\ttargetMarket.type === 'perp'\n\t\t\t\t? MarketId.createPerpMarket(targetMarket.config.marketIndex)\n\t\t\t\t: MarketId.createSpotMarket(targetMarket.config.marketIndex);\n\n\t\t// First create the subscription and wait for it to be ready\n\t\tawait this.candleClient.subscribe(\n\t\t\t{\n\t\t\t\tresolution: targetResolution,\n\t\t\t\tmarketId: targetMarketId,\n\t\t\t\tenv: this.env,\n\t\t\t},\n\t\t\tsubscriberGuid\n\t\t);\n\n\t\t// Then set up the event listener once the eventBus exists\n\t\tthis.candleClient.on(subscriberGuid, 'candle-update', (newCandle) => {\n\t\t\tconst newBar = candleToTvBar(newCandle, this.candleType);\n\n\t\t\tonTick(newBar);\n\t\t});\n\t}\n\n\tunsubscribeBars(listenerGuid: string): void {\n\t\tthis.candleClient.unsubscribe(listenerGuid);\n\t}\n}\n"]}
@@ -8,6 +8,8 @@ export declare const COMMON_UI_UTILS: {
8
8
  getLimitPriceFromOracleOffset: (order: import("..").UISerializableOrder, oraclePrice: BigNum) => BigNum;
9
9
  isAuctionEmpty: (auctionParams: AuctionParams) => boolean;
10
10
  getUIOrderTypeFromSdkOrderType: (orderType: OrderType, triggerCondition: import("@drift-labs/sdk").OrderTriggerCondition, direction: PositionDirection, oracleOffset: BigNum) => import("src/types").UIOrderTypeValue;
11
+ getPerpAuctionDuration: (priceDiff: BN, price: BN, contractTier: import("@drift-labs/sdk").ContractTier) => number;
12
+ getPerpOrderParamsBitFlags: (marketIndex: number, driftClient: DriftClient, userAccount: User, quoteSize: BN, side: PositionDirection, enterHighLeverageModeBufferPct?: number) => number;
11
13
  getBaseAssetSymbol: (marketName: string, removePrefix?: boolean) => string;
12
14
  getPausedOperations: (marketAccount: import("@drift-labs/sdk").SpotMarketAccount | import("@drift-labs/sdk").PerpMarketAccount) => string[];
13
15
  PerpOperationsMap: {
@@ -36,6 +38,11 @@ export declare const COMMON_UI_UTILS: {
36
38
  spot: {};
37
39
  }, marketIndex: number): SpotMarketConfig;
38
40
  };
41
+ getMaxLeverageForMarket: (marketType: MarketType, marketIndex: number, driftClient: DriftClient) => {
42
+ maxLeverage: number;
43
+ highLeverageMaxLeverage: number;
44
+ hasHighLeverage: boolean;
45
+ };
39
46
  calculatePnlPctFromPosition: (pnl: BN, quoteEntryAmount: BN, leverage?: number) => number;
40
47
  calculatePotentialProfit: (props: {
41
48
  currentPositionSize: BigNum;
@@ -1,4 +1,4 @@
1
- import { PerpMarketAccount, SpotMarketAccount, MarketType, SpotMarketConfig, DriftEnv, PerpMarketConfig } from '@drift-labs/sdk';
1
+ import { PerpMarketAccount, SpotMarketAccount, MarketType, SpotMarketConfig, DriftEnv, PerpMarketConfig, DriftClient } from '@drift-labs/sdk';
2
2
  declare function getMarketConfig(driftEnv: DriftEnv, marketType: typeof MarketType.PERP, marketIndex: number): PerpMarketConfig;
3
3
  declare function getMarketConfig(driftEnv: DriftEnv, marketType: typeof MarketType.SPOT, marketIndex: number): SpotMarketConfig;
4
4
  export declare const MARKET_UTILS: {
@@ -23,5 +23,10 @@ export declare const MARKET_UTILS: {
23
23
  REMOVE: string;
24
24
  };
25
25
  getMarketConfig: typeof getMarketConfig;
26
+ getMaxLeverageForMarket: (marketType: MarketType, marketIndex: number, driftClient: DriftClient) => {
27
+ maxLeverage: number;
28
+ highLeverageMaxLeverage: number;
29
+ hasHighLeverage: boolean;
30
+ };
26
31
  };
27
32
  export {};
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MARKET_UTILS = void 0;
4
4
  const sdk_1 = require("@drift-labs/sdk");
5
5
  const utils_1 = require("../utils");
6
+ const markets_1 = require("../constants/markets");
6
7
  const getBaseAssetSymbol = (marketName, removePrefix = false) => {
7
8
  let baseAssetSymbol = marketName.replace('-PERP', '').replace('/USDC', '');
8
9
  if (removePrefix) {
@@ -69,6 +70,50 @@ function getMarketConfig(driftEnv, marketType, marketIndex) {
69
70
  return sdk_1.SpotMarkets[driftEnv][marketIndex];
70
71
  }
71
72
  }
73
+ const getMaxLeverageForMarket = (marketType, marketIndex, driftClient) => {
74
+ try {
75
+ if ((0, sdk_1.isVariant)(marketType, 'perp')) {
76
+ const marketAccount = driftClient.getPerpMarketAccount(marketIndex);
77
+ const maxLeverage = parseFloat((1 /
78
+ (((marketAccount === null || marketAccount === void 0 ? void 0 : marketAccount.marginRatioInitial)
79
+ ? marketAccount.marginRatioInitial
80
+ : 10000 / markets_1.DEFAULT_MAX_MARKET_LEVERAGE) /
81
+ 10000)).toFixed(2));
82
+ const marketHasHighLeverageMode = !!(marketAccount === null || marketAccount === void 0 ? void 0 : marketAccount.highLeverageMarginRatioInitial);
83
+ const highLeverageMaxLeverage = marketHasHighLeverageMode
84
+ ? parseFloat((1 /
85
+ (((marketAccount === null || marketAccount === void 0 ? void 0 : marketAccount.highLeverageMarginRatioInitial)
86
+ ? marketAccount === null || marketAccount === void 0 ? void 0 : marketAccount.highLeverageMarginRatioInitial
87
+ : 10000 / markets_1.DEFAULT_MAX_MARKET_LEVERAGE) /
88
+ 10000)).toFixed(1))
89
+ : 0;
90
+ return {
91
+ maxLeverage,
92
+ highLeverageMaxLeverage,
93
+ hasHighLeverage: marketHasHighLeverageMode,
94
+ };
95
+ }
96
+ else {
97
+ const marketAccount = driftClient.getSpotMarketAccount(marketIndex);
98
+ const liabilityWeight = marketAccount
99
+ ? marketAccount.initialLiabilityWeight / 10000
100
+ : 0;
101
+ return {
102
+ maxLeverage: parseFloat((1 / (liabilityWeight - 1)).toFixed(2)),
103
+ highLeverageMaxLeverage: 0,
104
+ hasHighLeverage: false,
105
+ };
106
+ }
107
+ }
108
+ catch (e) {
109
+ console.error(e);
110
+ return {
111
+ maxLeverage: 0,
112
+ highLeverageMaxLeverage: 0,
113
+ hasHighLeverage: false,
114
+ };
115
+ }
116
+ };
72
117
  exports.MARKET_UTILS = {
73
118
  getBaseAssetSymbol,
74
119
  getPausedOperations,
@@ -76,5 +121,6 @@ exports.MARKET_UTILS = {
76
121
  SpotOperationsMap,
77
122
  InsuranceFundOperationsMap,
78
123
  getMarketConfig,
124
+ getMaxLeverageForMarket,
79
125
  };
80
126
  //# sourceMappingURL=market.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/common-ui-utils/market.ts"],"names":[],"mappings":";;;AAAA,yCAayB;AACzB,oCAAsC;AAEtC,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAE,YAAY,GAAG,KAAK,EAAE,EAAE;IACvE,IAAI,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAE3E,IAAI,YAAY,EAAE,CAAC;QAClB,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACzB,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,YAAY;IACxB,wBAAwB,EAAE,+BAA+B;CACzD,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACzB,0BAA0B,EAAE,4BAA4B;IACxD,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,aAAa;CACvB,CAAC;AAEF,MAAM,0BAA0B,GAAG;IAClC,IAAI,EAAE,eAAe;IACrB,GAAG,EAAE,eAAe;IACpB,cAAc,EAAE,4BAA4B;IAC5C,MAAM,EAAE,kBAAkB;CAC1B,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC3B,aAAoD,EACzC,EAAE;IACb,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,gBAAgB,GAAG,EAAE,CAAC;IAC5B,YAAY;IACZ,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;IAEnC,wBAAwB;IACxB,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,mBAAa,CAAC;aACxB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACrB,IAAA,uBAAiB,EAChB,aAAa,CAAC,gBAAgB,EAC9B,mBAAa,CAAC,SAAS,CAAC,CACxB,CACD;aACA,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YAC5B,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACP,wBAAwB;QACxB,MAAM,CAAC,IAAI,CAAC,mBAAa,CAAC;aACxB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACrB,IAAA,uBAAiB,EAChB,aAAa,CAAC,gBAAgB,EAC9B,mBAAa,CAAC,SAAS,CAAC,CACxB,CACD;aACA,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YAC5B,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEJ,sBAAsB;QACtB,MAAM,CAAC,IAAI,CAAC,4BAAsB,CAAC;aACjC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACrB,IAAA,uBAAiB;QAChB,YAAY;QACZ,aAAa,CAAC,kBAAkB,EAChC,4BAAsB,CAAC,SAAS,CAAC,CACjC,CACD;aACA,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YAC5B,gBAAgB,CAAC,IAAI,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,gBAAgB,CAAC;AACzB,CAAC,CAAC;AAYF,SAAS,eAAe,CACvB,QAAkB,EAClB,UAAsB,EACtB,WAAmB;IAEnB,MAAM,MAAM,GAAG,kBAAU,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAU,CAAC,IAAI,CAAC,CAAC;IAE7D,IAAI,MAAM,EAAE,CAAC;QACZ,OAAO,iBAAW,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACP,OAAO,iBAAW,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;AACF,CAAC;AAEY,QAAA,YAAY,GAAG;IAC3B,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,0BAA0B;IAC1B,eAAe;CACf,CAAC","sourcesContent":["import {\n\tPerpMarketAccount,\n\tPerpOperation,\n\tSpotMarketAccount,\n\tSpotOperation,\n\tisOperationPaused,\n\tInsuranceFundOperation,\n\tMarketType,\n\tSpotMarketConfig,\n\tDriftEnv,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tSpotMarkets,\n} from '@drift-labs/sdk';\nimport { ENUM_UTILS } from '../utils';\n\nconst getBaseAssetSymbol = (marketName: string, removePrefix = false) => {\n\tlet baseAssetSymbol = marketName.replace('-PERP', '').replace('/USDC', '');\n\n\tif (removePrefix) {\n\t\tbaseAssetSymbol = baseAssetSymbol.replace('1K', '').replace('1M', '');\n\t}\n\n\treturn baseAssetSymbol;\n};\n\nconst PerpOperationsMap = {\n\tUPDATE_FUNDING: 'Funding',\n\tAMM_FILL: 'AMM Fills',\n\tFILL: 'Fills',\n\tSETTLE_PNL: 'Settle P&L',\n\tSETTLE_PNL_WITH_POSITION: 'Settle P&L With Open Position',\n};\n\nconst SpotOperationsMap = {\n\tUPDATE_CUMULATIVE_INTEREST: 'Update Cumulative Interest',\n\tFILL: 'Fills',\n\tWITHDRAW: 'Withdrawals',\n};\n\nconst InsuranceFundOperationsMap = {\n\tINIT: 'Initialize IF',\n\tADD: 'Deposit To IF',\n\tREQUEST_REMOVE: 'Request Withdrawal From IF',\n\tREMOVE: 'Withdraw From IF',\n};\n\nconst getPausedOperations = (\n\tmarketAccount: PerpMarketAccount | SpotMarketAccount\n): string[] => {\n\tif (!marketAccount) return [];\n\n\tconst pausedOperations = [];\n\t//@ts-ignore\n\tconst isPerp = !!marketAccount.amm;\n\n\t// check perp operations\n\tif (isPerp) {\n\t\tObject.keys(PerpOperation)\n\t\t\t.filter((operation) =>\n\t\t\t\tisOperationPaused(\n\t\t\t\t\tmarketAccount.pausedOperations,\n\t\t\t\t\tPerpOperation[operation]\n\t\t\t\t)\n\t\t\t)\n\t\t\t.forEach((pausedOperation) => {\n\t\t\t\tpausedOperations.push(PerpOperationsMap[pausedOperation]);\n\t\t\t});\n\t} else {\n\t\t// check spot operations\n\t\tObject.keys(SpotOperation)\n\t\t\t.filter((operation) =>\n\t\t\t\tisOperationPaused(\n\t\t\t\t\tmarketAccount.pausedOperations,\n\t\t\t\t\tSpotOperation[operation]\n\t\t\t\t)\n\t\t\t)\n\t\t\t.forEach((pausedOperation) => {\n\t\t\t\tpausedOperations.push(SpotOperationsMap[pausedOperation]);\n\t\t\t});\n\n\t\t// check IF operations\n\t\tObject.keys(InsuranceFundOperation)\n\t\t\t.filter((operation) =>\n\t\t\t\tisOperationPaused(\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tmarketAccount.ifPausedOperations,\n\t\t\t\t\tInsuranceFundOperation[operation]\n\t\t\t\t)\n\t\t\t)\n\t\t\t.forEach((pausedOperation) => {\n\t\t\t\tpausedOperations.push(InsuranceFundOperationsMap[pausedOperation]);\n\t\t\t});\n\t}\n\n\treturn pausedOperations;\n};\n\nfunction getMarketConfig(\n\tdriftEnv: DriftEnv,\n\tmarketType: typeof MarketType.PERP,\n\tmarketIndex: number\n): PerpMarketConfig;\nfunction getMarketConfig(\n\tdriftEnv: DriftEnv,\n\tmarketType: typeof MarketType.SPOT,\n\tmarketIndex: number\n): SpotMarketConfig;\nfunction getMarketConfig(\n\tdriftEnv: DriftEnv,\n\tmarketType: MarketType,\n\tmarketIndex: number\n): PerpMarketConfig | SpotMarketConfig {\n\tconst isPerp = ENUM_UTILS.match(marketType, MarketType.PERP);\n\n\tif (isPerp) {\n\t\treturn PerpMarkets[driftEnv][marketIndex];\n\t} else {\n\t\treturn SpotMarkets[driftEnv][marketIndex];\n\t}\n}\n\nexport const MARKET_UTILS = {\n\tgetBaseAssetSymbol,\n\tgetPausedOperations,\n\tPerpOperationsMap,\n\tSpotOperationsMap,\n\tInsuranceFundOperationsMap,\n\tgetMarketConfig,\n};\n"]}
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/common-ui-utils/market.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tPerpMarketAccount,\n\tPerpOperation,\n\tSpotMarketAccount,\n\tSpotOperation,\n\tisOperationPaused,\n\tInsuranceFundOperation,\n\tMarketType,\n\tSpotMarketConfig,\n\tDriftEnv,\n\tPerpMarketConfig,\n\tPerpMarkets,\n\tSpotMarkets,\n\tDriftClient,\n\tisVariant,\n} from '@drift-labs/sdk';\nimport { ENUM_UTILS } from '../utils';\nimport { DEFAULT_MAX_MARKET_LEVERAGE } from '../constants/markets';\n\nconst getBaseAssetSymbol = (marketName: string, removePrefix = false) => {\n\tlet baseAssetSymbol = marketName.replace('-PERP', '').replace('/USDC', '');\n\n\tif (removePrefix) {\n\t\tbaseAssetSymbol = baseAssetSymbol.replace('1K', '').replace('1M', '');\n\t}\n\n\treturn baseAssetSymbol;\n};\n\nconst PerpOperationsMap = {\n\tUPDATE_FUNDING: 'Funding',\n\tAMM_FILL: 'AMM Fills',\n\tFILL: 'Fills',\n\tSETTLE_PNL: 'Settle P&L',\n\tSETTLE_PNL_WITH_POSITION: 'Settle P&L With Open Position',\n};\n\nconst SpotOperationsMap = {\n\tUPDATE_CUMULATIVE_INTEREST: 'Update Cumulative Interest',\n\tFILL: 'Fills',\n\tWITHDRAW: 'Withdrawals',\n};\n\nconst InsuranceFundOperationsMap = {\n\tINIT: 'Initialize IF',\n\tADD: 'Deposit To IF',\n\tREQUEST_REMOVE: 'Request Withdrawal From IF',\n\tREMOVE: 'Withdraw From IF',\n};\n\nconst getPausedOperations = (\n\tmarketAccount: PerpMarketAccount | SpotMarketAccount\n): string[] => {\n\tif (!marketAccount) return [];\n\n\tconst pausedOperations = [];\n\t//@ts-ignore\n\tconst isPerp = !!marketAccount.amm;\n\n\t// check perp operations\n\tif (isPerp) {\n\t\tObject.keys(PerpOperation)\n\t\t\t.filter((operation) =>\n\t\t\t\tisOperationPaused(\n\t\t\t\t\tmarketAccount.pausedOperations,\n\t\t\t\t\tPerpOperation[operation]\n\t\t\t\t)\n\t\t\t)\n\t\t\t.forEach((pausedOperation) => {\n\t\t\t\tpausedOperations.push(PerpOperationsMap[pausedOperation]);\n\t\t\t});\n\t} else {\n\t\t// check spot operations\n\t\tObject.keys(SpotOperation)\n\t\t\t.filter((operation) =>\n\t\t\t\tisOperationPaused(\n\t\t\t\t\tmarketAccount.pausedOperations,\n\t\t\t\t\tSpotOperation[operation]\n\t\t\t\t)\n\t\t\t)\n\t\t\t.forEach((pausedOperation) => {\n\t\t\t\tpausedOperations.push(SpotOperationsMap[pausedOperation]);\n\t\t\t});\n\n\t\t// check IF operations\n\t\tObject.keys(InsuranceFundOperation)\n\t\t\t.filter((operation) =>\n\t\t\t\tisOperationPaused(\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tmarketAccount.ifPausedOperations,\n\t\t\t\t\tInsuranceFundOperation[operation]\n\t\t\t\t)\n\t\t\t)\n\t\t\t.forEach((pausedOperation) => {\n\t\t\t\tpausedOperations.push(InsuranceFundOperationsMap[pausedOperation]);\n\t\t\t});\n\t}\n\n\treturn pausedOperations;\n};\n\nfunction getMarketConfig(\n\tdriftEnv: DriftEnv,\n\tmarketType: typeof MarketType.PERP,\n\tmarketIndex: number\n): PerpMarketConfig;\nfunction getMarketConfig(\n\tdriftEnv: DriftEnv,\n\tmarketType: typeof MarketType.SPOT,\n\tmarketIndex: number\n): SpotMarketConfig;\nfunction getMarketConfig(\n\tdriftEnv: DriftEnv,\n\tmarketType: MarketType,\n\tmarketIndex: number\n): PerpMarketConfig | SpotMarketConfig {\n\tconst isPerp = ENUM_UTILS.match(marketType, MarketType.PERP);\n\n\tif (isPerp) {\n\t\treturn PerpMarkets[driftEnv][marketIndex];\n\t} else {\n\t\treturn SpotMarkets[driftEnv][marketIndex];\n\t}\n}\n\nconst getMaxLeverageForMarket = (\n\tmarketType: MarketType,\n\tmarketIndex: number,\n\tdriftClient: DriftClient\n): {\n\tmaxLeverage: number;\n\thighLeverageMaxLeverage: number;\n\thasHighLeverage: boolean;\n} => {\n\ttry {\n\t\tif (isVariant(marketType, 'perp')) {\n\t\t\tconst marketAccount = driftClient.getPerpMarketAccount(marketIndex);\n\n\t\t\tconst maxLeverage = parseFloat(\n\t\t\t\t(\n\t\t\t\t\t1 /\n\t\t\t\t\t((marketAccount?.marginRatioInitial\n\t\t\t\t\t\t? marketAccount.marginRatioInitial\n\t\t\t\t\t\t: 10000 / DEFAULT_MAX_MARKET_LEVERAGE) /\n\t\t\t\t\t\t10000)\n\t\t\t\t).toFixed(2)\n\t\t\t);\n\n\t\t\tconst marketHasHighLeverageMode =\n\t\t\t\t!!marketAccount?.highLeverageMarginRatioInitial;\n\n\t\t\tconst highLeverageMaxLeverage = marketHasHighLeverageMode\n\t\t\t\t? parseFloat(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t1 /\n\t\t\t\t\t\t\t((marketAccount?.highLeverageMarginRatioInitial\n\t\t\t\t\t\t\t\t? marketAccount?.highLeverageMarginRatioInitial\n\t\t\t\t\t\t\t\t: 10000 / DEFAULT_MAX_MARKET_LEVERAGE) /\n\t\t\t\t\t\t\t\t10000)\n\t\t\t\t\t\t).toFixed(1)\n\t\t\t\t )\n\t\t\t\t: 0;\n\n\t\t\treturn {\n\t\t\t\tmaxLeverage,\n\t\t\t\thighLeverageMaxLeverage,\n\t\t\t\thasHighLeverage: marketHasHighLeverageMode,\n\t\t\t};\n\t\t} else {\n\t\t\tconst marketAccount = driftClient.getSpotMarketAccount(marketIndex);\n\n\t\t\tconst liabilityWeight = marketAccount\n\t\t\t\t? marketAccount.initialLiabilityWeight / 10000\n\t\t\t\t: 0;\n\n\t\t\treturn {\n\t\t\t\tmaxLeverage: parseFloat((1 / (liabilityWeight - 1)).toFixed(2)),\n\t\t\t\thighLeverageMaxLeverage: 0,\n\t\t\t\thasHighLeverage: false,\n\t\t\t};\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\treturn {\n\t\t\tmaxLeverage: 0,\n\t\t\thighLeverageMaxLeverage: 0,\n\t\t\thasHighLeverage: false,\n\t\t};\n\t}\n};\n\nexport const MARKET_UTILS = {\n\tgetBaseAssetSymbol,\n\tgetPausedOperations,\n\tPerpOperationsMap,\n\tSpotOperationsMap,\n\tInsuranceFundOperationsMap,\n\tgetMarketConfig,\n\tgetMaxLeverageForMarket,\n};\n"]}
@@ -1,11 +1,18 @@
1
- import { OrderType, OrderTriggerCondition, PositionDirection, BigNum } from '@drift-labs/sdk';
1
+ import { OrderType, OrderTriggerCondition, PositionDirection, BigNum, ContractTier, BN, DriftClient, User } from '@drift-labs/sdk';
2
2
  import { UISerializableOrder } from '../serializableTypes';
3
3
  import { AuctionParams } from '../types';
4
4
  declare function isAuctionEmpty(auctionParams: AuctionParams): boolean;
5
+ declare function getPerpAuctionDuration(priceDiff: BN, price: BN, contractTier: ContractTier): number;
6
+ /**
7
+ * Mainly checks if the user will be entering high leverage mode through this order.
8
+ */
9
+ declare function getPerpOrderParamsBitFlags(marketIndex: number, driftClient: DriftClient, userAccount: User, quoteSize: BN, side: PositionDirection, enterHighLeverageModeBufferPct?: number): number | undefined;
5
10
  export declare const ORDER_COMMON_UTILS: {
6
11
  getOrderLabelFromOrderDetails: (orderDetails: Pick<UISerializableOrder, 'orderType' | 'oraclePriceOffset' | 'direction' | 'triggerCondition' | 'existingPositionDirection'>) => string;
7
12
  getLimitPriceFromOracleOffset: (order: UISerializableOrder, oraclePrice: BigNum) => BigNum;
8
13
  isAuctionEmpty: typeof isAuctionEmpty;
9
14
  getUIOrderTypeFromSdkOrderType: (orderType: OrderType, triggerCondition: OrderTriggerCondition, direction: PositionDirection, oracleOffset: BigNum | undefined) => import("../types").UIOrderTypeValue;
15
+ getPerpAuctionDuration: typeof getPerpAuctionDuration;
16
+ getPerpOrderParamsBitFlags: typeof getPerpOrderParamsBitFlags;
10
17
  };
11
18
  export {};