@tomo-inc/ledger-bitcoin-babylon
Version:
Ledger Hardware Wallet Babylon Application Client
85 lines • 6.13 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 (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createExtendedPubkey = void 0;
const crypto = __importStar(require("crypto"));
const bs58_1 = __importDefault(require("bs58"));
// Double SHA256 hash function
function hash256(data) {
return crypto
.createHash('sha256')
.update(crypto.createHash('sha256').update(data).digest())
.digest();
}
function createExtendedPubkey(network, depth = 0, parentFingerprint = Buffer.from('00000000', 'hex'), childIndex = 0, chainCode = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'), pubkey) {
let version;
// Define version based on network
if (network === 'Mainnet') {
version = Buffer.from('0488b21e', 'hex'); // xpub
}
else if (network === 'Testnet') {
version = Buffer.from('043587cf', 'hex'); // tpub
}
else {
throw new Error("Invalid network. Use 'Mainnet' or 'Testnet'.");
}
// Serialize extended public key components
const serialized = Buffer.concat([
version,
Buffer.from([depth]),
parentFingerprint,
Buffer.from([
childIndex >> 24,
(childIndex >> 16) & 0xff,
(childIndex >> 8) & 0xff,
childIndex & 0xff,
]),
chainCode,
pubkey, // 33 bytes: compressed public key
]);
// Calculate checksum (double SHA256, first 4 bytes)
const checksum = hash256(serialized).slice(0, 4);
// Append checksum and encode in Base58 using bs58
const extendedPubkey = bs58_1.default.encode(Buffer.concat([serialized, checksum]));
return extendedPubkey;
}
exports.createExtendedPubkey = createExtendedPubkey;
// // Example usage
// const network = 'testnet'; // Change to 'mainnet' for xpub
// const depth = 0; // Root level
// const parentFingerprint = Buffer.from('00000000', 'hex'); // No parent (root key)
// const childIndex = 0; // Root index
// const chainCode = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); // Example chain code
// const pubkey = Buffer.from('0250929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0', 'hex'); // Compressed public key
// // Generate xpub or tpub based on the network
// const extendedPubkeyTestnet = createExtendedPubkey(network, depth, parentFingerprint, childIndex, chainCode, pubkey);
// console.log(`Generated extended public key (testnet): ${extendedPubkeyTestnet}`);
// const networkMainnet = 'mainnet';
// const extendedPubkeyMainnet = createExtendedPubkey(networkMainnet, depth, parentFingerprint, childIndex, chainCode, pubkey);
// console.log(`Generated extended public key (mainnet): ${extendedPubkeyMainnet}`);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHB1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYmFieWxvbi94cHViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQWlDO0FBRWpDLGdEQUF3QjtBQUV4Qiw4QkFBOEI7QUFDOUIsU0FBUyxPQUFPLENBQUMsSUFBWTtJQUMzQixPQUFPLE1BQU07U0FDVixVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN6RCxNQUFNLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsT0FBOEIsRUFDOUIsS0FBSyxHQUFHLENBQUMsRUFDVCxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFDbEQsVUFBVSxHQUFHLENBQUMsRUFDZCxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDckIsa0VBQWtFLEVBQ2xFLEtBQUssQ0FDTixFQUNELE1BQWM7SUFFZCxJQUFJLE9BQWUsQ0FBQztJQUVwQixrQ0FBa0M7SUFDbEMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1FBQ3pCLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU87S0FDbEQ7U0FBTSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7UUFDaEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTztLQUNsRDtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0tBQ2pFO0lBRUQsMkNBQTJDO0lBQzNDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDL0IsT0FBTztRQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixpQkFBaUI7UUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNWLFVBQVUsSUFBSSxFQUFFO1lBQ2hCLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUk7WUFDekIsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSTtZQUN4QixVQUFVLEdBQUcsSUFBSTtTQUNsQixDQUFDO1FBQ0YsU0FBUztRQUNULE1BQU0sRUFBRSxrQ0FBa0M7S0FDM0MsQ0FBQyxDQUFDO0lBRUgsb0RBQW9EO0lBQ3BELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWpELGtEQUFrRDtJQUNsRCxNQUFNLGNBQWMsR0FBRyxjQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUEzQ0Qsb0RBMkNDO0FBRUQsbUJBQW1CO0FBQ25CLDhEQUE4RDtBQUM5RCxrQ0FBa0M7QUFDbEMscUZBQXFGO0FBQ3JGLHVDQUF1QztBQUN2QyxtSUFBbUk7QUFDbkkscUlBQXFJO0FBRXJJLGdEQUFnRDtBQUNoRCx3SEFBd0g7QUFDeEgsb0ZBQW9GO0FBRXBGLG9DQUFvQztBQUNwQywrSEFBK0g7QUFDL0gsb0ZBQW9GIn0=