@nextrope/xrpl
Version:
A TypeScript/JavaScript API for interacting with the XRP Ledger in Node.js and the browser
115 lines • 4.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleStreamPartialPayment = exports.handlePartialPayment = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const ripple_binary_codec_1 = require("ripple-binary-codec");
const transactions_1 = require("../models/transactions");
const utils_1 = require("../models/utils");
const WARN_PARTIAL_PAYMENT_CODE = 2001;
function amountsEqual(amt1, amt2) {
if (typeof amt1 === 'string' && typeof amt2 === 'string') {
return amt1 === amt2;
}
if (typeof amt1 === 'string' || typeof amt2 === 'string') {
return false;
}
if ((0, transactions_1.isMPTAmount)(amt1) && (0, transactions_1.isMPTAmount)(amt2)) {
const aValue = new bignumber_js_1.default(amt1.value);
const bValue = new bignumber_js_1.default(amt2.value);
return (amt1.mpt_issuance_id === amt2.mpt_issuance_id && aValue.isEqualTo(bValue));
}
if ((0, transactions_1.isMPTAmount)(amt1) || (0, transactions_1.isMPTAmount)(amt2)) {
return false;
}
const aValue = new bignumber_js_1.default(amt1.value);
const bValue = new bignumber_js_1.default(amt2.value);
return (amt1.currency === amt2.currency &&
amt1.issuer === amt2.issuer &&
aValue.isEqualTo(bValue));
}
function isPartialPayment(tx, metadata) {
var _a, _b;
if (tx == null || metadata == null || tx.TransactionType !== 'Payment') {
return false;
}
let meta = metadata;
if (typeof meta === 'string') {
if (meta === 'unavailable') {
return false;
}
meta = (0, ripple_binary_codec_1.decode)(meta);
}
const tfPartial = typeof tx.Flags === 'number'
? (0, utils_1.isFlagEnabled)(tx.Flags, transactions_1.PaymentFlags.tfPartialPayment)
: (_a = tx.Flags) === null || _a === void 0 ? void 0 : _a.tfPartialPayment;
if (!tfPartial) {
return false;
}
const delivered = meta.delivered_amount;
const amount = (_b = tx.DeliverMax) !== null && _b !== void 0 ? _b : tx.Amount;
if (delivered === undefined) {
return false;
}
return !amountsEqual(delivered, amount);
}
function txHasPartialPayment(response) {
return isPartialPayment(response.result.tx_json, response.result.meta);
}
function txEntryHasPartialPayment(response) {
return isPartialPayment(response.result.tx_json, response.result.metadata);
}
function accountTxHasPartialPayment(response) {
const { transactions } = response.result;
const foo = transactions.some((tx) => {
if (tx.tx_json != null) {
const transaction = tx;
return isPartialPayment(transaction.tx_json, transaction.meta);
}
const transaction = tx;
return isPartialPayment(transaction.tx, transaction.meta);
});
return foo;
}
function hasPartialPayment(command, response) {
switch (command) {
case 'tx':
return txHasPartialPayment(response);
case 'transaction_entry':
return txEntryHasPartialPayment(response);
case 'account_tx':
return accountTxHasPartialPayment(response);
default:
return false;
}
}
function handlePartialPayment(command, response) {
var _a;
if (hasPartialPayment(command, response)) {
const warnings = (_a = response.warnings) !== null && _a !== void 0 ? _a : [];
const warning = {
id: WARN_PARTIAL_PAYMENT_CODE,
message: 'This response contains a Partial Payment',
};
warnings.push(warning);
response.warnings = warnings;
}
}
exports.handlePartialPayment = handlePartialPayment;
function handleStreamPartialPayment(stream, log) {
var _a, _b;
if (isPartialPayment((_a = stream.tx_json) !== null && _a !== void 0 ? _a : stream.transaction, stream.meta)) {
const warnings = (_b = stream.warnings) !== null && _b !== void 0 ? _b : [];
const warning = {
id: WARN_PARTIAL_PAYMENT_CODE,
message: 'This response contains a Partial Payment',
};
warnings.push(warning);
stream.warnings = warnings;
log('Partial payment received', JSON.stringify(stream));
}
}
exports.handleStreamPartialPayment = handleStreamPartialPayment;
//# sourceMappingURL=partialPayment.js.map