send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
124 lines • 11.6 kB
JavaScript
;
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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