///
import { Output } from './transaction';
export interface UnblindOutputResult {
value: string;
valueBlindingFactor: Buffer;
asset: Buffer;
assetBlindingFactor: Buffer;
}
export interface RangeProofInfoResult {
ctExp: number;
ctBits: number;
minValue: number;
maxValue: number;
}
type Ecdh = (pubkey: Buffer, scalar: Buffer) => Buffer;
interface Ec {
prvkeyNegate: (key: Buffer) => Buffer;
prvkeyTweakAdd: (key: Buffer, tweak: Buffer) => Buffer;
prvkeyTweakMul: (key: Buffer, tweak: Buffer) => Buffer;
}
interface Generator {
generate: (seed: Buffer) => Buffer;
generateBlinded(key: Buffer, blind: Buffer): Buffer;
parse(input: Buffer): Buffer;
serialize(generator: Buffer): Buffer;
}
interface Pedersen {
commit(blindFactor: Buffer, value: string, generator: Buffer): Buffer;
commitSerialize(commitment: Buffer): Buffer;
commitParse(input: Buffer): Buffer;
blindSum(blinds: Array, nneg?: number): Buffer;
verifySum(commits: Array, negativeCommits: Array): boolean;
blindGeneratorBlindSum(values: Array, nInputs: number, blindGenerators: Array, blindFactors: Array): Buffer;
}
interface RangeProof {
info(proof: Buffer): {
exp: number;
mantissa: string;
minValue: string;
maxValue: string;
};
verify(commit: Buffer, proof: Buffer, generator: Buffer, extraCommit?: Buffer): boolean;
sign(commit: Buffer, blind: Buffer, nonce: Buffer, value: string, generator: Buffer, minValue?: string, base10Exp?: number, minBits?: number, message?: Buffer, extraCommit?: Buffer): Buffer;
rewind(commit: Buffer, proof: Buffer, nonce: Buffer, generator: Buffer, extraCommit?: Buffer): {
value: string;
minValue: string;
maxValue: string;
blindFactor: Buffer;
message: Buffer;
};
}
interface SurjectionProof {
serialize: (proof: {
nInputs: number;
usedInputs: Buffer;
data: Buffer;
}) => Buffer;
parse: (proof: Buffer) => {
nInputs: number;
usedInputs: Buffer;
data: Buffer;
};
initialize: (inputTags: Array, inputTagsToUse: number, outputTag: Buffer, maxIterations: number, seed: Buffer) => {
proof: {
nInputs: number;
usedInputs: Buffer;
data: Buffer;
};
inputIndex: number;
};
generate: (proof: {
nInputs: number;
usedInputs: Buffer;
data: Buffer;
}, inputTags: Array, outputTag: Buffer, inputIndex: number, inputBlindingKey: Buffer, outputBlindingKey: Buffer) => {
nInputs: number;
usedInputs: Buffer;
data: Buffer;
};
verify: (proof: {
nInputs: number;
usedInputs: Buffer;
data: Buffer;
}, inputTags: Array, outputTag: Buffer) => boolean;
}
export interface ZKPInterface {
ecdh: Ecdh;
ec: Ec;
surjectionproof: SurjectionProof;
rangeproof: RangeProof;
pedersen: Pedersen;
generator: Generator;
}
export declare class Confidential {
private zkp;
constructor(zkp: ZKPInterface);
nonceHash(pubkey: Buffer, privkey: Buffer): Buffer;
valueBlindingFactor(inValues: string[], outValues: string[], inGenerators: Buffer[], outGenerators: Buffer[], inFactors: Buffer[], outFactors: Buffer[]): Buffer;
valueCommitment(value: string, gen: Buffer, factor: Buffer): Buffer;
assetCommitment(asset: Buffer, factor: Buffer): Buffer;
unblindOutputWithKey(out: Output, blindingPrivKey: Buffer): UnblindOutputResult;
unblindOutputWithNonce(out: Output, nonce: Buffer): UnblindOutputResult;
rangeProofInfo(proof: Buffer): RangeProofInfoResult;
/**
* nonceHash from blinding key + ephemeral key and then rangeProof computation
*/
rangeProofWithNonceHash(value: string, blindingPubkey: Buffer, ephemeralPrivkey: Buffer, asset: Buffer, assetBlindingFactor: Buffer, valueBlindFactor: Buffer, valueCommit: Buffer, scriptPubkey: Buffer, minValue?: string, exp?: number, minBits?: number): Buffer;
rangeProofVerify(valueCommit: Buffer, assetCommit: Buffer, proof: Buffer, script?: Buffer): boolean;
/**
* rangeProof computation without nonceHash step.
*/
rangeProof(value: string, nonce: Buffer, asset: Buffer, assetBlindingFactor: Buffer, valueBlindFactor: Buffer, valueCommit: Buffer, scriptPubkey: Buffer, minValue?: string, exp?: number, minBits?: number): Buffer;
surjectionProof(outputAsset: Buffer, outputAssetBlindingFactor: Buffer, inputAssets: Buffer[], inputAssetBlindingFactors: Buffer[], seed: Buffer): Buffer;
surjectionProofVerify(inAssets: Buffer[], inAssetBlinders: Buffer[], outAsset: Buffer, outAssetBlinder: Buffer, proof: Buffer): boolean;
blindValueProof(value: string, valueCommit: Buffer, assetCommit: Buffer, valueBlinder: Buffer, nonce: Buffer): Buffer;
blindAssetProof(asset: Buffer, assetCommit: Buffer, assetBlinder: Buffer): Buffer;
assetBlindProofVerify(asset: Buffer, assetCommit: Buffer, proof: Buffer): boolean;
}
export declare function confidentialValueToSatoshi(value: Buffer): number;
export declare function satoshiToConfidentialValue(amount: number): Buffer;
export {};