| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | "use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (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.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 });
const _ = __importStar(require("lodash"));
const ripple_binary_codec_1 = __importDefault(require("ripple-binary-codec"));
const hashes_1 = require("../common/hashes");
const utils = __importStar(require("./utils"));
const transaction_1 = __importDefault(require("./parse/transaction"));
const transaction_2 = __importDefault(require("./transaction"));
const common_1 = require("../common");
function parseBinaryTransaction(transaction) {
    const tx = ripple_binary_codec_1.default.decode(transaction.tx_blob);
    tx.hash = hashes_1.computeTransactionHash(tx);
    tx.ledger_index = transaction.ledger_index;
    return {
        tx: tx,
        meta: ripple_binary_codec_1.default.decode(transaction.meta),
        validated: transaction.validated
    };
}
function parseAccountTxTransaction(tx, includeRawTransaction) {
    const _tx = tx.tx_blob ? parseBinaryTransaction(tx) : tx;
    return transaction_1.default(Object.assign({}, _tx.tx, { meta: _tx.meta, validated: _tx.validated }), includeRawTransaction);
}
function counterpartyFilter(filters, tx) {
    if (tx.address === filters.counterparty) {
        return true;
    }
    const specification = tx.specification;
    if (specification &&
        ((specification.destination &&
            specification.destination.address === filters.counterparty) ||
            specification.counterparty === filters.counterparty)) {
        return true;
    }
    return false;
}
function transactionFilter(address, filters, tx) {
    if (filters.excludeFailures && tx.outcome.result !== 'tesSUCCESS') {
        return false;
    }
    if (filters.types && !filters.types.includes(tx.type)) {
        return false;
    }
    if (filters.initiated === true && tx.address !== address) {
        return false;
    }
    if (filters.initiated === false && tx.address === address) {
        return false;
    }
    if (filters.counterparty && !counterpartyFilter(filters, tx)) {
        return false;
    }
    return true;
}
function orderFilter(options, tx) {
    return (!options.startTx ||
        (options.earliestFirst
            ? utils.compareTransactions(tx, options.startTx) > 0
            : utils.compareTransactions(tx, options.startTx) < 0));
}
function formatPartialResponse(address, options, data) {
    const parse = (tx) => parseAccountTxTransaction(tx, options.includeRawTransactions);
    return {
        marker: data.marker,
        results: data.transactions
            .filter((tx) => tx.validated)
            .map(parse)
            .filter(_.partial(transactionFilter, address, options))
            .filter(_.partial(orderFilter, options))
    };
}
function getAccountTx(connection, address, options, marker, limit) {
    const request = {
        command: 'account_tx',
        account: address,
        ledger_index_min: options.minLedgerVersion || -1,
        ledger_index_max: options.maxLedgerVersion || -1,
        forward: options.earliestFirst,
        binary: options.binary,
        limit: utils.clamp(limit, 10, 400),
        marker: marker
    };
    return connection
        .request(request)
        .then((response) => formatPartialResponse(address, options, response));
}
function checkForLedgerGaps(connection, options, transactions) {
    let { minLedgerVersion, maxLedgerVersion } = options;
    if (options.limit && transactions.length === options.limit) {
        if (options.earliestFirst) {
            maxLedgerVersion = transactions[transactions.length - 1].outcome.ledgerVersion;
        }
        else {
            minLedgerVersion = transactions[transactions.length - 1].outcome.ledgerVersion;
        }
    }
    return utils
        .hasCompleteLedgerRange(connection, minLedgerVersion, maxLedgerVersion)
        .then((hasCompleteLedgerRange) => {
        if (!hasCompleteLedgerRange) {
            throw new common_1.errors.MissingLedgerHistoryError();
        }
    });
}
function formatResponse(connection, options, transactions) {
    const sortedTransactions = options.earliestFirst
        ? transactions.sort(utils.compareTransactions)
        : transactions.sort(utils.compareTransactions).reverse();
    return checkForLedgerGaps(connection, options, sortedTransactions).then(() => sortedTransactions);
}
function getTransactionsInternal(connection, address, options) {
    const getter = _.partial(getAccountTx, connection, address, options);
    const format = _.partial(formatResponse, connection, options);
    return utils.getRecursive(getter, options.limit).then(format);
}
function getTransactions(address, options = {}) {
    common_1.validate.getTransactions({ address, options });
    address = common_1.ensureClassicAddress(address);
    const defaults = { maxLedgerVersion: -1 };
    if (options.start) {
        return transaction_2.default.call(this, options.start).then((tx) => {
            const ledgerVersion = tx.outcome.ledgerVersion;
            const bound = options.earliestFirst
                ? { minLedgerVersion: ledgerVersion }
                : { maxLedgerVersion: ledgerVersion };
            const startOptions = Object.assign({}, defaults, options, { startTx: tx }, bound);
            return getTransactionsInternal(this.connection, address, startOptions);
        });
    }
    const newOptions = Object.assign({}, defaults, options);
    return getTransactionsInternal(this.connection, address, newOptions);
}
exports.default = getTransactions;
//# sourceMappingURL=transactions.js.map
 |