UNPKG

@bithomp/xrpl-api

Version:

A Bithomp JavaScript/TypeScript library for interacting with the XRP Ledger

137 lines (136 loc) 5.48 kB
'use strict'; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseOrderbookChanges = void 0; const _ = __importStar(require("lodash")); const bignumber_js_1 = require("bignumber.js"); const BigNumber = bignumber_js_1.BigNumber.clone({ DECIMAL_PLACES: 40 }); const utils_1 = require("../../v1/common/utils"); const quality_1 = require("./quality"); const currency_amount_1 = __importDefault(require("../../v1/ledger/parse/currency-amount")); const lsfSell = 0x00020000; function removeUndefined(obj) { return _.omitBy(obj, _.isUndefined); } function convertOrderChange(order) { var takerGets = order.taker_gets; var takerPays = order.taker_pays; var direction = order.sell ? 'sell' : 'buy'; var quantity = (direction === 'buy') ? takerPays : takerGets; var totalPrice = (direction === 'buy') ? takerGets : takerPays; return removeUndefined({ direction: direction, quantity: quantity, totalPrice: totalPrice, sequence: order.sequence, status: order.status, makerExchangeRate: order.quality, expirationTime: order.expiration }); } function getExpirationTime(node) { var expirationTime = node.finalFields.Expiration || node.newFields.Expiration; if (expirationTime === undefined) { return undefined; } return (new Date((0, utils_1.rippleToUnixTimestamp)(expirationTime))).toISOString(); } function getQuality(node) { var takerGets = node.finalFields.TakerGets || node.newFields.TakerGets; var takerPays = node.finalFields.TakerPays || node.newFields.TakerPays; var takerGetsCurrency = takerGets.currency || 'XRP'; var takerPaysCurrency = takerPays.currency || 'XRP'; var bookDirectory = node.finalFields.BookDirectory || node.newFields.BookDirectory; var qualityHex = bookDirectory.substring(bookDirectory.length - 16); return (0, quality_1.parseQuality)(qualityHex, takerGetsCurrency, takerPaysCurrency); } function parseOrderStatus(node) { if (node.diffType === 'CreatedNode') { return 'created'; } if (node.diffType === 'ModifiedNode') { return 'partially-filled'; } if (node.diffType === 'DeletedNode') { if (node.previousFields.hasOwnProperty('TakerPays')) { return 'filled'; } return 'cancelled'; } return undefined; } function calculateDelta(finalAmount, previousAmount) { if (previousAmount) { var finalValue = new BigNumber(finalAmount.value); var previousValue = new BigNumber(previousAmount.value); return finalValue.minus(previousValue).abs().toString(); } return '0'; } function parseChangeAmount(node, type) { var status = parseOrderStatus(node); if (status === 'cancelled') { return (0, currency_amount_1.default)(node.finalFields[type]); } else if (status === 'created') { return (0, currency_amount_1.default)(node.newFields[type]); } var finalAmount = (0, currency_amount_1.default)(node.finalFields[type]); var previousAmount = (0, currency_amount_1.default)(node.previousFields[type]); var value = calculateDelta(finalAmount, previousAmount); return _.assign({}, finalAmount, { value: value }); } function parseOrderChange(node) { var orderChange = convertOrderChange({ taker_pays: parseChangeAmount(node, 'TakerPays'), taker_gets: parseChangeAmount(node, 'TakerGets'), sell: (node.finalFields.Flags & lsfSell) !== 0, sequence: node.finalFields.Sequence || node.newFields.Sequence, status: parseOrderStatus(node), quality: getQuality(node), expiration: getExpirationTime(node) }); Object.defineProperty(orderChange, 'account', { value: node.finalFields.Account || node.newFields.Account }); return orderChange; } function groupByAddress(orderChanges) { return _.groupBy(orderChanges, function (change) { return change.account; }); } function parseOrderbookChanges(metadata) { var nodes = (0, utils_1.normalizeNodes)(metadata); var orderChanges = _.map(_.filter(nodes, function (node) { return node.entryType === 'Offer'; }), parseOrderChange); return groupByAddress(orderChanges); } exports.parseOrderbookChanges = parseOrderbookChanges;