@drift-labs/common 1.0.17 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/EnvironmentConstants.js +2 -2
- package/lib/EnvironmentConstants.js.map +1 -1
- package/lib/actions/actionHelpers/actionHelpers.d.ts +9 -9
- package/lib/clients/redisClient.d.ts +0 -1
- package/lib/clients/swiftClient.d.ts +1 -1
- package/lib/clients/swiftClient.js +60 -20
- package/lib/clients/swiftClient.js.map +1 -1
- package/lib/clients/tvFeed.d.ts +2 -1
- package/lib/clients/tvFeed.js +4 -3
- package/lib/clients/tvFeed.js.map +1 -1
- package/lib/common-ui-utils/commonUiUtils.d.ts +4 -2
- package/lib/common-ui-utils/commonUiUtils.js.map +1 -1
- package/lib/common-ui-utils/user.js +3 -1
- package/lib/common-ui-utils/user.js.map +1 -1
- package/lib/constants/autogenerated/driftErrors.json +5 -1
- package/lib/constants/predictionMarket.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftL2OrderbookManager.d.ts +10 -10
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +18 -5
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +10 -2
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
- package/lib/drift/Drift/clients/CentralServerDrift/index.d.ts +7 -2
- package/lib/drift/Drift/clients/CentralServerDrift/index.js +13 -7
- package/lib/drift/Drift/clients/CentralServerDrift/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/index.d.ts +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.js +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.d.ts +34 -0
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.js +45 -0
- package/lib/drift/base/actions/trade/openPerpOrder/isolatedPositionDeposit.js.map +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +12 -4
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +17 -4
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +11 -7
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +15 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +12 -8
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/positionMaxLeverage.d.ts +2 -2
- package/lib/drift/base/actions/trade/openPerpOrder/positionMaxLeverage.js +6 -2
- package/lib/drift/base/actions/trade/openPerpOrder/positionMaxLeverage.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/types.d.ts +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/types.js.map +1 -1
- package/lib/drift/base/actions/trade/swap.d.ts +6 -13
- package/lib/drift/base/actions/trade/swap.js +11 -36
- package/lib/drift/base/actions/trade/swap.js.map +1 -1
- package/lib/drift/base/actions/user/create.d.ts +9 -2
- package/lib/drift/base/actions/user/create.js +15 -6
- package/lib/drift/base/actions/user/create.js.map +1 -1
- package/lib/drift/base/details/user/balances.d.ts +1 -1
- package/lib/drift/base/details/user/positions.d.ts +1 -1
- package/lib/drift/cli.js +28 -6
- package/lib/drift/cli.js.map +1 -1
- package/lib/drift/utils/funding.d.ts +0 -1
- package/lib/serializableTypes.d.ts +11 -0
- package/lib/serializableTypes.js +321 -217
- package/lib/serializableTypes.js.map +1 -1
- package/lib/types/UIMarket.d.ts +2 -2
- package/lib/utils/NumLib.d.ts +4 -4
- package/lib/utils/ResultSlotIncrementer.d.ts +4 -0
- package/lib/utils/ResultSlotIncrementer.js +8 -0
- package/lib/utils/ResultSlotIncrementer.js.map +1 -1
- package/lib/utils/index.d.ts +2 -3
- package/lib/utils/math.d.ts +3 -3
- package/lib/utils/token.d.ts +2 -1
- package/lib/utils/token.js +3 -2
- package/lib/utils/token.js.map +1 -1
- package/package.json +20 -5
|
@@ -20,8 +20,8 @@ exports.EnvironmentConstants = {
|
|
|
20
20
|
mainnet: [
|
|
21
21
|
{
|
|
22
22
|
label: 'Triton RPC Pool 1',
|
|
23
|
-
value: 'https://drift-
|
|
24
|
-
wsValue: 'wss://drift-
|
|
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,
|
|
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,13 +1,13 @@
|
|
|
1
1
|
export declare const ACTION_HELPERS: {
|
|
2
2
|
ACCOUNT_DELETION_HELPERS: {
|
|
3
|
-
accountHasOpenOrders: (user: import("
|
|
4
|
-
accountHasOpenPerpPositions: (user: import("
|
|
5
|
-
accountHasOpenSpotPositions: (user: import("
|
|
6
|
-
getAccountDeletionStepsToTake: (user: import("
|
|
7
|
-
getAccountCanBeDeletedInstantly: (user: import("
|
|
8
|
-
getStatsAccountIsPastDeletionCutoff: (userStatsAccount: import("
|
|
9
|
-
tryDeleteUserAccount: (driftClient: import("
|
|
10
|
-
getIdleWaitTimeMinutes: (user: import("
|
|
11
|
-
getStatsAccountDeletionWaitTime: (userStatsAccount: import("
|
|
3
|
+
accountHasOpenOrders: (user: import("@drift-labs/sdk").User) => boolean;
|
|
4
|
+
accountHasOpenPerpPositions: (user: import("@drift-labs/sdk").User) => boolean;
|
|
5
|
+
accountHasOpenSpotPositions: (user: import("@drift-labs/sdk").User) => boolean;
|
|
6
|
+
getAccountDeletionStepsToTake: (user: import("@drift-labs/sdk").User, userStatsAccount: import("@drift-labs/sdk").UserStatsAccount, currentSlot: number) => ("askToCloseAllPositionsOrdersBorrows" | "sendAccountDeletionIx" | "sendBalanceWithdrawalIx" | "sendTriggerAccountIdleIx" | "askToWait")[];
|
|
7
|
+
getAccountCanBeDeletedInstantly: (user: import("@drift-labs/sdk").User, userStatsAccount: import("@drift-labs/sdk").UserStatsAccount, currentSlot: number) => "no" | "yes" | "no-wait-for-idle" | "yes-after-making-idle";
|
|
8
|
+
getStatsAccountIsPastDeletionCutoff: (userStatsAccount: import("@drift-labs/sdk").UserStatsAccount) => boolean;
|
|
9
|
+
tryDeleteUserAccount: (driftClient: import("@drift-labs/sdk").DriftClient, user: import("@drift-labs/sdk").User, userStatsAccount: import("@drift-labs/sdk").UserStatsAccount, latestSlot: number) => Promise<string>;
|
|
10
|
+
getIdleWaitTimeMinutes: (user: import("@drift-labs/sdk").User, currentSlot: number) => number;
|
|
11
|
+
getStatsAccountDeletionWaitTime: (userStatsAccount: import("@drift-labs/sdk").UserStatsAccount) => number;
|
|
12
12
|
};
|
|
13
13
|
};
|
|
@@ -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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
139
|
-
if (
|
|
140
|
-
(
|
|
141
|
-
clearTimeout(timeout);
|
|
142
|
-
resolve(order.orderId);
|
|
137
|
+
clearTimeout(timeout);
|
|
138
|
+
if (pollInterval) {
|
|
139
|
+
clearInterval(pollInterval);
|
|
143
140
|
}
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
150
|
-
clearTimeout(timeout);
|
|
151
|
-
resolve(order.orderId);
|
|
183
|
+
finalizeResolve(order.orderId);
|
|
152
184
|
}
|
|
153
|
-
}
|
|
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"]}
|
package/lib/clients/tvFeed.d.ts
CHANGED
|
@@ -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;
|
package/lib/clients/tvFeed.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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';
|
|
@@ -91,7 +90,7 @@ export declare const COMMON_UI_UTILS: {
|
|
|
91
90
|
getMarketStepSize: (driftClient: DriftClient, marketId: import("src/types").MarketId) => BN;
|
|
92
91
|
getMarketStepSizeDecimals: (driftClient: DriftClient, marketId: import("src/types").MarketId) => number;
|
|
93
92
|
isEntirePositionOrder: (orderAmount: BigNum) => boolean;
|
|
94
|
-
getMarginUsedForPosition: (user: User, marketIndex: number, includeOpenOrders?: boolean) =>
|
|
93
|
+
getMarginUsedForPosition: (user: User, marketIndex: number, includeOpenOrders?: boolean) => any;
|
|
95
94
|
validateLeverageChange: ({ user, marketIndex, newLeverage, }: {
|
|
96
95
|
user: User;
|
|
97
96
|
marketIndex: number;
|
|
@@ -162,6 +161,9 @@ export declare const COMMON_UI_UTILS: {
|
|
|
162
161
|
getIdAndAuthorityFromKey: (key: string) => {
|
|
163
162
|
userId: number;
|
|
164
163
|
userAuthority: PublicKey;
|
|
164
|
+
} | {
|
|
165
|
+
userId: undefined;
|
|
166
|
+
userAuthority: undefined;
|
|
165
167
|
};
|
|
166
168
|
getLimitAuctionParams: ({ direction, inputPrice, startPriceFromSettings, duration, auctionStartPriceOffset, oraclePriceBands, }: {
|
|
167
169
|
direction: PositionDirection;
|