Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: pass version opts down to Base58Check #19

Merged
merged 2 commits into from
Apr 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions base58check.types.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,15 +125,25 @@ module.exports._types = true;
/**
* @callback Decode
* @param {String} base58check - WIF, Payment Address, xPrv, or xPub
* @param {Object} opts
* @param {[String, String]} opts.versions
* @param {[String, String]} opts.xversions
* @returns {Parts}
*/

/**
* @callback DecodeHex
* @param {String} hex - magic version bytes + data + checksum
* @param {DecodeOpts} [opts]
* @returns {Parts}
*/

/**
* @typedef DecodeOpts
* @prop {[String, String]} [versions]
* @prop {[String, String]} [xversions]
*/

/**
* @callback Verify
* @param {String} base58check - WIF, Payment Address, xPrv, or xPub
Expand All @@ -153,6 +163,8 @@ module.exports._types = true;
/**
* @typedef VerifyOpts
* @prop {Boolean} [verify] - set 'false' to set 'valid' false rather than throw
* @param {[String, String]} [versions]
* @param {[String, String]} [xversions]
*/

/**
Expand Down
101 changes: 85 additions & 16 deletions dashkeys.js
Original file line number Diff line number Diff line change
Expand Up @@ -457,14 +457,14 @@ var DashKeys = ("object" === typeof module && exports) || {};

/** @type {Base58CheckVerify} */
b58c.verify = async function (b58Addr, opts) {
let bytes = bs58.decode(b58Addr);
let bytes = bs58.decode(b58Addr, opts);
let hex = Utils.bytesToHex(bytes);
return await b58c.verifyHex(hex, opts);
};

/** @type {Base58CheckVerifyHex} */
b58c.verifyHex = async function (base58check, opts) {
let parts = b58c.decodeHex(base58check);
let parts = b58c.decodeHex(base58check, opts);
let check = await b58c.checksum(parts);
let valid = parts.check === check;

Expand All @@ -479,17 +479,17 @@ var DashKeys = ("object" === typeof module && exports) || {};
};

/** @type {Base58CheckDecode} */
b58c.decode = function (b58Addr) {
b58c.decode = function (b58Addr, opts) {
let bytes = bs58.decode(b58Addr);
let hex = Utils.bytesToHex(bytes);
return b58c.decodeHex(hex);
return b58c.decodeHex(hex, opts);
};

/** @type {Base58CheckDecodeHex} */
b58c.decodeHex = function (addr) {
b58c.decodeHex = function (addr, opts) {
let version = addr.slice(0, privateKeyVersion.length);
let versions = [pubKeyHashVersion, privateKeyVersion];
let xversions = [xpubVersion, xprvVersion];
let versions = opts?.versions || [pubKeyHashVersion, privateKeyVersion];
let xversions = opts?.xversions || [xpubVersion, xprvVersion];
let isXKey = false;

if (!versions.includes(version)) {
Expand All @@ -516,7 +516,7 @@ var DashKeys = ("object" === typeof module && exports) || {};
let rawAddr = addr.slice(version.length, -8);
if (50 === addr.length) {
return {
version: version,
version: opts?.version || version,
pubKeyHash: rawAddr,
check: addr.slice(-8),
};
Expand All @@ -525,20 +525,20 @@ var DashKeys = ("object" === typeof module && exports) || {};
if (isXKey) {
if (version === xprvVersion) {
return {
version: version,
version: opts?.version || version,
xprv: rawAddr,
check: addr.slice(-8),
};
}
return {
version: version,
version: opts?.version || version,
xpub: rawAddr,
check: addr.slice(-8),
};
}

return {
version: version,
version: opts?.version || version,
privateKey: rawAddr.slice(0, 64),
compressed: true, // "01" === rawAddr.slice(64),
check: addr.slice(-8),
Expand Down Expand Up @@ -964,22 +964,87 @@ var DashKeys = ("object" === typeof module && exports) || {};
_DashKeys._dash58check = dash58check;

/** @type {AddressToPubKeyHash} */
_DashKeys.addrToPkh = async function (address) {
let addrParts = await _DashKeys.decode(address);
_DashKeys.addrToPkh = async function (address, opts) {
let addrParts = await _DashKeys.decode(address, opts);
let shaRipeBytes = Utils.hexToBytes(addrParts.pubKeyHash);

return shaRipeBytes;
};

/** @type {DecodeBase58Check} */
_DashKeys.decode = async function (keyB58c, opts) {
let parts = await dash58check.decode(keyB58c);
console.log("################ found it!");

let _opts = {};
if (opts?.version) {
switch (opts.version) {
case XPRV:
/* fallsthrough */
case "xprv":
/* fallsthrough */
case 0x0488ade4:
/* fallsthrough */
case XPUB:
/* fallsthrough */
case "xpub":
/* fallsthrough */
case 0x0488b21e:
/* fallsthrough */
case DASH_PRIV_KEY:
/* fallsthrough */
case 0xcc:
/* fallsthrough */
case DASH_PKH:
/* fallsthrough */
case 0x4c:
/* fallsthrough */
case "mainnet":
Object.assign(_opts, {
versions: [DASH_PKH, DASH_PRIV_KEY],
xversions: [XPRV, XPUB],
});
break;

case TPRV:
/* fallsthrough */
case "tprv":
/* fallsthrough */
case 0x04358394:
/* fallsthrough */
case TPUB:
/* fallsthrough */
case "tpub":
/* fallsthrough */
case 0x043587cf:
/* fallsthrough */
case DASH_PRIV_KEY_TESTNET:
/* fallsthrough */
case 0xef:
/* fallsthrough */
case DASH_PKH_TESTNET:
/* fallsthrough */
case 0x8c:
/* fallsthrough */
case "testnet":
Object.assign(_opts, {
versions: [DASH_PKH_TESTNET, DASH_PRIV_KEY_TESTNET],
xversions: [TPRV, TPUB],
});
break;
default:
throw new Error(`unknown version ${opts.version}`);
}
}
if (opts.versions) {
Object.assign(_opts, opts);
}
let parts = await dash58check.decode(keyB58c, _opts);
let check = await dash58check.checksum(parts);
let valid = parts.check === check;
if (!valid) {
if (false !== opts.validate) {
// to throw the inner error
await dash58check.verify(keyB58c);
await dash58check.verify(keyB58c, _opts);
}
}
parts.valid = valid;
Expand Down Expand Up @@ -1193,15 +1258,17 @@ var DashKeys = ("object" === typeof module && exports) || {};
};

/** @type {WifToAddress} */
_DashKeys.wifToAddr = async function (wif) {
_DashKeys.wifToAddr = async function (wif, opts) {
let privBytes = await _DashKeys.wifToPrivKey(wif);
let version = opts?.version;

let pubBytes = await Utils.toPublicKey(privBytes);
let pubKeyHash = await _DashKeys.pubkeyToPkh(pubBytes);
let pubKeyHashHex = Utils.bytesToHex(pubKeyHash);

let addr = await dash58check.encode({
pubKeyHash: pubKeyHashHex,
version: version,
});
return addr;
};
Expand Down Expand Up @@ -1262,6 +1329,8 @@ if ("object" === typeof module) {
/**
* @typedef DecodeOpts
* @prop {Boolean} validate - throw if check fails, true by default
* @prop {Array<VERSION|Number>} [versions]
* @prop {VERSION|Number} [version]
*/

/**
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dashkeys",
"version": "1.1.0",
"version": "1.1.1",
"description": "Generate, validate, create, and convert WIFs and PayAddress.",
"main": "dashkeys.js",
"browser": {
Expand Down
Loading