UNPKG

@unification-com/und-js-v2

Version:
1,128 lines (1,117 loc) 78.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.UndClient = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _crypto = _interopRequireDefault(require("crypto")); var _nodeFetch = _interopRequireDefault(require("node-fetch")); var _proto = _interopRequireDefault(require("../messages/proto")); var _secp256k = _interopRequireDefault(require("secp256k1")); var _config = _interopRequireDefault(require("../config")); var fundCrypto = _interopRequireWildcard(require("../crypto")); var _validateHelper = require("../utils/validateHelper"); var _utils = require("../utils"); var msgFactory = _interopRequireWildcard(require("../messages/factory")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var UndClient = /*#__PURE__*/function () { function UndClient(url) { var broadcastMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "BROADCAST_MODE_SYNC"; (0, _classCallCheck2["default"])(this, UndClient); if (!url) { throw new Error("FUND Mainchain API url should not be null"); } this.url = url; this.chainId = null; this.path = "".concat(_config["default"].HD_PATH, "0"); this.bech32MainPrefix = _config["default"].BECH32_PREFIX; this.broadcastMode = broadcastMode; this.accountNumber = -1; this.address = null; this.privKey = null; this.pubKeyAny = null; } /* * Class setters and intialiser */ /** * Initialize the client with the chain's ID. Asynchronous. * @return {Promise} */ (0, _createClass2["default"])(UndClient, [{ key: "initChain", value: function () { var _initChain = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var data; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (this.chainId) { _context.next = 7; break; } _context.next = 3; return this.getChainInfo(); case 3: data = _context.sent; this.chainId = data.default_node_info.network; this.node_info = data.default_node_info; this.node_app_version = data.application_version; case 7: return _context.abrupt("return", this); case 8: case "end": return _context.stop(); } }, _callee, this); })); function initChain() { return _initChain.apply(this, arguments); } return initChain; }() /** * Set the private key for the client * @param {String|Buffer} privKey private key as a hex string or Buffer */ }, { key: "setPrivateKey", value: function () { var _setPrivateKey = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(privKey) { var accData; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: this.privKey = Buffer.from(privKey, "hex"); this.pubKeyAny = msgFactory.getPubKeyAny(this.privKey); this.address = fundCrypto.getAddressFromPrivateKey(this.privKey.toString("hex"), this.bech32MainPrefix); _context2.next = 5; return this.getAccount(this.address); case 5: accData = _context2.sent; if (accData !== null && accData !== void 0 && accData.account) { this.accountNumber = accData.account.account_number; } case 7: case "end": return _context2.stop(); } }, _callee2, this); })); function setPrivateKey(_x) { return _setPrivateKey.apply(this, arguments); } return setPrivateKey; }() }, { key: "clean", value: function clean() { this.accountNumber = -1; this.address = null; this.privKey = null; this.pubKeyAny = null; } }, { key: "getPubKeyAny", value: function getPubKeyAny() { return this.pubKeyAny; } /** * Set the mode for broadcasting a Tx * "BROADCAST_MODE_UNSPECIFIED", "BROADCAST_MODE_BLOCK", "BROADCAST_MODE_SYNC", "BROADCAST_MODE_ASYNC" * @param {String} broadcastMode sync = wait for checkTx, async = send and forget (faster but less guarantees), block = wait for block to process (default sync) */ }, { key: "setBroadcastMode", value: function setBroadcastMode(broadcastMode) { this.broadcastMode = broadcastMode; } /* * Send Transaction functions */ /** * Transfer FUND to an address * @param {String} toAddress * @param {Number} amount * @param {Object} fee * @param {String} denom optional denom * @param {String} fromAddress optional fromAddress * @param {String} memo optional memo * @returns {Promise<*>} */ }, { key: "transferUnd", value: function () { var _transferUnd = (0, _asyncToGenerator2["default"])(function (toAddress, amount, fee) { var _this = this; var denom = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "nund"; var fromAddress = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.address; var memo = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee3() { var _convertAmount, amt, dnm, _convertAmount2, feeAmt, feeDnm, accData, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (fromAddress) { _context3.next = 2; break; } throw new Error("fromAddress should not be empty"); case 2: if (toAddress) { _context3.next = 4; break; } throw new Error("toAddress should not be empty"); case 4: if (!(amount === 0)) { _context3.next = 6; break; } throw new Error("amount should not be zero"); case 6: if (fundCrypto.checkAddress(toAddress, _this.bech32MainPrefix)) { _context3.next = 8; break; } throw new Error("invalid toAddress"); case 8: if (fundCrypto.checkAddress(fromAddress, _this.bech32MainPrefix)) { _context3.next = 10; break; } throw new Error("invalid fromAddress"); case 10: (0, _validateHelper.checkNumber)(amount, "amount"); _convertAmount = (0, _utils.convertAmount)(amount, denom), amt = _convertAmount.amt, dnm = _convertAmount.dnm; _convertAmount2 = (0, _utils.convertAmount)(fee.amount, fee.denom), feeAmt = _convertAmount2.amt, feeDnm = _convertAmount2.dnm; _context3.next = 15; return _this.getAccount(fromAddress); case 15: accData = _context3.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context3.next = 18; break; } throw new Error(accData.message); case 18: // ---------------------------------- (1)txBody ---------------------------------- txBody = msgFactory.getMsgSendTx(fromAddress, toAddress, amt, dnm, memo); // --------------------------------- (2)authInfo --------------------------------- authInfo = _this.compileAuthInfo(accData.account.sequence, feeAmt, feeDnm, fee.gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this.sign(txBody, authInfo); return _context3.abrupt("return", _this.broadcast(signedTxBytes)); case 22: case "end": return _context3.stop(); } }, _callee3); })(); }); function transferUnd(_x2, _x3, _x4) { return _transferUnd.apply(this, arguments); } return transferUnd; }() /** * Register a BEACON * @param moniker {String} moniker * @param name {String} name optional name * @param fromAddress {String} fromAddress * @param gas {Number} gas optional gas * @param memo {String} memo optional memo * @returns {Promise<*>} */ }, { key: "registerBeacon", value: function () { var _registerBeacon = (0, _asyncToGenerator2["default"])(function (moniker) { var _this2 = this; var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ""; var fromAddress = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.address; var gas = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 100000; var memo = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee4() { var accData, beaconParams, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: if (fromAddress) { _context4.next = 2; break; } throw new Error("fromAddress should not be empty"); case 2: if (fundCrypto.checkAddress(fromAddress, _config["default"].BECH32_PREFIX)) { _context4.next = 4; break; } throw new Error("invalid fromAddress"); case 4: if (!(moniker === "" || moniker === null || moniker === undefined)) { _context4.next = 6; break; } throw new Error("beacon must have a moniker"); case 6: _context4.next = 8; return _this2.getAccount(fromAddress); case 8: accData = _context4.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context4.next = 11; break; } throw new Error(accData.message); case 11: _context4.next = 13; return _this2.getBeaconParams(); case 13: beaconParams = _context4.sent; txBody = msgFactory.getMsgRegisterBeacon(moniker, name, fromAddress); authInfo = _this2.compileAuthInfo(accData.account.sequence, beaconParams.params.fee_register, beaconParams.params.denom, gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this2.sign(txBody, authInfo); return _context4.abrupt("return", _this2.broadcast(signedTxBytes)); case 18: case "end": return _context4.stop(); } }, _callee4); })(); }); function registerBeacon(_x5) { return _registerBeacon.apply(this, arguments); } return registerBeacon; }() /** * Submit a BEACON timestamp * @param beaconId {Number} beacon_id * @param hash {String} hash * @param submitTime {Number} submit_time * @param fromAddress {String} fromAddress * @param gas {Number} gas optional gas * @param memo {String} memo optional memo * @returns {Promise<*>} */ }, { key: "recordBeaconTimestamp", value: function () { var _recordBeaconTimestamp = (0, _asyncToGenerator2["default"])(function (beaconId, hash, submitTime) { var _this3 = this; var fromAddress = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.address; var gas = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 100000; var memo = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee5() { var accData, beaconParams, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: if (fromAddress) { _context5.next = 2; break; } throw new Error("fromAddress should not be empty"); case 2: if (fundCrypto.checkAddress(fromAddress, _config["default"].BECH32_PREFIX)) { _context5.next = 4; break; } throw new Error("invalid fromAddress"); case 4: if (!(parseInt(beaconId) <= 0)) { _context5.next = 6; break; } throw new Error("must have beacon id"); case 6: if (!(hash === "" || hash === null || hash === undefined)) { _context5.next = 8; break; } throw new Error("beacon must have hash"); case 8: if (!(parseInt(submitTime, 10) <= 0)) { _context5.next = 10; break; } throw new Error("must have submit time"); case 10: _context5.next = 12; return _this3.getAccount(fromAddress); case 12: accData = _context5.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context5.next = 15; break; } throw new Error(accData.message); case 15: _context5.next = 17; return _this3.getBeaconParams(); case 17: beaconParams = _context5.sent; txBody = msgFactory.getMsgRecordBeaconTimestamp(beaconId, hash, submitTime, fromAddress); authInfo = _this3.compileAuthInfo(accData.account.sequence, beaconParams.params.fee_record, beaconParams.params.denom, gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this3.sign(txBody, authInfo); return _context5.abrupt("return", _this3.broadcast(signedTxBytes)); case 22: case "end": return _context5.stop(); } }, _callee5); })(); }); function recordBeaconTimestamp(_x6, _x7, _x8) { return _recordBeaconTimestamp.apply(this, arguments); } return recordBeaconTimestamp; }() /** * Register a WRKChain * @param moniker {String} moniker * @param baseType {String} base_type optional base_type * @param name {String} name optional name * @param genesis {String} genesis optional genesis * @param fromAddress {String} fromAddress * @param gas {Number} gas optional gas * @param memo {String} memo optional memo * @returns {Promise<*>} */ }, { key: "registerWRKChain", value: function () { var _registerWRKChain = (0, _asyncToGenerator2["default"])(function (moniker, baseType) { var _this4 = this; var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; var genesis = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ""; var fromAddress = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.address; var gas = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 100000; var memo = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee6() { var accData, params, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: if (fromAddress) { _context6.next = 2; break; } throw new Error("fromAddress should not be empty"); case 2: if (fundCrypto.checkAddress(fromAddress, _config["default"].BECH32_PREFIX)) { _context6.next = 4; break; } throw new Error("invalid fromAddress"); case 4: if (!(moniker === "" || moniker === null || moniker === undefined)) { _context6.next = 6; break; } throw new Error("wrkchain must have a moniker"); case 6: if (!(baseType === "" || baseType === null || baseType === undefined)) { _context6.next = 8; break; } throw new Error("wrkchain must have a type"); case 8: _context6.next = 10; return _this4.getAccount(fromAddress); case 10: accData = _context6.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context6.next = 13; break; } throw new Error(accData.message); case 13: _context6.next = 15; return _this4.getWRKChainParams(); case 15: params = _context6.sent; txBody = msgFactory.getMsgRegisterWrkChain(moniker, name, genesis, baseType, fromAddress); authInfo = _this4.compileAuthInfo(accData.account.sequence, params.params.fee_register, params.params.denom, gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this4.sign(txBody, authInfo); return _context6.abrupt("return", _this4.broadcast(signedTxBytes)); case 20: case "end": return _context6.stop(); } }, _callee6); })(); }); function registerWRKChain(_x9, _x10) { return _registerWRKChain.apply(this, arguments); } return registerWRKChain; }() /** * Submit WRKChain block header hashes * @param wrkchainId {Number} wrkchain_id * @param height {String} height * @param blockHash {String} blockhash * @param parentHash {String} parenthash optional parenthash * @param hash1 {String} hash1 optional hash1 * @param hash2 {String} hash2 optional hash2 * @param hash3 {String} hash3 optional hash3 * @param fromAddress {String} fromAddress * @param gas {Number} gas optional gas * @param memo {String} memo optional memo * @param sequence {Number} sequence optional sequence * @returns {Promise<*>} */ }, { key: "recordWRKChainBlock", value: function () { var _recordWRKChainBlock = (0, _asyncToGenerator2["default"])(function (wrkchainId, height, blockHash, parentHash, hash1, hash2, hash3) { var _this5 = this; var fromAddress = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : this.address; var gas = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 120000; var memo = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : ""; var sequence = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : null; return /*#__PURE__*/_regenerator["default"].mark(function _callee7() { var accData, params, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: if (fromAddress) { _context7.next = 2; break; } throw new Error("fromAddress should not be empty"); case 2: if (fundCrypto.checkAddress(fromAddress, _config["default"].BECH32_PREFIX)) { _context7.next = 4; break; } throw new Error("invalid fromAddress"); case 4: if (!(parseInt(wrkchainId) <= 0)) { _context7.next = 6; break; } throw new Error("must have wrkchain id"); case 6: if (!(blockHash === "" || blockHash === null || blockHash === undefined)) { _context7.next = 8; break; } throw new Error("wrkchain must have blockhash"); case 8: if (!(parseInt(height) <= 0)) { _context7.next = 10; break; } throw new Error("must have height"); case 10: _context7.next = 12; return _this5.getAccount(fromAddress); case 12: accData = _context7.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context7.next = 15; break; } throw new Error(accData.message); case 15: _context7.next = 17; return _this5.getWRKChainParams(); case 17: params = _context7.sent; txBody = msgFactory.getMsgRecordWrkChainBlock(wrkchainId, height, blockHash, parentHash, hash1, hash2, hash3, fromAddress); authInfo = _this5.compileAuthInfo(accData.account.sequence, params.params.fee_record, params.params.denom, gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this5.sign(txBody, authInfo); return _context7.abrupt("return", _this5.broadcast(signedTxBytes)); case 22: case "end": return _context7.stop(); } }, _callee7); })(); }); function recordWRKChainBlock(_x11, _x12, _x13, _x14, _x15, _x16, _x17) { return _recordWRKChainBlock.apply(this, arguments); } return recordWRKChainBlock; }() /** * Delegate FUND to a validator * @param {String} validator * @param {Number} amount * @param {Object} fee * @param {String} denom optional denom * @param {String} delegator optional delegator * @param {String} memo optional memo * @returns {Promise<*>} */ }, { key: "delegate", value: function () { var _delegate = (0, _asyncToGenerator2["default"])(function (validator, amount, fee) { var _this6 = this; var denom = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "nund"; var delegator = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.address; var memo = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee8() { var _convertAmount3, amt, dnm, _convertAmount4, feeAmt, feeDnm, accData, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: if (delegator) { _context8.next = 2; break; } throw new Error("delegator should not be empty"); case 2: if (fundCrypto.checkAddress(delegator, _config["default"].BECH32_PREFIX)) { _context8.next = 4; break; } throw new Error("invalid delegator"); case 4: if (validator) { _context8.next = 6; break; } throw new Error("validator should not be empty"); case 6: if (fundCrypto.checkAddress(validator, _config["default"].BECH32_VAL_PREFIX)) { _context8.next = 8; break; } throw new Error("invalid validator"); case 8: if (!(amount === 0)) { _context8.next = 10; break; } throw new Error("amount should not be zero"); case 10: (0, _validateHelper.checkNumber)(amount, "amount"); _convertAmount3 = (0, _utils.convertAmount)(amount, denom), amt = _convertAmount3.amt, dnm = _convertAmount3.dnm; _convertAmount4 = (0, _utils.convertAmount)(fee.amount, fee.denom), feeAmt = _convertAmount4.amt, feeDnm = _convertAmount4.dnm; _context8.next = 15; return _this6.getAccount(delegator); case 15: accData = _context8.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context8.next = 18; break; } throw new Error(accData.message); case 18: txBody = msgFactory.getMsgDelegate(delegator, validator, amt, dnm, memo); authInfo = _this6.compileAuthInfo(accData.account.sequence, feeAmt, feeDnm, fee.gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this6.sign(txBody, authInfo); return _context8.abrupt("return", _this6.broadcast(signedTxBytes)); case 22: case "end": return _context8.stop(); } }, _callee8); })(); }); function delegate(_x18, _x19, _x20) { return _delegate.apply(this, arguments); } return delegate; }() /** * Undelegate FUND from a validator * @param {String} validator * @param {Number} amount * @param {Object} fee * @param {String} denom optional denom * @param {String} delegator optional delegator * @param {String} memo optional memo * @returns {Promise<*>} */ }, { key: "undelegate", value: function () { var _undelegate = (0, _asyncToGenerator2["default"])(function (validator, amount, fee) { var _this7 = this; var denom = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "nund"; var delegator = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.address; var memo = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee9() { var _convertAmount5, amt, dnm, _convertAmount6, feeAmt, feeDnm, accData, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: if (delegator) { _context9.next = 2; break; } throw new Error("delegator should not be empty"); case 2: if (fundCrypto.checkAddress(delegator, _config["default"].BECH32_PREFIX)) { _context9.next = 4; break; } throw new Error("invalid delegator"); case 4: if (validator) { _context9.next = 6; break; } throw new Error("validator should not be empty"); case 6: if (fundCrypto.checkAddress(validator, _config["default"].BECH32_VAL_PREFIX)) { _context9.next = 8; break; } throw new Error("invalid validator"); case 8: if (!(amount === 0)) { _context9.next = 10; break; } throw new Error("amount should not be zero"); case 10: (0, _validateHelper.checkNumber)(amount, "amount"); _convertAmount5 = (0, _utils.convertAmount)(amount, denom), amt = _convertAmount5.amt, dnm = _convertAmount5.dnm; _convertAmount6 = (0, _utils.convertAmount)(fee.amount, fee.denom), feeAmt = _convertAmount6.amt, feeDnm = _convertAmount6.dnm; _context9.next = 15; return _this7.getAccount(delegator); case 15: accData = _context9.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context9.next = 18; break; } throw new Error(accData.message); case 18: txBody = msgFactory.getMsgUndelegate(delegator, validator, amt, dnm, memo); authInfo = _this7.compileAuthInfo(accData.account.sequence, feeAmt, feeDnm, fee.gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this7.sign(txBody, authInfo); return _context9.abrupt("return", _this7.broadcast(signedTxBytes)); case 22: case "end": return _context9.stop(); } }, _callee9); })(); }); function undelegate(_x21, _x22, _x23) { return _undelegate.apply(this, arguments); } return undelegate; }() /** * Redelegate FUND from one validator to another * @param {String} validatorFrom * @param {String} validatorTo * @param {Number} amount * @param {Object} fee * @param {String} denom optional denom * @param {String} delegator optional delegator * @param {String} memo optional memo * @param {Number} sequence optional sequence * @returns {Promise<*>} */ }, { key: "redelegate", value: function () { var _redelegate = (0, _asyncToGenerator2["default"])(function (validatorFrom, validatorTo, amount, fee) { var _this8 = this; var denom = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "nund"; var delegator = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : this.address; var memo = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee10() { var _convertAmount7, amt, dnm, _convertAmount8, feeAmt, feeDnm, accData, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee10$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: if (delegator) { _context10.next = 2; break; } throw new Error("delegator should not be empty"); case 2: if (fundCrypto.checkAddress(delegator, _config["default"].BECH32_PREFIX)) { _context10.next = 4; break; } throw new Error("invalid delegator"); case 4: if (validatorFrom) { _context10.next = 6; break; } throw new Error("validator should not be empty"); case 6: if (fundCrypto.checkAddress(validatorFrom, _config["default"].BECH32_VAL_PREFIX)) { _context10.next = 8; break; } throw new Error("invalid validatorFrom"); case 8: if (validatorTo) { _context10.next = 10; break; } throw new Error("validator should not be empty"); case 10: if (fundCrypto.checkAddress(validatorTo, _config["default"].BECH32_VAL_PREFIX)) { _context10.next = 12; break; } throw new Error("invalid validatorTo"); case 12: if (!(amount === 0)) { _context10.next = 14; break; } throw new Error("amount should not be zero"); case 14: (0, _validateHelper.checkNumber)(amount, "amount"); _convertAmount7 = (0, _utils.convertAmount)(amount, denom), amt = _convertAmount7.amt, dnm = _convertAmount7.dnm; _convertAmount8 = (0, _utils.convertAmount)(fee.amount, fee.denom), feeAmt = _convertAmount8.amt, feeDnm = _convertAmount8.dnm; _context10.next = 19; return _this8.getAccount(delegator); case 19: accData = _context10.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context10.next = 22; break; } throw new Error(accData.message); case 22: txBody = msgFactory.getMsgBeginRedelegate(delegator, validatorFrom, validatorTo, amt, dnm, memo); authInfo = _this8.compileAuthInfo(accData.account.sequence, feeAmt, feeDnm, fee.gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this8.sign(txBody, authInfo); return _context10.abrupt("return", _this8.broadcast(signedTxBytes)); case 26: case "end": return _context10.stop(); } }, _callee10); })(); }); function redelegate(_x24, _x25, _x26, _x27) { return _redelegate.apply(this, arguments); } return redelegate; }() /** * Withdraw Delegator rewards * @param {String} validator * @param {Object} fee * @param {Boolean} commission optional include validator commission * @param {String} delegator optional delegator * @param {String} memo optional memo * @returns {Promise<*>} */ }, { key: "withdrawDelegationReward", value: function () { var _withdrawDelegationReward = (0, _asyncToGenerator2["default"])(function (validator, fee) { var _this9 = this; var commission = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var delegator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.address; var memo = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee11() { var _convertAmount9, feeAmt, feeDnm, accData, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) switch (_context11.prev = _context11.next) { case 0: if (delegator) { _context11.next = 2; break; } throw new Error("delegator should not be empty"); case 2: if (fundCrypto.checkAddress(delegator, _config["default"].BECH32_PREFIX)) { _context11.next = 4; break; } throw new Error("invalid delegator"); case 4: if (validator) { _context11.next = 6; break; } throw new Error("validator should not be empty"); case 6: if (!commission) { _context11.next = 9; break; } if ((0, _validateHelper.isSelfDelegator)(validator, delegator, _config["default"].BECH32_PREFIX)) { _context11.next = 9; break; } throw new Error("delegator is not the delf delegator address"); case 9: _convertAmount9 = (0, _utils.convertAmount)(fee.amount, fee.denom), feeAmt = _convertAmount9.amt, feeDnm = _convertAmount9.dnm; _context11.next = 12; return _this9.getAccount(delegator); case 12: accData = _context11.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context11.next = 15; break; } throw new Error(accData.message); case 15: txBody = msgFactory.getMsgWithdrawDelegatorReward(delegator, validator, commission, memo); authInfo = _this9.compileAuthInfo(accData.account.sequence, feeAmt, feeDnm, fee.gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this9.sign(txBody, authInfo); return _context11.abrupt("return", _this9.broadcast(signedTxBytes)); case 19: case "end": return _context11.stop(); } }, _callee11); })(); }); function withdrawDelegationReward(_x28, _x29) { return _withdrawDelegationReward.apply(this, arguments); } return withdrawDelegationReward; }() /** * Vote on a Governance Proposal * @param {Number} proposalId * @param {String} option yes | no | abstain | nowithveto * @param {Object} fee * @param {String} voter optional voter * @param {String} memo optional memo * @returns {Promise<*>} */ }, { key: "voteOnProposal", value: function () { var _voteOnProposal = (0, _asyncToGenerator2["default"])(function (proposalId, option, fee) { var _this10 = this; var voter = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.address; var memo = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ""; return /*#__PURE__*/_regenerator["default"].mark(function _callee12() { var _convertAmount10, feeAmt, feeDnm, accData, txBody, authInfo, signedTxBytes; return _regenerator["default"].wrap(function _callee12$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: if (voter) { _context12.next = 2; break; } throw new Error("voter should not be empty"); case 2: if (fundCrypto.checkAddress(voter, _config["default"].BECH32_PREFIX)) { _context12.next = 4; break; } throw new Error("invalid voter"); case 4: _context12.t0 = option; _context12.next = _context12.t0 === "VOTE_OPTION_YES" ? 7 : _context12.t0 === "VOTE_OPTION_ABSTAIN" ? 7 : _context12.t0 === "VOTE_OPTION_NO" ? 7 : _context12.t0 === "VOTE_OPTION_NO_WITH_VETO" ? 7 : 8; break; case 7: return _context12.abrupt("break", 9); case 8: throw new Error("\"".concat(option, "\" is an invalid vote option")); case 9: _convertAmount10 = (0, _utils.convertAmount)(fee.amount, fee.denom), feeAmt = _convertAmount10.amt, feeDnm = _convertAmount10.dnm; _context12.next = 12; return _this10.getAccount(voter); case 12: accData = _context12.sent; if (!(accData !== null && accData !== void 0 && accData.code)) { _context12.next = 15; break; } throw new Error(accData.message); case 15: txBody = msgFactory.getMsgVote(proposalId, option, voter, memo); authInfo = _this10.compileAuthInfo(accData.account.sequence, feeAmt, feeDnm, fee.gas); // -------------------------------- sign -------------------------------- signedTxBytes = _this10.sign(txBody, authInfo); return _context12.abrupt("return", _this10.broadcast(signedTxBytes)); case 19: case "end": return _context12.stop(); } }, _callee12); })(); }); function voteOnProposal(_x30, _x31, _x32) { return _voteOnProposal.apply(this, arguments); } return voteOnProposal; }() /** * generates the required auth info to be included with the tx body for signing * @param sequence {Number} account sequence * @param feeAmount {Number} fee amount * @param feeDenom {String} fee denomination * @param gas {Number} gas limit * @param pubKeyAny * @returns {*} */ }, { key: "compileAuthInfo", value: function compileAuthInfo(sequence, feeAmount, feeDenom, gas) { var pubKeyAny = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.pubKeyAny; var signerInfo = msgFactory.getSignerInfo(pubKeyAny, sequence); var feeValue = msgFactory.getFee(feeAmount, feeDenom, gas); return msgFactory.getAuthInfo(signerInfo, feeValue); } /* * API getters */ /** * get chain & network info * @returns {Promise<{result: {error: *}, status: number}|{result: *, status: *}|void>} */ }, { key: "getChainInfo", value: function getChainInfo() { var nodeInfo = "/cosmos/base/tendermint/v1beta1/node_info"; return (0, _nodeFetch["default"])(this.url + nodeInfo).then(function (response) { return response.json(); }); } /** * get account info * @param {String} address optional address * @returns {Promise<{result: {error: *}, status: number}|{result: *, status: *}|void>} */ }, { key: "getAccount", value: function getAccount() { var address = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.address; var api = "/cosmos/auth/v1beta1/accounts/"; return (0, _nodeFetch["default"])(this.url + api + address).then(function (response) { return response.json(); }); } /** * get BEACON params * @returns {Promise<{result: {error: *}, status: number}|{result: *, status: *}|void>} */ }, { key: "getBeaconParams", value: function () { var _getBeaconParams = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() { var api; return _regenerator["default"].wrap(function _callee13$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: api = "/mainchain/beacon/v1/params"; return _context13.abrupt("return", (0, _nodeFetch["default"])(this.url + api).then(function (response) { return response.json(); })); case 2: case "end": return _context13.stop(); } }, _callee13, this); })); function getBeaconParams() { return _getBeaconParams.apply(this, arguments); } return getBeaconParams; }() /** * get WRKChain params * @returns {Promise<{result: {error: *}, status: number}|{result: *, status: *}|void>} */ }, { key: "getWRKChainParams", value: function () { var _getWRKChainParams = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() { var api; return _regenerator["default"].wrap(function _callee14$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: api = "/mainchain/wrkchain/v1/params"; return _context14.abrupt("return", (0, _nodeFetch["default"])(this.url + api).then(function (response) { return response.json(); })); case 2: case "end": return _context14.stop(); } }, _callee14, this); })); function getWRKChainParams() { return _getWRKChainParams.apply(this, arguments); } return getWRKChainParams; }() /** * get balances for given address * @param {String} address optional address * @param {String} denom optional denomination * @return {Promise} resolves with http response */ }, { key: "getBalance", value: function () { var _getBalance = (0, _asyncToGenerator2["default"])(function () { var _this11 = this; var address = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.address; var denom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "nund"; return /*#__PURE__*/_regenerator["default"].mark(function _callee15() { var api, res; return _regenerator["default"].wrap(function _callee15$(_context15) { while (1) switch (_context15.prev = _context15.next) { case 0: api = "/cosmos/bank/v1beta1/balances/".concat(address); _context15.next = 3; return (0, _nodeFetch["default"])(_this11.url + api).then(function (response) { return response.json(); }); case 3: res = _context15.sent; return _context15.abrupt("return", (res === null || res === void 0 ? void 0 : res.balances) || []); case 5: case "end": return _context15.stop(); } }, _callee15); })(); }); function getBalance() { return _getBalance.apply(this, arguments); } return getBalance; }() /** * get transactions for an account * @param {String} address optional address * @param {Number} page page number, default 1 * @param {Number} limit number of results per page, default 100, max 100 * @param {String} order optional order * @return {Promise} resolves with http response */ }, { key: "getTransactions", value: function () { var _getTransactions = (0, _asyncToGenerator2["default"])(function () { var _this12 = this; var address = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.address; var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 100; var order = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "ORDER_BY_DESC"; return /*#__PURE__*/_regenerator["default"].mark(function _callee16() { var order_by, api; return _regenerator["default"].wrap(function _callee16$(_context16) { while (1) switch (_context16.prev = _context16.next) { case 0: order_by = 0; _context16.t0 = order; _context16.next = _context16.t0 === "ORDER_BY_UNSPECIFIED" ? 4 : _context16.t0 === "ORDER_BY_ASC" ? 6 : _context16.t0 === "ORDER_BY_DESC" ? 8 : 4; break; case 4: order_by = 0; return _context16.abrupt("break", 10); case 6: order_by = 1;