@covalenthq/client-sdk 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +60 -39
  2. package/dist/cjs/index.js +687 -80
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/services/BalanceService.d.ts +100 -0
  5. package/dist/cjs/services/CovalentClient.d.ts +1 -1
  6. package/dist/cjs/services/NftService.d.ts +137 -1
  7. package/dist/cjs/services/SecurityService.d.ts +62 -0
  8. package/dist/cjs/services/TransactionService.d.ts +17 -0
  9. package/dist/cjs/services/XykService.d.ts +4 -0
  10. package/dist/cjs/util/types/BalanceServiceTypes.d.ts +38 -0
  11. package/dist/cjs/util/types/NftServiceTypes.d.ts +76 -0
  12. package/dist/cjs/util/types/SecurityServiceTypes.d.ts +50 -0
  13. package/dist/cjs/util/types/TransactionServiceTypes.d.ts +10 -0
  14. package/dist/es/index.js +687 -80
  15. package/dist/es/index.js.map +1 -1
  16. package/dist/es/services/BalanceService.d.ts +100 -0
  17. package/dist/es/services/CovalentClient.d.ts +1 -1
  18. package/dist/es/services/NftService.d.ts +137 -1
  19. package/dist/es/services/SecurityService.d.ts +62 -0
  20. package/dist/es/services/TransactionService.d.ts +17 -0
  21. package/dist/es/services/XykService.d.ts +4 -0
  22. package/dist/es/util/types/BalanceServiceTypes.d.ts +38 -0
  23. package/dist/es/util/types/NftServiceTypes.d.ts +76 -0
  24. package/dist/es/util/types/SecurityServiceTypes.d.ts +50 -0
  25. package/dist/es/util/types/TransactionServiceTypes.d.ts +10 -0
  26. package/dist/esm/index.js +687 -80
  27. package/dist/esm/index.js.map +1 -1
  28. package/dist/esm/services/BalanceService.d.ts +100 -0
  29. package/dist/esm/services/CovalentClient.d.ts +1 -1
  30. package/dist/esm/services/NftService.d.ts +137 -1
  31. package/dist/esm/services/SecurityService.d.ts +62 -0
  32. package/dist/esm/services/TransactionService.d.ts +17 -0
  33. package/dist/esm/services/XykService.d.ts +4 -0
  34. package/dist/esm/util/types/BalanceServiceTypes.d.ts +38 -0
  35. package/dist/esm/util/types/NftServiceTypes.d.ts +76 -0
  36. package/dist/esm/util/types/SecurityServiceTypes.d.ts +50 -0
  37. package/dist/esm/util/types/TransactionServiceTypes.d.ts +10 -0
  38. package/dist/services/BalanceService.d.ts +100 -0
  39. package/dist/services/BalanceService.js +193 -6
  40. package/dist/services/BalanceService.js.map +1 -1
  41. package/dist/services/BaseService.js +12 -12
  42. package/dist/services/BaseService.js.map +1 -1
  43. package/dist/services/CovalentClient.d.ts +1 -1
  44. package/dist/services/CovalentClient.js +1 -1
  45. package/dist/services/NftService.d.ts +137 -1
  46. package/dist/services/NftService.js +294 -16
  47. package/dist/services/NftService.js.map +1 -1
  48. package/dist/services/PricingService.js +2 -2
  49. package/dist/services/PricingService.js.map +1 -1
  50. package/dist/services/SecurityService.d.ts +62 -0
  51. package/dist/services/SecurityService.js +103 -2
  52. package/dist/services/SecurityService.js.map +1 -1
  53. package/dist/services/TransactionService.d.ts +17 -0
  54. package/dist/services/TransactionService.js +23 -7
  55. package/dist/services/TransactionService.js.map +1 -1
  56. package/dist/services/XykService.d.ts +4 -0
  57. package/dist/services/XykService.js +34 -28
  58. package/dist/services/XykService.js.map +1 -1
  59. package/dist/util/ApiHelpers.js +1 -1
  60. package/dist/util/ApiHelpers.js.map +1 -1
  61. package/dist/util/types/BalanceServiceTypes.d.ts +38 -0
  62. package/dist/util/types/NftServiceTypes.d.ts +76 -0
  63. package/dist/util/types/SecurityServiceTypes.d.ts +50 -0
  64. package/dist/util/types/TransactionServiceTypes.d.ts +10 -0
  65. package/package.json +1 -1
package/dist/es/index.js CHANGED
@@ -277,7 +277,7 @@ async function* paginateEndpoint$1(url, apiKey, urlsParams, dataClassConstructor
277
277
  if (error.message.includes("An error occurred 429")) {
278
278
  throw new Error(error.message);
279
279
  }
280
- throw new Error(`An error occurred ${data ? data.error_code : response.status}: ${data ? data.error_message : "401 Authorization Required"}`);
280
+ throw new Error(`An error occurred ${data ? data.error_code : response.status}: ${data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"}`);
281
281
  }
282
282
  }
283
283
  }
@@ -327,6 +327,43 @@ class TokenSpenderItem {
327
327
  this.risk_factor = data.risk_factor;
328
328
  }
329
329
  }
330
+ class NftApprovalsResponse {
331
+ constructor(data) {
332
+ this.updated_at = data.updated_at && data.updated_at !== null ? parseISO(data.updated_at.toString()) : null;
333
+ this.chain_id = data.chain_id;
334
+ this.chain_name = data.chain_name;
335
+ this.address = data.address;
336
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new NftApprovalsItem(itemData)) : null;
337
+ }
338
+ }
339
+ class NftApprovalsItem {
340
+ constructor(data) {
341
+ this.contract_address = data.contract_address;
342
+ this.contract_address_label = data.contract_address_label;
343
+ this.contract_ticker_symbol = data.contract_ticker_symbol;
344
+ this.token_balances = data.token_balances && data.token_balances !== null ? data.token_balances.map((itemData) => new NftApprovalBalance(itemData)) : null;
345
+ this.spenders = data.spenders && data.spenders !== null ? data.spenders.map((itemData) => new NftApprovalSpender(itemData)) : null;
346
+ }
347
+ }
348
+ class NftApprovalBalance {
349
+ constructor(data) {
350
+ this.token_id = data.token_id && data.token_id !== null ? BigInt(data.token_id) : null;
351
+ this.token_balance = data.token_balance && data.token_balance !== null ? BigInt(data.token_balance) : null;
352
+ }
353
+ }
354
+ class NftApprovalSpender {
355
+ constructor(data) {
356
+ this.block_height = data.block_height;
357
+ this.tx_offset = data.tx_offset;
358
+ this.log_offset = data.log_offset;
359
+ this.block_signed_at = data.block_signed_at && data.block_signed_at !== null ? parseISO(data.block_signed_at.toString()) : null;
360
+ this.tx_hash = data.tx_hash;
361
+ this.spender_address = data.spender_address;
362
+ this.spender_address_label = data.spender_address_label;
363
+ this.token_ids_approved = data.token_ids_approved;
364
+ this.allowance = data.allowance;
365
+ }
366
+ }
330
367
  /**
331
368
  * Approvals API
332
369
  *
@@ -389,7 +426,7 @@ class SecurityService {
389
426
  data: dataClass,
390
427
  error: data.error,
391
428
  error_code: data ? data.error_code : response.status,
392
- error_message: data ? data.error_message : "401 Authorization Required"
429
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
393
430
  };
394
431
  }
395
432
  catch (error) {
@@ -398,7 +435,71 @@ class SecurityService {
398
435
  data: null,
399
436
  error: true,
400
437
  error_code: data ? data.error_code : response.status,
401
- error_message: data ? data.error_message : "401 Authorization Required"
438
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
439
+ };
440
+ }
441
+ }
442
+ }
443
+ /**
444
+ *
445
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
446
+ * @param {string} walletAddress - The requested address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
447
+
448
+ *
449
+ */
450
+ async getNftApprovals(chainName, walletAddress) {
451
+ let success = false;
452
+ let data;
453
+ let response;
454
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
455
+ while (!success) {
456
+ try {
457
+ const urlParams = new URLSearchParams();
458
+ let startTime;
459
+ if (this.debug) {
460
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
461
+ }
462
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft/approvals/${walletAddress}/?${urlParams}`, {
463
+ headers: {
464
+ "Authorization": `Bearer ${this.apiKey}`,
465
+ "X-Requested-With": userAgent
466
+ }
467
+ }));
468
+ debugOutput(response.url, response.status, startTime);
469
+ if (response.status === 429) {
470
+ try {
471
+ data = await this.LIMIT(() => backoff.backOff(response.url));
472
+ }
473
+ catch (error) {
474
+ success = true;
475
+ return {
476
+ data: null,
477
+ error: true,
478
+ error_code: response.status,
479
+ error_message: error.message
480
+ };
481
+ }
482
+ }
483
+ else {
484
+ data = await response.json();
485
+ }
486
+ const dataClass = new NftApprovalsResponse(data.data);
487
+ checkAndModifyResponse(dataClass);
488
+ success = true;
489
+ return {
490
+ data: dataClass,
491
+ error: data.error,
492
+ error_code: data ? data.error_code : response.status,
493
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
494
+ };
495
+ }
496
+ catch (error) {
497
+ success = true;
498
+ return {
499
+ data: null,
500
+ error: true,
501
+ error_code: data ? data.error_code : response.status,
502
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
402
503
  };
403
504
  }
404
505
  }
@@ -508,6 +609,17 @@ class OhlcItem {
508
609
  this.pretty_quote = data.pretty_quote;
509
610
  }
510
611
  }
612
+ class Erc20TransfersResponse {
613
+ constructor(data) {
614
+ this.address = data.address;
615
+ this.updated_at = data.updated_at && data.updated_at !== null ? parseISO(data.updated_at.toString()) : null;
616
+ this.quote_currency = data.quote_currency;
617
+ this.chain_id = data.chain_id;
618
+ this.chain_name = data.chain_name;
619
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new BlockTransactionWithContractTransfers(itemData)) : null;
620
+ this.pagination = data.pagination && data.pagination !== null ? new Pagination$2(data.pagination) : null;
621
+ }
622
+ }
511
623
  class BlockTransactionWithContractTransfers {
512
624
  constructor(data) {
513
625
  this.block_signed_at = data.block_signed_at && data.block_signed_at !== null ? parseISO(data.block_signed_at.toString()) : null;
@@ -532,6 +644,14 @@ class BlockTransactionWithContractTransfers {
532
644
  this.transfers = data.transfers && data.transfers !== null ? data.transfers.map((itemData) => new TokenTransferItem(itemData)) : null;
533
645
  }
534
646
  }
647
+ let Pagination$2 = class Pagination {
648
+ constructor(data) {
649
+ this.has_more = data.has_more;
650
+ this.page_number = data.page_number;
651
+ this.page_size = data.page_size;
652
+ this.total_count = data.total_count;
653
+ }
654
+ };
535
655
  class TokenTransferItem {
536
656
  constructor(data) {
537
657
  this.block_signed_at = data.block_signed_at && data.block_signed_at !== null ? parseISO(data.block_signed_at.toString()) : null;
@@ -606,6 +726,31 @@ class HistoricalBalanceItem {
606
726
  this.nft_data = data.nft_data && data.nft_data !== null ? data.nft_data.map((itemData) => new NftData$1(itemData)) : null;
607
727
  }
608
728
  }
729
+ class TokenBalanceNativeResponse {
730
+ constructor(data) {
731
+ this.address = data.address;
732
+ this.updated_at = data.updated_at && data.updated_at !== null ? parseISO(data.updated_at.toString()) : null;
733
+ this.quote_currency = data.quote_currency;
734
+ this.chain_id = data.chain_id;
735
+ this.chain_name = data.chain_name;
736
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new NativeBalanceItem(itemData)) : null;
737
+ }
738
+ }
739
+ class NativeBalanceItem {
740
+ constructor(data) {
741
+ this.contract_decimals = data.contract_decimals;
742
+ this.contract_name = data.contract_name;
743
+ this.contract_ticker_symbol = data.contract_ticker_symbol;
744
+ this.contract_address = data.contract_address;
745
+ this.supports_erc = data.supports_erc;
746
+ this.logo_url = data.logo_url;
747
+ this.block_height = data.block_height;
748
+ this.balance = data.balance && data.balance !== null ? BigInt(data.balance) : null;
749
+ this.quote_rate = data.quote_rate;
750
+ this.quote = data.quote;
751
+ this.pretty_quote = data.pretty_quote;
752
+ }
753
+ }
609
754
  /**
610
755
  * Balances APIs
611
756
  *
@@ -689,7 +834,7 @@ class BalanceService {
689
834
  data: dataClass,
690
835
  error: data.error,
691
836
  error_code: data ? data.error_code : response.status,
692
- error_message: data ? data.error_message : "401 Authorization Required"
837
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
693
838
  };
694
839
  }
695
840
  catch (error) {
@@ -698,7 +843,7 @@ class BalanceService {
698
843
  data: null,
699
844
  error: true,
700
845
  error_code: data ? data.error_code : response.status,
701
- error_message: data ? data.error_message : "401 Authorization Required"
846
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
702
847
  };
703
848
  }
704
849
  }
@@ -763,7 +908,7 @@ class BalanceService {
763
908
  data: dataClass,
764
909
  error: data.error,
765
910
  error_code: data ? data.error_code : response.status,
766
- error_message: data ? data.error_message : "401 Authorization Required"
911
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
767
912
  };
768
913
  }
769
914
  catch (error) {
@@ -772,7 +917,7 @@ class BalanceService {
772
917
  data: null,
773
918
  error: true,
774
919
  error_code: data ? data.error_code : response.status,
775
- error_message: data ? data.error_message : "401 Authorization Required"
920
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
776
921
  };
777
922
  }
778
923
  }
@@ -827,6 +972,96 @@ class BalanceService {
827
972
  }
828
973
  }
829
974
  }
975
+ /**
976
+ *
977
+ * Commonly used to render the transfer-in and transfer-out of a token along with historical prices from an address.
978
+ *
979
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
980
+ * @param {string} walletAddress - The requested address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
981
+ * @param {GetErc20TransfersForWalletAddressQueryParamOpts} queryParamOpts
982
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
983
+ * - `contractAddress`: The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
984
+ * - `startingBlock`: The block height to start from, defaults to `0`.
985
+ * - `endingBlock`: The block height to end at, defaults to current block height.
986
+ * - `pageSize`: Number of items per page. Omitting this parameter defaults to 100.
987
+ * - `pageNumber`: 0-indexed page number to begin pagination.
988
+ *
989
+ */
990
+ async getErc20TransfersForWalletAddressByPage(chainName, walletAddress, queryParamOpts) {
991
+ let success = false;
992
+ let data;
993
+ let response;
994
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
995
+ while (!success) {
996
+ try {
997
+ const urlParams = new URLSearchParams();
998
+ if (queryParamOpts?.quoteCurrency !== undefined) {
999
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
1000
+ }
1001
+ if (queryParamOpts?.contractAddress !== undefined) {
1002
+ urlParams.append("contract-address", queryParamOpts?.contractAddress.toString());
1003
+ }
1004
+ if (queryParamOpts?.startingBlock !== undefined) {
1005
+ urlParams.append("starting-block", queryParamOpts?.startingBlock.toString());
1006
+ }
1007
+ if (queryParamOpts?.endingBlock !== undefined) {
1008
+ urlParams.append("ending-block", queryParamOpts?.endingBlock.toString());
1009
+ }
1010
+ if (queryParamOpts?.pageSize !== undefined) {
1011
+ urlParams.append("page-size", queryParamOpts?.pageSize.toString());
1012
+ }
1013
+ if (queryParamOpts?.pageNumber !== undefined) {
1014
+ urlParams.append("page-number", queryParamOpts?.pageNumber.toString());
1015
+ }
1016
+ let startTime;
1017
+ if (this.debug) {
1018
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
1019
+ }
1020
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/transfers_v2/?${urlParams}`, {
1021
+ headers: {
1022
+ "Authorization": `Bearer ${this.apiKey}`,
1023
+ "X-Requested-With": userAgent
1024
+ }
1025
+ }));
1026
+ debugOutput(response.url, response.status, startTime);
1027
+ if (response.status === 429) {
1028
+ try {
1029
+ data = await this.LIMIT(() => backoff.backOff(response.url));
1030
+ }
1031
+ catch (error) {
1032
+ success = true;
1033
+ return {
1034
+ data: null,
1035
+ error: true,
1036
+ error_code: response.status,
1037
+ error_message: error.message
1038
+ };
1039
+ }
1040
+ }
1041
+ else {
1042
+ data = await response.json();
1043
+ }
1044
+ const dataClass = new Erc20TransfersResponse(data.data);
1045
+ checkAndModifyResponse(dataClass);
1046
+ success = true;
1047
+ return {
1048
+ data: dataClass,
1049
+ error: data.error,
1050
+ error_code: data ? data.error_code : response.status,
1051
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1052
+ };
1053
+ }
1054
+ catch (error) {
1055
+ success = true;
1056
+ return {
1057
+ data: null,
1058
+ error: true,
1059
+ error_code: data ? data.error_code : response.status,
1060
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1061
+ };
1062
+ }
1063
+ }
1064
+ }
830
1065
  /**
831
1066
  *
832
1067
  * Commonly used to get a list of all the token holders for a specified ERC20 or ERC721 token. Returns historic token holders when block-height is set (defaults to `latest`). Useful for building pie charts of token holders.
@@ -907,14 +1142,86 @@ class BalanceService {
907
1142
  if (queryParamOpts?.blockHeight !== undefined) {
908
1143
  urlParams.append("block-height", queryParamOpts?.blockHeight.toString());
909
1144
  }
910
- if (queryParamOpts?.date !== undefined) {
911
- urlParams.append("date", queryParamOpts?.date.toString());
912
- }
1145
+ if (queryParamOpts?.date !== undefined) {
1146
+ urlParams.append("date", queryParamOpts?.date.toString());
1147
+ }
1148
+ let startTime;
1149
+ if (this.debug) {
1150
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
1151
+ }
1152
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/historical_balances/?${urlParams}`, {
1153
+ headers: {
1154
+ "Authorization": `Bearer ${this.apiKey}`,
1155
+ "X-Requested-With": userAgent
1156
+ }
1157
+ }));
1158
+ debugOutput(response.url, response.status, startTime);
1159
+ if (response.status === 429) {
1160
+ try {
1161
+ data = await this.LIMIT(() => backoff.backOff(response.url));
1162
+ }
1163
+ catch (error) {
1164
+ success = true;
1165
+ return {
1166
+ data: null,
1167
+ error: true,
1168
+ error_code: response.status,
1169
+ error_message: error.message
1170
+ };
1171
+ }
1172
+ }
1173
+ else {
1174
+ data = await response.json();
1175
+ }
1176
+ const dataClass = new HistoricalBalancesResponse(data.data);
1177
+ checkAndModifyResponse(dataClass);
1178
+ success = true;
1179
+ return {
1180
+ data: dataClass,
1181
+ error: data.error,
1182
+ error_code: data ? data.error_code : response.status,
1183
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1184
+ };
1185
+ }
1186
+ catch (error) {
1187
+ success = true;
1188
+ return {
1189
+ data: null,
1190
+ error: true,
1191
+ error_code: data ? data.error_code : response.status,
1192
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1193
+ };
1194
+ }
1195
+ }
1196
+ }
1197
+ /**
1198
+ *
1199
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
1200
+ * @param {string} walletAddress - The requested address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
1201
+ * @param {GetNativeTokenBalanceQueryParamOpts} queryParamOpts
1202
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
1203
+ * - `blockHeight`: Ending block to define a block range. Omitting this parameter defaults to the latest block height.
1204
+ *
1205
+ */
1206
+ async getNativeTokenBalance(chainName, walletAddress, queryParamOpts) {
1207
+ let success = false;
1208
+ let data;
1209
+ let response;
1210
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
1211
+ while (!success) {
1212
+ try {
1213
+ const urlParams = new URLSearchParams();
1214
+ if (queryParamOpts?.quoteCurrency !== undefined) {
1215
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
1216
+ }
1217
+ if (queryParamOpts?.blockHeight !== undefined) {
1218
+ urlParams.append("block-height", queryParamOpts?.blockHeight.toString());
1219
+ }
913
1220
  let startTime;
914
1221
  if (this.debug) {
915
1222
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
916
1223
  }
917
- response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/historical_balances/?${urlParams}`, {
1224
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/balances_native/?${urlParams}`, {
918
1225
  headers: {
919
1226
  "Authorization": `Bearer ${this.apiKey}`,
920
1227
  "X-Requested-With": userAgent
@@ -938,14 +1245,14 @@ class BalanceService {
938
1245
  else {
939
1246
  data = await response.json();
940
1247
  }
941
- const dataClass = new HistoricalBalancesResponse(data.data);
1248
+ const dataClass = new TokenBalanceNativeResponse(data.data);
942
1249
  checkAndModifyResponse(dataClass);
943
1250
  success = true;
944
1251
  return {
945
1252
  data: dataClass,
946
1253
  error: data.error,
947
1254
  error_code: data ? data.error_code : response.status,
948
- error_message: data ? data.error_message : "401 Authorization Required"
1255
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
949
1256
  };
950
1257
  }
951
1258
  catch (error) {
@@ -954,7 +1261,7 @@ class BalanceService {
954
1261
  data: null,
955
1262
  error: true,
956
1263
  error_code: data ? data.error_code : response.status,
957
- error_message: data ? data.error_message : "401 Authorization Required"
1264
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
958
1265
  };
959
1266
  }
960
1267
  }
@@ -1166,7 +1473,7 @@ class BaseService {
1166
1473
  data: dataClass,
1167
1474
  error: data.error,
1168
1475
  error_code: data ? data.error_code : response.status,
1169
- error_message: data ? data.error_message : "401 Authorization Required"
1476
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1170
1477
  };
1171
1478
  }
1172
1479
  catch (error) {
@@ -1175,7 +1482,7 @@ class BaseService {
1175
1482
  data: null,
1176
1483
  error: true,
1177
1484
  error_code: data ? data.error_code : response.status,
1178
- error_message: data ? data.error_message : "401 Authorization Required"
1485
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1179
1486
  };
1180
1487
  }
1181
1488
  }
@@ -1231,7 +1538,7 @@ class BaseService {
1231
1538
  data: dataClass,
1232
1539
  error: data.error,
1233
1540
  error_code: data ? data.error_code : response.status,
1234
- error_message: data ? data.error_message : "401 Authorization Required"
1541
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1235
1542
  };
1236
1543
  }
1237
1544
  catch (error) {
@@ -1240,7 +1547,7 @@ class BaseService {
1240
1547
  data: null,
1241
1548
  error: true,
1242
1549
  error_code: data ? data.error_code : response.status,
1243
- error_message: data ? data.error_message : "401 Authorization Required"
1550
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1244
1551
  };
1245
1552
  }
1246
1553
  }
@@ -1355,7 +1662,7 @@ class BaseService {
1355
1662
  data: dataClass,
1356
1663
  error: data.error,
1357
1664
  error_code: data ? data.error_code : response.status,
1358
- error_message: data ? data.error_message : "401 Authorization Required"
1665
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1359
1666
  };
1360
1667
  }
1361
1668
  catch (error) {
@@ -1364,7 +1671,7 @@ class BaseService {
1364
1671
  data: null,
1365
1672
  error: true,
1366
1673
  error_code: data ? data.error_code : response.status,
1367
- error_message: data ? data.error_message : "401 Authorization Required"
1674
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1368
1675
  };
1369
1676
  }
1370
1677
  }
@@ -1506,7 +1813,7 @@ class BaseService {
1506
1813
  data: dataClass,
1507
1814
  error: data.error,
1508
1815
  error_code: data ? data.error_code : response.status,
1509
- error_message: data ? data.error_message : "401 Authorization Required"
1816
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1510
1817
  };
1511
1818
  }
1512
1819
  catch (error) {
@@ -1515,7 +1822,7 @@ class BaseService {
1515
1822
  data: null,
1516
1823
  error: true,
1517
1824
  error_code: data ? data.error_code : response.status,
1518
- error_message: data ? data.error_message : "401 Authorization Required"
1825
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1519
1826
  };
1520
1827
  }
1521
1828
  }
@@ -1569,7 +1876,7 @@ class BaseService {
1569
1876
  data: dataClass,
1570
1877
  error: data.error,
1571
1878
  error_code: data ? data.error_code : response.status,
1572
- error_message: data ? data.error_message : "401 Authorization Required"
1879
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1573
1880
  };
1574
1881
  }
1575
1882
  catch (error) {
@@ -1578,7 +1885,7 @@ class BaseService {
1578
1885
  data: null,
1579
1886
  error: true,
1580
1887
  error_code: data ? data.error_code : response.status,
1581
- error_message: data ? data.error_message : "401 Authorization Required"
1888
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1582
1889
  };
1583
1890
  }
1584
1891
  }
@@ -1638,7 +1945,7 @@ class BaseService {
1638
1945
  data: dataClass,
1639
1946
  error: data.error,
1640
1947
  error_code: data ? data.error_code : response.status,
1641
- error_message: data ? data.error_message : "401 Authorization Required"
1948
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1642
1949
  };
1643
1950
  }
1644
1951
  catch (error) {
@@ -1647,7 +1954,7 @@ class BaseService {
1647
1954
  data: null,
1648
1955
  error: true,
1649
1956
  error_code: data ? data.error_code : response.status,
1650
- error_message: data ? data.error_message : "401 Authorization Required"
1957
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1651
1958
  };
1652
1959
  }
1653
1960
  }
@@ -1903,6 +2210,62 @@ class NftOwnershipForCollectionItem {
1903
2210
  this.nft_data = data.nft_data && data.nft_data !== null ? new NftData(data.nft_data) : null;
1904
2211
  }
1905
2212
  }
2213
+ class NftMarketSaleCountResponse {
2214
+ constructor(data) {
2215
+ this.updated_at = data.updated_at && data.updated_at !== null ? parseISO(data.updated_at.toString()) : null;
2216
+ this.address = data.address;
2217
+ this.quote_currency = data.quote_currency;
2218
+ this.chain_name = data.chain_name;
2219
+ this.chain_id = data.chain_id;
2220
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new MarketSaleCountItem(itemData)) : null;
2221
+ }
2222
+ }
2223
+ class MarketSaleCountItem {
2224
+ constructor(data) {
2225
+ this.date = data.date && data.date !== null ? parseISO(data.date.toString()) : null;
2226
+ this.sale_count = data.sale_count;
2227
+ }
2228
+ }
2229
+ class NftMarketVolumeResponse {
2230
+ constructor(data) {
2231
+ this.updated_at = data.updated_at && data.updated_at !== null ? parseISO(data.updated_at.toString()) : null;
2232
+ this.address = data.address;
2233
+ this.quote_currency = data.quote_currency;
2234
+ this.chain_name = data.chain_name;
2235
+ this.chain_id = data.chain_id;
2236
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new MarketVolumeItem(itemData)) : null;
2237
+ }
2238
+ }
2239
+ class MarketVolumeItem {
2240
+ constructor(data) {
2241
+ this.date = data.date && data.date !== null ? parseISO(data.date.toString()) : null;
2242
+ this.native_ticker_symbol = data.native_ticker_symbol;
2243
+ this.native_name = data.native_name;
2244
+ this.volume_quote = data.volume_quote;
2245
+ this.volume_native_quote = data.volume_native_quote;
2246
+ this.pretty_volume_quote = data.pretty_volume_quote;
2247
+ }
2248
+ }
2249
+ class NftMarketFloorPriceResponse {
2250
+ constructor(data) {
2251
+ this.updated_at = data.updated_at && data.updated_at !== null ? parseISO(data.updated_at.toString()) : null;
2252
+ this.address = data.address;
2253
+ this.quote_currency = data.quote_currency;
2254
+ this.chain_name = data.chain_name;
2255
+ this.chain_id = data.chain_id;
2256
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new MarketFloorPriceItem(itemData)) : null;
2257
+ }
2258
+ }
2259
+ class MarketFloorPriceItem {
2260
+ constructor(data) {
2261
+ this.date = data.date && data.date !== null ? parseISO(data.date.toString()) : null;
2262
+ this.native_ticker_symbol = data.native_ticker_symbol;
2263
+ this.native_name = data.native_name;
2264
+ this.floor_price_native_quote = data.floor_price_native_quote;
2265
+ this.floor_price_quote = data.floor_price_quote;
2266
+ this.pretty_floor_price_quote = data.pretty_floor_price_quote;
2267
+ }
2268
+ }
1906
2269
  /**
1907
2270
  * NFT APIs
1908
2271
  *
@@ -2015,7 +2378,7 @@ class NftService {
2015
2378
  data: dataClass,
2016
2379
  error: data.error,
2017
2380
  error_code: data ? data.error_code : response.status,
2018
- error_message: data ? data.error_message : "401 Authorization Required"
2381
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2019
2382
  };
2020
2383
  }
2021
2384
  catch (error) {
@@ -2024,7 +2387,7 @@ class NftService {
2024
2387
  data: null,
2025
2388
  error: true,
2026
2389
  error_code: data ? data.error_code : response.status,
2027
- error_message: data ? data.error_message : "401 Authorization Required"
2390
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2028
2391
  };
2029
2392
  }
2030
2393
  }
@@ -2140,7 +2503,7 @@ class NftService {
2140
2503
  data: dataClass,
2141
2504
  error: data.error,
2142
2505
  error_code: data ? data.error_code : response.status,
2143
- error_message: data ? data.error_message : "401 Authorization Required"
2506
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2144
2507
  };
2145
2508
  }
2146
2509
  catch (error) {
@@ -2149,7 +2512,7 @@ class NftService {
2149
2512
  data: null,
2150
2513
  error: true,
2151
2514
  error_code: data ? data.error_code : response.status,
2152
- error_message: data ? data.error_message : "401 Authorization Required"
2515
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2153
2516
  };
2154
2517
  }
2155
2518
  }
@@ -2211,7 +2574,7 @@ class NftService {
2211
2574
  data: dataClass,
2212
2575
  error: data.error,
2213
2576
  error_code: data ? data.error_code : response.status,
2214
- error_message: data ? data.error_message : "401 Authorization Required"
2577
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2215
2578
  };
2216
2579
  }
2217
2580
  catch (error) {
@@ -2220,7 +2583,7 @@ class NftService {
2220
2583
  data: null,
2221
2584
  error: true,
2222
2585
  error_code: data ? data.error_code : response.status,
2223
- error_message: data ? data.error_message : "401 Authorization Required"
2586
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2224
2587
  };
2225
2588
  }
2226
2589
  }
@@ -2276,7 +2639,7 @@ class NftService {
2276
2639
  data: dataClass,
2277
2640
  error: data.error,
2278
2641
  error_code: data ? data.error_code : response.status,
2279
- error_message: data ? data.error_message : "401 Authorization Required"
2642
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2280
2643
  };
2281
2644
  }
2282
2645
  catch (error) {
@@ -2285,7 +2648,7 @@ class NftService {
2285
2648
  data: null,
2286
2649
  error: true,
2287
2650
  error_code: data ? data.error_code : response.status,
2288
- error_message: data ? data.error_message : "401 Authorization Required"
2651
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2289
2652
  };
2290
2653
  }
2291
2654
  }
@@ -2342,7 +2705,7 @@ class NftService {
2342
2705
  data: dataClass,
2343
2706
  error: data.error,
2344
2707
  error_code: data ? data.error_code : response.status,
2345
- error_message: data ? data.error_message : "401 Authorization Required"
2708
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2346
2709
  };
2347
2710
  }
2348
2711
  catch (error) {
@@ -2351,7 +2714,7 @@ class NftService {
2351
2714
  data: null,
2352
2715
  error: true,
2353
2716
  error_code: data ? data.error_code : response.status,
2354
- error_message: data ? data.error_message : "401 Authorization Required"
2717
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2355
2718
  };
2356
2719
  }
2357
2720
  }
@@ -2407,7 +2770,7 @@ class NftService {
2407
2770
  data: dataClass,
2408
2771
  error: data.error,
2409
2772
  error_code: data ? data.error_code : response.status,
2410
- error_message: data ? data.error_message : "401 Authorization Required"
2773
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2411
2774
  };
2412
2775
  }
2413
2776
  catch (error) {
@@ -2416,7 +2779,7 @@ class NftService {
2416
2779
  data: null,
2417
2780
  error: true,
2418
2781
  error_code: data ? data.error_code : response.status,
2419
- error_message: data ? data.error_message : "401 Authorization Required"
2782
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2420
2783
  };
2421
2784
  }
2422
2785
  }
@@ -2473,7 +2836,7 @@ class NftService {
2473
2836
  data: dataClass,
2474
2837
  error: data.error,
2475
2838
  error_code: data ? data.error_code : response.status,
2476
- error_message: data ? data.error_message : "401 Authorization Required"
2839
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2477
2840
  };
2478
2841
  }
2479
2842
  catch (error) {
@@ -2482,7 +2845,7 @@ class NftService {
2482
2845
  data: null,
2483
2846
  error: true,
2484
2847
  error_code: data ? data.error_code : response.status,
2485
- error_message: data ? data.error_message : "401 Authorization Required"
2848
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2486
2849
  };
2487
2850
  }
2488
2851
  }
@@ -2540,7 +2903,229 @@ class NftService {
2540
2903
  data: dataClass,
2541
2904
  error: data.error,
2542
2905
  error_code: data ? data.error_code : response.status,
2543
- error_message: data ? data.error_message : "401 Authorization Required"
2906
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2907
+ };
2908
+ }
2909
+ catch (error) {
2910
+ success = true;
2911
+ return {
2912
+ data: null,
2913
+ error: true,
2914
+ error_code: data ? data.error_code : response.status,
2915
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2916
+ };
2917
+ }
2918
+ }
2919
+ }
2920
+ /**
2921
+ *
2922
+ * Commonly used to build a time-series chart of the sales count of an NFT collection.
2923
+ *
2924
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
2925
+ * @param {string} contractAddress - The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
2926
+ * @param {GetNftMarketSaleCountQueryParamOpts} queryParamOpts
2927
+ * - `days`: The number of days to return data for. Request up 365 days. Defaults to 30 days.
2928
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
2929
+ *
2930
+ */
2931
+ async getNftMarketSaleCount(chainName, contractAddress, queryParamOpts) {
2932
+ let success = false;
2933
+ let data;
2934
+ let response;
2935
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
2936
+ while (!success) {
2937
+ try {
2938
+ const urlParams = new URLSearchParams();
2939
+ if (queryParamOpts?.days !== undefined) {
2940
+ urlParams.append("days", queryParamOpts?.days.toString());
2941
+ }
2942
+ if (queryParamOpts?.quoteCurrency !== undefined) {
2943
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
2944
+ }
2945
+ let startTime;
2946
+ if (this.debug) {
2947
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
2948
+ }
2949
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft_market/${contractAddress}/sale_count/?${urlParams}`, {
2950
+ headers: {
2951
+ "Authorization": `Bearer ${this.apiKey}`,
2952
+ "X-Requested-With": userAgent
2953
+ }
2954
+ }));
2955
+ debugOutput(response.url, response.status, startTime);
2956
+ if (response.status === 429) {
2957
+ try {
2958
+ data = await this.LIMIT(() => backoff.backOff(response.url));
2959
+ }
2960
+ catch (error) {
2961
+ success = true;
2962
+ return {
2963
+ data: null,
2964
+ error: true,
2965
+ error_code: response.status,
2966
+ error_message: error.message
2967
+ };
2968
+ }
2969
+ }
2970
+ else {
2971
+ data = await response.json();
2972
+ }
2973
+ const dataClass = new NftMarketSaleCountResponse(data.data);
2974
+ checkAndModifyResponse(dataClass);
2975
+ success = true;
2976
+ return {
2977
+ data: dataClass,
2978
+ error: data.error,
2979
+ error_code: data ? data.error_code : response.status,
2980
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2981
+ };
2982
+ }
2983
+ catch (error) {
2984
+ success = true;
2985
+ return {
2986
+ data: null,
2987
+ error: true,
2988
+ error_code: data ? data.error_code : response.status,
2989
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2990
+ };
2991
+ }
2992
+ }
2993
+ }
2994
+ /**
2995
+ *
2996
+ * Commonly used to build a time-series chart of the transaction volume of an NFT collection.
2997
+ *
2998
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
2999
+ * @param {string} contractAddress - The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
3000
+ * @param {GetNftMarketVolumeQueryParamOpts} queryParamOpts
3001
+ * - `days`: The number of days to return data for. Request up 365 days. Defaults to 30 days.
3002
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
3003
+ *
3004
+ */
3005
+ async getNftMarketVolume(chainName, contractAddress, queryParamOpts) {
3006
+ let success = false;
3007
+ let data;
3008
+ let response;
3009
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
3010
+ while (!success) {
3011
+ try {
3012
+ const urlParams = new URLSearchParams();
3013
+ if (queryParamOpts?.days !== undefined) {
3014
+ urlParams.append("days", queryParamOpts?.days.toString());
3015
+ }
3016
+ if (queryParamOpts?.quoteCurrency !== undefined) {
3017
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
3018
+ }
3019
+ let startTime;
3020
+ if (this.debug) {
3021
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
3022
+ }
3023
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft_market/${contractAddress}/volume/?${urlParams}`, {
3024
+ headers: {
3025
+ "Authorization": `Bearer ${this.apiKey}`,
3026
+ "X-Requested-With": userAgent
3027
+ }
3028
+ }));
3029
+ debugOutput(response.url, response.status, startTime);
3030
+ if (response.status === 429) {
3031
+ try {
3032
+ data = await this.LIMIT(() => backoff.backOff(response.url));
3033
+ }
3034
+ catch (error) {
3035
+ success = true;
3036
+ return {
3037
+ data: null,
3038
+ error: true,
3039
+ error_code: response.status,
3040
+ error_message: error.message
3041
+ };
3042
+ }
3043
+ }
3044
+ else {
3045
+ data = await response.json();
3046
+ }
3047
+ const dataClass = new NftMarketVolumeResponse(data.data);
3048
+ checkAndModifyResponse(dataClass);
3049
+ success = true;
3050
+ return {
3051
+ data: dataClass,
3052
+ error: data.error,
3053
+ error_code: data ? data.error_code : response.status,
3054
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3055
+ };
3056
+ }
3057
+ catch (error) {
3058
+ success = true;
3059
+ return {
3060
+ data: null,
3061
+ error: true,
3062
+ error_code: data ? data.error_code : response.status,
3063
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3064
+ };
3065
+ }
3066
+ }
3067
+ }
3068
+ /**
3069
+ *
3070
+ * Commonly used to render a price floor chart for an NFT collection.
3071
+ *
3072
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
3073
+ * @param {string} contractAddress - The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
3074
+ * @param {GetNftMarketFloorPriceQueryParamOpts} queryParamOpts
3075
+ * - `days`: The number of days to return data for. Request up 365 days. Defaults to 30 days.
3076
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
3077
+ *
3078
+ */
3079
+ async getNftMarketFloorPrice(chainName, contractAddress, queryParamOpts) {
3080
+ let success = false;
3081
+ let data;
3082
+ let response;
3083
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
3084
+ while (!success) {
3085
+ try {
3086
+ const urlParams = new URLSearchParams();
3087
+ if (queryParamOpts?.days !== undefined) {
3088
+ urlParams.append("days", queryParamOpts?.days.toString());
3089
+ }
3090
+ if (queryParamOpts?.quoteCurrency !== undefined) {
3091
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
3092
+ }
3093
+ let startTime;
3094
+ if (this.debug) {
3095
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
3096
+ }
3097
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft_market/${contractAddress}/floor_price/?${urlParams}`, {
3098
+ headers: {
3099
+ "Authorization": `Bearer ${this.apiKey}`,
3100
+ "X-Requested-With": userAgent
3101
+ }
3102
+ }));
3103
+ debugOutput(response.url, response.status, startTime);
3104
+ if (response.status === 429) {
3105
+ try {
3106
+ data = await this.LIMIT(() => backoff.backOff(response.url));
3107
+ }
3108
+ catch (error) {
3109
+ success = true;
3110
+ return {
3111
+ data: null,
3112
+ error: true,
3113
+ error_code: response.status,
3114
+ error_message: error.message
3115
+ };
3116
+ }
3117
+ }
3118
+ else {
3119
+ data = await response.json();
3120
+ }
3121
+ const dataClass = new NftMarketFloorPriceResponse(data.data);
3122
+ checkAndModifyResponse(dataClass);
3123
+ success = true;
3124
+ return {
3125
+ data: dataClass,
3126
+ error: data.error,
3127
+ error_code: data ? data.error_code : response.status,
3128
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2544
3129
  };
2545
3130
  }
2546
3131
  catch (error) {
@@ -2549,7 +3134,7 @@ class NftService {
2549
3134
  data: null,
2550
3135
  error: true,
2551
3136
  error_code: data ? data.error_code : response.status,
2552
- error_message: data ? data.error_message : "401 Authorization Required"
3137
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2553
3138
  };
2554
3139
  }
2555
3140
  }
@@ -2664,7 +3249,7 @@ class PricingService {
2664
3249
  data: res,
2665
3250
  error: data.error,
2666
3251
  error_code: data ? data.error_code : response.status,
2667
- error_message: data ? data.error_message : "401 Authorization Required"
3252
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2668
3253
  };
2669
3254
  }
2670
3255
  catch (error) {
@@ -2673,7 +3258,7 @@ class PricingService {
2673
3258
  data: null,
2674
3259
  error: true,
2675
3260
  error_code: data ? data.error_code : response.status,
2676
- error_message: data ? data.error_message : "401 Authorization Required"
3261
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2677
3262
  };
2678
3263
  }
2679
3264
  }
@@ -2716,6 +3301,7 @@ class Transaction {
2716
3301
  this.nft_sale_details = data.nft_sale_details && data.nft_sale_details !== null ? new NftSalesReport(data.nft_sale_details) : null;
2717
3302
  this.lending_details = data.lending_details && data.lending_details !== null ? new LendingReport(data.lending_details) : null;
2718
3303
  this.log_events = data.log_events && data.log_events !== null ? data.log_events.map((itemData) => new LogEvent(itemData)) : null;
3304
+ this.safe_details = data.safe_details && data.safe_details !== null ? data.safe_details.map((itemData) => new SafeDetails(itemData)) : null;
2719
3305
  }
2720
3306
  }
2721
3307
  class ContractMetadata {
@@ -2862,6 +3448,13 @@ class LogEvent {
2862
3448
  this.decoded = data.decoded && data.decoded !== null ? new DecodedItem(data.decoded) : null;
2863
3449
  }
2864
3450
  }
3451
+ class SafeDetails {
3452
+ constructor(data) {
3453
+ this.owner_address = data.owner_address;
3454
+ this.signature = data.signature;
3455
+ this.signature_type = data.signature_type;
3456
+ }
3457
+ }
2865
3458
  class DecodedItem {
2866
3459
  constructor(data) {
2867
3460
  this.name = data.name;
@@ -2965,7 +3558,7 @@ async function* paginateEndpoint(url, apiKey, urlsParams, debug, threadCount) {
2965
3558
  if (error.message.includes("An error occurred 429")) {
2966
3559
  throw new Error(error.message);
2967
3560
  }
2968
- throw new Error(`An error occurred ${data ? data.error_code : response.status}: ${data ? data.error_message : "401 Authorization Required"}`);
3561
+ throw new Error(`An error occurred ${data ? data.error_code : response.status}: ${data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"}`);
2969
3562
  }
2970
3563
  }
2971
3564
  }
@@ -2988,6 +3581,7 @@ class TransactionService {
2988
3581
  * - `withDex`: Decoded DEX details including protocol (e.g. Uniswap), event (e.g 'add_liquidity') and tokens involved with historical prices. Additional 0.05 credits charged if data available.
2989
3582
  * - `withNftSales`: Decoded NFT sales details including marketplace (e.g. Opensea) and cached media links. Additional 0.05 credits charged if data available.
2990
3583
  * - `withLending`: Decoded lending details including protocol (e.g. Aave), event (e.g. 'deposit') and tokens involved with prices. Additional 0.05 credits charged if data available.
3584
+ * - `withSafe`: Include safe details.
2991
3585
  *
2992
3586
  */
2993
3587
  async getTransaction(chainName, txHash, queryParamOpts) {
@@ -3013,6 +3607,9 @@ class TransactionService {
3013
3607
  if (queryParamOpts?.withLending !== undefined) {
3014
3608
  urlParams.append("with-lending", queryParamOpts?.withLending.toString());
3015
3609
  }
3610
+ if (queryParamOpts?.withSafe !== undefined) {
3611
+ urlParams.append("with-safe", queryParamOpts?.withSafe.toString());
3612
+ }
3016
3613
  let startTime;
3017
3614
  if (this.debug) {
3018
3615
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
@@ -3048,7 +3645,7 @@ class TransactionService {
3048
3645
  data: dataClass,
3049
3646
  error: data.error,
3050
3647
  error_code: data ? data.error_code : response.status,
3051
- error_message: data ? data.error_message : "401 Authorization Required"
3648
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3052
3649
  };
3053
3650
  }
3054
3651
  catch (error) {
@@ -3057,7 +3654,7 @@ class TransactionService {
3057
3654
  data: null,
3058
3655
  error: true,
3059
3656
  error_code: data ? data.error_code : response.status,
3060
- error_message: data ? data.error_message : "401 Authorization Required"
3657
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3061
3658
  };
3062
3659
  }
3063
3660
  }
@@ -3072,6 +3669,7 @@ class TransactionService {
3072
3669
  * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
3073
3670
  * - `noLogs`: Omit log events.
3074
3671
  * - `blockSignedAtAsc`: Sort the transactions in ascending chronological order. By default, it's set to `false` and returns transactions in descending chronological order.
3672
+ * - `withSafe`: Include safe details.
3075
3673
  *
3076
3674
  */
3077
3675
  async *getAllTransactionsForAddress(chainName, walletAddress, queryParamOpts) {
@@ -3089,6 +3687,9 @@ class TransactionService {
3089
3687
  if (queryParamOpts?.blockSignedAtAsc !== undefined) {
3090
3688
  urlParams.append("block-signed-at-asc", queryParamOpts?.blockSignedAtAsc.toString());
3091
3689
  }
3690
+ if (queryParamOpts?.withSafe !== undefined) {
3691
+ urlParams.append("with-safe", queryParamOpts?.withSafe.toString());
3692
+ }
3092
3693
  for await (tx of paginateEndpoint(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/transactions_v3/`, this.apiKey, urlParams, this.debug, this.threadCount)) {
3093
3694
  yield tx;
3094
3695
  }
@@ -3160,7 +3761,7 @@ class TransactionService {
3160
3761
  data: dataClass,
3161
3762
  error: data.error,
3162
3763
  error_code: data ? data.error_code : response.status,
3163
- error_message: data ? data.error_message : "401 Authorization Required"
3764
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3164
3765
  };
3165
3766
  }
3166
3767
  catch (error) {
@@ -3169,7 +3770,7 @@ class TransactionService {
3169
3770
  data: null,
3170
3771
  error: true,
3171
3772
  error_code: data ? data.error_code : response.status,
3172
- error_message: data ? data.error_message : "401 Authorization Required"
3773
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3173
3774
  };
3174
3775
  }
3175
3776
  }
@@ -3225,7 +3826,7 @@ class TransactionService {
3225
3826
  data: dataClass,
3226
3827
  error: data.error,
3227
3828
  error_code: data ? data.error_code : response.status,
3228
- error_message: data ? data.error_message : "401 Authorization Required"
3829
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3229
3830
  };
3230
3831
  }
3231
3832
  catch (error) {
@@ -3234,7 +3835,7 @@ class TransactionService {
3234
3835
  data: null,
3235
3836
  error: true,
3236
3837
  error_code: data ? data.error_code : response.status,
3237
- error_message: data ? data.error_message : "401 Authorization Required"
3838
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3238
3839
  };
3239
3840
  }
3240
3841
  }
@@ -3696,7 +4297,7 @@ class XykService {
3696
4297
  data: dataClass,
3697
4298
  error: data.error,
3698
4299
  error_code: data ? data.error_code : response.status,
3699
- error_message: data ? data.error_message : "401 Authorization Required"
4300
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3700
4301
  };
3701
4302
  }
3702
4303
  catch (error) {
@@ -3705,7 +4306,7 @@ class XykService {
3705
4306
  data: null,
3706
4307
  error: true,
3707
4308
  error_code: data ? data.error_code : response.status,
3708
- error_message: data ? data.error_message : "401 Authorization Required"
4309
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3709
4310
  };
3710
4311
  }
3711
4312
  }
@@ -3761,7 +4362,7 @@ class XykService {
3761
4362
  data: dataClass,
3762
4363
  error: data.error,
3763
4364
  error_code: data ? data.error_code : response.status,
3764
- error_message: data ? data.error_message : "401 Authorization Required"
4365
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3765
4366
  };
3766
4367
  }
3767
4368
  catch (error) {
@@ -3770,7 +4371,7 @@ class XykService {
3770
4371
  data: null,
3771
4372
  error: true,
3772
4373
  error_code: data ? data.error_code : response.status,
3773
- error_message: data ? data.error_message : "401 Authorization Required"
4374
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3774
4375
  };
3775
4376
  }
3776
4377
  }
@@ -3827,7 +4428,7 @@ class XykService {
3827
4428
  data: dataClass,
3828
4429
  error: data.error,
3829
4430
  error_code: data ? data.error_code : response.status,
3830
- error_message: data ? data.error_message : "401 Authorization Required"
4431
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3831
4432
  };
3832
4433
  }
3833
4434
  catch (error) {
@@ -3836,7 +4437,7 @@ class XykService {
3836
4437
  data: null,
3837
4438
  error: true,
3838
4439
  error_code: data ? data.error_code : response.status,
3839
- error_message: data ? data.error_message : "401 Authorization Required"
4440
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3840
4441
  };
3841
4442
  }
3842
4443
  }
@@ -3863,6 +4464,9 @@ class XykService {
3863
4464
  if (queryParamOpts?.quoteCurrency !== undefined) {
3864
4465
  urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
3865
4466
  }
4467
+ if (queryParamOpts?.dexName !== undefined) {
4468
+ urlParams.append("dex-name", queryParamOpts?.dexName.toString());
4469
+ }
3866
4470
  let startTime;
3867
4471
  if (this.debug) {
3868
4472
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
@@ -3898,7 +4502,7 @@ class XykService {
3898
4502
  data: dataClass,
3899
4503
  error: data.error,
3900
4504
  error_code: data ? data.error_code : response.status,
3901
- error_message: data ? data.error_message : "401 Authorization Required"
4505
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3902
4506
  };
3903
4507
  }
3904
4508
  catch (error) {
@@ -3907,7 +4511,7 @@ class XykService {
3907
4511
  data: null,
3908
4512
  error: true,
3909
4513
  error_code: data ? data.error_code : response.status,
3910
- error_message: data ? data.error_message : "401 Authorization Required"
4514
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3911
4515
  };
3912
4516
  }
3913
4517
  }
@@ -3964,7 +4568,7 @@ class XykService {
3964
4568
  data: dataClass,
3965
4569
  error: data.error,
3966
4570
  error_code: data ? data.error_code : response.status,
3967
- error_message: data ? data.error_message : "401 Authorization Required"
4571
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3968
4572
  };
3969
4573
  }
3970
4574
  catch (error) {
@@ -3973,7 +4577,7 @@ class XykService {
3973
4577
  data: null,
3974
4578
  error: true,
3975
4579
  error_code: data ? data.error_code : response.status,
3976
- error_message: data ? data.error_message : "401 Authorization Required"
4580
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3977
4581
  };
3978
4582
  }
3979
4583
  }
@@ -4004,6 +4608,9 @@ class XykService {
4004
4608
  if (queryParamOpts?.quoteCurrency !== undefined) {
4005
4609
  urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
4006
4610
  }
4611
+ if (queryParamOpts?.dexName !== undefined) {
4612
+ urlParams.append("dex-name", queryParamOpts?.dexName.toString());
4613
+ }
4007
4614
  let startTime;
4008
4615
  if (this.debug) {
4009
4616
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
@@ -4039,7 +4646,7 @@ class XykService {
4039
4646
  data: dataClass,
4040
4647
  error: data.error,
4041
4648
  error_code: data ? data.error_code : response.status,
4042
- error_message: data ? data.error_message : "401 Authorization Required"
4649
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4043
4650
  };
4044
4651
  }
4045
4652
  catch (error) {
@@ -4048,7 +4655,7 @@ class XykService {
4048
4655
  data: null,
4049
4656
  error: true,
4050
4657
  error_code: data ? data.error_code : response.status,
4051
- error_message: data ? data.error_message : "401 Authorization Required"
4658
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4052
4659
  };
4053
4660
  }
4054
4661
  }
@@ -4104,7 +4711,7 @@ class XykService {
4104
4711
  data: dataClass,
4105
4712
  error: data.error,
4106
4713
  error_code: data ? data.error_code : response.status,
4107
- error_message: data ? data.error_message : "401 Authorization Required"
4714
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4108
4715
  };
4109
4716
  }
4110
4717
  catch (error) {
@@ -4113,7 +4720,7 @@ class XykService {
4113
4720
  data: null,
4114
4721
  error: true,
4115
4722
  error_code: data ? data.error_code : response.status,
4116
- error_message: data ? data.error_message : "401 Authorization Required"
4723
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4117
4724
  };
4118
4725
  }
4119
4726
  }
@@ -4167,7 +4774,7 @@ class XykService {
4167
4774
  data: dataClass,
4168
4775
  error: data.error,
4169
4776
  error_code: data ? data.error_code : response.status,
4170
- error_message: data ? data.error_message : "401 Authorization Required"
4777
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4171
4778
  };
4172
4779
  }
4173
4780
  catch (error) {
@@ -4176,7 +4783,7 @@ class XykService {
4176
4783
  data: null,
4177
4784
  error: true,
4178
4785
  error_code: data ? data.error_code : response.status,
4179
- error_message: data ? data.error_message : "401 Authorization Required"
4786
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4180
4787
  };
4181
4788
  }
4182
4789
  }
@@ -4233,7 +4840,7 @@ class XykService {
4233
4840
  data: dataClass,
4234
4841
  error: data.error,
4235
4842
  error_code: data ? data.error_code : response.status,
4236
- error_message: data ? data.error_message : "401 Authorization Required"
4843
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4237
4844
  };
4238
4845
  }
4239
4846
  catch (error) {
@@ -4242,7 +4849,7 @@ class XykService {
4242
4849
  data: null,
4243
4850
  error: true,
4244
4851
  error_code: data ? data.error_code : response.status,
4245
- error_message: data ? data.error_message : "401 Authorization Required"
4852
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4246
4853
  };
4247
4854
  }
4248
4855
  }
@@ -4299,7 +4906,7 @@ class XykService {
4299
4906
  data: dataClass,
4300
4907
  error: data.error,
4301
4908
  error_code: data ? data.error_code : response.status,
4302
- error_message: data ? data.error_message : "401 Authorization Required"
4909
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4303
4910
  };
4304
4911
  }
4305
4912
  catch (error) {
@@ -4308,7 +4915,7 @@ class XykService {
4308
4915
  data: null,
4309
4916
  error: true,
4310
4917
  error_code: data ? data.error_code : response.status,
4311
- error_message: data ? data.error_message : "401 Authorization Required"
4918
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4312
4919
  };
4313
4920
  }
4314
4921
  }
@@ -4365,7 +4972,7 @@ class XykService {
4365
4972
  data: dataClass,
4366
4973
  error: data.error,
4367
4974
  error_code: data ? data.error_code : response.status,
4368
- error_message: data ? data.error_message : "401 Authorization Required"
4975
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4369
4976
  };
4370
4977
  }
4371
4978
  catch (error) {
@@ -4374,7 +4981,7 @@ class XykService {
4374
4981
  data: null,
4375
4982
  error: true,
4376
4983
  error_code: data ? data.error_code : response.status,
4377
- error_message: data ? data.error_message : "401 Authorization Required"
4984
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4378
4985
  };
4379
4986
  }
4380
4987
  }
@@ -4431,7 +5038,7 @@ class XykService {
4431
5038
  data: dataClass,
4432
5039
  error: data.error,
4433
5040
  error_code: data ? data.error_code : response.status,
4434
- error_message: data ? data.error_message : "401 Authorization Required"
5041
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4435
5042
  };
4436
5043
  }
4437
5044
  catch (error) {
@@ -4440,7 +5047,7 @@ class XykService {
4440
5047
  data: null,
4441
5048
  error: true,
4442
5049
  error_code: data ? data.error_code : response.status,
4443
- error_message: data ? data.error_message : "401 Authorization Required"
5050
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4444
5051
  };
4445
5052
  }
4446
5053
  }
@@ -4496,7 +5103,7 @@ class XykService {
4496
5103
  data: dataClass,
4497
5104
  error: data.error,
4498
5105
  error_code: data ? data.error_code : response.status,
4499
- error_message: data ? data.error_message : "401 Authorization Required"
5106
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4500
5107
  };
4501
5108
  }
4502
5109
  catch (error) {
@@ -4505,7 +5112,7 @@ class XykService {
4505
5112
  data: null,
4506
5113
  error: true,
4507
5114
  error_code: data ? data.error_code : response.status,
4508
- error_message: data ? data.error_message : "401 Authorization Required"
5115
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4509
5116
  };
4510
5117
  }
4511
5118
  }
@@ -4561,7 +5168,7 @@ class XykService {
4561
5168
  data: dataClass,
4562
5169
  error: data.error,
4563
5170
  error_code: data ? data.error_code : response.status,
4564
- error_message: data ? data.error_message : "401 Authorization Required"
5171
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4565
5172
  };
4566
5173
  }
4567
5174
  catch (error) {
@@ -4570,14 +5177,14 @@ class XykService {
4570
5177
  data: null,
4571
5178
  error: true,
4572
5179
  error_code: data ? data.error_code : response.status,
4573
- error_message: data ? data.error_message : "401 Authorization Required"
5180
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4574
5181
  };
4575
5182
  }
4576
5183
  }
4577
5184
  }
4578
5185
  }
4579
5186
 
4580
- const userAgent = "com.covalenthq.sdk.typescript/0.4.2";
5187
+ const userAgent = "com.covalenthq.sdk.typescript/0.5.0";
4581
5188
  /**
4582
5189
  * CovalentClient Class
4583
5190
  */