@bitcoinerlab/descriptors 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/signers.js CHANGED
@@ -26,37 +26,77 @@ const ledgerSignaturesForInputIndex = (index, ledgerSignatures) => ledgerSignatu
26
26
  pubkey: partialSignature.pubkey,
27
27
  signature: partialSignature.signature
28
28
  }));
29
- async function signInputLedger({ psbt, index, descriptor, ledgerClient, ledgerState }) {
29
+ /**
30
+ * To be removed in v3.0 and replaced by a version that does not accept
31
+ * descriptor
32
+ * @hidden
33
+ */
34
+ async function signInputLedger({ psbt, index, descriptor, ledgerClient, ledgerState, ledgerManager }) {
35
+ if (!descriptor && !ledgerManager)
36
+ throw new Error(`ledgerManager not provided`);
37
+ if (descriptor && ledgerManager)
38
+ throw new Error(`Invalid usage: don't pass descriptor`);
39
+ if (ledgerManager && (ledgerClient || ledgerState))
40
+ throw new Error(`Invalid usage: either ledgerManager or ledgerClient + ledgerState`);
41
+ const output = descriptor;
42
+ if (ledgerManager)
43
+ ({ ledgerClient, ledgerState } = ledgerManager);
44
+ if (!ledgerClient)
45
+ throw new Error(`ledgerManager not provided`);
46
+ if (!ledgerState)
47
+ throw new Error(`ledgerManager not provided`);
30
48
  const { PsbtV2, DefaultWalletPolicy, WalletPolicy, AppClient } = (await (0, ledger_1.importAndValidateLedgerBitcoin)(ledgerClient));
31
49
  if (!(ledgerClient instanceof AppClient))
32
50
  throw new Error(`Error: pass a valid ledgerClient`);
33
- const result = await (0, ledger_1.descriptorToLedgerFormat)({
34
- descriptor,
35
- ledgerClient,
36
- ledgerState
37
- });
38
- if (!result)
39
- throw new Error(`Error: descriptor does not have a ledger input`);
40
- const { ledgerTemplate, keyRoots } = result;
41
51
  let ledgerSignatures;
42
- const standardPolicy = await (0, ledger_1.ledgerPolicyFromStandard)({
43
- descriptor,
44
- ledgerClient,
45
- ledgerState
46
- });
47
- if (standardPolicy) {
48
- ledgerSignatures = await ledgerClient.signPsbt(new PsbtV2().fromBitcoinJS(psbt), new DefaultWalletPolicy(ledgerTemplate, keyRoots[0]), null);
52
+ if (ledgerManager) {
53
+ const policy = await (0, ledger_1.ledgerPolicyFromPsbtInput)({
54
+ psbt,
55
+ index,
56
+ ledgerManager
57
+ });
58
+ if (!policy)
59
+ throw new Error(`Error: the ledger cannot sign this pstb input`);
60
+ if (policy.policyName && policy.policyHmac && policy.policyId) {
61
+ //non-standard policy
62
+ const walletPolicy = new WalletPolicy(policy.policyName, policy.ledgerTemplate, policy.keyRoots);
63
+ ledgerSignatures = await ledgerClient.signPsbt(new PsbtV2().fromBitcoinJS(psbt), walletPolicy, policy.policyHmac);
64
+ }
65
+ else {
66
+ //standard policy
67
+ ledgerSignatures = await ledgerClient.signPsbt(new PsbtV2().fromBitcoinJS(psbt), new DefaultWalletPolicy(policy.ledgerTemplate, policy.keyRoots[0]), null);
68
+ }
49
69
  }
50
70
  else {
51
- const policy = await (0, ledger_1.ledgerPolicyFromState)({
52
- descriptor,
71
+ if (!output)
72
+ throw new Error(`outputs not provided`);
73
+ const result = await (0, ledger_1.ledgerPolicyFromOutput)({
74
+ output,
75
+ ledgerClient,
76
+ ledgerState
77
+ });
78
+ if (!result)
79
+ throw new Error(`Error: output does not have a ledger input`);
80
+ const { ledgerTemplate, keyRoots } = result;
81
+ const standardPolicy = await (0, ledger_1.ledgerPolicyFromStandard)({
82
+ output,
53
83
  ledgerClient,
54
84
  ledgerState
55
85
  });
56
- if (!policy || !policy.policyName || !policy.policyHmac)
57
- throw new Error(`Error: the descriptor's policy is not registered`);
58
- const walletPolicy = new WalletPolicy(policy.policyName, ledgerTemplate, keyRoots);
59
- ledgerSignatures = await ledgerClient.signPsbt(new PsbtV2().fromBitcoinJS(psbt), walletPolicy, policy.policyHmac);
86
+ if (standardPolicy) {
87
+ ledgerSignatures = await ledgerClient.signPsbt(new PsbtV2().fromBitcoinJS(psbt), new DefaultWalletPolicy(ledgerTemplate, keyRoots[0]), null);
88
+ }
89
+ else {
90
+ const policy = await (0, ledger_1.ledgerPolicyFromState)({
91
+ output,
92
+ ledgerClient,
93
+ ledgerState
94
+ });
95
+ if (!policy || !policy.policyName || !policy.policyHmac)
96
+ throw new Error(`Error: the descriptor's policy is not registered`);
97
+ const walletPolicy = new WalletPolicy(policy.policyName, ledgerTemplate, keyRoots);
98
+ ledgerSignatures = await ledgerClient.signPsbt(new PsbtV2().fromBitcoinJS(psbt), walletPolicy, policy.policyHmac);
99
+ }
60
100
  }
61
101
  //Add the signatures to the Psbt object using PartialSig format:
62
102
  psbt.updateInput(index, {
@@ -64,30 +104,51 @@ async function signInputLedger({ psbt, index, descriptor, ledgerClient, ledgerSt
64
104
  });
65
105
  }
66
106
  exports.signInputLedger = signInputLedger;
67
- //signLedger is able to sign several inputs of the same wallet policy since it
68
- //it clusters together wallet policy types before signing
69
- //it throws if it cannot sign any input.
70
- async function signLedger({ psbt, descriptors, ledgerClient, ledgerState }) {
107
+ /**
108
+ * To be removed in v3.0 and replaced by a version that does not accept
109
+ * descriptors
110
+ * @hidden
111
+ */
112
+ async function signLedger({ psbt, descriptors, ledgerClient, ledgerState, ledgerManager }) {
113
+ if (!descriptors && !ledgerManager)
114
+ throw new Error(`ledgerManager not provided`);
115
+ if (descriptors && ledgerManager)
116
+ throw new Error(`Invalid usage: don't pass descriptors`);
117
+ if (ledgerManager && (ledgerClient || ledgerState))
118
+ throw new Error(`Invalid usage: either ledgerManager or ledgerClient + ledgerState`);
119
+ const outputs = descriptors;
120
+ if (ledgerManager)
121
+ ({ ledgerClient, ledgerState } = ledgerManager);
122
+ if (!ledgerClient)
123
+ throw new Error(`ledgerManager not provided`);
124
+ if (!ledgerState)
125
+ throw new Error(`ledgerManager not provided`);
71
126
  const { PsbtV2, DefaultWalletPolicy, WalletPolicy, AppClient } = (await (0, ledger_1.importAndValidateLedgerBitcoin)(ledgerClient));
72
127
  if (!(ledgerClient instanceof AppClient))
73
128
  throw new Error(`Error: pass a valid ledgerClient`);
74
129
  const ledgerPolicies = [];
75
- for (const descriptor of descriptors) {
76
- const policy = (await (0, ledger_1.ledgerPolicyFromState)({
77
- descriptor,
78
- ledgerClient,
79
- ledgerState
80
- })) ||
81
- (await (0, ledger_1.ledgerPolicyFromStandard)({
82
- descriptor,
83
- ledgerClient,
84
- ledgerState
85
- }));
86
- if (policy)
87
- ledgerPolicies.push(policy);
130
+ if (ledgerManager)
131
+ for (let index = 0; index < psbt.data.inputs.length; index++) {
132
+ const policy = await (0, ledger_1.ledgerPolicyFromPsbtInput)({
133
+ psbt,
134
+ index,
135
+ ledgerManager
136
+ });
137
+ if (policy)
138
+ ledgerPolicies.push(policy);
139
+ }
140
+ else {
141
+ if (!outputs)
142
+ throw new Error(`outputs not provided`);
143
+ for (const output of outputs) {
144
+ const policy = (await (0, ledger_1.ledgerPolicyFromState)({ output, ledgerClient, ledgerState })) ||
145
+ (await (0, ledger_1.ledgerPolicyFromStandard)({ output, ledgerClient, ledgerState }));
146
+ if (policy)
147
+ ledgerPolicies.push(policy);
148
+ }
149
+ if (ledgerPolicies.length === 0)
150
+ throw new Error(`Error: there are no inputs which could be signed`);
88
151
  }
89
- if (ledgerPolicies.length === 0)
90
- throw new Error(`Error: there are no inputs which could be signed`);
91
152
  //cluster unique LedgerPolicies
92
153
  const uniquePolicies = [];
93
154
  for (const policy of ledgerPolicies) {
package/dist/types.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import type { ECPairInterface } from 'ecpair';
3
3
  import type { BIP32Interface } from 'bip32';
4
- import type { Network, Payment, Psbt } from 'bitcoinjs-lib';
5
- import type { PartialSig } from 'bip174/src/lib/interfaces';
4
+ import type { Payment, Network } from 'bitcoinjs-lib';
6
5
  /**
7
6
  * Preimage
8
7
  * @alias Preimage
@@ -24,6 +23,9 @@ export type TimeConstraints = {
24
23
  nLockTime: number | undefined;
25
24
  nSequence: number | undefined;
26
25
  };
26
+ /**
27
+ * See {@link _Internal_.ParseKeyExpression | ParseKeyExpression}.
28
+ */
27
29
  export type KeyInfo = {
28
30
  keyExpression: string;
29
31
  pubkey?: Buffer;
@@ -34,40 +36,44 @@ export type KeyInfo = {
34
36
  keyPath?: string;
35
37
  path?: string;
36
38
  };
39
+ /**
40
+ * An `ExpansionMap` contains destructured information of a descritptor expression.
41
+ *
42
+ * For example, this descriptor `sh(wsh(andor(pk(0252972572d465d016d4c501887b8df303eee3ed602c056b1eb09260dfa0da0ab2),older(8640),pk([d34db33f/49'/0'/0']tpubDCdxmvzJ5QBjTN8oCjjyT2V58AyZvA1fkmCeZRC75QMoaHcVP2m45Bv3hmnR7ttAwkb2UNYyoXdHVt4gwBqRrJqLUU2JrM43HippxiWpHra/1/2/3/4/*))))` has the following
43
+ * `expandedExpression`: `sh(wsh(andor(pk(@0),older(8640),pk(@1))))`
44
+ *
45
+ * `key`'s are set using this format: `@i`, where `i` is an integer starting from `0` assigned by parsing and retrieving keys from the descriptor from left to right.
46
+ *
47
+ * For the given example, the `ExpansionMap` is:
48
+ *
49
+ * ```javascript
50
+ * {
51
+ * '@0': {
52
+ * keyExpression:
53
+ * '0252972572d465d016d4c501887b8df303eee3ed602c056b1eb09260dfa0da0ab2'
54
+ * },
55
+ * '@1': {
56
+ * keyExpression:
57
+ * "[d34db33f/49'/0'/0']tpubDCdxmvzJ5QBjTN8oCjjyT2V58AyZvA1fkmCeZRC75QMoaHcVP2m45Bv3hmnR7ttAwkb2UNYyoXdHVt4gwBqRrJqLUU2JrM43HippxiWpHra/1/2/3/4/*",
58
+ * keyPath: '/1/2/3/4/*',
59
+ * originPath: "/49'/0'/0'",
60
+ * path: "m/49'/0'/0'/1/2/3/4/*",
61
+ * // Other relevant properties of the type `KeyInfo`: `pubkey`, `ecpair` & `bip32` interfaces, `masterFingerprint`, etc.
62
+ * }
63
+ * }
64
+ *```
65
+ *
66
+ *
67
+ */
37
68
  export type ExpansionMap = {
38
69
  [key: string]: KeyInfo;
39
70
  };
40
- export interface ParseKeyExpression {
41
- (params: {
42
- keyExpression: string;
43
- isSegwit?: boolean;
44
- network?: Network;
45
- }): KeyInfo;
46
- }
47
- export interface Expand {
48
- (params: {
49
- expression: string;
50
- index?: number;
51
- checksumRequired?: boolean;
52
- network?: Network;
53
- allowMiniscriptInP2SH?: boolean;
54
- }): {
55
- payment?: Payment;
56
- expandedExpression?: string;
57
- miniscript?: string;
58
- expansionMap?: ExpansionMap;
59
- isSegwit?: boolean;
60
- expandedMiniscript?: string;
61
- redeemScript?: Buffer;
62
- witnessScript?: Buffer;
63
- isRanged: boolean;
64
- canonicalExpression: string;
65
- };
66
- }
71
+ /** @ignore */
67
72
  interface XOnlyPointAddTweakResult {
68
73
  parity: 1 | 0;
69
74
  xOnlyPubkey: Uint8Array;
70
75
  }
76
+ /** @ignore */
71
77
  export interface TinySecp256k1Interface {
72
78
  isPoint(p: Uint8Array): boolean;
73
79
  pointCompress(p: Uint8Array, compressed?: boolean): Uint8Array;
@@ -83,51 +89,92 @@ export interface TinySecp256k1Interface {
83
89
  privateNegate(d: Uint8Array): Uint8Array;
84
90
  }
85
91
  /**
86
- * DescriptorInfo
87
- * What defines a Descriptor. This is the type needed in the constructor.
88
- * @alias DescriptorInfo
89
- * @memberof Descriptor
92
+ * `DescriptorsFactory` creates and returns the {@link DescriptorsFactory | `expand()`}
93
+ * function that parses a descriptor expression and destructures it
94
+ * into its elemental parts. `Expansion` is the type that `expand()` returns.
90
95
  */
91
- export type DescriptorInfo = {
92
- expression: string;
93
- index?: number;
94
- checksumRequired?: boolean;
95
- allowMiniscriptInP2SH?: boolean;
96
- network?: Network;
97
- preimages?: Preimage[];
98
- signersPubKeys?: Buffer[];
96
+ export type Expansion = {
97
+ /**
98
+ * The corresponding [bitcoinjs-lib Payment](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/ts_src/payments/index.ts) for the provided expression, if applicable.
99
+ */
100
+ payment?: Payment;
101
+ /**
102
+ * The expanded descriptor expression.
103
+ * See {@link ExpansionMap ExpansionMap} for a detailed explanation.
104
+ */
105
+ expandedExpression?: string;
106
+ /**
107
+ * The extracted miniscript from the expression, if any.
108
+ */
109
+ miniscript?: string;
110
+ /**
111
+ * A map of key expressions in the descriptor to their corresponding expanded keys.
112
+ * See {@link ExpansionMap ExpansionMap} for a detailed explanation.
113
+ */
114
+ expansionMap?: ExpansionMap;
115
+ /**
116
+ * A boolean indicating whether the descriptor uses SegWit.
117
+ */
118
+ isSegwit?: boolean;
119
+ /**
120
+ * The expanded miniscript, if any.
121
+ * It corresponds to the `expandedExpression` without the top-level script
122
+ * expression.
123
+ */
124
+ expandedMiniscript?: string;
125
+ /**
126
+ * The redeem script for the descriptor, if applicable.
127
+ */
128
+ redeemScript?: Buffer;
129
+ /**
130
+ * The witness script for the descriptor, if applicable.
131
+ */
132
+ witnessScript?: Buffer;
133
+ /**
134
+ * Whether the descriptor is a ranged-descriptor.
135
+ */
136
+ isRanged: boolean;
137
+ /**
138
+ * This is the preferred or authoritative representation of an output
139
+ * descriptor expression.
140
+ * It removes the checksum and, if it is a ranged-descriptor, it
141
+ * particularizes it to its index.
142
+ */
143
+ canonicalExpression: string;
99
144
  };
100
- export interface DescriptorInterface {
101
- getPayment(): Payment;
102
- getAddress(): string;
103
- getScriptPubKey(): Buffer;
104
- getScriptSatisfaction(signatures: PartialSig[]): Buffer;
105
- getSequence(): number | undefined;
106
- getLockTime(): number | undefined;
107
- getWitnessScript(): Buffer | undefined;
108
- getRedeemScript(): Buffer | undefined;
109
- getNetwork(): Network;
110
- isSegwit(): boolean | undefined;
111
- updatePsbt({ psbt, vout, txHex, txId, value }: {
112
- psbt: Psbt;
113
- vout: number;
114
- txHex?: string;
115
- txId?: string;
116
- value?: number;
117
- }): number;
118
- finalizePsbtInput({ index, psbt, validate }: {
119
- index: number;
120
- psbt: Psbt;
121
- validate?: boolean | undefined;
122
- }): void;
123
- expand(): {
124
- expandedExpression?: string;
125
- miniscript?: string;
126
- expandedMiniscript?: string;
127
- expansionMap?: ExpansionMap;
128
- };
129
- }
130
- export interface DescriptorInterfaceConstructor {
131
- new (args: DescriptorInfo): DescriptorInterface;
145
+ /**
146
+ * The {@link DescriptorsFactory | `DescriptorsFactory`} function creates and
147
+ * returns the `parseKeyExpression` function, which is an implementation of this
148
+ * interface.
149
+ *
150
+ * It parses and destructures a key expression string (xpub, xprv, pubkey or
151
+ * wif) into {@link KeyInfo | `KeyInfo`}.
152
+ *
153
+ * For example, given this `keyExpression`: `[d34db33f/49'/0'/0']tpubDCdxmvzJ5QBjTN8oCjjyT2V58AyZvA1fkmCeZRC75QMoaHcVP2m45Bv3hmnR7ttAwkb2UNYyoXdHVt4gwBqRrJqLUU2JrM43HippxiWpHra/1/2/3/4/*`, this is the parsed result:
154
+ *
155
+ * ```javascript
156
+ * {
157
+ * keyExpression:
158
+ * "[d34db33f/49'/0'/0']tpubDCdxmvzJ5QBjTN8oCjjyT2V58AyZvA1fkmCeZRC75QMoaHcVP2m45Bv3hmnR7ttAwkb2UNYyoXdHVt4gwBqRrJqLUU2JrM43HippxiWpHra/1/2/3/4/*",
159
+ * keyPath: '/1/2/3/4/*',
160
+ * originPath: "/49'/0'/0'",
161
+ * path: "m/49'/0'/0'/1/2/3/4/*",
162
+ * // Other relevant properties of the type `KeyInfo`: `pubkey`, `ecpair` & `bip32` interfaces, `masterFingerprint`, etc.
163
+ * }
164
+ * ```
165
+ *
166
+ * See {@link KeyInfo} for the complete list of elements retrieved by this function.
167
+ */
168
+ export interface ParseKeyExpression {
169
+ (params: {
170
+ keyExpression: string;
171
+ /**
172
+ * Indicates if this key expression belongs to a a SegWit output. When set,
173
+ * further checks are done to ensure the public key (if present in the
174
+ * expression) is compressed (33 bytes).
175
+ */
176
+ isSegwit?: boolean;
177
+ network?: Network;
178
+ }): KeyInfo;
132
179
  }
133
180
  export {};
package/package.json CHANGED
@@ -1,39 +1,10 @@
1
1
  {
2
2
  "name": "@bitcoinerlab/descriptors",
3
- "homepage": "https://github.com/bitcoinerlab/descriptors",
4
- "version": "1.0.2",
5
3
  "description": "This library parses and creates Bitcoin Miniscript Descriptors and generates Partially Signed Bitcoin Transactions (PSBTs). It provides PSBT finalizers and signers for single-signature, BIP32 and Hardware Wallets.",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "scripts": {
9
- "build": "npx tsc",
10
- "prepublishOnly": "npm run build && npm test && echo \"\\n\\n\" && npm run test:integration:ledger",
11
- "docs": "jsdoc -c jsdoc.json",
12
- "regtest-docker": "docker ps | grep bitcoinerlab/tester > /dev/null || (docker pull bitcoinerlab/tester && docker run -d -p 8080:8080 -p 60401:60401 -p 3002:3002 bitcoinerlab/tester && sleep 5)",
13
- "test:integration:soft": "npm run regtest-docker && npx ts-node test/integration/standardOutputs.ts && echo \"\\n\\n\" && npx ts-node test/integration/miniscript.ts",
14
- "test:integration:ledger": "npm run regtest-docker && npx ts-node test/integration/ledger.ts",
15
- "test:unit": "npm run build && node test/tools/generateBitcoinCoreFixtures.js && jest",
16
- "test": "npm run lint && npm run lint:test && npm run test:unit && npm run test:integration:soft",
17
- "lint": "eslint --ignore-path .gitignore --ext .js,.ts src/",
18
- "lint:test": "eslint --ignore-path .gitignore --ext .js,.ts test/"
19
- },
20
- "COMMENT_babel": "Babel plugins are are only needed for the jest testing environment. Jest needs to use commonjs. Also, jest cannot handle ESM converted code, since it uses 'import.meta.url'. See src/bindings.js. babel-plugin-transform-import-meta fixes it.",
21
- "babel": {
22
- "env": {
23
- "test": {
24
- "plugins": [
25
- "@babel/plugin-transform-modules-commonjs",
26
- "babel-plugin-transform-import-meta"
27
- ]
28
- }
29
- }
30
- },
31
- "jest": {
32
- "testPathIgnorePatterns": [
33
- "example/",
34
- "dist/"
35
- ]
36
- },
4
+ "homepage": "https://github.com/bitcoinerlab/descriptors",
5
+ "version": "2.0.0",
6
+ "author": "Jose-Luis Landabaso",
7
+ "license": "MIT",
37
8
  "repository": {
38
9
  "type": "git",
39
10
  "url": "git+https://github.com/bitcoinerlab/descriptors.git"
@@ -44,11 +15,35 @@
44
15
  "bitcoinjs",
45
16
  "miniscript"
46
17
  ],
47
- "author": "Jose-Luis Landabaso",
48
- "license": "MIT",
49
18
  "bugs": {
50
19
  "url": "https://github.com/bitcoinerlab/descriptors/issues"
51
20
  },
21
+ "main": "dist/index.js",
22
+ "types": "dist/index.d.ts",
23
+ "prettier": "@bitcoinerlab/configs/prettierConfig.json",
24
+ "eslintConfig": {
25
+ "extends": "./node_modules/@bitcoinerlab/configs/eslintConfig"
26
+ },
27
+ "jest": {
28
+ "preset": "@bitcoinerlab/configs"
29
+ },
30
+ "scripts": {
31
+ "webdocs": "typedoc --options ./node_modules/@bitcoinerlab/configs/webtypedoc.json",
32
+ "docs": "typedoc --options ./node_modules/@bitcoinerlab/configs/typedoc.json",
33
+ "build:src": "tsc --project ./node_modules/@bitcoinerlab/configs/tsconfig.src.json",
34
+ "build:fixtures": "node test/tools/generateBitcoinCoreFixtures.js -i test/fixtures/descriptor_tests.cpp | npx prettier --parser typescript > test/fixtures/bitcoinCore.ts",
35
+ "build:test": "npm run build:fixtures && tsc --project ./node_modules/@bitcoinerlab/configs/tsconfig.test.json",
36
+ "build": "npm run build:src && npm run build:test",
37
+ "lint": "eslint --ignore-path .gitignore --ext .ts src/ test/",
38
+ "ensureTester": "./node_modules/@bitcoinerlab/configs/scripts/ensureTester.sh",
39
+ "test:integration:soft": "npm run ensureTester && node test/integration/standardOutputs.js && echo \"\\n\\n\" && node test/integration/miniscript.js",
40
+ "test:integration:ledger": "npm run ensureTester && node test/integration/ledger.js",
41
+ "test:integration:deprecated": "npm run ensureTester && node test/integration/standardOutputs-deprecated.js && echo \"\\n\\n\" && node test/integration/miniscript-deprecated.js && echo \"\\n\\n\" && node test/integration/ledger-deprecated.js",
42
+ "test:unit": "jest",
43
+ "test": "npm run lint && npm run build && npm run test:unit && npm run test:integration:soft",
44
+ "testledger": "npm run lint && npm run build && npm run test:integration:ledger",
45
+ "prepublishOnly": "npm run test && echo \"\\n\\n\" && npm run test:integration:deprecated && npm run test:integration:ledger"
46
+ },
52
47
  "files": [
53
48
  "dist"
54
49
  ],
@@ -61,27 +56,14 @@
61
56
  }
62
57
  },
63
58
  "devDependencies": {
64
- "@babel/plugin-transform-modules-commonjs": "^7.20.11",
59
+ "@bitcoinerlab/configs": "github:bitcoinerlab/configs",
65
60
  "@ledgerhq/hw-transport-node-hid": "^6.27.12",
66
- "@typescript-eslint/eslint-plugin": "^5.60.1",
67
- "@typescript-eslint/parser": "^5.60.1",
68
- "babel-plugin-transform-import-meta": "^2.2.0",
69
- "better-docs": "^2.7.2",
70
61
  "bip39": "^3.0.4",
71
62
  "bip65": "^1.0.3",
72
63
  "bip68": "^1.0.4",
73
- "eslint-config-prettier": "^8.6.0",
74
- "eslint-plugin-jest": "^27.2.1",
75
- "eslint-plugin-prettier": "^4.2.1",
76
- "fs": "^0.0.1-security",
77
- "jest": "^29.4.3",
78
- "jsdoc": "^3.6.11",
79
64
  "ledger-bitcoin": "^0.2.2",
80
- "path": "^0.12.7",
81
- "prettier": "^2.8.8",
82
65
  "regtest-client": "^0.2.0",
83
- "ts-node-dev": "^2.0.0",
84
- "typescript": "5.0"
66
+ "yargs": "^17.7.2"
85
67
  },
86
68
  "dependencies": {
87
69
  "@bitcoinerlab/miniscript": "^1.2.1",