import { Bytes } from "@scure/btc-signer/utils";
export type RelativeTimelock = {
    value: bigint;
    type: "seconds" | "blocks";
};
export declare enum TapscriptType {
    Multisig = "multisig",
    CSVMultisig = "csv-multisig",
    ConditionCSVMultisig = "condition-csv-multisig",
    ConditionMultisig = "condition-multisig",
    CLTVMultisig = "cltv-multisig"
}
export interface ArkTapscript<T extends TapscriptType, Params, SizeArgs = never> {
    type: T;
    params: Params;
    script: Uint8Array;
    witnessSize(args: SizeArgs): number;
}
export declare function decodeTapscript(script: Uint8Array): ArkTapscript<TapscriptType, any, any | undefined>;
/**
 * Implements a multi-signature script that requires a threshold of signatures
 * from the specified pubkeys.
 */
export declare namespace MultisigTapscript {
    type Type = ArkTapscript<TapscriptType.Multisig, Params>;
    enum MultisigType {
        CHECKSIG = 0,
        CHECKSIGADD = 1
    }
    type Params = {
        pubkeys: Bytes[];
        type?: MultisigType;
    };
    function encode(params: Params): Type;
    function decode(script: Uint8Array): Type;
    function is(tapscript: ArkTapscript<any, any>): tapscript is Type;
}
/**
 * Implements a relative timelock script that requires all specified pubkeys to sign
 * after the relative timelock has expired. The timelock can be specified in blocks or seconds.
 *
 * This is the standard exit closure and it is also used for the sweep closure in vtxo trees.
 */
export declare namespace CSVMultisigTapscript {
    type Type = ArkTapscript<TapscriptType.CSVMultisig, Params>;
    type Params = {
        timelock: RelativeTimelock;
    } & MultisigTapscript.Params;
    function encode(params: Params): Type;
    function decode(script: Uint8Array): Type;
    function is(tapscript: ArkTapscript<any, any>): tapscript is Type;
}
/**
 * Combines a condition script with an exit closure. The resulting script requires
 * the condition to be met, followed by the standard exit closure requirements
 * (timelock and signatures).
 */
export declare namespace ConditionCSVMultisigTapscript {
    type Type = ArkTapscript<TapscriptType.ConditionCSVMultisig, Params>;
    type Params = {
        conditionScript: Bytes;
    } & CSVMultisigTapscript.Params;
    function encode(params: Params): Type;
    function decode(script: Uint8Array): Type;
    function is(tapscript: ArkTapscript<any, any>): tapscript is Type;
}
/**
 * Combines a condition script with a forfeit closure. The resulting script requires
 * the condition to be met, followed by the standard forfeit closure requirements
 * (multi-signature).
 */
export declare namespace ConditionMultisigTapscript {
    type Type = ArkTapscript<TapscriptType.ConditionMultisig, Params>;
    type Params = {
        conditionScript: Bytes;
    } & MultisigTapscript.Params;
    function encode(params: Params): Type;
    function decode(script: Uint8Array): Type;
    function is(tapscript: ArkTapscript<any, any>): tapscript is Type;
}
/**
 * Implements an absolute timelock (CLTV) script combined with a forfeit closure.
 * The script requires waiting until a specific block height/timestamp before the
 * forfeit closure conditions can be met.
 */
export declare namespace CLTVMultisigTapscript {
    type Type = ArkTapscript<TapscriptType.CLTVMultisig, Params>;
    type Params = {
        absoluteTimelock: bigint;
    } & MultisigTapscript.Params;
    function encode(params: Params): Type;
    function decode(script: Uint8Array): Type;
    function is(tapscript: ArkTapscript<any, any>): tapscript is Type;
}
