UNPKG

cosmic-lib

Version:

A JavaScript implementation of the CosmicLink protocol for Stellar

213 lines (177 loc) 6.88 kB
"use strict"; /** * This module provides two ways to generate {@link SignersUtils} for a * Transaction object. The first one extends the object and is the intended way * to use those utilities. However, as extending objects can sometimes prove * inconvenient or intrusive, a second method allows to create a stand-alone * {@link SignersUtils} tied to a given transaction. * * @exports signersUtils */ var _regeneratorRuntime = require("@babel/runtime/regenerator"); var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator"); var _classCallCheck = require("@babel/runtime/helpers/classCallCheck"); var _createClass = require("@babel/runtime/helpers/createClass"); var signersUtils = exports; var misc = require("@cosmic-plus/jsutils/es5/misc"); var StellarSdk = require("@cosmic-plus/base/es5/stellar-sdk"); var _resolve = require("./resolve"); /** * **SignersUtils** is a toolbox that aims to ease the handling of * multisignature transactions. The idea behind it is to fetch all required * data once and to cache the responses into the transaction. Then, all * the utilities can function in a synchronous (immediate) manner. * * Those are automatically available in `cosmicLink.transaction` after * `await cosmicLink.lock()` is ran. Alternatively, you can extend a transaction * or generate its SignersUtils by using {@link module:signersUtils}. There's no * `cosmicLib.SignersUtils` constructor. * * An instance of SignersUtils is always tied to a given transaction. This is * why none of the provided methods take a transaction as parameter. * * > * | Members | Methods * |-----------------------------------------------------------------------------|------------- * | [sources]{@link SignersUtils#sources}: Array of transaction sources | [hasSigner]{@link SignersUtils#hasSigner}: Test if a key is a legit signer for transaction * | [signers]{@link SignersUtils#signers}: Table of transaction signers | [hasSigned]{@link SignersUtils#hasSigned}: Test if a key has signed transaction * | [signersList]{@link SignersUtils#signersList}: Array of transaction signers | * * @example * const cosmicLink = new CosmicLink({ memo: 'Donation', maxDate: 2019 }) * .addOperation('payment', { destination: 'tips*cosmic.link', amount: 10 }) * * await cosmicLink.lock({ network: 'test', source: 'myaddress*example.org' }) * * console.log(cosmicLink.transaction.signers) * console.log(cosmicLink.transaction.hasSigner(GB...DXEZ)) * * @alias SignersUtils * @namespace */ var SignersUtils = /*#__PURE__*/function () { _createClass(SignersUtils, null, [{ key: "resolve", value: function () { var _resolve2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(conf, transaction, extendFlag) { var extra, utils; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: extra = _resolve.extra(conf, transaction); if (extra.cache.signersUtils) { _context.next = 15; break; } extra.cache.txHash = transaction.hash(); utils = new SignersUtils(extra, transaction); /** * A list of the sources involved in the transaction. * @alias SignersUtils#sources * @type {Array} */ _context.next = 6; return _resolve.txSources(extra, transaction); case 6: utils.sources = _context.sent; _context.next = 9; return _resolve.txSigners(extra, transaction); case 9: utils.signers = _context.sent; _context.next = 12; return _resolve.txSignersList(extra, transaction); case 12: utils.signersList = _context.sent; Object.assign(utils, utilities); extra.cache.signersUtils = utils; case 15: if (!extendFlag) { _context.next = 20; break; } if (!transaction.hasSigner) { delete extra.cache.signersUtils.signatures; Object.assign(transaction, extra.cache.signersUtils); extra.cache.signersUtils.signatures = transaction.signatures; } return _context.abrupt("return", transaction); case 20: return _context.abrupt("return", extra.cache.signersUtils); case 21: case "end": return _context.stop(); } } }, _callee); })); function resolve(_x, _x2, _x3) { return _resolve2.apply(this, arguments); } return resolve; }() }]); function SignersUtils(conf, transaction) { _classCallCheck(this, SignersUtils); this.signatures = transaction.signatures; misc.setHiddenProperty(this, "_cosmicplus", transaction._cosmicplus); } return SignersUtils; }(); /******************************************************************************/ var utilities = {}; /** * Tests if **accountId** is a legit signer for the transaction. * * @example * if (transaction.hasSigner(GB...DEZX)) console.log('Legit signer') * * @alias SignersUtils#hasSigner * @param {string} accountId * @return {boolean} */ utilities.hasSigner = function (accountId) { return this.signersList.find(function (key) { return key === accountId; }); }; /** * Tests if **accountId** has signed the transaction. * * @example * if (transaction.hasSigned(GB...DEZX)) console.log('Has signed') * * @alias SignersUtils#hasSigned * @param {string} accountId * @return {boolean} */ utilities.hasSigned = function (accountId) { if (accountId.substr(0, 1) === "G") { var keypair = StellarSdk.Keypair.fromPublicKey(accountId); var txHash = this._cosmicplus.cache.txHash; return !!this.signatures.find(function (entry) { return keypair.verify(txHash, entry.signature()); }); } }; /******************************************************************************/ /** * Returns SignersUtils for **transaction**. * * @async * @param {Transaction} transaction * @return {SignersUtils} */ signersUtils["for"] = function (conf, transaction) { return SignersUtils.resolve(conf, transaction); }; /** * Extends **transaction** with SignersUtils. * * @async * @param {Transaction} transaction * @return {Transaction} */ signersUtils["extends"] = function (conf, transaction) { return SignersUtils.resolve(conf, transaction, true); };