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