UNPKG

@bitgo/utxo-lib

Version:

Client-side Bitcoin JavaScript library

58 lines 7.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.privateKeyBufferToECPair = privateKeyBufferToECPair; exports.privateKeyBufferFromECPair = privateKeyBufferFromECPair; exports.convertExtendedKeyNetwork = convertExtendedKeyNetwork; const bs58check = require("bs58check"); const noble_ecc_1 = require("../noble_ecc"); /** * Create an ECPair from the raw private key bytes * @param {Buffer} buffer - Private key for the ECPair. Must be exactly 32 bytes. * @param {Object} [network] - Network for the ECPair. Defaults to bitcoin. * @return {ECPair} */ function privateKeyBufferToECPair(buffer, network) { if (!Buffer.isBuffer(buffer) || buffer.length !== 32) { throw new Error('invalid private key buffer'); } return noble_ecc_1.ECPair.fromPrivateKey(buffer); } /** * Get the private key as a 32 bytes buffer. If it is smaller than 32 bytes, pad it with zeros * @param {ECPair} ecPair * @return Buffer 32 bytes */ function privateKeyBufferFromECPair(ecPair) { if (ecPair.constructor.name !== 'ECPair') { throw new TypeError(`invalid argument ecpair`); } const privkey = ecPair.privateKey; if (!Buffer.isBuffer(privkey)) { throw new Error(`unexpected privkey type`); } if (privkey.length !== 32) { throw new Error(`unexpected privkey length`); } return privkey; } /** * Converts an extended key from one network to another by updating its version bytes. * * Handles both public and private keys, allowing conversion between networks like * Bitcoin Mainnet and Testnet. * * @returns The extended key with the updated network version. */ function convertExtendedKeyNetwork(extendedKey, fromNetwork, targetNetwork) { if (fromNetwork === targetNetwork) { return extendedKey; } const decodedData = bs58check.decode(extendedKey); const hdNode = noble_ecc_1.bip32.fromBase58(extendedKey, fromNetwork); const targetVersionBytes = hdNode.isNeutered() ? targetNetwork.bip32.public : targetNetwork.bip32.private; const versionBuffer = Buffer.alloc(4); versionBuffer.writeUInt32BE(targetVersionBytes, 0); versionBuffer.copy(decodedData, 0, 0, 4); return bs58check.encode(decodedData); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5dXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXRnby9rZXl1dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0EsNERBTUM7QUFPRCxnRUFjQztBQVVELDhEQVdDO0FBMURELHVDQUF1QztBQUV2Qyw0Q0FBNkM7QUFFN0M7Ozs7O0dBS0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsT0FBaUI7SUFDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELE9BQU8sa0JBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxNQUF1QjtJQUNoRSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxXQUFtQixFQUFFLFdBQW9CLEVBQUUsYUFBc0I7SUFDekcsSUFBSSxXQUFXLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDbEMsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsaUJBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDMUcsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxhQUFhLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdlY3BhaXInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi4vbmV0d29ya3MnO1xuaW1wb3J0IHsgYmlwMzIsIEVDUGFpciB9IGZyb20gJy4uL25vYmxlX2VjYyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVDUGFpciBmcm9tIHRoZSByYXcgcHJpdmF0ZSBrZXkgYnl0ZXNcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgLSBQcml2YXRlIGtleSBmb3IgdGhlIEVDUGFpci4gTXVzdCBiZSBleGFjdGx5IDMyIGJ5dGVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtuZXR3b3JrXSAtIE5ldHdvcmsgZm9yIHRoZSBFQ1BhaXIuIERlZmF1bHRzIHRvIGJpdGNvaW4uXG4gKiBAcmV0dXJuIHtFQ1BhaXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlS2V5QnVmZmVyVG9FQ1BhaXIoYnVmZmVyOiBCdWZmZXIsIG5ldHdvcms/OiBOZXR3b3JrKTogRUNQYWlySW50ZXJmYWNlIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSB8fCBidWZmZXIubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcml2YXRlIGtleSBidWZmZXInKTtcbiAgfVxuXG4gIHJldHVybiBFQ1BhaXIuZnJvbVByaXZhdGVLZXkoYnVmZmVyKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByaXZhdGUga2V5IGFzIGEgMzIgYnl0ZXMgYnVmZmVyLiBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gMzIgYnl0ZXMsIHBhZCBpdCB3aXRoIHplcm9zXG4gKiBAcGFyYW0ge0VDUGFpcn0gZWNQYWlyXG4gKiBAcmV0dXJuIEJ1ZmZlciAzMiBieXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUtleUJ1ZmZlckZyb21FQ1BhaXIoZWNQYWlyOiBFQ1BhaXJJbnRlcmZhY2UpOiBCdWZmZXIge1xuICBpZiAoZWNQYWlyLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdFQ1BhaXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCBhcmd1bWVudCBlY3BhaXJgKTtcbiAgfVxuXG4gIGNvbnN0IHByaXZrZXkgPSBlY1BhaXIucHJpdmF0ZUtleTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocHJpdmtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcHJpdmtleSB0eXBlYCk7XG4gIH1cbiAgaWYgKHByaXZrZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBwcml2a2V5IGxlbmd0aGApO1xuICB9XG5cbiAgcmV0dXJuIHByaXZrZXk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gZXh0ZW5kZWQga2V5IGZyb20gb25lIG5ldHdvcmsgdG8gYW5vdGhlciBieSB1cGRhdGluZyBpdHMgdmVyc2lvbiBieXRlcy5cbiAqXG4gKiBIYW5kbGVzIGJvdGggcHVibGljIGFuZCBwcml2YXRlIGtleXMsIGFsbG93aW5nIGNvbnZlcnNpb24gYmV0d2VlbiBuZXR3b3JrcyBsaWtlXG4gKiBCaXRjb2luIE1haW5uZXQgYW5kIFRlc3RuZXQuXG4gKlxuICogQHJldHVybnMgVGhlIGV4dGVuZGVkIGtleSB3aXRoIHRoZSB1cGRhdGVkIG5ldHdvcmsgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRFeHRlbmRlZEtleU5ldHdvcmsoZXh0ZW5kZWRLZXk6IHN0cmluZywgZnJvbU5ldHdvcms6IE5ldHdvcmssIHRhcmdldE5ldHdvcms6IE5ldHdvcmspOiBzdHJpbmcge1xuICBpZiAoZnJvbU5ldHdvcmsgPT09IHRhcmdldE5ldHdvcmspIHtcbiAgICByZXR1cm4gZXh0ZW5kZWRLZXk7XG4gIH1cbiAgY29uc3QgZGVjb2RlZERhdGEgPSBiczU4Y2hlY2suZGVjb2RlKGV4dGVuZGVkS2V5KTtcbiAgY29uc3QgaGROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChleHRlbmRlZEtleSwgZnJvbU5ldHdvcmspO1xuICBjb25zdCB0YXJnZXRWZXJzaW9uQnl0ZXMgPSBoZE5vZGUuaXNOZXV0ZXJlZCgpID8gdGFyZ2V0TmV0d29yay5iaXAzMi5wdWJsaWMgOiB0YXJnZXROZXR3b3JrLmJpcDMyLnByaXZhdGU7XG4gIGNvbnN0IHZlcnNpb25CdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gIHZlcnNpb25CdWZmZXIud3JpdGVVSW50MzJCRSh0YXJnZXRWZXJzaW9uQnl0ZXMsIDApO1xuICB2ZXJzaW9uQnVmZmVyLmNvcHkoZGVjb2RlZERhdGEsIDAsIDAsIDQpO1xuICByZXR1cm4gYnM1OGNoZWNrLmVuY29kZShkZWNvZGVkRGF0YSk7XG59XG4iXX0=