minterjs-util
Version:
Utils for Minter
228 lines (218 loc) • 10.6 kB
JavaScript
;
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
*/