UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

97 lines 11.3 kB
import BigNumber from "bignumber.js"; import * as bitcoin from "bitgo-utxo-lib"; import { List } from "immutable"; import { Sochain } from "../../common/apis/sochain"; import { BitgoUTXOLib } from "../../common/libraries/bitgoUtxoLib"; import { subscribeToConfirmations } from "../../lib/confirmations"; import { newPromiEvent } from "../../lib/promiEvent"; import { fallback, retryNTimes } from "../../lib/retry"; export const _apiFallbacks = { fetchUTXO: (testnet, txHash, vOut) => [ () => Sochain.fetchUTXO(testnet ? "LTCTEST" : "LTC")(txHash, vOut), ], fetchUTXOs: (testnet, address, confirmations, scriptHash) => [ () => Sochain.fetchUTXOs(testnet ? "LTCTEST" : "LTC")(address, confirmations), ], fetchTXs: (testnet, address, confirmations = 0, scriptHash) => [ () => Sochain.fetchTXs(testnet ? "LTCTEST" : "LTC")(address, confirmations), ], broadcastTransaction: (testnet, hex) => [ () => Sochain.broadcastTransaction(testnet ? "LTCTEST" : "LTC")(hex), ], }; export class LTCHandler { privateKey; testnet; decimals = 8; static getUTXOs = async (testnet, options) => { const confirmations = options && options.confirmations !== undefined ? options.confirmations : 0; const endpoints = _apiFallbacks.fetchUTXOs(testnet, options.address, confirmations, options.scriptHash); return fallback(endpoints); }; static getUTXO = async (testnet, txHash, vOut) => { const endpoints = _apiFallbacks.fetchUTXO(testnet, txHash, vOut); return fallback(endpoints); }; static getTransactions = async (testnet, options) => { const confirmations = options && options.confirmations !== undefined ? options.confirmations : 0; const endpoints = _apiFallbacks.fetchTXs(testnet, options.address, confirmations, options.scriptHash); return fallback(endpoints); }; constructor(privateKey, network) { this.testnet = network !== "mainnet"; this.privateKey = BitgoUTXOLib.loadPrivateKey(this.testnet ? bitcoin.networks.litecoinTest : bitcoin.networks.litecoin, privateKey); } // Returns whether or not this can handle the asset handlesAsset = (asset) => typeof asset === "string" && ["LTC", "LITECOIN"].indexOf(asset.toUpperCase()) !== -1; address = async (asset, options) => this.privateKey.getAddress(); // Balance getBalance = async (asset, options) => (await this.getBalanceInSats(asset, options)).dividedBy(new BigNumber(10).exponentiatedBy(this.decimals)); getBalanceInSats = async (asset, options) => { const utxos = await LTCHandler.getUTXOs(this.testnet, { ...options, address: (options && options.address) || (await this.address(asset)), }); return utxos.reduce((sum, utxo) => sum.plus(utxo.amount), new BigNumber(0)); }; // Transfer send = (to, value, asset, options) => this.sendSats(to, value.times(new BigNumber(10).exponentiatedBy(this.decimals)), asset, options); sendSats = (to, valueIn, asset, options) => { const promiEvent = newPromiEvent(); let txHash; let errored; (async () => { const fromAddress = await this.address(asset); const changeAddress = fromAddress; const utxos = List(await LTCHandler.getUTXOs(this.testnet, { ...options, address: fromAddress, })) .sortBy((utxo) => utxo.amount) .reverse() .toArray(); const built = await BitgoUTXOLib.buildUTXO(this.testnet ? bitcoin.networks.litecoinTest : bitcoin.networks.litecoin, this.privateKey, changeAddress, to, valueIn, utxos, options); txHash = await retryNTimes(() => fallback(_apiFallbacks.broadcastTransaction(this.testnet, built.toHex())), 3); promiEvent.emit("transactionHash", txHash); promiEvent.resolve(txHash); })().catch((error) => { errored = true; promiEvent.reject(error); }); subscribeToConfirmations(promiEvent, () => errored, async () => (txHash ? this._getConfirmations(txHash) : 0)); return promiEvent; }; _getConfirmations = async (txHash) => (await fallback( // Fetch confirmations for first output of transaction. _apiFallbacks.fetchUTXO(this.testnet, txHash, 0))).confirmations; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFRDSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oYW5kbGVycy9MVEMvTFRDSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxLQUFLLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFjeEQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQ3pCLFNBQVMsRUFBRSxDQUFDLE9BQWdCLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxFQUFFLENBQUM7UUFDM0QsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztLQUNyRTtJQUVELFVBQVUsRUFBRSxDQUNSLE9BQWdCLEVBQ2hCLE9BQWUsRUFDZixhQUFxQixFQUNyQixVQUFtQixFQUNyQixFQUFFLENBQUM7UUFDRCxHQUFHLEVBQUUsQ0FDRCxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDM0MsT0FBTyxFQUNQLGFBQWEsQ0FDaEI7S0FDUjtJQUVELFFBQVEsRUFBRSxDQUNO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