@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
61 lines (52 loc) • 1.78 kB
text/typescript
import { backend } from '../ecc/backend.js';
import { type Bytes32, type Network, type PrivateKey, type Signer, tapTweakHash, toXOnly, } from '@btc-vision/bitcoin';
import { type UniversalSigner } from '@btc-vision/ecpair';
import { EcKeyPair } from '../keypair/EcKeyPair.js';
/**
* Tweak settings
*/
export interface TweakSettings {
/**
* The network to use
*/
readonly network?: Network;
/**
* The tweak hash to use
*/
tweakHash?: Bytes32;
}
/**
* Type guard to check if a Signer is a UniversalSigner (has privateKey).
*/
export function isUniversalSigner(signer: Signer): signer is UniversalSigner {
return 'privateKey' in signer && signer.privateKey != null;
}
/**
* Class for tweaking signers
* @class TweakedSigner
*/
export class TweakedSigner {
/**
* Tweak a signer
* @param {UniversalSigner} signer - The signer to tweak (must have privateKey)
* @param {TweakSettings} opts - The tweak settings
* @returns {UniversalSigner} - The tweaked signer
*/
public static tweakSigner(signer: UniversalSigner, opts: TweakSettings = {}): UniversalSigner {
let privateKey: PrivateKey | undefined = signer.privateKey;
if (!privateKey) {
throw new Error('Private key is required for tweaking signer!');
}
if (signer.publicKey[0] === 3) {
privateKey = backend.privateNegate(privateKey);
}
const tweakedPrivateKey = backend.privateAdd(
privateKey,
tapTweakHash(toXOnly(signer.publicKey), opts.tweakHash),
);
if (!tweakedPrivateKey) {
throw new Error('Invalid tweaked private key!');
}
return EcKeyPair.fromPrivateKey(tweakedPrivateKey, opts.network);
}
}