PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-bin/dist/src/commands/cmdPsbt
Просмотр файла: cmdAddOutput.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.cmdAddOutput = void 0;
const utxolib = require("@bitgo/utxo-lib");
const unspents_1 = require("@bitgo/unspents");
const buffer_1 = require("buffer");
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
const withPsbt_1 = require("./withPsbt");
function toScriptPubKey(params, network) {
if (params.address) {
return utxolib.addressFormat.toOutputScriptTryFormats(params.address, network);
}
if (params.scriptPubKey) {
return buffer_1.Buffer.from(params.scriptPubKey, 'hex');
}
throw new Error('address or scriptPubKey is required');
}
function getInputWeight(psbt, inputIndex) {
if (inputIndex === undefined) {
return psbt.txInputs.reduce((sum, input, inputIndex) => sum + getInputWeight(psbt, inputIndex), 0);
}
const { redeemScript, witnessScript } = psbt.data.inputs[inputIndex];
if (redeemScript) {
throw new Error('redeemScript is not supported');
}
if (!witnessScript) {
throw new Error('witnessScript is required');
}
const witnessMiniscript = wasm_miniscript_1.Miniscript.fromBitcoinScript(witnessScript, 'segwitv0');
const descriptor = wasm_miniscript_1.Descriptor.fromString(`wsh(${witnessMiniscript.toString()})`, 'definite');
return descriptor.maxWeightToSatisfy();
}
function getOutputVsize(psbt, outputIndex) {
if (outputIndex === undefined) {
return psbt.txOutputs.reduce((sum, output, outputIndex) => sum + getOutputVsize(psbt, outputIndex), 0);
}
const { script } = psbt.txOutputs[outputIndex];
return unspents_1.Dimensions.getVSizeForOutputWithScriptLength(script.length);
}
function getMaxOutputValue(psbt, { scriptPubKey, feeRateSatB, }) {
const inputSum = psbt.data.inputs.reduce((sum, input) => {
if (!input.witnessUtxo) {
throw new Error('witnessUtxo is required');
}
return sum + input.witnessUtxo.value;
}, BigInt(0));
const outputSum = psbt.txOutputs.reduce((sum, output) => sum + output.value, BigInt(0));
const inputVsize = Math.ceil(getInputWeight(psbt) / 4);
const outputVsize = getOutputVsize(psbt) + unspents_1.Dimensions.getVSizeForOutputWithScriptLength(scriptPubKey.length);
const totalVsize = inputVsize + outputVsize + 11;
const fee = BigInt(totalVsize * feeRateSatB);
if (inputSum < outputSum + fee) {
throw new Error(`insufficient funds: [inputSum=${inputSum}, outputSum=${outputSum}, fee=${fee}]`);
}
return inputSum - outputSum - fee;
}
function getOutputValue(amount, { scriptPubKey, psbt, feeRateSatB, }) {
if (amount === 'max') {
if (!feeRateSatB) {
throw new Error('feeRateSatB is required');
}
return getMaxOutputValue(psbt, { scriptPubKey, feeRateSatB });
}
return BigInt(parseFloat(amount));
}
exports.cmdAddOutput = {
command: 'addOutput',
describe: 'add output to psbt',
builder(b) {
return b
.options(withPsbt_1.withPsbtOptions)
.option('address', { type: 'string' })
.option('scriptPubKey', { type: 'string' })
.option('amount', { type: 'string', demandOption: true })
.option('feeRateSatB', { type: 'number' });
},
async handler(argv) {
await (0, withPsbt_1.withPsbt)(argv, async function (psbt) {
const scriptPubKey = toScriptPubKey({
address: argv.address,
scriptPubKey: argv.scriptPubKey,
}, argv.network);
const value = getOutputValue(argv.amount, { scriptPubKey, psbt, feeRateSatB: argv.feeRateSatB });
psbt.addOutput({ script: scriptPubKey, value });
return psbt;
});
},
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY21kQWRkT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NtZFBzYnQvY21kQWRkT3V0cHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUEyQztBQUMzQyw4Q0FBNkM7QUFDN0MsbUNBQWdDO0FBQ2hDLDREQUFnRTtBQUVoRSx5Q0FBd0U7QUFFeEUsU0FBUyxjQUFjLENBQ3JCLE1BR0MsRUFDRCxPQUF3QjtJQUV4QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsT0FBTyxlQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBU0QsU0FBUyxjQUFjLENBQUMsSUFBa0IsRUFBRSxVQUFtQjtJQUM3RCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FB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QUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgRGVzY3JpcHRvciwgTWluaXNjcmlwdCB9IGZyb20gJ0BiaXRnby93YXNtLW1pbmlzY3JpcHQnO1xuXG5pbXBvcnQgeyB3aXRoUHNidCwgd2l0aFBzYnRPcHRpb25zLCBXaXRoUHNidE9wdGlvbnMgfSBmcm9tICcuL3dpdGhQc2J0JztcblxuZnVuY3Rpb24gdG9TY3JpcHRQdWJLZXkoXG4gIHBhcmFtczoge1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgc2NyaXB0UHViS2V5Pzogc3RyaW5nO1xuICB9LFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IEJ1ZmZlciB7XG4gIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgIHJldHVybiB1dHhvbGliLmFkZHJlc3NGb3JtYXQudG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKHBhcmFtcy5hZGRyZXNzLCBuZXR3b3JrKTtcbiAgfVxuICBpZiAocGFyYW1zLnNjcmlwdFB1YktleSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShwYXJhbXMuc2NyaXB0UHViS2V5LCAnaGV4Jyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIHNjcmlwdFB1YktleSBpcyByZXF1aXJlZCcpO1xufVxuXG50eXBlIEFyZ3NBZGRPdXRwdXQgPSBXaXRoUHNidE9wdGlvbnMgJiB7XG4gIGFkZHJlc3M/OiBzdHJpbmc7XG4gIHNjcmlwdFB1YktleT86IHN0cmluZztcbiAgYW1vdW50OiBzdHJpbmc7XG4gIGZlZVJhdGVTYXRCPzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gZ2V0SW5wdXRXZWlnaHQocHNidDogdXR4b2xpYi5Qc2J0LCBpbnB1dEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlucHV0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwc2J0LnR4SW5wdXRzLnJlZHVjZSgoc3VtLCBpbnB1dCwgaW5wdXRJbmRleCkgPT4gc3VtICsgZ2V0SW5wdXRXZWlnaHQocHNidCwgaW5wdXRJbmRleCksIDApO1xuICB9XG4gIGNvbnN0IHsgcmVkZWVtU2NyaXB0LCB3aXRuZXNzU2NyaXB0IH0gPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICBpZiAocmVkZWVtU2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWRlZW1TY3JpcHQgaXMgbm90IHN1cHBvcnRlZCcpO1xuICB9XG4gIGlmICghd2l0bmVzc1NjcmlwdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd2l0bmVzc1NjcmlwdCBpcyByZXF1aXJlZCcpO1xuICB9XG4gIGNvbnN0IHdpdG5lc3NNaW5pc2NyaXB0ID0gTWluaXNjcmlwdC5mcm9tQml0Y29pblNjcmlwdCh3aXRuZXNzU2NyaXB0LCAnc2Vnd2l0djAnKTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IERlc2NyaXB0b3IuZnJvbVN0cmluZyhgd3NoKCR7d2l0bmVzc01pbmlzY3JpcHQudG9TdHJpbmcoKX0pYCwgJ2RlZmluaXRlJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yLm1heFdlaWdodFRvU2F0aXNmeSgpO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRWc2l6ZShwc2J0OiB1dHhvbGliLlBzYnQsIG91dHB1dEluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKG91dHB1dEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcHNidC50eE91dHB1dHMucmVkdWNlKChzdW0sIG91dHB1dCwgb3V0cHV0SW5kZXgpID0+IHN1bSArIGdldE91dHB1dFZzaXplKHBzYnQsIG91dHB1dEluZGV4KSwgMCk7XG4gIH1cbiAgY29uc3QgeyBzY3JpcHQgfSA9IHBzYnQudHhPdXRwdXRzW291dHB1dEluZGV4XTtcbiAgcmV0dXJuIERpbWVuc2lvbnMuZ2V0VlNpemVGb3JPdXRwdXRXaXRoU2NyaXB0TGVuZ3RoKHNjcmlwdC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBnZXRNYXhPdXRwdXRWYWx1ZShcbiAgcHNidDogdXR4b2xpYi5Qc2J0LFxuICB7XG4gICAgc2NyaXB0UHViS2V5LFxuICAgIGZlZVJhdGVTYXRCLFxuICB9OiB7XG4gICAgc2NyaXB0UHViS2V5OiBCdWZmZXI7XG4gICAgZmVlUmF0ZVNhdEI6IG51bWJlcjtcbiAgfVxuKTogYmlnaW50IHtcbiAgY29uc3QgaW5wdXRTdW0gPSBwc2J0LmRhdGEuaW5wdXRzLnJlZHVjZSgoc3VtLCBpbnB1dCkgPT4ge1xuICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2l0bmVzc1V0eG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bSArIGlucHV0LndpdG5lc3NVdHhvLnZhbHVlO1xuICB9LCBCaWdJbnQoMCkpO1xuICBjb25zdCBvdXRwdXRTdW0gPSBwc2J0LnR4T3V0cHV0cy5yZWR1Y2UoKHN1bSwgb3V0cHV0KSA9PiBzdW0gKyBvdXRwdXQudmFsdWUsIEJpZ0ludCgwKSk7XG4gIGNvbnN0IGlucHV0VnNpemUgPSBNYXRoLmNlaWwoZ2V0SW5wdXRXZWlnaHQocHNidCkgLyA0KTtcbiAgY29uc3Qgb3V0cHV0VnNpemUgPSBnZXRPdXRwdXRWc2l6ZShwc2J0KSArIERpbWVuc2lvbnMuZ2V0VlNpemVGb3JPdXRwdXRXaXRoU2NyaXB0TGVuZ3RoKHNjcmlwdFB1YktleS5sZW5ndGgpO1xuICBjb25zdCB0b3RhbFZzaXplID0gaW5wdXRWc2l6ZSArIG91dHB1dFZzaXplICsgMTE7XG4gIGNvbnN0IGZlZSA9IEJpZ0ludCh0b3RhbFZzaXplICogZmVlUmF0ZVNhdEIpO1xuICBpZiAoaW5wdXRTdW0gPCBvdXRwdXRTdW0gKyBmZWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGluc3VmZmljaWVudCBmdW5kczogW2lucHV0U3VtPSR7aW5wdXRTdW19LCBvdXRwdXRTdW09JHtvdXRwdXRTdW19LCBmZWU9JHtmZWV9XWApO1xuICB9XG4gIHJldHVybiBpbnB1dFN1bSAtIG91dHB1dFN1bSAtIGZlZTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0VmFsdWUoXG4gIGFtb3VudDogc3RyaW5nLFxuICB7XG4gICAgc2NyaXB0UHViS2V5LFxuICAgIHBzYnQsXG4gICAgZmVlUmF0ZVNhdEIsXG4gIH06IHtcbiAgICBzY3JpcHRQdWJLZXk6IEJ1ZmZlcjtcbiAgICBwc2J0OiB1dHhvbGliLlBzYnQ7XG4gICAgZmVlUmF0ZVNhdEI/OiBudW1iZXI7XG4gIH1cbik6IGJpZ2ludCB7XG4gIGlmIChhbW91bnQgPT09ICdtYXgnKSB7XG4gICAgaWYgKCFmZWVSYXRlU2F0Qikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZWVSYXRlU2F0QiBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0TWF4T3V0cHV0VmFsdWUocHNidCwgeyBzY3JpcHRQdWJLZXksIGZlZVJhdGVTYXRCIH0pO1xuICB9XG4gIHJldHVybiBCaWdJbnQocGFyc2VGbG9hdChhbW91bnQpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNtZEFkZE91dHB1dDogeWFyZ3MuQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmdzQWRkT3V0cHV0PiA9IHtcbiAgY29tbWFuZDogJ2FkZE91dHB1dCcsXG4gIGRlc2NyaWJlOiAnYWRkIG91dHB1dCB0byBwc2J0JyxcbiAgYnVpbGRlcihiOiB5YXJncy5Bcmd2PHVua25vd24+KSB7XG4gICAgcmV0dXJuIGJcbiAgICAgIC5vcHRpb25zKHdpdGhQc2J0T3B0aW9ucylcbiAgICAgIC5vcHRpb24oJ2FkZHJlc3MnLCB7IHR5cGU6ICdzdHJpbmcnIH0pXG4gICAgICAub3B0aW9uKCdzY3JpcHRQdWJLZXknLCB7IHR5cGU6ICdzdHJpbmcnIH0pXG4gICAgICAub3B0aW9uKCdhbW91bnQnLCB7IHR5cGU6ICdzdHJpbmcnLCBkZW1hbmRPcHRpb246IHRydWUgfSlcbiAgICAgIC5vcHRpb24oJ2ZlZVJhdGVTYXRCJywgeyB0eXBlOiAnbnVtYmVyJyB9KTtcbiAgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgd2l0aFBzYnQoYXJndiwgYXN5bmMgZnVuY3Rpb24gKHBzYnQpIHtcbiAgICAgIGNvbnN0IHNjcmlwdFB1YktleSA9IHRvU2NyaXB0UHViS2V5KFxuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogYXJndi5hZGRyZXNzLFxuICAgICAgICAgIHNjcmlwdFB1YktleTogYXJndi5zY3JpcHRQdWJLZXksXG4gICAgICAgIH0sXG4gICAgICAgIGFyZ3YubmV0d29ya1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0T3V0cHV0VmFsdWUoYXJndi5hbW91bnQsIHsgc2NyaXB0UHViS2V5LCBwc2J0LCBmZWVSYXRlU2F0QjogYXJndi5mZWVSYXRlU2F0QiB9KTtcbiAgICAgIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0OiBzY3JpcHRQdWJLZXksIHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgfSk7XG4gIH0sXG59O1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!