send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
121 lines • 12.8 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LTCHandler = exports._apiFallbacks = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const bitcoin = __importStar(require("bitgo-utxo-lib"));
const immutable_1 = require("immutable");
const sochain_1 = require("../../common/apis/sochain");
const bitgoUtxoLib_1 = require("../../common/libraries/bitgoUtxoLib");
const confirmations_1 = require("../../lib/confirmations");
const promiEvent_1 = require("../../lib/promiEvent");
const retry_1 = require("../../lib/retry");
exports._apiFallbacks = {
fetchUTXO: (testnet, txHash, vOut) => [
() => sochain_1.Sochain.fetchUTXO(testnet ? "LTCTEST" : "LTC")(txHash, vOut),
],
fetchUTXOs: (testnet, address, confirmations, scriptHash) => [
() => sochain_1.Sochain.fetchUTXOs(testnet ? "LTCTEST" : "LTC")(address, confirmations),
],
fetchTXs: (testnet, address, confirmations = 0, scriptHash) => [
() => sochain_1.Sochain.fetchTXs(testnet ? "LTCTEST" : "LTC")(address, confirmations),
],
broadcastTransaction: (testnet, hex) => [
() => sochain_1.Sochain.broadcastTransaction(testnet ? "LTCTEST" : "LTC")(hex),
],
};
class LTCHandler {
constructor(privateKey, network) {
this.decimals = 8;
// Returns whether or not this can handle the asset
this.handlesAsset = (asset) => typeof asset === "string" &&
["LTC", "LITECOIN"].indexOf(asset.toUpperCase()) !== -1;
this.address = async (asset, options) => this.privateKey.getAddress();
// Balance
this.getBalance = async (asset, options) => (await this.getBalanceInSats(asset, options)).dividedBy(new bignumber_js_1.default(10).exponentiatedBy(this.decimals));
this.getBalanceInSats = async (asset, options) => {
const utxos = await LTCHandler.getUTXOs(this.testnet, Object.assign(Object.assign({}, options), { address: (options && options.address) || (await this.address(asset)) }));
return utxos.reduce((sum, utxo) => sum.plus(utxo.amount), new bignumber_js_1.default(0));
};
// Transfer
this.send = (to, value, asset, options) => this.sendSats(to, value.times(new bignumber_js_1.default(10).exponentiatedBy(this.decimals)), asset, options);
this.sendSats = (to, valueIn, asset, options) => {
const promiEvent = (0, promiEvent_1.newPromiEvent)();
let txHash;
let errored;
(async () => {
const fromAddress = await this.address(asset);
const changeAddress = fromAddress;
const utxos = (0, immutable_1.List)(await LTCHandler.getUTXOs(this.testnet, Object.assign(Object.assign({}, options), { address: fromAddress })))
.sortBy((utxo) => utxo.amount)
.reverse()
.toArray();
const built = await bitgoUtxoLib_1.BitgoUTXOLib.buildUTXO(this.testnet
? bitcoin.networks.litecoinTest
: bitcoin.networks.litecoin, this.privateKey, changeAddress, to, valueIn, utxos, options);
txHash = await (0, retry_1.retryNTimes)(() => (0, retry_1.fallback)(exports._apiFallbacks.broadcastTransaction(this.testnet, built.toHex())), 3);
promiEvent.emit("transactionHash", txHash);
promiEvent.resolve(txHash);
})().catch((error) => {
errored = true;
promiEvent.reject(error);
});
(0, confirmations_1.subscribeToConfirmations)(promiEvent, () => errored, async () => (txHash ? this._getConfirmations(txHash) : 0));
return promiEvent;
};
this._getConfirmations = async (txHash) => (await (0, retry_1.fallback)(
// Fetch confirmations for first output of transaction.
exports._apiFallbacks.fetchUTXO(this.testnet, txHash, 0))).confirmations;
this.testnet = network !== "mainnet";
this.privateKey = bitgoUtxoLib_1.BitgoUTXOLib.loadPrivateKey(this.testnet
? bitcoin.networks.litecoinTest
: bitcoin.networks.litecoin, privateKey);
}
}
exports.LTCHandler = LTCHandler;
_a = LTCHandler;
LTCHandler.getUTXOs = async (testnet, options) => {
const confirmations = options && options.confirmations !== undefined
? options.confirmations
: 0;
const endpoints = exports._apiFallbacks.fetchUTXOs(testnet, options.address, confirmations, options.scriptHash);
return (0, retry_1.fallback)(endpoints);
};
LTCHandler.getUTXO = async (testnet, txHash, vOut) => {
const endpoints = exports._apiFallbacks.fetchUTXO(testnet, txHash, vOut);
return (0, retry_1.fallback)(endpoints);
};
LTCHandler.getTransactions = async (testnet, options) => {
const confirmations = options && options.confirmations !== undefined
? options.confirmations
: 0;
const endpoints = exports._apiFallbacks.fetchTXs(testnet, options.address, confirmations, options.scriptHash);
return (0, retry_1.fallback)(endpoints);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFRDSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oYW5kbGVycy9MVEMvTFRDSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBcUM7QUFDckMsd0RBQTBDO0FBQzFDLHlDQUFpQztBQUNqQyx1REFBb0Q7QUFDcEQsc0VBQW1FO0FBQ25FLDJEQUFtRTtBQUNuRSxxREFBaUU7QUFDakUsMkNBQXdEO0FBYzNDLFFBQUEsYUFBYSxHQUFHO0lBQ3pCLFNBQVMsRUFBRSxDQUFDLE9BQWdCLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxFQUFFLENBQUM7UUFDM0QsR0FBRyxFQUFFLENBQUMsaUJBQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7S0FDckU7SUFFRCxVQUFVLEVBQUUsQ0FDUixPQUFnQixFQUNoQixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsVUFBbUIsRUFDckIsRUFBRSxDQUFDO1FBQ0QsR0FBRyxFQUFFLENBQ0QsaUJBQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUMzQyxPQUFPLEVBQ1AsYUFBYSxDQUNoQjtLQUNSO0lBRUQsUUFBUSxFQUFFLENBQ04sT0FBZ0IsRUFDaEIsT0FBZSxFQUNmLGdCQUF3QixDQUFDLEVBQ3pCLFVBQW1CLEVBQ3JCLEVBQUUsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUNELGlCQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDekMsT0FBTyxFQUNQLGFBQWEsQ0FDaEI7S0FDUjtJQUVELG9CQUFvQixFQUFFLENBQUMsT0FB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