PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-core/src/descriptor/psbt
Просмотр файла: assertSatisfiable.ts
/**
* These are some helpers for testing satisfiability of descriptors in PSBTs.
*
* They are mostly a debugging aid - if an input cannot be satisified, the `finalizePsbt()` method will fail, but
* the error message is pretty vague.
*
* The methods here have the goal of catching certain cases earlier and with a better error message.
*
* The goal is not an exhaustive check, but to catch common mistakes.
*/
import { Descriptor } from '@bitgo/wasm-miniscript';
import * as utxolib from '@bitgo/utxo-lib';
export const FINAL_SEQUENCE = 0xffffffff;
/**
* Get the required locktime for a descriptor.
* @param descriptor
*/
export function getRequiredLocktime(descriptor: Descriptor | unknown): number | undefined {
if (descriptor instanceof Descriptor) {
return getRequiredLocktime(descriptor.node());
}
if (typeof descriptor !== 'object' || descriptor === null) {
return undefined;
}
if ('Wsh' in descriptor) {
return getRequiredLocktime(descriptor.Wsh);
}
if ('Sh' in descriptor) {
return getRequiredLocktime(descriptor.Sh);
}
if ('Ms' in descriptor) {
return getRequiredLocktime(descriptor.Ms);
}
if ('AndV' in descriptor) {
if (!Array.isArray(descriptor.AndV)) {
throw new Error('Expected an array');
}
if (descriptor.AndV.length !== 2) {
throw new Error('Expected exactly two elements');
}
const [a, b] = descriptor.AndV;
return getRequiredLocktime(a) ?? getRequiredLocktime(b);
}
if ('Drop' in descriptor) {
return getRequiredLocktime(descriptor.Drop);
}
if ('Verify' in descriptor) {
return getRequiredLocktime(descriptor.Verify);
}
if ('After' in descriptor && typeof descriptor.After === 'object' && descriptor.After !== null) {
if ('absLockTime' in descriptor.After && typeof descriptor.After.absLockTime === 'number') {
return descriptor.After.absLockTime;
}
}
return undefined;
}
export function assertSatisfiable(psbt: utxolib.Psbt, inputIndex: number, descriptor: Descriptor): void {
// If the descriptor requires a locktime, the input must have a non-final sequence number
const requiredLocktime = getRequiredLocktime(descriptor);
if (requiredLocktime !== undefined) {
const input = psbt.txInputs[inputIndex];
if (input.sequence === FINAL_SEQUENCE) {
throw new Error(`Input ${inputIndex} has a non-final sequence number, but requires a timelock`);
}
if (psbt.locktime !== requiredLocktime) {
throw new Error(`psbt locktime (${psbt.locktime}) does not match required locktime (${requiredLocktime})`);
}
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!