UNPKG

@bithomp/xrpl-api

Version:

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

154 lines (153 loc) 5.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseBalanceChanges = parseBalanceChanges; exports.parseFinalBalances = parseFinalBalances; const lodash_1 = __importDefault(require("lodash")); const bignumber_js_1 = __importDefault(require("bignumber.js")); const common_1 = require("../../common"); const client_1 = require("../../client"); const utils_1 = require("../utils"); function groupByAddress(balanceChanges) { const grouped = lodash_1.default.groupBy(balanceChanges, function (node) { return node.address; }); return lodash_1.default.mapValues(grouped, function (group) { return lodash_1.default.map(group, function (node) { return node.balance; }); }); } function parseValue(value) { if (Array.isArray(value)) { return new bignumber_js_1.default(0); } if (typeof value === "string" || typeof value === "number") { return new bignumber_js_1.default(value); } return new bignumber_js_1.default(value.value ?? value.MPTAmount ?? 0); } function computeBalanceChange(node) { let value = null; if (node.newFields.Balance) { value = parseValue(node.newFields.Balance); } else if (node.newFields.MPTAmount) { value = parseValue(node.newFields); } else if (node.previousFields.Balance && node.finalFields.Balance) { value = parseValue(node.finalFields.Balance).minus(parseValue(node.previousFields.Balance)); } else if (node.previousFields.MPTAmount || node.finalFields.MPTAmount) { value = parseValue(node.finalFields).minus(parseValue(node.previousFields)); } return value === null ? null : value.isZero() ? null : value; } function parseFinalBalance(node) { if (node.newFields.Balance) { return parseValue(node.newFields.Balance); } else if (node.finalFields.Balance) { return parseValue(node.finalFields.Balance); } else if (node.finalFields.MPTAmount) { return parseValue(node.finalFields); } return null; } function parseXRPQuantity(node, valueParser, nativeCurrency) { const value = valueParser(node); if (value === null) { return null; } return { address: (node.finalFields.Account || node.newFields.Account), balance: { currency: nativeCurrency || (0, client_1.getNativeCurrency)(), value: (0, common_1.dropsToXrp)(value).toString(), }, }; } function flipTrustlinePerspective(quantity) { const negatedBalance = new bignumber_js_1.default(quantity.balance.value).negated(); return { address: quantity.balance.issuer, balance: { issuer: quantity.balance.issuer, currency: quantity.balance.currency, value: negatedBalance.toString(), counterparty: quantity.address, }, }; } 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, balance: { issuer, currency, value: value.times(sign).toString(), counterparty: issuer, }, }; return [result, flipTrustlinePerspective(result)]; } function parseMPTQuantity(node, valueParser) { const value = valueParser(node); if (value === null) { return null; } const fields = lodash_1.default.isEmpty(node.newFields) ? node.finalFields : node.newFields; return { address: fields.Account, balance: { value: value.toString(), mpt_issuance_id: fields.MPTokenIssuanceID, }, }; } function parseQuantities(metadata, valueParser, nativeCurrency) { const values = metadata.AffectedNodes.map(function (affectedNode) { const node = affectedNode.CreatedNode || affectedNode.ModifiedNode || affectedNode.DeletedNode; if (!["AccountRoot", "RippleState", "MPToken"].includes(node.LedgerEntryType)) { return []; } const normalizedNode = (0, utils_1.normalizeNode)(affectedNode); if (node.LedgerEntryType === "AccountRoot") { return [parseXRPQuantity(normalizedNode, valueParser, nativeCurrency)]; } else if (node.LedgerEntryType === "RippleState") { return parseTrustlineQuantity(normalizedNode, valueParser); } else if (node.LedgerEntryType === "MPToken") { return [parseMPTQuantity(normalizedNode, valueParser)]; } return []; }); return groupByAddress(lodash_1.default.compact(lodash_1.default.flatten(values))); } function parseBalanceChanges(metadata, nativeCurrency) { return parseQuantities(metadata, computeBalanceChange, nativeCurrency); } function parseFinalBalances(metadata, nativeCurrency) { return parseQuantities(metadata, parseFinalBalance, nativeCurrency); }