UNPKG

@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
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;