@drift-labs/sdk 2.121.0-beta.0 → 2.121.0-beta.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 2.121.0-beta.0
1
+ 2.121.0-beta.2
@@ -6,6 +6,7 @@ export declare function getUserWithoutOrderFilter(): MemcmpFilter;
6
6
  export declare function getUserWithAuctionFilter(): MemcmpFilter;
7
7
  export declare function getUserThatHasBeenLP(): MemcmpFilter;
8
8
  export declare function getUserWithName(name: string): MemcmpFilter;
9
+ export declare function getUsersWithPoolId(poolId: number): MemcmpFilter;
9
10
  export declare function getUserStatsFilter(): MemcmpFilter;
10
11
  export declare function getUserStatsIsReferredFilter(): MemcmpFilter;
11
12
  export declare function getUserStatsIsReferredOrReferrerFilter(): MemcmpFilter;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getSignedMsgUserOrdersFilter = exports.getUserStatsIsReferredOrReferrerFilter = exports.getUserStatsIsReferredFilter = exports.getUserStatsFilter = exports.getUserWithName = exports.getUserThatHasBeenLP = exports.getUserWithAuctionFilter = exports.getUserWithoutOrderFilter = exports.getUserWithOrderFilter = exports.getNonIdleUserFilter = exports.getUserFilter = void 0;
6
+ exports.getSignedMsgUserOrdersFilter = exports.getUserStatsIsReferredOrReferrerFilter = exports.getUserStatsIsReferredFilter = exports.getUserStatsFilter = exports.getUsersWithPoolId = exports.getUserWithName = exports.getUserThatHasBeenLP = exports.getUserWithAuctionFilter = exports.getUserWithoutOrderFilter = exports.getUserWithOrderFilter = exports.getNonIdleUserFilter = exports.getUserFilter = void 0;
7
7
  const bs58_1 = __importDefault(require("bs58"));
8
8
  const anchor_1 = require("@coral-xyz/anchor");
9
9
  const userName_1 = require("./userName");
@@ -70,6 +70,15 @@ function getUserWithName(name) {
70
70
  };
71
71
  }
72
72
  exports.getUserWithName = getUserWithName;
73
+ function getUsersWithPoolId(poolId) {
74
+ return {
75
+ memcmp: {
76
+ offset: 4356,
77
+ bytes: bs58_1.default.encode(Uint8Array.from([poolId])),
78
+ },
79
+ };
80
+ }
81
+ exports.getUsersWithPoolId = getUsersWithPoolId;
73
82
  function getUserStatsFilter() {
74
83
  return {
75
84
  memcmp: {
@@ -29,7 +29,7 @@ export declare class SwiftOrderSubscriber {
29
29
  getSymbolForMarketIndex(marketIndex: number): string;
30
30
  generateChallengeResponse(nonce: string): string;
31
31
  handleAuthMessage(message: any): void;
32
- subscribe(onOrder: (orderMessageRaw: any, signedMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage, isDelegateSigner?: boolean) => Promise<void>): Promise<void>;
32
+ subscribe(onOrder: (orderMessageRaw: any, signedMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage, isDelegateSigner?: boolean) => Promise<void>, acceptSanitized?: boolean): Promise<void>;
33
33
  getPlaceAndMakeSignedMsgOrderIxs(orderMessageRaw: any, signedMsgOrderParamsMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage, makerOrderParams: OptionalOrderParams): Promise<TransactionInstruction[]>;
34
34
  private startHeartbeatTimer;
35
35
  private reconnect;
@@ -55,7 +55,7 @@ class SwiftOrderSubscriber {
55
55
  });
56
56
  }
57
57
  }
58
- async subscribe(onOrder) {
58
+ async subscribe(onOrder, acceptSanitized = false) {
59
59
  this.onOrder = onOrder;
60
60
  const endpoint = this.config.endpoint || this.config.driftEnv === 'devnet'
61
61
  ? 'wss://master.swift.drift.trade/ws'
@@ -72,6 +72,10 @@ class SwiftOrderSubscriber {
72
72
  }
73
73
  if (message['order']) {
74
74
  const order = message['order'];
75
+ // ignore likely sanitized orders by default
76
+ if (order['will_sanitize'] === true && !acceptSanitized) {
77
+ return;
78
+ }
75
79
  const signedMsgOrderParamsBuf = Buffer.from(order['order_message'], 'hex');
76
80
  const isDelegateSigner = signedMsgOrderParamsBuf
77
81
  .slice(0, 8)
@@ -23,6 +23,7 @@ export declare class UserMap implements UserMapInterface {
23
23
  private connection;
24
24
  private commitment;
25
25
  private includeIdle;
26
+ private filterByPoolId?;
26
27
  private additionalFilters?;
27
28
  private disableSyncOnTotalAccountsChange;
28
29
  private lastNumberOfSubAccounts;
@@ -82,6 +83,7 @@ export declare class UserMap implements UserMapInterface {
82
83
  */
83
84
  getUniqueAuthorities(filterCriteria?: UserFilterCriteria): PublicKey[];
84
85
  sync(): Promise<void>;
86
+ private getFilters;
85
87
  /**
86
88
  * Syncs the UserMap using the default sync method (single getProgramAccounts call with filters).
87
89
  * This method may fail when drift has too many users. (nodejs response size limits)
@@ -38,6 +38,7 @@ class UserMap {
38
38
  ? (_a = config.subscriptionConfig.commitment) !== null && _a !== void 0 ? _a : this.driftClient.opts.commitment
39
39
  : this.driftClient.opts.commitment;
40
40
  this.includeIdle = (_b = config.includeIdle) !== null && _b !== void 0 ? _b : false;
41
+ this.filterByPoolId = config.filterByPoolId;
41
42
  this.additionalFilters = config.additionalFilters;
42
43
  this.disableSyncOnTotalAccountsChange =
43
44
  (_c = config.disableSyncOnTotalAccountsChange) !== null && _c !== void 0 ? _c : false;
@@ -263,6 +264,19 @@ class UserMap {
263
264
  return this.paginatedSync();
264
265
  }
265
266
  }
267
+ getFilters() {
268
+ const filters = [(0, memcmp_1.getUserFilter)()];
269
+ if (!this.includeIdle) {
270
+ filters.push((0, memcmp_1.getNonIdleUserFilter)());
271
+ }
272
+ if (this.filterByPoolId !== undefined) {
273
+ filters.push((0, memcmp_1.getUsersWithPoolId)(this.filterByPoolId));
274
+ }
275
+ if (this.additionalFilters) {
276
+ filters.push(...this.additionalFilters);
277
+ }
278
+ return filters;
279
+ }
266
280
  /**
267
281
  * Syncs the UserMap using the default sync method (single getProgramAccounts call with filters).
268
282
  * This method may fail when drift has too many users. (nodejs response size limits)
@@ -277,18 +291,11 @@ class UserMap {
277
291
  this.syncPromiseResolver = resolver;
278
292
  });
279
293
  try {
280
- const filters = [(0, memcmp_1.getUserFilter)()];
281
- if (!this.includeIdle) {
282
- filters.push((0, memcmp_1.getNonIdleUserFilter)());
283
- }
284
- if (this.additionalFilters) {
285
- filters.push(...this.additionalFilters);
286
- }
287
294
  const rpcRequestArgs = [
288
295
  this.driftClient.program.programId.toBase58(),
289
296
  {
290
297
  commitment: this.commitment,
291
- filters,
298
+ filters: this.getFilters(),
292
299
  encoding: 'base64+zstd',
293
300
  withContext: true,
294
301
  },
@@ -359,10 +366,7 @@ class UserMap {
359
366
  try {
360
367
  const accountsPrefetch = await this.connection.getProgramAccounts(this.driftClient.program.programId, {
361
368
  dataSlice: { offset: 0, length: 0 },
362
- filters: [
363
- (0, memcmp_1.getUserFilter)(),
364
- ...(!this.includeIdle ? [(0, memcmp_1.getNonIdleUserFilter)()] : []),
365
- ],
369
+ filters: this.getFilters(),
366
370
  });
367
371
  const accountPublicKeys = accountsPrefetch.map((account) => account.pubkey);
368
372
  const limitConcurrency = async (tasks, limit) => {
@@ -35,5 +35,6 @@ export type UserMapConfig = {
35
35
  disableSyncOnTotalAccountsChange?: boolean;
36
36
  syncConfig?: SyncConfig;
37
37
  throwOnFailedSync?: boolean;
38
+ filterByPoolId?: number;
38
39
  additionalFilters?: MemcmpFilter[];
39
40
  };
@@ -6,6 +6,7 @@ export declare function getUserWithoutOrderFilter(): MemcmpFilter;
6
6
  export declare function getUserWithAuctionFilter(): MemcmpFilter;
7
7
  export declare function getUserThatHasBeenLP(): MemcmpFilter;
8
8
  export declare function getUserWithName(name: string): MemcmpFilter;
9
+ export declare function getUsersWithPoolId(poolId: number): MemcmpFilter;
9
10
  export declare function getUserStatsFilter(): MemcmpFilter;
10
11
  export declare function getUserStatsIsReferredFilter(): MemcmpFilter;
11
12
  export declare function getUserStatsIsReferredOrReferrerFilter(): MemcmpFilter;
@@ -1 +1 @@
1
- {"version":3,"file":"memcmp.d.ts","sourceRoot":"","sources":["../../src/memcmp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,wBAAgB,aAAa,IAAI,YAAY,CAO5C;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAOnD;AAED,wBAAgB,sBAAsB,IAAI,YAAY,CAOrD;AAED,wBAAgB,yBAAyB,IAAI,YAAY,CAOxD;AAED,wBAAgB,wBAAwB,IAAI,YAAY,CAOvD;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAOnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAO1D;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAOjD;AAED,wBAAgB,4BAA4B,IAAI,YAAY,CAO3D;AAED,wBAAgB,sCAAsC,IAAI,YAAY,CAOrE;AAED,wBAAgB,4BAA4B,IAAI,YAAY,CAS3D"}
1
+ {"version":3,"file":"memcmp.d.ts","sourceRoot":"","sources":["../../src/memcmp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,wBAAgB,aAAa,IAAI,YAAY,CAO5C;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAOnD;AAED,wBAAgB,sBAAsB,IAAI,YAAY,CAOrD;AAED,wBAAgB,yBAAyB,IAAI,YAAY,CAOxD;AAED,wBAAgB,wBAAwB,IAAI,YAAY,CAOvD;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAOnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAO1D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAO/D;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAOjD;AAED,wBAAgB,4BAA4B,IAAI,YAAY,CAO3D;AAED,wBAAgB,sCAAsC,IAAI,YAAY,CAOrE;AAED,wBAAgB,4BAA4B,IAAI,YAAY,CAS3D"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getSignedMsgUserOrdersFilter = exports.getUserStatsIsReferredOrReferrerFilter = exports.getUserStatsIsReferredFilter = exports.getUserStatsFilter = exports.getUserWithName = exports.getUserThatHasBeenLP = exports.getUserWithAuctionFilter = exports.getUserWithoutOrderFilter = exports.getUserWithOrderFilter = exports.getNonIdleUserFilter = exports.getUserFilter = void 0;
6
+ exports.getSignedMsgUserOrdersFilter = exports.getUserStatsIsReferredOrReferrerFilter = exports.getUserStatsIsReferredFilter = exports.getUserStatsFilter = exports.getUsersWithPoolId = exports.getUserWithName = exports.getUserThatHasBeenLP = exports.getUserWithAuctionFilter = exports.getUserWithoutOrderFilter = exports.getUserWithOrderFilter = exports.getNonIdleUserFilter = exports.getUserFilter = void 0;
7
7
  const bs58_1 = __importDefault(require("bs58"));
8
8
  const anchor_1 = require("@coral-xyz/anchor");
9
9
  const userName_1 = require("./userName");
@@ -70,6 +70,15 @@ function getUserWithName(name) {
70
70
  };
71
71
  }
72
72
  exports.getUserWithName = getUserWithName;
73
+ function getUsersWithPoolId(poolId) {
74
+ return {
75
+ memcmp: {
76
+ offset: 4356,
77
+ bytes: bs58_1.default.encode(Uint8Array.from([poolId])),
78
+ },
79
+ };
80
+ }
81
+ exports.getUsersWithPoolId = getUsersWithPoolId;
73
82
  function getUserStatsFilter() {
74
83
  return {
75
84
  memcmp: {
@@ -29,7 +29,7 @@ export declare class SwiftOrderSubscriber {
29
29
  getSymbolForMarketIndex(marketIndex: number): string;
30
30
  generateChallengeResponse(nonce: string): string;
31
31
  handleAuthMessage(message: any): void;
32
- subscribe(onOrder: (orderMessageRaw: any, signedMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage, isDelegateSigner?: boolean) => Promise<void>): Promise<void>;
32
+ subscribe(onOrder: (orderMessageRaw: any, signedMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage, isDelegateSigner?: boolean) => Promise<void>, acceptSanitized?: boolean): Promise<void>;
33
33
  getPlaceAndMakeSignedMsgOrderIxs(orderMessageRaw: any, signedMsgOrderParamsMessage: SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage, makerOrderParams: OptionalOrderParams): Promise<TransactionInstruction[]>;
34
34
  private startHeartbeatTimer;
35
35
  private reconnect;
@@ -1 +1 @@
1
- {"version":3,"file":"swiftOrderSubscriber.d.ts","sourceRoot":"","sources":["../../../src/swift/swiftOrderSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,WAAW,EACX,QAAQ,EAKR,mBAAmB,EAEnB,mCAAmC,EACnC,2BAA2B,EAC3B,WAAW,EACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAa,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAO7E,MAAM,WAAW,aAAa;IAC7B,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC5D;AAED,MAAM,MAAM,0BAA0B,GAAG;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB;;;;MAIE;IACF,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qBAAa,oBAAoB;IAgBpB,OAAO,CAAC,MAAM;IAf1B,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAc;IAC1B,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC,OAAO,EAAE,CACf,eAAe,EAAE,GAAG,EACpB,aAAa,EACV,2BAA2B,GAC3B,mCAAmC,EACtC,gBAAgB,CAAC,EAAE,OAAO,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB,UAAU,UAAS;gBAEC,MAAM,EAAE,0BAA0B;IAKtD,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAQpD,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAUhD,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IA6B/B,SAAS,CACd,OAAO,EAAE,CACR,eAAe,EAAE,GAAG,EACpB,aAAa,EACV,2BAA2B,GAC3B,mCAAmC,EACtC,gBAAgB,CAAC,EAAE,OAAO,KACtB,OAAO,CAAC,IAAI,CAAC,GAChB,OAAO,CAAC,IAAI,CAAC;IA4FV,gCAAgC,CACrC,eAAe,EAAE,GAAG,EACpB,2BAA2B,EACxB,2BAA2B,GAC3B,mCAAmC,EACtC,gBAAgB,EAAE,mBAAmB,GACnC,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAiEpC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,SAAS;CAWjB"}
1
+ {"version":3,"file":"swiftOrderSubscriber.d.ts","sourceRoot":"","sources":["../../../src/swift/swiftOrderSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,WAAW,EACX,QAAQ,EAKR,mBAAmB,EAEnB,mCAAmC,EACnC,2BAA2B,EAC3B,WAAW,EACX,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAa,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAO7E,MAAM,WAAW,aAAa;IAC7B,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC5D;AAED,MAAM,MAAM,0BAA0B,GAAG;IACxC,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB;;;;MAIE;IACF,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qBAAa,oBAAoB;IAgBpB,OAAO,CAAC,MAAM;IAf1B,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAc;IAC1B,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC,OAAO,EAAE,CACf,eAAe,EAAE,GAAG,EACpB,aAAa,EACV,2BAA2B,GAC3B,mCAAmC,EACtC,gBAAgB,CAAC,EAAE,OAAO,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB,UAAU,UAAS;gBAEC,MAAM,EAAE,0BAA0B;IAKtD,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAQpD,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAUhD,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IA6B/B,SAAS,CACd,OAAO,EAAE,CACR,eAAe,EAAE,GAAG,EACpB,aAAa,EACV,2BAA2B,GAC3B,mCAAmC,EACtC,gBAAgB,CAAC,EAAE,OAAO,KACtB,OAAO,CAAC,IAAI,CAAC,EAClB,eAAe,UAAQ,GACrB,OAAO,CAAC,IAAI,CAAC;IAgGV,gCAAgC,CACrC,eAAe,EAAE,GAAG,EACpB,2BAA2B,EACxB,2BAA2B,GAC3B,mCAAmC,EACtC,gBAAgB,EAAE,mBAAmB,GACnC,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAiEpC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,SAAS;CAWjB"}
@@ -55,7 +55,7 @@ class SwiftOrderSubscriber {
55
55
  });
56
56
  }
57
57
  }
58
- async subscribe(onOrder) {
58
+ async subscribe(onOrder, acceptSanitized = false) {
59
59
  this.onOrder = onOrder;
60
60
  const endpoint = this.config.endpoint || this.config.driftEnv === 'devnet'
61
61
  ? 'wss://master.swift.drift.trade/ws'
@@ -72,6 +72,10 @@ class SwiftOrderSubscriber {
72
72
  }
73
73
  if (message['order']) {
74
74
  const order = message['order'];
75
+ // ignore likely sanitized orders by default
76
+ if (order['will_sanitize'] === true && !acceptSanitized) {
77
+ return;
78
+ }
75
79
  const signedMsgOrderParamsBuf = Buffer.from(order['order_message'], 'hex');
76
80
  const isDelegateSigner = signedMsgOrderParamsBuf
77
81
  .slice(0, 8)
@@ -23,6 +23,7 @@ export declare class UserMap implements UserMapInterface {
23
23
  private connection;
24
24
  private commitment;
25
25
  private includeIdle;
26
+ private filterByPoolId?;
26
27
  private additionalFilters?;
27
28
  private disableSyncOnTotalAccountsChange;
28
29
  private lastNumberOfSubAccounts;
@@ -82,6 +83,7 @@ export declare class UserMap implements UserMapInterface {
82
83
  */
83
84
  getUniqueAuthorities(filterCriteria?: UserFilterCriteria): PublicKey[];
84
85
  sync(): Promise<void>;
86
+ private getFilters;
85
87
  /**
86
88
  * Syncs the UserMap using the default sync method (single getProgramAccounts call with filters).
87
89
  * This method may fail when drift has too many users. (nodejs response size limits)
@@ -1 +1 @@
1
- {"version":3,"file":"userMap.d.ts","sourceRoot":"","sources":["../../../src/userMap/userMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"userMap.d.ts","sourceRoot":"","sources":["../../../src/userMap/userMap.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ class UserMap {
38
38
  ? (_a = config.subscriptionConfig.commitment) !== null && _a !== void 0 ? _a : this.driftClient.opts.commitment
39
39
  : this.driftClient.opts.commitment;
40
40
  this.includeIdle = (_b = config.includeIdle) !== null && _b !== void 0 ? _b : false;
41
+ this.filterByPoolId = config.filterByPoolId;
41
42
  this.additionalFilters = config.additionalFilters;
42
43
  this.disableSyncOnTotalAccountsChange =
43
44
  (_c = config.disableSyncOnTotalAccountsChange) !== null && _c !== void 0 ? _c : false;
@@ -263,6 +264,19 @@ class UserMap {
263
264
  return this.paginatedSync();
264
265
  }
265
266
  }
267
+ getFilters() {
268
+ const filters = [(0, memcmp_1.getUserFilter)()];
269
+ if (!this.includeIdle) {
270
+ filters.push((0, memcmp_1.getNonIdleUserFilter)());
271
+ }
272
+ if (this.filterByPoolId !== undefined) {
273
+ filters.push((0, memcmp_1.getUsersWithPoolId)(this.filterByPoolId));
274
+ }
275
+ if (this.additionalFilters) {
276
+ filters.push(...this.additionalFilters);
277
+ }
278
+ return filters;
279
+ }
266
280
  /**
267
281
  * Syncs the UserMap using the default sync method (single getProgramAccounts call with filters).
268
282
  * This method may fail when drift has too many users. (nodejs response size limits)
@@ -277,18 +291,11 @@ class UserMap {
277
291
  this.syncPromiseResolver = resolver;
278
292
  });
279
293
  try {
280
- const filters = [(0, memcmp_1.getUserFilter)()];
281
- if (!this.includeIdle) {
282
- filters.push((0, memcmp_1.getNonIdleUserFilter)());
283
- }
284
- if (this.additionalFilters) {
285
- filters.push(...this.additionalFilters);
286
- }
287
294
  const rpcRequestArgs = [
288
295
  this.driftClient.program.programId.toBase58(),
289
296
  {
290
297
  commitment: this.commitment,
291
- filters,
298
+ filters: this.getFilters(),
292
299
  encoding: 'base64+zstd',
293
300
  withContext: true,
294
301
  },
@@ -359,10 +366,7 @@ class UserMap {
359
366
  try {
360
367
  const accountsPrefetch = await this.connection.getProgramAccounts(this.driftClient.program.programId, {
361
368
  dataSlice: { offset: 0, length: 0 },
362
- filters: [
363
- (0, memcmp_1.getUserFilter)(),
364
- ...(!this.includeIdle ? [(0, memcmp_1.getNonIdleUserFilter)()] : []),
365
- ],
369
+ filters: this.getFilters(),
366
370
  });
367
371
  const accountPublicKeys = accountsPrefetch.map((account) => account.pubkey);
368
372
  const limitConcurrency = async (tasks, limit) => {
@@ -35,6 +35,7 @@ export type UserMapConfig = {
35
35
  disableSyncOnTotalAccountsChange?: boolean;
36
36
  syncConfig?: SyncConfig;
37
37
  throwOnFailedSync?: boolean;
38
+ filterByPoolId?: number;
38
39
  additionalFilters?: MemcmpFilter[];
39
40
  };
40
41
  //# sourceMappingURL=userMapConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"userMapConfig.d.ts","sourceRoot":"","sources":["../../../src/userMap/userMapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,MAAM,yBAAyB,GAAG;IAEvC,aAAa,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GACnB;IACA,IAAI,EAAE,SAAS,CAAC;CACf,GACD;IACA,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAC;IAEzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kBAAkB,EACf;QACA,IAAI,EAAE,SAAS,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,UAAU,CAAC;KACvB,GACD;QACA,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC1B,GACD;QACA,IAAI,EAAE,WAAW,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;KACvB,CAAC;IAGL,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,UAAU,CAAC,EAAE,OAAO,CAAC;IAIrB,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAE3C,UAAU,CAAC,EAAE,UAAU,CAAC;IAGxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,iBAAiB,CAAC,EAAE,YAAY,EAAE,CAAC;CACnC,CAAC"}
1
+ {"version":3,"file":"userMapConfig.d.ts","sourceRoot":"","sources":["../../../src/userMap/userMapConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,MAAM,yBAAyB,GAAG;IAEvC,aAAa,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,UAAU,GACnB;IACA,IAAI,EAAE,SAAS,CAAC;CACf,GACD;IACA,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAC;IAEzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kBAAkB,EACf;QACA,IAAI,EAAE,SAAS,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,UAAU,CAAC;KACvB,GACD;QACA,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC1B,GACD;QACA,IAAI,EAAE,WAAW,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;KACvB,CAAC;IAGL,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,UAAU,CAAC,EAAE,OAAO,CAAC;IAIrB,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAE3C,UAAU,CAAC,EAAE,UAAU,CAAC;IAGxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,iBAAiB,CAAC,EAAE,YAAY,EAAE,CAAC;CACnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.121.0-beta.0",
3
+ "version": "2.121.0-beta.2",
4
4
  "main": "lib/node/index.js",
5
5
  "types": "lib/node/index.d.ts",
6
6
  "browser": "./lib/browser/index.js",
package/src/memcmp.ts CHANGED
@@ -66,6 +66,15 @@ export function getUserWithName(name: string): MemcmpFilter {
66
66
  };
67
67
  }
68
68
 
69
+ export function getUsersWithPoolId(poolId: number): MemcmpFilter {
70
+ return {
71
+ memcmp: {
72
+ offset: 4356,
73
+ bytes: bs58.encode(Uint8Array.from([poolId])),
74
+ },
75
+ };
76
+ }
77
+
69
78
  export function getUserStatsFilter(): MemcmpFilter {
70
79
  return {
71
80
  memcmp: {
@@ -112,7 +112,8 @@ export class SwiftOrderSubscriber {
112
112
  | SignedMsgOrderParamsMessage
113
113
  | SignedMsgOrderParamsDelegateMessage,
114
114
  isDelegateSigner?: boolean
115
- ) => Promise<void>
115
+ ) => Promise<void>,
116
+ acceptSanitized = false
116
117
  ): Promise<void> {
117
118
  this.onOrder = onOrder;
118
119
 
@@ -137,6 +138,10 @@ export class SwiftOrderSubscriber {
137
138
 
138
139
  if (message['order']) {
139
140
  const order = message['order'];
141
+ // ignore likely sanitized orders by default
142
+ if (order['will_sanitize'] === true && !acceptSanitized) {
143
+ return;
144
+ }
140
145
  const signedMsgOrderParamsBuf = Buffer.from(
141
146
  order['order_message'],
142
147
  'hex'
@@ -29,7 +29,11 @@ import {
29
29
  } from '@solana/web3.js';
30
30
  import { Buffer } from 'buffer';
31
31
  import { ZSTDDecoder } from 'zstddec';
32
- import { getNonIdleUserFilter, getUserFilter } from '../memcmp';
32
+ import {
33
+ getNonIdleUserFilter,
34
+ getUserFilter,
35
+ getUsersWithPoolId,
36
+ } from '../memcmp';
33
37
  import {
34
38
  SyncConfig,
35
39
  UserAccountFilterCriteria as UserFilterCriteria,
@@ -76,6 +80,7 @@ export class UserMap implements UserMapInterface {
76
80
  private connection: Connection;
77
81
  private commitment: Commitment;
78
82
  private includeIdle: boolean;
83
+ private filterByPoolId?: number;
79
84
  private additionalFilters?: MemcmpFilter[];
80
85
  private disableSyncOnTotalAccountsChange: boolean;
81
86
  private lastNumberOfSubAccounts: BN;
@@ -115,6 +120,7 @@ export class UserMap implements UserMapInterface {
115
120
  this.driftClient.opts.commitment
116
121
  : this.driftClient.opts.commitment;
117
122
  this.includeIdle = config.includeIdle ?? false;
123
+ this.filterByPoolId = config.filterByPoolId;
118
124
  this.additionalFilters = config.additionalFilters;
119
125
  this.disableSyncOnTotalAccountsChange =
120
126
  config.disableSyncOnTotalAccountsChange ?? false;
@@ -394,6 +400,20 @@ export class UserMap implements UserMapInterface {
394
400
  }
395
401
  }
396
402
 
403
+ private getFilters(): MemcmpFilter[] {
404
+ const filters = [getUserFilter()];
405
+ if (!this.includeIdle) {
406
+ filters.push(getNonIdleUserFilter());
407
+ }
408
+ if (this.filterByPoolId !== undefined) {
409
+ filters.push(getUsersWithPoolId(this.filterByPoolId));
410
+ }
411
+ if (this.additionalFilters) {
412
+ filters.push(...this.additionalFilters);
413
+ }
414
+ return filters;
415
+ }
416
+
397
417
  /**
398
418
  * Syncs the UserMap using the default sync method (single getProgramAccounts call with filters).
399
419
  * This method may fail when drift has too many users. (nodejs response size limits)
@@ -408,18 +428,11 @@ export class UserMap implements UserMapInterface {
408
428
  });
409
429
 
410
430
  try {
411
- const filters = [getUserFilter()];
412
- if (!this.includeIdle) {
413
- filters.push(getNonIdleUserFilter());
414
- }
415
- if (this.additionalFilters) {
416
- filters.push(...this.additionalFilters);
417
- }
418
431
  const rpcRequestArgs = [
419
432
  this.driftClient.program.programId.toBase58(),
420
433
  {
421
434
  commitment: this.commitment,
422
- filters,
435
+ filters: this.getFilters(),
423
436
  encoding: 'base64+zstd',
424
437
  withContext: true,
425
438
  },
@@ -517,10 +530,7 @@ export class UserMap implements UserMapInterface {
517
530
  this.driftClient.program.programId,
518
531
  {
519
532
  dataSlice: { offset: 0, length: 0 },
520
- filters: [
521
- getUserFilter(),
522
- ...(!this.includeIdle ? [getNonIdleUserFilter()] : []),
523
- ],
533
+ filters: this.getFilters(),
524
534
  }
525
535
  );
526
536
  const accountPublicKeys = accountsPrefetch.map(
@@ -59,5 +59,8 @@ export type UserMapConfig = {
59
59
  // Whether to throw an error if the userMap fails to sync. Defaults to true.
60
60
  throwOnFailedSync?: boolean;
61
61
 
62
+ // Whether to filter users by poolId. Defaults to false (all users).
63
+ filterByPoolId?: number;
64
+
62
65
  additionalFilters?: MemcmpFilter[];
63
66
  };