@ledgerhq/hw-app-btc
Version:
Ledger Hardware Wallet Bitcoin Application API
74 lines (67 loc) • 2.08 kB
text/typescript
import { PsbtV2 } from "@ledgerhq/psbtv2";
import type { AccountType } from "../newops/accounttype";
import { createKey, WalletPolicy } from "../newops/policy";
import { extract } from "../newops/psbtExtractor";
import { finalize } from "../newops/psbtFinalizer";
/**
* Creates a WalletPolicy for the given account.
*/
export function createWalletPolicy(
masterFp: Buffer,
accountPath: number[],
accountXpub: string,
accountType: AccountType,
): WalletPolicy {
const key = createKey(masterFp, accountPath, accountXpub);
return new WalletPolicy(accountType.getDescriptorTemplate(), key);
}
/**
* Creates a progress callback that notifies onDeviceStreaming and onDeviceSignatureGranted.
*/
export function createProgressCallback(
inputCount: number,
options: {
onDeviceSignatureRequested?: () => void;
onDeviceSignatureGranted?: () => void;
onDeviceStreaming?: (arg: { progress: number; total: number; index: number }) => void;
},
): () => void {
let notifyCount = 0;
let firstSigned = false;
const progress = () => {
if (!options.onDeviceStreaming || inputCount <= 0) return;
options.onDeviceStreaming({
total: 2 * inputCount,
index: notifyCount,
progress: ++notifyCount / (2 * inputCount),
});
};
if (options.onDeviceSignatureRequested) options.onDeviceSignatureRequested();
return () => {
if (!firstSigned) {
firstSigned = true;
if (options.onDeviceSignatureGranted) options.onDeviceSignatureGranted();
}
progress();
};
}
/**
* Optionally finalizes the PSBT and, when finalizing, extracts the transaction.
* When not finalizing, only the serialized PSBT (with partial signatures) is
* returned; extraction is not performed because FINAL_SCRIPTWITNESS is not set.
*/
export function finalizePsbtAndExtract(
psbt: PsbtV2,
shouldFinalize: boolean,
): { psbt: Buffer; tx?: string } {
if (shouldFinalize) {
finalize(psbt);
return {
psbt: psbt.serialize(),
tx: extract(psbt).toString("hex"),
};
}
return {
psbt: psbt.serialize(),
};
}