UNPKG

send-crypto

Version:

A minimal JavaScript library / wallet for sending crypto assets

219 lines 20.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.newPrivateKey = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const BCHHandler_1 = require("./handlers/BCH/BCHHandler"); const BTCHandler_1 = require("./handlers/BTC/BTCHandler"); const ERC20Handler_1 = require("./handlers/ERC20/ERC20Handler"); const ETHHandler_1 = require("./handlers/ETH/ETHHandler"); const FILHandler_1 = require("./handlers/FIL/FILHandler"); const LTCHandler_1 = require("./handlers/LTC/LTCHandler"); const TERRAHandler_1 = require("./handlers/TERRA/TERRAHandler"); const ZECHandler_1 = require("./handlers/ZEC/ZECHandler"); const utils_1 = require("./lib/utils"); class CryptoAccount { constructor(privateKey, options) { this.handlers = []; this.registerHandler = (handlerClass, priorityIn) => { const priority = priorityIn === undefined ? this.handlers.length === 0 ? 0 : this.handlers[this.handlers.length - 1].priority : priorityIn; const lastPosition = this.handlers.reduce((index, item, currentIndex) => item.priority <= priority ? currentIndex + 1 : index, 0); this.handlers.splice(lastPosition, 0, { handler: new handlerClass(this.privateKey, this.network, this.constructorOptions, this.sharedState), priority, }); }; this.address = async (assetIn, options) => { const asset = assetIn || this.defaultAsset; if (!asset) { throw new Error(`Must provide an asset`); } return this.deferHandler().address(asset, options); }; this.getBalance = async (assetIn, options) => { const asset = assetIn || this.defaultAsset; if (!asset) { throw new Error(`Must provide an asset`); } const bn = await this.deferHandler().getBalance(asset, options); return (options && options.bn ? new options.bn(bn.toFixed()) : bn.toNumber()); }; // tslint:disable-next-line: member-ordering this.balanceOf = this.getBalance; this.getBalanceInSats = async (assetIn, options) => { const asset = assetIn || this.defaultAsset; if (!asset) { throw new Error(`Must provide an asset`); } const bn = await this.deferHandler().getBalanceInSats(asset, options); return (options && options.bn ? new options.bn(bn.toFixed()) : bn.toNumber()); }; // tslint:disable-next-line: member-ordering this.balanceOfInSats = this.getBalanceInSats; this.send = (to, value, assetIn, options) => { const asset = assetIn || this.defaultAsset; if (!asset) { throw new Error(`Must provide an asset`); } return this.deferHandler().send(to, new bignumber_js_1.default(value.toString()), asset, options); }; this.sendSats = (to, value, assetIn, options) => { const asset = assetIn || this.defaultAsset; if (!asset) { throw new Error(`Must provide an asset`); } return this.deferHandler().sendSats(to, new bignumber_js_1.default(value.toString()), asset, options); }; this.deferHandler = (thisHandler) => { return { address: (deferredAsset, deferredOptions) => { const nextHandler = this.findHandler(deferredAsset, thisHandler); if (nextHandler.address) { return nextHandler.address(deferredAsset, deferredOptions || {}, this.deferHandler(nextHandler)); } else { return this.deferHandler(nextHandler).address(deferredAsset, deferredOptions); } }, getBalance: (deferredAsset, deferredOptions) => { const nextHandler = this.findHandler(deferredAsset, thisHandler); if (nextHandler.getBalance) { return nextHandler.getBalance(deferredAsset, deferredOptions || {}, this.deferHandler(nextHandler)); } else { return this.deferHandler(nextHandler).getBalance(deferredAsset, deferredOptions); } }, getBalanceInSats: (deferredAsset, deferredOptions) => { const nextHandler = this.findHandler(deferredAsset, thisHandler); if (nextHandler.getBalanceInSats) { return nextHandler.getBalanceInSats(deferredAsset, deferredOptions || {}, this.deferHandler(nextHandler)); } else { return this.deferHandler(nextHandler).getBalanceInSats(deferredAsset, deferredOptions); } }, send: (deferredTo, deferredValue, deferredAsset, deferredOptions) => { const nextHandler = this.findHandler(deferredAsset, thisHandler); if (nextHandler.send) { return nextHandler.send(deferredTo, deferredValue, deferredAsset, deferredOptions || {}, this.deferHandler(nextHandler)); } else { return this.deferHandler(nextHandler).send(deferredTo, deferredValue, deferredAsset, deferredOptions); } }, sendSats: (deferredTo, deferredValue, deferredAsset, deferredOptions) => { const nextHandler = this.findHandler(deferredAsset, thisHandler); if (nextHandler.sendSats) { return nextHandler.sendSats(deferredTo, deferredValue, deferredAsset, deferredOptions || {}, this.deferHandler(nextHandler)); } else { return this.deferHandler(nextHandler).sendSats(deferredTo, deferredValue, deferredAsset, deferredOptions); } }, }; }; this.findHandler = (asset, from) => { const fromIndex = from ? this.handlers.findIndex((i) => i.handler === from) : -1; for (let i = (fromIndex === -1 ? this.handlers.length : fromIndex) - 1; i >= 0; i--) { const handler = this.handlers[i].handler; // console.log(handler); if (handler.handlesAsset(asset)) { return handler; } } let assetString; try { assetString = JSON.stringify(asset); } catch (error) { assetString = (asset && asset.name) || asset; } throw new Error(`Unsupported asset ${assetString}`); }; this.privateKey = (0, utils_1.strip0x)(privateKey instanceof Uint8Array ? (0, utils_1.toHex)(privateKey) : privateKey); this.network = (options && options.network) || "mainnet"; this.constructorOptions = options; this.sharedState = {}; this.registerHandler(BTCHandler_1.BTCHandler, 0); this.registerHandler(ZECHandler_1.ZECHandler, 10); this.registerHandler(BCHHandler_1.BCHHandler, 20); this.registerHandler(ETHHandler_1.ETHHandler, 30); this.registerHandler(FILHandler_1.FILHandler, 40); this.registerHandler(TERRAHandler_1.TERRAHandler, 50); this.registerHandler(ERC20Handler_1.ERC20Handler, 60); this.registerHandler(LTCHandler_1.LTCHandler, 60); if (options && options.extraHandlers) { for (const handler of options.extraHandlers) { this.registerHandler(handler); } } this.defaultAsset = options && options.defaultAsset; } } exports.default = CryptoAccount; const newPrivateKey = () => { // @ts-ignore try { // @ts-ignore const array = new Uint8Array(32); // @ts-ignore window.crypto.getRandomValues(array); return (0, utils_1.toHex)(array); } catch (error) { // Ignore window error. } return require("crypto").randomBytes(32).toString("hex"); }; exports.newPrivateKey = newPrivateKey; CryptoAccount.newPrivateKey = exports.newPrivateKey; //////////////////////////////////////////////////////////////////////////////// // EXPORTS // // Based on https://github.com/MikeMcl/bignumber.js/blob/master/bignumber.js // //////////////////////////////////////////////////////////////////////////////// // tslint:disable: no-object-mutation // tslint:disable-next-line: no-string-literal CryptoAccount.default = CryptoAccount.CryptoAccount = CryptoAccount; // AMD try { // @ts-ignore if (typeof define === "function" && define.amd) { // @ts-ignore define(() => CryptoAccount); } } catch (error) { /* ignore */ } // Node.js and other environments that support module.exports. try { // @ts-ignore if (typeof module !== "undefined" && module.exports) { module.exports = CryptoAccount; } } catch (error) { /* ignore */ } // Browser. try { // @ts-ignore if (typeof window !== "undefined" && window) { // @ts-ignore window.CryptoAccount = CryptoAccount; } } catch (error) { /* ignore */ } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQXFDO0FBRXJDLDBEQUF1RDtBQUN2RCwwREFBdUQ7QUFDdkQsZ0VBQTZEO0FBQzdELDBEQUF1RDtBQUN2RCwwREFBdUQ7QUFDdkQsMERBQXVEO0FBQ3ZELGdFQUE2RDtBQUM3RCwwREFBdUQ7QUFFdkQsdUNBQTZDO0FBaUI3QyxNQUFxQixhQUFhO0lBWTlCLFlBQ0ksVUFBK0IsRUFDL0IsT0FBcUQ7UUFieEMsYUFBUSxHQUdwQixFQUFFLENBQUM7UUFrQ1Esb0JBQWUsR0FBRyxDQUM5QixZQUEwQixFQUMxQixVQUFtQixFQUNyQixFQUFFO1lBQ0EsTUFBTSxRQUFRLEdBQ1YsVUFBVSxLQUFLLFNBQVM7Z0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRO2dCQUN0RCxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3JCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNyQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFDeEQsQ0FBQyxDQUNKLENBQUM7WUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLEVBQUUsSUFBSSxZQUFZLENBQ3JCLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLE9B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