send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
219 lines • 20.1 kB
JavaScript
"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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