UNPKG

@swan-bitcoin/xpub-cli

Version:

Command-line wrapper around @swan-bitcoin/xpub-lib

112 lines (110 loc) 4.2 kB
#!/usr/bin/env node "use strict"; var _require = require("@swan-bitcoin/xpub-lib"), Network = _require.Network, initEccLib = _require.initEccLib, isValidAddress = _require.isValidAddress, isValidExtPubKey = _require.isValidExtPubKey, addressFromExtPubKey = _require.addressFromExtPubKey, addressesFromExtPubKey = _require.addressesFromExtPubKey, Purpose = _require.Purpose; var ecc = require('tiny-secp256k1'); var _require2 = require("../package.json"), version = _require2.version; function parsePurpose(purpose) { switch (purpose.toLowerCase()) { case "p2pkh": { return Purpose.P2PKH; } case "p2sh": { return Purpose.P2SH; } case "p2wpkh": { return Purpose.P2WPKH; } case "p2tr": { return Purpose.P2TR; } default: { return undefined; } } } function printAddress(address) { var verbose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (verbose) { console.log(address); } else { console.log(address.address); } } var _require3 = require("commander"), program = _require3.program; program.version("".concat(version)); program.command("derive [extPubKey]").description("derive address(es) from an extended public key").option("-p, --purpose <purpose>", "derivation purpose which dictates the address type ['p2pkh', 'p2sh', 'p2wpkh', 'p2tr']", "p2wpkh") // use `choices` once this feature is released: https://github.com/tj/commander.js/issues/518 .option("-n, --addressCount <addressCount>", "number of addresses to generate", 1).option("-c, --change <change>", "the change index to use (0 = external aka receive, 1 = internal aka change / other)", 0).option("-i, --keyIndex <keyIndex>", "index of the address to generate (ignored if `addressCount` is set)", 0).option("-t, --testnet", "use TESTNET").option("-v, --verbose", "verbose output").action(function (extPubKey, cmdObj) { if (!extPubKey) { cmdObj.help(); } initEccLib(ecc); var network = cmdObj.testnet ? Network.TESTNET : Network.MAINNET; if (!isValidExtPubKey(extPubKey, network)) { console.error("error: invalid extended public key '".concat(extPubKey, "'")); process.exitCode = 1; return; } var purpose = cmdObj.purpose ? parsePurpose(cmdObj.purpose) : Purpose.P2WPKH; // default to P2WPKH var change = cmdObj.change ? cmdObj.change : 0; // default to external chain var keyIndex = cmdObj.keyIndex ? cmdObj.keyIndex : 0; // default to first index if (cmdObj.addressCount > 1) { // Multiple addresses var addressCount = cmdObj.addressCount; var addresses = addressesFromExtPubKey({ extPubKey: extPubKey, addressCount: addressCount, change: change, purpose: purpose, network: network }); addresses.forEach(function (address) { printAddress(address, cmdObj.verbose); }); } else { // Single address var address = addressFromExtPubKey({ extPubKey: extPubKey, change: change, keyIndex: keyIndex, purpose: purpose, network: network }); printAddress(address, cmdObj.verbose); } }); program.command("validate [encoded]").description("check an encoded bitcoin address or extended public key for validity").option("-a, --check-address", "check bitcoin address for validity").option("-x, --check-ext", "check extended public key for validity").option("-t, --testnet", "use TESTNET").option("-v, --verbose", "verbose output").action(function (encoded, cmdObj) { if (!encoded) { cmdObj.help(); } var network = cmdObj.testnet ? Network.TESTNET : Network.MAINNET; var isValid = false; var type = ""; if (cmdObj.checkAddress) { isValid = isValidAddress(encoded, network); type = "address"; } else if (cmdObj.checkExt) { isValid = isValidExtPubKey(encoded, network); type = "extPubKey"; } else { isValid = isValidExtPubKey(encoded, network) || isValidAddress(encoded, network); } if (cmdObj.verbose) { console.log("".concat(isValid ? "valid" : "invalid", " ").concat(type, " ").concat(encoded)); } process.exitCode = isValid ? 0 : 1; }); program.parse(process.argv);