UNPKG

@bithomp/xrpl-api

Version:

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

95 lines (94 loc) 3.66 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseLockedBalanceChanges = parseLockedBalanceChanges; exports.parseFinalLockedBalances = parseFinalLockedBalances; const lodash_1 = __importDefault(require("lodash")); const bignumber_js_1 = __importDefault(require("bignumber.js")); const utils_1 = require("../utils"); function groupByAddress(lockedBalanceChanges) { const grouped = lodash_1.default.groupBy(lockedBalanceChanges, function (node) { return node.address; }); return lodash_1.default.mapValues(grouped, function (group) { return lodash_1.default.map(group, function (node) { return node.lockedBalance; }); }); } function parseValue(value) { return new bignumber_js_1.default(value.value ?? value); } function computeBalanceChange(node) { let value = null; if (node.newFields.LockedBalance) { value = parseValue(node.newFields.LockedBalance); } else if (node.previousFields.LockedBalance && node.finalFields.LockedBalance) { value = parseValue(node.finalFields.LockedBalance).minus(parseValue(node.previousFields.LockedBalance)); } else if (node.previousFields.LockedBalance) { value = parseValue(node.previousFields.LockedBalance).negated(); } return value === null ? null : value.isZero() ? null : value; } function parseFinalBalance(node) { if (node.newFields.LockedBalance) { return parseValue(node.newFields.LockedBalance); } else if (node.finalFields.LockedBalance) { return parseValue(node.finalFields.LockedBalance); } return null; } function parseTrustlineQuantity(node, valueParser) { const value = valueParser(node); if (value === null) { return null; } const fields = lodash_1.default.isEmpty(node.newFields) ? node.finalFields : node.newFields; const previousFields = node.previousFields; let viewLowest = true; if (previousFields && previousFields.Balance && previousFields.Balance.value !== "0") { viewLowest = previousFields.Balance.value[0] !== "-"; } else { viewLowest = fields.Balance.value[0] !== "-"; } const sign = viewLowest ? 1 : -1; const currency = fields.Balance.currency; const issuer = viewLowest ? fields.HighLimit.issuer : fields.LowLimit.issuer; const holder = viewLowest ? fields.LowLimit.issuer : fields.HighLimit.issuer; const result = { address: holder, lockedBalance: { issuer, currency, value: value.times(sign).toString(), counterparty: issuer, }, }; return [result]; } function parseQuantities(metadata, valueParser) { const values = metadata.AffectedNodes.map(function (affectedNode) { const node = affectedNode.CreatedNode || affectedNode.ModifiedNode || affectedNode.DeletedNode; if (node.LedgerEntryType !== "RippleState") { return []; } const normalizedNode = (0, utils_1.normalizeNode)(affectedNode); if (node.LedgerEntryType === "RippleState") { return parseTrustlineQuantity(normalizedNode, valueParser); } return []; }); return groupByAddress(lodash_1.default.compact(lodash_1.default.flatten(values))); } function parseLockedBalanceChanges(metadata) { return parseQuantities(metadata, computeBalanceChange); } function parseFinalLockedBalances(metadata) { return parseQuantities(metadata, parseFinalBalance); }