send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
80 lines • 7.47 kB
JavaScript
import axios from "axios";
import { sortUTXOs } from "../../lib/utxo";
import { DEFAULT_TIMEOUT } from "./timeout";
const getAPIUrl = (testnet) => `https://blockstream.info/${testnet ? "testnet/" : ""}api`;
const fetchUTXO = (testnet) => async (txHash, vOut) => {
const apiUrl = getAPIUrl(testnet);
const utxo = (await axios.get(`${apiUrl}/tx/${txHash}`, {
timeout: DEFAULT_TIMEOUT,
})).data;
const heightResponse = (await axios.get(`${apiUrl}/blocks/tip/height`, {
timeout: DEFAULT_TIMEOUT,
})).data;
const confirmations = utxo.status.confirmed
? Math.max(1 + parseInt(heightResponse, 10) - utxo.status.block_height, 0)
: 0;
return {
txHash,
amount: utxo.vout[vOut].value,
vOut,
confirmations,
};
};
const fetchUTXOs = (testnet) => async (address, confirmations) => {
const apiUrl = getAPIUrl(testnet);
const response = await axios.get(`${apiUrl}/address/${address}/utxo`, { timeout: DEFAULT_TIMEOUT });
const heightResponse = await axios.get(`${apiUrl}/blocks/tip/height`, { timeout: DEFAULT_TIMEOUT });
return response.data
.map((utxo) => ({
txHash: utxo.txid,
amount: utxo.value,
vOut: utxo.vout,
confirmations: utxo.status.confirmed
? 1 +
parseInt(heightResponse.data, 10) -
utxo.status.block_height
: 0,
}))
.filter((utxo) => confirmations === 0 || utxo.confirmations >= confirmations)
.sort(sortUTXOs);
};
const fetchTXs = (testnet) => async (address, confirmations = 0, limit = 0) => {
const apiUrl = getAPIUrl(testnet);
const response = await axios.get(`${apiUrl}/address/${address}/txs`, { timeout: DEFAULT_TIMEOUT });
const heightResponse = await axios.get(`${apiUrl}/blocks/tip/height`, { timeout: DEFAULT_TIMEOUT });
const received = [];
for (const tx of response.data) {
for (let i = 0; i < tx.vout.length; i++) {
const vout = tx.vout[i];
if (vout.scriptpubkey_address === address) {
received.push({
txHash: tx.txid,
amount: vout.value,
vOut: i,
confirmations: tx.status.confirmed
? 1 +
parseInt(heightResponse.data, 10) -
tx.status.block_height
: 0,
});
}
}
}
return received
.filter((utxo) => confirmations === 0 || utxo.confirmations >= confirmations)
.sort(sortUTXOs);
};
const broadcastTransaction = (testnet) => async (txHex) => {
const apiUrl = getAPIUrl(testnet);
const response = await axios.post(`${apiUrl}/tx`, txHex, {
timeout: DEFAULT_TIMEOUT,
});
return response.data;
};
export const Blockstream = {
fetchUTXO,
fetchUTXOs,
broadcastTransaction,
fetchTXs,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tzdHJlYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL2FwaXMvYmxvY2tzdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBRSxTQUFTLEVBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBNEM1QyxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUNuQyw0QkFBNEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO0FBRS9ELE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZ0IsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUN6QyxNQUFjLEVBQ2QsSUFBWSxFQUNDLEVBQUU7SUFDZixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbEMsTUFBTSxJQUFJLEdBQUcsQ0FDVCxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQWdCLEdBQUcsTUFBTSxPQUFPLE1BQU0sRUFBRSxFQUFFO1FBQ3JELE9BQU8sRUFBRSxlQUFlO0tBQzNCLENBQUMsQ0FDTCxDQUFDLElBQUksQ0FBQztJQUVQLE1BQU0sY0FBYyxHQUFHLENBQ25CLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBUyxHQUFHLE1BQU0sb0JBQW9CLEVBQUU7UUFDbkQsT0FBTyxFQUFFLGVBQWU7S0FDM0IsQ0FBQyxDQUNMLENBQUMsSUFBSSxDQUFDO0lBRVAsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1FBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNKLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUMz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