UNPKG

minterjs-util

Version:
228 lines (218 loc) 10.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FeePrice = FeePrice; var _ethjsUtil = require("ethjs-util"); var _big = _interopRequireDefault(require("./big.js")); var _txTypes = require("./tx-types.js"); var _converter = require("./converter.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /** * Accept current network fee values in pips. * Provide instance to calculate fee for particular transaction based on its params. * * @param {CommissionPriceData} commissionPriceData * @constructor */ function FeePrice(commissionPriceData) { var _this = this; var _mapApiData = mapApiData(commissionPriceData), baseFeeList = _mapApiData.baseFeeList, deltaFeeList = _mapApiData.deltaFeeList, tickerFeeList = _mapApiData.tickerFeeList, payloadByteFee = _mapApiData.payloadByteFee; this.baseFeeList = baseFeeList; this.deltaFeeList = deltaFeeList; this.tickerFeeList = tickerFeeList; this.payloadByteFee = payloadByteFee; /** * @param {TX_TYPE} txType * @param {FeePriceOptions} [options] * @return {number|string} */ this.getFeeValue = function (txType) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, payload = _ref.payload, _ref$payloadLength = _ref.payloadLength, payloadLength = _ref$payloadLength === void 0 ? 0 : _ref$payloadLength, coinSymbol = _ref.coinSymbol, coinSymbolLength = _ref.coinSymbolLength, deltaItemCount = _ref.deltaItemCount, fallbackOnInvalidInput = _ref.fallbackOnInvalidInput; // txType to string txType = (0, _txTypes.normalizeTxType)(txType); var isDeltaType = txType === _txTypes.TX_TYPE.MULTISEND || txType === _txTypes.TX_TYPE.BUY_SWAP_POOL || txType === _txTypes.TX_TYPE.SELL_SWAP_POOL || txType === _txTypes.TX_TYPE.SELL_ALL_SWAP_POOL; if (isDeltaType && !(deltaItemCount >= 1)) { if (fallbackOnInvalidInput) { deltaItemCount = 1; } else { throw new Error("`deltaItemCount` should be positive integer when tx type is ".concat(txType, " (").concat(_txTypes.txTypeList[Number(txType)].name, ")")); } } if (Buffer.isBuffer(payload)) { payloadLength = payload.length; } else if (payload) { payloadLength = (0, _ethjsUtil.getBinarySize)(payload.toString()); } var baseFee = _this.baseFeeList[txType]; if (isFeeInvalid(baseFee)) { // eslint-disable-next-line no-console console.warn("No base commission price specified for ".concat(txType, " tx type (").concat(_txTypes.txTypeList[Number(txType)].name, ")")); baseFee = 0; } var deltaFee = _this.deltaFeeList[txType]; if (isDeltaType && isFeeInvalid(deltaFee)) { // eslint-disable-next-line no-console console.warn("No delta commission price specified for ".concat(txType, " tx type (").concat(_txTypes.txTypeList[Number(txType)].name, ")")); deltaFee = 0; } // extra fee based on count var deltaTotalFee = isDeltaType ? new _big["default"](deltaItemCount - 1).times(deltaFee) : 0; // coin symbol extra fee var tickerLengthFee = txType === _txTypes.TX_TYPE.CREATE_COIN || txType === _txTypes.TX_TYPE.CREATE_TOKEN ? _this.getCoinSymbolFee(coinSymbol, coinSymbolLength, fallbackOnInvalidInput) : 0; var payloadFee = new _big["default"](_this.payloadByteFee).times(payloadLength); return (0, _converter.convertFromPip)(new _big["default"](baseFee).plus(payloadFee).plus(deltaTotalFee).plus(tickerLengthFee)); }; /** * @param {string} [ticker] * @param {number} [length] * @param {boolean} [fallbackOnInvalidInput] * @return {number|string} - value in pip */ this.getCoinSymbolFee = function (ticker, length, fallbackOnInvalidInput) { length = ticker ? ticker.length : length; if (!isValidLength(length)) { if (fallbackOnInvalidInput) { length = 7; } else { throw new Error('Coin symbol length should be between 3 and 10'); } } return _this.tickerFeeList[length]; // eslint-disable-next-line unicorn/consistent-function-scoping, no-shadow function isValidLength(length) { return length >= 3 && length <= 10; } }; } function isFeeInvalid(fee) { return typeof fee !== 'number' && typeof fee !== 'string' || typeof fee === 'string' && fee.length === 0; } /** * @typedef {object} FeePriceOptions * @property {string|Buffer} [payload] * @property {number} [payloadLength] * @property {string} [coinSymbol] * @property {number} [coinSymbolLength] * @property {number} [deltaItemCount] * @property {boolean} [fallbackOnInvalidInput] */ /** * @typedef {{'3': number|string, '4': number|string, '5': number|string, '6': number|string, '7': number|string, '8': number|string, '9': number|string, '10': number|string}} TickerFeeList */ /** * @typedef {Record<TX_TYPE, number|string>} FeeList */ /** * @param {CommissionPriceData} data * @return {CommissionPriceMapped} */ function mapApiData(data) { var _customKeysFeeList, _deltaFeeList; var coin = data.coin; var payloadByteFee = data.payload_byte; var tickerFeeList = { 3: data.create_ticker3, 4: data.create_ticker4, 5: data.create_ticker5, 6: data.create_ticker6, 7: data.create_ticker7_10, 8: data.create_ticker7_10, 9: data.create_ticker7_10, 10: data.create_ticker7_10 }; var customKeysFeeList = (_customKeysFeeList = {}, _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.SELL, data.sell_bancor), _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.SELL_ALL, data.sell_all_bancor), _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.BUY, data.buy_bancor), _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.MULTISEND, data.multisend_base), _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.SELL_SWAP_POOL, data.sell_pool_base), _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.BUY_SWAP_POOL, data.buy_pool_base), _defineProperty(_customKeysFeeList, _txTypes.TX_TYPE.SELL_ALL_SWAP_POOL, data.sell_all_pool_base), _customKeysFeeList); function getBaseFeeForTypeItem(typeItem) { return customKeysFeeList[typeItem.hex] || data[typeItem.key]; } var baseFeeListEntries = _txTypes.txTypeList.map(function (typeItem) { return [typeItem.hex, getBaseFeeForTypeItem(typeItem)]; }).filter(function (item) { return !!item; }); var baseFeeList = Object.fromEntries(baseFeeListEntries); var deltaFeeList = (_deltaFeeList = {}, _defineProperty(_deltaFeeList, _txTypes.TX_TYPE.MULTISEND, data.multisend_delta), _defineProperty(_deltaFeeList, _txTypes.TX_TYPE.SELL_SWAP_POOL, data.sell_pool_delta), _defineProperty(_deltaFeeList, _txTypes.TX_TYPE.BUY_SWAP_POOL, data.buy_pool_delta), _defineProperty(_deltaFeeList, _txTypes.TX_TYPE.SELL_ALL_SWAP_POOL, data.sell_all_pool_delta), _deltaFeeList); return { coin: coin, baseFeeList: baseFeeList, deltaFeeList: deltaFeeList, tickerFeeList: tickerFeeList, payloadByteFee: payloadByteFee }; } /** * @typedef {object} CommissionPriceMapped * @property {Coin} coin * @property {FeeList} baseFeeList * @property {FeeList} deltaFeeList * @property {TickerFeeList} tickerFeeList * @property {number|string} payloadByteFee */ /** * @typedef {object} CommissionPriceData * @property {Coin} coin * @property {string|number} payload_byte * @property {string|number} send * @property {string|number} buy_bancor * @property {string|number} sell_bancor * @property {string|number} sell_all_bancor * @property {string|number} buy_pool_base * @property {string|number} buy_pool_delta * @property {string|number} sell_pool_base * @property {string|number} sell_pool_delta * @property {string|number} sell_all_pool_base * @property {string|number} sell_all_pool_delta * @property {string|number} create_ticker3 * @property {string|number} create_ticker4 * @property {string|number} create_ticker5 * @property {string|number} create_ticker6 * @property {string|number} create_ticker7_10 * @property {string|number} create_coin * @property {string|number} create_token * @property {string|number} recreate_coin * @property {string|number} recreate_token * @property {string|number} declare_candidacy * @property {string|number} delegate * @property {string|number} unbond * @property {string|number} redeem_check * @property {string|number} set_candidate_on * @property {string|number} set_candidate_off * @property {string|number} create_multisig * @property {string|number} multisend_delta * @property {string|number} multisend_base * @property {string|number} edit_candidate * @property {string|number} set_halt_block * @property {string|number} edit_ticker_owner * @property {string|number} edit_multisig * @property {string|number} [price_vote] * @property {string|number} edit_candidate_public_key * @property {string|number} add_liquidity * @property {string|number} remove_liquidity * @property {string|number} edit_candidate_commission * @property {string|number} move_stake * @property {string|number} mint_token * @property {string|number} burn_token * @property {string|number} vote_commission * @property {string|number} vote_update * @property {string|number} create_swap_pool * @property {string|number} failed_tx * @property {string|number} add_limit_order * @property {string|number} remove_limit_order * @property {string|number} lock_stake * @property {string|number} lock */