@swan-bitcoin/xpub-cli
Version:
Command-line wrapper around @swan-bitcoin/xpub-lib
112 lines (110 loc) • 4.2 kB
JavaScript
;
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);