PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-staking/dist/src

Просмотр файла: transaction.js

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (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 () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildFixedWalletStakingPsbt = buildFixedWalletStakingPsbt;
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const unspents_1 = require("@bitgo/unspents");
const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
bitcoinjslib.initEccLib(utxolib.ecc);
/**
 * Build a staking transaction for a wallet that assumes 2-of-3 multisig for the inputs
 *
 * Given the inputs and the staking outputs, we will create the PSBT with the desired fee rate.
 * We always add the change address as the last output.
 *
 * @param rootWalletKeys
 * @param unspents
 * @param createStakingOutputs
 * @param changeAddressInfo
 * @param feeRateSatKB
 * @param network
 */
function buildFixedWalletStakingPsbt({ rootWalletKeys, unspents, outputs, changeAddressInfo, feeRateSatKB, network, skipNonWitnessUtxo, dustAmount = BigInt(0), }) {
    if (feeRateSatKB < 1000) {
        throw new Error('Fee rate must be at least 1 sat/vbyte');
    }
    if (unspents.length === 0 || outputs.length === 0) {
        throw new Error('Must have at least one input and one output');
    }
    // Check the change address info
    const changeScript = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(changeAddressInfo.chain, changeAddressInfo.index).publicKeys, utxolib.bitgo.scriptTypeForChain(changeAddressInfo.chain), network).scriptPubKey;
    if (!changeScript.equals(utxolib.addressFormat.toOutputScriptTryFormats(changeAddressInfo.address, network))) {
        throw new Error('Change address info does not match the derived change script');
    }
    const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
    utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
    const inputAmount = unspents.reduce((sum, unspent) => sum + unspent.value, BigInt(0));
    const outputAmount = outputs.reduce((sum, output) => sum + output.value, BigInt(0));
    unspents.forEach((unspent) => utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, rootWalletKeys, 'user', 'bitgo', {
        isReplaceableByFee: true,
        skipNonWitnessUtxo,
    }));
    outputs.forEach((output) => psbt.addOutput(output));
    const fee = Math.ceil((unspents_1.Dimensions.fromPsbt(psbt)
        .plus(unspents_1.Dimensions.fromOutput({ script: changeScript }))
        .getVSize() *
        feeRateSatKB) /
        1000);
    const changeAmount = inputAmount - (outputAmount + BigInt(fee));
    if (changeAmount < BigInt(0)) {
        throw new Error(`Input amount ${inputAmount.toString()} cannot cover the staking amount ${outputAmount} and  the fee: ${fee}`);
    }
    if (changeAmount > dustAmount) {
        utxolib.bitgo.addWalletOutputToPsbt(psbt, rootWalletKeys, changeAddressInfo.chain, changeAddressInfo.index, changeAmount);
    }
    return psbt;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsa0VBbUZDO0FBdEdELHlEQUEyQztBQUMzQyw4Q0FBNkM7QUFDN0MsNERBQThDO0FBRTlDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQWdCLDJCQUEyQixDQUFDLEVBQzFDLGNBQWMsRUFDZCxRQUFRLEVBQ1IsT0FBTyxFQUNQLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osT0FBTyxFQUNQLGtCQUFrQixFQUNsQixVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQWlCdkI7SUFDQyxJQUFJLFlBQVksR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGdDQUFnQztJQUNoQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FDckUsY0FBYyxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQ2xHLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQ3pELE9BQU8sQ0FDUixDQUFDLFlBQVksQ0FBQztJQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RyxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVuRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBGLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7UUFDbkYsa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixrQkFBa0I7S0FDbkIsQ0FBQyxDQUNILENBQUM7SUFDRixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDbkIsQ0FBQyxxQkFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDdkIsSUFBSSxDQUFDLHFCQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDckQsUUFBUSxFQUFFO1FBQ1gsWUFBWSxDQUFDO1FBQ2IsSUFBSSxDQUNQLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxXQUFXLEdBQUcsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixnQkFBZ0IsV0FBVyxDQUFDLFFBQVEsRUFBRSxvQ0FBb0MsWUFBWSxrQkFBa0IsR0FBRyxFQUFFLENBQzlHLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxZQUFZLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FDakMsSUFBSSxFQUNKLGNBQWMsRUFDZCxpQkFBaUIsQ0FBQyxLQUFLLEVBQ3ZCLGlCQUFpQixDQUFDLEtBQUssRUFDdkIsWUFBWSxDQUNiLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgKiBhcyBiaXRjb2luanNsaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5cbmJpdGNvaW5qc2xpYi5pbml0RWNjTGliKHV0eG9saWIuZWNjKTtcblxuLyoqXG4gKiBCdWlsZCBhIHN0YWtpbmcgdHJhbnNhY3Rpb24gZm9yIGEgd2FsbGV0IHRoYXQgYXNzdW1lcyAyLW9mLTMgbXVsdGlzaWcgZm9yIHRoZSBpbnB1dHNcbiAqXG4gKiBHaXZlbiB0aGUgaW5wdXRzIGFuZCB0aGUgc3Rha2luZyBvdXRwdXRzLCB3ZSB3aWxsIGNyZWF0ZSB0aGUgUFNCVCB3aXRoIHRoZSBkZXNpcmVkIGZlZSByYXRlLlxuICogV2UgYWx3YXlzIGFkZCB0aGUgY2hhbmdlIGFkZHJlc3MgYXMgdGhlIGxhc3Qgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5c1xuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gY3JlYXRlU3Rha2luZ091dHB1dHNcbiAqIEBwYXJhbSBjaGFuZ2VBZGRyZXNzSW5mb1xuICogQHBhcmFtIGZlZVJhdGVTYXRLQlxuICogQHBhcmFtIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRml4ZWRXYWxsZXRTdGFraW5nUHNidCh7XG4gIHJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50cyxcbiAgb3V0cHV0cyxcbiAgY2hhbmdlQWRkcmVzc0luZm8sXG4gIGZlZVJhdGVTYXRLQixcbiAgbmV0d29yayxcbiAgc2tpcE5vbldpdG5lc3NVdHhvLFxuICBkdXN0QW1vdW50ID0gQmlnSW50KDApLFxufToge1xuICByb290V2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbiAgdW5zcGVudHM6IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxiaWdpbnQ+W107XG4gIG91dHB1dHM6IHtcbiAgICBzY3JpcHQ6IEJ1ZmZlcjtcbiAgICB2YWx1ZTogYmlnaW50O1xuICB9W107XG4gIGNoYW5nZUFkZHJlc3NJbmZvOiB7XG4gICAgY2hhaW46IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlO1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICB9O1xuICBmZWVSYXRlU2F0S0I6IG51bWJlcjtcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuICBza2lwTm9uV2l0bmVzc1V0eG8/OiBib29sZWFuO1xuICBkdXN0QW1vdW50PzogYmlnaW50O1xufSk6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBpZiAoZmVlUmF0ZVNhdEtCIDwgMTAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmVlIHJhdGUgbXVzdCBiZSBhdCBsZWFzdCAxIHNhdC92Ynl0ZScpO1xuICB9XG4gIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDAgfHwgb3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQnKTtcbiAgfVxuXG4gIC8vIENoZWNrIHRoZSBjaGFuZ2UgYWRkcmVzcyBpbmZvXG4gIGNvbnN0IGNoYW5nZVNjcmlwdCA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgIHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhbmdlQWRkcmVzc0luZm8uY2hhaW4sIGNoYW5nZUFkZHJlc3NJbmZvLmluZGV4KS5wdWJsaWNLZXlzLFxuICAgIHV0eG9saWIuYml0Z28uc2NyaXB0VHlwZUZvckNoYWluKGNoYW5nZUFkZHJlc3NJbmZvLmNoYWluKSxcbiAgICBuZXR3b3JrXG4gICkuc2NyaXB0UHViS2V5O1xuICBpZiAoIWNoYW5nZVNjcmlwdC5lcXVhbHModXR4b2xpYi5hZGRyZXNzRm9ybWF0LnRvT3V0cHV0U2NyaXB0VHJ5Rm9ybWF0cyhjaGFuZ2VBZGRyZXNzSW5mby5hZGRyZXNzLCBuZXR3b3JrKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoYW5nZSBhZGRyZXNzIGluZm8gZG9lcyBub3QgbWF0Y2ggdGhlIGRlcml2ZWQgY2hhbmdlIHNjcmlwdCcpO1xuICB9XG5cbiAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHJvb3RXYWxsZXRLZXlzKTtcblxuICBjb25zdCBpbnB1dEFtb3VudCA9IHVuc3BlbnRzLnJlZHVjZSgoc3VtLCB1bnNwZW50KSA9PiBzdW0gKyB1bnNwZW50LnZhbHVlLCBCaWdJbnQoMCkpO1xuICBjb25zdCBvdXRwdXRBbW91bnQgPSBvdXRwdXRzLnJlZHVjZSgoc3VtLCBvdXRwdXQpID0+IHN1bSArIG91dHB1dC52YWx1ZSwgQmlnSW50KDApKTtcblxuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PlxuICAgIHV0eG9saWIuYml0Z28uYWRkV2FsbGV0VW5zcGVudFRvUHNidChwc2J0LCB1bnNwZW50LCByb290V2FsbGV0S2V5cywgJ3VzZXInLCAnYml0Z28nLCB7XG4gICAgICBpc1JlcGxhY2VhYmxlQnlGZWU6IHRydWUsXG4gICAgICBza2lwTm9uV2l0bmVzc1V0eG8sXG4gICAgfSlcbiAgKTtcbiAgb3V0cHV0cy5mb3JFYWNoKChvdXRwdXQpID0+IHBzYnQuYWRkT3V0cHV0KG91dHB1dCkpO1xuXG4gIGNvbnN0IGZlZSA9IE1hdGguY2VpbChcbiAgICAoRGltZW5zaW9ucy5mcm9tUHNidChwc2J0KVxuICAgICAgLnBsdXMoRGltZW5zaW9ucy5mcm9tT3V0cHV0KHsgc2NyaXB0OiBjaGFuZ2VTY3JpcHQgfSkpXG4gICAgICAuZ2V0VlNpemUoKSAqXG4gICAgICBmZWVSYXRlU2F0S0IpIC9cbiAgICAgIDEwMDBcbiAgKTtcblxuICBjb25zdCBjaGFuZ2VBbW91bnQgPSBpbnB1dEFtb3VudCAtIChvdXRwdXRBbW91bnQgKyBCaWdJbnQoZmVlKSk7XG4gIGlmIChjaGFuZ2VBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW5wdXQgYW1vdW50ICR7aW5wdXRBbW91bnQudG9TdHJpbmcoKX0gY2Fubm90IGNvdmVyIHRoZSBzdGFraW5nIGFtb3VudCAke291dHB1dEFtb3VudH0gYW5kICB0aGUgZmVlOiAke2ZlZX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChjaGFuZ2VBbW91bnQgPiBkdXN0QW1vdW50KSB7XG4gICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRPdXRwdXRUb1BzYnQoXG4gICAgICBwc2J0LFxuICAgICAgcm9vdFdhbGxldEtleXMsXG4gICAgICBjaGFuZ2VBZGRyZXNzSW5mby5jaGFpbixcbiAgICAgIGNoYW5nZUFkZHJlc3NJbmZvLmluZGV4LFxuICAgICAgY2hhbmdlQW1vdW50XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwc2J0O1xufVxuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!