Skip to content

Commit 018dcf5

Browse files
feat(utxo-bin): parse script as miniscript
Issue: BTC-1533
1 parent 829842a commit 018dcf5

File tree

4 files changed

+18
-0
lines changed

4 files changed

+18
-0
lines changed

modules/utxo-bin/src/ScriptParser.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as utxolib from '@bitgo/utxo-lib';
2+
import { Miniscript } from '@bitgo/wasm-miniscript';
23

34
import { Parser, ParserNode } from './Parser';
45
import { parseUnknown } from './parseUnknown';
@@ -21,6 +22,18 @@ function parsePaymentWithType(script: Buffer, type: PaymentType, network?: utxol
2122
}
2223
}
2324

25+
function asMiniscript(script: Buffer): Miniscript | undefined {
26+
const contexts = ['tap', 'segwitv0', 'legacy'] as const;
27+
for (const ctx of contexts) {
28+
try {
29+
return Miniscript.fromBitcoinScript(script, ctx);
30+
} catch (e) {
31+
continue;
32+
}
33+
}
34+
throw new Error('failed to parse as miniscript');
35+
}
36+
2437
export class ScriptParser extends Parser {
2538
network?: utxolib.Network;
2639
constructor({ network }: { network?: utxolib.Network } = {}) {
@@ -76,6 +89,7 @@ export class ScriptParser extends Parser {
7689
const classification = ScriptParser.classify(script, undefined);
7790
const decompiled = utxolib.script.decompile(script);
7891
return this.node('script', `length ${script.length} bytes`, [
92+
this.nodeCatchError('miniscript', () => asMiniscript(script)?.toString()),
7993
this.node('classification', undefined, [
8094
this.node('input', classification.input),
8195
this.node('output', classification.output),

modules/utxo-bin/test/fixtures/formatScript/p2sh.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
inputScripts
22
└─┬ redeemScript
33
└─┬ script: length 105 bytes
4+
├── miniscript: multi(2,03f6f40764bd5d63f200a2778883acf75e96f15095c998263c087270d0c97e7e7f,035ffb7abc70159e0469f4b989a6d5e1785a2904169ff050b2f468fe5d3d5dbbf2,03e1524d7f6fc57ab3eacbb659b787106780a475d1db483952c2310b7e9a38975b)
45
├─┬ classification
56
│ ├── input: nonstandard
67
│ ├── output: multisig

modules/utxo-bin/test/fixtures/formatScript/p2shP2wsh.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
inputScripts
22
├─┬ redeemScript
33
│ └─┬ script: length 34 bytes
4+
│ ├── error: Error: failed to parse as miniscript
45
│ ├─┬ classification
56
│ │ ├── input: nonstandard
67
│ │ ├── output: witnessscripthash
@@ -20,6 +21,7 @@ inputScripts
2021
│ └── witness: undefined
2122
└─┬ witnessScript
2223
└─┬ script: length 105 bytes
24+
├── miniscript: multi(2,03393e3c784cf42a09c32b33b3ee2879ab092fd381c2187deafe6b69e0dc5bee4e,02089e4bad05bf0f0a67f5055c6518d5ae05de86db8081e9d5d2e654c710280507,03c154061b8a77902eeebf5c39429515b572161af576610f66f0d4269940f0f81b)
2325
├─┬ classification
2426
│ ├── input: nonstandard
2527
│ ├── output: multisig

modules/utxo-bin/test/fixtures/formatScript/p2wsh.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
inputScripts
22
└─┬ witnessScript
33
└─┬ script: length 105 bytes
4+
├── miniscript: multi(2,03199dc3912467b37ff890cc1740c8ef4ac7a50bf3741d99590e905ca3a79c7670,02396d5d0c79d779f9cf019cea9e81d2576bad476ea87ed634416205605a55ce8f,0286de50435e3680740715bfa3f7d41c9620d80d93b2c02672f53efa0c6e68d182)
45
├─┬ classification
56
│ ├── input: nonstandard
67
│ ├── output: multisig

0 commit comments

Comments
 (0)