cosmic-lib
Version:
A JavaScript implementation of the CosmicLink protocol for Stellar
213 lines (177 loc) • 6.88 kB
JavaScript
;
/**
* 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);
};