import { PsbtV2 } from "@ledgerhq/psbtv2";
import { DefaultDescriptorTemplate } from "./policy";
/**
 * Computes the taproot output key (BIP341) from an internal x-only pubkey.
 * Standalone so derivation population can build a hash-based lookup without AccountType.
 */
export declare function computeTaprootOutputKey(internalXonlyPubkey: Buffer): Buffer;
export type SpendingCondition = {
    scriptPubKey: Buffer;
    redeemScript?: Buffer;
};
export type SpentOutput = {
    cond: SpendingCondition;
    amount: Buffer;
};
/**
 * Encapsulates differences between account types, for example p2wpkh,
 * p2wpkhWrapped, p2tr.
 */
export interface AccountType {
    /**
     * Generates a scriptPubKey (output script) from a list of public keys. If a
     * p2sh redeemScript or a p2wsh witnessScript is needed it will also be set on
     * the returned SpendingCondition.
     *
     * The pubkeys are expected to be 33 byte ecdsa compressed pubkeys.
     */
    spendingCondition(pubkeys: Buffer[]): SpendingCondition;
    /**
     * Populates the psbt with account type-specific data for an input.
     * @param i The index of the input map to populate
     * @param inputTx The full transaction containing the spent output. This may
     * be omitted for taproot.
     * @param spentOutput The amount and spending condition of the spent output
     * @param pubkeys The 33 byte ecdsa compressed public keys involved in the input
     * @param pathElems The paths corresponding to the pubkeys, in same order.
     */
    setInput(i: number, inputTx: Buffer | undefined, spentOutput: SpentOutput, pubkeys: Buffer[], pathElems: number[][]): void;
    /**
     * Populates the psbt with account type-specific data for an output. This is typically
     * done for change outputs and other outputs that goes to the same account as
     * being spent from.
     * @param i The index of the output map to populate
     * @param cond The spending condition for this output
     * @param pubkeys The 33 byte ecdsa compressed public keys involved in this output
     * @param paths The paths corresponding to the pubkeys, in same order.
     */
    setOwnOutput(i: number, cond: SpendingCondition, pubkeys: Buffer[], paths: number[][]): void;
    /**
     * Returns the descriptor template for this account type. Currently only
     * DefaultDescriptorTemplates are allowed, but that might be changed in the
     * future. See class WalletPolicy for more information on descriptor
     * templates.
     */
    getDescriptorTemplate(): DefaultDescriptorTemplate;
}
interface BaseAccount extends AccountType {
}
declare abstract class BaseAccount implements AccountType {
    protected psbt: PsbtV2;
    protected masterFp: Buffer;
    constructor(psbt: PsbtV2, masterFp: Buffer);
}
/**
 * Superclass for single signature accounts. This will make sure that the pubkey
 * arrays and path arrays in the method arguments contains exactly one element
 * and calls an abstract method to do the actual work.
 */
declare abstract class SingleKeyAccount extends BaseAccount {
    spendingCondition(pubkeys: Buffer[]): SpendingCondition;
    protected abstract singleKeyCondition(pubkey: Buffer): SpendingCondition;
    setInput(i: number, inputTx: Buffer | undefined, spentOutput: SpentOutput, pubkeys: Buffer[], pathElems: number[][]): void;
    protected abstract setSingleKeyInput(i: number, inputTx: Buffer | undefined, spentOutput: SpentOutput, pubkey: Buffer, path: number[]): any;
    setOwnOutput(i: number, cond: SpendingCondition, pubkeys: Buffer[], paths: number[][]): void;
    protected abstract setSingleKeyOutput(i: number, cond: SpendingCondition, pubkey: Buffer, path: number[]): any;
}
export declare class p2pkh extends SingleKeyAccount {
    singleKeyCondition(pubkey: Buffer): SpendingCondition;
    setSingleKeyInput(i: number, inputTx: Buffer | undefined, _spentOutput: SpentOutput, pubkey: Buffer, path: number[]): void;
    setSingleKeyOutput(i: number, _cond: SpendingCondition, pubkey: Buffer, path: number[]): void;
    getDescriptorTemplate(): DefaultDescriptorTemplate;
}
export declare class p2tr extends SingleKeyAccount {
    singleKeyCondition(pubkey: Buffer): SpendingCondition;
    setSingleKeyInput(i: number, _inputTx: Buffer | undefined, spentOutput: SpentOutput, pubkey: Buffer, path: number[]): void;
    setSingleKeyOutput(i: number, _cond: SpendingCondition, pubkey: Buffer, path: number[]): void;
    getDescriptorTemplate(): DefaultDescriptorTemplate;
    /**
     * Calculates a taproot output key from an internal key (BIP341).
     *
     * @param internalPubkey A 32 byte x-only taproot internal key
     * @returns The output key
     */
    getTaprootOutputKey(internalPubkey: Buffer): Buffer;
}
export declare class p2wpkhWrapped extends SingleKeyAccount {
    singleKeyCondition(pubkey: Buffer): SpendingCondition;
    setSingleKeyInput(i: number, inputTx: Buffer | undefined, spentOutput: SpentOutput, pubkey: Buffer, path: number[]): void;
    setSingleKeyOutput(i: number, cond: SpendingCondition, pubkey: Buffer, path: number[]): void;
    getDescriptorTemplate(): DefaultDescriptorTemplate;
    private createRedeemScript;
}
export declare class p2wpkh extends SingleKeyAccount {
    singleKeyCondition(pubkey: Buffer): SpendingCondition;
    setSingleKeyInput(i: number, inputTx: Buffer | undefined, spentOutput: SpentOutput, pubkey: Buffer, path: number[]): void;
    setSingleKeyOutput(i: number, cond: SpendingCondition, pubkey: Buffer, path: number[]): void;
    getDescriptorTemplate(): DefaultDescriptorTemplate;
}
export {};
//# sourceMappingURL=accounttype.d.ts.map