@bithomp/xrpl-api
Version:
A Bithomp JavaScript/TypeScript library for interacting with the XRP Ledger
95 lines (94 loc) • 3.66 kB
JavaScript
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);
}
;