///
///
import type { CreateTransactionArg } from "./createTransaction";
import type { AddressFormat } from "./getWalletPublicKey";
import { AppClient as Client } from "./newops/appClient";
import type { SignPsbtBufferOptions } from "./signPsbt/types";
/**
* @class BtcNew
* @description This class implements the same interface as BtcOld (formerly
* named Btc), but interacts with Bitcoin hardware app version 2.1.0+
* which uses a totally new APDU protocol. This new
* protocol is documented at
* https://github.com/LedgerHQ/app-bitcoin-new/blob/master/doc/bitcoin.md
*
* Since the interface must remain compatible with BtcOld, the methods
* of this class are quite clunky, because it needs to adapt legacy
* input data into the PSBT process. In the future, a new interface should
* be developed that exposes PSBT to the outer world, which would render
* a much cleaner implementation.
*
*/
export default class BtcNew {
private client;
constructor(client: Client);
/**
* This is a new method that allow users to get an xpub at a standard path.
* Standard paths are described at
* https://github.com/LedgerHQ/app-bitcoin-new/blob/master/doc/bitcoin.md#description
*
* This boils down to paths (N=0 for Bitcoin, N=1 for Testnet):
* M/44'/N'/x'/**
* M/48'/N'/x'/y'/**
* M/49'/N'/x'/**
* M/84'/N'/x'/**
* M/86'/N'/x'/**
*
* The method was added because of added security in the hardware app v2+. The
* new hardware app will allow export of any xpub up to and including the
* deepest hardened key of standard derivation paths, whereas the old app
* would allow export of any key.
*
* This caused an issue for callers of this class, who only had
* getWalletPublicKey() to call which means they have to constuct xpub
* themselves:
*
* Suppose a user of this class wants to create an account xpub on a standard
* path, M/44'/0'/Z'. The user must get the parent key fingerprint (see BIP32)
* by requesting the parent key M/44'/0'. The new app won't allow that, because
* it only allows exporting deepest level hardened path. So the options are to
* allow requesting M/44'/0' from the app, or to add a new function
* "getWalletXpub".
*
* We opted for adding a new function, which can greatly simplify client code.
*/
getWalletXpub({ path, xpubVersion, }: {
path: string;
xpubVersion: number;
}): Promise;
/**
* This method returns a public key, a bitcoin address, and and a chaincode
* for a specific derivation path.
*
* Limitation: If the path is not a leaf node of a standard path, the address
* will be the empty string "", see this.getWalletAddress() for details.
*/
getWalletPublicKey(path: string, opts?: {
verify?: boolean;
format?: AddressFormat;
}): Promise<{
publicKey: string;
bitcoinAddress: string;
chainCode: string;
}>;
/**
* Get an address for the specified path.
*
* If display is true, we must get the address from the device, which would require
* us to determine WalletPolicy. This requires two *extra* queries to the device, one
* for the account xpub and one for master key fingerprint.
*
* If display is false we *could* generate the address ourselves, but chose to
* get it from the device to save development time. However, it shouldn't take
* too much time to implement local address generation.
*
* Moreover, if the path is not for a leaf, ie accountPath+/X/Y, there is no
* way to get the address from the device. In this case we have to create it
* ourselves, but we don't at this time, and instead return an empty ("") address.
*/
private getWalletAddress;
/**
* Build and sign a transaction. See Btc.createPaymentTransaction for
* details on how to use this method.
*
* This method will convert the legacy arguments, CreateTransactionArg, into
* a psbt which is finally signed and finalized, and the extracted fully signed
* transaction is returned.
*/
createPaymentTransaction(arg: CreateTransactionArg): Promise;
/**
* Signs a PSBT buffer using the Bitcoin app (new protocol).
*
* - If the PSBT is v2, it is deserialized directly.
* - If the PSBT is v0, it is converted to v2 internally.
* - The account type (legacy, wrapped segwit, native segwit, taproot) is
* inferred from PSBT data when possible, or from the provided options.
*
* Note: All internal inputs (inputs that can be signed by the device) must
* belong to the same account and use the same account type. Mixed input types
* or inputs from different accounts are not supported and will throw an error.
*
* @param psbtBuffer - Raw PSBT buffer (v0 or v2) to be signed.
* @param options - Signing configuration.
* @param options.finalizePsbt - Whether to finalize the PSBT after signing.
* If true, the returned `tx` is a fully signed
* transaction ready for broadcast.
* @param options.accountPath - BIP32 account path (for example,
* "m/84'/0'/0'"). Required. Used to populate missing BIP32 derivation
* information when the PSBT lacks it, and as the signing account path.
* @param options.addressFormat - Explicit address format to use when the
* account type cannot be inferred from the PSBT ("legacy", "p2sh",
* "bech32", or "bech32m").
* @param options.onDeviceSignatureRequested - Callback when signature is about to be requested from device.
* @param options.onDeviceSignatureGranted - Callback when the first signature is granted by device.
* @param options.onDeviceStreaming - Callback to track signing progress with index and total.
* @param options.knownAddressDerivations - Map from scriptPubKey hash (hex) to { pubkey, path }.
* Required. Built by the caller from the wallet's known addresses (receive/change).
* Used to populate missing BIP32 derivations in the PSBT.
*
* @returns An object containing:
* - `psbt`: the serialized PSBT (with signatures; finalized if
* `finalizePsbt` is true).
* - `tx`: the fully signed transaction hex string, only when
* `finalizePsbt` is true; omitted when not finalizing.
*/
signPsbtBuffer(psbtBuffer: Buffer, options: SignPsbtBufferOptions): Promise<{
psbt: Buffer;
tx?: string | undefined;
}>;
/**
* Signs an arbitrary hex-formatted message with the private key at
* the provided derivation path according to the Bitcoin Signature format
* and returns v, r, s.
*/
signMessage({ path, messageHex }: {
path: string;
messageHex: string;
}): Promise<{
v: number;
r: string;
s: string;
}>;
/**
* Calculates an output script along with public key and possible redeemScript
* from a path and accountType. The accountPath must be a prefix of path.
*
* @returns an object with output script (property "script"), redeemScript (if
* wrapped p2wpkh), and pubkey at provided path. The values of these three
* properties depend on the accountType used.
*/
private outputScriptAt;
/**
* Adds relevant data about an input to the psbt. This includes sequence,
* previous txid, output index, spent UTXO, redeem script for wrapped p2wpkh,
* public key and its derivation path.
*/
private setInput;
/**
* This implements the "Signer" role of the BIP370 transaction signing
* process.
*
* It ssks the hardware device to sign the a psbt using the specified wallet
* policy. This method assumes BIP32 derived keys are used for all inputs, see
* comment in-line. The signatures returned from the hardware device is added
* to the appropriate input fields of the PSBT.
*/
private signPsbt;
}
export declare function isPathNormal(path: string): boolean;
//# sourceMappingURL=BtcNew.d.ts.map