UNPKG

airgap-coin-lib

Version:

The airgap-coin-lib is a protocol agnostic library to prepare, sign and broadcast cryptocurrency transactions.

313 lines (309 loc) 16.9 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var bignumber_1 = require("../dependencies/src/bignumber.js-9.0.0/bignumber"); var ProtocolNetwork_1 = require("../utils/ProtocolNetwork"); var ProtocolSymbols_1 = require("../utils/ProtocolSymbols"); var AirGapWallet_1 = require("./AirGapWallet"); var TimeUnit; (function (TimeUnit) { TimeUnit["Hours"] = "hours"; TimeUnit["Days"] = "days"; TimeUnit["Minutes"] = "minutes"; })(TimeUnit = exports.TimeUnit || (exports.TimeUnit = {})); var AirGapMarketWallet = /** @class */ (function (_super) { __extends(AirGapMarketWallet, _super); function AirGapMarketWallet(protocol, publicKey, isExtendedPublicKey, derivationPath, priceService, addressIndex) { var _this = _super.call(this, protocol, publicKey, isExtendedPublicKey, derivationPath, addressIndex) || this; _this.protocol = protocol; _this.publicKey = publicKey; _this.isExtendedPublicKey = isExtendedPublicKey; _this.derivationPath = derivationPath; _this.priceService = priceService; _this.addressIndex = addressIndex; return _this; } Object.defineProperty(AirGapMarketWallet.prototype, "currentMarketPrice", { get: function () { return this._currentMarketPrice; }, set: function (marketPrice) { this._currentMarketPrice = this.protocol.options.network.type === ProtocolNetwork_1.NetworkType.MAINNET ? marketPrice : new bignumber_1.default(0); }, enumerable: true, configurable: true }); Object.defineProperty(AirGapMarketWallet.prototype, "marketPriceOverTime", { get: function () { return this._marketPriceOverTime; }, set: function (marketPrices) { var _a; this._marketPriceOverTime = this.protocol.options.network.type === ProtocolNetwork_1.NetworkType.MAINNET ? marketPrices : (_a = marketPrices) === null || _a === void 0 ? void 0 : _a.map(function () { return ({ time: 0, close: 0, high: 0, low: 0, open: 0, volumefrom: 0, volumeto: 0 }); }); }, enumerable: true, configurable: true }); AirGapMarketWallet.prototype.synchronize = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { if (this.synchronizePromise === undefined) { this.synchronizePromise = new Promise(function (resolve, reject) { Promise.all([_this.balanceOf(), _this.fetchCurrentMarketPrice()]) .then(function (results) { _this.currentBalance = results[0]; _this.currentMarketPrice = results[1]; _this.synchronizePromise = undefined; resolve(); }) .catch(function (error) { _this.synchronizePromise = undefined; reject(error); }); }); } return [2 /*return*/, this.synchronizePromise]; }); }); }; AirGapMarketWallet.prototype.setProtocol = function (protocol) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _super.prototype.setProtocol.call(this, protocol)]; case 1: _a.sent(); this.currentBalance = undefined; this.currentMarketPrice = undefined; return [4 /*yield*/, this.synchronize()]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; AirGapMarketWallet.prototype.fetchCurrentMarketPrice = function (baseSymbol) { if (baseSymbol === void 0) { baseSymbol = 'USD'; } return __awaiter(this, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: _a = this; return [4 /*yield*/, this.priceService.getCurrentMarketPrice(this.protocol, baseSymbol)]; case 1: _a.currentMarketPrice = _b.sent(); return [2 /*return*/, this.currentMarketPrice]; } }); }); }; AirGapMarketWallet.prototype.getMarketPricesOverTime = function (timeUnit, numberOfMinutes, date, baseSymbol) { if (baseSymbol === void 0) { baseSymbol = 'USD'; } return __awaiter(this, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: _a = this; return [4 /*yield*/, this.priceService.getMarketPricesOverTime(this.protocol, timeUnit, numberOfMinutes, date, baseSymbol)]; case 1: _a.marketPriceOverTime = _b.sent(); return [2 /*return*/, this.marketPriceOverTime]; } }); }); }; AirGapMarketWallet.prototype.addressesToCheck = function () { var addressesToReceive = this.addressIndex !== undefined ? [this.addresses[this.addressIndex]] : this.addresses; return addressesToReceive; }; AirGapMarketWallet.prototype.balanceOf = function () { return __awaiter(this, void 0, void 0, function () { var _a, _b, _c, _d; return __generator(this, function (_e) { switch (_e.label) { case 0: if (!((this.protocol.identifier === ProtocolSymbols_1.MainProtocolSymbols.BTC || this.protocol.identifier === ProtocolSymbols_1.MainProtocolSymbols.GRS) && this.isExtendedPublicKey)) return [3 /*break*/, 2]; _a = bignumber_1.default.bind; return [4 /*yield*/, this.protocol.getBalanceOfExtendedPublicKey(this.publicKey, 0)]; case 1: // TODO: Remove and test /* We should remove this if BTC also uses blockbook. (And change the order of the if/else below) The problem is that we have addresses cached for all protocols. But blockbook (grs) doesn't allow multiple addresses to be checked at once, so we need to xPub key there (or we would do 100s of requests). We can also not simply change the order of the following if/else, because then it would use the xPub method for BTC as well, which results in the addresses being derived again, which causes massive lags in the apps. */ return [2 /*return*/, new (_a.apply(bignumber_1.default, [void 0, _e.sent()]))()]; case 2: if (!(this.addresses.length > 0)) return [3 /*break*/, 4]; _b = bignumber_1.default.bind; return [4 /*yield*/, this.protocol.getBalanceOfAddresses(this.addressesToCheck())]; case 3: return [2 /*return*/, new (_b.apply(bignumber_1.default, [void 0, _e.sent()]))()]; case 4: if (!this.isExtendedPublicKey) return [3 /*break*/, 6]; _c = bignumber_1.default.bind; return [4 /*yield*/, this.protocol.getBalanceOfExtendedPublicKey(this.publicKey, 0)]; case 5: return [2 /*return*/, new (_c.apply(bignumber_1.default, [void 0, _e.sent()]))()]; case 6: _d = bignumber_1.default.bind; return [4 /*yield*/, this.protocol.getBalanceOfPublicKey(this.publicKey)]; case 7: return [2 /*return*/, new (_d.apply(bignumber_1.default, [void 0, _e.sent()]))()]; } }); }); }; AirGapMarketWallet.prototype.fetchTransactions = function (limit, cursor) { return __awaiter(this, void 0, void 0, function () { var transactionResult; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!((this.protocol.identifier === ProtocolSymbols_1.MainProtocolSymbols.BTC || this.protocol.identifier === ProtocolSymbols_1.MainProtocolSymbols.GRS) && this.isExtendedPublicKey)) return [3 /*break*/, 2]; return [4 /*yield*/, this.protocol.getTransactionsFromExtendedPublicKey(this.publicKey, limit, cursor)]; case 1: // TODO: Remove and test /* We should remove this if BTC also uses blockbook. (And change the order of the if/else below) The problem is that we have addresses cached for all protocols. But blockbook (grs) doesn't allow multiple addresses to be checked at once, so we need to xPub key there (or we would do 100s of requests). We can also not simply change the order of the following if/else, because then it would use the xPub method for BTC as well, which results in the addresses being derived again, which causes massive lags in the apps. */ transactionResult = _a.sent(); return [3 /*break*/, 8]; case 2: if (!(this.addresses.length > 0)) return [3 /*break*/, 4]; return [4 /*yield*/, this.protocol.getTransactionsFromAddresses(this.addressesToCheck(), limit, cursor)]; case 3: transactionResult = _a.sent(); return [3 /*break*/, 8]; case 4: if (!this.isExtendedPublicKey) return [3 /*break*/, 6]; return [4 /*yield*/, this.protocol.getTransactionsFromExtendedPublicKey(this.publicKey, limit, cursor)]; case 5: transactionResult = _a.sent(); return [3 /*break*/, 8]; case 6: return [4 /*yield*/, this.protocol.getTransactionsFromPublicKey(this.publicKey, limit, cursor)]; case 7: transactionResult = _a.sent(); _a.label = 8; case 8: return [2 /*return*/, transactionResult]; } }); }); }; AirGapMarketWallet.prototype.getMaxTransferValue = function (recipients, fee) { return __awaiter(this, void 0, void 0, function () { var _a, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: if (!this.isExtendedPublicKey) return [3 /*break*/, 2]; _a = bignumber_1.default.bind; return [4 /*yield*/, this.protocol.estimateMaxTransactionValueFromExtendedPublicKey(this.publicKey, recipients, fee)]; case 1: return [2 /*return*/, new (_a.apply(bignumber_1.default, [void 0, _c.sent()]))()]; case 2: _b = bignumber_1.default.bind; return [4 /*yield*/, this.protocol.estimateMaxTransactionValueFromPublicKey(this.publicKey, recipients, fee)]; case 3: return [2 /*return*/, new (_b.apply(bignumber_1.default, [void 0, _c.sent()]))()]; } }); }); }; AirGapMarketWallet.prototype.prepareTransaction = function (recipients, values, fee, data) { if (this.isExtendedPublicKey) { return this.protocol.prepareTransactionFromExtendedPublicKey(this.publicKey, 0, recipients, values, fee, data); } else { if (this.addressIndex) { data = { addressIndex: this.addressIndex }; } return this.protocol.prepareTransactionFromPublicKey(this.publicKey, recipients, values, fee, data); } }; AirGapMarketWallet.prototype.estimateFees = function (recipients, values, data) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { if (this.isExtendedPublicKey) { return [2 /*return*/, this.protocol.estimateFeeDefaultsFromExtendedPublicKey(this.publicKey, recipients, values, data)]; } else { if (this.addressIndex) { data = { addressIndex: this.addressIndex }; } return [2 /*return*/, this.protocol.estimateFeeDefaultsFromPublicKey(this.publicKey, recipients, values, data)]; } return [2 /*return*/]; }); }); }; return AirGapMarketWallet; }(AirGapWallet_1.AirGapWallet)); exports.AirGapMarketWallet = AirGapMarketWallet; //# sourceMappingURL=AirGapMarketWallet.js.map