PHP WebShell
Текущая директория: /opt/BitGoJS/modules/abstract-utxo/src/descriptor/builder
Просмотр файла: builder.ts
import { BIP32Interface } from '@bitgo/utxo-lib';
import { Descriptor } from '@bitgo/wasm-miniscript';
type DescriptorWithKeys<TName extends string> = {
name: TName;
keys: BIP32Interface[];
path: string;
};
export type DescriptorBuilder =
| DescriptorWithKeys<'Wsh2Of2'>
| DescriptorWithKeys<'Wsh2Of3'>
/*
* This is a segwit (wrapped or native) 2of3 multisig that also uses a
* relative locktime with an OP_DROP (requiring a miniscript extension).
* It is basically what is used in CoreDao staking transactions.
*/
| (DescriptorWithKeys<'ShWsh2Of3CltvDrop' | 'Wsh2Of3CltvDrop'> & { locktime: number });
function toXPub(k: BIP32Interface | string): string {
if (typeof k === 'string') {
return k;
}
return k.neutered().toBase58();
}
function multi(m: number, n: number, keys: BIP32Interface[] | string[], path: string): string {
if (n < m) {
throw new Error(`Cannot create ${m} of ${n} multisig`);
}
if (keys.length < n) {
throw new Error(`Not enough keys for ${m} of ${n} multisig: keys.length=${keys.length}`);
}
keys = keys.slice(0, n);
return `multi(${m},${keys.map((k) => `${toXPub(k)}/${path}`).join(',')})`;
}
function getDescriptorString(builder: DescriptorBuilder): string {
switch (builder.name) {
case 'Wsh2Of3':
return `wsh(${multi(2, 3, builder.keys, builder.path)})`;
case 'Wsh2Of2':
return `wsh(${multi(2, 2, builder.keys, builder.path)})`;
case 'Wsh2Of3CltvDrop':
return `wsh(and_v(r:after(${builder.locktime}),${multi(2, 3, builder.keys, builder.path)}))`;
case 'ShWsh2Of3CltvDrop':
return `sh(${getDescriptorString({ ...builder, name: 'Wsh2Of3CltvDrop' })})`;
}
throw new Error(`Unknown descriptor template: ${builder}`);
}
export function getDescriptorFromBuilder(builder: DescriptorBuilder): Descriptor {
return Descriptor.fromString(getDescriptorString(builder), 'derivable');
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!