UNPKG

@btc-vision/transaction

Version:

OPNet transaction library allows you to create and sign transactions for the OPNet network.

63 lines (62 loc) 2.67 kB
import { networks } from '@btc-vision/bitcoin'; import { BinaryWriter } from '../../buffer/BinaryWriter.js'; import { Features } from '../Features.js'; import { Generator } from '../Generator.js'; export class P2WDAGenerator extends Generator { constructor(senderPubKey, contractSaltPubKey, network = networks.bitcoin) { super(senderPubKey, contractSaltPubKey, network); } static validateWitnessSize(dataSize, maxWitnessFields = 10, maxBytesPerWitness = 80) { const signatureSize = 64; const compressionRatio = 0.7; const totalSize = dataSize + signatureSize; const compressedSize = Math.ceil(totalSize * compressionRatio); const requiredFields = Math.ceil(compressedSize / maxBytesPerWitness); return requiredFields <= maxWitnessFields; } compile(calldata, contractSecret, challenge, maxPriority, features = []) { if (!this.contractSaltPubKey) { throw new Error('Contract salt public key not set'); } if (contractSecret.length !== 32) { throw new Error('Contract secret must be exactly 32 bytes'); } const writer = new BinaryWriter(); writer.writeU8(P2WDAGenerator.P2WDA_VERSION); writer.writeBytes(this.getHeader(maxPriority, features.map((f) => f.opcode))); writer.writeBytes(contractSecret); writer.writeBytes(challenge.publicKey.originalPublicKeyBuffer()); writer.writeBytes(challenge.solution); writer.writeU32(calldata.length); writer.writeBytes(calldata); this.writeFeatures(writer, features); return Buffer.from(writer.getBuffer()); } getHeader(maxPriority, features = []) { return super.getHeader(maxPriority, features); } writeFeatures(writer, features) { writer.writeU16(features.length); for (const feature of features) { writer.writeU8(feature.opcode); const encodedData = this.encodeFeatureData(feature); writer.writeU32(encodedData.length); writer.writeBytes(encodedData); } } encodeFeatureData(feature) { switch (feature.opcode) { case Features.ACCESS_LIST: { const chunks = this.encodeFeature(feature); return Buffer.concat(chunks.flat()); } case Features.EPOCH_SUBMISSION: { const chunks = this.encodeFeature(feature); return Buffer.concat(chunks.flat()); } default: throw new Error(`Unknown feature type: ${feature.opcode}`); } } } P2WDAGenerator.P2WDA_VERSION = 0x01;