diff --git a/modules/abstract-utxo/package.json b/modules/abstract-utxo/package.json index 5f3c80c40c..6040405f2b 100644 --- a/modules/abstract-utxo/package.json +++ b/modules/abstract-utxo/package.json @@ -66,7 +66,7 @@ "@bitgo/utxo-core": "^1.37.1", "@bitgo/utxo-lib": "^11.22.1", "@bitgo/utxo-ord": "^1.30.1", - "@bitgo/wasm-utxo": "^4.8.0", + "@bitgo/wasm-utxo": "^4.13.0", "@types/lodash": "^4.14.121", "@types/superagent": "4.1.15", "bignumber.js": "^9.0.2", diff --git a/modules/utxo-bin/package.json b/modules/utxo-bin/package.json index ac18dfbd1f..272d74d6b8 100644 --- a/modules/utxo-bin/package.json +++ b/modules/utxo-bin/package.json @@ -31,7 +31,7 @@ "@bitgo/unspents": "^0.51.4", "@bitgo/utxo-core": "^1.37.1", "@bitgo/utxo-lib": "^11.22.1", - "@bitgo/wasm-utxo": "^4.8.0", + "@bitgo/wasm-utxo": "^4.13.0", "@noble/curves": "1.8.1", "archy": "^1.0.0", "bech32": "^2.0.0", diff --git a/modules/utxo-core/package.json b/modules/utxo-core/package.json index 457d8a5d5d..8af9f97e82 100644 --- a/modules/utxo-core/package.json +++ b/modules/utxo-core/package.json @@ -81,7 +81,7 @@ "@bitgo/secp256k1": "^1.11.0", "@bitgo/unspents": "^0.51.4", "@bitgo/utxo-lib": "^11.22.1", - "@bitgo/wasm-utxo": "^4.8.0", + "@bitgo/wasm-utxo": "^4.13.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", "fast-sha256": "^1.3.0" }, diff --git a/modules/utxo-descriptors/package.json b/modules/utxo-descriptors/package.json index 8c935d469b..53f1a9e305 100644 --- a/modules/utxo-descriptors/package.json +++ b/modules/utxo-descriptors/package.json @@ -60,6 +60,6 @@ }, "dependencies": { "@bitgo/utxo-core": "^1.37.1", - "@bitgo/wasm-utxo": "^4.11.0" + "@bitgo/wasm-utxo": "^4.13.0" } } diff --git a/modules/utxo-descriptors/src/sbtc/index.ts b/modules/utxo-descriptors/src/sbtc/index.ts index 8e54e9ece3..57a2dc63f7 100644 --- a/modules/utxo-descriptors/src/sbtc/index.ts +++ b/modules/utxo-descriptors/src/sbtc/index.ts @@ -1,3 +1,4 @@ export * from './constants'; export * from './descriptor'; export * from './depositAddress'; +export * from './parseDescriptor'; diff --git a/modules/utxo-descriptors/src/sbtc/parseDescriptor.ts b/modules/utxo-descriptors/src/sbtc/parseDescriptor.ts new file mode 100644 index 0000000000..b88a1f6f07 --- /dev/null +++ b/modules/utxo-descriptors/src/sbtc/parseDescriptor.ts @@ -0,0 +1,243 @@ +import { BIP32, Descriptor, ast } from '@bitgo/wasm-utxo'; +import { PatternMatcher, Pattern } from '@bitgo/utxo-core/descriptor'; + +import { MAX_FEE_BYTE_LENGTH, STACKS_RECIPIENT_BYTE_LENGTH, UNSPENDABLE_INTERNAL_KEY } from './constants'; + +/** + * Parsed components of an sBTC peg-in deposit descriptor. + * + * The parser returns both the high-level + * fields callers usually need (keys, lockTime, fee, recipient) and the raw + * miniscript AST nodes so the leaves can be re-compiled into a + * `Miniscript` via `ast.formatNode` + `Miniscript.fromString`. + */ +export type ParsedSbtcDepositDescriptor = { + /** 32-byte x-only signers aggregate key from the deposit leaf. */ + signersAggregateKey: Buffer; + /** Max signer fee parsed from the first 8 bytes of the payload_drop value. */ + maxFee: bigint; + /** 22-byte Stacks recipient parsed from the trailing bytes of the payload. */ + stacksRecipient: Buffer; + /** Reclaim-leaf relative timelock (number of Bitcoin blocks, OP_CSV argument). */ + lockTime: number; + /** + * The three concrete x-only reclaim keys from the reclaim-leaf `multi_a`, + * in the order they appear inside the leaf (descriptor library sorts by hex). + * Only present when the descriptor is in its derived/definite form — for + * derivable descriptors the multi_a entries are xpub strings (e.g. + * `xpub.../*`), which can't be turned into 32-byte buffers without picking + * a derivation index. Callers that need raw key bytes MUST pass the + * derived descriptor (see `deriveReclaimKeys` for derivable inputs). + */ + reclaimKeys: [Buffer, Buffer, Buffer] | undefined; + /** Raw miniscript AST for the deposit leaf (first tap-tree leaf). */ + depositMiniscriptNode: ast.MiniscriptNode; + /** Raw miniscript AST for the reclaim leaf (second tap-tree leaf). */ + reclaimMiniscriptNode: ast.MiniscriptNode; +}; + +function asString(v: unknown, field: string): string { + if (typeof v !== 'string') { + throw new Error(`${field} must be a string`); + } + return v; +} + +function asNumber(v: unknown, field: string): number { + if (typeof v !== 'number') { + throw new Error(`${field} must be a number`); + } + return v; +} + +/** + * Pull `[threshold, ...keys]` out of a `multi_a` AST node value, validating + * each element. The descriptor's `multi_a` is rendered with keys either as + * concrete hex (definite descriptor) or as xpub strings ending in `/*` + * (derivable descriptor) — both are strings here, so we don't try to convert + * to Buffer at this level. + */ +function parseMulti(multi: unknown): [number, string[]] { + if (!Array.isArray(multi) || multi.length < 1) { + throw new Error('Invalid multi_a structure: not an array or empty'); + } + const [threshold, ...keys] = multi; + if (typeof threshold !== 'number') { + throw new Error('Invalid multi_a structure: threshold is not a number'); + } + if (!keys.every((k) => typeof k === 'string')) { + throw new Error('Invalid multi_a structure: not all keys are strings'); + } + return [threshold, keys]; +} + +function parseDepositLeaf( + depositNode: ast.MiniscriptNode, + matcher: PatternMatcher +): { signersAggregateKey: Buffer; maxFee: bigint; stacksRecipient: Buffer } { + const depositPattern: Pattern = { + and_v: [{ payload_drop: { $var: 'payloadHex' } }, { pk: { $var: 'signersKey' } }], + }; + const match = matcher.match(depositNode, depositPattern); + if (!match) { + throw new Error('Deposit leaf does not match expected pattern'); + } + + const payloadHex = asString(match.payloadHex, 'payload_drop value'); + const signersKeyHex = asString(match.signersKey, 'pk_k key'); + + const expectedPayloadLength = MAX_FEE_BYTE_LENGTH + STACKS_RECIPIENT_BYTE_LENGTH; + const payload = Buffer.from(payloadHex, 'hex'); + if (payload.length !== expectedPayloadLength) { + throw new Error( + `payload_drop value must be ${expectedPayloadLength} bytes (${expectedPayloadLength * 2} hex chars), got ${ + payload.length + } bytes` + ); + } + + const maxFee = payload.readBigUInt64BE(0); + const stacksRecipient = payload.subarray(MAX_FEE_BYTE_LENGTH); + + const signersAggregateKey = Buffer.from(signersKeyHex, 'hex'); + if (signersAggregateKey.length !== 32) { + throw new Error(`signersAggregateKey must be 32 bytes x-only, got ${signersAggregateKey.length}`); + } + + return { signersAggregateKey, maxFee, stacksRecipient }; +} + +function parseReclaimLeaf( + reclaimNode: ast.MiniscriptNode, + matcher: PatternMatcher +): { lockTime: number; reclaimKeyStrings: string[] } { + // and_v(r:older(), multi_a(2, k1, k2, k3)) + const reclaimPattern: Pattern = { + and_v: [{ 'r:older': { $var: 'lockTime' } }, { multi_a: { $var: 'reclaimMulti' } }], + }; + const match = matcher.match(reclaimNode, reclaimPattern); + if (!match) { + throw new Error('Reclaim leaf does not match expected pattern'); + } + + const lockTime = asNumber(match.lockTime, 'r:older argument'); + if (lockTime <= 0) { + throw new Error(`reclaim lockTime must be > 0, got ${lockTime}`); + } + + const [threshold, reclaimKeyStrings] = parseMulti(match.reclaimMulti); + if (threshold !== 2) { + throw new Error(`reclaim multi_a threshold must be 2, got ${threshold}`); + } + if (reclaimKeyStrings.length !== 3) { + throw new Error(`reclaim multi_a must have exactly 3 keys, got ${reclaimKeyStrings.length}`); + } + + return { lockTime, reclaimKeyStrings }; +} + +const HEX_X_ONLY_KEY = /^[0-9a-fA-F]{64}$/; +const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/; + +/** + * Resolve a single `multi_a` key entry to a 32-byte x-only public key. + * + * Accepts: + * - 64-hex-char string → returned as-is (already x-only) + * - `xpub.../` → BIP32-derive at that index and drop the prefix byte + * + * Returns null for any other shape (e.g. wildcard `xpub.../*`, malformed input). + */ +function resolveReclaimKey(s: string): Buffer | null { + if (HEX_X_ONLY_KEY.test(s)) { + return Buffer.from(s, 'hex'); + } + const m = s.match(XPUB_WITH_INDEX); + if (!m) { + return null; + } + const [, xpub, indexStr] = m; + const index = Number.parseInt(indexStr, 10); + if (!Number.isFinite(index) || index < 0) { + return null; + } + let node; + try { + node = BIP32.fromBase58(xpub); + } catch { + return null; + } + // BIP32 public key is 33 bytes (1 prefix + 32 x-only). Drop the prefix. + return Buffer.from(node.derive(index).publicKey.subarray(1)); +} + +/** + * Convert reclaim-leaf key strings into 32-byte x-only buffers. Accepts both + * the definite/derived form (concrete 64-hex-char x-only keys) and the form + * produced by `Descriptor.atDerivationIndex(n)` (`xpub.../`). Returns + * undefined if any entry is still wildcard (`xpub.../*`) or otherwise + * unresolvable. + */ +function reclaimKeysFromStrings(keyStrings: string[]): [Buffer, Buffer, Buffer] | undefined { + const resolved = keyStrings.map(resolveReclaimKey); + if (resolved.some((b) => b === null) || resolved.length !== 3) { + return undefined; + } + return [resolved[0] as Buffer, resolved[1] as Buffer, resolved[2] as Buffer]; +} + +/** + * Parse an sBTC peg-in deposit descriptor and return its components. + * + * Returns `null` if the descriptor does not match the expected + * `tr(, {, })` shape — same convention + * as babylon's `parseStakingDescriptor`. Throws if the shape matches but a + * sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30 + * bytes, threshold isn't 2). + * + * Accepts both the `Descriptor` WASM object (definite or derivable) and a + * pre-extracted `ast.DescriptorNode` + */ +export function parseSbtcDepositDescriptor( + descriptor: Descriptor | ast.DescriptorNode +): ParsedSbtcDepositDescriptor | null { + const pattern: Pattern = { + tr: [UNSPENDABLE_INTERNAL_KEY, [{ $var: 'depositLeaf' }, { $var: 'reclaimLeaf' }]], + }; + + const matcher = new PatternMatcher(); + const descriptorNode = descriptor instanceof Descriptor ? ast.fromDescriptor(descriptor) : descriptor; + const result = matcher.match(descriptorNode, pattern); + + if (!result) { + return null; + } + + const depositMiniscriptNode = result.depositLeaf as ast.MiniscriptNode; + let reclaimMiniscriptNode = result.reclaimLeaf as ast.MiniscriptNode; + + const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher); + const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher); + + const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings); + if (reclaimKeys) { + // Rewrite the reclaim leaf with concrete hex keys when we can resolve + // them — `Miniscript.fromString(..., 'tap')` only accepts x-only hex in + // `multi_a`, not xpub-form strings. With this rewrite the formatted + // leaf is directly compilable; without it callers must do the + // resolution themselves. + reclaimMiniscriptNode = { + and_v: [{ 'r:older': lockTime }, { multi_a: [2, ...reclaimKeys.map((k) => k.toString('hex'))] }], + }; + } + + return { + signersAggregateKey, + maxFee, + stacksRecipient, + lockTime, + reclaimKeys, + depositMiniscriptNode, + reclaimMiniscriptNode, + }; +} diff --git a/modules/utxo-descriptors/test/unit/sbtc/parseDescriptor.ts b/modules/utxo-descriptors/test/unit/sbtc/parseDescriptor.ts new file mode 100644 index 0000000000..63cf09097b --- /dev/null +++ b/modules/utxo-descriptors/test/unit/sbtc/parseDescriptor.ts @@ -0,0 +1,186 @@ +import * as assert from 'assert'; + +import { ast, bip32, Descriptor, Miniscript } from '@bitgo/wasm-utxo'; +import { getKeyTriple } from '@bitgo/wasm-utxo/testutils'; + +import { + createSbtcDepositDescriptor, + DEFAULT_MAX_SIGNER_FEE, + DEFAULT_RECLAIM_LOCK_TIME, + encodeDepositPayload, + parseSbtcDepositDescriptor, + SbtcDepositDescriptorParams, + STACKS_RECIPIENT_BYTE_LENGTH, + UNSPENDABLE_INTERNAL_KEY, +} from '../../../src/sbtc'; + +type BIP32Interface = bip32.BIP32Interface; + +const SIGNERS_AGGREGATE_KEY = Buffer.from('c9c2312ca406dcb8eed50b829b5292f5fb3e846db0a556af61cc53834ce75421', 'hex'); +const STACKS_RECIPIENT = Buffer.from('05' + '16' + '6d'.repeat(20), 'hex'); + +function getBip32Triple(): [BIP32Interface, BIP32Interface, BIP32Interface] { + const [user, backup, bitgo] = getKeyTriple('default'); + return [user, backup, bitgo]; +} + +function buildParams(overrides: Partial = {}): SbtcDepositDescriptorParams { + return { + walletKeys: getBip32Triple(), + lockTime: DEFAULT_RECLAIM_LOCK_TIME, + maxFee: DEFAULT_MAX_SIGNER_FEE, + stacksRecipient: STACKS_RECIPIENT, + signersAggregateKey: SIGNERS_AGGREGATE_KEY, + ...overrides, + }; +} + +describe('parseSbtcDepositDescriptor', function () { + describe('definite descriptor (concrete x-only reclaim keys)', function () { + const reclaimKeyHex: [string, string, string] = [ + '4d838759b2a74616a2298e0580ca815874f5e5a9d2dd1b2f0203b68c66fc6c1e', + '639779c4b700dc51ece012a0e20325fcafada22a4a122ffaa04d0c0ccae83943', + 'd1d6084eac98303e9d28e082bfd9eadf0b8be033e223a17ad01df81bdaa8c7b2', + ]; + const reclaimKeys: [Buffer, Buffer, Buffer] = [ + Buffer.from(reclaimKeyHex[0], 'hex'), + Buffer.from(reclaimKeyHex[1], 'hex'), + Buffer.from(reclaimKeyHex[2], 'hex'), + ]; + const params: SbtcDepositDescriptorParams = { + walletKeys: reclaimKeys, + lockTime: 144, + maxFee: 80_000, + stacksRecipient: STACKS_RECIPIENT, + signersAggregateKey: SIGNERS_AGGREGATE_KEY, + }; + const descriptor = Descriptor.fromString(createSbtcDepositDescriptor(params), 'definite'); + + it('round-trips all high-level fields', function () { + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + assert.deepStrictEqual(parsed.signersAggregateKey, SIGNERS_AGGREGATE_KEY); + assert.strictEqual(parsed.maxFee, 80_000n); + assert.deepStrictEqual(parsed.stacksRecipient, STACKS_RECIPIENT); + assert.strictEqual(parsed.lockTime, 144); + }); + + it('returns reclaim keys as 32-byte buffers in the descriptor order', function () { + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + assert.ok(parsed.reclaimKeys); + // multi_a sorts keys by hex; verify the parser returns whatever order + // the descriptor library produced rather than the original input order. + const sortedInput = [...reclaimKeyHex].sort().map((k) => Buffer.from(k, 'hex')); + assert.deepStrictEqual(parsed.reclaimKeys, sortedInput); + }); + + it('returns miniscript AST nodes for both leaves', function () { + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + const payloadHex = encodeDepositPayload(params.maxFee, params.stacksRecipient).toString('hex'); + assert.deepStrictEqual(parsed.depositMiniscriptNode, { + and_v: [{ payload_drop: payloadHex }, { pk: SIGNERS_AGGREGATE_KEY.toString('hex') }], + } as unknown as ast.MiniscriptNode); + // r:older + multi_a must be present and correctly ordered in the AST. + assert.deepStrictEqual(parsed.reclaimMiniscriptNode, { + and_v: [{ 'r:older': 144 }, { multi_a: [2, ...[...reclaimKeyHex].sort()] }], + }); + }); + }); + + describe('derivable descriptor (xpub/* reclaim keys)', function () { + const params = buildParams(); + const descriptor = Descriptor.fromString(createSbtcDepositDescriptor(params), 'derivable'); + + it('round-trips lockTime, maxFee, recipient, and signers key', function () { + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + assert.deepStrictEqual(parsed.signersAggregateKey, SIGNERS_AGGREGATE_KEY); + assert.strictEqual(parsed.maxFee, BigInt(DEFAULT_MAX_SIGNER_FEE)); + assert.deepStrictEqual(parsed.stacksRecipient, STACKS_RECIPIENT); + assert.strictEqual(parsed.lockTime, DEFAULT_RECLAIM_LOCK_TIME); + }); + + it('returns reclaimKeys=undefined for derivable inputs', function () { + // Derivable descriptors render multi_a entries as `xpub.../*`, not as + // 32-byte hex — they can't be reduced to bytes without picking an index. + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + assert.strictEqual(parsed.reclaimKeys, undefined); + }); + + it('resolves to concrete reclaim keys after atDerivationIndex(0) and compiles to a tap Miniscript', function () { + assert.strictEqual(descriptor.hasWildcard(), true); + const derivedZero = descriptor.atDerivationIndex(0); + const derivedOne = descriptor.atDerivationIndex(1); + assert.strictEqual(derivedZero.hasWildcard(), false); + + const parsedZero = parseSbtcDepositDescriptor(derivedZero); + assert.ok(parsedZero); + assert.ok(parsedZero.reclaimKeys); + for (const k of parsedZero.reclaimKeys) { + assert.strictEqual(k.length, 32, `expected 32-byte x-only key, got ${k.length}`); + } + // Deposit-leaf fields are derivation-independent. + assert.deepStrictEqual(parsedZero.signersAggregateKey, SIGNERS_AGGREGATE_KEY); + assert.strictEqual(parsedZero.lockTime, DEFAULT_RECLAIM_LOCK_TIME); + + const parsedOne = parseSbtcDepositDescriptor(derivedOne); + assert.ok(parsedOne?.reclaimKeys); + assert.notDeepStrictEqual(parsedZero.reclaimKeys, parsedOne.reclaimKeys); + + // The rewritten reclaim leaf carries concrete hex in multi_a, so the + // formatted string compiles as a tap-context Miniscript. `fromStringExt` + // is required because the leaf contains the `r:older` (drop) wrapper. + const reclaimMs = Miniscript.fromStringExt(ast.formatNode(parsedZero.reclaimMiniscriptNode), 'tap', {}); + assert.ok(reclaimMs); + }); + }); + + describe('rejection paths', function () { + const params = buildParams(); + const descriptor = Descriptor.fromString(createSbtcDepositDescriptor(params), 'derivable'); + + it('returns null for a non-sBTC descriptor', function () { + const wpkhDescriptor = Descriptor.fromString(`wpkh(${getBip32Triple()[0].neutered().toBase58()}/*)`, 'derivable'); + assert.strictEqual(parseSbtcDepositDescriptor(wpkhDescriptor), null); + }); + + it('returns null for a tr() that has a different internal key', function () { + // Swap UNSPENDABLE for an arbitrary 32-byte key — pattern match must + // require the canonical unspendable point, not just any tr(). + const tampered = createSbtcDepositDescriptor(buildParams()).replace(UNSPENDABLE_INTERNAL_KEY, 'a'.repeat(64)); + const node = ast.fromDescriptor(Descriptor.fromString(tampered, 'derivable')); + assert.strictEqual(parseSbtcDepositDescriptor(node), null); + }); + + it('accepts a pre-extracted ast.DescriptorNode', function () { + const node = ast.fromDescriptor(descriptor); + const parsed = parseSbtcDepositDescriptor(node); + assert.ok(parsed); + assert.strictEqual(parsed.lockTime, DEFAULT_RECLAIM_LOCK_TIME); + }); + }); + + describe('parameter round-trip', function () { + it('extracts the same maxFee and recipient that encodeDepositPayload produced', function () { + const recipient = Buffer.alloc(STACKS_RECIPIENT_BYTE_LENGTH, 0x11); + const params = buildParams({ maxFee: 12345n, stacksRecipient: recipient }); + const descriptor = Descriptor.fromString(createSbtcDepositDescriptor(params), 'derivable'); + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + assert.strictEqual(parsed.maxFee, 12345n); + assert.deepStrictEqual(parsed.stacksRecipient, recipient); + }); + + it('accepts the full unsigned 64-bit maxFee range', function () { + const max = 0xffffffffffffffffn; + const params = buildParams({ maxFee: max }); + const descriptor = Descriptor.fromString(createSbtcDepositDescriptor(params), 'derivable'); + const parsed = parseSbtcDepositDescriptor(descriptor); + assert.ok(parsed); + assert.strictEqual(parsed.maxFee, max); + }); + }); +}); diff --git a/modules/utxo-ord/package.json b/modules/utxo-ord/package.json index 1903440683..612e3dc04f 100644 --- a/modules/utxo-ord/package.json +++ b/modules/utxo-ord/package.json @@ -45,7 +45,7 @@ "directory": "modules/utxo-ord" }, "dependencies": { - "@bitgo/wasm-utxo": "^4.8.0" + "@bitgo/wasm-utxo": "^4.13.0" }, "devDependencies": { "@bitgo/utxo-lib": "^11.22.1" diff --git a/modules/utxo-staking/package.json b/modules/utxo-staking/package.json index cb709ce2d0..1535c8ccba 100644 --- a/modules/utxo-staking/package.json +++ b/modules/utxo-staking/package.json @@ -63,7 +63,7 @@ "@bitgo/babylonlabs-io-btc-staking-ts": "^3.5.0", "@bitgo/utxo-core": "^1.37.1", "@bitgo/utxo-lib": "^11.22.1", - "@bitgo/wasm-utxo": "^4.8.0", + "@bitgo/wasm-utxo": "^4.13.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", "bip322-js": "^2.0.0", "bitcoinjs-lib": "^6.1.7", diff --git a/package.json b/package.json index 8e851dea32..ff1a88809c 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,9 @@ "picomatch": ">=2.3.2", "fast-uri": "3.1.2", "@babel/plugin-transform-modules-systemjs": "7.29.4", - "protobufjs": "7.5.8" + "protobufjs": "7.5.8", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/inquire": "1.1.0" }, "workspaces": [ "modules/*" diff --git a/yarn.lock b/yarn.lock index 8cfda1d959..19a1ce4106 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1094,15 +1094,10 @@ resolved "https://registry.npmjs.org/@bitgo/wasm-ton/-/wasm-ton-1.1.1.tgz" integrity sha512-Y4x2V2ZcYWlmx42v7dlrKDtT2DuUt8smk8E98mh7RhpiifJhLk2v5RmXDwBl0A3v9TzUOU6qMOnSS/iZ8Pq52w== -"@bitgo/wasm-utxo@^4.11.0": - version "4.11.0" - resolved "https://registry.npmjs.org/@bitgo/wasm-utxo/-/wasm-utxo-4.11.0.tgz#52869d01637f34b8d3c1f6fb14a970050a51e6cb" - integrity sha512-U7OC42t+lm72kByRRjaZBYvIy3wsqbIxUga5Jo63ubxXNhzXe4ZyMUI+wzGnPo3IWyFPIkK96ABNKkzFIBrH3A== - -"@bitgo/wasm-utxo@^4.8.0": - version "4.8.0" - resolved "https://registry.npmjs.org/@bitgo/wasm-utxo/-/wasm-utxo-4.8.0.tgz#744b20d239e5430402d61bd4ba7b1fbd77cc9ff3" - integrity sha512-FV4ll1nAiR8RKtkJAsjauz+bmcllDuo8Cx0aFTbnS+0yKQAGQCjc9AJXW9CvZC65fi1dTj9+hmcLugWrQ0h92A== +"@bitgo/wasm-utxo@^4.13.0": + version "4.13.0" + resolved "https://registry.npmjs.org/@bitgo/wasm-utxo/-/wasm-utxo-4.13.0.tgz#95efb853e40b30c6525cbf99a05f1a4db4161609" + integrity sha512-/jejFe7o/KJ08sivfWNKNWoNt1iBJ7tL7MZ7IbhVGeC2TLWo7ZF6UuE1A/E3rNyAM7egJ6BrtGuTumKVXDeibQ== "@brandonblack/musig@^0.0.1-alpha.0": version "0.0.1-alpha.1" @@ -3688,13 +3683,6 @@ dependencies: "@noble/hashes" "1.4.0" -"@noble/curves@1.7.0", "@noble/curves@~1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" - integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== - dependencies: - "@noble/hashes" "1.6.0" - "@noble/curves@1.8.1", "@noble/curves@^1.4.0", "@noble/curves@^1.4.2": version "1.8.1" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz" @@ -3736,11 +3724,6 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@noble/hashes@1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" - integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== - "@noble/hashes@1.7.1": version "1.7.1" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz" @@ -3751,11 +3734,6 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== -"@noble/hashes@~1.6.0": - version "1.6.1" - resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" - integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== - "@noble/secp256k1@1.6.3": version "1.6.3" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz" @@ -4897,22 +4875,23 @@ resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== -"@protobufjs/fetch@^1.1.0": - version "1.1.1" - resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz#4d6fc00c8fb64016a5c81b469d549046350f1065" - integrity sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw== +"@protobufjs/fetch@1.1.0", "@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" "@protobufjs/float@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== -"@protobufjs/inquire@^1.1.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz#ae64fbc014ff44c8bfad03dd4c93cd2d6a4c82db" - integrity sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw== +"@protobufjs/inquire@1.1.0", "@protobufjs/inquire@^1.1.0", "@protobufjs/inquire@^1.1.1": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" @@ -4958,11 +4937,6 @@ resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz" integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== -"@scure/base@1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" - integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== - "@scure/base@^1.1.1", "@scure/base@^1.1.3", "@scure/base@^1.1.7", "@scure/base@^1.2.0", "@scure/base@^1.2.4", "@scure/base@~1.2.5": version "1.2.6" resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz" @@ -5024,13 +4998,13 @@ "@noble/hashes" "~1.8.0" "@scure/base" "~1.2.5" -"@scure/starknet@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@scure/starknet/-/starknet-1.1.0.tgz#d1902e053d98196e161b9b2c3996b20999094e7a" - integrity sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ== +"@scure/starknet@^1.1.0": + version "1.1.2" + resolved "https://registry.npmjs.org/@scure/starknet/-/starknet-1.1.2.tgz#3b9492d83e773092158a240fb1e2a437933d2a7e" + integrity sha512-Qo2uNQJC/1IwfXC0f2BnDjtXnY1cVyfmK1WcGNFzfnktvlNmmmbjYeUNdYe3DBiDYyMzp1MhRUFllFW5moBaMg== dependencies: - "@noble/curves" "~1.7.0" - "@noble/hashes" "~1.6.0" + "@noble/curves" "~1.9.0" + "@noble/hashes" "~1.8.0" "@sideway/address@^4.1.5": version "4.1.5" @@ -7080,16 +7054,6 @@ abbrev@^3.0.0: resolved "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz" integrity sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== -abi-wan-kanabi@^2.2.3: - version "2.2.4" - resolved "https://registry.npmjs.org/abi-wan-kanabi/-/abi-wan-kanabi-2.2.4.tgz#47ebbafbb7f8df81773efbdcca60cdda8008c821" - integrity sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg== - dependencies: - ansicolors "^0.3.2" - cardinal "^2.1.1" - fs-extra "^10.0.0" - yargs "^17.7.2" - abitype@1.1.0, abitype@^1.0.6, abitype@^1.0.9: version "1.1.0" resolved "https://registry.npmjs.org/abitype/-/abitype-1.1.0.tgz" @@ -7312,11 +7276,6 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -ansicolors@^0.3.2, ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - anymatch@^3.0.0, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" @@ -8727,14 +8686,6 @@ canvg@4.0.3, canvg@^3.0.11: stackblur-canvas "^2.0.0" svg-pathdata "^6.0.3" -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" @@ -11179,7 +11130,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -11793,14 +11744,6 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" -fetch-cookie@~3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.0.1.tgz#6a77f7495e1a639ae019db916a234db8c85d5963" - integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q== - dependencies: - set-cookie-parser "^2.4.8" - tough-cookie "^4.0.0" - fflate@^0.8.1: version "0.8.2" resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz" @@ -12097,15 +12040,6 @@ fs-extra@9.1.0, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^11.2.0: version "11.3.2" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz" @@ -13818,7 +13752,7 @@ isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isomorphic-fetch@^3.0.0, isomorphic-fetch@~3.0.0: +isomorphic-fetch@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz" integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== @@ -14871,11 +14805,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lossless-json@^4.0.1: - version "4.3.0" - resolved "https://registry.npmjs.org/lossless-json/-/lossless-json-4.3.0.tgz#7d26864820ecf08aee800213fc193666e794802a" - integrity sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g== - loupe@^2.3.6: version "2.3.7" resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" @@ -16771,7 +16700,7 @@ pako@2.0.3: resolved "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz" integrity sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw== -pako@^2.0.4, pako@^2.1.0: +pako@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== @@ -17665,13 +17594,6 @@ proxyquire@^2.1.3: module-not-found-error "^1.0.1" resolve "^1.11.1" -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - public-encrypt@^4.0.0, public-encrypt@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" @@ -17702,7 +17624,7 @@ punycode@^1.3.2, punycode@^1.4.1: resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== -punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: +punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -17784,11 +17706,6 @@ querystring@0.2.0: resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -18110,13 +18027,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" - reflect-metadata@^0.1.13: version "0.1.14" resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz" @@ -18754,11 +18664,6 @@ set-blocking@^2.0.0: resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-cookie-parser@^2.4.8: - version "2.7.2" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" - integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -19401,28 +19306,6 @@ stackblur-canvas@^2.0.0: resolved "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz" integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== -"starknet-types-07@npm:@starknet-io/types-js@^0.7.10": - version "0.7.10" - resolved "https://registry.npmjs.org/@starknet-io/types-js/-/types-js-0.7.10.tgz#d21dc973d0cd04d7b6293ce461f2f06a5873c760" - integrity sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w== - -starknet@^6.23.1: - version "6.24.1" - resolved "https://registry.npmjs.org/starknet/-/starknet-6.24.1.tgz#87333339795038e93ef32a20726b5272ddb78fe1" - integrity sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg== - dependencies: - "@noble/curves" "1.7.0" - "@noble/hashes" "1.6.0" - "@scure/base" "1.2.1" - "@scure/starknet" "1.1.0" - abi-wan-kanabi "^2.2.3" - fetch-cookie "~3.0.0" - isomorphic-fetch "~3.0.0" - lossless-json "^4.0.1" - pako "^2.0.4" - starknet-types-07 "npm:@starknet-io/types-js@^0.7.10" - ts-mixer "^6.0.3" - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" @@ -20236,16 +20119,6 @@ totalist@^3.0.0: resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== -tough-cookie@^4.0.0: - version "4.1.4" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - tough-cookie@^5.0.0: version "5.1.2" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz" @@ -20306,11 +20179,6 @@ ts-loader@^9.1.2: semver "^7.3.4" source-map "^0.7.4" -ts-mixer@^6.0.3: - version "6.0.4" - resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" - integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== - ts-results@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/ts-results/-/ts-results-3.3.0.tgz" @@ -20757,11 +20625,6 @@ universalify@^0.1.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" @@ -20802,14 +20665,6 @@ urijs@^1.19.1: resolved "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz" integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - url@0.10.3: version "0.10.3" resolved "https://registry.npmjs.org/url/-/url-0.10.3.tgz"