UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

95 lines 8.43 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Blockchain = exports.broadcastTransaction = exports.BlockchainNetwork = void 0; const axios_1 = __importDefault(require("axios")); const url_1 = require("url"); const utxo_1 = require("../../lib/utxo"); const timeout_1 = require("./timeout"); var BlockchainNetwork; (function (BlockchainNetwork) { BlockchainNetwork["Bitcoin"] = "btc"; BlockchainNetwork["BitcoinCash"] = "bch"; BlockchainNetwork["BitcoinTestnet"] = "btc-testnet"; BlockchainNetwork["BitcoinCashTestnet"] = "bch-testnet"; })(BlockchainNetwork = exports.BlockchainNetwork || (exports.BlockchainNetwork = {})); const fetchLatestBlock = async (network) => { const statsUrl = `https://api.blockchain.info/haskoin-store/${network}/block/best?notx=true`; const statsResponse = (await axios_1.default.get(statsUrl)).data; return statsResponse.height; }; const fetchUTXO = (network) => async (txHash, vOut) => { const url = `https://api.blockchain.info/haskoin-store/${network}/transaction/${txHash}`; const response = (await axios_1.default.get(`${url}`, { timeout: timeout_1.DEFAULT_TIMEOUT, })).data; const confirmations = !response.block || !response.block.height ? 0 : Math.max((await fetchLatestBlock(network)) - response.block.height + 1, 0); return { txHash, vOut, amount: response.outputs[vOut].value, confirmations, }; }; const fetchUTXOs = (network) => async (address, confirmations, limit = 25, offset = 0) => fetchTXs(network)(address, confirmations, limit, offset, true); const fetchTXs = (network) => async (address, confirmations = 0, limit = 25, offset = 0, onlyUnspent = false) => { const url = `https://api.blockchain.info/haskoin-store/${network}/address/${address}/transactions/full?limit=${limit}&offset=${offset}`; const response = (await axios_1.default.get(url, { timeout: timeout_1.DEFAULT_TIMEOUT, })).data; let latestBlock; const received = []; for (const tx of response) { latestBlock = latestBlock || (await fetchLatestBlock(network)); const txConfirmations = tx.block && tx.block.height ? Math.max(latestBlock - tx.block.height + 1, 0) : 0; for (let i = 0; i < tx.outputs.length; i++) { const vout = tx.outputs[i]; if (vout.address === address && // If the onlyUnspent flag is true, check that the tx is unspent. (!onlyUnspent || vout.spent === false)) { received.push({ txHash: tx.txid, 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) => { if (network !== BlockchainNetwork.Bitcoin) { throw new Error(`Broadcasting ${network} transactions not supported by endpoint.`); } const url = `https://blockchain.info/pushtx`; const params = new url_1.URLSearchParams(); params.append("tx", txHex); const response = await axios_1.default.post(url, params, { timeout: timeout_1.DEFAULT_TIMEOUT, }); if (response.data.error) { throw new Error(response.data.error); } // TODO return response.data; }; exports.broadcastTransaction = broadcastTransaction; exports.Blockchain = { networks: BlockchainNetwork, fetchUTXO, fetchUTXOs, broadcastTransaction: exports.broadcastTransaction, fetchTXs, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tjaGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tb24vYXBpcy9ibG9ja2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQiw2QkFBc0M7QUFFdEMseUNBQWlEO0FBQ2pELHVDQUE0QztBQUU1QyxJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDekIsb0NBQWUsQ0FBQTtJQUNmLHdDQUFtQixDQUFBO0lBQ25CLG1EQUE4QixDQUFBO0lBQzlCLHVEQUFrQyxDQUFBO0FBQ3RDLENBQUMsRUFMVyxpQkFBaUIsR0FBakIseUJBQWlCLEtBQWpCLHlCQUFpQixRQUs1QjtBQWdERCxNQUFNLGdCQUFnQixHQUFHLEtBQUssRUFDMUIsT0FBMEIsRUFDWCxFQUFFO0lBQ2pCLE1BQU0sUUFBUSxHQUFHLDZDQUE2QyxPQUFPLHVCQUF1QixDQUFDO0lBQzdGLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFxQixRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQ1gsQ0FBQyxPQUEwQixFQUFFLEVBQUUsQ0FDL0IsS0FBSyxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQWlCLEVBQUU7SUFDbEQsTUFBTSxHQUFHLEdBQUcsNkNBQTZDLE9BQU8sZ0JBQWdCLE1BQU0sRUFBRSxDQUFDO0lBRXpGLE1BQU0sUUFBUSxHQUFHLENBQ2IsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUF3QixHQUFHLEdBQUcsRUFBRSxFQUFFO1FBQzdDLE9BQU8sRUFBRSx5QkFBZTtLQUMzQixDQUFDLENBQ0wsQ0FBQyxJQUFJLENBQUM7SUFFUCxNQUFNLGFBQWEsR0FDZixDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxD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