@bitgo/utxo-lib
Version:
Client-side Bitcoin JavaScript library
58 lines • 7.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.privateKeyBufferToECPair = privateKeyBufferToECPair;
exports.privateKeyBufferFromECPair = privateKeyBufferFromECPair;
exports.convertExtendedKeyNetwork = convertExtendedKeyNetwork;
const bs58check = require("bs58check");
const secp256k1_1 = require("@bitgo/secp256k1");
/**
* 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 secp256k1_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 = secp256k1_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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5dXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXRnby9rZXl1dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBVUEsNERBTUM7QUFPRCxnRUFjQztBQVVELDhEQVdDO0FBMURELHVDQUF1QztBQUV2QyxnREFBa0U7QUFFbEU7Ozs7O0dBS0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsT0FBaUI7SUFDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELE9BQU8sa0JBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxNQUF1QjtJQUNoRSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxXQUFtQixFQUFFLFdBQW9CLEVBQUUsYUFBc0I7SUFDekcsSUFBSSxXQUFXLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDbEMsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsaUJBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDMUcsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxhQUFhLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiczU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuLi9uZXR3b3Jrcyc7XG5pbXBvcnQgeyBiaXAzMiwgRUNQYWlyLCBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28vc2VjcDI1NmsxJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gRUNQYWlyIGZyb20gdGhlIHJhdyBwcml2YXRlIGtleSBieXRlc1xuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciAtIFByaXZhdGUga2V5IGZvciB0aGUgRUNQYWlyLiBNdXN0IGJlIGV4YWN0bHkgMzIgYnl0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW25ldHdvcmtdIC0gTmV0d29yayBmb3IgdGhlIEVDUGFpci4gRGVmYXVsdHMgdG8gYml0Y29pbi5cbiAqIEByZXR1cm4ge0VDUGFpcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVLZXlCdWZmZXJUb0VDUGFpcihidWZmZXI6IEJ1ZmZlciwgbmV0d29yaz86IE5ldHdvcmspOiBFQ1BhaXJJbnRlcmZhY2Uge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpIHx8IGJ1ZmZlci5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaXZhdGUga2V5IGJ1ZmZlcicpO1xuICB9XG5cbiAgcmV0dXJuIEVDUGFpci5mcm9tUHJpdmF0ZUtleShidWZmZXIpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJpdmF0ZSBrZXkgYXMgYSAzMiBieXRlcyBidWZmZXIuIElmIGl0IGlzIHNtYWxsZXIgdGhhbiAzMiBieXRlcywgcGFkIGl0IHdpdGggemVyb3NcbiAqIEBwYXJhbSB7RUNQYWlyfSBlY1BhaXJcbiAqIEByZXR1cm4gQnVmZmVyIDMyIGJ5dGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlS2V5QnVmZmVyRnJvbUVDUGFpcihlY1BhaXI6IEVDUGFpckludGVyZmFjZSk6IEJ1ZmZlciB7XG4gIGlmIChlY1BhaXIuY29uc3RydWN0b3IubmFtZSAhPT0gJ0VDUGFpcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIGFyZ3VtZW50IGVjcGFpcmApO1xuICB9XG5cbiAgY29uc3QgcHJpdmtleSA9IGVjUGFpci5wcml2YXRlS2V5O1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwcml2a2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBwcml2a2V5IHR5cGVgKTtcbiAgfVxuICBpZiAocHJpdmtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHByaXZrZXkgbGVuZ3RoYCk7XG4gIH1cblxuICByZXR1cm4gcHJpdmtleTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBleHRlbmRlZCBrZXkgZnJvbSBvbmUgbmV0d29yayB0byBhbm90aGVyIGJ5IHVwZGF0aW5nIGl0cyB2ZXJzaW9uIGJ5dGVzLlxuICpcbiAqIEhhbmRsZXMgYm90aCBwdWJsaWMgYW5kIHByaXZhdGUga2V5cywgYWxsb3dpbmcgY29udmVyc2lvbiBiZXR3ZWVuIG5ldHdvcmtzIGxpa2VcbiAqIEJpdGNvaW4gTWFpbm5ldCBhbmQgVGVzdG5ldC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZXh0ZW5kZWQga2V5IHdpdGggdGhlIHVwZGF0ZWQgbmV0d29yayB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEV4dGVuZGVkS2V5TmV0d29yayhleHRlbmRlZEtleTogc3RyaW5nLCBmcm9tTmV0d29yazogTmV0d29yaywgdGFyZ2V0TmV0d29yazogTmV0d29yayk6IHN0cmluZyB7XG4gIGlmIChmcm9tTmV0d29yayA9PT0gdGFyZ2V0TmV0d29yaykge1xuICAgIHJldHVybiBleHRlbmRlZEtleTtcbiAgfVxuICBjb25zdCBkZWNvZGVkRGF0YSA9IGJzNThjaGVjay5kZWNvZGUoZXh0ZW5kZWRLZXkpO1xuICBjb25zdCBoZE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGV4dGVuZGVkS2V5LCBmcm9tTmV0d29yayk7XG4gIGNvbnN0IHRhcmdldFZlcnNpb25CeXRlcyA9IGhkTm9kZS5pc05ldXRlcmVkKCkgPyB0YXJnZXROZXR3b3JrLmJpcDMyLnB1YmxpYyA6IHRhcmdldE5ldHdvcmsuYmlwMzIucHJpdmF0ZTtcbiAgY29uc3QgdmVyc2lvbkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgdmVyc2lvbkJ1ZmZlci53cml0ZVVJbnQzMkJFKHRhcmdldFZlcnNpb25CeXRlcywgMCk7XG4gIHZlcnNpb25CdWZmZXIuY29weShkZWNvZGVkRGF0YSwgMCwgMCwgNCk7XG4gIHJldHVybiBiczU4Y2hlY2suZW5jb2RlKGRlY29kZWREYXRhKTtcbn1cbiJdfQ==