@leather.io/crypto
Advanced tools
+8
-1
@@ -76,2 +76,5 @@ import { HDKey } from "@scure/bip32"; | ||
| declare const deriveKeychainFromXpub: (xpub: string) => HDKey; | ||
| declare function fingerprintAsNumberToHex(fingerprint: number): string; | ||
| declare function safelyReadPaddedFingerprint(fingerprintHex: string): string; | ||
| declare function unpadHex(hex: string): string; | ||
| /** | ||
@@ -82,2 +85,6 @@ * Gets keychain fingerprint directly from mnemonic. This is useful for | ||
| declare function getMnemonicRootKeyFingerprint(mnemonic: string, passphrase?: string): Promise<string>; | ||
| /** | ||
| * @deprecated Does not handle leading zeros correctly, use `getMnemonicRootKeyFingerprint` instead | ||
| */ | ||
| declare function getMnemonicRootKeyFingerprintBroken(mnemonic: string, passphrase?: string): Promise<string>; | ||
| declare function deriveKeychainExtendedPublicKeyDescriptor(rootKeychain: HDKey, path: string): string; | ||
@@ -100,3 +107,3 @@ declare function isValidMnemonicWord(word: string): boolean; | ||
| //#endregion | ||
| export { DerivationPathDepth, Signer, appendAddressIndexToPath, createDescriptor, createKeyOriginPath, decomposeDescriptor, deriveBip39MnemonicFromSeed, deriveBip39SeedFromMnemonic, deriveChildKeychainFromMnemnonic, deriveKeychainExtendedPublicKeyDescriptor, deriveKeychainFromXpub, deriveRootBip32Keychain, deriveRootKeychainFromMnemonic, extractAccountIndexFromDescriptor, extractAccountIndexFromPath, extractAccountPathFromFullPath, extractAddressIndexFromPath, extractChangeIndexFromPath, extractDerivationPathFromDescriptor, extractFingerprintFromDescriptor, extractFingerprintFromKeyOriginPath, extractKeyFromDescriptor, extractKeyOriginPathFromDescriptor, extractPurposeFromPath, generateMnemonic, getMnemonicRootKeyFingerprint, isValidMnemonic, isValidMnemonicWord, keyOriginToDerivationPath, makeAccountIdentifer, validateKeyOriginPath }; | ||
| export { DerivationPathDepth, Signer, appendAddressIndexToPath, createDescriptor, createKeyOriginPath, decomposeDescriptor, deriveBip39MnemonicFromSeed, deriveBip39SeedFromMnemonic, deriveChildKeychainFromMnemnonic, deriveKeychainExtendedPublicKeyDescriptor, deriveKeychainFromXpub, deriveRootBip32Keychain, deriveRootKeychainFromMnemonic, extractAccountIndexFromDescriptor, extractAccountIndexFromPath, extractAccountPathFromFullPath, extractAddressIndexFromPath, extractChangeIndexFromPath, extractDerivationPathFromDescriptor, extractFingerprintFromDescriptor, extractFingerprintFromKeyOriginPath, extractKeyFromDescriptor, extractKeyOriginPathFromDescriptor, extractPurposeFromPath, fingerprintAsNumberToHex, generateMnemonic, getMnemonicRootKeyFingerprint, getMnemonicRootKeyFingerprintBroken, isValidMnemonic, isValidMnemonicWord, keyOriginToDerivationPath, makeAccountIdentifer, safelyReadPaddedFingerprint, unpadHex, validateKeyOriginPath }; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","names":[],"sources":["../src/derivation-path-utils.ts","../src/keychain.ts","../src/signer/signer.ts"],"sourcesContent":[],"mappings":";;;aAEY,mBAAA;;;EAAA,QAAA,GAAA,CAAA;EAkBC,OAAA,GAAA,CAAA;EAEA,MAAA,GAAA,CAAA;EAIA,YAAA,GAAA,CAAA;AAIb;AAIgB,cAdH,sBAc2B,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;AAMxB,cAlBH,2BAkBsC,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;AAcnC,cA5BH,0BA4BsB,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;AAKnB,cA7BH,2BA6BwB,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;AAqBrB,iBA9CA,wBAAA,CA8CgB,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAQhB,iBAhDA,mCAAA,CAgDkC,aAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AASlD;AAQA;AAOA;AAOA;AAOA;AAKA;AAKA;;iBAlFgB,mBAAA;iBAKA,qBAAA;ACzChB;AAIA;;;;AAAuF,iBD0DvE,gBAAA,CC1DuE,aAAA,EAAA,MAAA,EAAA,GAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAIvF;AAEA;AAIA;AAIsB,iBDoDN,kCAAA,CCjDK,UAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAMrB;AAMA;AAKA;AAWgB,iBD8BA,mCAAA,CC9BmB,UAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAInC;AAOA;;iBD2BgB,gCAAA;;;;AEzGwC,iBFgHxC,iCAAA,CEhHwC,UAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;AAExD;iBFqHgB,wBAAA;;;;iBAOA,8BAAA;iBAKA,yBAAA;iBAKA,mBAAA;;;;;;;;;iBCtHA,gBAAA,CAAA;iBAIM,2BAAA,yCAAiE,QAAA,WAAA;ADpBvF;AAkBa,cCMA,2BDNsF,EAAA,OCM3D,2BDN2D;AAEtF,iBCMG,uBAAA,CDJf,IAAA,ECI6C,UDJ7C,CAAA,ECIuD,KDJvD;AAEY,iBCMS,8BAAA,CDJrB,QAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,CAAA,ECIyF,ODJzF,CCIyF,KDJzF,CAAA;AAEY,iBCMS,gCAAA,CDJrB,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,CAAA,ECOoB,ODPpB,CCOoB,KDPpB,CAAA;AAEe,cCWH,sBDX2B,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GCWmB,KDXnB;AAMxC;AAcA;AAKA;AAqBA;AAQgB,iBCrCM,6BAAA,CDqC4B,QAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,CAAA,ECrCuC,ODqCvC,CAAA,MAAA,CAAA;AASlC,iBCzCA,yCAAA,CDyCmC,YAAA,ECzCqB,KDyCrB,EAAA,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAQnC,iBCtCA,mBAAA,CDsCgC,IAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAOhC,iBCzCA,eAAA,CDyCiC,QAAA,EAAA,MAAA,CAAA,EAAA,OAAA;AAOjD;AAOA;AAKA;AAKgB,iBC1DA,oBAAA,CD0DmB,WAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;KExI9B,iBAAiB,0BAA0B,QAAQ;UAEvC,MAAA;QACT;EFDI,OAAA,EAAA,MAAA;EAkBC,SAAA,EEfA,UFeA;EAEA,cAAA,EAAA,MAAA;AAIb"} | ||
| {"version":3,"file":"index.d.ts","names":[],"sources":["../src/derivation-path-utils.ts","../src/keychain.ts","../src/signer/signer.ts"],"sourcesContent":[],"mappings":"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"} |
+18
-2
@@ -139,2 +139,12 @@ import { isHexString, toHexString } from "@leather.io/utils"; | ||
| const deriveKeychainFromXpub = memoize((xpub) => HDKey.fromExtendedKey(xpub)); | ||
| function fingerprintAsNumberToHex(fingerprint) { | ||
| return fingerprint.toString(16).padStart(8, "0"); | ||
| } | ||
| function safelyReadPaddedFingerprint(fingerprintHex) { | ||
| if (fingerprintHex.length < 8) return fingerprintHex.padStart(8, "0"); | ||
| return fingerprintHex; | ||
| } | ||
| function unpadHex(hex) { | ||
| return BigInt("0x" + hex).toString(16); | ||
| } | ||
| /** | ||
@@ -145,6 +155,12 @@ * Gets keychain fingerprint directly from mnemonic. This is useful for | ||
| async function getMnemonicRootKeyFingerprint(mnemonic, passphrase) { | ||
| return fingerprintAsNumberToHex(deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase)).fingerprint); | ||
| } | ||
| /** | ||
| * @deprecated Does not handle leading zeros correctly, use `getMnemonicRootKeyFingerprint` instead | ||
| */ | ||
| async function getMnemonicRootKeyFingerprintBroken(mnemonic, passphrase) { | ||
| return toHexString(deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase)).fingerprint); | ||
| } | ||
| function deriveKeychainExtendedPublicKeyDescriptor(rootKeychain, path) { | ||
| const keyOriginPath = createKeyOriginPath(toHexString(rootKeychain.fingerprint), path); | ||
| const keyOriginPath = createKeyOriginPath(fingerprintAsNumberToHex(rootKeychain.fingerprint), path); | ||
| if (rootKeychain.depth !== DerivationPathDepth.Root) throw new Error("Cannot derive account keychain from non-root keychain"); | ||
@@ -167,3 +183,3 @@ return createDescriptor(keyOriginPath, rootKeychain.derive(path).publicExtendedKey); | ||
| //#endregion | ||
| export { DerivationPathDepth, appendAddressIndexToPath, createDescriptor, createKeyOriginPath, decomposeDescriptor, deriveBip39MnemonicFromSeed, deriveBip39SeedFromMnemonic, deriveChildKeychainFromMnemnonic, deriveKeychainExtendedPublicKeyDescriptor, deriveKeychainFromXpub, deriveRootBip32Keychain, deriveRootKeychainFromMnemonic, extractAccountIndexFromDescriptor, extractAccountIndexFromPath, extractAccountPathFromFullPath, extractAddressIndexFromPath, extractChangeIndexFromPath, extractDerivationPathFromDescriptor, extractFingerprintFromDescriptor, extractFingerprintFromKeyOriginPath, extractKeyFromDescriptor, extractKeyOriginPathFromDescriptor, extractPurposeFromPath, generateMnemonic, getMnemonicRootKeyFingerprint, isValidMnemonic, isValidMnemonicWord, keyOriginToDerivationPath, makeAccountIdentifer, validateKeyOriginPath }; | ||
| export { DerivationPathDepth, appendAddressIndexToPath, createDescriptor, createKeyOriginPath, decomposeDescriptor, deriveBip39MnemonicFromSeed, deriveBip39SeedFromMnemonic, deriveChildKeychainFromMnemnonic, deriveKeychainExtendedPublicKeyDescriptor, deriveKeychainFromXpub, deriveRootBip32Keychain, deriveRootKeychainFromMnemonic, extractAccountIndexFromDescriptor, extractAccountIndexFromPath, extractAccountPathFromFullPath, extractAddressIndexFromPath, extractChangeIndexFromPath, extractDerivationPathFromDescriptor, extractFingerprintFromDescriptor, extractFingerprintFromKeyOriginPath, extractKeyFromDescriptor, extractKeyOriginPathFromDescriptor, extractPurposeFromPath, fingerprintAsNumberToHex, generateMnemonic, getMnemonicRootKeyFingerprint, getMnemonicRootKeyFingerprintBroken, isValidMnemonic, isValidMnemonicWord, keyOriginToDerivationPath, makeAccountIdentifer, safelyReadPaddedFingerprint, unpadHex, validateKeyOriginPath }; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","names":["scureGenerateMnemonic"],"sources":["../src/derivation-path-utils.ts","../src/keychain.ts"],"sourcesContent":["import { isHexString } from '@leather.io/utils';\n\nexport enum DerivationPathDepth {\n Root = 0,\n Purpose = 1,\n CoinType = 2,\n Account = 3,\n Change = 4,\n AddressIndex = 5,\n}\n\nfunction extractSectionFromDerivationPath(depth: DerivationPathDepth) {\n return (path: string) => {\n const segments = path.split('/');\n const accountNum = parseInt(segments[depth].replaceAll(\"'\", ''), 10);\n if (isNaN(accountNum)) throw new Error(`Cannot parse ${DerivationPathDepth[depth]} from path`);\n return accountNum;\n };\n}\n\nexport const extractPurposeFromPath = extractSectionFromDerivationPath(DerivationPathDepth.Purpose);\n\nexport const extractAccountIndexFromPath = extractSectionFromDerivationPath(\n DerivationPathDepth.Account\n);\n\nexport const extractChangeIndexFromPath = extractSectionFromDerivationPath(\n DerivationPathDepth.Change\n);\n\nexport const extractAddressIndexFromPath = extractSectionFromDerivationPath(\n DerivationPathDepth.AddressIndex\n);\n\nexport function appendAddressIndexToPath(path: string, change: number, addressIndex: number) {\n const accountIndex = extractAccountIndexFromPath(path);\n if (!Number.isInteger(accountIndex)) throw new Error('Invalid path, must have account index');\n return `${path}/${change}/${addressIndex}`;\n}\n\nexport function extractFingerprintFromKeyOriginPath(keyOriginPath: string) {\n const fingerprint = keyOriginPath.split('/')[0];\n if (!isHexString(fingerprint)) throw new Error('Fingerprint must be a hexadecimal string');\n return fingerprint;\n}\n\n/**\n * @description\n * A key origin path refers to the identifier commonly used as part of the key\n * information provided as part of a Output Descriptor described in BIP-380. It\n * replaces the `m/` part of a derivation path with the master key fingerprint to which the\n * key it describes belongs.\n * @example `0a3fd8ef/84'/0'/0'`\n */\nexport function createKeyOriginPath(fingerprint: string, path: string) {\n if (!isHexString(fingerprint)) throw new Error('Fingerprint must be a hexadecimal string');\n return `${fingerprint}/${path.replace('m/', '')}`;\n}\n\nexport function validateKeyOriginPath(keyOriginPath: string) {\n if (keyOriginPath.includes('[') || keyOriginPath.includes(']'))\n throw new Error('Key origin path should not contain square brackets');\n\n if (!keyOriginPath.includes('/'))\n throw new Error('Key origin path must contain a fingerprint and derivation path');\n\n if (!isHexString(extractFingerprintFromKeyOriginPath(keyOriginPath)))\n throw new Error('Fingerprint must be a hexadecimal string');\n\n if (keyOriginPath.split('/').length < 4)\n throw new Error('Key origin path is too short. Should describe at least to the account level');\n\n return true;\n}\n\n/**\n * @description\n * Creates a descriptor with key origin and xpub or public key\n * @returns `[0a3fd8ef/84'/0'/0']xpuba1b…2c3`\n */\nexport function createDescriptor(keyOriginPath: string, key: string) {\n validateKeyOriginPath(keyOriginPath);\n return `[${keyOriginPath}]${key}`;\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/0']xpuba1b…2c3` -> `0a3fd8ef/84'/0'/0'`\n */\nexport function extractKeyOriginPathFromDescriptor(descriptor: string) {\n const keyOriginPath = descriptor.split(']')[0].replace('[', '');\n validateKeyOriginPath(keyOriginPath);\n return keyOriginPath;\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/0']xpuba1b…2c3` -> `m/84'/0'/0'`\n */\nexport function extractDerivationPathFromDescriptor(descriptor: string) {\n const keyOriginPath = extractKeyOriginPathFromDescriptor(descriptor);\n return 'm/' + keyOriginPath.split('/').slice(1).join('/');\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/0']xpuba1b…2c3` -> `0a3fd8ef`\n */\nexport function extractFingerprintFromDescriptor(descriptor: string) {\n return extractFingerprintFromKeyOriginPath(extractKeyOriginPathFromDescriptor(descriptor));\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/6']xpuba1b…2c3` -> `6`\n */\nexport function extractAccountIndexFromDescriptor(descriptor: string) {\n return extractAccountIndexFromPath(extractKeyOriginPathFromDescriptor(descriptor));\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/6']xpuba1b…2c3` -> `xpuba1b…2c3`\n */\nexport function extractKeyFromDescriptor(descriptor: string) {\n return descriptor.split(']')[1];\n}\n\n/**\n * @example `0a3fd8ef/84'/0'/0/0/0` -> `0a3fd8ef/84'/0'/0`\n */\nexport function extractAccountPathFromFullPath(path: string) {\n const segments = path.split('/');\n return segments.slice(0, 4).join('/');\n}\n\nexport function keyOriginToDerivationPath(keyOrigin: string) {\n const [_fingerprint, ...remainingPath] = keyOrigin.split('/');\n return `m/${remainingPath.join('/')}`;\n}\n\nexport function decomposeDescriptor(descriptor: string) {\n return {\n descriptor,\n keyOrigin: extractKeyOriginPathFromDescriptor(descriptor),\n fingerprint: extractFingerprintFromDescriptor(descriptor),\n derivationPath: extractDerivationPathFromDescriptor(descriptor),\n accountIndex: extractAccountIndexFromDescriptor(descriptor),\n };\n}\n","import { HDKey } from '@scure/bip32';\nimport {\n mnemonicToSeed,\n generateMnemonic as scureGenerateMnemonic,\n validateMnemonic,\n} from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport memoize from 'just-memoize';\n\nimport { toHexString } from '@leather.io/utils';\n\nimport {\n DerivationPathDepth,\n createDescriptor,\n createKeyOriginPath,\n keyOriginToDerivationPath,\n} from './derivation-path-utils';\n\nexport function generateMnemonic() {\n return scureGenerateMnemonic(wordlist, 256);\n}\n\nexport async function deriveBip39SeedFromMnemonic(mnemonic: string, passphrase?: string) {\n return mnemonicToSeed(mnemonic, passphrase);\n}\n/** @deprecated Inaccurately named fn, use `deriveBip39SeedFromMnemonic` */\nexport const deriveBip39MnemonicFromSeed = deriveBip39SeedFromMnemonic;\n\nexport function deriveRootBip32Keychain(seed: Uint8Array) {\n return HDKey.fromMasterSeed(seed);\n}\n\nexport async function deriveRootKeychainFromMnemonic(mnemonic: string, passphrase?: string) {\n return deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase));\n}\n\nexport async function deriveChildKeychainFromMnemnonic(\n path: string,\n mnemonic: string,\n passphrase?: string\n) {\n const rootKeychain = deriveRootBip32Keychain(await mnemonicToSeed(mnemonic, passphrase));\n return rootKeychain.derive(keyOriginToDerivationPath(path));\n}\n\nexport const deriveKeychainFromXpub = memoize((xpub: string) => HDKey.fromExtendedKey(xpub));\n\n/**\n * Gets keychain fingerprint directly from mnemonic. This is useful for\n * referencing a mnemonic safely by an identifier.\n */\nexport async function getMnemonicRootKeyFingerprint(mnemonic: string, passphrase?: string) {\n const keychain = deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase));\n return toHexString(keychain.fingerprint);\n}\n\nexport function deriveKeychainExtendedPublicKeyDescriptor(rootKeychain: HDKey, path: string) {\n const masterFingerprint = toHexString(rootKeychain.fingerprint);\n const keyOriginPath = createKeyOriginPath(masterFingerprint, path);\n\n if (rootKeychain.depth !== DerivationPathDepth.Root)\n throw new Error('Cannot derive account keychain from non-root keychain');\n\n const accountKeychain = rootKeychain.derive(path);\n return createDescriptor(keyOriginPath, accountKeychain.publicExtendedKey);\n}\n\nexport function isValidMnemonicWord(word: string): boolean {\n return wordlist.includes(word);\n}\n\nexport function isValidMnemonic(mnemonic: string): boolean {\n return validateMnemonic(mnemonic, wordlist);\n}\n\n/**\n * Create a unique accountId using wallet's fingerprint and accountIndex\n */\nexport function makeAccountIdentifer(fingerprint: string, accountIndex: number) {\n return [fingerprint, accountIndex].join('/');\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"index.js","names":["scureGenerateMnemonic"],"sources":["../src/derivation-path-utils.ts","../src/keychain.ts"],"sourcesContent":["import { isHexString } from '@leather.io/utils';\n\nexport enum DerivationPathDepth {\n Root = 0,\n Purpose = 1,\n CoinType = 2,\n Account = 3,\n Change = 4,\n AddressIndex = 5,\n}\n\nfunction extractSectionFromDerivationPath(depth: DerivationPathDepth) {\n return (path: string) => {\n const segments = path.split('/');\n const accountNum = parseInt(segments[depth].replaceAll(\"'\", ''), 10);\n if (isNaN(accountNum)) throw new Error(`Cannot parse ${DerivationPathDepth[depth]} from path`);\n return accountNum;\n };\n}\n\nexport const extractPurposeFromPath = extractSectionFromDerivationPath(DerivationPathDepth.Purpose);\n\nexport const extractAccountIndexFromPath = extractSectionFromDerivationPath(\n DerivationPathDepth.Account\n);\n\nexport const extractChangeIndexFromPath = extractSectionFromDerivationPath(\n DerivationPathDepth.Change\n);\n\nexport const extractAddressIndexFromPath = extractSectionFromDerivationPath(\n DerivationPathDepth.AddressIndex\n);\n\nexport function appendAddressIndexToPath(path: string, change: number, addressIndex: number) {\n const accountIndex = extractAccountIndexFromPath(path);\n if (!Number.isInteger(accountIndex)) throw new Error('Invalid path, must have account index');\n return `${path}/${change}/${addressIndex}`;\n}\n\nexport function extractFingerprintFromKeyOriginPath(keyOriginPath: string) {\n const fingerprint = keyOriginPath.split('/')[0];\n if (!isHexString(fingerprint)) throw new Error('Fingerprint must be a hexadecimal string');\n return fingerprint;\n}\n\n/**\n * @description\n * A key origin path refers to the identifier commonly used as part of the key\n * information provided as part of a Output Descriptor described in BIP-380. It\n * replaces the `m/` part of a derivation path with the master key fingerprint to which the\n * key it describes belongs.\n * @example `0a3fd8ef/84'/0'/0'`\n */\nexport function createKeyOriginPath(fingerprint: string, path: string) {\n if (!isHexString(fingerprint)) throw new Error('Fingerprint must be a hexadecimal string');\n return `${fingerprint}/${path.replace('m/', '')}`;\n}\n\nexport function validateKeyOriginPath(keyOriginPath: string) {\n if (keyOriginPath.includes('[') || keyOriginPath.includes(']'))\n throw new Error('Key origin path should not contain square brackets');\n\n if (!keyOriginPath.includes('/'))\n throw new Error('Key origin path must contain a fingerprint and derivation path');\n\n if (!isHexString(extractFingerprintFromKeyOriginPath(keyOriginPath)))\n throw new Error('Fingerprint must be a hexadecimal string');\n\n if (keyOriginPath.split('/').length < 4)\n throw new Error('Key origin path is too short. Should describe at least to the account level');\n\n return true;\n}\n\n/**\n * @description\n * Creates a descriptor with key origin and xpub or public key\n * @returns `[0a3fd8ef/84'/0'/0']xpuba1b…2c3`\n */\nexport function createDescriptor(keyOriginPath: string, key: string) {\n validateKeyOriginPath(keyOriginPath);\n return `[${keyOriginPath}]${key}`;\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/0']xpuba1b…2c3` -> `0a3fd8ef/84'/0'/0'`\n */\nexport function extractKeyOriginPathFromDescriptor(descriptor: string) {\n const keyOriginPath = descriptor.split(']')[0].replace('[', '');\n validateKeyOriginPath(keyOriginPath);\n return keyOriginPath;\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/0']xpuba1b…2c3` -> `m/84'/0'/0'`\n */\nexport function extractDerivationPathFromDescriptor(descriptor: string) {\n const keyOriginPath = extractKeyOriginPathFromDescriptor(descriptor);\n return 'm/' + keyOriginPath.split('/').slice(1).join('/');\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/0']xpuba1b…2c3` -> `0a3fd8ef`\n */\nexport function extractFingerprintFromDescriptor(descriptor: string) {\n return extractFingerprintFromKeyOriginPath(extractKeyOriginPathFromDescriptor(descriptor));\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/6']xpuba1b…2c3` -> `6`\n */\nexport function extractAccountIndexFromDescriptor(descriptor: string) {\n return extractAccountIndexFromPath(extractKeyOriginPathFromDescriptor(descriptor));\n}\n\n/**\n * @example `[0a3fd8ef/84'/0'/6']xpuba1b…2c3` -> `xpuba1b…2c3`\n */\nexport function extractKeyFromDescriptor(descriptor: string) {\n return descriptor.split(']')[1];\n}\n\n/**\n * @example `0a3fd8ef/84'/0'/0/0/0` -> `0a3fd8ef/84'/0'/0`\n */\nexport function extractAccountPathFromFullPath(path: string) {\n const segments = path.split('/');\n return segments.slice(0, 4).join('/');\n}\n\nexport function keyOriginToDerivationPath(keyOrigin: string) {\n const [_fingerprint, ...remainingPath] = keyOrigin.split('/');\n return `m/${remainingPath.join('/')}`;\n}\n\nexport function decomposeDescriptor(descriptor: string) {\n return {\n descriptor,\n keyOrigin: extractKeyOriginPathFromDescriptor(descriptor),\n fingerprint: extractFingerprintFromDescriptor(descriptor),\n derivationPath: extractDerivationPathFromDescriptor(descriptor),\n accountIndex: extractAccountIndexFromDescriptor(descriptor),\n };\n}\n","import { HDKey } from '@scure/bip32';\nimport {\n mnemonicToSeed,\n generateMnemonic as scureGenerateMnemonic,\n validateMnemonic,\n} from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\nimport memoize from 'just-memoize';\n\nimport { toHexString } from '@leather.io/utils';\n\nimport {\n DerivationPathDepth,\n createDescriptor,\n createKeyOriginPath,\n keyOriginToDerivationPath,\n} from './derivation-path-utils';\n\nexport function generateMnemonic() {\n return scureGenerateMnemonic(wordlist, 256);\n}\n\nexport async function deriveBip39SeedFromMnemonic(mnemonic: string, passphrase?: string) {\n return mnemonicToSeed(mnemonic, passphrase);\n}\n\n/** @deprecated Inaccurately named fn, use `deriveBip39SeedFromMnemonic` */\nexport const deriveBip39MnemonicFromSeed = deriveBip39SeedFromMnemonic;\n\nexport function deriveRootBip32Keychain(seed: Uint8Array) {\n return HDKey.fromMasterSeed(seed);\n}\n\nexport async function deriveRootKeychainFromMnemonic(mnemonic: string, passphrase?: string) {\n return deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase));\n}\n\nexport async function deriveChildKeychainFromMnemnonic(\n path: string,\n mnemonic: string,\n passphrase?: string\n) {\n const rootKeychain = deriveRootBip32Keychain(await mnemonicToSeed(mnemonic, passphrase));\n return rootKeychain.derive(keyOriginToDerivationPath(path));\n}\n\nexport const deriveKeychainFromXpub = memoize((xpub: string) => HDKey.fromExtendedKey(xpub));\n\nexport function fingerprintAsNumberToHex(fingerprint: number) {\n return fingerprint.toString(16).padStart(8, '0');\n}\n\nexport function safelyReadPaddedFingerprint(fingerprintHex: string) {\n if (fingerprintHex.length < 8) {\n return fingerprintHex.padStart(8, '0');\n }\n return fingerprintHex;\n}\n\nexport function unpadHex(hex: string) {\n return BigInt('0x' + hex).toString(16);\n}\n\n/**\n * Gets keychain fingerprint directly from mnemonic. This is useful for\n * referencing a mnemonic safely by an identifier.\n */\nexport async function getMnemonicRootKeyFingerprint(mnemonic: string, passphrase?: string) {\n const keychain = deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase));\n return fingerprintAsNumberToHex(keychain.fingerprint);\n}\n\n/**\n * @deprecated Does not handle leading zeros correctly, use `getMnemonicRootKeyFingerprint` instead\n */\nexport async function getMnemonicRootKeyFingerprintBroken(mnemonic: string, passphrase?: string) {\n const keychain = deriveRootBip32Keychain(await deriveBip39SeedFromMnemonic(mnemonic, passphrase));\n return toHexString(keychain.fingerprint);\n}\n\nexport function deriveKeychainExtendedPublicKeyDescriptor(rootKeychain: HDKey, path: string) {\n const masterFingerprint = fingerprintAsNumberToHex(rootKeychain.fingerprint);\n const keyOriginPath = createKeyOriginPath(masterFingerprint, path);\n\n if (rootKeychain.depth !== DerivationPathDepth.Root)\n throw new Error('Cannot derive account keychain from non-root keychain');\n\n const accountKeychain = rootKeychain.derive(path);\n return createDescriptor(keyOriginPath, accountKeychain.publicExtendedKey);\n}\n\nexport function isValidMnemonicWord(word: string): boolean {\n return wordlist.includes(word);\n}\n\nexport function isValidMnemonic(mnemonic: string): boolean {\n return validateMnemonic(mnemonic, wordlist);\n}\n\n/**\n * Create a unique accountId using wallet's fingerprint and accountIndex\n */\nexport function makeAccountIdentifer(fingerprint: string, accountIndex: number) {\n return [fingerprint, accountIndex].join('/');\n}\n"],"mappings":"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"} |
+4
-3
@@ -5,3 +5,3 @@ { | ||
| "description": "Generic crypto utils package for Leather", | ||
| "version": "1.12.13", | ||
| "version": "1.12.14", | ||
| "license": "MIT", | ||
@@ -13,6 +13,7 @@ "type": "module", | ||
| "dependencies": { | ||
| "@noble/hashes": "1.5.0", | ||
| "@scure/bip32": "1.6.2", | ||
| "@scure/bip39": "1.5.4", | ||
| "just-memoize": "2.2.0", | ||
| "@leather.io/utils": "0.49.7" | ||
| "@leather.io/utils": "0.49.8" | ||
| }, | ||
@@ -24,3 +25,3 @@ "devDependencies": { | ||
| "@leather.io/prettier-config": "0.9.0", | ||
| "@leather.io/test-config": "0.1.2" | ||
| "@leather.io/test-config": "0.1.3" | ||
| }, | ||
@@ -27,0 +28,0 @@ "files": [ |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
30927
9.15%288
8.68%5
25%+ Added
+ Added
+ Added
- Removed
Updated