@bitgo-beta/utxo-descriptors 0.0.1-beta.3 → 0.0.1-beta.300

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.
Files changed (62) hide show
  1. package/dist/cjs/src/index.d.ts +1 -0
  2. package/dist/cjs/src/index.d.ts.map +1 -1
  3. package/dist/cjs/src/index.js +3 -2
  4. package/dist/cjs/src/pox5/descriptor.d.ts +22 -0
  5. package/dist/cjs/src/pox5/descriptor.d.ts.map +1 -0
  6. package/dist/cjs/src/pox5/descriptor.js +79 -0
  7. package/dist/cjs/src/pox5/index.d.ts +5 -0
  8. package/dist/cjs/src/pox5/index.d.ts.map +1 -0
  9. package/dist/cjs/src/pox5/index.js +21 -0
  10. package/dist/cjs/src/pox5/input.d.ts +28 -0
  11. package/dist/cjs/src/pox5/input.d.ts.map +1 -0
  12. package/dist/cjs/src/pox5/input.js +47 -0
  13. package/dist/cjs/src/pox5/parseDescriptor.d.ts +18 -0
  14. package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
  15. package/dist/cjs/src/pox5/parseDescriptor.js +95 -0
  16. package/dist/cjs/src/pox5/validation.d.ts +12 -0
  17. package/dist/cjs/src/pox5/validation.d.ts.map +1 -0
  18. package/dist/cjs/src/pox5/validation.js +70 -0
  19. package/dist/cjs/src/sbtc/index.d.ts +1 -0
  20. package/dist/cjs/src/sbtc/index.d.ts.map +1 -1
  21. package/dist/cjs/src/sbtc/index.js +2 -1
  22. package/dist/cjs/src/sbtc/parseDescriptor.d.ts +55 -0
  23. package/dist/cjs/src/sbtc/parseDescriptor.d.ts.map +1 -0
  24. package/dist/cjs/src/sbtc/parseDescriptor.js +185 -0
  25. package/dist/cjs/test/unit/pox5/descriptor.d.ts +2 -0
  26. package/dist/cjs/test/unit/pox5/descriptor.d.ts.map +1 -0
  27. package/dist/cjs/test/unit/pox5/descriptor.js +157 -0
  28. package/dist/cjs/test/unit/pox5/input.d.ts +2 -0
  29. package/dist/cjs/test/unit/pox5/input.d.ts.map +1 -0
  30. package/dist/cjs/test/unit/pox5/input.js +113 -0
  31. package/dist/cjs/test/unit/pox5/validation.d.ts +2 -0
  32. package/dist/cjs/test/unit/pox5/validation.d.ts.map +1 -0
  33. package/dist/cjs/test/unit/pox5/validation.js +99 -0
  34. package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts +2 -0
  35. package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts.map +1 -0
  36. package/dist/cjs/test/unit/sbtc/parseDescriptor.js +202 -0
  37. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  38. package/dist/esm/index.d.ts +1 -0
  39. package/dist/esm/index.d.ts.map +1 -1
  40. package/dist/esm/index.js +2 -1
  41. package/dist/esm/pox5/descriptor.d.ts +22 -0
  42. package/dist/esm/pox5/descriptor.d.ts.map +1 -0
  43. package/dist/esm/pox5/descriptor.js +74 -0
  44. package/dist/esm/pox5/index.d.ts +5 -0
  45. package/dist/esm/pox5/index.d.ts.map +1 -0
  46. package/dist/esm/pox5/index.js +5 -0
  47. package/dist/esm/pox5/input.d.ts +28 -0
  48. package/dist/esm/pox5/input.d.ts.map +1 -0
  49. package/dist/esm/pox5/input.js +43 -0
  50. package/dist/esm/pox5/parseDescriptor.d.ts +18 -0
  51. package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
  52. package/dist/esm/pox5/parseDescriptor.js +92 -0
  53. package/dist/esm/pox5/validation.d.ts +12 -0
  54. package/dist/esm/pox5/validation.d.ts.map +1 -0
  55. package/dist/esm/pox5/validation.js +65 -0
  56. package/dist/esm/sbtc/index.d.ts +1 -0
  57. package/dist/esm/sbtc/index.d.ts.map +1 -1
  58. package/dist/esm/sbtc/index.js +2 -1
  59. package/dist/esm/sbtc/parseDescriptor.d.ts +55 -0
  60. package/dist/esm/sbtc/parseDescriptor.d.ts.map +1 -0
  61. package/dist/esm/sbtc/parseDescriptor.js +182 -0
  62. package/package.json +8 -5
@@ -0,0 +1,182 @@
1
+ import { BIP32, Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ import { PatternMatcher } from '@bitgo-beta/utxo-core/descriptor';
3
+ import { MAX_FEE_BYTE_LENGTH, STACKS_RECIPIENT_BYTE_LENGTH, UNSPENDABLE_INTERNAL_KEY } from './constants';
4
+ function asString(v, field) {
5
+ if (typeof v !== 'string') {
6
+ throw new Error(`${field} must be a string`);
7
+ }
8
+ return v;
9
+ }
10
+ function asNumber(v, field) {
11
+ if (typeof v !== 'number') {
12
+ throw new Error(`${field} must be a number`);
13
+ }
14
+ return v;
15
+ }
16
+ /**
17
+ * Pull `[threshold, ...keys]` out of a `multi_a` AST node value, validating
18
+ * each element. The descriptor's `multi_a` is rendered with keys either as
19
+ * concrete hex (definite descriptor) or as xpub strings ending in `/*`
20
+ * (derivable descriptor) — both are strings here, so we don't try to convert
21
+ * to Buffer at this level.
22
+ */
23
+ function parseMulti(multi) {
24
+ if (!Array.isArray(multi) || multi.length < 1) {
25
+ throw new Error('Invalid multi_a structure: not an array or empty');
26
+ }
27
+ const [threshold, ...keys] = multi;
28
+ if (typeof threshold !== 'number') {
29
+ throw new Error('Invalid multi_a structure: threshold is not a number');
30
+ }
31
+ if (!keys.every((k) => typeof k === 'string')) {
32
+ throw new Error('Invalid multi_a structure: not all keys are strings');
33
+ }
34
+ return [threshold, keys];
35
+ }
36
+ function parseDepositLeaf(depositNode, matcher) {
37
+ const depositPattern = {
38
+ and_v: [{ payload_drop: { $var: 'payloadHex' } }, { pk: { $var: 'signersKey' } }],
39
+ };
40
+ const match = matcher.match(depositNode, depositPattern);
41
+ if (!match) {
42
+ throw new Error('Deposit leaf does not match expected pattern');
43
+ }
44
+ const payloadHex = asString(match.payloadHex, 'payload_drop value');
45
+ const signersKeyHex = asString(match.signersKey, 'pk_k key');
46
+ const expectedPayloadLength = MAX_FEE_BYTE_LENGTH + STACKS_RECIPIENT_BYTE_LENGTH;
47
+ const payload = Buffer.from(payloadHex, 'hex');
48
+ if (payload.length !== expectedPayloadLength) {
49
+ throw new Error(`payload_drop value must be ${expectedPayloadLength} bytes (${expectedPayloadLength * 2} hex chars), got ${payload.length} bytes`);
50
+ }
51
+ const maxFee = payload.readBigUInt64BE(0);
52
+ const stacksRecipient = payload.subarray(MAX_FEE_BYTE_LENGTH);
53
+ const signersAggregateKey = Buffer.from(signersKeyHex, 'hex');
54
+ if (signersAggregateKey.length !== 32) {
55
+ throw new Error(`signersAggregateKey must be 32 bytes x-only, got ${signersAggregateKey.length}`);
56
+ }
57
+ return { signersAggregateKey, maxFee, stacksRecipient };
58
+ }
59
+ function parseReclaimLeaf(reclaimNode, matcher) {
60
+ // and_v(r:older(<lockTime>), multi_a(2, k1, k2, k3))
61
+ const reclaimPattern = {
62
+ and_v: [{ 'r:older': { $var: 'lockTime' } }, { multi_a: { $var: 'reclaimMulti' } }],
63
+ };
64
+ const match = matcher.match(reclaimNode, reclaimPattern);
65
+ if (!match) {
66
+ throw new Error('Reclaim leaf does not match expected pattern');
67
+ }
68
+ const lockTime = asNumber(match.lockTime, 'r:older argument');
69
+ if (lockTime <= 0) {
70
+ throw new Error(`reclaim lockTime must be > 0, got ${lockTime}`);
71
+ }
72
+ const [threshold, reclaimKeyStrings] = parseMulti(match.reclaimMulti);
73
+ if (threshold !== 2) {
74
+ throw new Error(`reclaim multi_a threshold must be 2, got ${threshold}`);
75
+ }
76
+ if (reclaimKeyStrings.length !== 3) {
77
+ throw new Error(`reclaim multi_a must have exactly 3 keys, got ${reclaimKeyStrings.length}`);
78
+ }
79
+ return { lockTime, reclaimKeyStrings };
80
+ }
81
+ const HEX_X_ONLY_KEY = /^[0-9a-fA-F]{64}$/;
82
+ const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
83
+ /**
84
+ * Resolve a single `multi_a` key entry to a 32-byte x-only public key.
85
+ *
86
+ * Accepts:
87
+ * - 64-hex-char string → returned as-is (already x-only)
88
+ * - `xpub.../<index>` → BIP32-derive at that index and drop the prefix byte
89
+ *
90
+ * Returns null for any other shape (e.g. wildcard `xpub.../*`, malformed input).
91
+ */
92
+ function resolveReclaimKey(s) {
93
+ if (HEX_X_ONLY_KEY.test(s)) {
94
+ return Buffer.from(s, 'hex');
95
+ }
96
+ const m = s.match(XPUB_WITH_INDEX);
97
+ if (!m) {
98
+ return null;
99
+ }
100
+ const [, xpub, indexStr] = m;
101
+ const index = Number.parseInt(indexStr, 10);
102
+ if (!Number.isFinite(index) || index < 0) {
103
+ return null;
104
+ }
105
+ let node;
106
+ try {
107
+ node = BIP32.fromBase58(xpub);
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ // BIP32 public key is 33 bytes (1 prefix + 32 x-only). Drop the prefix.
113
+ return Buffer.from(node.derive(index).publicKey.subarray(1));
114
+ }
115
+ /**
116
+ * Convert reclaim-leaf key strings into 32-byte x-only buffers. Accepts both
117
+ * the definite/derived form (concrete 64-hex-char x-only keys) and the form
118
+ * produced by `Descriptor.atDerivationIndex(n)` (`xpub.../<n>`). Returns
119
+ * undefined if any entry is still wildcard (`xpub.../*`) or otherwise
120
+ * unresolvable.
121
+ */
122
+ function reclaimKeysFromStrings(keyStrings) {
123
+ const resolved = keyStrings.map(resolveReclaimKey);
124
+ if (resolved.some((b) => b === null) || resolved.length !== 3) {
125
+ return undefined;
126
+ }
127
+ return [resolved[0], resolved[1], resolved[2]];
128
+ }
129
+ /**
130
+ * Parse an sBTC peg-in deposit descriptor and return its components.
131
+ *
132
+ * Returns `null` if the descriptor does not match the expected
133
+ * `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
134
+ * as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
135
+ * sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
136
+ * bytes, threshold isn't 2).
137
+ *
138
+ * Accepts both the `Descriptor` WASM object (definite or derivable) and a
139
+ * pre-extracted `ast.DescriptorNode`
140
+ */
141
+ export function parseSbtcDepositDescriptor(descriptor) {
142
+ const pattern = {
143
+ tr: [UNSPENDABLE_INTERNAL_KEY, [{ $var: 'depositLeaf' }, { $var: 'reclaimLeaf' }]],
144
+ };
145
+ const matcher = new PatternMatcher();
146
+ const descriptorNode = descriptor instanceof Descriptor ? ast.fromDescriptor(descriptor) : descriptor;
147
+ const result = matcher.match(descriptorNode, pattern);
148
+ if (!result) {
149
+ return null;
150
+ }
151
+ const depositMiniscriptNode = result.depositLeaf;
152
+ let reclaimMiniscriptNode = result.reclaimLeaf;
153
+ const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher);
154
+ const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher);
155
+ const reclaimKeyStringsTuple = [
156
+ reclaimKeyStrings[0],
157
+ reclaimKeyStrings[1],
158
+ reclaimKeyStrings[2],
159
+ ];
160
+ const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings);
161
+ if (reclaimKeys) {
162
+ // Rewrite the reclaim leaf with concrete hex keys when we can resolve
163
+ // them — `Miniscript.fromString(..., 'tap')` only accepts x-only hex in
164
+ // `multi_a`, not xpub-form strings. With this rewrite the formatted
165
+ // leaf is directly compilable; without it callers must do the
166
+ // resolution themselves.
167
+ reclaimMiniscriptNode = {
168
+ and_v: [{ 'r:older': lockTime }, { multi_a: [2, ...reclaimKeys.map((k) => k.toString('hex'))] }],
169
+ };
170
+ }
171
+ return {
172
+ signersAggregateKey,
173
+ maxFee,
174
+ stacksRecipient,
175
+ lockTime,
176
+ reclaimKeys,
177
+ reclaimKeyStrings: reclaimKeyStringsTuple,
178
+ depositMiniscriptNode,
179
+ reclaimMiniscriptNode,
180
+ };
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUEyQzFHLFNBQVMsUUFBUSxDQUFDLENBQVUsRUFBRSxLQUFhO0lBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFT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QVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxtQkFBbUI7UUFDbkIsTUFBTTtRQUNOLGVBQWU7UUFDZixRQUFRO1FBQ1IsV0FBVztRQUNYLGlCQUFpQixFQUFFLHNCQUFzQjtRQUN6QyxxQkFBcUI7UUFDckIscUJBQXFCO0tBQ3RCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzIsIERlc2NyaXB0b3IsIGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgUGF0dGVybk1hdGNoZXIsIFBhdHRlcm4gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5cbmltcG9ydCB7IE1BWF9GRUVfQllURV9MRU5HVEgsIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEgsIFVOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBQYXJzZWQgY29tcG9uZW50cyBvZiBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IuXG4gKlxuICogVGhlIHBhcnNlciByZXR1cm5zIGJvdGggdGhlIGhpZ2gtbGV2ZWxcbiAqIGZpZWxkcyBjYWxsZXJzIHVzdWFsbHkgbmVlZCAoa2V5cywgbG9ja1RpbWUsIGZlZSwgcmVjaXBpZW50KSBhbmQgdGhlIHJhd1xuICogbWluaXNjcmlwdCBBU1Qgbm9kZXMgc28gdGhlIGxlYXZlcyBjYW4gYmUgcmUtY29tcGlsZWQgaW50byBhXG4gKiBgTWluaXNjcmlwdGAgdmlhIGBhc3QuZm9ybWF0Tm9kZWAgKyBgTWluaXNjcmlwdC5mcm9tU3RyaW5nYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yID0ge1xuICAvKiogMzItYnl0ZSB4LW9ubHkgc2lnbmVycyBhZ2dyZWdhdGUga2V5IGZyb20gdGhlIGRlcG9zaXQgbGVhZi4gKi9cbiAgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyO1xuICAvKiogTWF4IHNpZ25lciBmZWUgcGFyc2VkIGZyb20gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHBheWxvYWRfZHJvcCB2YWx1ZS4gKi9cbiAgbWF4RmVlOiBiaWdpbnQ7XG4gIC8qKiAyMi1ieXRlIFN0YWNrcyByZWNpcGllbnQgcGFyc2VkIGZyb20gdGhlIHRyYWlsaW5nIGJ5dGVzIG9mIHRoZSBwYXlsb2FkLiAqL1xuICBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlcjtcbiAgLyoqIFJlY2xhaW0tbGVhZiByZWxhdGl2ZSB0aW1lbG9jayAobnVtYmVyIG9mIEJpdGNvaW4gYmxvY2tzLCBPUF9DU1YgYXJndW1lbnQpLiAqL1xuICBsb2NrVGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRocmVlIGNvbmNyZXRlIHgtb25seSByZWNsYWltIGtleXMgZnJvbSB0aGUgcmVjbGFpbS1sZWFmIGBtdWx0aV9hYCxcbiAgICogaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluc2lkZSB0aGUgbGVhZiAoZGVzY3JpcHRvciBsaWJyYXJ5IHNvcnRzIGJ5IGhleCkuXG4gICAqIE9ubHkgcHJlc2VudCB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIGluIGl0cyBkZXJpdmVkL2RlZmluaXRlIGZvcm0g4oCUIGZvclxuICAgKiBkZXJpdmFibGUgZGVzY3JpcHRvcnMgdGhlIG11bHRpX2EgZW50cmllcyBhcmUgeHB1YiBzdHJpbmdzIChlLmcuXG4gICAqIGB4cHViLi4uLypgKSwgd2hpY2ggY2FuJ3QgYmUgdHVybmVkIGludG8gMzItYnl0ZSBidWZmZXJzIHdpdGhvdXQgcGlja2luZ1xuICAgKiBhIGRlcml2YXRpb24gaW5kZXguIENhbGxlcnMgdGhhdCBuZWVkIHJhdyBrZXkgYnl0ZXMgTVVTVCBwYXNzIHRoZVxuICAgKiBkZXJpdmVkIGRlc2NyaXB0b3IgKHNlZSBgZGVyaXZlUmVjbGFpbUtleXNgIGZvciBkZXJpdmFibGUgaW5wdXRzKS5cbiAgICovXG4gIHJlY2xhaW1LZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQ7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSBkZXBvc2l0IGxlYWYgKGZpcnN0IHRhcC10cmVlIGxlYWYpLiAqL1xuICBkZXBvc2l0TWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqIFJhdyBtaW5pc2NyaXB0IEFTVCBmb3IgdGhlIHJlY2xhaW0gbGVhZiAoc2Vjb25kIHRhcC10cmVlIGxlYWYpLiAqL1xuICByZWNsYWltTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSByYXcgYG11bHRpX2FgIGtleSBlbnRyaWVzIGZyb20gdGhlIHJlY2xhaW0gbGVhZiwgZXhhY3RseSBhc1xuICAgKiB0aGV5IGFwcGVhciBpbiB0aGUgZGVzY3JpcHRvciDigJQgYHhwdWIuLi4vKmAgZm9yIGRlcml2YWJsZSBkZXNjcmlwdG9ycyBhbmRcbiAgICogNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMgZm9yIGRlZmluaXRlIGRlc2NyaXB0b3JzLiBVc2VmdWwgZm9yIGNhbGxlcnMgdGhhdFxuICAgKiBuZWVkIHRoZSBvcmlnaW5hbCB4cHViIGZvcm0gKGUuZy4gdG8gcm91bmQtdHJpcCBiYWNrIHRvIGEgZGVzY3JpcHRvclxuICAgKiBidWlsZGVyKSBhbmQgZG9uJ3Qgd2FudCB0aGUgcmVzb2x2ZWQgYHJlY2xhaW1LZXlzYCBidWZmZXJzLlxuICAgKi9cbiAgcmVjbGFpbUtleVN0cmluZ3M6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXTtcbn07XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbi8qKlxuICogUHVsbCBgW3RocmVzaG9sZCwgLi4ua2V5c11gIG91dCBvZiBhIGBtdWx0aV9hYCBBU1Qgbm9kZSB2YWx1ZSwgdmFsaWRhdGluZ1xuICogZWFjaCBlbGVtZW50LiBUaGUgZGVzY3JpcHRvcidzIGBtdWx0aV9hYCBpcyByZW5kZXJlZCB3aXRoIGtleXMgZWl0aGVyIGFzXG4gKiBjb25jcmV0ZSBoZXggKGRlZmluaXRlIGRlc2NyaXB0b3IpIG9yIGFzIHhwdWIgc3RyaW5ncyBlbmRpbmcgaW4gYC8qYFxuICogKGRlcml2YWJsZSBkZXNjcmlwdG9yKSDigJQgYm90aCBhcmUgc3RyaW5ncyBoZXJlLCBzbyB3ZSBkb24ndCB0cnkgdG8gY29udmVydFxuICogdG8gQnVmZmVyIGF0IHRoaXMgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGkobXVsdGk6IHVua25vd24pOiBbbnVtYmVyLCBzdHJpbmdbXV0ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobXVsdGkpIHx8IG11bHRpLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbiBhcnJheSBvciBlbXB0eScpO1xuICB9XG4gIGNvbnN0IFt0aHJlc2hvbGQsIC4uLmtleXNdID0gbXVsdGk7XG4gIGlmICh0eXBlb2YgdGhyZXNob2xkICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogdGhyZXNob2xkIGlzIG5vdCBhIG51bWJlcicpO1xuICB9XG4gIGlmICgha2V5cy5ldmVyeSgoaykgPT4gdHlwZW9mIGsgPT09ICdzdHJpbmcnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogbm90IGFsbCBrZXlzIGFyZSBzdHJpbmdzJyk7XG4gIH1cbiAgcmV0dXJuIFt0aHJlc2hvbGQsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlcG9zaXRMZWFmKFxuICBkZXBvc2l0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBzaWduZXJzQWdncmVnYXRlS2V5OiBCdWZmZXI7IG1heEZlZTogYmlnaW50OyBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlciB9IHtcbiAgY29uc3QgZGVwb3NpdFBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFt7IHBheWxvYWRfZHJvcDogeyAkdmFyOiAncGF5bG9hZEhleCcgfSB9LCB7IHBrOiB7ICR2YXI6ICdzaWduZXJzS2V5JyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2goZGVwb3NpdE5vZGUsIGRlcG9zaXRQYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwb3NpdCBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWRIZXggPSBhc1N0cmluZyhtYXRjaC5wYXlsb2FkSGV4LCAncGF5bG9hZF9kcm9wIHZhbHVlJyk7XG4gIGNvbnN0IHNpZ25lcnNLZXlIZXggPSBhc1N0cmluZyhtYXRjaC5zaWduZXJzS2V5LCAncGtfayBrZXknKTtcblxuICBjb25zdCBleHBlY3RlZFBheWxvYWRMZW5ndGggPSBNQVhfRkVFX0JZVEVfTEVOR1RIICsgU1RBQ0tTX1JFQ0lQSUVOVF9CWVRFX0xFTkdUSDtcbiAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBheWxvYWRIZXgsICdoZXgnKTtcbiAgaWYgKHBheWxvYWQubGVuZ3RoICE9PSBleHBlY3RlZFBheWxvYWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcGF5bG9hZF9kcm9wIHZhbHVlIG11c3QgYmUgJHtleHBlY3RlZFBheWxvYWRMZW5ndGh9IGJ5dGVzICgke2V4cGVjdGVkUGF5bG9hZExlbmd0aCAqIDJ9IGhleCBjaGFycyksIGdvdCAke1xuICAgICAgICBwYXlsb2FkLmxlbmd0aFxuICAgICAgfSBieXRlc2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWF4RmVlID0gcGF5bG9hZC5yZWFkQmlnVUludDY0QkUoMCk7XG4gIGNvbnN0IHN0YWNrc1JlY2lwaWVudCA9IHBheWxvYWQuc3ViYXJyYXkoTUFYX0ZFRV9CWVRFX0xFTkdUSCk7XG5cbiAgY29uc3Qgc2lnbmVyc0FnZ3JlZ2F0ZUtleSA9IEJ1ZmZlci5mcm9tKHNpZ25lcnNLZXlIZXgsICdoZXgnKTtcbiAgaWYgKHNpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2lnbmVyc0FnZ3JlZ2F0ZUtleSBtdXN0IGJlIDMyIGJ5dGVzIHgtb25seSwgZ290ICR7c2lnbmVyc0FnZ3JlZ2F0ZUtleS5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY2xhaW1MZWFmKFxuICByZWNsYWltTm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBsb2NrVGltZTogbnVtYmVyOyByZWNsYWltS2V5U3RyaW5nczogc3RyaW5nW10gfSB7XG4gIC8vIGFuZF92KHI6b2xkZXIoPGxvY2tUaW1lPiksIG11bHRpX2EoMiwgazEsIGsyLCBrMykpXG4gIGNvbnN0IHJlY2xhaW1QYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyAncjpvbGRlcic6IHsgJHZhcjogJ2xvY2tUaW1lJyB9IH0sIHsgbXVsdGlfYTogeyAkdmFyOiAncmVjbGFpbU11bHRpJyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2gocmVjbGFpbU5vZGUsIHJlY2xhaW1QYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVjbGFpbSBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IGxvY2tUaW1lID0gYXNOdW1iZXIobWF0Y2gubG9ja1RpbWUsICdyOm9sZGVyIGFyZ3VtZW50Jyk7XG4gIGlmIChsb2NrVGltZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIGxvY2tUaW1lIG11c3QgYmUgPiAwLCBnb3QgJHtsb2NrVGltZX1gKTtcbiAgfVxuXG4gIGNvbnN0IFt0aHJlc2hvbGQsIHJlY2xhaW1LZXlTdHJpbmdzXSA9IHBhcnNlTXVsdGkobWF0Y2gucmVjbGFpbU11bHRpKTtcbiAgaWYgKHRocmVzaG9sZCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIHRocmVzaG9sZCBtdXN0IGJlIDIsIGdvdCAke3RocmVzaG9sZH1gKTtcbiAgfVxuICBpZiAocmVjbGFpbUtleVN0cmluZ3MubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIG11bHRpX2EgbXVzdCBoYXZlIGV4YWN0bHkgMyBrZXlzLCBnb3QgJHtyZWNsYWltS2V5U3RyaW5ncy5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBsb2NrVGltZSwgcmVjbGFpbUtleVN0cmluZ3MgfTtcbn1cblxuY29uc3QgSEVYX1hfT05MWV9LRVkgPSAvXlswLTlhLWZBLUZdezY0fSQvO1xuY29uc3QgWFBVQl9XSVRIX0lOREVYID0gL14oWzEtOUEtSEotTlAtWmEta20tel0rKVxcLyhcXGQrKSQvO1xuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgYG11bHRpX2FgIGtleSBlbnRyeSB0byBhIDMyLWJ5dGUgeC1vbmx5IHB1YmxpYyBrZXkuXG4gKlxuICogQWNjZXB0czpcbiAqICAgLSA2NC1oZXgtY2hhciBzdHJpbmcg4oaSIHJldHVybmVkIGFzLWlzIChhbHJlYWR5IHgtb25seSlcbiAqICAgLSBgeHB1Yi4uLi88aW5kZXg+YCDihpIgQklQMzItZGVyaXZlIGF0IHRoYXQgaW5kZXggYW5kIGRyb3AgdGhlIHByZWZpeCBieXRlXG4gKlxuICogUmV0dXJucyBudWxsIGZvciBhbnkgb3RoZXIgc2hhcGUgKGUuZy4gd2lsZGNhcmQgYHhwdWIuLi4vKmAsIG1hbGZvcm1lZCBpbnB1dCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWNsYWltS2V5KHM6IHN0cmluZyk6IEJ1ZmZlciB8IG51bGwge1xuICBpZiAoSEVYX1hfT05MWV9LRVkudGVzdChzKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzLCAnaGV4Jyk7XG4gIH1cbiAgY29uc3QgbSA9IHMubWF0Y2goWFBVQl9XSVRIX0lOREVYKTtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgWywgeHB1YiwgaW5kZXhTdHJdID0gbTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpIHx8IGluZGV4IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCBub2RlO1xuICB0cnkge1xuICAgIG5vZGUgPSBCSVAzMi5mcm9tQmFzZTU4KHhwdWIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBCSVAzMiBwdWJsaWMga2V5IGlzIDMzIGJ5dGVzICgxIHByZWZpeCArIDMyIHgtb25seSkuIERyb3AgdGhlIHByZWZpeC5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5vZGUuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkuc3ViYXJyYXkoMSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgcmVjbGFpbS1sZWFmIGtleSBzdHJpbmdzIGludG8gMzItYnl0ZSB4LW9ubHkgYnVmZmVycy4gQWNjZXB0cyBib3RoXG4gKiB0aGUgZGVmaW5pdGUvZGVyaXZlZCBmb3JtIChjb25jcmV0ZSA2NC1oZXgtY2hhciB4LW9ubHkga2V5cykgYW5kIHRoZSBmb3JtXG4gKiBwcm9kdWNlZCBieSBgRGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleChuKWAgKGB4cHViLi4uLzxuPmApLiBSZXR1cm5zXG4gKiB1bmRlZmluZWQgaWYgYW55IGVudHJ5IGlzIHN0aWxsIHdpbGRjYXJkIChgeHB1Yi4uLi8qYCkgb3Igb3RoZXJ3aXNlXG4gKiB1bnJlc29sdmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlY2xhaW1LZXlzRnJvbVN0cmluZ3Moa2V5U3RyaW5nczogc3RyaW5nW10pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IGtleVN0cmluZ3MubWFwKHJlc29sdmVSZWNsYWltS2V5KTtcbiAgaWYgKHJlc29sdmVkLnNvbWUoKGIpID0+IGIgPT09IG51bGwpIHx8IHJlc29sdmVkLmxlbmd0aCAhPT0gMykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIFtyZXNvbHZlZFswXSBhcyBCdWZmZXIsIHJlc29sdmVkWzFdIGFzIEJ1ZmZlciwgcmVzb2x2ZWRbMl0gYXMgQnVmZmVyXTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IgYW5kIHJldHVybiBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWRcbiAqIGB0cig8VU5TUEVOREFCTEU+LCB7PGRlcG9zaXRMZWFmPiwgPHJlY2xhaW1MZWFmPn0pYCBzaGFwZSDigJQgc2FtZSBjb252ZW50aW9uXG4gKiBhcyBiYWJ5bG9uJ3MgYHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3JgLiBUaHJvd3MgaWYgdGhlIHNoYXBlIG1hdGNoZXMgYnV0IGFcbiAqIHN1Yi1maWVsZCBpcyBtYWxmb3JtZWQgKGUuZy4gc2lnbmVycyBrZXkgaXNuJ3QgMzIgYnl0ZXMsIHBheWxvYWQgaXNuJ3QgMzBcbiAqIGJ5dGVzLCB0aHJlc2hvbGQgaXNuJ3QgMikuXG4gKlxuICogQWNjZXB0cyBib3RoIHRoZSBgRGVzY3JpcHRvcmAgV0FTTSBvYmplY3QgKGRlZmluaXRlIG9yIGRlcml2YWJsZSkgYW5kIGFcbiAqIHByZS1leHRyYWN0ZWQgYGFzdC5EZXNjcmlwdG9yTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2J0Y0RlcG9zaXREZXNjcmlwdG9yKFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBQYXJzZWRTYnRjRGVwb3NpdERlc2NyaXB0b3IgfCBudWxsIHtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICB0cjogW1VOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSwgW3sgJHZhcjogJ2RlcG9zaXRMZWFmJyB9LCB7ICR2YXI6ICdyZWNsYWltTGVhZicgfV1dLFxuICB9O1xuXG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHBhdHRlcm4pO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkZXBvc2l0TWluaXNjcmlwdE5vZGUgPSByZXN1bHQuZGVwb3NpdExlYWYgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBsZXQgcmVjbGFpbU1pbmlzY3JpcHROb2RlID0gcmVzdWx0LnJlY2xhaW1MZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcblxuICBjb25zdCB7IHNpZ25lcnNBZ2dyZWdhdGVLZXksIG1heEZlZSwgc3RhY2tzUmVjaXBpZW50IH0gPSBwYXJzZURlcG9zaXRMZWFmKGRlcG9zaXRNaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH0gPSBwYXJzZVJlY2xhaW1MZWFmKHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGU6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFtcbiAgICByZWNsYWltS2V5U3RyaW5nc1swXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1sxXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1syXSxcbiAgXTtcblxuICBjb25zdCByZWNsYWltS2V5cyA9IHJlY2xhaW1LZXlzRnJvbVN0cmluZ3MocmVjbGFpbUtleVN0cmluZ3MpO1xuICBpZiAocmVjbGFpbUtleXMpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSByZWNsYWltIGxlYWYgd2l0aCBjb25jcmV0ZSBoZXgga2V5cyB3aGVuIHdlIGNhbiByZXNvbHZlXG4gICAgLy8gdGhlbSDigJQgYE1pbmlzY3JpcHQuZnJvbVN0cmluZyguLi4sICd0YXAnKWAgb25seSBhY2NlcHRzIHgtb25seSBoZXggaW5cbiAgICAvLyBgbXVsdGlfYWAsIG5vdCB4cHViLWZvcm0gc3RyaW5ncy4gV2l0aCB0aGlzIHJld3JpdGUgdGhlIGZvcm1hdHRlZFxuICAgIC8vIGxlYWYgaXMgZGlyZWN0bHkgY29tcGlsYWJsZTsgd2l0aG91dCBpdCBjYWxsZXJzIG11c3QgZG8gdGhlXG4gICAgLy8gcmVzb2x1dGlvbiB0aGVtc2VsdmVzLlxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHtcbiAgICAgIGFuZF92OiBbeyAncjpvbGRlcic6IGxvY2tUaW1lIH0sIHsgbXVsdGlfYTogWzIsIC4uLnJlY2xhaW1LZXlzLm1hcCgoaykgPT4gay50b1N0cmluZygnaGV4JykpXSB9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaWduZXJzQWdncmVnYXRlS2V5LFxuICAgIG1heEZlZSxcbiAgICBzdGFja3NSZWNpcGllbnQsXG4gICAgbG9ja1RpbWUsXG4gICAgcmVjbGFpbUtleXMsXG4gICAgcmVjbGFpbUtleVN0cmluZ3M6IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGUsXG4gICAgZGVwb3NpdE1pbmlzY3JpcHROb2RlLFxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo-beta/utxo-descriptors",
3
- "version": "0.0.1-beta.3",
3
+ "version": "0.0.1-beta.300",
4
4
  "description": "BitGo SDK for building UTXO descriptors",
5
5
  "main": "./dist/cjs/src/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -37,7 +37,7 @@
37
37
  "author": "BitGo SDK Team <sdkteam@bitgo.com>",
38
38
  "license": "MIT",
39
39
  "engines": {
40
- "node": ">=20"
40
+ "node": ">=22"
41
41
  },
42
42
  "repository": {
43
43
  "type": "git",
@@ -59,8 +59,11 @@
59
59
  ]
60
60
  },
61
61
  "dependencies": {
62
- "@bitgo-beta/utxo-core": "1.8.1-beta.864",
63
- "@bitgo/wasm-utxo": "^4.11.0"
62
+ "@bitgo-beta/utxo-core": "1.8.1-beta.1167",
63
+ "@bitgo/wasm-utxo": "^5.3.0"
64
64
  },
65
- "gitHead": "e06cc516f316cab9b3aa1bbbb462391df5843f24"
65
+ "devDependencies": {
66
+ "@stacks/bitcoin-staking": "7.6.0"
67
+ },
68
+ "gitHead": "aa87cf8aeeb60435e7a423a6761ebede610f286c"
66
69
  }