Skip to content

Commit 093ae6b

Browse files
committed
chore: shim for loading wasm miniscript async
Ticket: BTC-0000
1 parent 8f1e2e3 commit 093ae6b

File tree

40 files changed

+202
-92
lines changed

40 files changed

+202
-92
lines changed

modules/abstract-utxo/src/descriptor/NamedDescriptor.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as t from 'io-ts';
2-
import { Descriptor, DescriptorPkType } from '@bitgo/wasm-miniscript';
3-
import { BIP32Interface, networks } from '@bitgo/utxo-lib';
2+
import type { Descriptor, DescriptorPkType } from '@bitgo/wasm-miniscript';
3+
import { BIP32Interface, miniscript, networks } from '@bitgo/utxo-lib';
44
import { signMessage, verifyMessage } from '@bitgo/sdk-core';
55

66
export const NamedDescriptor = t.intersection(
@@ -30,20 +30,20 @@ export function createNamedDescriptorWithSignature(
3030
signingKey: BIP32Interface
3131
): NamedDescriptor {
3232
if (typeof descriptor === 'string') {
33-
descriptor = Descriptor.fromString(descriptor, 'derivable');
33+
descriptor = miniscript.Descriptor.fromString(descriptor, 'derivable');
3434
}
3535
const value = descriptor.toString();
3636
const signature = signMessage(value, signingKey, networks.bitcoin).toString('hex');
3737
return { name, value, signatures: [signature] };
3838
}
3939

4040
export function toNamedDescriptorNative(e: NamedDescriptor, pkType: DescriptorPkType): NamedDescriptorNative {
41-
return { ...e, value: Descriptor.fromString(e.value, pkType) };
41+
return { ...e, value: miniscript.Descriptor.fromString(e.value, pkType) };
4242
}
4343

4444
export function hasValidSignature(descriptor: string | Descriptor, key: BIP32Interface, signatures: string[]): boolean {
4545
if (typeof descriptor === 'string') {
46-
descriptor = Descriptor.fromString(descriptor, 'derivable');
46+
descriptor = miniscript.Descriptor.fromString(descriptor, 'derivable');
4747
}
4848

4949
const message = descriptor.toString();

modules/abstract-utxo/src/descriptor/assertDescriptorWalletAddress.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import assert from 'assert';
22

33
import * as utxolib from '@bitgo/utxo-lib';
4-
import { Descriptor } from '@bitgo/wasm-miniscript';
4+
import type { Descriptor } from '@bitgo/wasm-miniscript';
55
import { DescriptorMap } from '@bitgo/utxo-core/descriptor';
66

77
import { UtxoCoinSpecific, VerifyAddressOptions } from '../abstractUtxoCoin';

modules/abstract-utxo/src/descriptor/builder/builder.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { BIP32Interface } from '@bitgo/utxo-lib';
2-
import { Descriptor } from '@bitgo/wasm-miniscript';
1+
import { BIP32Interface, miniscript } from '@bitgo/utxo-lib';
2+
import type { Descriptor } from '@bitgo/wasm-miniscript';
33

44
type DescriptorWithKeys<TName extends string> = {
55
name: TName;
@@ -50,5 +50,5 @@ function getDescriptorString(builder: DescriptorBuilder): string {
5050
}
5151

5252
export function getDescriptorFromBuilder(builder: DescriptorBuilder): Descriptor {
53-
return Descriptor.fromString(getDescriptorString(builder), 'derivable');
53+
return miniscript.Descriptor.fromString(getDescriptorString(builder), 'derivable');
5454
}

modules/abstract-utxo/src/descriptor/builder/parse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BIP32Interface } from '@bitgo/utxo-lib';
22
import * as utxolib from '@bitgo/utxo-lib';
3-
import { Descriptor } from '@bitgo/wasm-miniscript';
3+
import type { Descriptor } from '@bitgo/wasm-miniscript';
44

55
import { DescriptorBuilder, getDescriptorFromBuilder } from './builder';
66

modules/abstract-utxo/src/descriptor/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
export { Miniscript, Descriptor } from '@bitgo/wasm-miniscript';
21
export { DescriptorMap } from '@bitgo/utxo-core/descriptor';
32
export { assertDescriptorWalletAddress } from './assertDescriptorWalletAddress';
43
export {

modules/abstract-utxo/test/transaction/descriptor/parse.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import assert from 'assert';
22

33
import * as utxolib from '@bitgo/utxo-lib';
4-
import { Descriptor } from '@bitgo/wasm-miniscript';
4+
import * as WasmMiniscript from '@bitgo/wasm-miniscript';
55
import {
66
getDefaultXPubs,
77
getDescriptor,
@@ -23,6 +23,8 @@ import { BaseOutput } from '../../../src';
2323

2424
import { getFixtureRoot } from './fixtures.utils';
2525

26+
utxolib.initializeMiniscript(WasmMiniscript);
27+
2628
const { assertEqualFixture } = getFixtureRoot(__dirname + '/fixtures');
2729

2830
type OutputWithValue<T = number | bigint | string> = {
@@ -58,7 +60,7 @@ describe('parse', function () {
5860
const descriptorOther = getDescriptor('Wsh2Of3', getDefaultXPubs('b'));
5961
const psbt = mockPsbtDefault({ descriptorSelf, descriptorOther });
6062

61-
function recipient(descriptor: Descriptor, index: number, value = 1000) {
63+
function recipient(descriptor: WasmMiniscript.Descriptor, index: number, value = 1000) {
6264
return { value, address: createAddressFromDescriptor(descriptor, index, utxolib.networks.bitcoin) };
6365
}
6466

modules/abstract-utxo/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"module": "node16",
1010
"typeRoots": ["../../types", "./node_modules/@types", "../../node_modules/@types"]
1111
},
12-
"include": ["src/**/*", "test/**/*"],
12+
"include": ["src/**/*", "test/**/*", "../utxo-lib/src/shim"],
1313
"exclude": ["node_modules"],
1414
"references": [
1515
{

modules/bitgo/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
"@bitgo/statics": "^54.5.0",
128128
"@bitgo/unspents": "^0.48.3",
129129
"@bitgo/utxo-lib": "^11.6.1",
130+
"@bitgo/wasm-miniscript": "2.0.0-beta.7",
130131
"@types/superagent": "^4.1.3",
131132
"bignumber.js": "^9.1.1",
132133
"fs-extra": "^9.1.0",

modules/bitgo/test/v2/unit/coins/utxo/descriptorAddress.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ import { TestBitGo } from '@bitgo/sdk-test';
44
import { AbstractUtxoCoin, descriptor as utxod } from '@bitgo/abstract-utxo';
55
import * as utxolib from '@bitgo/utxo-lib';
66
import { IWallet, WalletCoinSpecific } from '@bitgo/sdk-core';
7+
import * as WasmMiniscript from '@bitgo/wasm-miniscript';
78

89
import { BitGo } from '../../../../../src';
910

11+
utxolib.initializeMiniscript(WasmMiniscript);
12+
1013
export function getDescriptorAddress(d: string, index: number, network: utxolib.Network): string {
1114
const derivedScript = Buffer.from(
12-
utxod.Descriptor.fromString(d, 'derivable').atDerivationIndex(index).scriptPubkey()
15+
utxolib.miniscript.Descriptor.fromString(d, 'derivable').atDerivationIndex(index).scriptPubkey()
1316
);
1417
return utxolib.address.fromOutputScript(derivedScript, network);
1518
}
@@ -20,7 +23,7 @@ describe('descriptor wallets', function () {
2023
const xpubs = utxolib.testutil.getKeyTriple('setec astronomy').map((k) => k.neutered().toBase58());
2124

2225
function withChecksum(descriptor: string): string {
23-
return utxod.Descriptor.fromString(descriptor, 'derivable').toString();
26+
return utxolib.miniscript.Descriptor.fromString(descriptor, 'derivable').toString();
2427
}
2528

2629
function getNamedDescriptor2Of2(name: string, a: string, b: string): utxod.NamedDescriptor {

modules/utxo-bin/test/cmdPsbt.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import * as fs from 'fs/promises';
33

44
import yargs from 'yargs';
55
import * as utxolib from '@bitgo/utxo-lib';
6-
import { Descriptor } from '@bitgo/wasm-miniscript';
6+
import * as WasmMiniscript from '@bitgo/wasm-miniscript';
77

88
import { cmdPsbt } from '../src/commands';
99
import { formatTreeNoColor, getFixtureString } from './fixtures';
1010
import { getKeyTriple } from './bip32.util';
1111
import { TxParser } from '../src/TxParser';
1212

13+
utxolib.initializeMiniscript(WasmMiniscript);
14+
1315
async function runPsbtCommand(args: string[]) {
1416
return cmdPsbt.builder(yargs([])).strict().exitProcess(false).parse(args);
1517
}
@@ -30,15 +32,15 @@ function multi(n: number, xpubs: string[], path: string) {
3032
return 'multi(' + n + ',' + xpubs.map((xpub) => xpub + path).join(',') + ')';
3133
}
3234

33-
function getAddressFromDescriptor(descriptor: Descriptor, network: utxolib.Network) {
35+
function getAddressFromDescriptor(descriptor: WasmMiniscript.Descriptor, network: utxolib.Network) {
3436
return utxolib.address.fromOutputScript(Buffer.from(descriptor.scriptPubkey()), network);
3537
}
3638

3739
describe('cmdPsbt commands', function () {
3840
const keys = getKeyTriple('cmdPsbt');
3941
const xpubs = keys.map((k) => k.neutered().toBase58());
4042
const descriptorString = `wsh(${multi(2, xpubs, '/*')})`;
41-
const descriptor = Descriptor.fromString(descriptorString, 'derivable');
43+
const descriptor = WasmMiniscript.Descriptor.fromString(descriptorString, 'derivable');
4244

4345
it('creates empty psbt', async function () {
4446
await fs.rm('/tmp/test.psbt', { force: true });
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { Descriptor } from '@bitgo/wasm-miniscript';
1+
import type { Descriptor } from '@bitgo/wasm-miniscript';
2+
import { miniscript } from '@bitgo/utxo-lib';
23

34
/** Map from descriptor name to descriptor */
45
export type DescriptorMap = Map<string, Descriptor>;
56

67
/** Convert an array of descriptor name-value pairs to a descriptor map */
78
export function toDescriptorMap(descriptors: { name: string; value: Descriptor | string }[]): DescriptorMap {
89
return new Map(
9-
descriptors.map((d) => [d.name, d.value instanceof Descriptor ? d.value : Descriptor.fromStringDetectType(d.value)])
10+
descriptors.map((d) => [
11+
d.name,
12+
d.value instanceof miniscript.Descriptor ? d.value : miniscript.Descriptor.fromStringDetectType(d.value),
13+
])
1014
);
1115
}

modules/utxo-core/src/descriptor/Output.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import assert from 'assert';
22

3-
import { Descriptor } from '@bitgo/wasm-miniscript';
3+
import type { Descriptor } from '@bitgo/wasm-miniscript';
4+
import { miniscript } from '@bitgo/utxo-lib';
45

56
import { getFixedOutputSum, MaxOutput, Output, PrevOutput } from '../Output';
67

@@ -46,7 +47,7 @@ export function toDerivedDescriptorWalletOutput(
4647
if (!descriptor) {
4748
throw new Error(`Descriptor not found: ${output.descriptorName}`);
4849
}
49-
assert(descriptor instanceof Descriptor);
50+
assert(descriptor instanceof miniscript.Descriptor);
5051
const descriptorAtIndex = getDescriptorAtIndexCheckScript(
5152
descriptor,
5253
output.descriptorIndex,

modules/utxo-core/src/descriptor/VirtualSize.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as utxolib from '@bitgo/utxo-lib';
22
import { Dimensions, VirtualSizes } from '@bitgo/unspents';
3-
import { Descriptor } from '@bitgo/wasm-miniscript';
3+
import type { Descriptor } from '@bitgo/wasm-miniscript';
4+
import { miniscript } from '@bitgo/utxo-lib';
45

56
import { DescriptorMap } from './DescriptorMap';
67
import { findDescriptorForInput } from './psbt';
@@ -86,7 +87,7 @@ export function getVirtualSize(
8687
): number {
8788
const lookup = descriptorMap ? getInputVSizesForDescriptors(descriptorMap) : undefined;
8889
const inputVSize = tx.inputs.reduce((sum, input) => {
89-
if (input instanceof Descriptor) {
90+
if (input instanceof miniscript.Descriptor) {
9091
return sum + getInputVSizeForDescriptor(input);
9192
}
9293
if ('descriptorName' in input) {

modules/utxo-core/src/descriptor/address.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Descriptor } from '@bitgo/wasm-miniscript';
1+
import type { Descriptor } from '@bitgo/wasm-miniscript';
22
import * as utxolib from '@bitgo/utxo-lib';
33

44
export function createScriptPubKeyFromDescriptor(descriptor: Descriptor, index: number | undefined): Buffer {

modules/utxo-core/src/descriptor/derive.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import assert from 'assert';
22

3-
import { Descriptor } from '@bitgo/wasm-miniscript';
3+
import type { Descriptor } from '@bitgo/wasm-miniscript';
4+
import { miniscript } from '@bitgo/utxo-lib';
45

56
/**
67
* Get a descriptor at a specific derivation index.
@@ -12,9 +13,9 @@ import { Descriptor } from '@bitgo/wasm-miniscript';
1213
* @throws {Error} If index is undefined for a wildcard descriptor or if index is provided for a definite descriptor
1314
*/
1415
export function getDescriptorAtIndex(descriptor: Descriptor, index: number | undefined): Descriptor {
15-
assert(descriptor instanceof Descriptor);
16-
Descriptor.fromString(descriptor.toString(), 'derivable');
17-
descriptor = Descriptor.fromStringDetectType(descriptor.toString());
16+
assert(descriptor instanceof miniscript.Descriptor);
17+
miniscript.Descriptor.fromString(descriptor.toString(), 'derivable');
18+
descriptor = miniscript.Descriptor.fromStringDetectType(descriptor.toString());
1819
if (descriptor.hasWildcard()) {
1920
if (index === undefined) {
2021
throw new Error('Derivable descriptor requires an index');
@@ -34,11 +35,11 @@ export function getDescriptorAtIndexCheckScript(
3435
script: Buffer,
3536
descriptorString = descriptor.toString()
3637
): Descriptor {
37-
assert(descriptor instanceof Descriptor);
38+
assert(descriptor instanceof miniscript.Descriptor);
3839
const descriptorAtIndex = getDescriptorAtIndex(descriptor, index);
3940
if (!script.equals(descriptorAtIndex.scriptPubkey())) {
4041
throw new Error(`Script mismatch: descriptor ${descriptorString} script=${script.toString('hex')}`);
4142
}
42-
assert(descriptorAtIndex instanceof Descriptor);
43+
assert(descriptorAtIndex instanceof miniscript.Descriptor);
4344
return descriptorAtIndex;
4445
}

modules/utxo-core/src/descriptor/fromFixedScriptWallet.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as utxolib from '@bitgo/utxo-lib';
2-
import { Descriptor, ast } from '@bitgo/wasm-miniscript';
2+
import type { Descriptor, ast } from '@bitgo/wasm-miniscript';
3+
import { miniscript } from '@bitgo/utxo-lib';
34

45
/** Expand a template with the given root wallet keys and chain code */
56
function expand(rootWalletKeys: utxolib.bitgo.RootWalletKeys, keyIndex: number, chainCode: number): string {
@@ -30,11 +31,11 @@ export function getDescriptorForScriptType(
3031
};
3132
switch (scriptType) {
3233
case 'p2sh':
33-
return Descriptor.fromString(ast.formatNode({ sh: multi }), 'derivable');
34+
return miniscript.Descriptor.fromString(miniscript.ast.formatNode({ sh: multi }), 'derivable');
3435
case 'p2shP2wsh':
35-
return Descriptor.fromString(ast.formatNode({ sh: { wsh: multi } }), 'derivable');
36+
return miniscript.Descriptor.fromString(miniscript.ast.formatNode({ sh: { wsh: multi } }), 'derivable');
3637
case 'p2wsh':
37-
return Descriptor.fromString(ast.formatNode({ wsh: multi }), 'derivable');
38+
return miniscript.Descriptor.fromString(miniscript.ast.formatNode({ wsh: multi }), 'derivable');
3839
default:
3940
throw new Error(`Unsupported script type ${scriptType}`);
4041
}

modules/utxo-core/src/descriptor/psbt/assertSatisfiable.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
*
99
* The goal is not an exhaustive check, but to catch common mistakes.
1010
*/
11-
import { Descriptor } from '@bitgo/wasm-miniscript';
11+
import type { Descriptor } from '@bitgo/wasm-miniscript';
1212
import * as utxolib from '@bitgo/utxo-lib';
13+
import { miniscript } from '@bitgo/utxo-lib';
1314

1415
export const FINAL_SEQUENCE = 0xffffffff;
1516

@@ -18,7 +19,7 @@ export const FINAL_SEQUENCE = 0xffffffff;
1819
* @param descriptor
1920
*/
2021
export function getRequiredLocktime(descriptor: Descriptor | unknown): number | undefined {
21-
if (descriptor instanceof Descriptor) {
22+
if (descriptor instanceof miniscript.Descriptor) {
2223
return getRequiredLocktime(descriptor.node());
2324
}
2425
if (typeof descriptor !== 'object' || descriptor === null) {

modules/utxo-core/src/descriptor/psbt/createPsbt.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as utxolib from '@bitgo/utxo-lib';
2-
import { Descriptor } from '@bitgo/wasm-miniscript';
2+
import type { Descriptor } from '@bitgo/wasm-miniscript';
33

44
import { DerivedDescriptorWalletOutput, WithOptDescriptor } from '../Output';
55
import { Output } from '../../Output';

modules/utxo-core/src/descriptor/psbt/findDescriptors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ We should take a look at a more robust and standard approach like this: https://
1010
1111
*/
1212
import { PsbtInput, PsbtOutput } from 'bip174/src/lib/interfaces';
13-
import { Descriptor } from '@bitgo/wasm-miniscript';
13+
import type { Descriptor } from '@bitgo/wasm-miniscript';
1414

1515
import { DescriptorMap } from '../DescriptorMap';
1616

modules/utxo-core/src/descriptor/psbt/parse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Descriptor } from '@bitgo/wasm-miniscript';
1+
import type { Descriptor } from '@bitgo/wasm-miniscript';
22
import * as utxolib from '@bitgo/utxo-lib';
33

44
import { DescriptorMap } from '../DescriptorMap';

modules/utxo-core/src/descriptor/psbt/sign.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import assert from 'assert';
22

33
import * as utxolib from '@bitgo/utxo-lib';
4-
import { Psbt as WasmPsbt } from '@bitgo/wasm-miniscript';
4+
import type { Psbt as WasmPsbt } from '@bitgo/wasm-miniscript';
55

66
/** These can be replaced when @bitgo/wasm-miniscript is updated */
77
export type SignPsbtInputResult = { Schnorr: string[] } | { Ecdsa: string[] };

modules/utxo-core/src/descriptor/psbt/wrap.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
import { Psbt as WasmPsbt } from '@bitgo/wasm-miniscript';
1+
import type { Psbt as WasmPsbt } from '@bitgo/wasm-miniscript';
22
import * as utxolib from '@bitgo/utxo-lib';
3+
import { miniscript } from '@bitgo/utxo-lib';
34

45
export function toWrappedPsbt(psbt: utxolib.bitgo.UtxoPsbt | utxolib.Psbt | Buffer | Uint8Array): WasmPsbt {
56
if (psbt instanceof utxolib.bitgo.UtxoPsbt || psbt instanceof utxolib.Psbt) {
67
psbt = psbt.toBuffer();
78
}
89
if (psbt instanceof Buffer || psbt instanceof Uint8Array) {
9-
return WasmPsbt.deserialize(psbt);
10+
return miniscript.Psbt.deserialize(psbt);
1011
}
1112
throw new Error('Invalid input');
1213
}
1314

1415
export function toUtxoPsbt(psbt: WasmPsbt | Buffer | Uint8Array, network: utxolib.Network): utxolib.bitgo.UtxoPsbt {
15-
if (psbt instanceof WasmPsbt) {
16+
if (psbt instanceof miniscript.Psbt) {
1617
psbt = psbt.serialize();
1718
}
1819
if (psbt instanceof Buffer || psbt instanceof Uint8Array) {

0 commit comments

Comments
 (0)