UNPKG

@ledgerhq/hw-app-btc

Version:
104 lines 4.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAccountTypeFromScriptType = createAccountTypeFromScriptType; exports.determineAccountTypeFromWitnessUtxo = determineAccountTypeFromWitnessUtxo; exports.createAccountTypeFromAddressFormat = createAccountTypeFromAddressFormat; exports.determineAccountTypeFromPurpose = determineAccountTypeFromPurpose; exports.determineAccountType = determineAccountType; const psbtv2_1 = require("@ledgerhq/psbtv2"); const accounttype_1 = require("../newops/accounttype"); function descrTemplFrom(addressFormat) { switch (addressFormat) { case "legacy": return "pkh(@0/**)"; case "p2sh": return "sh(wpkh(@0/**))"; case "bech32": return "wpkh(@0/**)"; case "bech32m": return "tr(@0/**)"; default: throw new Error("Unsupported address format " + addressFormat); } } function createAccountTypeFromScriptType(scriptType, psbt, masterFp) { switch (scriptType) { case "p2wpkh": return new accounttype_1.p2wpkh(psbt, masterFp); case "p2tr": return new accounttype_1.p2tr(psbt, masterFp); case "p2sh": case "p2sh-p2wpkh": return new accounttype_1.p2wpkhWrapped(psbt, masterFp); case "p2pkh": return new accounttype_1.p2pkh(psbt, masterFp); } } function determineAccountTypeFromWitnessUtxo(psbt, inputIndex, masterFp) { const witnessUtxo = psbt.getInputWitnessUtxo(inputIndex); if (!witnessUtxo) { return null; } const scriptType = (0, psbtv2_1.detectScriptType)(witnessUtxo.scriptPubKey); if (!scriptType) { throw new Error(`Unsupported script type: ${witnessUtxo.scriptPubKey.toString("hex")}`); } return createAccountTypeFromScriptType(scriptType, psbt, masterFp); } function createAccountTypeFromAddressFormat(addressFormat, psbt, masterFp) { const descrTemplate = descrTemplFrom(addressFormat); switch (descrTemplate) { case "pkh(@0/**)": return new accounttype_1.p2pkh(psbt, masterFp); case "wpkh(@0/**)": return new accounttype_1.p2wpkh(psbt, masterFp); case "sh(wpkh(@0/**))": return new accounttype_1.p2wpkhWrapped(psbt, masterFp); case "tr(@0/**)": return new accounttype_1.p2tr(psbt, masterFp); default: throw new Error(`Unsupported descriptor template: ${descrTemplate}`); } } function determineAccountTypeFromPurpose(accountPath, psbt, masterFp) { if (accountPath.length < 1) { return null; } const purpose = accountPath[0] - 0x80000000; switch (purpose) { case 44: return new accounttype_1.p2pkh(psbt, masterFp); case 49: return new accounttype_1.p2wpkhWrapped(psbt, masterFp); case 84: return new accounttype_1.p2wpkh(psbt, masterFp); case 86: return new accounttype_1.p2tr(psbt, masterFp); default: return null; } } /** * Determines the account type based on detected script type, account path, or options. */ function determineAccountType(psbt, inputIndex, masterFp, detectedScriptType, accountPath, addressFormat) { if (detectedScriptType) { return createAccountTypeFromScriptType(detectedScriptType, psbt, masterFp); } const witnessUtxoType = determineAccountTypeFromWitnessUtxo(psbt, inputIndex, masterFp); if (witnessUtxoType) { return witnessUtxoType; } if (psbt.getInputRedeemScript(inputIndex)) { return new accounttype_1.p2wpkhWrapped(psbt, masterFp); } if (addressFormat) { return createAccountTypeFromAddressFormat(addressFormat, psbt, masterFp); } const purposeBasedType = determineAccountTypeFromPurpose(accountPath, psbt, masterFp); if (purposeBasedType) { return purposeBasedType; } return new accounttype_1.p2wpkh(psbt, masterFp); } //# sourceMappingURL=accountTypeResolver.js.map