@drift-labs/common 1.0.17 → 1.0.18

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 (45) hide show
  1. package/lib/EnvironmentConstants.js +2 -2
  2. package/lib/EnvironmentConstants.js.map +1 -1
  3. package/lib/clients/redisClient.d.ts +0 -1
  4. package/lib/clients/swiftClient.d.ts +1 -1
  5. package/lib/clients/swiftClient.js +60 -20
  6. package/lib/clients/swiftClient.js.map +1 -1
  7. package/lib/clients/tvFeed.d.ts +2 -1
  8. package/lib/clients/tvFeed.js +4 -3
  9. package/lib/clients/tvFeed.js.map +1 -1
  10. package/lib/common-ui-utils/commonUiUtils.d.ts +0 -1
  11. package/lib/constants/autogenerated/driftErrors.json +5 -1
  12. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.d.ts +1 -1
  13. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +14 -5
  14. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -1
  15. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +8 -1
  16. package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -1
  17. package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +1 -1
  18. package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
  19. package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +2 -2
  20. package/lib/drift/Drift/clients/CentralServerDrift/index.js +4 -4
  21. package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
  22. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +4 -2
  23. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +9 -2
  24. package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
  25. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +3 -5
  26. package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
  27. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +9 -1
  28. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +7 -5
  29. package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
  30. package/lib/drift/base/actions/trade/openPerpOrder/positionMaxLeverage.d.ts +2 -2
  31. package/lib/drift/base/actions/trade/openPerpOrder/positionMaxLeverage.js +6 -2
  32. package/lib/drift/base/actions/trade/openPerpOrder/positionMaxLeverage.js.map +1 -1
  33. package/lib/drift/base/actions/trade/swap.d.ts +6 -13
  34. package/lib/drift/base/actions/trade/swap.js +11 -36
  35. package/lib/drift/base/actions/trade/swap.js.map +1 -1
  36. package/lib/drift/base/actions/user/create.js +6 -1
  37. package/lib/drift/base/actions/user/create.js.map +1 -1
  38. package/lib/serializableTypes.d.ts +1 -0
  39. package/lib/serializableTypes.js +4 -0
  40. package/lib/serializableTypes.js.map +1 -1
  41. package/lib/utils/index.d.ts +0 -1
  42. package/lib/utils/token.d.ts +2 -1
  43. package/lib/utils/token.js +3 -2
  44. package/lib/utils/token.js.map +1 -1
  45. package/package.json +14 -2
@@ -20,8 +20,8 @@ exports.EnvironmentConstants = {
20
20
  mainnet: [
21
21
  {
22
22
  label: 'Triton RPC Pool 1',
23
- value: 'https://drift-drift-951a.mainnet.rpcpool.com',
24
- wsValue: 'wss://drift-drift-951a.mainnet.rpcpool.com/whirligig',
23
+ value: 'https://drift-drift_ma-39b5.mainnet.rpcpool.com/',
24
+ wsValue: 'wss://drift-drift_ma-39b5.mainnet.rpcpool.com/whirligig',
25
25
  allowAdditionalConnection: true,
26
26
  },
27
27
  {
@@ -1 +1 @@
1
- {"version":3,"file":"EnvironmentConstants.js","sourceRoot":"","sources":["../src/EnvironmentConstants.ts"],"names":[],"mappings":";;;AAOa,QAAA,oBAAoB,GAAG;IACnC,IAAI,EAAE;QACL,GAAG,EAAE;YACJ;gBACC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,sDAAsD;gBAC7D,OAAO,EAAE,oDAAoD;gBAC7D,yBAAyB,EAAE,IAAI;aAC/B;YACD;gBACC,KAAK,EAAE,UAAU;gBACjB,KAAK,EACJ,kFAAkF;gBACnF,OAAO,EACN,0FAA0F;gBAC3F,yBAAyB,EAAE,KAAK;aAChC;SACgB;QAClB,OAAO,EAAE;YACR;gBACC,KAAK,EAAE,mBAAmB;gBAC1B,KAAK,EAAE,8CAA8C;gBACrD,OAAO,EAAE,sDAAsD;gBAC/D,yBAAyB,EAAE,IAAI;aAC/B;YACD;gBACC,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,kDAAkD;gBACzD,OAAO,EAAE,gDAAgD;gBACzD,yBAAyB,EAAE,IAAI;aAC/B;SACgB;KAClB;IACD,gBAAgB,EAAE;QACjB,GAAG,EAAE,gCAAgC;QACrC,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,iCAAiC;KAC1C;IACD,aAAa,EAAE;QACd,GAAG,EAAE,qCAAqC;QAC1C,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,sCAAsC;KAC/C;IACD,iBAAiB,EAAE;QAClB,GAAG,EAAE,iCAAiC;QACtC,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,kCAAkC;KAC3C;IACD,eAAe,EAAE;QAChB,GAAG,EAAE,kCAAkC;QACvC,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,mCAAmC;KAC5C;IACD,eAAe,EAAE;QAChB,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,6BAA6B;KACtC;IACD,cAAc,EAAE;QACf,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,kCAAkC;KAC3C;CACD,CAAC","sourcesContent":["export interface RpcEndpoint {\n\tlabel: string;\n\tvalue: string;\n\twsValue?: string;\n\tallowAdditionalConnection: boolean;\n}\n\nexport const EnvironmentConstants = {\n\trpcs: {\n\t\tdev: [\n\t\t\t{\n\t\t\t\tlabel: 'Helius',\n\t\t\t\tvalue: 'https://detailed-sharleen-fast-devnet.helius-rpc.com',\n\t\t\t\twsValue: 'wss://detailed-sharleen-fast-devnet.helius-rpc.com',\n\t\t\t\tallowAdditionalConnection: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'RPC Pool',\n\t\t\t\tvalue:\n\t\t\t\t\t'https://drift-drift-a827.devnet.rpcpool.com/3639271b-6f0e-47c6-a643-1aaa0e498f58',\n\t\t\t\twsValue:\n\t\t\t\t\t'wss://drift-drift-a827.devnet.rpcpool.com/3639271b-6f0e-47c6-a643-1aaa0e498f58/whirligig',\n\t\t\t\tallowAdditionalConnection: false,\n\t\t\t},\n\t\t] as RpcEndpoint[],\n\t\tmainnet: [\n\t\t\t{\n\t\t\t\tlabel: 'Triton RPC Pool 1',\n\t\t\t\tvalue: 'https://drift-drift-951a.mainnet.rpcpool.com',\n\t\t\t\twsValue: 'wss://drift-drift-951a.mainnet.rpcpool.com/whirligig',\n\t\t\t\tallowAdditionalConnection: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Helius 1',\n\t\t\t\tvalue: 'https://kora-8cwrc2-fast-mainnet.helius-rpc.com/',\n\t\t\t\twsValue: 'wss://kora-8cwrc2-fast-mainnet.helius-rpc.com/',\n\t\t\t\tallowAdditionalConnection: true,\n\t\t\t},\n\t\t] as RpcEndpoint[],\n\t},\n\thistoryServerUrl: {\n\t\tdev: 'https://master.api.drift.trade',\n\t\tmainnet: 'https://mainnet-beta.api.drift.trade',\n\t\tstaging: 'https://staging.api.drift.trade',\n\t},\n\tdataServerUrl: {\n\t\tdev: 'https://data-master.api.drift.trade',\n\t\tmainnet: 'https://data.api.drift.trade',\n\t\tstaging: 'https://data-staging.api.drift.trade',\n\t},\n\tdlobServerHttpUrl: {\n\t\tdev: 'https://master.dlob.drift.trade',\n\t\tmainnet: 'https://dlob.drift.trade',\n\t\tstaging: 'https://staging.dlob.drift.trade',\n\t},\n\tdlobServerWsUrl: {\n\t\tdev: 'wss://master.dlob.drift.trade/ws',\n\t\tmainnet: 'wss://dlob.drift.trade/ws',\n\t\tstaging: 'wss://staging.dlob.drift.trade/ws',\n\t},\n\teventsServerUrl: {\n\t\tmainnet: 'wss://events.drift.trade/ws',\n\t\tstaging: 'wss://events.drift.trade/ws',\n\t},\n\tswiftServerUrl: {\n\t\tmainnet: 'https://swift.drift.trade',\n\t\tstaging: 'https://master.swift.drift.trade',\n\t},\n};\n"]}
1
+ {"version":3,"file":"EnvironmentConstants.js","sourceRoot":"","sources":["../src/EnvironmentConstants.ts"],"names":[],"mappings":";;;AAOa,QAAA,oBAAoB,GAAG;IACnC,IAAI,EAAE;QACL,GAAG,EAAE;YACJ;gBACC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,sDAAsD;gBAC7D,OAAO,EAAE,oDAAoD;gBAC7D,yBAAyB,EAAE,IAAI;aAC/B;YACD;gBACC,KAAK,EAAE,UAAU;gBACjB,KAAK,EACJ,kFAAkF;gBACnF,OAAO,EACN,0FAA0F;gBAC3F,yBAAyB,EAAE,KAAK;aAChC;SACgB;QAClB,OAAO,EAAE;YACR;gBACC,KAAK,EAAE,mBAAmB;gBAC1B,KAAK,EAAE,kDAAkD;gBACzD,OAAO,EAAE,yDAAyD;gBAClE,yBAAyB,EAAE,IAAI;aAC/B;YACD;gBACC,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,kDAAkD;gBACzD,OAAO,EAAE,gDAAgD;gBACzD,yBAAyB,EAAE,IAAI;aAC/B;SACgB;KAClB;IACD,gBAAgB,EAAE;QACjB,GAAG,EAAE,gCAAgC;QACrC,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,iCAAiC;KAC1C;IACD,aAAa,EAAE;QACd,GAAG,EAAE,qCAAqC;QAC1C,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,sCAAsC;KAC/C;IACD,iBAAiB,EAAE;QAClB,GAAG,EAAE,iCAAiC;QACtC,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,kCAAkC;KAC3C;IACD,eAAe,EAAE;QAChB,GAAG,EAAE,kCAAkC;QACvC,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,mCAAmC;KAC5C;IACD,eAAe,EAAE;QAChB,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,6BAA6B;KACtC;IACD,cAAc,EAAE;QACf,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,kCAAkC;KAC3C;CACD,CAAC","sourcesContent":["export interface RpcEndpoint {\n\tlabel: string;\n\tvalue: string;\n\twsValue?: string;\n\tallowAdditionalConnection: boolean;\n}\n\nexport const EnvironmentConstants = {\n\trpcs: {\n\t\tdev: [\n\t\t\t{\n\t\t\t\tlabel: 'Helius',\n\t\t\t\tvalue: 'https://detailed-sharleen-fast-devnet.helius-rpc.com',\n\t\t\t\twsValue: 'wss://detailed-sharleen-fast-devnet.helius-rpc.com',\n\t\t\t\tallowAdditionalConnection: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'RPC Pool',\n\t\t\t\tvalue:\n\t\t\t\t\t'https://drift-drift-a827.devnet.rpcpool.com/3639271b-6f0e-47c6-a643-1aaa0e498f58',\n\t\t\t\twsValue:\n\t\t\t\t\t'wss://drift-drift-a827.devnet.rpcpool.com/3639271b-6f0e-47c6-a643-1aaa0e498f58/whirligig',\n\t\t\t\tallowAdditionalConnection: false,\n\t\t\t},\n\t\t] as RpcEndpoint[],\n\t\tmainnet: [\n\t\t\t{\n\t\t\t\tlabel: 'Triton RPC Pool 1',\n\t\t\t\tvalue: 'https://drift-drift_ma-39b5.mainnet.rpcpool.com/',\n\t\t\t\twsValue: 'wss://drift-drift_ma-39b5.mainnet.rpcpool.com/whirligig',\n\t\t\t\tallowAdditionalConnection: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Helius 1',\n\t\t\t\tvalue: 'https://kora-8cwrc2-fast-mainnet.helius-rpc.com/',\n\t\t\t\twsValue: 'wss://kora-8cwrc2-fast-mainnet.helius-rpc.com/',\n\t\t\t\tallowAdditionalConnection: true,\n\t\t\t},\n\t\t] as RpcEndpoint[],\n\t},\n\thistoryServerUrl: {\n\t\tdev: 'https://master.api.drift.trade',\n\t\tmainnet: 'https://mainnet-beta.api.drift.trade',\n\t\tstaging: 'https://staging.api.drift.trade',\n\t},\n\tdataServerUrl: {\n\t\tdev: 'https://data-master.api.drift.trade',\n\t\tmainnet: 'https://data.api.drift.trade',\n\t\tstaging: 'https://data-staging.api.drift.trade',\n\t},\n\tdlobServerHttpUrl: {\n\t\tdev: 'https://master.dlob.drift.trade',\n\t\tmainnet: 'https://dlob.drift.trade',\n\t\tstaging: 'https://staging.dlob.drift.trade',\n\t},\n\tdlobServerWsUrl: {\n\t\tdev: 'wss://master.dlob.drift.trade/ws',\n\t\tmainnet: 'wss://dlob.drift.trade/ws',\n\t\tstaging: 'wss://staging.dlob.drift.trade/ws',\n\t},\n\teventsServerUrl: {\n\t\tmainnet: 'wss://events.drift.trade/ws',\n\t\tstaging: 'wss://events.drift.trade/ws',\n\t},\n\tswiftServerUrl: {\n\t\tmainnet: 'https://swift.drift.trade',\n\t\tstaging: 'https://master.swift.drift.trade',\n\t},\n};\n"]}
@@ -1,5 +1,4 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  import Redis, { Cluster, RedisOptions } from 'ioredis';
4
3
  export declare enum RedisClientPrefix {
5
4
  EXCHANGE = "",
@@ -1,5 +1,4 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  import { AccountInfo, Connection, PublicKey } from '@solana/web3.js';
4
3
  import { DriftClient, MarketType, OrderType, SignedMsgOrderParamsDelegateMessage, SignedMsgOrderParamsMessage } from '@drift-labs/sdk';
5
4
  import { Observable, Subscriber } from 'rxjs';
@@ -44,6 +43,7 @@ export declare class SwiftClient {
44
43
  hash: string;
45
44
  }>;
46
45
  static confirmSwiftOrderWS(connection: Connection, client: DriftClient, signedMsgUserOrdersAccount: PublicKey, signedMsgOrderUuid: Uint8Array, confirmDuration: number): Promise<number | undefined>;
46
+ private static confirmSwiftOrderRPCFetch;
47
47
  static findOrderInSignedMsgUserOrdersAccount(client: DriftClient, ordersAccount: AccountInfo<Buffer>, signedMsgOrderUuid: Uint8Array): import("@drift-labs/sdk").SignedMsgOrderId;
48
48
  static confirmSwiftOrder(hash: string, confirmDuration: number): Promise<ClientResponse<{
49
49
  orderId: string;
@@ -123,36 +123,76 @@ class SwiftClient {
123
123
  };
124
124
  }
125
125
  static async confirmSwiftOrderWS(connection, client, signedMsgUserOrdersAccount, signedMsgOrderUuid, confirmDuration) {
126
- (0, logger_1.allEnvDlog)('swiftClient', 'confirmSwiftOrderWS - confirmation duration', confirmDuration);
127
126
  return new Promise((resolve, reject) => {
128
- const timeout = setTimeout(() => {
129
- reject(new Error('Order not found'));
130
- }, confirmDuration);
131
- connection
132
- .getAccountInfo(signedMsgUserOrdersAccount, 'confirmed')
133
- .then((accountInfo) => {
134
- if (!accountInfo) {
135
- reject(new Error('Swift message account not found'));
127
+ let settled = false;
128
+ let subId = undefined;
129
+ let pollInterval = undefined;
130
+ const finalizeResolve = (orderId) => {
131
+ if (settled)
136
132
  return;
133
+ settled = true;
134
+ if (subId !== undefined) {
135
+ connection.removeAccountChangeListener(subId).catch(() => { });
137
136
  }
138
- const order = this.findOrderInSignedMsgUserOrdersAccount(client, accountInfo, signedMsgOrderUuid);
139
- if (order) {
140
- (0, logger_1.allEnvDlog)('swiftClient', 'confirmed in initial fetch orderID\n', order.orderId);
141
- clearTimeout(timeout);
142
- resolve(order.orderId);
137
+ clearTimeout(timeout);
138
+ if (pollInterval) {
139
+ clearInterval(pollInterval);
143
140
  }
144
- });
145
- const subId = connection.onAccountChange(signedMsgUserOrdersAccount, (accountInfo) => {
141
+ resolve(orderId);
142
+ };
143
+ const finalizeReject = (error) => {
144
+ if (settled)
145
+ return;
146
+ settled = true;
147
+ if (subId !== undefined) {
148
+ connection.removeAccountChangeListener(subId).catch(() => { });
149
+ }
150
+ clearTimeout(timeout);
151
+ if (pollInterval) {
152
+ clearInterval(pollInterval);
153
+ }
154
+ reject(error);
155
+ };
156
+ const checkOrder = async (confirmType) => {
157
+ try {
158
+ const lastOrderId = await this.confirmSwiftOrderRPCFetch(connection, client, signedMsgUserOrdersAccount, signedMsgOrderUuid);
159
+ if (lastOrderId !== undefined) {
160
+ (0, logger_1.allEnvDlog)('swiftClient', `confirmed in ${confirmType} RPC fetch orderID\n`, lastOrderId);
161
+ finalizeResolve(lastOrderId);
162
+ }
163
+ }
164
+ catch (err) {
165
+ (0, logger_1.allEnvDlog)('swiftClient', `${confirmType} RPC fetch error`, err);
166
+ }
167
+ };
168
+ const timeout = setTimeout(async () => {
169
+ await checkOrder('timeout');
170
+ if (!settled) {
171
+ finalizeReject(new Error('Order not found'));
172
+ }
173
+ }, confirmDuration);
174
+ // Perform an initial check.
175
+ checkOrder('initial');
176
+ // Poll every 2 seconds as backup for unreliable websocket.
177
+ pollInterval = setInterval(() => checkOrder('poll'), 2000);
178
+ // Subscribe for account change confirmations via WS.
179
+ subId = connection.onAccountChange(signedMsgUserOrdersAccount, (accountInfo) => {
146
180
  const order = this.findOrderInSignedMsgUserOrdersAccount(client, accountInfo, signedMsgOrderUuid);
147
181
  if (order) {
148
182
  (0, logger_1.allEnvDlog)('swiftClient', 'confirmed in onAccountChange orderID\n', order.orderId);
149
- connection.removeAccountChangeListener(subId);
150
- clearTimeout(timeout);
151
- resolve(order.orderId);
183
+ finalizeResolve(order.orderId);
152
184
  }
153
- }, 'confirmed');
185
+ });
154
186
  });
155
187
  }
188
+ static async confirmSwiftOrderRPCFetch(connection, client, signedMsgUserOrdersAccount, signedMsgOrderUuid) {
189
+ const accountInfo = await connection.getAccountInfo(signedMsgUserOrdersAccount);
190
+ if (!accountInfo) {
191
+ return undefined;
192
+ }
193
+ const order = this.findOrderInSignedMsgUserOrdersAccount(client, accountInfo, signedMsgOrderUuid);
194
+ return order === null || order === void 0 ? void 0 : order.orderId;
195
+ }
156
196
  static findOrderInSignedMsgUserOrdersAccount(client, ordersAccount, signedMsgOrderUuid) {
157
197
  const accountDecoder = client.program.account.signedMsgUserOrders.coder.accounts.decodeUnchecked.bind(client.program.account.signedMsgUserOrders.coder.accounts);
158
198
  const decodedAccount = accountDecoder('SignedMsgUserOrders', ordersAccount.data);
@@ -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\tSignedMsgOrderParamsDelegateMessage,\n\tSignedMsgOrderParamsMessage,\n\tSignedMsgUserOrdersAccount,\n\tdigestSignature,\n\tisVariant,\n} from '@drift-labs/sdk';\n\n// Cache for URL construction to prevent repeated string concatenation\nconst swiftUrlCache = new Map<string, string>();\nconst MAX_SWIFT_URL_CACHE_SIZE = 200;\n\nfunction getCachedUrl(baseUrl: string, endpoint: string): string {\n\tconst cacheKey = `${baseUrl}:${endpoint}`;\n\n\tif (swiftUrlCache.has(cacheKey)) {\n\t\treturn swiftUrlCache.get(cacheKey)!;\n\t}\n\n\tconst result = `${baseUrl}${endpoint}`;\n\n\tif (swiftUrlCache.size < MAX_SWIFT_URL_CACHE_SIZE) {\n\t\tswiftUrlCache.set(cacheKey, result);\n\t}\n\n\treturn result;\n}\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(getCachedUrl(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(\n\t\t\t\tgetCachedUrl(this.baseUrl, url),\n\t\t\t\trequestOptions\n\t\t\t);\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\tallEnvDlog(\n\t\t\t'swiftClient',\n\t\t\t'confirmSwiftOrderWS - confirmation duration',\n\t\t\tconfirmDuration\n\t\t);\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
+ {"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';\n\n// Cache for URL construction to prevent repeated string concatenation\nconst swiftUrlCache = new Map<string, string>();\nconst MAX_SWIFT_URL_CACHE_SIZE = 200;\n\nfunction getCachedUrl(baseUrl: string, endpoint: string): string {\n\tconst cacheKey = `${baseUrl}:${endpoint}`;\n\n\tif (swiftUrlCache.has(cacheKey)) {\n\t\treturn swiftUrlCache.get(cacheKey)!;\n\t}\n\n\tconst result = `${baseUrl}${endpoint}`;\n\n\tif (swiftUrlCache.size < MAX_SWIFT_URL_CACHE_SIZE) {\n\t\tswiftUrlCache.set(cacheKey, result);\n\t}\n\n\treturn result;\n}\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(getCachedUrl(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(\n\t\t\t\tgetCachedUrl(this.baseUrl, url),\n\t\t\t\trequestOptions\n\t\t\t);\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\tlet settled = false;\n\t\t\tlet subId: number | undefined = undefined;\n\t\t\tlet pollInterval: NodeJS.Timeout | undefined = undefined;\n\n\t\t\tconst finalizeResolve = (orderId: number) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (subId !== undefined) {\n\t\t\t\t\tconnection.removeAccountChangeListener(subId).catch(() => {});\n\t\t\t\t}\n\t\t\t\tclearTimeout(timeout);\n\n\t\t\t\tif (pollInterval) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t}\n\n\t\t\t\tresolve(orderId);\n\t\t\t};\n\n\t\t\tconst finalizeReject = (error: Error) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tif (subId !== undefined) {\n\t\t\t\t\tconnection.removeAccountChangeListener(subId).catch(() => {});\n\t\t\t\t}\n\t\t\t\tclearTimeout(timeout);\n\n\t\t\t\tif (pollInterval) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t}\n\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst checkOrder = async (\n\t\t\t\tconfirmType: 'initial' | 'poll' | 'timeout'\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst lastOrderId = await this.confirmSwiftOrderRPCFetch(\n\t\t\t\t\t\tconnection,\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tsignedMsgUserOrdersAccount,\n\t\t\t\t\t\tsignedMsgOrderUuid\n\t\t\t\t\t);\n\t\t\t\t\tif (lastOrderId !== undefined) {\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 ${confirmType} RPC fetch orderID\\n`,\n\t\t\t\t\t\t\tlastOrderId\n\t\t\t\t\t\t);\n\t\t\t\t\t\tfinalizeResolve(lastOrderId);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tallEnvDlog('swiftClient', `${confirmType} RPC fetch error`, err);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst timeout = setTimeout(async () => {\n\t\t\t\tawait checkOrder('timeout');\n\n\t\t\t\tif (!settled) {\n\t\t\t\t\tfinalizeReject(new Error('Order not found'));\n\t\t\t\t}\n\t\t\t}, confirmDuration);\n\n\t\t\t// Perform an initial check.\n\t\t\tcheckOrder('initial');\n\n\t\t\t// Poll every 2 seconds as backup for unreliable websocket.\n\t\t\tpollInterval = setInterval(() => checkOrder('poll'), 2000);\n\n\t\t\t// Subscribe for account change confirmations via WS.\n\t\t\tsubId = 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\tfinalizeResolve(order.orderId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate static async confirmSwiftOrderRPCFetch(\n\t\tconnection: Connection,\n\t\tclient: DriftClient,\n\t\tsignedMsgUserOrdersAccount: PublicKey,\n\t\tsignedMsgOrderUuid: Uint8Array\n\t): Promise<number | undefined> {\n\t\tconst accountInfo = await connection.getAccountInfo(\n\t\t\tsignedMsgUserOrdersAccount\n\t\t);\n\t\tif (!accountInfo) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst order = this.findOrderInSignedMsgUserOrdersAccount(\n\t\t\tclient,\n\t\t\taccountInfo,\n\t\t\tsignedMsgOrderUuid\n\t\t);\n\t\treturn order?.orderId;\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"]}
@@ -34,9 +34,10 @@ export declare class DriftTvFeed {
34
34
  private spotMarketConfigs;
35
35
  private positiveColor;
36
36
  private negativeColor;
37
+ private buySellMarkStrokeColor;
37
38
  private tvAppTradeDataManager;
38
39
  private marketDecimalConfig;
39
- constructor(env: UIEnv, candleType: CandleType, driftClient: DriftClient, perpMarketConfigs: PerpMarketConfig[], spotMarketConfigs: SpotMarketConfig[], positiveColor: string, negativeColor: string, tvAppTradeDataManager?: TvAppTradeDataManager, marketDecimalConfig?: MarketDecimalConfig);
40
+ constructor(env: UIEnv, candleType: CandleType, driftClient: DriftClient, perpMarketConfigs: PerpMarketConfig[], spotMarketConfigs: SpotMarketConfig[], positiveColor: string, negativeColor: string, buySellMarkStrokeColor: string, tvAppTradeDataManager?: TvAppTradeDataManager, marketDecimalConfig?: MarketDecimalConfig);
40
41
  resetCache(): void;
41
42
  private searchMarkets;
42
43
  onReady(callback: any): void;
@@ -111,7 +111,7 @@ const SpotMarketConfigToTVMarketInfo = (marketConfig) => {
111
111
  };
112
112
  };
113
113
  class DriftTvFeed {
114
- constructor(env, candleType, driftClient, perpMarketConfigs, spotMarketConfigs, positiveColor, negativeColor, tvAppTradeDataManager, marketDecimalConfig) {
114
+ constructor(env, candleType, driftClient, perpMarketConfigs, spotMarketConfigs, positiveColor, negativeColor, buySellMarkStrokeColor, tvAppTradeDataManager, marketDecimalConfig) {
115
115
  this.searchMarkets = (symbol) => {
116
116
  const res = [];
117
117
  const currentPerpMarkets = this.perpMarketConfigs;
@@ -177,6 +177,7 @@ class DriftTvFeed {
177
177
  this.spotMarketConfigs = spotMarketConfigs;
178
178
  this.positiveColor = positiveColor;
179
179
  this.negativeColor = negativeColor;
180
+ this.buySellMarkStrokeColor = buySellMarkStrokeColor;
180
181
  this.tvAppTradeDataManager = tvAppTradeDataManager;
181
182
  this.marketDecimalConfig = marketDecimalConfig;
182
183
  }
@@ -313,13 +314,13 @@ class DriftTvFeed {
313
314
  time: candleStartTime,
314
315
  color: {
315
316
  background: color,
316
- border: '#152A44',
317
+ border: this.buySellMarkStrokeColor,
317
318
  },
318
319
  borderWidth: 1,
319
320
  hoveredBorderWidth: 1,
320
321
  text: `${isLong ? 'Long' : 'Short'} at $${formatPrice(avgPrice)}`,
321
322
  label: isLong ? 'B' : 'S',
322
- labelFontColor: '#000000',
323
+ labelFontColor: this.buySellMarkStrokeColor,
323
324
  minSize: 16,
324
325
  };
325
326
  });
@@ -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';\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 positiveColor: string;\n\tprivate negativeColor: string;\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\tpositiveColor: string,\n\t\tnegativeColor: string,\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.positiveColor = positiveColor;\n\t\tthis.negativeColor = negativeColor;\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// Helper function to convert resolution string to seconds\n\tprivate getResolutionInSeconds(resolution: string): number {\n\t\t// Resolution can be: '1', '3', '5', '15', '30', '60', '120', '240', '1D', '1W', etc.\n\t\tif (resolution.includes('D')) {\n\t\t\tconst days = parseInt(resolution);\n\t\t\treturn days * 24 * 60 * 60;\n\t\t}\n\t\tif (resolution.includes('W')) {\n\t\t\tconst weeks = parseInt(resolution);\n\t\t\treturn weeks * 7 * 24 * 60 * 60;\n\t\t}\n\t\tif (resolution.includes('M')) {\n\t\t\tconst months = parseInt(resolution);\n\t\t\treturn months * 30 * 24 * 60 * 60; // Approximate\n\t\t}\n\t\t// Default: minutes\n\t\tconst minutes = parseInt(resolution);\n\t\treturn minutes * 60;\n\t}\n\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\t// Calculate resolution in seconds for aligning marks to candle start times\n\t\tconst resolutionInSeconds = this.getResolutionInSeconds(_resolution);\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 ? this.positiveColor : this.negativeColor;\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\t// Align trade time to candle start time\n\t\t\t// TradingView requires mark time to exactly match a bar time\n\t\t\tconst candleStartTime =\n\t\t\t\tMath.floor(trade.ts / resolutionInSeconds) * resolutionInSeconds;\n\n\t\t\treturn {\n\t\t\t\tid: trade.txSig,\n\t\t\t\ttime: candleStartTime,\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 positiveColor: string;\n\tprivate negativeColor: string;\n\tprivate buySellMarkStrokeColor: string;\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\tpositiveColor: string,\n\t\tnegativeColor: string,\n\t\tbuySellMarkStrokeColor: string,\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.positiveColor = positiveColor;\n\t\tthis.negativeColor = negativeColor;\n\t\tthis.buySellMarkStrokeColor = buySellMarkStrokeColor;\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// Helper function to convert resolution string to seconds\n\tprivate getResolutionInSeconds(resolution: string): number {\n\t\t// Resolution can be: '1', '3', '5', '15', '30', '60', '120', '240', '1D', '1W', etc.\n\t\tif (resolution.includes('D')) {\n\t\t\tconst days = parseInt(resolution);\n\t\t\treturn days * 24 * 60 * 60;\n\t\t}\n\t\tif (resolution.includes('W')) {\n\t\t\tconst weeks = parseInt(resolution);\n\t\t\treturn weeks * 7 * 24 * 60 * 60;\n\t\t}\n\t\tif (resolution.includes('M')) {\n\t\t\tconst months = parseInt(resolution);\n\t\t\treturn months * 30 * 24 * 60 * 60; // Approximate\n\t\t}\n\t\t// Default: minutes\n\t\tconst minutes = parseInt(resolution);\n\t\treturn minutes * 60;\n\t}\n\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\t// Calculate resolution in seconds for aligning marks to candle start times\n\t\tconst resolutionInSeconds = this.getResolutionInSeconds(_resolution);\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 ? this.positiveColor : this.negativeColor;\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\t// Align trade time to candle start time\n\t\t\t// TradingView requires mark time to exactly match a bar time\n\t\t\tconst candleStartTime =\n\t\t\t\tMath.floor(trade.ts / resolutionInSeconds) * resolutionInSeconds;\n\n\t\t\treturn {\n\t\t\t\tid: trade.txSig,\n\t\t\t\ttime: candleStartTime,\n\t\t\t\tcolor: {\n\t\t\t\t\tbackground: color,\n\t\t\t\t\tborder: this.buySellMarkStrokeColor,\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: this.buySellMarkStrokeColor,\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,5 +1,4 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  import { BN, BigNum, DriftClient, IWalletV2, MarketType, OptionalOrderParams, OrderType, PositionDirection, PublicKey, SpotMarketConfig, User, UserAccount } from '@drift-labs/sdk';
4
3
  import { AccountInfo, Connection, ParsedAccountData } from '@solana/web3.js';
5
4
  import { AuctionParams, TradeOffsetPrice } from 'src/types';
@@ -924,7 +924,11 @@
924
924
  "InvalidOrderMinOrderSize": {
925
925
  "code": 6056,
926
926
  "name": "InvalidOrderMinOrderSize",
927
- "msg": "InvalidOrderMinOrderSize"
927
+ "msg": "InvalidOrderMinOrderSize",
928
+ "toast": {
929
+ "message": "Order size is below minimum order size.",
930
+ "description": ""
931
+ }
928
932
  },
929
933
  "MarketPlaceOrderPaused": {
930
934
  "code": 6147,
@@ -162,7 +162,7 @@ export declare class DriftOperations {
162
162
  * ```
163
163
  */
164
164
  openPerpOrder(params: PerpOrderParams): Promise<TransactionSignature | void>;
165
- getSwapQuote(params: Omit<SwapParams, 'jupiterQuote'> & {
165
+ getSwapQuote(params: Omit<SwapParams, 'quote'> & {
166
166
  slippageBps?: number;
167
167
  swapMode?: SwapMode;
168
168
  onlyDirectRoutes?: boolean;
@@ -490,24 +490,33 @@ class DriftOperations {
490
490
  * ```
491
491
  */
492
492
  async swap(params) {
493
+ var _a, _b, _c;
493
494
  const accountData = this.getUserAccountCache().getUser(params.subAccountId, this.driftClient.wallet.publicKey);
494
495
  if (!accountData) {
495
496
  throw new Error('User not found');
496
497
  }
497
- const jupiterClient = new sdk_1.JupiterClient({
498
+ const auth = ((_a = params.swapClientType) === null || _a === void 0 ? void 0 : _a.type) === 'titan'
499
+ ? {
500
+ authToken: params.swapClientType.authToken,
501
+ url: params.swapClientType.url,
502
+ }
503
+ : undefined;
504
+ const swapClient = new sdk_1.UnifiedSwapClient({
505
+ clientType: (_c = (_b = params.swapClientType) === null || _b === void 0 ? void 0 : _b.type) !== null && _c !== void 0 ? _c : 'jupiter',
498
506
  connection: this.driftClient.connection,
507
+ ...auth,
499
508
  });
500
- const jupiterQuote = params.jupiterQuote
501
- ? params.jupiterQuote
509
+ const swapQuote = params.quote
510
+ ? params.quote
502
511
  : await this.getSwapQuote(params);
503
512
  const swapTxn = await (0, swap_1.createSwapTxn)({
504
513
  driftClient: this.driftClient,
505
- jupiterClient,
514
+ swapClient,
506
515
  user: accountData.userClient,
507
516
  swapFromMarketIndex: params.fromMarketIndex,
508
517
  swapToMarketIndex: params.toMarketIndex,
509
518
  amount: params.amount.val,
510
- quote: jupiterQuote,
519
+ quote: swapQuote,
511
520
  txParams: this.getTxParams(),
512
521
  });
513
522
  const { txSig } = await this.driftClient.sendTransaction(swapTxn);