@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
45 lines (44 loc) • 1.86 kB
JavaScript
import { opcodes, script, toXOnly } from '@btc-vision/bitcoin';
export class MultiSignGenerator {
static compile(vaultPublicKeys, minimumSignatures = 0, internal) {
if (minimumSignatures < 2) {
throw new Error('Minimum signatures must be greater than 1');
}
if (vaultPublicKeys.length < minimumSignatures) {
throw new Error('The amount of public keys is lower than the minimum required');
}
if (minimumSignatures > MultiSignGenerator.MAXIMUM_SUPPORTED_SIGNATURE) {
throw new Error(`The maximum amount of signatures is ${MultiSignGenerator.MAXIMUM_SUPPORTED_SIGNATURE}`);
}
const minimumRequired = Buffer.alloc(1);
minimumRequired.writeUInt8(minimumSignatures);
vaultPublicKeys = vaultPublicKeys.filter((buf, index, self) => index === self.findIndex((otherBuf) => buf.equals(otherBuf)));
vaultPublicKeys = vaultPublicKeys.sort((a, b) => a.compare(b));
let included = false;
const data = vaultPublicKeys.map((key) => {
const newKey = toXOnly(key);
if (internal && !included)
included = internal.equals(newKey);
return newKey;
});
if (internal && !included)
data.push(internal);
const compiledData = [
opcodes.OP_0,
...data.flatMap((key) => [
key,
opcodes.OP_CHECKSIGADD,
]),
minimumRequired,
opcodes.OP_NUMEQUAL,
];
const asm = compiledData.flat();
const compiled = script.compile(asm);
const decompiled = script.decompile(compiled);
if (!decompiled) {
throw new Error('Failed to decompile script.');
}
return compiled;
}
}
MultiSignGenerator.MAXIMUM_SUPPORTED_SIGNATURE = 255;