@tatumio/tatum
Version:
Tatum JS SDK
825 lines • 37.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Utils = void 0;
/* eslint-disable @typescript-eslint/no-explicit-any */
const bignumber_js_1 = require("bignumber.js");
const typedi_1 = require("typedi");
const package_json_1 = require("../../package.json");
const dto_1 = require("../dto");
const service_1 = require("../service");
const EvmArchiveLoadBalancerRpc_1 = require("../service/rpc/evm/EvmArchiveLoadBalancerRpc");
const EvmBeaconArchiveLoadBalancerRpc_1 = require("../service/rpc/evm/EvmBeaconArchiveLoadBalancerRpc");
const NativeEvmArchiveLoadBalancerRpc_1 = require("../service/rpc/evm/NativeEvmArchiveLoadBalancerRpc");
const TronLoadBalancerRpc_1 = require("../service/rpc/evm/TronLoadBalancerRpc");
const TronRpc_1 = require("../service/rpc/evm/TronRpc");
const ZkSyncLoadBalancerRpc_1 = require("../service/rpc/evm/ZkSyncLoadBalancerRpc");
const AlgorandAlgodLoadBalancerRpc_1 = require("../service/rpc/other/AlgorandAlgodLoadBalancerRpc");
const AlgorandIndexerLoadBalancerRpc_1 = require("../service/rpc/other/AlgorandIndexerLoadBalancerRpc");
const CardanoLoadBalancerRpc_1 = require("../service/rpc/other/CardanoLoadBalancerRpc");
const CasperLoadBalancerRpc_1 = require("../service/rpc/other/CasperLoadBalancerRpc");
const CosmosLoadBalancerRpc_1 = require("../service/rpc/other/CosmosLoadBalancerRpc");
const EosLoadBalancerRpc_1 = require("../service/rpc/other/EosLoadBalancerRpc");
const EosRpc_1 = require("../service/rpc/other/EosRpc");
const IotaLoadBalancerRpc_1 = require("../service/rpc/other/IotaLoadBalancerRpc");
const IotaRpc_1 = require("../service/rpc/other/IotaRpc");
const KadenaLoadBalancerRpc_1 = require("../service/rpc/other/KadenaLoadBalancerRpc");
const RostrumLoadBalancerRpc_1 = require("../service/rpc/other/RostrumLoadBalancerRpc");
const SolanaArchiveLoadBalancerRpc_1 = require("../service/rpc/other/SolanaArchiveLoadBalancerRpc");
const StellarLoadBalancerRpc_1 = require("../service/rpc/other/StellarLoadBalancerRpc");
const StellarRpc_1 = require("../service/rpc/other/StellarRpc");
const TezosLoadBalancerRpc_1 = require("../service/rpc/other/TezosLoadBalancerRpc");
const TonRpc_1 = require("../service/rpc/other/TonRpc");
const XrpLoadBalancerRpc_1 = require("../service/rpc/other/XrpLoadBalancerRpc");
const DogeLoadBalancedRpc_1 = require("../service/rpc/utxo/DogeLoadBalancedRpc");
const UtxoLoadBalancerRpc_1 = require("../service/rpc/utxo/UtxoLoadBalancerRpc");
const UtxoLoadBalancerRpcEstimateFee_1 = require("../service/rpc/utxo/UtxoLoadBalancerRpcEstimateFee");
const UtxoRpcEstimateFee_1 = require("../service/rpc/utxo/UtxoRpcEstimateFee");
const constant_1 = require("./constant");
const di_tokens_1 = require("./di.tokens");
exports.Utils = {
getRpc: (id, config) => {
const { network } = config;
if ((0, dto_1.isZkSyncNetwork)(network)) {
return typedi_1.Container.of(id).get(ZkSyncLoadBalancerRpc_1.ZkSyncLoadBalancerRpc);
}
if ((0, dto_1.isTonNetwork)(network)) {
return typedi_1.Container.of(id).get(TonRpc_1.TonRpc);
}
if ((0, dto_1.isCasperNetwork)(network)) {
return typedi_1.Container.of(id).get(CasperLoadBalancerRpc_1.CasperLoadBalancerRpc);
}
if ((0, dto_1.isCosmosNetwork)(network)) {
return typedi_1.Container.of(id).get(CosmosLoadBalancerRpc_1.CosmosLoadBalancerRpc);
}
if ((0, dto_1.isIotaLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(IotaLoadBalancerRpc_1.IotaLoadBalancerRpc);
}
if ((0, dto_1.isIotaNetwork)(network)) {
return typedi_1.Container.of(id).get(IotaRpc_1.IotaRpc);
}
if ((0, dto_1.isRostrumLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(RostrumLoadBalancerRpc_1.RostrumLoadBalancerRpc);
}
if ((0, dto_1.isKadenaLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(KadenaLoadBalancerRpc_1.KadenaLoadBalancerRpc);
}
if ((0, dto_1.isStellarLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(StellarLoadBalancerRpc_1.StellarLoadBalancerRpc);
}
if ((0, dto_1.isStellarNetwork)(network)) {
return typedi_1.Container.of(id).get(StellarRpc_1.StellarRpc);
}
if ((0, dto_1.isCardanoNetwork)(network)) {
return typedi_1.Container.of(id).get(CardanoLoadBalancerRpc_1.CardanoLoadBalancerRpc);
}
if ((0, dto_1.isAlgorandIndexerNetwork)(network)) {
return typedi_1.Container.of(id).get(AlgorandIndexerLoadBalancerRpc_1.AlgorandIndexerLoadBalancerRpc);
}
if ((0, dto_1.isAlgorandAlgodNetwork)(network)) {
return typedi_1.Container.of(id).get(AlgorandAlgodLoadBalancerRpc_1.AlgorandAlgodLoadBalancerRpc);
}
if ((0, dto_1.isTezosNetwork)(network)) {
return typedi_1.Container.of(id).get(TezosLoadBalancerRpc_1.TezosLoadBalancerRpc);
}
if ((0, dto_1.isDogecoinLoadBalancedNetwork)(network)) {
return typedi_1.Container.of(id).get(DogeLoadBalancedRpc_1.DogeLoadBalancedRpc);
}
if ((0, dto_1.isUtxoLoadBalancerEstimateFeeNetwork)(network)) {
return typedi_1.Container.of(id).get(UtxoLoadBalancerRpcEstimateFee_1.UtxoLoadBalancerRpcEstimateFee);
}
if ((0, dto_1.isUtxoEstimateFeeNetwork)(network)) {
return typedi_1.Container.of(id).get(UtxoRpcEstimateFee_1.UtxoRpcEstimateFee);
}
if ((0, dto_1.isUtxoLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(UtxoLoadBalancerRpc_1.UtxoLoadBalancerRpc);
}
if ((0, dto_1.isNativeEvmLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(NativeEvmArchiveLoadBalancerRpc_1.NativeEvmArchiveLoadBalancerRpc);
}
if ((0, dto_1.isEvmArchiveNonArchiveBeaconLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(EvmBeaconArchiveLoadBalancerRpc_1.EvmBeaconArchiveLoadBalancerRpc);
}
if ((0, dto_1.isEvmArchiveNonArchiveLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(EvmArchiveLoadBalancerRpc_1.EvmArchiveLoadBalancerRpc);
}
if ((0, dto_1.isEvmLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(service_1.EvmLoadBalancerRpc);
}
if ((0, dto_1.isEvmBasedNetwork)(network)) {
return typedi_1.Container.of(id).get(service_1.EvmRpc);
}
if ((0, dto_1.isUtxoBasedNetwork)(network)) {
return typedi_1.Container.of(id).get(service_1.UtxoRpc);
}
if ((0, dto_1.isXrpNetwork)(network)) {
return typedi_1.Container.of(id).get(XrpLoadBalancerRpc_1.XrpLoadBalancerRpc);
}
if ((0, dto_1.isSolanaNetwork)(network)) {
return typedi_1.Container.of(id).get(SolanaArchiveLoadBalancerRpc_1.SolanaArchiveLoadBalancerRpc);
}
if ((0, dto_1.isTronLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(TronLoadBalancerRpc_1.TronLoadBalancerRpc);
}
if ((0, dto_1.isTronNetwork)(network)) {
return typedi_1.Container.of(id).get(TronRpc_1.TronRpc);
}
if ((0, dto_1.isEosLoadBalancerNetwork)(network)) {
return typedi_1.Container.of(id).get(EosLoadBalancerRpc_1.EosLoadBalancerRpc);
}
if ((0, dto_1.isEosNetwork)(network)) {
return typedi_1.Container.of(id).get(EosRpc_1.EosRpc);
}
typedi_1.Container.of(id).get(di_tokens_1.LOGGER).warn(`RPC Network ${network} is not supported.`);
return typedi_1.Container.of(id).get(service_1.GenericRpc);
},
getRpcListUrl: (network) => {
const mappedNetwork = exports.Utils.mapRpcListUrl(network);
return [
`https://rpc.tatum.io/${mappedNetwork}/list.json`,
`https://rpc.tatum.io/${mappedNetwork}-archive/list.json`,
];
},
mapRpcListUrl: (network) => {
const mappedNetwork = dto_1.MAPPED_NETWORK[network];
return mappedNetwork ?? network;
},
getStatusPayload: (network) => {
if ((0, dto_1.isCasperNetwork)(network)) {
return {
jsonrpc: '2.0',
method: 'info_get_status_result',
params: [],
id: 1,
};
}
if ((0, dto_1.isRostrumLoadBalancerNetwork)(network)) {
return {
jsonrpc: '2.0',
method: 'blockchain.headers.tip',
params: [],
id: 1,
};
}
if ((0, dto_1.isXrpNetwork)(network)) {
return {
method: 'ledger',
params: [
{
ledger_index: 'current',
transactions: false,
expand: false,
owner_funds: false,
},
],
id: 1,
jsonrpc: '2.0',
};
}
if ((0, dto_1.isUtxoBasedNetwork)(network)) {
return {
jsonrpc: '2.0',
method: 'getblockcount',
params: [],
id: 1,
};
}
if ((0, dto_1.isEvmBasedNetwork)(network) || (0, dto_1.isTronNetwork)(network)) {
return {
jsonrpc: '2.0',
method: 'eth_blockNumber',
params: [],
id: 1,
};
}
if ((0, dto_1.isSolanaNetwork)(network)) {
return {
jsonrpc: '2.0',
method: 'getBlockHeight',
params: [],
id: 1,
};
}
if ((0, dto_1.isCardanoNetwork)(network)) {
return {
network_identifier: {
blockchain: dto_1.Network.COSMOS_ROSETTA === network ? 'cosmos' : 'cardano',
network: dto_1.Network.CARDANO_ROSETTA === network ? 'mainnet' : 'preprod',
},
};
}
if ((0, dto_1.isEosNetwork)(network) ||
(0, dto_1.isTezosNetwork)(network) ||
(0, dto_1.isAlgorandAlgodNetwork)(network) ||
(0, dto_1.isAlgorandIndexerNetwork)(network) ||
(0, dto_1.isStellarLoadBalancerNetwork)(network) ||
(0, dto_1.isKadenaLoadBalancerNetwork)(network) ||
(0, dto_1.isIotaLoadBalancerNetwork)(network) ||
(0, dto_1.isTonNetwork)(network)) {
return null;
}
throw new Error(`Network ${network} is not supported.`);
},
getStatusUrl(network, url) {
if ((0, dto_1.isTonNetwork)(network)) {
return `${url}v2/liteserver/get_masterchain_info`;
}
if ((0, dto_1.isIotaLoadBalancerNetwork)(network)) {
return `${url}api/core/v2/info`;
}
if ((0, dto_1.isEosNetwork)(network)) {
return `${url}${constant_1.Constant.EOS_PREFIX}get_info`;
}
if ((0, dto_1.isAlgorandAlgodNetwork)(network)) {
return `${url}v2/status`;
}
if ((0, dto_1.isAlgorandIndexerNetwork)(network)) {
return `${url}health`;
}
if ((0, dto_1.isCardanoNetwork)(network)) {
return `${url}network/status`;
}
if ((0, dto_1.isCasperNetwork)(network)) {
return `${url}/rpc`;
}
if ((0, dto_1.isXrpNetwork)(network)) {
return url;
}
if ((0, dto_1.isSameGetBlockNetwork)(network)) {
return url;
}
if ((0, dto_1.isRostrumLoadBalancerNetwork)(network)) {
return url;
}
if ((0, dto_1.isTezosNetwork)(network)) {
return `${url}chains/main/blocks/head/header`;
}
if ((0, dto_1.isStellarLoadBalancerNetwork)(network)) {
return `${url}fee_stats`;
}
if ((0, dto_1.isKadenaLoadBalancerNetwork)(network)) {
return `${url}chainweb/0.0/mainnet01/cut`;
}
throw new Error(`Network ${network} is not supported.`);
},
getStatusMethod(network) {
if ((0, dto_1.isTezosNetwork)(network) ||
(0, dto_1.isAlgorandAlgodNetwork)(network) ||
(0, dto_1.isAlgorandIndexerNetwork)(network) ||
(0, dto_1.isStellarLoadBalancerNetwork)(network) ||
(0, dto_1.isKadenaLoadBalancerNetwork)(network) ||
(0, dto_1.isIotaLoadBalancerNetwork)(network) ||
(0, dto_1.isTonNetwork)(network)) {
return 'GET';
}
return 'POST';
},
parseStatusPayload: (network, response) => {
if ((0, dto_1.isTonNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.last.seqno || -1).toNumber();
}
if ((0, dto_1.isCasperNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.result.last_added_block_info.height || -1).toNumber();
}
if ((0, dto_1.isSameGetBlockNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.result || -1).toNumber();
}
if ((0, dto_1.isEosNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.head_block_num || -1).toNumber();
}
if ((0, dto_1.isTezosNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.level || -1).toNumber();
}
if ((0, dto_1.isAlgorandAlgodNetwork)(network)) {
return new bignumber_js_1.BigNumber(response['last-round'] || -1).toNumber();
}
if ((0, dto_1.isAlgorandIndexerNetwork)(network)) {
return new bignumber_js_1.BigNumber(response['round'] || -1).toNumber();
}
if ((0, dto_1.isCardanoNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.current_block_identifier.index || -1).toNumber();
}
if ((0, dto_1.isStellarLoadBalancerNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.last_ledger || -1).toNumber();
}
if ((0, dto_1.isXrpNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.result.ledger_current_index || -1).toNumber();
}
if ((0, dto_1.isKadenaLoadBalancerNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.hashes[0].height || -1).toNumber();
}
if ((0, dto_1.isRostrumLoadBalancerNetwork)(network)) {
return new bignumber_js_1.BigNumber(response.result.height || -1).toNumber();
}
if ((0, dto_1.isIotaLoadBalancerNetwork)(network)) {
return new bignumber_js_1.BigNumber(response?.status?.latestMilestone?.index || -1).toNumber();
}
throw new Error(`Network ${network} is not supported.`);
},
isResponseOk: (network, response) => {
if ((0, dto_1.isTonNetwork)(network)) {
return response.last.seqno !== undefined;
}
if ((0, dto_1.isCasperNetwork)(network)) {
return response.result.last_added_block_info.height !== undefined;
}
if ((0, dto_1.isEosNetwork)(network)) {
return response.head_block_num !== undefined;
}
if ((0, dto_1.isSameGetBlockNetwork)(network)) {
return response.result !== undefined;
}
if ((0, dto_1.isTezosNetwork)(network)) {
return response.level !== undefined;
}
if ((0, dto_1.isAlgorandAlgodNetwork)(network)) {
return response['last-round'] !== undefined;
}
if ((0, dto_1.isAlgorandIndexerNetwork)(network)) {
return response['round'] !== undefined;
}
if ((0, dto_1.isStellarLoadBalancerNetwork)(network)) {
return response.last_ledger !== undefined;
}
if ((0, dto_1.isCardanoNetwork)(network)) {
return response.current_block_identifier.index !== undefined;
}
if ((0, dto_1.isXrpNetwork)(network)) {
return response.result.ledger_current_index !== undefined;
}
if ((0, dto_1.isKadenaLoadBalancerNetwork)(network)) {
return response?.hashes?.[0]?.height !== undefined;
}
if ((0, dto_1.isRostrumLoadBalancerNetwork)(network)) {
return response?.result?.height !== undefined;
}
if ((0, dto_1.isIotaLoadBalancerNetwork)(network)) {
return response?.status?.latestMilestone?.index !== undefined;
}
throw new Error(`Network ${network} is not supported.`);
},
mapNotificationChainToNetwork: (chain) => {
switch (chain) {
case dto_1.AddressEventNotificationChain.BTC:
return dto_1.Network.BITCOIN;
case dto_1.AddressEventNotificationChain.BCH:
return dto_1.Network.BITCOIN_CASH;
case dto_1.AddressEventNotificationChain.LTC:
return dto_1.Network.LITECOIN;
case dto_1.AddressEventNotificationChain.DOGE:
return dto_1.Network.DOGECOIN;
case dto_1.AddressEventNotificationChain.ETH:
return dto_1.Network.ETHEREUM;
case dto_1.AddressEventNotificationChain.MATIC:
return dto_1.Network.POLYGON;
case dto_1.AddressEventNotificationChain.CELO:
return dto_1.Network.CELO;
case dto_1.AddressEventNotificationChain.SOL:
return dto_1.Network.SOLANA;
case dto_1.AddressEventNotificationChain.XRP:
return dto_1.Network.XRP;
case dto_1.AddressEventNotificationChain.BSC:
return dto_1.Network.BINANCE_SMART_CHAIN;
case dto_1.AddressEventNotificationChain.TRON:
return dto_1.Network.TRON;
case dto_1.AddressEventNotificationChain.KLAY:
return dto_1.Network.KLAYTN;
case dto_1.AddressEventNotificationChain.EON:
return dto_1.Network.HORIZEN_EON;
case dto_1.AddressEventNotificationChain.CHZ:
return dto_1.Network.CHILIZ;
case dto_1.AddressEventNotificationChain.FLR:
return dto_1.Network.FLARE;
case dto_1.AddressEventNotificationChain.BASE:
return dto_1.Network.BASE;
case dto_1.AddressEventNotificationChain.AVAX:
return dto_1.Network.AVALANCHE_C;
case dto_1.AddressEventNotificationChain.BERA:
return dto_1.Network.BERACHAIN_MAINNET;
default:
throw new Error(`Chain ${chain} is not supported.`);
}
},
mapNetworkToNotificationChain: (network) => {
switch (network) {
case dto_1.Network.BITCOIN:
case dto_1.Network.BITCOIN_TESTNET:
case dto_1.Network.BITCOIN_TESTNET_4:
return dto_1.AddressEventNotificationChain.BTC;
case dto_1.Network.BITCOIN_CASH:
case dto_1.Network.BITCOIN_CASH_TESTNET:
return dto_1.AddressEventNotificationChain.BCH;
case dto_1.Network.LITECOIN:
case dto_1.Network.LITECOIN_TESTNET:
return dto_1.AddressEventNotificationChain.LTC;
case dto_1.Network.DOGECOIN:
case dto_1.Network.DOGECOIN_TESTNET:
return dto_1.AddressEventNotificationChain.DOGE;
case dto_1.Network.ETHEREUM:
case dto_1.Network.ETHEREUM_SEPOLIA:
case dto_1.Network.ETHEREUM_HOLESKY:
return dto_1.AddressEventNotificationChain.ETH;
case dto_1.Network.POLYGON:
case dto_1.Network.POLYGON_AMOY:
return dto_1.AddressEventNotificationChain.MATIC;
case dto_1.Network.CELO:
case dto_1.Network.CELO_ALFAJORES:
return dto_1.AddressEventNotificationChain.CELO;
case dto_1.Network.SOLANA:
case dto_1.Network.SOLANA_DEVNET:
return dto_1.AddressEventNotificationChain.SOL;
case dto_1.Network.XRP:
case dto_1.Network.XRP_TESTNET:
return dto_1.AddressEventNotificationChain.XRP;
case dto_1.Network.BINANCE_SMART_CHAIN:
case dto_1.Network.BINANCE_SMART_CHAIN_TESTNET:
return dto_1.AddressEventNotificationChain.BSC;
case dto_1.Network.TRON:
case dto_1.Network.TRON_SHASTA:
return dto_1.AddressEventNotificationChain.TRON;
case dto_1.Network.KLAYTN:
case dto_1.Network.KLAYTN_BAOBAB:
return dto_1.AddressEventNotificationChain.KLAY;
case dto_1.Network.TEZOS:
return dto_1.AddressEventNotificationChain.TEZOS;
case dto_1.Network.HORIZEN_EON:
return dto_1.AddressEventNotificationChain.EON;
case dto_1.Network.CHILIZ:
return dto_1.AddressEventNotificationChain.CHZ;
case dto_1.Network.FLARE:
case dto_1.Network.FLARE_COSTON:
case dto_1.Network.FLARE_COSTON_2:
case dto_1.Network.FLARE_SONGBIRD:
return dto_1.AddressEventNotificationChain.FLR;
case dto_1.Network.CRONOS:
case dto_1.Network.CRONOS_TESTNET:
return dto_1.AddressEventNotificationChain.CRO;
case dto_1.Network.BASE:
case dto_1.Network.BASE_SEPOLIA:
return dto_1.AddressEventNotificationChain.BASE;
case dto_1.Network.AVALANCHE_C:
case dto_1.Network.AVALANCHE_C_TESTNET:
return dto_1.AddressEventNotificationChain.AVAX;
case dto_1.Network.FANTOM:
case dto_1.Network.FANTOM_TESTNET:
return dto_1.AddressEventNotificationChain.FTM;
case dto_1.Network.OPTIMISM:
case dto_1.Network.OPTIMISM_TESTNET:
return dto_1.AddressEventNotificationChain.OPTIMISM;
case dto_1.Network.BERACHAIN_MAINNET:
return dto_1.AddressEventNotificationChain.BERA;
default:
throw new Error(`Network ${network} is not supported.`);
}
},
delay: (t) => new Promise((resolve) => setTimeout(resolve, t)),
retryWithTimeout: async (action, timeoutInMs = 10000, delayInMs = 500) => {
const startTime = Date.now();
let lastError = null;
while (timeoutInMs + startTime > Date.now()) {
try {
const result = await action();
if (result === null || result === undefined) {
throw new Error('Null result');
}
return result;
}
catch (e) {
lastError = e;
await exports.Utils.delay(delayInMs);
}
}
throw lastError ?? new Error('Retry timeout failed');
},
fetchWithTimeoutAndRetry: async (url, containerId, config, timeout = 5000, retry = 2) => {
let lastError = null;
for (let i = 0; i < retry; i++) {
try {
const { response, responseTime } = await exports.Utils.fetchWithTimeout(url, containerId, config, timeout);
return { response, responseTime };
}
catch (e) {
lastError = e;
}
}
throw lastError ?? new Error('Retry timeout failed');
},
fetchWithTimeout: async (url, containerId, config, timeout = 5000) => {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
const start = Date.now();
const response = await fetch(url, {
...config,
signal: controller.signal,
headers: exports.Utils.getHeaders(containerId),
});
const responseTime = Date.now() - start;
clearTimeout(id);
return { responseTime, response };
},
headersToJson(headers) {
const headersObj = {};
headers.forEach((value, key) => {
headersObj[key] = value;
});
return JSON.stringify(headersObj);
},
getHeaders: (id) => {
const basicHeaders = exports.Utils.getBasicHeaders(id);
basicHeaders.set('Content-Type', 'application/json');
return basicHeaders;
},
getBasicHeaders: (id) => {
const config = typedi_1.Container.of(id).get(di_tokens_1.CONFIG);
const headers = new Headers({
'x-ttm-sdk-version': package_json_1.version,
'x-ttm-sdk-product': 'JS',
'x-ttm-sdk-debug': `${config.verbose}`,
});
const apiKeyHeader = 'x-api-key';
if (config.apiKey) {
if (typeof config.apiKey === 'string') {
headers.append(apiKeyHeader, config.apiKey);
}
else if (config.version === service_1.ApiVersion.V3 && config.apiKey.v3) {
headers.append(apiKeyHeader, config.apiKey.v3);
}
else if (config.version === service_1.ApiVersion.V4 && config.apiKey.v4) {
headers.append(apiKeyHeader, config.apiKey.v4);
}
}
return headers;
},
padWithZero: (data, length = 64) => data.replace('0x', '').padStart(length, '0'),
camelToSnakeCase: (str) => str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`),
camelToDashCase: (str) => str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),
identity: (x) => x,
convertObjectWithStrategy: (obj, strategy) => {
if (Array.isArray(obj)) {
return obj.map(exports.Utils.convertObjCamelToSnake);
}
const snakeObj = {};
for (const [key, value] of Object.entries(obj)) {
const snakeKey = strategy(key);
if (value instanceof bignumber_js_1.BigNumber) {
snakeObj[snakeKey] = value.toNumber();
}
else if (typeof value === 'object' && value !== null) {
snakeObj[snakeKey] = exports.Utils.convertObjectWithStrategy(value, strategy);
}
else {
snakeObj[snakeKey] = value;
}
}
return snakeObj;
},
convertObjCamelToSnake: (obj) => exports.Utils.convertObjectWithStrategy(obj, exports.Utils.camelToSnakeCase),
convertObjCamelToDash: (obj) => exports.Utils.convertObjectWithStrategy(obj, exports.Utils.camelToDashCase),
getClient: (id, network) => {
switch (network) {
case dto_1.Network.BITCOIN:
case dto_1.Network.BITCOIN_TESTNET:
case dto_1.Network.BITCOIN_TESTNET_4:
return new service_1.Bitcoin(id);
case dto_1.Network.LITECOIN:
case dto_1.Network.LITECOIN_TESTNET:
return new service_1.Litecoin(id);
case dto_1.Network.DOGECOIN:
case dto_1.Network.DOGECOIN_TESTNET:
return new service_1.Dogecoin(id);
case dto_1.Network.BITCOIN_CASH:
case dto_1.Network.BITCOIN_CASH_TESTNET:
return new service_1.BitcoinCash(id);
case dto_1.Network.ZCASH:
case dto_1.Network.ZCASH_TESTNET:
return new service_1.ZCash(id);
case dto_1.Network.ETHEREUM:
case dto_1.Network.ETHEREUM_SEPOLIA:
case dto_1.Network.ETHEREUM_HOLESKY:
return new service_1.Ethereum(id);
case dto_1.Network.ETHEREUM_CLASSIC:
return new service_1.EthereumClassic(id);
case dto_1.Network.ARBITRUM_NOVA:
case dto_1.Network.ARBITRUM_NOVA_TESTNET:
return new service_1.ArbitrumNova(id);
case dto_1.Network.ARBITRUM_ONE:
return new service_1.ArbitrumOne(id);
case dto_1.Network.AURORA:
case dto_1.Network.AURORA_TESTNET:
return new service_1.Aurora(id);
case dto_1.Network.AVALANCHE_C:
case dto_1.Network.AVALANCHE_C_TESTNET:
case dto_1.Network.AVALANCHE_P:
case dto_1.Network.AVALANCHE_P_TESTNET:
case dto_1.Network.AVALANCHE_X:
case dto_1.Network.AVALANCHE_X_TESTNET:
return new service_1.AvalancheC(id);
case dto_1.Network.BINANCE_SMART_CHAIN:
case dto_1.Network.BINANCE_SMART_CHAIN_TESTNET:
return new service_1.BinanceSmartChain(id);
case dto_1.Network.CELO:
case dto_1.Network.CELO_ALFAJORES:
return new service_1.Celo(id);
case dto_1.Network.CRONOS:
case dto_1.Network.CRONOS_TESTNET:
return new service_1.Cronos(id);
case dto_1.Network.FANTOM:
case dto_1.Network.FANTOM_TESTNET:
return new service_1.Fantom(id);
case dto_1.Network.GNOSIS:
case dto_1.Network.GNOSIS_TESTNET:
return new service_1.Gnosis(id);
case dto_1.Network.HARMONY_ONE_SHARD_0:
case dto_1.Network.HARMONY_ONE_TESTNET_SHARD_0:
return new service_1.HarmonyOne(id);
case dto_1.Network.HAQQ:
case dto_1.Network.HAQQ_TESTNET:
return new service_1.Haqq(id);
case dto_1.Network.FLARE:
case dto_1.Network.FLARE_COSTON:
case dto_1.Network.FLARE_COSTON_2:
case dto_1.Network.FLARE_SONGBIRD:
return new service_1.Flare(id);
case dto_1.Network.KLAYTN:
case dto_1.Network.KLAYTN_BAOBAB:
return new service_1.Klaytn(id);
case dto_1.Network.KUCOIN:
case dto_1.Network.KUCOIN_TESTNET:
return new service_1.Kucoin(id);
case dto_1.Network.OASIS:
case dto_1.Network.OASIS_TESTNET:
return new service_1.Oasis(id);
case dto_1.Network.OPTIMISM:
case dto_1.Network.OPTIMISM_TESTNET:
return new service_1.Optimism(id);
case dto_1.Network.PALM:
case dto_1.Network.PALM_TESTNET:
return new service_1.Palm(id);
case dto_1.Network.POLYGON:
case dto_1.Network.POLYGON_AMOY:
return new service_1.Polygon(id);
case dto_1.Network.VECHAIN:
case dto_1.Network.VECHAIN_TESTNET:
return new service_1.Vechain(id);
case dto_1.Network.XINFIN:
case dto_1.Network.XINFIN_TESTNET:
return new service_1.XinFin(id);
case dto_1.Network.XRP:
case dto_1.Network.XRP_TESTNET:
return new service_1.Xrp(id);
case dto_1.Network.SOLANA:
case dto_1.Network.SOLANA_DEVNET:
return new service_1.Solana(id);
case dto_1.Network.TRON:
case dto_1.Network.TRON_SHASTA:
return new service_1.Tron(id);
case dto_1.Network.TEZOS:
case dto_1.Network.TEZOS_TESTNET:
return new service_1.Tezos(id);
case dto_1.Network.HORIZEN_EON:
case dto_1.Network.HORIZEN_EON_GOBI:
return new service_1.HorizenEon(id);
case dto_1.Network.EOS:
case dto_1.Network.EOS_TESTNET:
return new service_1.Eos(id);
case dto_1.Network.CHILIZ:
return new service_1.Chiliz(id);
case dto_1.Network.ALGORAND_ALGOD:
case dto_1.Network.ALGORAND_ALGOD_TESTNET:
return new service_1.AlgorandAlgod(id);
case dto_1.Network.ALGORAND_INDEXER:
case dto_1.Network.ALGORAND_INDEXER_TESTNET:
return new service_1.AlgorandIndexer(id);
case dto_1.Network.CARDANO_ROSETTA:
case dto_1.Network.CARDANO_ROSETTA_PREPROD:
return new service_1.CardanoRosetta(id);
case dto_1.Network.COSMOS_ROSETTA:
return new service_1.CosmosRosetta(id);
case dto_1.Network.STELLAR:
case dto_1.Network.STELLAR_TESTNET:
return new service_1.Stellar(id);
case dto_1.Network.BASE:
case dto_1.Network.BASE_SEPOLIA:
return new service_1.Base(id);
case dto_1.Network.RONIN:
case dto_1.Network.RONIN_SAIGON:
return new service_1.Ronin(id);
case dto_1.Network.SONIC_BLAZE:
case dto_1.Network.SONIC_MAINNET:
return new service_1.Sonic(id);
case dto_1.Network.KAIA_MAINNET:
case dto_1.Network.KAIA_KAIROS:
return new service_1.Kaia(id);
case dto_1.Network.BERACHAIN_MAINNET:
return new service_1.Berachain(id);
case dto_1.Network.KADENA:
case dto_1.Network.KADENA_TESTNET:
return new service_1.Kadena(id);
case dto_1.Network.ROSTRUM:
case dto_1.Network.ROSTRUM_TESTNET:
return new service_1.Rostrum(id);
case dto_1.Network.IOTA:
case dto_1.Network.IOTA_TESTNET:
return new service_1.Iota(id);
case dto_1.Network.BITCOIN_ELECTRS:
case dto_1.Network.BITCOIN_ELECTRS_TESTNET:
return new service_1.BitcoinElectrs(id);
case dto_1.Network.CASPER:
return new service_1.Casper(id);
case dto_1.Network.TON:
case dto_1.Network.TON_TESTNET:
return new service_1.Ton(id);
case dto_1.Network.ZK_SYNC:
case dto_1.Network.ZK_SYNC_TESTNET:
return new service_1.ZkSync(id);
default:
return new service_1.FullSdk(id);
}
},
/**
* Log message to console if verbose mode is enabled.
* @deprecated Use `Container.of(id).get(LOGGER)` instead.
*/
log: ({ id, message, data, mode }) => {
const config = typedi_1.Container.of(id).get(di_tokens_1.CONFIG);
if (config.verbose) {
if (data) {
if (mode === 'table') {
console.table(data);
}
else {
console.debug(new Date().toISOString(), message, data);
}
}
else {
console.debug(new Date().toISOString(), message);
}
}
},
prepareRpcCall: (method, params, id = 1) => {
return {
jsonrpc: '2.0',
id,
method,
params,
};
},
deepMerge(target, source) {
const isObject = (obj) => typeof obj === 'object' && obj !== null;
if (!isObject(target) || !isObject(source)) {
return source;
}
const output = { ...target };
Object.keys(source).forEach((key) => {
const targetValue = output[key];
const sourceValue = source[key];
if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
output[key] = [...targetValue, ...sourceValue];
}
else if (isObject(targetValue) && isObject(sourceValue)) {
output[key] = exports.Utils.deepMerge(targetValue, sourceValue);
}
else {
output[key] = sourceValue;
}
});
return output;
},
getV3RpcUrl: (config, path) => {
const { apiKey, rpc, network } = config;
if (apiKey) {
const url = rpc?.nodes?.[0].url ||
`${constant_1.Constant.TATUM_API_URL.V3}blockchain/node/${network}/${typeof apiKey === 'string' ? apiKey : apiKey.v3 || apiKey.v4}`;
return url.concat(path || '');
}
return rpc?.nodes?.[0].url || `${constant_1.Constant.TATUM_API_URL.V3}blockchain/node/${network}`.concat(path || '');
},
addQueryParams: ({ basePath, strategy, queryParams, }) => {
let queryString = '';
if (queryParams) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const query = exports.Utils.convertObjectWithStrategy(queryParams, strategy ?? exports.Utils.identity);
const params = [];
Object.entries(query).forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach((val) => {
if (val != null) {
params.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`);
}
});
}
else {
if (value != null) {
params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
}
}
});
if (params.length > 0) {
queryString = '?' + params.join('&');
}
}
return basePath + queryString;
},
removeLastSlash: (url) => url.replace(/\/$/, ''),
};
//# sourceMappingURL=util.shared.js.map