@ledgerhq/hw-app-btc
Version:
Ledger Hardware Wallet Bitcoin Application API
104 lines • 4.06 kB
JavaScript
;
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