@bitgo/utxo-bin
Version:
Command-line utility for BitGo UTXO transactions
153 lines • 14.6 kB
JavaScript
;
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.readStringOptions = void 0;
exports.stringToBuffer = stringToBuffer;
exports.readStdin = readStdin;
exports.argToString = argToString;
const process = __importStar(require("process"));
const fs = __importStar(require("fs"));
function stringToBuffer(data, format) {
if (typeof format !== 'string') {
for (const f of format) {
try {
return stringToBuffer(data, f);
}
catch (err) {
// ignore, try next
}
}
throw new Error(`could not parse data, formats: ${format}`);
}
// strip all whitespace
data = data.replace(/\s*/g, '');
if (format === 'hex') {
data = data.toLowerCase();
}
const buf = Buffer.from(data, format);
// make sure there were no decoding errors
if (buf.toString(format) !== data) {
throw new Error(`invalid ${format}`);
}
return buf;
}
exports.readStringOptions = {
path: { type: 'string', nargs: 1, default: '' },
stdin: { type: 'boolean', default: false },
data: {
type: 'string',
description: 'hex or base64',
alias: 'hex',
},
clipboard: { type: 'boolean', default: false },
};
/**
* Reads from stdin until Ctrl-D is pressed.
*/
async function readStdin() {
/*
* High-performance implementation of reading from stdin.
* Standard readline is extremely slow for long lines.
*/
return new Promise((resolve, reject) => {
// Using readline is not an option because it is extremely slow for long lines.
// By enabling raw mode, we can read more than 4096 bytes, but it requires manual Ctrl-C/Ctrl-D handling
if (!process.stdin.setRawMode) {
throw new Error('stdin is not a tty');
}
process.stdin.setRawMode(true);
const buf = [];
process.stdin.on('data', (chunk) => {
if (chunk[0] === 0x03) {
// Ctrl-C
process.exit(130);
}
if (chunk[0] === 0x04) {
// Ctrl-D
process.stdin.emit('end');
return;
}
buf.push(chunk);
process.stdout.write(chunk);
});
process.stdin.on('end', () => {
resolve(Buffer.concat(buf).toString('utf8'));
});
process.stdin.on('error', (err) => {
reject(err);
});
});
}
/**
* @param argv
* @param input - optional input data. If set, this function just ensures that nothing else is set.
* @return string from specified source
*/
async function argToString(argv, input) {
if (argv.stdin || argv.path === '-') {
if (input) {
throw new Error(`conflicting arguments`);
}
console.log('Reading from stdin. Please paste hex-encoded transaction data.');
console.log('After inserting data, press Ctrl-D to finish. Press Ctrl-C to cancel.');
if (process.stdin.isTTY) {
input = await readStdin();
}
else {
input = await fs.promises.readFile('/dev/stdin', 'utf8');
}
}
if (argv.clipboard) {
if (input) {
throw new Error(`conflicting arguments`);
}
const { default: clipboardy } = await import('clipboardy');
input = await clipboardy.read();
}
if (argv.path) {
if (input) {
throw new Error(`conflicting arguments`);
}
input = (await fs.promises.readFile(argv.path, 'utf8')).toString();
}
if (argv.data) {
if (input) {
throw new Error(`conflicting arguments`);
}
input = argv.data;
}
return input;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VTdHJpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXJncy9wYXJzZVN0cmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSx3Q0F5QkM7QUF1QkQsOEJBb0NDO0FBT0Qsa0NBcUNDO0FBcElELGlEQUFtQztBQUNuQyx1Q0FBeUI7QUFHekIsU0FBZ0IsY0FBYyxDQUFDLElBQVksRUFBRSxNQUF5QjtJQUNwRSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9CLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDO2dCQUNILE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixtQkFBbUI7WUFDckIsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWhDLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3JCLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLDBDQUEwQztJQUMxQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJ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Q0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuXG50eXBlIEZvcm1hdCA9ICdoZXgnIHwgJ2Jhc2U2NCc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9CdWZmZXIoZGF0YTogc3RyaW5nLCBmb3JtYXQ6IEZvcm1hdCB8IEZvcm1hdFtdKTogQnVmZmVyIHtcbiAgaWYgKHR5cGVvZiBmb3JtYXQgIT09ICdzdHJpbmcnKSB7XG4gICAgZm9yIChjb25zdCBmIG9mIGZvcm1hdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQnVmZmVyKGRhdGEsIGYpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgdHJ5IG5leHRcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgcGFyc2UgZGF0YSwgZm9ybWF0czogJHtmb3JtYXR9YCk7XG4gIH1cblxuICAvLyBzdHJpcCBhbGwgd2hpdGVzcGFjZVxuICBkYXRhID0gZGF0YS5yZXBsYWNlKC9cXHMqL2csICcnKTtcblxuICBpZiAoZm9ybWF0ID09PSAnaGV4Jykge1xuICAgIGRhdGEgPSBkYXRhLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShkYXRhLCBmb3JtYXQpO1xuICAvLyBtYWtlIHN1cmUgdGhlcmUgd2VyZSBubyBkZWNvZGluZyBlcnJvcnNcbiAgaWYgKGJ1Zi50b1N0cmluZyhmb3JtYXQpICE9PSBkYXRhKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkICR7Zm9ybWF0fWApO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5cbmV4cG9ydCBjb25zdCByZWFkU3RyaW5nT3B0aW9ucyA9IHtcbiAgcGF0aDogeyB0eXBlOiAnc3RyaW5nJywgbmFyZ3M6IDEsIGRlZmF1bHQ6ICcnIH0sXG4gIHN0ZGluOiB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSxcbiAgZGF0YToge1xuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlc2NyaXB0aW9uOiAnaGV4IG9yIGJhc2U2NCcsXG4gICAgYWxpYXM6ICdoZXgnLFxuICB9LFxuICBjbGlwYm9hcmQ6IHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiBmYWxzZSB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUmVhZFN0cmluZ09wdGlvbnMgPSB7XG4gIGNsaXBib2FyZD86IGJvb2xlYW47XG4gIHBhdGg/OiBzdHJpbmc7XG4gIGRhdGE/OiBzdHJpbmc7XG4gIHN0ZGluOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBSZWFkcyBmcm9tIHN0ZGluIHVudGlsIEN0cmwtRCBpcyBwcmVzc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFN0ZGluKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8qXG4gICAqIEhpZ2gtcGVyZm9ybWFuY2UgaW1wbGVtZW50YXRpb24gb2YgcmVhZGluZyBmcm9tIHN0ZGluLlxuICAgKiBTdGFuZGFyZCByZWFkbGluZSBpcyBleHRyZW1lbHkgc2xvdyBmb3IgbG9uZyBsaW5lcy5cbiAgICovXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gVXNpbmcgcmVhZGxpbmUgaXMgbm90IGFuIG9wdGlvbiBiZWNhdXNlIGl0IGlzIGV4dHJlbWVseSBzbG93IGZvciBsb25nIGxpbmVzLlxuICAgIC8vIEJ5IGVuYWJsaW5nIHJhdyBtb2RlLCB3ZSBjYW4gcmVhZCBtb3JlIHRoYW4gNDA5NiBieXRlcywgYnV0IGl0IHJlcXVpcmVzIG1hbnVhbCBDdHJsLUMvQ3RybC1EIGhhbmRsaW5nXG4gICAgaWYgKCFwcm9jZXNzLnN0ZGluLnNldFJhd01vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc3RkaW4gaXMgbm90IGEgdHR5Jyk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcbiAgICBjb25zdCBidWY6IEJ1ZmZlcltdID0gW107XG5cbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICBpZiAoY2h1bmtbMF0gPT09IDB4MDMpIHtcbiAgICAgICAgLy8gQ3RybC1DXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxMzApO1xuICAgICAgfVxuICAgICAgaWYgKGNodW5rWzBdID09PSAweDA0KSB7XG4gICAgICAgIC8vIEN0cmwtRFxuICAgICAgICBwcm9jZXNzLnN0ZGluLmVtaXQoJ2VuZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBidWYucHVzaChjaHVuayk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7XG4gICAgfSk7XG5cbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoYnVmKS50b1N0cmluZygndXRmOCcpKTtcbiAgICB9KTtcblxuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBwYXJhbSBhcmd2XG4gKiBAcGFyYW0gaW5wdXQgLSBvcHRpb25hbCBpbnB1dCBkYXRhLiBJZiBzZXQsIHRoaXMgZnVuY3Rpb24ganVzdCBlbnN1cmVzIHRoYXQgbm90aGluZyBlbHNlIGlzIHNldC5cbiAqIEByZXR1cm4gc3RyaW5nIGZyb20gc3BlY2lmaWVkIHNvdXJjZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJnVG9TdHJpbmcoYXJndjogUmVhZFN0cmluZ09wdGlvbnMsIGlucHV0Pzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGFyZ3Yuc3RkaW4gfHwgYXJndi5wYXRoID09PSAnLScpIHtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY29uZmxpY3RpbmcgYXJndW1lbnRzYCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdSZWFkaW5nIGZyb20gc3RkaW4uIFBsZWFzZSBwYXN0ZSBoZXgtZW5jb2RlZCB0cmFuc2FjdGlvbiBkYXRhLicpO1xuICAgIGNvbnNvbGUubG9nKCdBZnRlciBpbnNlcnRpbmcgZGF0YSwgcHJlc3MgQ3RybC1EIHRvIGZpbmlzaC4gUHJlc3MgQ3RybC1DIHRvIGNhbmNlbC4nKTtcbiAgICBpZiAocHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgICAgaW5wdXQgPSBhd2FpdCByZWFkU3RkaW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSgnL2Rldi9zdGRpbicsICd1dGY4Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFyZ3YuY2xpcGJvYXJkKSB7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbmZsaWN0aW5nIGFyZ3VtZW50c2ApO1xuICAgIH1cbiAgICBjb25zdCB7IGRlZmF1bHQ6IGNsaXBib2FyZHkgfSA9IGF3YWl0IGltcG9ydCgnY2xpcGJvYXJkeScpO1xuICAgIGlucHV0ID0gYXdhaXQgY2xpcGJvYXJkeS5yZWFkKCk7XG4gIH1cblxuICBpZiAoYXJndi5wYXRoKSB7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbmZsaWN0aW5nIGFyZ3VtZW50c2ApO1xuICAgIH1cbiAgICBpbnB1dCA9IChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShhcmd2LnBhdGgsICd1dGY4JykpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBpZiAoYXJndi5kYXRhKSB7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbmZsaWN0aW5nIGFyZ3VtZW50c2ApO1xuICAgIH1cbiAgICBpbnB1dCA9IGFyZ3YuZGF0YTtcbiAgfVxuXG4gIHJldHVybiBpbnB1dDtcbn1cbiJdfQ==