@chainstream-io/sdk 0.2.11 → 0.2.13

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.
@@ -43,7 +43,7 @@ var import_axios_retry = __toESM(require("axios-retry"), 1);
43
43
  var axiosInstance;
44
44
  var currentOptions = void 0;
45
45
  var configure = (options) => {
46
- const baseURL = options.basePath || "https://api-dex.chainstream.io";
46
+ const baseURL = options.basePath || "https://api.chainstream.io";
47
47
  currentOptions = {
48
48
  ...options,
49
49
  basePath: baseURL
@@ -267,12 +267,35 @@ var CEL_FIELD_MAPPINGS = {
267
267
  balanceTagRatRatio: "btrr",
268
268
  timestamp: "ts"
269
269
  },
270
- // New token subscription fields
270
+ // New token subscription fields (dex-new-token, supports CEL filter)
271
271
  subscribeNewToken: {
272
272
  tokenAddress: "a",
273
273
  name: "n",
274
274
  symbol: "s",
275
- createdAtMs: "cts"
275
+ decimals: "dec",
276
+ imageUrl: "iu",
277
+ description: "de",
278
+ createdAtMs: "cts",
279
+ coingeckoCoinId: "cgi",
280
+ "socialMedia.twitter": "sm.tw",
281
+ "socialMedia.telegram": "sm.tg",
282
+ "socialMedia.website": "sm.w",
283
+ "socialMedia.tiktok": "sm.tt",
284
+ "socialMedia.discord": "sm.dc",
285
+ "socialMedia.facebook": "sm.fb",
286
+ "socialMedia.github": "sm.gh",
287
+ "socialMedia.instagram": "sm.ig",
288
+ "socialMedia.linkedin": "sm.li",
289
+ "socialMedia.medium": "sm.md",
290
+ "socialMedia.reddit": "sm.rd",
291
+ "socialMedia.youtube": "sm.yt",
292
+ "socialMedia.bitbucket": "sm.bb",
293
+ "launchFrom.programAddress": "lf.pa",
294
+ "launchFrom.protocolFamily": "lf.pf",
295
+ "launchFrom.protocolName": "lf.pn",
296
+ "migratedTo.programAddress": "mt.pa",
297
+ "migratedTo.protocolFamily": "mt.pf",
298
+ "migratedTo.protocolName": "mt.pn"
276
299
  },
277
300
  // Token supply subscription fields
278
301
  subscribeTokenSupply: {
@@ -295,15 +318,65 @@ var CEL_FIELD_MAPPINGS = {
295
318
  value: "v",
296
319
  timestamp: "ts"
297
320
  },
298
- // New token metadata subscription fields
321
+ // New token metadata subscription fields (dex-new-tokens-metadata)
299
322
  subscribeNewTokensMetadata: {
300
323
  tokenAddress: "a",
301
324
  name: "n",
325
+ decimals: "dec",
326
+ symbol: "s",
327
+ imageUrl: "iu",
328
+ description: "de",
329
+ createdAtMs: "cts",
330
+ coingeckoCoinId: "cgi",
331
+ "socialMedia.twitter": "sm.tw",
332
+ "socialMedia.telegram": "sm.tg",
333
+ "socialMedia.website": "sm.w",
334
+ "socialMedia.tiktok": "sm.tt",
335
+ "socialMedia.discord": "sm.dc",
336
+ "socialMedia.facebook": "sm.fb",
337
+ "socialMedia.github": "sm.gh",
338
+ "socialMedia.instagram": "sm.ig",
339
+ "socialMedia.linkedin": "sm.li",
340
+ "socialMedia.medium": "sm.md",
341
+ "socialMedia.reddit": "sm.rd",
342
+ "socialMedia.youtube": "sm.yt",
343
+ "socialMedia.bitbucket": "sm.bb",
344
+ "launchFrom.programAddress": "lf.pa",
345
+ "launchFrom.protocolFamily": "lf.pf",
346
+ "launchFrom.protocolName": "lf.pn",
347
+ "migratedTo.programAddress": "mt.pa",
348
+ "migratedTo.protocolFamily": "mt.pf",
349
+ "migratedTo.protocolName": "mt.pn"
350
+ },
351
+ // New tokens list subscription fields (dex-new-tokens)
352
+ subscribeNewTokens: {
353
+ tokenAddress: "a",
354
+ name: "n",
355
+ decimals: "dec",
302
356
  symbol: "s",
303
357
  imageUrl: "iu",
304
358
  description: "de",
305
- socialMedia: "sm",
306
- createdAtMs: "cts"
359
+ createdAtMs: "cts",
360
+ coingeckoCoinId: "cgi",
361
+ "socialMedia.twitter": "sm.tw",
362
+ "socialMedia.telegram": "sm.tg",
363
+ "socialMedia.website": "sm.w",
364
+ "socialMedia.tiktok": "sm.tt",
365
+ "socialMedia.discord": "sm.dc",
366
+ "socialMedia.facebook": "sm.fb",
367
+ "socialMedia.github": "sm.gh",
368
+ "socialMedia.instagram": "sm.ig",
369
+ "socialMedia.linkedin": "sm.li",
370
+ "socialMedia.medium": "sm.md",
371
+ "socialMedia.reddit": "sm.rd",
372
+ "socialMedia.youtube": "sm.yt",
373
+ "socialMedia.bitbucket": "sm.bb",
374
+ "launchFrom.programAddress": "lf.pa",
375
+ "launchFrom.protocolFamily": "lf.pf",
376
+ "launchFrom.protocolName": "lf.pn",
377
+ "migratedTo.programAddress": "mt.pa",
378
+ "migratedTo.protocolFamily": "mt.pf",
379
+ "migratedTo.protocolName": "mt.pn"
307
380
  },
308
381
  // Token trades subscription fields
309
382
  subscribeTokenTrades: {
@@ -379,12 +452,14 @@ function replaceFilterFields(filter, methodName) {
379
452
  }
380
453
  const fieldMappings = getFieldMappings(methodName);
381
454
  let result = filter;
382
- for (const [longField, shortField] of Object.entries(fieldMappings)) {
455
+ const sortedEntries = Object.entries(fieldMappings).sort(([a], [b]) => b.length - a.length);
456
+ for (const [longField, shortField] of sortedEntries) {
457
+ const escapedField = longField.replace(/\./g, "\\.");
383
458
  const patterns = [
384
- // Pattern 1: fieldName (without meta. prefix)
385
- new RegExp(`\\b${longField}\\b`, "g"),
386
- // Pattern 2: meta.fieldName (with meta. prefix)
387
- new RegExp(`\\bmeta\\.${longField}\\b`, "g")
459
+ // Pattern 1: meta.fieldName (with meta. prefix) — check first to avoid double meta.
460
+ new RegExp(`\\bmeta\\.${escapedField}\\b`, "g"),
461
+ // Pattern 2: fieldName (without meta. prefix)
462
+ new RegExp(`\\b${escapedField}\\b`, "g")
388
463
  ];
389
464
  patterns.forEach((pattern) => {
390
465
  result = result.replace(pattern, `meta.${shortField}`);
@@ -687,6 +762,57 @@ var StreamApi = class {
687
762
  [`liquidityChangeRatio${suffix}`]: this.formatScientificNotation(data[`lpc${suffix}`])
688
763
  };
689
764
  }
765
+ /**
766
+ * Parse social media data from short field names
767
+ */
768
+ parseSocialMedia(sm) {
769
+ if (!sm) return void 0;
770
+ return {
771
+ twitter: sm.tw,
772
+ telegram: sm.tg,
773
+ website: sm.w,
774
+ tiktok: sm.tt,
775
+ discord: sm.dc,
776
+ facebook: sm.fb,
777
+ github: sm.gh,
778
+ instagram: sm.ig,
779
+ linkedin: sm.li,
780
+ medium: sm.md,
781
+ reddit: sm.rd,
782
+ youtube: sm.yt,
783
+ bitbucket: sm.bb
784
+ };
785
+ }
786
+ /**
787
+ * Parse DEX protocol data from short field names
788
+ */
789
+ parseDexProtocol(lf) {
790
+ if (!lf) return void 0;
791
+ const result = {};
792
+ if (lf.pa) result.programAddress = lf.pa;
793
+ if (lf.pf) result.protocolFamily = lf.pf;
794
+ if (lf.pn) result.protocolName = lf.pn;
795
+ return result;
796
+ }
797
+ /**
798
+ * Parse a TokenMetadataTimeEvent from raw WebSocket data
799
+ */
800
+ parseTokenMetadata(data) {
801
+ const result = {
802
+ tokenAddress: data.a
803
+ };
804
+ if (data.n != null) result.name = data.n;
805
+ if (data.dec != null) result.decimals = data.dec;
806
+ if (data.s != null) result.symbol = data.s;
807
+ if (data.iu != null) result.imageUrl = data.iu;
808
+ if (data.de != null) result.description = data.de;
809
+ if (data.sm) result.socialMedia = this.parseSocialMedia(data.sm);
810
+ if (data.cts != null) result.createdAtMs = data.cts;
811
+ if (data.cgi != null) result.coingeckoCoinId = data.cgi;
812
+ if (data.lf) result.launchFrom = this.parseDexProtocol(data.lf);
813
+ if (data.mt) result.migratedTo = this.parseDexProtocol(data.mt);
814
+ return result;
815
+ }
690
816
  /**
691
817
  * Subscribe to token trade statistics
692
818
  * Channel: dex-token-stats:{chain}_{tokenAddress}
@@ -787,6 +913,10 @@ var StreamApi = class {
787
913
  "subscribeTokenHolders"
788
914
  );
789
915
  }
916
+ /**
917
+ * Subscribe to new token events (single token per event, supports CEL filter)
918
+ * Channel: dex-new-token:{chain}
919
+ */
790
920
  subscribeNewToken({
791
921
  chain,
792
922
  callback,
@@ -802,28 +932,24 @@ var StreamApi = class {
802
932
  symbol: data.s,
803
933
  createdAtMs: data.cts
804
934
  };
805
- if (data.dec) {
806
- result.decimals = data.dec;
807
- }
808
- if (data.lf) {
809
- const lf = data.lf;
810
- result.launchFrom = {};
811
- if (lf.pa) {
812
- result.launchFrom.programAddress = lf.pa;
813
- }
814
- if (lf.pf) {
815
- result.launchFrom.protocolFamily = lf.pf;
816
- }
817
- if (lf.pn) {
818
- result.launchFrom.protocolName = lf.pn;
819
- }
820
- }
935
+ if (data.dec != null) result.decimals = data.dec;
936
+ if (data.iu != null) result.imageUrl = data.iu;
937
+ if (data.de != null) result.description = data.de;
938
+ if (data.sm) result.socialMedia = this.parseSocialMedia(data.sm);
939
+ if (data.cgi != null) result.coingeckoCoinId = data.cgi;
940
+ if (data.lf) result.launchFrom = this.parseDexProtocol(data.lf);
941
+ if (data.mt) result.migratedTo = this.parseDexProtocol(data.mt);
821
942
  callback(result);
822
943
  },
823
944
  filter,
824
945
  "subscribeNewToken"
825
946
  );
826
947
  }
948
+ /**
949
+ * Subscribe to new tokens metadata (batch, aggregated every 1 second)
950
+ * Channel: dex-new-tokens-metadata:{chain}
951
+ * No CEL filter support
952
+ */
827
953
  subscribeNewTokensMetadata({
828
954
  chain,
829
955
  callback
@@ -831,35 +957,22 @@ var StreamApi = class {
831
957
  const channel = `dex-new-tokens-metadata:${chain}`;
832
958
  return this.subscribe(
833
959
  channel,
834
- (data) => callback(
835
- data.map((it) => ({
836
- tokenAddress: it.a,
837
- name: it.n,
838
- symbol: it.s,
839
- imageUrl: it.iu,
840
- description: it.de,
841
- socialMedia: (() => {
842
- const sm = it.sm;
843
- if (!sm) return void 0;
844
- return {
845
- twitter: sm.tw,
846
- telegram: sm.tg,
847
- website: sm.w,
848
- tiktok: sm.tt,
849
- discord: sm.dc,
850
- facebook: sm.fb,
851
- github: sm.gh,
852
- instagram: sm.ig,
853
- linkedin: sm.li,
854
- medium: sm.md,
855
- reddit: sm.rd,
856
- youtube: sm.yt,
857
- bitbucket: sm.bb
858
- };
859
- })(),
860
- createdAtMs: it.cts
861
- }))
862
- )
960
+ (data) => callback(data.map((it) => this.parseTokenMetadata(it)))
961
+ );
962
+ }
963
+ /**
964
+ * Subscribe to new tokens list (batch from token-created-to-realtime-pipeline)
965
+ * Channel: dex-new-tokens:{chain}
966
+ * No CEL filter support
967
+ */
968
+ subscribeNewTokens({
969
+ chain,
970
+ callback
971
+ }) {
972
+ const channel = `dex-new-tokens:${chain}`;
973
+ return this.subscribe(
974
+ channel,
975
+ (data) => callback(data.map((it) => this.parseTokenMetadata(it)))
863
976
  );
864
977
  }
865
978
  subscribeTokenSupply({
@@ -1008,73 +1121,13 @@ var StreamApi = class {
1008
1121
  result.metadata.createdAtMs = t.cts;
1009
1122
  }
1010
1123
  if (t.lf) {
1011
- const lf = t.lf;
1012
- result.metadata.launchFrom = {};
1013
- if (lf.pa) {
1014
- result.metadata.launchFrom.programAddress = lf.pa;
1015
- }
1016
- if (lf.pf) {
1017
- result.metadata.launchFrom.protocolFamily = lf.pf;
1018
- }
1019
- if (lf.pn) {
1020
- result.metadata.launchFrom.protocolName = lf.pn;
1021
- }
1124
+ result.metadata.launchFrom = this.parseDexProtocol(t.lf);
1022
1125
  }
1023
1126
  if (t.mt) {
1024
- const mt = t.mt;
1025
- result.metadata.migratedTo = {};
1026
- if (mt.pa) {
1027
- result.metadata.migratedTo.programAddress = mt.pa;
1028
- }
1029
- if (mt.pf) {
1030
- result.metadata.migratedTo.protocolFamily = mt.pf;
1031
- }
1032
- if (mt.pn) {
1033
- result.metadata.migratedTo.protocolName = mt.pn;
1034
- }
1127
+ result.metadata.migratedTo = this.parseDexProtocol(t.mt);
1035
1128
  }
1036
1129
  if (t.sm) {
1037
- const sm = t.sm;
1038
- result.metadata.socialMedia = {};
1039
- if (sm.tw) {
1040
- result.metadata.socialMedia.twitter = sm.tw;
1041
- }
1042
- if (sm.tg) {
1043
- result.metadata.socialMedia.telegram = sm.tg;
1044
- }
1045
- if (sm.w) {
1046
- result.metadata.socialMedia.website = sm.w;
1047
- }
1048
- if (sm.tt) {
1049
- result.metadata.socialMedia.tiktok = sm.tt;
1050
- }
1051
- if (sm.dc) {
1052
- result.metadata.socialMedia.discord = sm.dc;
1053
- }
1054
- if (sm.fb) {
1055
- result.metadata.socialMedia.facebook = sm.fb;
1056
- }
1057
- if (sm.gh) {
1058
- result.metadata.socialMedia.github = sm.gh;
1059
- }
1060
- if (sm.ig) {
1061
- result.metadata.socialMedia.instagram = sm.ig;
1062
- }
1063
- if (sm.li) {
1064
- result.metadata.socialMedia.linkedin = sm.li;
1065
- }
1066
- if (sm.md) {
1067
- result.metadata.socialMedia.medium = sm.md;
1068
- }
1069
- if (sm.rd) {
1070
- result.metadata.socialMedia.reddit = sm.rd;
1071
- }
1072
- if (sm.yt) {
1073
- result.metadata.socialMedia.youtube = sm.yt;
1074
- }
1075
- if (sm.bb) {
1076
- result.metadata.socialMedia.bitbucket = sm.bb;
1077
- }
1130
+ result.metadata.socialMedia = this.parseSocialMedia(t.sm);
1078
1131
  }
1079
1132
  }
1080
1133
  if (bc) {
@@ -2173,6 +2226,7 @@ __export(wallet_exports, {
2173
2226
  calculatePnl: () => calculatePnl,
2174
2227
  getBalanceUpdates: () => getBalanceUpdates,
2175
2228
  getNetWorth: () => getNetWorth,
2229
+ getNetWorthByTokens: () => getNetWorthByTokens,
2176
2230
  getNetWorthChart: () => getNetWorthChart,
2177
2231
  getNetWorthDetails: () => getNetWorthDetails,
2178
2232
  getNetWorthSummary: () => getNetWorthSummary,
@@ -2220,6 +2274,12 @@ var getNetWorth = (chain, walletAddress, params, options) => {
2220
2274
  options
2221
2275
  );
2222
2276
  };
2277
+ var getNetWorthByTokens = (chain, walletAddress, params, options) => {
2278
+ return chainstreamApiClient(
2279
+ { url: `/v1/wallet/${chain}/${walletAddress}/net-worth/tokens`, method: "GET", params },
2280
+ options
2281
+ );
2282
+ };
2223
2283
  var getTokensBalance = (chain, walletAddress, params, options) => {
2224
2284
  return chainstreamApiClient(
2225
2285
  { url: `/v1/wallet/${chain}/${walletAddress}/tokens-balance`, method: "GET", params },
@@ -2310,7 +2370,7 @@ var ChainStreamClient = class {
2310
2370
  __publicField(this, "jobs");
2311
2371
  __publicField(this, "kyt");
2312
2372
  __publicField(this, "endpoint");
2313
- const baseUrl = options.serverUrl ?? "https://api-dex.chainstream.io";
2373
+ const baseUrl = options.serverUrl ?? "https://api.chainstream.io";
2314
2374
  const streamUrl = options.streamUrl ?? "wss://realtime-dex.chainstream.io/connection/websocket";
2315
2375
  this.requestCtx = { baseUrl, streamUrl, accessToken };
2316
2376
  configure({