UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

124 lines 11.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Blockchair = exports.broadcastTransaction = void 0; const axios_1 = __importDefault(require("axios")); const utxo_1 = require("../../lib/utxo"); const timeout_1 = require("./timeout"); const fetchUTXO = (network) => async (txHash, vOut) => { const url = `https://api.blockchair.com/${network}/dashboards/transaction/${txHash}`; const response = (await axios_1.default.get(`${url}`, { timeout: timeout_1.DEFAULT_TIMEOUT, })).data; if (!response.data[txHash]) { throw new Error(`Transaction not found.`); } const tx = response.data[txHash]; let latestBlock = response.context.state; if (latestBlock === 0) { const statsUrl = `https://api.blockchair.com/${network}/stats`; const statsResponse = (await axios_1.default.get(statsUrl)).data; latestBlock = statsResponse.data.blocks - 1; } const confirmations = tx.transaction.block_id === -1 ? 0 : Math.max(latestBlock - tx.transaction.block_id + 1, 0); return { txHash, vOut, amount: tx.outputs[vOut].value, confirmations, }; }; const fetchUTXOs = (network) => async (address, confirmations) => { const url = `https://api.blockchair.com/${network}/dashboards/address/${address}?limit=0,100`; const response = (await axios_1.default.get(url, { timeout: timeout_1.DEFAULT_TIMEOUT })).data; let latestBlock = response.context.state; if (latestBlock === 0) { const statsUrl = `https://api.blockchair.com/${network}/stats`; const statsResponse = (await axios_1.default.get(statsUrl)).data; latestBlock = statsResponse.data.blocks - 1; } return response.data[address].utxo .map((utxo) => ({ txHash: utxo.transaction_hash, amount: utxo.value, vOut: utxo.index, confirmations: utxo.block_id === -1 ? 0 : latestBlock - utxo.block_id + 1, })) .filter((utxo) => confirmations === 0 || utxo.confirmations >= confirmations) .sort(utxo_1.sortUTXOs); }; const fetchTXs = (network) => async (address, confirmations = 0, limit = 25) => { const url = `https://api.blockchair.com/${network}/dashboards/address/${address}?limit=${limit},0`; const response = (await axios_1.default.get(url, { timeout: timeout_1.DEFAULT_TIMEOUT })).data; let latestBlock = response.context.state; if (latestBlock === 0) { const statsUrl = `https://api.blockchair.com/${network}/stats`; const statsResponse = (await axios_1.default.get(statsUrl)).data; latestBlock = statsResponse.data.blocks - 1; } const txHashes = response.data[address].transactions; let txDetails = {}; // Fetch in sets of 10 for (let i = 0; i < Math.ceil(txHashes.length / 10); i++) { const txUrl = `https://api.blockchair.com/${network}/dashboards/transactions/${txHashes .slice(i * 10, (i + 1) * 10) .join(",")}`; const txResponse = (await axios_1.default.get(txUrl, { timeout: timeout_1.DEFAULT_TIMEOUT, })).data; txDetails = Object.assign(Object.assign({}, txDetails), txResponse.data); } const received = []; for (const txHash of txHashes) { const tx = txDetails[txHash]; const txConfirmations = tx.transaction.block_id === -1 ? 0 : Math.max(latestBlock - tx.transaction.block_id + 1, 0); for (let i = 0; i < tx.outputs.length; i++) { const vout = tx.outputs[i]; if (vout.recipient === address) { received.push({ txHash: tx.transaction.hash, amount: vout.value, vOut: i, confirmations: txConfirmations, }); } } } return received .filter((utxo) => confirmations === 0 || utxo.confirmations >= confirmations) .sort(utxo_1.sortUTXOs); }; const broadcastTransaction = (network) => async (txHex) => { const url = `https://api.blockchair.com/${network}/push/transaction`; const response = await axios_1.default.post(url, { data: txHex }, { timeout: timeout_1.DEFAULT_TIMEOUT }); if (response.data.error) { throw new Error(response.data.error); } return response.data.data.transaction_hash; }; exports.broadcastTransaction = broadcastTransaction; var Networks; (function (Networks) { Networks["BITCOIN"] = "bitcoin"; Networks["BITCOIN_CASH"] = "bitcoin-cash"; Networks["LITECOIN"] = "litecoin"; Networks["BITCOIN_SV"] = "bitcoin-sv"; Networks["DOGECOIN"] = "dogecoin"; Networks["DASH"] = "dash"; Networks["GROESTLCOIN"] = "groestlcoin"; Networks["BITCOIN_TESTNET"] = "bitcoin/testnet"; })(Networks || (Networks = {})); exports.Blockchair = { networks: Networks, fetchUTXO, fetchUTXOs, broadcastTransaction: exports.broadcastTransaction, fetchTXs, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tjaGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vYXBpcy9ibG9ja2NoYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUUxQix5Q0FBaUQ7QUFDakQsdUNBQTRDO0FBRTVDLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQ3hDLE1BQWMsRUFDZCxJQUFZLEVBQ0MsRUFBRTtJQUNmLE1BQU0sR0FBRyxHQUFHLDhCQUE4QixPQUFPLDJCQUEyQixNQUFNLEVBQUUsQ0FBQztJQUVyRixNQUFNLFFBQVEsR0FBRyxDQUNiLE1BQU0sZUFBSyxDQUFDLEdBQUcsQ0FBc0IsR0FBRyxHQUFHLEVBQUUsRUFBRTtRQUMzQyxPQUFPLEVBQUUseUJBQWU7S0FDM0IsQ0FBQyxDQUNMLENBQUMsSUFBSSxDQUFDO0lBRVAsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN6QyxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7UUFDbkIsTUFBTSxRQUFRLEdBQUcsOEJBQThCLE9BQU8sUUFBUSxDQUFDO1FBQy9ELE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZELFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDL0M7SUFFRCxNQUFNLGFBQWEsR0FDZixFQUFFLENBQUMsV0FBVyxDQUFDLFFB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