@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
68 lines (67 loc) • 3.08 kB
JavaScript
import { crypto as bitCrypto, networks, payments, toXOnly, } from '@btc-vision/bitcoin';
import { DeploymentGenerator } from '../generators/builders/DeploymentGenerator.js';
import { TransactionBuilder } from '../transaction/builders/TransactionBuilder.js';
export class TapscriptVerificator {
static getContractAddress(params) {
const network = params.network || networks.bitcoin;
const scriptBuilder = new DeploymentGenerator(params.deployerPubKey, toXOnly(params.contractSaltPubKey), network);
const compiledTargetScript = scriptBuilder.compile(params.bytecode, params.originalSalt, params.preimage, params.priorityFee, params.calldata);
const scriptTree = [
{
output: compiledTargetScript,
version: TapscriptVerificator.TAP_SCRIPT_VERSION,
},
{
output: TransactionBuilder.LOCK_LEAF_SCRIPT,
version: TapscriptVerificator.TAP_SCRIPT_VERSION,
},
];
return TapscriptVerificator.generateAddressFromScript(params, scriptTree);
}
static verifyControlBlock(params, controlBlock) {
const network = params.network || networks.bitcoin;
const scriptBuilder = new DeploymentGenerator(params.deployerPubKey, toXOnly(params.contractSaltPubKey), network);
const compiledTargetScript = scriptBuilder.compile(params.bytecode, params.originalSalt, params.preimage, params.priorityFee, params.calldata);
const scriptTree = [
{
output: compiledTargetScript,
version: TapscriptVerificator.TAP_SCRIPT_VERSION,
},
{
output: TransactionBuilder.LOCK_LEAF_SCRIPT,
version: TapscriptVerificator.TAP_SCRIPT_VERSION,
},
];
const tapData = payments.p2tr({
internalPubkey: toXOnly(params.deployerPubKey),
network: network,
scriptTree: scriptTree,
redeem: {
output: compiledTargetScript,
redeemVersion: TapscriptVerificator.TAP_SCRIPT_VERSION,
},
});
const witness = tapData.witness;
if (!witness || witness.length === 0) {
return false;
}
const requiredControlBlock = witness[witness.length - 1];
return requiredControlBlock.equals(controlBlock);
}
static getContractSeed(deployerPubKey, bytecode, saltHash) {
const sha256OfBytecode = bitCrypto.hash256(bytecode);
const buf = Buffer.concat([deployerPubKey, saltHash, sha256OfBytecode]);
return bitCrypto.hash256(buf);
}
static generateAddressFromScript(params, scriptTree) {
const network = params.network || networks.bitcoin;
const transactionData = {
internalPubkey: toXOnly(params.deployerPubKey),
network: network,
scriptTree: scriptTree,
};
const tx = payments.p2tr(transactionData);
return tx.address;
}
}
TapscriptVerificator.TAP_SCRIPT_VERSION = 192;