@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/cjs/index.js CHANGED
@@ -279,7 +279,7 @@ async function* paginateEndpoint$1(url, apiKey, urlsParams, dataClassConstructor
279
279
  if (error.message.includes("An error occurred 429")) {
280
280
  throw new Error(error.message);
281
281
  }
282
- throw new Error(`An error occurred ${data ? data.error_code : response.status}: ${data ? data.error_message : "401 Authorization Required"}`);
282
+ 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"}`);
283
283
  }
284
284
  }
285
285
  }
@@ -329,6 +329,43 @@ class TokenSpenderItem {
329
329
  this.risk_factor = data.risk_factor;
330
330
  }
331
331
  }
332
+ class NftApprovalsResponse {
333
+ constructor(data) {
334
+ this.updated_at = data.updated_at && data.updated_at !== null ? dateFns.parseISO(data.updated_at.toString()) : null;
335
+ this.chain_id = data.chain_id;
336
+ this.chain_name = data.chain_name;
337
+ this.address = data.address;
338
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new NftApprovalsItem(itemData)) : null;
339
+ }
340
+ }
341
+ class NftApprovalsItem {
342
+ constructor(data) {
343
+ this.contract_address = data.contract_address;
344
+ this.contract_address_label = data.contract_address_label;
345
+ this.contract_ticker_symbol = data.contract_ticker_symbol;
346
+ this.token_balances = data.token_balances && data.token_balances !== null ? data.token_balances.map((itemData) => new NftApprovalBalance(itemData)) : null;
347
+ this.spenders = data.spenders && data.spenders !== null ? data.spenders.map((itemData) => new NftApprovalSpender(itemData)) : null;
348
+ }
349
+ }
350
+ class NftApprovalBalance {
351
+ constructor(data) {
352
+ this.token_id = data.token_id && data.token_id !== null ? BigInt(data.token_id) : null;
353
+ this.token_balance = data.token_balance && data.token_balance !== null ? BigInt(data.token_balance) : null;
354
+ }
355
+ }
356
+ class NftApprovalSpender {
357
+ constructor(data) {
358
+ this.block_height = data.block_height;
359
+ this.tx_offset = data.tx_offset;
360
+ this.log_offset = data.log_offset;
361
+ this.block_signed_at = data.block_signed_at && data.block_signed_at !== null ? dateFns.parseISO(data.block_signed_at.toString()) : null;
362
+ this.tx_hash = data.tx_hash;
363
+ this.spender_address = data.spender_address;
364
+ this.spender_address_label = data.spender_address_label;
365
+ this.token_ids_approved = data.token_ids_approved;
366
+ this.allowance = data.allowance;
367
+ }
368
+ }
332
369
  /**
333
370
  * Approvals API
334
371
  *
@@ -391,7 +428,7 @@ class SecurityService {
391
428
  data: dataClass,
392
429
  error: data.error,
393
430
  error_code: data ? data.error_code : response.status,
394
- error_message: data ? data.error_message : "401 Authorization Required"
431
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
395
432
  };
396
433
  }
397
434
  catch (error) {
@@ -400,7 +437,71 @@ class SecurityService {
400
437
  data: null,
401
438
  error: true,
402
439
  error_code: data ? data.error_code : response.status,
403
- error_message: data ? data.error_message : "401 Authorization Required"
440
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
441
+ };
442
+ }
443
+ }
444
+ }
445
+ /**
446
+ *
447
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
448
+ * @param {string} walletAddress - The requested address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
449
+
450
+ *
451
+ */
452
+ async getNftApprovals(chainName, walletAddress) {
453
+ let success = false;
454
+ let data;
455
+ let response;
456
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
457
+ while (!success) {
458
+ try {
459
+ const urlParams = new URLSearchParams();
460
+ let startTime;
461
+ if (this.debug) {
462
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
463
+ }
464
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft/approvals/${walletAddress}/?${urlParams}`, {
465
+ headers: {
466
+ "Authorization": `Bearer ${this.apiKey}`,
467
+ "X-Requested-With": userAgent
468
+ }
469
+ }));
470
+ debugOutput(response.url, response.status, startTime);
471
+ if (response.status === 429) {
472
+ try {
473
+ data = await this.LIMIT(() => backoff.backOff(response.url));
474
+ }
475
+ catch (error) {
476
+ success = true;
477
+ return {
478
+ data: null,
479
+ error: true,
480
+ error_code: response.status,
481
+ error_message: error.message
482
+ };
483
+ }
484
+ }
485
+ else {
486
+ data = await response.json();
487
+ }
488
+ const dataClass = new NftApprovalsResponse(data.data);
489
+ checkAndModifyResponse(dataClass);
490
+ success = true;
491
+ return {
492
+ data: dataClass,
493
+ error: data.error,
494
+ error_code: data ? data.error_code : response.status,
495
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
496
+ };
497
+ }
498
+ catch (error) {
499
+ success = true;
500
+ return {
501
+ data: null,
502
+ error: true,
503
+ error_code: data ? data.error_code : response.status,
504
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
404
505
  };
405
506
  }
406
507
  }
@@ -510,6 +611,17 @@ class OhlcItem {
510
611
  this.pretty_quote = data.pretty_quote;
511
612
  }
512
613
  }
614
+ class Erc20TransfersResponse {
615
+ constructor(data) {
616
+ this.address = data.address;
617
+ this.updated_at = data.updated_at && data.updated_at !== null ? dateFns.parseISO(data.updated_at.toString()) : null;
618
+ this.quote_currency = data.quote_currency;
619
+ this.chain_id = data.chain_id;
620
+ this.chain_name = data.chain_name;
621
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new BlockTransactionWithContractTransfers(itemData)) : null;
622
+ this.pagination = data.pagination && data.pagination !== null ? new Pagination$2(data.pagination) : null;
623
+ }
624
+ }
513
625
  class BlockTransactionWithContractTransfers {
514
626
  constructor(data) {
515
627
  this.block_signed_at = data.block_signed_at && data.block_signed_at !== null ? dateFns.parseISO(data.block_signed_at.toString()) : null;
@@ -534,6 +646,14 @@ class BlockTransactionWithContractTransfers {
534
646
  this.transfers = data.transfers && data.transfers !== null ? data.transfers.map((itemData) => new TokenTransferItem(itemData)) : null;
535
647
  }
536
648
  }
649
+ let Pagination$2 = class Pagination {
650
+ constructor(data) {
651
+ this.has_more = data.has_more;
652
+ this.page_number = data.page_number;
653
+ this.page_size = data.page_size;
654
+ this.total_count = data.total_count;
655
+ }
656
+ };
537
657
  class TokenTransferItem {
538
658
  constructor(data) {
539
659
  this.block_signed_at = data.block_signed_at && data.block_signed_at !== null ? dateFns.parseISO(data.block_signed_at.toString()) : null;
@@ -608,6 +728,31 @@ class HistoricalBalanceItem {
608
728
  this.nft_data = data.nft_data && data.nft_data !== null ? data.nft_data.map((itemData) => new NftData$1(itemData)) : null;
609
729
  }
610
730
  }
731
+ class TokenBalanceNativeResponse {
732
+ constructor(data) {
733
+ this.address = data.address;
734
+ this.updated_at = data.updated_at && data.updated_at !== null ? dateFns.parseISO(data.updated_at.toString()) : null;
735
+ this.quote_currency = data.quote_currency;
736
+ this.chain_id = data.chain_id;
737
+ this.chain_name = data.chain_name;
738
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new NativeBalanceItem(itemData)) : null;
739
+ }
740
+ }
741
+ class NativeBalanceItem {
742
+ constructor(data) {
743
+ this.contract_decimals = data.contract_decimals;
744
+ this.contract_name = data.contract_name;
745
+ this.contract_ticker_symbol = data.contract_ticker_symbol;
746
+ this.contract_address = data.contract_address;
747
+ this.supports_erc = data.supports_erc;
748
+ this.logo_url = data.logo_url;
749
+ this.block_height = data.block_height;
750
+ this.balance = data.balance && data.balance !== null ? BigInt(data.balance) : null;
751
+ this.quote_rate = data.quote_rate;
752
+ this.quote = data.quote;
753
+ this.pretty_quote = data.pretty_quote;
754
+ }
755
+ }
611
756
  /**
612
757
  * Balances APIs
613
758
  *
@@ -691,7 +836,7 @@ class BalanceService {
691
836
  data: dataClass,
692
837
  error: data.error,
693
838
  error_code: data ? data.error_code : response.status,
694
- error_message: data ? data.error_message : "401 Authorization Required"
839
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
695
840
  };
696
841
  }
697
842
  catch (error) {
@@ -700,7 +845,7 @@ class BalanceService {
700
845
  data: null,
701
846
  error: true,
702
847
  error_code: data ? data.error_code : response.status,
703
- error_message: data ? data.error_message : "401 Authorization Required"
848
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
704
849
  };
705
850
  }
706
851
  }
@@ -765,7 +910,7 @@ class BalanceService {
765
910
  data: dataClass,
766
911
  error: data.error,
767
912
  error_code: data ? data.error_code : response.status,
768
- error_message: data ? data.error_message : "401 Authorization Required"
913
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
769
914
  };
770
915
  }
771
916
  catch (error) {
@@ -774,7 +919,7 @@ class BalanceService {
774
919
  data: null,
775
920
  error: true,
776
921
  error_code: data ? data.error_code : response.status,
777
- error_message: data ? data.error_message : "401 Authorization Required"
922
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
778
923
  };
779
924
  }
780
925
  }
@@ -829,6 +974,96 @@ class BalanceService {
829
974
  }
830
975
  }
831
976
  }
977
+ /**
978
+ *
979
+ * Commonly used to render the transfer-in and transfer-out of a token along with historical prices from an address.
980
+ *
981
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
982
+ * @param {string} walletAddress - The requested address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
983
+ * @param {GetErc20TransfersForWalletAddressQueryParamOpts} queryParamOpts
984
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
985
+ * - `contractAddress`: The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
986
+ * - `startingBlock`: The block height to start from, defaults to `0`.
987
+ * - `endingBlock`: The block height to end at, defaults to current block height.
988
+ * - `pageSize`: Number of items per page. Omitting this parameter defaults to 100.
989
+ * - `pageNumber`: 0-indexed page number to begin pagination.
990
+ *
991
+ */
992
+ async getErc20TransfersForWalletAddressByPage(chainName, walletAddress, queryParamOpts) {
993
+ let success = false;
994
+ let data;
995
+ let response;
996
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
997
+ while (!success) {
998
+ try {
999
+ const urlParams = new URLSearchParams();
1000
+ if (queryParamOpts?.quoteCurrency !== undefined) {
1001
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
1002
+ }
1003
+ if (queryParamOpts?.contractAddress !== undefined) {
1004
+ urlParams.append("contract-address", queryParamOpts?.contractAddress.toString());
1005
+ }
1006
+ if (queryParamOpts?.startingBlock !== undefined) {
1007
+ urlParams.append("starting-block", queryParamOpts?.startingBlock.toString());
1008
+ }
1009
+ if (queryParamOpts?.endingBlock !== undefined) {
1010
+ urlParams.append("ending-block", queryParamOpts?.endingBlock.toString());
1011
+ }
1012
+ if (queryParamOpts?.pageSize !== undefined) {
1013
+ urlParams.append("page-size", queryParamOpts?.pageSize.toString());
1014
+ }
1015
+ if (queryParamOpts?.pageNumber !== undefined) {
1016
+ urlParams.append("page-number", queryParamOpts?.pageNumber.toString());
1017
+ }
1018
+ let startTime;
1019
+ if (this.debug) {
1020
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
1021
+ }
1022
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/transfers_v2/?${urlParams}`, {
1023
+ headers: {
1024
+ "Authorization": `Bearer ${this.apiKey}`,
1025
+ "X-Requested-With": userAgent
1026
+ }
1027
+ }));
1028
+ debugOutput(response.url, response.status, startTime);
1029
+ if (response.status === 429) {
1030
+ try {
1031
+ data = await this.LIMIT(() => backoff.backOff(response.url));
1032
+ }
1033
+ catch (error) {
1034
+ success = true;
1035
+ return {
1036
+ data: null,
1037
+ error: true,
1038
+ error_code: response.status,
1039
+ error_message: error.message
1040
+ };
1041
+ }
1042
+ }
1043
+ else {
1044
+ data = await response.json();
1045
+ }
1046
+ const dataClass = new Erc20TransfersResponse(data.data);
1047
+ checkAndModifyResponse(dataClass);
1048
+ success = true;
1049
+ return {
1050
+ data: dataClass,
1051
+ error: data.error,
1052
+ error_code: data ? data.error_code : response.status,
1053
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1054
+ };
1055
+ }
1056
+ catch (error) {
1057
+ success = true;
1058
+ return {
1059
+ data: null,
1060
+ error: true,
1061
+ error_code: data ? data.error_code : response.status,
1062
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1063
+ };
1064
+ }
1065
+ }
1066
+ }
832
1067
  /**
833
1068
  *
834
1069
  * 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.
@@ -909,14 +1144,86 @@ class BalanceService {
909
1144
  if (queryParamOpts?.blockHeight !== undefined) {
910
1145
  urlParams.append("block-height", queryParamOpts?.blockHeight.toString());
911
1146
  }
912
- if (queryParamOpts?.date !== undefined) {
913
- urlParams.append("date", queryParamOpts?.date.toString());
914
- }
1147
+ if (queryParamOpts?.date !== undefined) {
1148
+ urlParams.append("date", queryParamOpts?.date.toString());
1149
+ }
1150
+ let startTime;
1151
+ if (this.debug) {
1152
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
1153
+ }
1154
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/historical_balances/?${urlParams}`, {
1155
+ headers: {
1156
+ "Authorization": `Bearer ${this.apiKey}`,
1157
+ "X-Requested-With": userAgent
1158
+ }
1159
+ }));
1160
+ debugOutput(response.url, response.status, startTime);
1161
+ if (response.status === 429) {
1162
+ try {
1163
+ data = await this.LIMIT(() => backoff.backOff(response.url));
1164
+ }
1165
+ catch (error) {
1166
+ success = true;
1167
+ return {
1168
+ data: null,
1169
+ error: true,
1170
+ error_code: response.status,
1171
+ error_message: error.message
1172
+ };
1173
+ }
1174
+ }
1175
+ else {
1176
+ data = await response.json();
1177
+ }
1178
+ const dataClass = new HistoricalBalancesResponse(data.data);
1179
+ checkAndModifyResponse(dataClass);
1180
+ success = true;
1181
+ return {
1182
+ data: dataClass,
1183
+ error: data.error,
1184
+ error_code: data ? data.error_code : response.status,
1185
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1186
+ };
1187
+ }
1188
+ catch (error) {
1189
+ success = true;
1190
+ return {
1191
+ data: null,
1192
+ error: true,
1193
+ error_code: data ? data.error_code : response.status,
1194
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1195
+ };
1196
+ }
1197
+ }
1198
+ }
1199
+ /**
1200
+ *
1201
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
1202
+ * @param {string} walletAddress - The requested address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
1203
+ * @param {GetNativeTokenBalanceQueryParamOpts} queryParamOpts
1204
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
1205
+ * - `blockHeight`: Ending block to define a block range. Omitting this parameter defaults to the latest block height.
1206
+ *
1207
+ */
1208
+ async getNativeTokenBalance(chainName, walletAddress, queryParamOpts) {
1209
+ let success = false;
1210
+ let data;
1211
+ let response;
1212
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
1213
+ while (!success) {
1214
+ try {
1215
+ const urlParams = new URLSearchParams();
1216
+ if (queryParamOpts?.quoteCurrency !== undefined) {
1217
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
1218
+ }
1219
+ if (queryParamOpts?.blockHeight !== undefined) {
1220
+ urlParams.append("block-height", queryParamOpts?.blockHeight.toString());
1221
+ }
915
1222
  let startTime;
916
1223
  if (this.debug) {
917
1224
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
918
1225
  }
919
- response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/historical_balances/?${urlParams}`, {
1226
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/balances_native/?${urlParams}`, {
920
1227
  headers: {
921
1228
  "Authorization": `Bearer ${this.apiKey}`,
922
1229
  "X-Requested-With": userAgent
@@ -940,14 +1247,14 @@ class BalanceService {
940
1247
  else {
941
1248
  data = await response.json();
942
1249
  }
943
- const dataClass = new HistoricalBalancesResponse(data.data);
1250
+ const dataClass = new TokenBalanceNativeResponse(data.data);
944
1251
  checkAndModifyResponse(dataClass);
945
1252
  success = true;
946
1253
  return {
947
1254
  data: dataClass,
948
1255
  error: data.error,
949
1256
  error_code: data ? data.error_code : response.status,
950
- error_message: data ? data.error_message : "401 Authorization Required"
1257
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
951
1258
  };
952
1259
  }
953
1260
  catch (error) {
@@ -956,7 +1263,7 @@ class BalanceService {
956
1263
  data: null,
957
1264
  error: true,
958
1265
  error_code: data ? data.error_code : response.status,
959
- error_message: data ? data.error_message : "401 Authorization Required"
1266
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
960
1267
  };
961
1268
  }
962
1269
  }
@@ -1168,7 +1475,7 @@ class BaseService {
1168
1475
  data: dataClass,
1169
1476
  error: data.error,
1170
1477
  error_code: data ? data.error_code : response.status,
1171
- error_message: data ? data.error_message : "401 Authorization Required"
1478
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1172
1479
  };
1173
1480
  }
1174
1481
  catch (error) {
@@ -1177,7 +1484,7 @@ class BaseService {
1177
1484
  data: null,
1178
1485
  error: true,
1179
1486
  error_code: data ? data.error_code : response.status,
1180
- error_message: data ? data.error_message : "401 Authorization Required"
1487
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1181
1488
  };
1182
1489
  }
1183
1490
  }
@@ -1233,7 +1540,7 @@ class BaseService {
1233
1540
  data: dataClass,
1234
1541
  error: data.error,
1235
1542
  error_code: data ? data.error_code : response.status,
1236
- error_message: data ? data.error_message : "401 Authorization Required"
1543
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1237
1544
  };
1238
1545
  }
1239
1546
  catch (error) {
@@ -1242,7 +1549,7 @@ class BaseService {
1242
1549
  data: null,
1243
1550
  error: true,
1244
1551
  error_code: data ? data.error_code : response.status,
1245
- error_message: data ? data.error_message : "401 Authorization Required"
1552
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1246
1553
  };
1247
1554
  }
1248
1555
  }
@@ -1357,7 +1664,7 @@ class BaseService {
1357
1664
  data: dataClass,
1358
1665
  error: data.error,
1359
1666
  error_code: data ? data.error_code : response.status,
1360
- error_message: data ? data.error_message : "401 Authorization Required"
1667
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1361
1668
  };
1362
1669
  }
1363
1670
  catch (error) {
@@ -1366,7 +1673,7 @@ class BaseService {
1366
1673
  data: null,
1367
1674
  error: true,
1368
1675
  error_code: data ? data.error_code : response.status,
1369
- error_message: data ? data.error_message : "401 Authorization Required"
1676
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1370
1677
  };
1371
1678
  }
1372
1679
  }
@@ -1508,7 +1815,7 @@ class BaseService {
1508
1815
  data: dataClass,
1509
1816
  error: data.error,
1510
1817
  error_code: data ? data.error_code : response.status,
1511
- error_message: data ? data.error_message : "401 Authorization Required"
1818
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1512
1819
  };
1513
1820
  }
1514
1821
  catch (error) {
@@ -1517,7 +1824,7 @@ class BaseService {
1517
1824
  data: null,
1518
1825
  error: true,
1519
1826
  error_code: data ? data.error_code : response.status,
1520
- error_message: data ? data.error_message : "401 Authorization Required"
1827
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1521
1828
  };
1522
1829
  }
1523
1830
  }
@@ -1571,7 +1878,7 @@ class BaseService {
1571
1878
  data: dataClass,
1572
1879
  error: data.error,
1573
1880
  error_code: data ? data.error_code : response.status,
1574
- error_message: data ? data.error_message : "401 Authorization Required"
1881
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1575
1882
  };
1576
1883
  }
1577
1884
  catch (error) {
@@ -1580,7 +1887,7 @@ class BaseService {
1580
1887
  data: null,
1581
1888
  error: true,
1582
1889
  error_code: data ? data.error_code : response.status,
1583
- error_message: data ? data.error_message : "401 Authorization Required"
1890
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1584
1891
  };
1585
1892
  }
1586
1893
  }
@@ -1640,7 +1947,7 @@ class BaseService {
1640
1947
  data: dataClass,
1641
1948
  error: data.error,
1642
1949
  error_code: data ? data.error_code : response.status,
1643
- error_message: data ? data.error_message : "401 Authorization Required"
1950
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1644
1951
  };
1645
1952
  }
1646
1953
  catch (error) {
@@ -1649,7 +1956,7 @@ class BaseService {
1649
1956
  data: null,
1650
1957
  error: true,
1651
1958
  error_code: data ? data.error_code : response.status,
1652
- error_message: data ? data.error_message : "401 Authorization Required"
1959
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
1653
1960
  };
1654
1961
  }
1655
1962
  }
@@ -1905,6 +2212,62 @@ class NftOwnershipForCollectionItem {
1905
2212
  this.nft_data = data.nft_data && data.nft_data !== null ? new NftData(data.nft_data) : null;
1906
2213
  }
1907
2214
  }
2215
+ class NftMarketSaleCountResponse {
2216
+ constructor(data) {
2217
+ this.updated_at = data.updated_at && data.updated_at !== null ? dateFns.parseISO(data.updated_at.toString()) : null;
2218
+ this.address = data.address;
2219
+ this.quote_currency = data.quote_currency;
2220
+ this.chain_name = data.chain_name;
2221
+ this.chain_id = data.chain_id;
2222
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new MarketSaleCountItem(itemData)) : null;
2223
+ }
2224
+ }
2225
+ class MarketSaleCountItem {
2226
+ constructor(data) {
2227
+ this.date = data.date && data.date !== null ? dateFns.parseISO(data.date.toString()) : null;
2228
+ this.sale_count = data.sale_count;
2229
+ }
2230
+ }
2231
+ class NftMarketVolumeResponse {
2232
+ constructor(data) {
2233
+ this.updated_at = data.updated_at && data.updated_at !== null ? dateFns.parseISO(data.updated_at.toString()) : null;
2234
+ this.address = data.address;
2235
+ this.quote_currency = data.quote_currency;
2236
+ this.chain_name = data.chain_name;
2237
+ this.chain_id = data.chain_id;
2238
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new MarketVolumeItem(itemData)) : null;
2239
+ }
2240
+ }
2241
+ class MarketVolumeItem {
2242
+ constructor(data) {
2243
+ this.date = data.date && data.date !== null ? dateFns.parseISO(data.date.toString()) : null;
2244
+ this.native_ticker_symbol = data.native_ticker_symbol;
2245
+ this.native_name = data.native_name;
2246
+ this.volume_quote = data.volume_quote;
2247
+ this.volume_native_quote = data.volume_native_quote;
2248
+ this.pretty_volume_quote = data.pretty_volume_quote;
2249
+ }
2250
+ }
2251
+ class NftMarketFloorPriceResponse {
2252
+ constructor(data) {
2253
+ this.updated_at = data.updated_at && data.updated_at !== null ? dateFns.parseISO(data.updated_at.toString()) : null;
2254
+ this.address = data.address;
2255
+ this.quote_currency = data.quote_currency;
2256
+ this.chain_name = data.chain_name;
2257
+ this.chain_id = data.chain_id;
2258
+ this.items = data.items && data.items !== null ? data.items.map((itemData) => new MarketFloorPriceItem(itemData)) : null;
2259
+ }
2260
+ }
2261
+ class MarketFloorPriceItem {
2262
+ constructor(data) {
2263
+ this.date = data.date && data.date !== null ? dateFns.parseISO(data.date.toString()) : null;
2264
+ this.native_ticker_symbol = data.native_ticker_symbol;
2265
+ this.native_name = data.native_name;
2266
+ this.floor_price_native_quote = data.floor_price_native_quote;
2267
+ this.floor_price_quote = data.floor_price_quote;
2268
+ this.pretty_floor_price_quote = data.pretty_floor_price_quote;
2269
+ }
2270
+ }
1908
2271
  /**
1909
2272
  * NFT APIs
1910
2273
  *
@@ -2017,7 +2380,7 @@ class NftService {
2017
2380
  data: dataClass,
2018
2381
  error: data.error,
2019
2382
  error_code: data ? data.error_code : response.status,
2020
- error_message: data ? data.error_message : "401 Authorization Required"
2383
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2021
2384
  };
2022
2385
  }
2023
2386
  catch (error) {
@@ -2026,7 +2389,7 @@ class NftService {
2026
2389
  data: null,
2027
2390
  error: true,
2028
2391
  error_code: data ? data.error_code : response.status,
2029
- error_message: data ? data.error_message : "401 Authorization Required"
2392
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2030
2393
  };
2031
2394
  }
2032
2395
  }
@@ -2142,7 +2505,7 @@ class NftService {
2142
2505
  data: dataClass,
2143
2506
  error: data.error,
2144
2507
  error_code: data ? data.error_code : response.status,
2145
- error_message: data ? data.error_message : "401 Authorization Required"
2508
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2146
2509
  };
2147
2510
  }
2148
2511
  catch (error) {
@@ -2151,7 +2514,7 @@ class NftService {
2151
2514
  data: null,
2152
2515
  error: true,
2153
2516
  error_code: data ? data.error_code : response.status,
2154
- error_message: data ? data.error_message : "401 Authorization Required"
2517
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2155
2518
  };
2156
2519
  }
2157
2520
  }
@@ -2213,7 +2576,7 @@ class NftService {
2213
2576
  data: dataClass,
2214
2577
  error: data.error,
2215
2578
  error_code: data ? data.error_code : response.status,
2216
- error_message: data ? data.error_message : "401 Authorization Required"
2579
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2217
2580
  };
2218
2581
  }
2219
2582
  catch (error) {
@@ -2222,7 +2585,7 @@ class NftService {
2222
2585
  data: null,
2223
2586
  error: true,
2224
2587
  error_code: data ? data.error_code : response.status,
2225
- error_message: data ? data.error_message : "401 Authorization Required"
2588
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2226
2589
  };
2227
2590
  }
2228
2591
  }
@@ -2278,7 +2641,7 @@ class NftService {
2278
2641
  data: dataClass,
2279
2642
  error: data.error,
2280
2643
  error_code: data ? data.error_code : response.status,
2281
- error_message: data ? data.error_message : "401 Authorization Required"
2644
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2282
2645
  };
2283
2646
  }
2284
2647
  catch (error) {
@@ -2287,7 +2650,7 @@ class NftService {
2287
2650
  data: null,
2288
2651
  error: true,
2289
2652
  error_code: data ? data.error_code : response.status,
2290
- error_message: data ? data.error_message : "401 Authorization Required"
2653
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2291
2654
  };
2292
2655
  }
2293
2656
  }
@@ -2344,7 +2707,7 @@ class NftService {
2344
2707
  data: dataClass,
2345
2708
  error: data.error,
2346
2709
  error_code: data ? data.error_code : response.status,
2347
- error_message: data ? data.error_message : "401 Authorization Required"
2710
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2348
2711
  };
2349
2712
  }
2350
2713
  catch (error) {
@@ -2353,7 +2716,7 @@ class NftService {
2353
2716
  data: null,
2354
2717
  error: true,
2355
2718
  error_code: data ? data.error_code : response.status,
2356
- error_message: data ? data.error_message : "401 Authorization Required"
2719
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2357
2720
  };
2358
2721
  }
2359
2722
  }
@@ -2409,7 +2772,7 @@ class NftService {
2409
2772
  data: dataClass,
2410
2773
  error: data.error,
2411
2774
  error_code: data ? data.error_code : response.status,
2412
- error_message: data ? data.error_message : "401 Authorization Required"
2775
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2413
2776
  };
2414
2777
  }
2415
2778
  catch (error) {
@@ -2418,7 +2781,7 @@ class NftService {
2418
2781
  data: null,
2419
2782
  error: true,
2420
2783
  error_code: data ? data.error_code : response.status,
2421
- error_message: data ? data.error_message : "401 Authorization Required"
2784
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2422
2785
  };
2423
2786
  }
2424
2787
  }
@@ -2475,7 +2838,7 @@ class NftService {
2475
2838
  data: dataClass,
2476
2839
  error: data.error,
2477
2840
  error_code: data ? data.error_code : response.status,
2478
- error_message: data ? data.error_message : "401 Authorization Required"
2841
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2479
2842
  };
2480
2843
  }
2481
2844
  catch (error) {
@@ -2484,7 +2847,7 @@ class NftService {
2484
2847
  data: null,
2485
2848
  error: true,
2486
2849
  error_code: data ? data.error_code : response.status,
2487
- error_message: data ? data.error_message : "401 Authorization Required"
2850
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2488
2851
  };
2489
2852
  }
2490
2853
  }
@@ -2542,7 +2905,229 @@ class NftService {
2542
2905
  data: dataClass,
2543
2906
  error: data.error,
2544
2907
  error_code: data ? data.error_code : response.status,
2545
- error_message: data ? data.error_message : "401 Authorization Required"
2908
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2909
+ };
2910
+ }
2911
+ catch (error) {
2912
+ success = true;
2913
+ return {
2914
+ data: null,
2915
+ error: true,
2916
+ error_code: data ? data.error_code : response.status,
2917
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2918
+ };
2919
+ }
2920
+ }
2921
+ }
2922
+ /**
2923
+ *
2924
+ * Commonly used to build a time-series chart of the sales count of an NFT collection.
2925
+ *
2926
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
2927
+ * @param {string} contractAddress - The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
2928
+ * @param {GetNftMarketSaleCountQueryParamOpts} queryParamOpts
2929
+ * - `days`: The number of days to return data for. Request up 365 days. Defaults to 30 days.
2930
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
2931
+ *
2932
+ */
2933
+ async getNftMarketSaleCount(chainName, contractAddress, queryParamOpts) {
2934
+ let success = false;
2935
+ let data;
2936
+ let response;
2937
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
2938
+ while (!success) {
2939
+ try {
2940
+ const urlParams = new URLSearchParams();
2941
+ if (queryParamOpts?.days !== undefined) {
2942
+ urlParams.append("days", queryParamOpts?.days.toString());
2943
+ }
2944
+ if (queryParamOpts?.quoteCurrency !== undefined) {
2945
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
2946
+ }
2947
+ let startTime;
2948
+ if (this.debug) {
2949
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
2950
+ }
2951
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft_market/${contractAddress}/sale_count/?${urlParams}`, {
2952
+ headers: {
2953
+ "Authorization": `Bearer ${this.apiKey}`,
2954
+ "X-Requested-With": userAgent
2955
+ }
2956
+ }));
2957
+ debugOutput(response.url, response.status, startTime);
2958
+ if (response.status === 429) {
2959
+ try {
2960
+ data = await this.LIMIT(() => backoff.backOff(response.url));
2961
+ }
2962
+ catch (error) {
2963
+ success = true;
2964
+ return {
2965
+ data: null,
2966
+ error: true,
2967
+ error_code: response.status,
2968
+ error_message: error.message
2969
+ };
2970
+ }
2971
+ }
2972
+ else {
2973
+ data = await response.json();
2974
+ }
2975
+ const dataClass = new NftMarketSaleCountResponse(data.data);
2976
+ checkAndModifyResponse(dataClass);
2977
+ success = true;
2978
+ return {
2979
+ data: dataClass,
2980
+ error: data.error,
2981
+ error_code: data ? data.error_code : response.status,
2982
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2983
+ };
2984
+ }
2985
+ catch (error) {
2986
+ success = true;
2987
+ return {
2988
+ data: null,
2989
+ error: true,
2990
+ error_code: data ? data.error_code : response.status,
2991
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2992
+ };
2993
+ }
2994
+ }
2995
+ }
2996
+ /**
2997
+ *
2998
+ * Commonly used to build a time-series chart of the transaction volume of an NFT collection.
2999
+ *
3000
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
3001
+ * @param {string} contractAddress - The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
3002
+ * @param {GetNftMarketVolumeQueryParamOpts} queryParamOpts
3003
+ * - `days`: The number of days to return data for. Request up 365 days. Defaults to 30 days.
3004
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
3005
+ *
3006
+ */
3007
+ async getNftMarketVolume(chainName, contractAddress, queryParamOpts) {
3008
+ let success = false;
3009
+ let data;
3010
+ let response;
3011
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
3012
+ while (!success) {
3013
+ try {
3014
+ const urlParams = new URLSearchParams();
3015
+ if (queryParamOpts?.days !== undefined) {
3016
+ urlParams.append("days", queryParamOpts?.days.toString());
3017
+ }
3018
+ if (queryParamOpts?.quoteCurrency !== undefined) {
3019
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
3020
+ }
3021
+ let startTime;
3022
+ if (this.debug) {
3023
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
3024
+ }
3025
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft_market/${contractAddress}/volume/?${urlParams}`, {
3026
+ headers: {
3027
+ "Authorization": `Bearer ${this.apiKey}`,
3028
+ "X-Requested-With": userAgent
3029
+ }
3030
+ }));
3031
+ debugOutput(response.url, response.status, startTime);
3032
+ if (response.status === 429) {
3033
+ try {
3034
+ data = await this.LIMIT(() => backoff.backOff(response.url));
3035
+ }
3036
+ catch (error) {
3037
+ success = true;
3038
+ return {
3039
+ data: null,
3040
+ error: true,
3041
+ error_code: response.status,
3042
+ error_message: error.message
3043
+ };
3044
+ }
3045
+ }
3046
+ else {
3047
+ data = await response.json();
3048
+ }
3049
+ const dataClass = new NftMarketVolumeResponse(data.data);
3050
+ checkAndModifyResponse(dataClass);
3051
+ success = true;
3052
+ return {
3053
+ data: dataClass,
3054
+ error: data.error,
3055
+ error_code: data ? data.error_code : response.status,
3056
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3057
+ };
3058
+ }
3059
+ catch (error) {
3060
+ success = true;
3061
+ return {
3062
+ data: null,
3063
+ error: true,
3064
+ error_code: data ? data.error_code : response.status,
3065
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3066
+ };
3067
+ }
3068
+ }
3069
+ }
3070
+ /**
3071
+ *
3072
+ * Commonly used to render a price floor chart for an NFT collection.
3073
+ *
3074
+ * @param {string} chainName - The chain name eg: `eth-mainnet`.
3075
+ * @param {string} contractAddress - The requested contract address. Passing in an `ENS`, `RNS`, `Lens Handle`, or an `Unstoppable Domain` resolves automatically.
3076
+ * @param {GetNftMarketFloorPriceQueryParamOpts} queryParamOpts
3077
+ * - `days`: The number of days to return data for. Request up 365 days. Defaults to 30 days.
3078
+ * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
3079
+ *
3080
+ */
3081
+ async getNftMarketFloorPrice(chainName, contractAddress, queryParamOpts) {
3082
+ let success = false;
3083
+ let data;
3084
+ let response;
3085
+ const backoff = new ExponentialBackoff(this.apiKey, this.debug);
3086
+ while (!success) {
3087
+ try {
3088
+ const urlParams = new URLSearchParams();
3089
+ if (queryParamOpts?.days !== undefined) {
3090
+ urlParams.append("days", queryParamOpts?.days.toString());
3091
+ }
3092
+ if (queryParamOpts?.quoteCurrency !== undefined) {
3093
+ urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
3094
+ }
3095
+ let startTime;
3096
+ if (this.debug) {
3097
+ startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
3098
+ }
3099
+ response = await this.LIMIT(() => fetch(`https://api.covalenthq.com/v1/${chainName}/nft_market/${contractAddress}/floor_price/?${urlParams}`, {
3100
+ headers: {
3101
+ "Authorization": `Bearer ${this.apiKey}`,
3102
+ "X-Requested-With": userAgent
3103
+ }
3104
+ }));
3105
+ debugOutput(response.url, response.status, startTime);
3106
+ if (response.status === 429) {
3107
+ try {
3108
+ data = await this.LIMIT(() => backoff.backOff(response.url));
3109
+ }
3110
+ catch (error) {
3111
+ success = true;
3112
+ return {
3113
+ data: null,
3114
+ error: true,
3115
+ error_code: response.status,
3116
+ error_message: error.message
3117
+ };
3118
+ }
3119
+ }
3120
+ else {
3121
+ data = await response.json();
3122
+ }
3123
+ const dataClass = new NftMarketFloorPriceResponse(data.data);
3124
+ checkAndModifyResponse(dataClass);
3125
+ success = true;
3126
+ return {
3127
+ data: dataClass,
3128
+ error: data.error,
3129
+ error_code: data ? data.error_code : response.status,
3130
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2546
3131
  };
2547
3132
  }
2548
3133
  catch (error) {
@@ -2551,7 +3136,7 @@ class NftService {
2551
3136
  data: null,
2552
3137
  error: true,
2553
3138
  error_code: data ? data.error_code : response.status,
2554
- error_message: data ? data.error_message : "401 Authorization Required"
3139
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2555
3140
  };
2556
3141
  }
2557
3142
  }
@@ -2666,7 +3251,7 @@ class PricingService {
2666
3251
  data: res,
2667
3252
  error: data.error,
2668
3253
  error_code: data ? data.error_code : response.status,
2669
- error_message: data ? data.error_message : "401 Authorization Required"
3254
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2670
3255
  };
2671
3256
  }
2672
3257
  catch (error) {
@@ -2675,7 +3260,7 @@ class PricingService {
2675
3260
  data: null,
2676
3261
  error: true,
2677
3262
  error_code: data ? data.error_code : response.status,
2678
- error_message: data ? data.error_message : "401 Authorization Required"
3263
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
2679
3264
  };
2680
3265
  }
2681
3266
  }
@@ -2718,6 +3303,7 @@ class Transaction {
2718
3303
  this.nft_sale_details = data.nft_sale_details && data.nft_sale_details !== null ? new NftSalesReport(data.nft_sale_details) : null;
2719
3304
  this.lending_details = data.lending_details && data.lending_details !== null ? new LendingReport(data.lending_details) : null;
2720
3305
  this.log_events = data.log_events && data.log_events !== null ? data.log_events.map((itemData) => new LogEvent(itemData)) : null;
3306
+ this.safe_details = data.safe_details && data.safe_details !== null ? data.safe_details.map((itemData) => new SafeDetails(itemData)) : null;
2721
3307
  }
2722
3308
  }
2723
3309
  class ContractMetadata {
@@ -2864,6 +3450,13 @@ class LogEvent {
2864
3450
  this.decoded = data.decoded && data.decoded !== null ? new DecodedItem(data.decoded) : null;
2865
3451
  }
2866
3452
  }
3453
+ class SafeDetails {
3454
+ constructor(data) {
3455
+ this.owner_address = data.owner_address;
3456
+ this.signature = data.signature;
3457
+ this.signature_type = data.signature_type;
3458
+ }
3459
+ }
2867
3460
  class DecodedItem {
2868
3461
  constructor(data) {
2869
3462
  this.name = data.name;
@@ -2967,7 +3560,7 @@ async function* paginateEndpoint(url, apiKey, urlsParams, debug, threadCount) {
2967
3560
  if (error.message.includes("An error occurred 429")) {
2968
3561
  throw new Error(error.message);
2969
3562
  }
2970
- throw new Error(`An error occurred ${data ? data.error_code : response.status}: ${data ? data.error_message : "401 Authorization Required"}`);
3563
+ 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"}`);
2971
3564
  }
2972
3565
  }
2973
3566
  }
@@ -2990,6 +3583,7 @@ class TransactionService {
2990
3583
  * - `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.
2991
3584
  * - `withNftSales`: Decoded NFT sales details including marketplace (e.g. Opensea) and cached media links. Additional 0.05 credits charged if data available.
2992
3585
  * - `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.
3586
+ * - `withSafe`: Include safe details.
2993
3587
  *
2994
3588
  */
2995
3589
  async getTransaction(chainName, txHash, queryParamOpts) {
@@ -3015,6 +3609,9 @@ class TransactionService {
3015
3609
  if (queryParamOpts?.withLending !== undefined) {
3016
3610
  urlParams.append("with-lending", queryParamOpts?.withLending.toString());
3017
3611
  }
3612
+ if (queryParamOpts?.withSafe !== undefined) {
3613
+ urlParams.append("with-safe", queryParamOpts?.withSafe.toString());
3614
+ }
3018
3615
  let startTime;
3019
3616
  if (this.debug) {
3020
3617
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
@@ -3050,7 +3647,7 @@ class TransactionService {
3050
3647
  data: dataClass,
3051
3648
  error: data.error,
3052
3649
  error_code: data ? data.error_code : response.status,
3053
- error_message: data ? data.error_message : "401 Authorization Required"
3650
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3054
3651
  };
3055
3652
  }
3056
3653
  catch (error) {
@@ -3059,7 +3656,7 @@ class TransactionService {
3059
3656
  data: null,
3060
3657
  error: true,
3061
3658
  error_code: data ? data.error_code : response.status,
3062
- error_message: data ? data.error_message : "401 Authorization Required"
3659
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3063
3660
  };
3064
3661
  }
3065
3662
  }
@@ -3074,6 +3671,7 @@ class TransactionService {
3074
3671
  * - `quoteCurrency`: The currency to convert. Supports `USD`, `CAD`, `EUR`, `SGD`, `INR`, `JPY`, `VND`, `CNY`, `KRW`, `RUB`, `TRY`, `NGN`, `ARS`, `AUD`, `CHF`, and `GBP`.
3075
3672
  * - `noLogs`: Omit log events.
3076
3673
  * - `blockSignedAtAsc`: Sort the transactions in ascending chronological order. By default, it's set to `false` and returns transactions in descending chronological order.
3674
+ * - `withSafe`: Include safe details.
3077
3675
  *
3078
3676
  */
3079
3677
  async *getAllTransactionsForAddress(chainName, walletAddress, queryParamOpts) {
@@ -3091,6 +3689,9 @@ class TransactionService {
3091
3689
  if (queryParamOpts?.blockSignedAtAsc !== undefined) {
3092
3690
  urlParams.append("block-signed-at-asc", queryParamOpts?.blockSignedAtAsc.toString());
3093
3691
  }
3692
+ if (queryParamOpts?.withSafe !== undefined) {
3693
+ urlParams.append("with-safe", queryParamOpts?.withSafe.toString());
3694
+ }
3094
3695
  for await (tx of paginateEndpoint(`https://api.covalenthq.com/v1/${chainName}/address/${walletAddress}/transactions_v3/`, this.apiKey, urlParams, this.debug, this.threadCount)) {
3095
3696
  yield tx;
3096
3697
  }
@@ -3162,7 +3763,7 @@ class TransactionService {
3162
3763
  data: dataClass,
3163
3764
  error: data.error,
3164
3765
  error_code: data ? data.error_code : response.status,
3165
- error_message: data ? data.error_message : "401 Authorization Required"
3766
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3166
3767
  };
3167
3768
  }
3168
3769
  catch (error) {
@@ -3171,7 +3772,7 @@ class TransactionService {
3171
3772
  data: null,
3172
3773
  error: true,
3173
3774
  error_code: data ? data.error_code : response.status,
3174
- error_message: data ? data.error_message : "401 Authorization Required"
3775
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3175
3776
  };
3176
3777
  }
3177
3778
  }
@@ -3227,7 +3828,7 @@ class TransactionService {
3227
3828
  data: dataClass,
3228
3829
  error: data.error,
3229
3830
  error_code: data ? data.error_code : response.status,
3230
- error_message: data ? data.error_message : "401 Authorization Required"
3831
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3231
3832
  };
3232
3833
  }
3233
3834
  catch (error) {
@@ -3236,7 +3837,7 @@ class TransactionService {
3236
3837
  data: null,
3237
3838
  error: true,
3238
3839
  error_code: data ? data.error_code : response.status,
3239
- error_message: data ? data.error_message : "401 Authorization Required"
3840
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3240
3841
  };
3241
3842
  }
3242
3843
  }
@@ -3698,7 +4299,7 @@ class XykService {
3698
4299
  data: dataClass,
3699
4300
  error: data.error,
3700
4301
  error_code: data ? data.error_code : response.status,
3701
- error_message: data ? data.error_message : "401 Authorization Required"
4302
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3702
4303
  };
3703
4304
  }
3704
4305
  catch (error) {
@@ -3707,7 +4308,7 @@ class XykService {
3707
4308
  data: null,
3708
4309
  error: true,
3709
4310
  error_code: data ? data.error_code : response.status,
3710
- error_message: data ? data.error_message : "401 Authorization Required"
4311
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3711
4312
  };
3712
4313
  }
3713
4314
  }
@@ -3763,7 +4364,7 @@ class XykService {
3763
4364
  data: dataClass,
3764
4365
  error: data.error,
3765
4366
  error_code: data ? data.error_code : response.status,
3766
- error_message: data ? data.error_message : "401 Authorization Required"
4367
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3767
4368
  };
3768
4369
  }
3769
4370
  catch (error) {
@@ -3772,7 +4373,7 @@ class XykService {
3772
4373
  data: null,
3773
4374
  error: true,
3774
4375
  error_code: data ? data.error_code : response.status,
3775
- error_message: data ? data.error_message : "401 Authorization Required"
4376
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3776
4377
  };
3777
4378
  }
3778
4379
  }
@@ -3829,7 +4430,7 @@ class XykService {
3829
4430
  data: dataClass,
3830
4431
  error: data.error,
3831
4432
  error_code: data ? data.error_code : response.status,
3832
- error_message: data ? data.error_message : "401 Authorization Required"
4433
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3833
4434
  };
3834
4435
  }
3835
4436
  catch (error) {
@@ -3838,7 +4439,7 @@ class XykService {
3838
4439
  data: null,
3839
4440
  error: true,
3840
4441
  error_code: data ? data.error_code : response.status,
3841
- error_message: data ? data.error_message : "401 Authorization Required"
4442
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3842
4443
  };
3843
4444
  }
3844
4445
  }
@@ -3865,6 +4466,9 @@ class XykService {
3865
4466
  if (queryParamOpts?.quoteCurrency !== undefined) {
3866
4467
  urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
3867
4468
  }
4469
+ if (queryParamOpts?.dexName !== undefined) {
4470
+ urlParams.append("dex-name", queryParamOpts?.dexName.toString());
4471
+ }
3868
4472
  let startTime;
3869
4473
  if (this.debug) {
3870
4474
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
@@ -3900,7 +4504,7 @@ class XykService {
3900
4504
  data: dataClass,
3901
4505
  error: data.error,
3902
4506
  error_code: data ? data.error_code : response.status,
3903
- error_message: data ? data.error_message : "401 Authorization Required"
4507
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3904
4508
  };
3905
4509
  }
3906
4510
  catch (error) {
@@ -3909,7 +4513,7 @@ class XykService {
3909
4513
  data: null,
3910
4514
  error: true,
3911
4515
  error_code: data ? data.error_code : response.status,
3912
- error_message: data ? data.error_message : "401 Authorization Required"
4516
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3913
4517
  };
3914
4518
  }
3915
4519
  }
@@ -3966,7 +4570,7 @@ class XykService {
3966
4570
  data: dataClass,
3967
4571
  error: data.error,
3968
4572
  error_code: data ? data.error_code : response.status,
3969
- error_message: data ? data.error_message : "401 Authorization Required"
4573
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3970
4574
  };
3971
4575
  }
3972
4576
  catch (error) {
@@ -3975,7 +4579,7 @@ class XykService {
3975
4579
  data: null,
3976
4580
  error: true,
3977
4581
  error_code: data ? data.error_code : response.status,
3978
- error_message: data ? data.error_message : "401 Authorization Required"
4582
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
3979
4583
  };
3980
4584
  }
3981
4585
  }
@@ -4006,6 +4610,9 @@ class XykService {
4006
4610
  if (queryParamOpts?.quoteCurrency !== undefined) {
4007
4611
  urlParams.append("quote-currency", queryParamOpts?.quoteCurrency.toString());
4008
4612
  }
4613
+ if (queryParamOpts?.dexName !== undefined) {
4614
+ urlParams.append("dex-name", queryParamOpts?.dexName.toString());
4615
+ }
4009
4616
  let startTime;
4010
4617
  if (this.debug) {
4011
4618
  startTime = typeof performance !== 'undefined' ? performance.now() : process.hrtime();
@@ -4041,7 +4648,7 @@ class XykService {
4041
4648
  data: dataClass,
4042
4649
  error: data.error,
4043
4650
  error_code: data ? data.error_code : response.status,
4044
- error_message: data ? data.error_message : "401 Authorization Required"
4651
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4045
4652
  };
4046
4653
  }
4047
4654
  catch (error) {
@@ -4050,7 +4657,7 @@ class XykService {
4050
4657
  data: null,
4051
4658
  error: true,
4052
4659
  error_code: data ? data.error_code : response.status,
4053
- error_message: data ? data.error_message : "401 Authorization Required"
4660
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4054
4661
  };
4055
4662
  }
4056
4663
  }
@@ -4106,7 +4713,7 @@ class XykService {
4106
4713
  data: dataClass,
4107
4714
  error: data.error,
4108
4715
  error_code: data ? data.error_code : response.status,
4109
- error_message: data ? data.error_message : "401 Authorization Required"
4716
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4110
4717
  };
4111
4718
  }
4112
4719
  catch (error) {
@@ -4115,7 +4722,7 @@ class XykService {
4115
4722
  data: null,
4116
4723
  error: true,
4117
4724
  error_code: data ? data.error_code : response.status,
4118
- error_message: data ? data.error_message : "401 Authorization Required"
4725
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4119
4726
  };
4120
4727
  }
4121
4728
  }
@@ -4169,7 +4776,7 @@ class XykService {
4169
4776
  data: dataClass,
4170
4777
  error: data.error,
4171
4778
  error_code: data ? data.error_code : response.status,
4172
- error_message: data ? data.error_message : "401 Authorization Required"
4779
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4173
4780
  };
4174
4781
  }
4175
4782
  catch (error) {
@@ -4178,7 +4785,7 @@ class XykService {
4178
4785
  data: null,
4179
4786
  error: true,
4180
4787
  error_code: data ? data.error_code : response.status,
4181
- error_message: data ? data.error_message : "401 Authorization Required"
4788
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4182
4789
  };
4183
4790
  }
4184
4791
  }
@@ -4235,7 +4842,7 @@ class XykService {
4235
4842
  data: dataClass,
4236
4843
  error: data.error,
4237
4844
  error_code: data ? data.error_code : response.status,
4238
- error_message: data ? data.error_message : "401 Authorization Required"
4845
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4239
4846
  };
4240
4847
  }
4241
4848
  catch (error) {
@@ -4244,7 +4851,7 @@ class XykService {
4244
4851
  data: null,
4245
4852
  error: true,
4246
4853
  error_code: data ? data.error_code : response.status,
4247
- error_message: data ? data.error_message : "401 Authorization Required"
4854
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4248
4855
  };
4249
4856
  }
4250
4857
  }
@@ -4301,7 +4908,7 @@ class XykService {
4301
4908
  data: dataClass,
4302
4909
  error: data.error,
4303
4910
  error_code: data ? data.error_code : response.status,
4304
- error_message: data ? data.error_message : "401 Authorization Required"
4911
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4305
4912
  };
4306
4913
  }
4307
4914
  catch (error) {
@@ -4310,7 +4917,7 @@ class XykService {
4310
4917
  data: null,
4311
4918
  error: true,
4312
4919
  error_code: data ? data.error_code : response.status,
4313
- error_message: data ? data.error_message : "401 Authorization Required"
4920
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4314
4921
  };
4315
4922
  }
4316
4923
  }
@@ -4367,7 +4974,7 @@ class XykService {
4367
4974
  data: dataClass,
4368
4975
  error: data.error,
4369
4976
  error_code: data ? data.error_code : response.status,
4370
- error_message: data ? data.error_message : "401 Authorization Required"
4977
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4371
4978
  };
4372
4979
  }
4373
4980
  catch (error) {
@@ -4376,7 +4983,7 @@ class XykService {
4376
4983
  data: null,
4377
4984
  error: true,
4378
4985
  error_code: data ? data.error_code : response.status,
4379
- error_message: data ? data.error_message : "401 Authorization Required"
4986
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4380
4987
  };
4381
4988
  }
4382
4989
  }
@@ -4433,7 +5040,7 @@ class XykService {
4433
5040
  data: dataClass,
4434
5041
  error: data.error,
4435
5042
  error_code: data ? data.error_code : response.status,
4436
- error_message: data ? data.error_message : "401 Authorization Required"
5043
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4437
5044
  };
4438
5045
  }
4439
5046
  catch (error) {
@@ -4442,7 +5049,7 @@ class XykService {
4442
5049
  data: null,
4443
5050
  error: true,
4444
5051
  error_code: data ? data.error_code : response.status,
4445
- error_message: data ? data.error_message : "401 Authorization Required"
5052
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4446
5053
  };
4447
5054
  }
4448
5055
  }
@@ -4498,7 +5105,7 @@ class XykService {
4498
5105
  data: dataClass,
4499
5106
  error: data.error,
4500
5107
  error_code: data ? data.error_code : response.status,
4501
- error_message: data ? data.error_message : "401 Authorization Required"
5108
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4502
5109
  };
4503
5110
  }
4504
5111
  catch (error) {
@@ -4507,7 +5114,7 @@ class XykService {
4507
5114
  data: null,
4508
5115
  error: true,
4509
5116
  error_code: data ? data.error_code : response.status,
4510
- error_message: data ? data.error_message : "401 Authorization Required"
5117
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4511
5118
  };
4512
5119
  }
4513
5120
  }
@@ -4563,7 +5170,7 @@ class XykService {
4563
5170
  data: dataClass,
4564
5171
  error: data.error,
4565
5172
  error_code: data ? data.error_code : response.status,
4566
- error_message: data ? data.error_message : "401 Authorization Required"
5173
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4567
5174
  };
4568
5175
  }
4569
5176
  catch (error) {
@@ -4572,14 +5179,14 @@ class XykService {
4572
5179
  data: null,
4573
5180
  error: true,
4574
5181
  error_code: data ? data.error_code : response.status,
4575
- error_message: data ? data.error_message : "401 Authorization Required"
5182
+ error_message: data ? data.error_message : response.status === 500 ? "Internal server error" : "401 Authorization Required"
4576
5183
  };
4577
5184
  }
4578
5185
  }
4579
5186
  }
4580
5187
  }
4581
5188
 
4582
- const userAgent = "com.covalenthq.sdk.typescript/0.4.2";
5189
+ const userAgent = "com.covalenthq.sdk.typescript/0.5.0";
4583
5190
  /**
4584
5191
  * CovalentClient Class
4585
5192
  */