@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.
- package/README.md +60 -39
- package/dist/cjs/index.js +687 -80
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/services/BalanceService.d.ts +100 -0
- package/dist/cjs/services/CovalentClient.d.ts +1 -1
- package/dist/cjs/services/NftService.d.ts +137 -1
- package/dist/cjs/services/SecurityService.d.ts +62 -0
- package/dist/cjs/services/TransactionService.d.ts +17 -0
- package/dist/cjs/services/XykService.d.ts +4 -0
- package/dist/cjs/util/types/BalanceServiceTypes.d.ts +38 -0
- package/dist/cjs/util/types/NftServiceTypes.d.ts +76 -0
- package/dist/cjs/util/types/SecurityServiceTypes.d.ts +50 -0
- package/dist/cjs/util/types/TransactionServiceTypes.d.ts +10 -0
- package/dist/es/index.js +687 -80
- package/dist/es/index.js.map +1 -1
- package/dist/es/services/BalanceService.d.ts +100 -0
- package/dist/es/services/CovalentClient.d.ts +1 -1
- package/dist/es/services/NftService.d.ts +137 -1
- package/dist/es/services/SecurityService.d.ts +62 -0
- package/dist/es/services/TransactionService.d.ts +17 -0
- package/dist/es/services/XykService.d.ts +4 -0
- package/dist/es/util/types/BalanceServiceTypes.d.ts +38 -0
- package/dist/es/util/types/NftServiceTypes.d.ts +76 -0
- package/dist/es/util/types/SecurityServiceTypes.d.ts +50 -0
- package/dist/es/util/types/TransactionServiceTypes.d.ts +10 -0
- package/dist/esm/index.js +687 -80
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/services/BalanceService.d.ts +100 -0
- package/dist/esm/services/CovalentClient.d.ts +1 -1
- package/dist/esm/services/NftService.d.ts +137 -1
- package/dist/esm/services/SecurityService.d.ts +62 -0
- package/dist/esm/services/TransactionService.d.ts +17 -0
- package/dist/esm/services/XykService.d.ts +4 -0
- package/dist/esm/util/types/BalanceServiceTypes.d.ts +38 -0
- package/dist/esm/util/types/NftServiceTypes.d.ts +76 -0
- package/dist/esm/util/types/SecurityServiceTypes.d.ts +50 -0
- package/dist/esm/util/types/TransactionServiceTypes.d.ts +10 -0
- package/dist/services/BalanceService.d.ts +100 -0
- package/dist/services/BalanceService.js +193 -6
- package/dist/services/BalanceService.js.map +1 -1
- package/dist/services/BaseService.js +12 -12
- package/dist/services/BaseService.js.map +1 -1
- package/dist/services/CovalentClient.d.ts +1 -1
- package/dist/services/CovalentClient.js +1 -1
- package/dist/services/NftService.d.ts +137 -1
- package/dist/services/NftService.js +294 -16
- package/dist/services/NftService.js.map +1 -1
- package/dist/services/PricingService.js +2 -2
- package/dist/services/PricingService.js.map +1 -1
- package/dist/services/SecurityService.d.ts +62 -0
- package/dist/services/SecurityService.js +103 -2
- package/dist/services/SecurityService.js.map +1 -1
- package/dist/services/TransactionService.d.ts +17 -0
- package/dist/services/TransactionService.js +23 -7
- package/dist/services/TransactionService.js.map +1 -1
- package/dist/services/XykService.d.ts +4 -0
- package/dist/services/XykService.js +34 -28
- package/dist/services/XykService.js.map +1 -1
- package/dist/util/ApiHelpers.js +1 -1
- package/dist/util/ApiHelpers.js.map +1 -1
- package/dist/util/types/BalanceServiceTypes.d.ts +38 -0
- package/dist/util/types/NftServiceTypes.d.ts +76 -0
- package/dist/util/types/SecurityServiceTypes.d.ts +50 -0
- package/dist/util/types/TransactionServiceTypes.d.ts +10 -0
- 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}/
|
|
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
|
|
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.
|
|
5189
|
+
const userAgent = "com.covalenthq.sdk.typescript/0.5.0";
|
|
4583
5190
|
/**
|
|
4584
5191
|
* CovalentClient Class
|
|
4585
5192
|
*/
|