From b1b05f21b925b1c375b43f1374d3999eaf53efd4 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 23 Jan 2026 16:26:37 +0000 Subject: [PATCH 01/11] chore: fix forge broadcast hang with --batch-size and --timeout --- l1-contracts/scripts/run_rollup_upgrade.sh | 19 +++++--- l1-contracts/scripts/test_rollup_upgrade.sh | 7 +++ .../ethereum/src/deploy_aztec_l1_contracts.ts | 44 ++++++++++++++++--- 3 files changed, 58 insertions(+), 12 deletions(-) diff --git a/l1-contracts/scripts/run_rollup_upgrade.sh b/l1-contracts/scripts/run_rollup_upgrade.sh index f8f25c77f7e1..667247505430 100755 --- a/l1-contracts/scripts/run_rollup_upgrade.sh +++ b/l1-contracts/scripts/run_rollup_upgrade.sh @@ -14,16 +14,23 @@ set -euo pipefail cd "$(dirname "$0")/.." +# Batch size of 8 prevents forge from hanging during broadcast (forge bug with large RPC batches). +MAGIC_BATCH_SIZE=8 +# Timeout ensures forge fails instead of hanging forever. Default 300s for mainnet/sepolia deployments. +FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-300}" + registry_address="${1:?registry_address is required}" echo "=== Deploying rollup upgrade ===" echo "Registry: $registry_address" REGISTRY_ADDRESS="$registry_address" \ - REAL_VERIFIER="${REAL_VERIFIER:-true}" \ - forge script script/deploy/DeployRollupForUpgrade.s.sol:DeployRollupForUpgrade \ - --rpc-url "$L1_RPC_URL" \ - --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ - --broadcast \ - ${ETHERSCAN_API_KEY:+--verify} \ +REAL_VERIFIER="${REAL_VERIFIER:-true}" \ +forge script script/deploy/DeployRollupForUpgrade.s.sol:DeployRollupForUpgrade \ + --rpc-url "$L1_RPC_URL" \ + --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ + --broadcast \ + --batch-size "$MAGIC_BATCH_SIZE" \ + --timeout "$FORGE_BROADCAST_TIMEOUT" \ + ${ETHERSCAN_API_KEY:+--verify} \ -vvv diff --git a/l1-contracts/scripts/test_rollup_upgrade.sh b/l1-contracts/scripts/test_rollup_upgrade.sh index 38e79b46d763..66741d4c8762 100755 --- a/l1-contracts/scripts/test_rollup_upgrade.sh +++ b/l1-contracts/scripts/test_rollup_upgrade.sh @@ -5,6 +5,11 @@ set -euo pipefail cd "$(dirname "$0")/.." +# Batch size of 8 prevents forge from hanging during broadcast (forge bug with large RPC batches). +MAGIC_BATCH_SIZE=8 +# Timeout ensures forge fails instead of hanging forever. Default 50s for local/testnet deployments. +FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-50}" + echo "=== Loading devnet defaults ===" source ./scripts/load_network_defaults.sh devnet @@ -30,6 +35,8 @@ forge script script/deploy/DeployAztecL1Contracts.s.sol:DeployAztecL1Contracts \ --rpc-url "$L1_RPC_URL" \ --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ --broadcast \ + --batch-size "$MAGIC_BATCH_SIZE" \ + --timeout "$FORGE_BROADCAST_TIMEOUT" \ --json > /tmp/initial_deploy.jsonl deploy_json=$(head -1 /tmp/initial_deploy.jsonl | jq -r '.logs[0]' | sed 's/JSON DEPLOY RESULT: //') diff --git a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts index e6a6143c4843..1e04d0462137 100644 --- a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts @@ -30,6 +30,14 @@ const logger = createLogger('ethereum:deploy_aztec_l1_contracts'); const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:'; +/** Batch size of 8 prevents forge from hanging during broadcast (forge bug with large RPC batches). */ +const MAGIC_BATCH_SIZE = 8; + +/** Returns forge broadcast timeout in seconds. Mainnet/sepolia get 5 minutes, everything else gets 50 seconds. */ +function getForgeBroadcastTimeout(chainId: number): number { + return chainId === mainnet.id || chainId === sepolia.id ? 300 : 50; +} + /** * Runs a process with the given command, arguments, and environment. * If the process outputs a line starting with JSON_DEPLOY_RESULT_PREFIX, @@ -77,6 +85,27 @@ function runProcess( return promise; } +/** + * Runs a forge script with retry on timeout. Forge can hang during broadcast due to a bug with + * large RPC batches. On timeout, retries once with --resume to pick up where it left off. + */ +async function runForgeScript( + forgeArgs: string[], + forgeEnv: Record, + cwd: string, +): Promise { + try { + return await runProcess('forge', forgeArgs, forgeEnv, cwd); + } catch (e: any) { + const isTimeout = /timed? ?out/i.test(e.message); + if (isTimeout) { + logger.warn(`Forge script timed out: ${e.message}. Retrying with --resume...`); + return await runProcess('forge', [...forgeArgs, '--resume'], forgeEnv, cwd); + } + throw e; + } +} + // Covers an edge where where we may have a cached BlobLib that is not meant for production. // Despite the profile apparently sometimes cached code remains (so says Lasse after his ignition-monorepo arc). async function maybeForgeForceProductionBuild(l1ContractsPath: string, script: string, chainId: number) { @@ -321,9 +350,6 @@ export async function deployAztecL1Contracts( ); } - // From heuristic testing. More caused issues with anvil. - const MAGIC_ANVIL_BATCH_SIZE = 8; - // Anvil seems to stall with unbounded batch size. Otherwise no max batch size is desirable. const forgeArgs = [ 'script', FORGE_SCRIPT, @@ -335,7 +361,9 @@ export async function deployAztecL1Contracts( rpcUrl, '--broadcast', '--batch-size', - MAGIC_ANVIL_BATCH_SIZE.toString(), + MAGIC_BATCH_SIZE.toString(), + '--timeout', + getForgeBroadcastTimeout(chainId).toString(), ...(shouldVerify ? ['--verify'] : []), ]; const forgeEnv = { @@ -344,7 +372,7 @@ export async function deployAztecL1Contracts( FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, ...getDeployAztecL1ContractsEnvVars(args), }; - const result = await runProcess('forge', forgeArgs, forgeEnv, l1ContractsPath); + const result = await runForgeScript(forgeArgs, forgeEnv, l1ContractsPath); if (!result) { throw new Error('Forge script did not output deployment result'); } @@ -597,6 +625,10 @@ export const deployRollupForUpgrade = async ( '--rpc-url', rpcUrl, '--broadcast', + '--batch-size', + MAGIC_BATCH_SIZE.toString(), + '--timeout', + getForgeBroadcastTimeout(chainId).toString(), ]; const forgeEnv = { FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, @@ -606,7 +638,7 @@ export const deployRollupForUpgrade = async ( ...getDeployRollupForUpgradeEnvVars(args), }; - const result = await runProcess('forge', forgeArgs, forgeEnv, l1ContractsPath); + const result = await runForgeScript(forgeArgs, forgeEnv, l1ContractsPath); if (!result) { throw new Error('Forge script did not output deployment result'); } From 85b62f64965663271f8bc4e756c1cf65d0bef107 Mon Sep 17 00:00:00 2001 From: ludamad Date: Sun, 8 Feb 2026 14:10:33 +0000 Subject: [PATCH 02/11] chore: add standalone forge_broadcast.ts wrapper with anvil retry support Replace inline retry logic and direct forge calls with a standalone TypeScript wrapper script (l1-contracts/scripts/forge_broadcast.ts). Key behaviors: - --batch-size 8 to prevent forge broadcast hangs - External timeout (forge's --timeout is unreliable for broadcast hangs) - On anvil: detect via web3_clientVersion, retry from scratch on failure (anvil's auto-miner race condition strands txs in mempool) - On real chains: retry with --resume to pick up unmined transactions - Buffers stdout per attempt, only emits the successful attempt's output - Waits for stdout drain before exit to avoid pipe truncation References: - https://github.com/foundry-rs/foundry/issues/6796 (batch size hang) - https://github.com/foundry-rs/foundry/issues/8919 (anvil auto-miner race) --- l1-contracts/package.json | 1 + l1-contracts/scripts/forge_broadcast.ts | 318 ++++++++++++++++++ l1-contracts/scripts/run_rollup_upgrade.sh | 10 +- l1-contracts/scripts/test_rollup_upgrade.sh | 24 +- .../ethereum/src/deploy_aztec_l1_contracts.ts | 97 +++--- .../scripts/copy-foundry-artifacts.sh | 3 + 6 files changed, 381 insertions(+), 72 deletions(-) create mode 100755 l1-contracts/scripts/forge_broadcast.ts diff --git a/l1-contracts/package.json b/l1-contracts/package.json index 8d7e6e085142..f7c83b6017d4 100644 --- a/l1-contracts/package.json +++ b/l1-contracts/package.json @@ -1,6 +1,7 @@ { "name": "@aztec/l1-contracts", "version": "0.1.0", + "type": "module", "license": "Apache-2.0", "description": "Aztec contracts for the Ethereum mainnet and testnets", "devDependencies": { diff --git a/l1-contracts/scripts/forge_broadcast.ts b/l1-contracts/scripts/forge_broadcast.ts new file mode 100755 index 000000000000..33dca91284a2 --- /dev/null +++ b/l1-contracts/scripts/forge_broadcast.ts @@ -0,0 +1,318 @@ +#!/usr/bin/env -S node --experimental-strip-types + +// forge_broadcast.ts - Reliable forge script broadcast with retry and timeout. +// +// Wraps `forge script` with: +// 1. --batch-size 8 to prevent forge broadcast hangs (forge bug with large RPC batches) +// 2. External timeout (forge's --timeout is unreliable for broadcast hangs) +// 3. Retry with --resume on real chains, or full retry from scratch on anvil +// +// Anvil's auto-miner has a race condition where batched transactions can get stranded +// in the mempool — they arrive after the auto-miner already triggered for the batch, +// and sit waiting for the next trigger that never comes. Neither evm_mine nor --resume +// can recover these stuck transactions. The anvil team recommends using interval mining +// (--block-time) instead of automine for reliable transaction inclusion: +// https://github.com/foundry-rs/foundry/issues/8919#issuecomment-2789655937 +// +// On anvil, we work around this by clearing broadcast artifacts and retrying from scratch. +// On real chains (where this anvil-specific bug doesn't apply), we use --resume. +// +// Usage: +// ./scripts/forge_broadcast.ts +// +// Pass the same args you'd pass to `forge script`, WITHOUT --broadcast or --batch-size. +// The wrapper adds those automatically. +// +// Example: +// ./scripts/forge_broadcast.ts script/deploy/Deploy.s.sol:Deploy \ +// --rpc-url "$RPC_URL" --private-key "$KEY" -vvv +// +// Environment variables: +// FORGE_BROADCAST_TIMEOUT - Timeout per attempt in seconds (default: 300) +// FORGE_BROADCAST_MAX_RETRIES - Max retries after initial attempt (default: 3) +// +// Uses only Node.js built-ins (no external dependencies). + +import { spawn } from 'node:child_process'; +import { readdirSync, readFileSync, rmSync, statSync } from 'node:fs'; +import { request as httpRequest } from 'node:http'; +import { request as httpsRequest } from 'node:https'; +import { join } from 'node:path'; + +const TIMEOUT = parseInt(process.env.FORGE_BROADCAST_TIMEOUT ?? '300', 10); +const MAX_RETRIES = parseInt(process.env.FORGE_BROADCAST_MAX_RETRIES ?? '3', 10); + +// Batch size of 8 prevents forge from hanging during broadcast. +// See: https://github.com/foundry-rs/foundry/issues/6796 +const BATCH_SIZE = 8; +const KILL_GRACE = 15_000; +// Delay before retry to let pending transactions settle in the mempool. +const RETRY_DELAY = 10_000; + +function log(msg: string): void { + process.stderr.write(`[forge_broadcast] ${msg}\n`); +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +/** Find the most recently modified run-latest.json in broadcast/. */ +function findLatestBroadcastArtifact(): string | undefined { + try { + let latestFile = ''; + let latestMtime = 0; + + const walk = (dir: string): void => { + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const fullPath = join(dir, entry.name); + if (entry.isDirectory()) { + walk(fullPath); + } else if (entry.name === 'run-latest.json') { + const mtime = statSync(fullPath).mtimeMs; + if (mtime > latestMtime) { + latestMtime = mtime; + latestFile = fullPath; + } + } + } + }; + + walk('broadcast'); + return latestFile || undefined; + } catch { + return undefined; + } +} + +/** Extract --rpc-url value from forge args. */ +function extractRpcUrl(args: string[]): string | undefined { + for (let i = 0; i < args.length - 1; i++) { + if (args[i] === '--rpc-url') return args[i + 1]; + } + return undefined; +} + +/** JSON-RPC call using Node.js built-ins. */ +function rpcCall(rpcUrl: string, method: string, params: unknown[]): Promise { + return new Promise((resolve, reject) => { + const url = new URL(rpcUrl); + const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }); + const reqFn = url.protocol === 'https:' ? httpsRequest : httpRequest; + + const req = reqFn(url, { method: 'POST', headers: { 'Content-Type': 'application/json' } }, res => { + let data = ''; + res.on('data', chunk => (data += chunk)); + res.on('end', () => { + try { + const parsed = JSON.parse(data); + resolve(parsed.result); + } catch { + reject(new Error(`Bad RPC response: ${data.slice(0, 200)}`)); + } + }); + }); + req.on('error', reject); + req.write(body); + req.end(); + }); +} + +/** Detect if the RPC endpoint is an anvil dev node via web3_clientVersion. */ +async function detectAnvil(rpcUrl: string): Promise { + try { + const version = (await rpcCall(rpcUrl, 'web3_clientVersion', [])) as string; + return version.toLowerCase().includes('anvil'); + } catch { + return false; + } +} + +/** + * Verify that all transactions in the broadcast artifacts were mined successfully. + * Checks the deployer's on-chain nonce against the highest nonce in the artifacts. + * If on-chain nonce > max artifact nonce, all transactions have been confirmed. + */ +async function verifyBroadcastOnChain(rpcUrl: string): Promise { + try { + const artifactPath = findLatestBroadcastArtifact(); + if (!artifactPath) return false; + + const data = JSON.parse(readFileSync(artifactPath, 'utf-8')); + const transactions: { transaction: { from: string; nonce: string } }[] = data.transactions ?? []; + + if (transactions.length === 0) return false; + + const maxNonceByAddress = new Map(); + for (const tx of transactions) { + const from = tx.transaction.from.toLowerCase(); + const nonce = parseInt(tx.transaction.nonce, 16); + const current = maxNonceByAddress.get(from) ?? -1; + if (nonce > current) maxNonceByAddress.set(from, nonce); + } + + log(`Checking on-chain nonces for ${transactions.length} transactions from ${artifactPath}...`); + + for (const [address, maxNonce] of maxNonceByAddress) { + const onChainNonce = parseInt( + (await rpcCall(rpcUrl, 'eth_getTransactionCount', [address, 'latest'])) as string, + 16, + ); + if (onChainNonce <= maxNonce) { + log(`Address ${address}: on-chain nonce ${onChainNonce}, need > ${maxNonce}. Not all transactions confirmed.`); + return false; + } + } + + log(`All ${transactions.length} transactions confirmed on-chain (nonce check).`); + return true; + } catch (e) { + log(`verifyBroadcastOnChain error: ${e instanceof Error ? e.message : e}`); + return false; + } +} + +interface ForgeResult { + exitCode: number; + stdout: Buffer[]; +} + +function runForge(args: string[], timeoutSecs: number): Promise { + return new Promise(resolve => { + const proc = spawn('forge', ['script', ...args, '--broadcast', '--batch-size', String(BATCH_SIZE)], { + stdio: ['ignore', 'pipe', 'inherit'], // buffer stdout, pass stderr through + }); + + const stdout: Buffer[] = []; + proc.stdout!.on('data', (chunk: Buffer) => stdout.push(chunk)); + + let timedOut = false; + let settled = false; + let killTimer: ReturnType | undefined; + + const timer = setTimeout(() => { + timedOut = true; + proc.kill('SIGTERM'); + killTimer = setTimeout(() => proc.kill('SIGKILL'), KILL_GRACE); + }, timeoutSecs * 1000); + + const finish = (code: number): void => { + if (settled) return; + settled = true; + clearTimeout(timer); + clearTimeout(killTimer); + resolve({ exitCode: timedOut ? 124 : code, stdout }); + }; + + proc.on('error', () => finish(1)); + proc.on('close', code => finish(code ?? 1)); + }); +} + +// Main +log(`timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}`); +const forgeArgs = process.argv.slice(2); +const rpcUrl = extractRpcUrl(forgeArgs); + +// Detect anvil once at startup. On anvil, retries reset the chain and start from scratch +// instead of using --resume, because anvil's auto-miner can strand transactions in the +// mempool in an unrecoverable state (neither evm_mine nor --resume can flush them). +const isAnvil = rpcUrl ? await detectAnvil(rpcUrl) : false; +if (isAnvil) { + log('Detected anvil — retries will reset chain instead of using --resume.'); +} + +/** Write buffered stdout to process.stdout and exit. Waits for drain to avoid truncation on pipes. */ +function emitAndExit(result: ForgeResult, code: number): void { + const data = Buffer.concat(result.stdout); + if (data.length === 0) { + process.exit(code); + } + process.stdout.write(data, () => process.exit(code)); + // If stdout is already destroyed/closed, the callback may never fire. + process.stdout.on('error', () => process.exit(code)); +} + +// Attempt 1: initial broadcast +log(`Attempt 1/${MAX_RETRIES + 1}: broadcasting...`); +let result = await runForge(forgeArgs, TIMEOUT); + +if (result.exitCode === 0) { + log('Broadcast succeeded on first attempt.'); + emitAndExit(result, 0); +} + +log(`Attempt 1 ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); + +// Forge sometimes exits non-zero even though all transactions were mined. +if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { + log('All transactions confirmed on-chain despite non-zero exit — treating as success.'); + emitAndExit(result, 0); +} + +for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { + log(`Waiting ${RETRY_DELAY / 1000}s before retry...`); + await sleep(RETRY_DELAY); + + if (isAnvil) { + // On anvil: retry from scratch instead of --resume. + // + // Anvil's auto-miner has a race condition where batched transactions can arrive + // after the auto-miner already triggered, stranding them in the mempool. --resume + // just waits for these same stuck transactions and hangs again. A fresh retry + // re-simulates from current chain state and re-sends, which works because: + // - Forge computes new nonces from on-chain state + // - New transactions replace any stuck ones with the same nonce + // - The race condition is intermittent (~0.04%), so retries almost always succeed + // + // The anvil team recommends interval mining (--block-time) over automine for + // reliable transaction inclusion. See: + // https://github.com/foundry-rs/foundry/issues/8919#issuecomment-2789655937 + try { + rmSync('broadcast', { recursive: true, force: true }); + } catch { /* broadcast dir may not exist */ } + + log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: retrying from scratch (anvil)...`); + result = await runForge(forgeArgs, TIMEOUT); + } else { + // On real chains: use --resume to pick up unmined transactions. + // --resume re-reads broadcast artifacts and resubmits unmined transactions. + // NOTE: --resume skips simulation, so console.log output (e.g. JSON deploy results) + // is only produced on the first attempt. We keep the first attempt's stdout (`result`) + // and only check the exit code from the --resume attempt. + if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { + log('All transactions confirmed on-chain after delay — treating as success.'); + emitAndExit(result, 0); + } + + log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: --resume`); + const resumeResult = await runForge([...forgeArgs, '--resume'], TIMEOUT); + + if (resumeResult.exitCode === 0) { + log(`Broadcast succeeded on attempt ${attempt + 1}.`); + // Emit the first attempt's stdout which has the JSON simulation output. + emitAndExit(result, 0); + } + log( + `Attempt ${attempt + 1} ${resumeResult.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${resumeResult.exitCode})`}.`, + ); + continue; + } + + if (result.exitCode === 0) { + log(`Broadcast succeeded on attempt ${attempt + 1}.`); + emitAndExit(result, 0); + } + log( + `Attempt ${attempt + 1} ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`, + ); +} + +// Final on-chain check after all retries exhausted. +if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { + log('All transactions confirmed on-chain after retries — treating as success.'); + emitAndExit(result, 0); +} + +log(`All ${MAX_RETRIES + 1} attempts failed.`); +emitAndExit(result, result.exitCode); diff --git a/l1-contracts/scripts/run_rollup_upgrade.sh b/l1-contracts/scripts/run_rollup_upgrade.sh index 667247505430..b5365bab38ef 100755 --- a/l1-contracts/scripts/run_rollup_upgrade.sh +++ b/l1-contracts/scripts/run_rollup_upgrade.sh @@ -14,10 +14,8 @@ set -euo pipefail cd "$(dirname "$0")/.." -# Batch size of 8 prevents forge from hanging during broadcast (forge bug with large RPC batches). -MAGIC_BATCH_SIZE=8 # Timeout ensures forge fails instead of hanging forever. Default 300s for mainnet/sepolia deployments. -FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-300}" +export FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-300}" registry_address="${1:?registry_address is required}" @@ -26,11 +24,9 @@ echo "Registry: $registry_address" REGISTRY_ADDRESS="$registry_address" \ REAL_VERIFIER="${REAL_VERIFIER:-true}" \ -forge script script/deploy/DeployRollupForUpgrade.s.sol:DeployRollupForUpgrade \ +./scripts/forge_broadcast.ts \ + script/deploy/DeployRollupForUpgrade.s.sol:DeployRollupForUpgrade \ --rpc-url "$L1_RPC_URL" \ --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ - --broadcast \ - --batch-size "$MAGIC_BATCH_SIZE" \ - --timeout "$FORGE_BROADCAST_TIMEOUT" \ ${ETHERSCAN_API_KEY:+--verify} \ -vvv diff --git a/l1-contracts/scripts/test_rollup_upgrade.sh b/l1-contracts/scripts/test_rollup_upgrade.sh index 66741d4c8762..ff7347b9f242 100755 --- a/l1-contracts/scripts/test_rollup_upgrade.sh +++ b/l1-contracts/scripts/test_rollup_upgrade.sh @@ -5,10 +5,8 @@ set -euo pipefail cd "$(dirname "$0")/.." -# Batch size of 8 prevents forge from hanging during broadcast (forge bug with large RPC batches). -MAGIC_BATCH_SIZE=8 -# Timeout ensures forge fails instead of hanging forever. Default 50s for local/testnet deployments. -FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-50}" +# Timeout for local/testnet deployments. +export FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-50}" echo "=== Loading devnet defaults ===" source ./scripts/load_network_defaults.sh devnet @@ -22,21 +20,25 @@ cleanup() { } trap cleanup EXIT -echo "=== Starting anvil ===" -anvil & +# Clean stale broadcast artifacts from previous runs to avoid nonce conflicts. +rm -rf broadcast/ + +# Use a random port to avoid conflicts with other anvil instances. +ANVIL_PORT="${ANVIL_PORT:-$(shuf -i 10000-60000 -n 1)}" + +echo "=== Starting anvil on port $ANVIL_PORT ===" +anvil --port "$ANVIL_PORT" & anvil_pid=$! sleep 2 -export L1_RPC_URL="http://127.0.0.1:8545" +export L1_RPC_URL="http://127.0.0.1:$ANVIL_PORT" export ROLLUP_DEPLOYMENT_PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" echo "=== Deploying initial L1 contracts ===" -forge script script/deploy/DeployAztecL1Contracts.s.sol:DeployAztecL1Contracts \ +./scripts/forge_broadcast.ts \ + script/deploy/DeployAztecL1Contracts.s.sol:DeployAztecL1Contracts \ --rpc-url "$L1_RPC_URL" \ --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ - --broadcast \ - --batch-size "$MAGIC_BATCH_SIZE" \ - --timeout "$FORGE_BROADCAST_TIMEOUT" \ --json > /tmp/initial_deploy.jsonl deploy_json=$(head -1 /tmp/initial_deploy.jsonl | jq -r '.logs[0]' | sed 's/JSON DEPLOY RESULT: //') diff --git a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts index 1e04d0462137..455c193e7cb8 100644 --- a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts @@ -30,18 +30,15 @@ const logger = createLogger('ethereum:deploy_aztec_l1_contracts'); const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:'; -/** Batch size of 8 prevents forge from hanging during broadcast (forge bug with large RPC batches). */ -const MAGIC_BATCH_SIZE = 8; - /** Returns forge broadcast timeout in seconds. Mainnet/sepolia get 5 minutes, everything else gets 50 seconds. */ function getForgeBroadcastTimeout(chainId: number): number { return chainId === mainnet.id || chainId === sepolia.id ? 300 : 50; } /** - * Runs a process with the given command, arguments, and environment. - * If the process outputs a line starting with JSON_DEPLOY_RESULT_PREFIX, - * the JSON is parsed and returned. + * Runs a process and parses JSON deploy results from stdout. + * Lines starting with JSON_DEPLOY_RESULT_PREFIX are parsed and returned. + * All other stdout goes to logger.info, stderr goes to logger.warn. */ function runProcess( command: string, @@ -57,26 +54,41 @@ function runProcess( }); let result: T | undefined; + let parseError: Error | undefined; + let settled = false; readline.createInterface({ input: proc.stdout }).on('line', line => { const trimmedLine = line.trim(); if (trimmedLine.startsWith(JSON_DEPLOY_RESULT_PREFIX)) { const jsonStr = trimmedLine.slice(JSON_DEPLOY_RESULT_PREFIX.length).trim(); - // TODO(AD): should this be a zod parse? - result = JSON.parse(jsonStr); + try { + result = JSON.parse(jsonStr); + } catch { + parseError = new Error(`Failed to parse deploy result JSON: ${jsonStr.slice(0, 200)}`); + } } else { logger.info(line); } }); - readline.createInterface({ input: proc.stderr }).on('line', logger.error.bind(logger)); + readline.createInterface({ input: proc.stderr }).on('line', logger.warn.bind(logger)); proc.on('error', error => { + if (settled) { + return; + } + settled = true; reject(new Error(`Failed to spawn ${command}: ${error.message}`)); }); proc.on('close', code => { + if (settled) { + return; + } + settled = true; if (code !== 0) { - reject(new Error(`${command} exited with code ${code}. See logs for details.\n`)); + reject(new Error(`${command} exited with code ${code}`)); + } else if (parseError) { + reject(parseError); } else { resolve(result); } @@ -85,27 +97,6 @@ function runProcess( return promise; } -/** - * Runs a forge script with retry on timeout. Forge can hang during broadcast due to a bug with - * large RPC batches. On timeout, retries once with --resume to pick up where it left off. - */ -async function runForgeScript( - forgeArgs: string[], - forgeEnv: Record, - cwd: string, -): Promise { - try { - return await runProcess('forge', forgeArgs, forgeEnv, cwd); - } catch (e: any) { - const isTimeout = /timed? ?out/i.test(e.message); - if (isTimeout) { - logger.warn(`Forge script timed out: ${e.message}. Retrying with --resume...`); - return await runProcess('forge', [...forgeArgs, '--resume'], forgeEnv, cwd); - } - throw e; - } -} - // Covers an edge where where we may have a cached BlobLib that is not meant for production. // Despite the profile apparently sometimes cached code remains (so says Lasse after his ignition-monorepo arc). async function maybeForgeForceProductionBuild(l1ContractsPath: string, script: string, chainId: number) { @@ -208,6 +199,10 @@ export function prepareL1ContractsForDeployment(): string { } writeFileSync(join(tempDir, 'foundry.toml'), foundryToml); + // Copy the forge broadcast wrapper script + mkdirSync(join(tempDir, 'scripts'), { recursive: true }); + cpSync(join(basePath, 'scripts', 'forge_broadcast.ts'), join(tempDir, 'scripts', 'forge_broadcast.ts')); + mkdirSync(join(tempDir, 'broadcast')); return tempDir; } @@ -350,8 +345,8 @@ export async function deployAztecL1Contracts( ); } + const scriptPath = join(l1ContractsPath, 'scripts', 'forge_broadcast.ts'); const forgeArgs = [ - 'script', FORGE_SCRIPT, '--sig', 'run()', @@ -359,20 +354,21 @@ export async function deployAztecL1Contracts( privateKey, '--rpc-url', rpcUrl, - '--broadcast', - '--batch-size', - MAGIC_BATCH_SIZE.toString(), - '--timeout', - getForgeBroadcastTimeout(chainId).toString(), ...(shouldVerify ? ['--verify'] : []), ]; const forgeEnv = { // Env vars required by l1-contracts/script/deploy/DeploymentConfiguration.sol. NETWORK: getActiveNetworkName(), FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, + FORGE_BROADCAST_TIMEOUT: getForgeBroadcastTimeout(chainId).toString(), ...getDeployAztecL1ContractsEnvVars(args), }; - const result = await runForgeScript(forgeArgs, forgeEnv, l1ContractsPath); + const result = await runProcess( + process.execPath, + ['--experimental-strip-types', scriptPath, ...forgeArgs], + forgeEnv, + l1ContractsPath, + ); if (!result) { throw new Error('Forge script did not output deployment result'); } @@ -615,30 +611,23 @@ export const deployRollupForUpgrade = async ( const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol'; await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId); - const forgeArgs = [ - 'script', - FORGE_SCRIPT, - '--sig', - 'run()', - '--private-key', - privateKey, - '--rpc-url', - rpcUrl, - '--broadcast', - '--batch-size', - MAGIC_BATCH_SIZE.toString(), - '--timeout', - getForgeBroadcastTimeout(chainId).toString(), - ]; + const scriptPath = join(l1ContractsPath, 'scripts', 'forge_broadcast.ts'); + const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl]; const forgeEnv = { FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol. REGISTRY_ADDRESS: registryAddress.toString(), NETWORK: getActiveNetworkName(), + FORGE_BROADCAST_TIMEOUT: getForgeBroadcastTimeout(chainId).toString(), ...getDeployRollupForUpgradeEnvVars(args), }; - const result = await runForgeScript(forgeArgs, forgeEnv, l1ContractsPath); + const result = await runProcess( + process.execPath, + ['--experimental-strip-types', scriptPath, ...forgeArgs], + forgeEnv, + l1ContractsPath, + ); if (!result) { throw new Error('Forge script did not output deployment result'); } diff --git a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh index 8607c60dee9b..c649e6804efa 100755 --- a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh @@ -24,6 +24,9 @@ mkdir -p "l1-contracts/test/script" cp -p "$src/test/shouting.t.sol" "l1-contracts/test/" cp -p "$src"/test/script/*.sol "l1-contracts/test/script/" cp -p "$src"/{foundry.toml,foundry.lock,solc-*} "l1-contracts/" +# Copy the forge broadcast wrapper script (used by yarn-project for deployments) +mkdir -p "l1-contracts/scripts" +cp -p "$src/scripts/forge_broadcast.ts" "l1-contracts/scripts/" abs_dest=$(pwd)/l1-contracts # Keep only the foundry relevant files from lib (cd "$src" && find lib \( -name "*.sol" -o -name "remappings.txt" -o -name "foundry.toml" \) -exec cp --parents -t "$abs_dest" {} +) From 8ed639a2aa8e80e186920cb13b7085420bf0b329 Mon Sep 17 00:00:00 2001 From: ludamad Date: Sun, 8 Feb 2026 17:27:43 +0000 Subject: [PATCH 03/11] fix: make emitAndExit awaitable to prevent execution continuing after exit emitAndExit uses process.stdout.write with a callback to call process.exit, which is async. Without awaiting, execution falls through to subsequent log lines and retry loops before process.exit fires. Change return type to Promise and await all call sites. --- l1-contracts/scripts/forge_broadcast.ts | 37 ++++++++++++++----------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/l1-contracts/scripts/forge_broadcast.ts b/l1-contracts/scripts/forge_broadcast.ts index 33dca91284a2..504823fc1def 100755 --- a/l1-contracts/scripts/forge_broadcast.ts +++ b/l1-contracts/scripts/forge_broadcast.ts @@ -222,15 +222,20 @@ if (isAnvil) { log('Detected anvil — retries will reset chain instead of using --resume.'); } -/** Write buffered stdout to process.stdout and exit. Waits for drain to avoid truncation on pipes. */ -function emitAndExit(result: ForgeResult, code: number): void { - const data = Buffer.concat(result.stdout); - if (data.length === 0) { - process.exit(code); - } - process.stdout.write(data, () => process.exit(code)); - // If stdout is already destroyed/closed, the callback may never fire. - process.stdout.on('error', () => process.exit(code)); +/** Write buffered stdout to process.stdout and exit. Returns a never-resolving promise so + * `await emitAndExit(...)` blocks execution until process.exit() fires. */ +function emitAndExit(result: ForgeResult, code: number): Promise { + return new Promise(() => { + const data = Buffer.concat(result.stdout); + if (data.length === 0) { + process.exit(code); + return; + } + // Wait for write to drain before exiting to avoid truncation on pipes >64KB. + process.stdout.write(data, () => process.exit(code)); + // If stdout is already destroyed/closed, the callback may never fire. + process.stdout.on('error', () => process.exit(code)); + }); } // Attempt 1: initial broadcast @@ -239,7 +244,7 @@ let result = await runForge(forgeArgs, TIMEOUT); if (result.exitCode === 0) { log('Broadcast succeeded on first attempt.'); - emitAndExit(result, 0); + await emitAndExit(result, 0); } log(`Attempt 1 ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); @@ -247,7 +252,7 @@ log(`Attempt 1 ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `fail // Forge sometimes exits non-zero even though all transactions were mined. if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { log('All transactions confirmed on-chain despite non-zero exit — treating as success.'); - emitAndExit(result, 0); + await emitAndExit(result, 0); } for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { @@ -282,7 +287,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // and only check the exit code from the --resume attempt. if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { log('All transactions confirmed on-chain after delay — treating as success.'); - emitAndExit(result, 0); + await emitAndExit(result, 0); } log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: --resume`); @@ -291,7 +296,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { if (resumeResult.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); // Emit the first attempt's stdout which has the JSON simulation output. - emitAndExit(result, 0); + await emitAndExit(result, 0); } log( `Attempt ${attempt + 1} ${resumeResult.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${resumeResult.exitCode})`}.`, @@ -301,7 +306,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { if (result.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); - emitAndExit(result, 0); + await emitAndExit(result, 0); } log( `Attempt ${attempt + 1} ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`, @@ -311,8 +316,8 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // Final on-chain check after all retries exhausted. if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { log('All transactions confirmed on-chain after retries — treating as success.'); - emitAndExit(result, 0); + await emitAndExit(result, 0); } log(`All ${MAX_RETRIES + 1} attempts failed.`); -emitAndExit(result, result.exitCode); +await emitAndExit(result, result.exitCode); From 102ee4fb21a12f9786c40c92a9225e70121009f8 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 11:30:56 +0000 Subject: [PATCH 04/11] chore: auto-detect chain timeout and harden rpcCall in forge_broadcast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move chain-specific timeout logic into forge_broadcast.ts itself — queries eth_chainId at startup and selects 300s for mainnet/sepolia, 50s for everything else. FORGE_BROADCAST_TIMEOUT env var still works as an override. Remove getForgeBroadcastTimeout from callers. Also fixes issues from code review: - rpcCall now rejects on JSON-RPC error responses (was silently resolving undefined, which could cause false positives in verifyBroadcastOnChain) - rpcCall has a 10s timeout to prevent wrapper's own RPC calls from hanging indefinitely - Remove incorrect foundry issue #8919 link (was a code refactoring PR, not about anvil) - Remove unnecessary try/catch around rmSync with force:true - Replace magic exit code 124 with named EXIT_TIMEOUT constant --- l1-contracts/scripts/forge_broadcast.ts | 113 +++++++++++------- l1-contracts/scripts/run_rollup_upgrade.sh | 3 - l1-contracts/scripts/test_rollup_upgrade.sh | 3 - .../ethereum/src/deploy_aztec_l1_contracts.ts | 7 -- 4 files changed, 71 insertions(+), 55 deletions(-) diff --git a/l1-contracts/scripts/forge_broadcast.ts b/l1-contracts/scripts/forge_broadcast.ts index 504823fc1def..ba827fd26b70 100755 --- a/l1-contracts/scripts/forge_broadcast.ts +++ b/l1-contracts/scripts/forge_broadcast.ts @@ -10,9 +10,7 @@ // Anvil's auto-miner has a race condition where batched transactions can get stranded // in the mempool — they arrive after the auto-miner already triggered for the batch, // and sit waiting for the next trigger that never comes. Neither evm_mine nor --resume -// can recover these stuck transactions. The anvil team recommends using interval mining -// (--block-time) instead of automine for reliable transaction inclusion: -// https://github.com/foundry-rs/foundry/issues/8919#issuecomment-2789655937 +// can recover these stuck transactions. Interval mining (--block-time) avoids this issue. // // On anvil, we work around this by clearing broadcast artifacts and retrying from scratch. // On real chains (where this anvil-specific bug doesn't apply), we use --resume. @@ -28,24 +26,36 @@ // --rpc-url "$RPC_URL" --private-key "$KEY" -vvv // // Environment variables: -// FORGE_BROADCAST_TIMEOUT - Timeout per attempt in seconds (default: 300) +// FORGE_BROADCAST_TIMEOUT - Override timeout per attempt in seconds (auto-detected from chain ID) // FORGE_BROADCAST_MAX_RETRIES - Max retries after initial attempt (default: 3) // // Uses only Node.js built-ins (no external dependencies). import { spawn } from 'node:child_process'; -import { readdirSync, readFileSync, rmSync, statSync } from 'node:fs'; +import { readdirSync, readFileSync, rmSync, statSync, writeSync } from 'node:fs'; import { request as httpRequest } from 'node:http'; import { request as httpsRequest } from 'node:https'; import { join } from 'node:path'; -const TIMEOUT = parseInt(process.env.FORGE_BROADCAST_TIMEOUT ?? '300', 10); +// Chain IDs for timeout selection. +const MAINNET_CHAIN_ID = 1; +const SEPOLIA_CHAIN_ID = 11155111; + +// Timeout per attempt: 300s for mainnet/sepolia (real chains are slow), 50s for everything else. +// FORGE_BROADCAST_TIMEOUT env var overrides the auto-detected value. +function getDefaultTimeout(chainId: number | undefined): number { + if (chainId === MAINNET_CHAIN_ID || chainId === SEPOLIA_CHAIN_ID) return 300; + return 50; +} + const MAX_RETRIES = parseInt(process.env.FORGE_BROADCAST_MAX_RETRIES ?? '3', 10); // Batch size of 8 prevents forge from hanging during broadcast. // See: https://github.com/foundry-rs/foundry/issues/6796 const BATCH_SIZE = 8; const KILL_GRACE = 15_000; +// Exit code indicating a timeout, matching the `timeout` coreutil convention. +const EXIT_TIMEOUT = 124; // Delay before retry to let pending transactions settle in the mempool. const RETRY_DELAY = 10_000; @@ -93,26 +103,41 @@ function extractRpcUrl(args: string[]): string | undefined { return undefined; } -/** JSON-RPC call using Node.js built-ins. */ +const RPC_TIMEOUT = 10_000; + +/** JSON-RPC call using Node.js built-ins. Rejects on JSON-RPC errors and timeouts. */ function rpcCall(rpcUrl: string, method: string, params: unknown[]): Promise { return new Promise((resolve, reject) => { const url = new URL(rpcUrl); const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }); const reqFn = url.protocol === 'https:' ? httpsRequest : httpRequest; + const timer = setTimeout(() => { + req.destroy(); + reject(new Error(`RPC call ${method} timed out after ${RPC_TIMEOUT}ms`)); + }, RPC_TIMEOUT); + const req = reqFn(url, { method: 'POST', headers: { 'Content-Type': 'application/json' } }, res => { let data = ''; res.on('data', chunk => (data += chunk)); res.on('end', () => { + clearTimeout(timer); try { const parsed = JSON.parse(data); - resolve(parsed.result); + if (parsed.error) { + reject(new Error(`RPC error for ${method}: ${JSON.stringify(parsed.error)}`)); + } else { + resolve(parsed.result); + } } catch { reject(new Error(`Bad RPC response: ${data.slice(0, 200)}`)); } }); }); - req.on('error', reject); + req.on('error', (err) => { + clearTimeout(timer); + reject(err); + }); req.write(body); req.end(); }); @@ -128,6 +153,16 @@ async function detectAnvil(rpcUrl: string): Promise { } } +/** Get the chain ID from the RPC endpoint. */ +async function getChainId(rpcUrl: string): Promise { + try { + const result = (await rpcCall(rpcUrl, 'eth_chainId', [])) as string; + return parseInt(result, 16); + } catch { + return undefined; + } +} + /** * Verify that all transactions in the broadcast artifacts were mined successfully. * Checks the deployer's on-chain nonce against the highest nonce in the artifacts. @@ -201,7 +236,7 @@ function runForge(args: string[], timeoutSecs: number): Promise { settled = true; clearTimeout(timer); clearTimeout(killTimer); - resolve({ exitCode: timedOut ? 124 : code, stdout }); + resolve({ exitCode: timedOut ? EXIT_TIMEOUT : code, stdout }); }; proc.on('error', () => finish(1)); @@ -210,10 +245,17 @@ function runForge(args: string[], timeoutSecs: number): Promise { } // Main -log(`timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}`); const forgeArgs = process.argv.slice(2); const rpcUrl = extractRpcUrl(forgeArgs); +// Query chain info from RPC at startup. +const chainId = rpcUrl ? await getChainId(rpcUrl) : undefined; +const TIMEOUT = process.env.FORGE_BROADCAST_TIMEOUT + ? parseInt(process.env.FORGE_BROADCAST_TIMEOUT, 10) + : getDefaultTimeout(chainId); + +log(`chain_id=${chainId ?? 'unknown'}, timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}`); + // Detect anvil once at startup. On anvil, retries reset the chain and start from scratch // instead of using --resume, because anvil's auto-miner can strand transactions in the // mempool in an unrecoverable state (neither evm_mine nor --resume can flush them). @@ -222,20 +264,13 @@ if (isAnvil) { log('Detected anvil — retries will reset chain instead of using --resume.'); } -/** Write buffered stdout to process.stdout and exit. Returns a never-resolving promise so - * `await emitAndExit(...)` blocks execution until process.exit() fires. */ -function emitAndExit(result: ForgeResult, code: number): Promise { - return new Promise(() => { - const data = Buffer.concat(result.stdout); - if (data.length === 0) { - process.exit(code); - return; - } - // Wait for write to drain before exiting to avoid truncation on pipes >64KB. - process.stdout.write(data, () => process.exit(code)); - // If stdout is already destroyed/closed, the callback may never fire. - process.stdout.on('error', () => process.exit(code)); - }); +/** Write buffered stdout to fd 1 (synchronous) and exit. */ +function emitAndExit(result: ForgeResult, code: number): never { + const data = Buffer.concat(result.stdout); + if (data.length > 0) { + writeSync(1, data); + } + process.exit(code); } // Attempt 1: initial broadcast @@ -244,15 +279,15 @@ let result = await runForge(forgeArgs, TIMEOUT); if (result.exitCode === 0) { log('Broadcast succeeded on first attempt.'); - await emitAndExit(result, 0); + emitAndExit(result, 0); } -log(`Attempt 1 ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); +log(`Attempt 1 ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); // Forge sometimes exits non-zero even though all transactions were mined. if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { log('All transactions confirmed on-chain despite non-zero exit — treating as success.'); - await emitAndExit(result, 0); + emitAndExit(result, 0); } for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { @@ -269,13 +304,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // - Forge computes new nonces from on-chain state // - New transactions replace any stuck ones with the same nonce // - The race condition is intermittent (~0.04%), so retries almost always succeed - // - // The anvil team recommends interval mining (--block-time) over automine for - // reliable transaction inclusion. See: - // https://github.com/foundry-rs/foundry/issues/8919#issuecomment-2789655937 - try { - rmSync('broadcast', { recursive: true, force: true }); - } catch { /* broadcast dir may not exist */ } + rmSync('broadcast', { recursive: true, force: true }); log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: retrying from scratch (anvil)...`); result = await runForge(forgeArgs, TIMEOUT); @@ -287,7 +316,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // and only check the exit code from the --resume attempt. if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { log('All transactions confirmed on-chain after delay — treating as success.'); - await emitAndExit(result, 0); + emitAndExit(result, 0); } log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: --resume`); @@ -296,28 +325,28 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { if (resumeResult.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); // Emit the first attempt's stdout which has the JSON simulation output. - await emitAndExit(result, 0); + emitAndExit(result, 0); } log( - `Attempt ${attempt + 1} ${resumeResult.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${resumeResult.exitCode})`}.`, + `Attempt ${attempt + 1} ${resumeResult.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${resumeResult.exitCode})`}.`, ); continue; } if (result.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); - await emitAndExit(result, 0); + emitAndExit(result, 0); } log( - `Attempt ${attempt + 1} ${result.exitCode === 124 ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`, + `Attempt ${attempt + 1} ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`, ); } // Final on-chain check after all retries exhausted. if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { log('All transactions confirmed on-chain after retries — treating as success.'); - await emitAndExit(result, 0); + emitAndExit(result, 0); } log(`All ${MAX_RETRIES + 1} attempts failed.`); -await emitAndExit(result, result.exitCode); +emitAndExit(result, result.exitCode); diff --git a/l1-contracts/scripts/run_rollup_upgrade.sh b/l1-contracts/scripts/run_rollup_upgrade.sh index b5365bab38ef..66a71d038e73 100755 --- a/l1-contracts/scripts/run_rollup_upgrade.sh +++ b/l1-contracts/scripts/run_rollup_upgrade.sh @@ -14,9 +14,6 @@ set -euo pipefail cd "$(dirname "$0")/.." -# Timeout ensures forge fails instead of hanging forever. Default 300s for mainnet/sepolia deployments. -export FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-300}" - registry_address="${1:?registry_address is required}" echo "=== Deploying rollup upgrade ===" diff --git a/l1-contracts/scripts/test_rollup_upgrade.sh b/l1-contracts/scripts/test_rollup_upgrade.sh index ff7347b9f242..cabb79db7f00 100755 --- a/l1-contracts/scripts/test_rollup_upgrade.sh +++ b/l1-contracts/scripts/test_rollup_upgrade.sh @@ -5,9 +5,6 @@ set -euo pipefail cd "$(dirname "$0")/.." -# Timeout for local/testnet deployments. -export FORGE_BROADCAST_TIMEOUT="${FORGE_BROADCAST_TIMEOUT:-50}" - echo "=== Loading devnet defaults ===" source ./scripts/load_network_defaults.sh devnet diff --git a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts index 455c193e7cb8..e5e74c01b5f1 100644 --- a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts @@ -30,11 +30,6 @@ const logger = createLogger('ethereum:deploy_aztec_l1_contracts'); const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:'; -/** Returns forge broadcast timeout in seconds. Mainnet/sepolia get 5 minutes, everything else gets 50 seconds. */ -function getForgeBroadcastTimeout(chainId: number): number { - return chainId === mainnet.id || chainId === sepolia.id ? 300 : 50; -} - /** * Runs a process and parses JSON deploy results from stdout. * Lines starting with JSON_DEPLOY_RESULT_PREFIX are parsed and returned. @@ -360,7 +355,6 @@ export async function deployAztecL1Contracts( // Env vars required by l1-contracts/script/deploy/DeploymentConfiguration.sol. NETWORK: getActiveNetworkName(), FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, - FORGE_BROADCAST_TIMEOUT: getForgeBroadcastTimeout(chainId).toString(), ...getDeployAztecL1ContractsEnvVars(args), }; const result = await runProcess( @@ -618,7 +612,6 @@ export const deployRollupForUpgrade = async ( // Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol. REGISTRY_ADDRESS: registryAddress.toString(), NETWORK: getActiveNetworkName(), - FORGE_BROADCAST_TIMEOUT: getForgeBroadcastTimeout(chainId).toString(), ...getDeployRollupForUpgradeEnvVars(args), }; From 7c27837e15df1db9bde79158768f517b10571ac1 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 13:56:31 +0000 Subject: [PATCH 05/11] chore: remove verifyBroadcastOnChain and findLatestBroadcastArtifact MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The on-chain nonce verification logic was never triggered as a save in 46,484 stress test runs. On anvil (where all retries occurred), it's useless because broadcast artifacts are cleared before retry. The nonce heuristic is also unreliable — a higher nonce doesn't prove those specific transactions were mined. Remove to simplify. --- l1-contracts/scripts/forge_broadcast.ts | 92 +------------------------ 1 file changed, 1 insertion(+), 91 deletions(-) diff --git a/l1-contracts/scripts/forge_broadcast.ts b/l1-contracts/scripts/forge_broadcast.ts index ba827fd26b70..f3ce624a801c 100755 --- a/l1-contracts/scripts/forge_broadcast.ts +++ b/l1-contracts/scripts/forge_broadcast.ts @@ -32,10 +32,9 @@ // Uses only Node.js built-ins (no external dependencies). import { spawn } from 'node:child_process'; -import { readdirSync, readFileSync, rmSync, statSync, writeSync } from 'node:fs'; +import { rmSync, writeSync } from 'node:fs'; import { request as httpRequest } from 'node:http'; import { request as httpsRequest } from 'node:https'; -import { join } from 'node:path'; // Chain IDs for timeout selection. const MAINNET_CHAIN_ID = 1; @@ -67,34 +66,6 @@ function sleep(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } -/** Find the most recently modified run-latest.json in broadcast/. */ -function findLatestBroadcastArtifact(): string | undefined { - try { - let latestFile = ''; - let latestMtime = 0; - - const walk = (dir: string): void => { - for (const entry of readdirSync(dir, { withFileTypes: true })) { - const fullPath = join(dir, entry.name); - if (entry.isDirectory()) { - walk(fullPath); - } else if (entry.name === 'run-latest.json') { - const mtime = statSync(fullPath).mtimeMs; - if (mtime > latestMtime) { - latestMtime = mtime; - latestFile = fullPath; - } - } - } - }; - - walk('broadcast'); - return latestFile || undefined; - } catch { - return undefined; - } -} - /** Extract --rpc-url value from forge args. */ function extractRpcUrl(args: string[]): string | undefined { for (let i = 0; i < args.length - 1; i++) { @@ -163,50 +134,6 @@ async function getChainId(rpcUrl: string): Promise { } } -/** - * Verify that all transactions in the broadcast artifacts were mined successfully. - * Checks the deployer's on-chain nonce against the highest nonce in the artifacts. - * If on-chain nonce > max artifact nonce, all transactions have been confirmed. - */ -async function verifyBroadcastOnChain(rpcUrl: string): Promise { - try { - const artifactPath = findLatestBroadcastArtifact(); - if (!artifactPath) return false; - - const data = JSON.parse(readFileSync(artifactPath, 'utf-8')); - const transactions: { transaction: { from: string; nonce: string } }[] = data.transactions ?? []; - - if (transactions.length === 0) return false; - - const maxNonceByAddress = new Map(); - for (const tx of transactions) { - const from = tx.transaction.from.toLowerCase(); - const nonce = parseInt(tx.transaction.nonce, 16); - const current = maxNonceByAddress.get(from) ?? -1; - if (nonce > current) maxNonceByAddress.set(from, nonce); - } - - log(`Checking on-chain nonces for ${transactions.length} transactions from ${artifactPath}...`); - - for (const [address, maxNonce] of maxNonceByAddress) { - const onChainNonce = parseInt( - (await rpcCall(rpcUrl, 'eth_getTransactionCount', [address, 'latest'])) as string, - 16, - ); - if (onChainNonce <= maxNonce) { - log(`Address ${address}: on-chain nonce ${onChainNonce}, need > ${maxNonce}. Not all transactions confirmed.`); - return false; - } - } - - log(`All ${transactions.length} transactions confirmed on-chain (nonce check).`); - return true; - } catch (e) { - log(`verifyBroadcastOnChain error: ${e instanceof Error ? e.message : e}`); - return false; - } -} - interface ForgeResult { exitCode: number; stdout: Buffer[]; @@ -284,12 +211,6 @@ if (result.exitCode === 0) { log(`Attempt 1 ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); -// Forge sometimes exits non-zero even though all transactions were mined. -if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { - log('All transactions confirmed on-chain despite non-zero exit — treating as success.'); - emitAndExit(result, 0); -} - for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { log(`Waiting ${RETRY_DELAY / 1000}s before retry...`); await sleep(RETRY_DELAY); @@ -314,11 +235,6 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // NOTE: --resume skips simulation, so console.log output (e.g. JSON deploy results) // is only produced on the first attempt. We keep the first attempt's stdout (`result`) // and only check the exit code from the --resume attempt. - if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { - log('All transactions confirmed on-chain after delay — treating as success.'); - emitAndExit(result, 0); - } - log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: --resume`); const resumeResult = await runForge([...forgeArgs, '--resume'], TIMEOUT); @@ -342,11 +258,5 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { ); } -// Final on-chain check after all retries exhausted. -if (rpcUrl && (await verifyBroadcastOnChain(rpcUrl))) { - log('All transactions confirmed on-chain after retries — treating as success.'); - emitAndExit(result, 0); -} - log(`All ${MAX_RETRIES + 1} attempts failed.`); emitAndExit(result, result.exitCode); From 6e00eb98c2ec6f38d4a183529b34a23078dad2f1 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 14:04:26 +0000 Subject: [PATCH 06/11] chore: simplify forge_broadcast.ts invocation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The script has a shebang that handles --experimental-strip-types, so spawn it directly instead of via node. It also doesn't need to be copied to the temp dir — it just spawns forge which inherits cwd. --- .../ethereum/src/deploy_aztec_l1_contracts.ts | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts index e5e74c01b5f1..879d1c35bae7 100644 --- a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts @@ -194,10 +194,6 @@ export function prepareL1ContractsForDeployment(): string { } writeFileSync(join(tempDir, 'foundry.toml'), foundryToml); - // Copy the forge broadcast wrapper script - mkdirSync(join(tempDir, 'scripts'), { recursive: true }); - cpSync(join(basePath, 'scripts', 'forge_broadcast.ts'), join(tempDir, 'scripts', 'forge_broadcast.ts')); - mkdirSync(join(tempDir, 'broadcast')); return tempDir; } @@ -340,7 +336,7 @@ export async function deployAztecL1Contracts( ); } - const scriptPath = join(l1ContractsPath, 'scripts', 'forge_broadcast.ts'); + const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.ts'); const forgeArgs = [ FORGE_SCRIPT, '--sig', @@ -357,12 +353,7 @@ export async function deployAztecL1Contracts( FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, ...getDeployAztecL1ContractsEnvVars(args), }; - const result = await runProcess( - process.execPath, - ['--experimental-strip-types', scriptPath, ...forgeArgs], - forgeEnv, - l1ContractsPath, - ); + const result = await runProcess(scriptPath, forgeArgs, forgeEnv, l1ContractsPath); if (!result) { throw new Error('Forge script did not output deployment result'); } @@ -605,7 +596,7 @@ export const deployRollupForUpgrade = async ( const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol'; await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId); - const scriptPath = join(l1ContractsPath, 'scripts', 'forge_broadcast.ts'); + const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.ts'); const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl]; const forgeEnv = { FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, @@ -615,12 +606,7 @@ export const deployRollupForUpgrade = async ( ...getDeployRollupForUpgradeEnvVars(args), }; - const result = await runProcess( - process.execPath, - ['--experimental-strip-types', scriptPath, ...forgeArgs], - forgeEnv, - l1ContractsPath, - ); + const result = await runProcess(scriptPath, forgeArgs, forgeEnv, l1ContractsPath); if (!result) { throw new Error('Forge script did not output deployment result'); } From 121ecf7767c285fd8606b81aba2e370af1947f4e Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 14:21:28 +0000 Subject: [PATCH 07/11] chore: separate contract verification from broadcast in forge_broadcast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Strip --verify from broadcast attempts and run it as a separate step after transactions land. Forge runs verification AFTER all receipts are collected (crates/script/src/lib.rs:333-338) and exits non-zero if any verification fails (crates/script/src/verify.rs), even when all transactions succeeded. This caused two problems: 1. The broadcast timeout could kill forge mid-verification, wasting the attempt even though all transactions were already mined. 2. A verification failure (e.g. Etherscan rate limit) triggered broadcast retries, resubmitting already-mined transactions. After a successful broadcast, we now run `forge script --resume --verify --broadcast` without a timeout. The --resume path re-compiles and re-links using libraries from the broadcast artifacts (crates/script/src/build.rs CompiledState::resume) — it doesn't need simulation data. The broadcast step is a no-op since all receipts already exist. Verification failure is logged but doesn't affect the exit code, since the critical work (transaction landing) already succeeded. --- l1-contracts/scripts/forge_broadcast.ts | 53 ++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/l1-contracts/scripts/forge_broadcast.ts b/l1-contracts/scripts/forge_broadcast.ts index f3ce624a801c..60d3df98ac0f 100755 --- a/l1-contracts/scripts/forge_broadcast.ts +++ b/l1-contracts/scripts/forge_broadcast.ts @@ -74,6 +74,12 @@ function extractRpcUrl(args: string[]): string | undefined { return undefined; } +/** Strip --verify from args, returning the filtered args and whether --verify was present. */ +function extractVerifyFlag(args: string[]): { args: string[]; verify: boolean } { + const filtered = args.filter(a => a !== '--verify'); + return { args: filtered, verify: filtered.length !== args.length }; +} + const RPC_TIMEOUT = 10_000; /** JSON-RPC call using Node.js built-ins. Rejects on JSON-RPC errors and timeouts. */ @@ -172,7 +178,12 @@ function runForge(args: string[], timeoutSecs: number): Promise { } // Main -const forgeArgs = process.argv.slice(2); + +// Strip --verify from args so it doesn't run during broadcast attempts. Verification +// happens after all receipts are collected (foundry-rs/foundry crates/script/src/lib.rs:333-338) +// and forge exits non-zero if ANY verification fails (crates/script/src/verify.rs), even when +// all transactions landed. We run verification as a separate step after broadcast succeeds. +const { args: forgeArgs, verify: wantsVerify } = extractVerifyFlag(process.argv.slice(2)); const rpcUrl = extractRpcUrl(forgeArgs); // Query chain info from RPC at startup. @@ -181,7 +192,7 @@ const TIMEOUT = process.env.FORGE_BROADCAST_TIMEOUT ? parseInt(process.env.FORGE_BROADCAST_TIMEOUT, 10) : getDefaultTimeout(chainId); -log(`chain_id=${chainId ?? 'unknown'}, timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}`); +log(`chain_id=${chainId ?? 'unknown'}, timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}${wantsVerify ? ', verify=true (after broadcast)' : ''}`); // Detect anvil once at startup. On anvil, retries reset the chain and start from scratch // instead of using --resume, because anvil's auto-miner can strand transactions in the @@ -191,6 +202,30 @@ if (isAnvil) { log('Detected anvil — retries will reset chain instead of using --resume.'); } +/** + * Run contract verification via `forge script --resume --verify --broadcast` (no timeout). + * Verification uses broadcast artifacts + re-compilation — it doesn't need simulation data. + * See: foundry-rs/foundry crates/script/src/build.rs (CompiledState::resume) and + * crates/script/src/verify.rs (verify_contracts). + * Failure is logged but doesn't affect the exit code — transactions already landed. + */ +async function runVerification(args: string[]): Promise { + log('Running contract verification (no timeout)...'); + const verifyResult = await new Promise(resolve => { + const proc = spawn('forge', ['script', ...args, '--broadcast', '--resume', '--verify'], { + stdio: ['ignore', 'inherit', 'inherit'], + }); + let settled = false; + proc.on('error', () => { if (!settled) { settled = true; resolve(1); } }); + proc.on('close', code => { if (!settled) { settled = true; resolve(code ?? 1); } }); + }); + if (verifyResult === 0) { + log('Contract verification succeeded.'); + } else { + log(`Contract verification failed (exit ${verifyResult}). Transactions are on-chain; verify manually if needed.`); + } +} + /** Write buffered stdout to fd 1 (synchronous) and exit. */ function emitAndExit(result: ForgeResult, code: number): never { const data = Buffer.concat(result.stdout); @@ -200,13 +235,21 @@ function emitAndExit(result: ForgeResult, code: number): never { process.exit(code); } +/** Run verification if requested, then emit stdout and exit. */ +async function verifyAndExit(result: ForgeResult): Promise { + if (wantsVerify) { + await runVerification(forgeArgs); + } + emitAndExit(result, 0); +} + // Attempt 1: initial broadcast log(`Attempt 1/${MAX_RETRIES + 1}: broadcasting...`); let result = await runForge(forgeArgs, TIMEOUT); if (result.exitCode === 0) { log('Broadcast succeeded on first attempt.'); - emitAndExit(result, 0); + await verifyAndExit(result); } log(`Attempt 1 ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); @@ -241,7 +284,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { if (resumeResult.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); // Emit the first attempt's stdout which has the JSON simulation output. - emitAndExit(result, 0); + await verifyAndExit(result); } log( `Attempt ${attempt + 1} ${resumeResult.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${resumeResult.exitCode})`}.`, @@ -251,7 +294,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { if (result.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); - emitAndExit(result, 0); + await verifyAndExit(result); } log( `Attempt ${attempt + 1} ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`, From a61bf831ee13c377ef1a4c588fa36757c435f4cd Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 14:50:40 +0000 Subject: [PATCH 08/11] fix: copy l1-contracts/package.json to l1-artifacts for ESM resolution Node v22 treats .ts files as CJS by default. The forge_broadcast.ts script uses ESM imports, which requires "type": "module" in the nearest package.json. Without copying l1-contracts/package.json, Node finds l1-artifacts/package.json instead (no "type": "module") and fails to parse the imports. --- yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh index c649e6804efa..81fbd3b5df1b 100755 --- a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh @@ -23,7 +23,7 @@ cp -rp "$src/script/deploy" "l1-contracts/script/" # only deploy/, other script mkdir -p "l1-contracts/test/script" cp -p "$src/test/shouting.t.sol" "l1-contracts/test/" cp -p "$src"/test/script/*.sol "l1-contracts/test/script/" -cp -p "$src"/{foundry.toml,foundry.lock,solc-*} "l1-contracts/" +cp -p "$src"/{foundry.toml,foundry.lock,package.json,solc-*} "l1-contracts/" # Copy the forge broadcast wrapper script (used by yarn-project for deployments) mkdir -p "l1-contracts/scripts" cp -p "$src/scripts/forge_broadcast.ts" "l1-contracts/scripts/" From 0b891ea78d86ed3cd86ac282e0791b6cd5b9dc4a Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 18:15:00 +0000 Subject: [PATCH 09/11] fix: compile forge_broadcast.ts to JS for node_modules compatibility Node.js refuses to load .ts files from node_modules even with --experimental-strip-types. Compile with swc during copy-foundry-artifacts and invoke via process.execPath from deploy code. --- .../ethereum/src/deploy_aztec_l1_contracts.ts | 18 ++++++++++++++---- .../scripts/copy-foundry-artifacts.sh | 5 +++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts index 879d1c35bae7..6497f5c0400e 100644 --- a/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_aztec_l1_contracts.ts @@ -336,7 +336,7 @@ export async function deployAztecL1Contracts( ); } - const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.ts'); + const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js'); const forgeArgs = [ FORGE_SCRIPT, '--sig', @@ -353,7 +353,12 @@ export async function deployAztecL1Contracts( FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, ...getDeployAztecL1ContractsEnvVars(args), }; - const result = await runProcess(scriptPath, forgeArgs, forgeEnv, l1ContractsPath); + const result = await runProcess( + process.execPath, + [scriptPath, ...forgeArgs], + forgeEnv, + l1ContractsPath, + ); if (!result) { throw new Error('Forge script did not output deployment result'); } @@ -596,7 +601,7 @@ export const deployRollupForUpgrade = async ( const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol'; await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId); - const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.ts'); + const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js'); const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl]; const forgeEnv = { FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined, @@ -606,7 +611,12 @@ export const deployRollupForUpgrade = async ( ...getDeployRollupForUpgradeEnvVars(args), }; - const result = await runProcess(scriptPath, forgeArgs, forgeEnv, l1ContractsPath); + const result = await runProcess( + process.execPath, + [scriptPath, ...forgeArgs], + forgeEnv, + l1ContractsPath, + ); if (!result) { throw new Error('Forge script did not output deployment result'); } diff --git a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh index 81fbd3b5df1b..4c73efdef968 100755 --- a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh @@ -24,9 +24,10 @@ mkdir -p "l1-contracts/test/script" cp -p "$src/test/shouting.t.sol" "l1-contracts/test/" cp -p "$src"/test/script/*.sol "l1-contracts/test/script/" cp -p "$src"/{foundry.toml,foundry.lock,package.json,solc-*} "l1-contracts/" -# Copy the forge broadcast wrapper script (used by yarn-project for deployments) +# Compile the forge broadcast wrapper to JS (Node refuses to load .ts from node_modules). mkdir -p "l1-contracts/scripts" -cp -p "$src/scripts/forge_broadcast.ts" "l1-contracts/scripts/" +npx swc "$src/scripts/forge_broadcast.ts" -o "l1-contracts/scripts/forge_broadcast.js" \ + --config-file="$(dirname "$0")/../../.swcrc" abs_dest=$(pwd)/l1-contracts # Keep only the foundry relevant files from lib (cd "$src" && find lib \( -name "*.sol" -o -name "remappings.txt" -o -name "foundry.toml" \) -exec cp --parents -t "$abs_dest" {} +) From 4ff4923af03397797210229cef208acc4cad6e02 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 9 Feb 2026 22:24:17 +0000 Subject: [PATCH 10/11] chore: compile forge_broadcast.ts in l1-contracts bootstrap Move swc compilation from copy-foundry-artifacts.sh into l1-contracts bootstrap so the .js is built at the source. Add @swc/cli and @swc/core as devDependencies. copy-foundry-artifacts.sh now just copies the pre-built .js file. --- l1-contracts/.gitignore | 3 + l1-contracts/bootstrap.sh | 3 + l1-contracts/package.json | 2 + l1-contracts/yarn.lock | 1376 +++++++++++++++-- .../scripts/copy-foundry-artifacts.sh | 5 +- 5 files changed, 1300 insertions(+), 89 deletions(-) diff --git a/l1-contracts/.gitignore b/l1-contracts/.gitignore index 006a8750e720..6057088dbdc5 100644 --- a/l1-contracts/.gitignore +++ b/l1-contracts/.gitignore @@ -28,6 +28,9 @@ solc-* yarn.lock .yarn/ +# Compiled JS from TypeScript (built by bootstrap) +scripts/forge_broadcast.js + # 'deploy_contracts' script output serve/ diff --git a/l1-contracts/bootstrap.sh b/l1-contracts/bootstrap.sh index 306495820577..9c7b61323652 100755 --- a/l1-contracts/bootstrap.sh +++ b/l1-contracts/bootstrap.sh @@ -108,6 +108,9 @@ function build_verifier { function build { build_src build_verifier + # Compile the forge broadcast wrapper to JS (Node refuses to load .ts from node_modules). + npx swc scripts/forge_broadcast.ts -o scripts/forge_broadcast.js \ + --no-swcrc -C jsc.target=es2022 -C jsc.parser.syntax=typescript -C module.type=es6 } function test_cmds { diff --git a/l1-contracts/package.json b/l1-contracts/package.json index f7c83b6017d4..72a90d217d35 100644 --- a/l1-contracts/package.json +++ b/l1-contracts/package.json @@ -6,6 +6,8 @@ "description": "Aztec contracts for the Ethereum mainnet and testnets", "devDependencies": { "@openzeppelin/merkle-tree": "^1.0.8", + "@swc/cli": "^0.6.0", + "@swc/core": "^1.10.12", "ox": "^0.8.3", "solhint": "5.1.0" }, diff --git a/l1-contracts/yarn.lock b/l1-contracts/yarn.lock index 9c68cb8b8b46..ff4f34ffc338 100644 --- a/l1-contracts/yarn.lock +++ b/l1-contracts/yarn.lock @@ -6,9 +6,9 @@ __metadata: cacheKey: 10c0 "@adraffy/ens-normalize@npm:^1.11.0": - version: 1.11.0 - resolution: "@adraffy/ens-normalize@npm:1.11.0" - checksum: 10c0/5111d0f1a273468cb5661ed3cf46ee58de8f32f84e2ebc2365652e66c1ead82649df94c736804e2b9cfa831d30ef24e1cc3575d970dbda583416d3a98d8870a6 + version: 1.11.1 + resolution: "@adraffy/ens-normalize@npm:1.11.1" + checksum: 10c0/b364e2a57131db278ebf2f22d1a1ac6d8aea95c49dd2bbbc1825870b38aa91fd8816aba580a1f84edc50a45eb6389213dacfd1889f32893afc8549a82d304767 languageName: node linkType: hard @@ -17,26 +17,35 @@ __metadata: resolution: "@aztec/l1-contracts@workspace:." dependencies: "@openzeppelin/merkle-tree": "npm:^1.0.8" + "@swc/cli": "npm:^0.6.0" + "@swc/core": "npm:^1.10.12" ox: "npm:^0.8.3" solhint: "npm:5.1.0" languageName: unknown linkType: soft "@babel/code-frame@npm:^7.0.0": - version: 7.27.1 - resolution: "@babel/code-frame@npm:7.27.1" + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" js-tokens: "npm:^4.0.0" picocolors: "npm:^1.1.1" - checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 + checksum: 10c0/d34cc504e7765dfb576a663d97067afb614525806b5cad1a5cc1a7183b916fec8ff57fa233585e3926fd5a9e6b31aae6df91aa81ae9775fb7a28f658d3346f0d languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 + languageName: node + linkType: hard + +"@borewit/text-codec@npm:^0.2.1": + version: 0.2.1 + resolution: "@borewit/text-codec@npm:0.2.1" + checksum: 10c0/aabd9c86497197aacc9ddb413857f112a98a9fd4be9ed56a24971a47bbec7c0d5d449efcad830f9895009c1a5914e5c448f972a0c968e97c4ebf99297dea7a6b languageName: node linkType: hard @@ -116,6 +125,185 @@ __metadata: languageName: node linkType: hard +"@napi-rs/nice-android-arm-eabi@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-android-arm-eabi@npm:1.1.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@napi-rs/nice-android-arm64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-android-arm64@npm:1.1.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-darwin-arm64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-darwin-arm64@npm:1.1.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-darwin-x64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-darwin-x64@npm:1.1.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice-freebsd-x64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-freebsd-x64@npm:1.1.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm-gnueabihf@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-arm-gnueabihf@npm:1.1.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-arm64-gnu@npm:1.1.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-arm64-musl@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-arm64-musl@npm:1.1.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@napi-rs/nice-linux-ppc64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-ppc64-gnu@npm:1.1.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-riscv64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-riscv64-gnu@npm:1.1.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-s390x-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-s390x-gnu@npm:1.1.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-x64-gnu@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-x64-gnu@npm:1.1.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@napi-rs/nice-linux-x64-musl@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-linux-x64-musl@npm:1.1.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@napi-rs/nice-openharmony-arm64@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-openharmony-arm64@npm:1.1.1" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-arm64-msvc@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-win32-arm64-msvc@npm:1.1.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-ia32-msvc@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-win32-ia32-msvc@npm:1.1.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@napi-rs/nice-win32-x64-msvc@npm:1.1.1": + version: 1.1.1 + resolution: "@napi-rs/nice-win32-x64-msvc@npm:1.1.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@napi-rs/nice@npm:^1.0.1": + version: 1.1.1 + resolution: "@napi-rs/nice@npm:1.1.1" + dependencies: + "@napi-rs/nice-android-arm-eabi": "npm:1.1.1" + "@napi-rs/nice-android-arm64": "npm:1.1.1" + "@napi-rs/nice-darwin-arm64": "npm:1.1.1" + "@napi-rs/nice-darwin-x64": "npm:1.1.1" + "@napi-rs/nice-freebsd-x64": "npm:1.1.1" + "@napi-rs/nice-linux-arm-gnueabihf": "npm:1.1.1" + "@napi-rs/nice-linux-arm64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-arm64-musl": "npm:1.1.1" + "@napi-rs/nice-linux-ppc64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-riscv64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-s390x-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-x64-gnu": "npm:1.1.1" + "@napi-rs/nice-linux-x64-musl": "npm:1.1.1" + "@napi-rs/nice-openharmony-arm64": "npm:1.1.1" + "@napi-rs/nice-win32-arm64-msvc": "npm:1.1.1" + "@napi-rs/nice-win32-ia32-msvc": "npm:1.1.1" + "@napi-rs/nice-win32-x64-msvc": "npm:1.1.1" + dependenciesMeta: + "@napi-rs/nice-android-arm-eabi": + optional: true + "@napi-rs/nice-android-arm64": + optional: true + "@napi-rs/nice-darwin-arm64": + optional: true + "@napi-rs/nice-darwin-x64": + optional: true + "@napi-rs/nice-freebsd-x64": + optional: true + "@napi-rs/nice-linux-arm-gnueabihf": + optional: true + "@napi-rs/nice-linux-arm64-gnu": + optional: true + "@napi-rs/nice-linux-arm64-musl": + optional: true + "@napi-rs/nice-linux-ppc64-gnu": + optional: true + "@napi-rs/nice-linux-riscv64-gnu": + optional: true + "@napi-rs/nice-linux-s390x-gnu": + optional: true + "@napi-rs/nice-linux-x64-gnu": + optional: true + "@napi-rs/nice-linux-x64-musl": + optional: true + "@napi-rs/nice-openharmony-arm64": + optional: true + "@napi-rs/nice-win32-arm64-msvc": + optional: true + "@napi-rs/nice-win32-ia32-msvc": + optional: true + "@napi-rs/nice-win32-x64-msvc": + optional: true + checksum: 10c0/517eacfd5d5de191f1469a6caad9f9e26924b25079550149fc792fb09d15184013a8a81966a666f08c0a93fbb17a458d50ba9e2e9d6a61141c6c515d083733b2 + languageName: node + linkType: hard + "@noble/ciphers@npm:1.3.0, @noble/ciphers@npm:^1.3.0": version: 1.3.0 resolution: "@noble/ciphers@npm:1.3.0" @@ -142,11 +330,11 @@ __metadata: linkType: hard "@noble/curves@npm:^1.9.1, @noble/curves@npm:~1.9.0": - version: 1.9.2 - resolution: "@noble/curves@npm:1.9.2" + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" dependencies: "@noble/hashes": "npm:1.8.0" - checksum: 10c0/21d049ae4558beedbf5da0004407b72db84360fa29d64822d82dc9e80251e1ecb46023590cc4b20e70eed697d1b87279b4911dc39f8694c51c874289cfc8e9a7 + checksum: 10c0/150014751ebe8ca06a8654ca2525108452ea9ee0be23430332769f06808cddabfe84f248b6dbf836916bc869c27c2092957eec62c7506d68a1ed0a624017c2a3 languageName: node linkType: hard @@ -164,6 +352,33 @@ __metadata: languageName: node linkType: hard +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + "@openzeppelin/merkle-tree@npm:^1.0.8": version: 1.0.8 resolution: "@openzeppelin/merkle-tree@npm:1.0.8" @@ -190,14 +405,14 @@ __metadata: languageName: node linkType: hard -"@pnpm/npm-conf@npm:^2.1.0": - version: 2.3.1 - resolution: "@pnpm/npm-conf@npm:2.3.1" +"@pnpm/npm-conf@npm:^3.0.2": + version: 3.0.2 + resolution: "@pnpm/npm-conf@npm:3.0.2" dependencies: "@pnpm/config.env-replace": "npm:^1.1.0" "@pnpm/network.ca-file": "npm:^1.0.1" config-chain: "npm:^1.1.11" - checksum: 10c0/778a3a34ff7d6000a2594d2a9821f873f737bc56367865718b2cf0ba5d366e49689efe7975148316d7afd8e6f1dcef7d736fbb6ea7ef55caadd1dc93a36bb302 + checksum: 10c0/50026ae4cac7d5d055d4dd4b2886fbc41964db6179406cf2decf625e7a280fbfffd47380df584c085464deba060101169caca5f79e6a062b6c25b527bf60cb67 languageName: node linkType: hard @@ -265,9 +480,168 @@ __metadata: linkType: hard "@solidity-parser/parser@npm:^0.20.0": - version: 0.20.1 - resolution: "@solidity-parser/parser@npm:0.20.1" - checksum: 10c0/fa08c719bace194cb82be80f0efd9c57863aea831ff587a9268752a84a35f00daa8c28c9f5587c64d5cbb969a98f8df714088acdd581702376e45d48d57ee8af + version: 0.20.2 + resolution: "@solidity-parser/parser@npm:0.20.2" + checksum: 10c0/23b0b7ed343a4fa55cb8621cf4fc81b0bdd791a4ee7e96ced7778db07de66d4e418db2c2dc1525b1f82fc0310ac829c78382327292b37e35cb30a19961fcb429 + languageName: node + linkType: hard + +"@swc/cli@npm:^0.6.0": + version: 0.6.0 + resolution: "@swc/cli@npm:0.6.0" + dependencies: + "@swc/counter": "npm:^0.1.3" + "@xhmikosr/bin-wrapper": "npm:^13.0.5" + commander: "npm:^8.3.0" + fast-glob: "npm:^3.2.5" + minimatch: "npm:^9.0.3" + piscina: "npm:^4.3.1" + semver: "npm:^7.3.8" + slash: "npm:3.0.0" + source-map: "npm:^0.7.3" + peerDependencies: + "@swc/core": ^1.2.66 + chokidar: ^4.0.1 + peerDependenciesMeta: + chokidar: + optional: true + bin: + spack: bin/spack.js + swc: bin/swc.js + swcx: bin/swcx.js + checksum: 10c0/eaeac958e271c0ad41c94df0712b8fc65c884c8515439ac48451928f18bde6fa4f931c430cc3efc2bc3c2bc9af8fecca810e1c86962041e10a28200590314f6f + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-darwin-arm64@npm:1.15.11" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-darwin-x64@npm:1.15.11" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.11" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-linux-arm64-gnu@npm:1.15.11" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-linux-arm64-musl@npm:1.15.11" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-linux-x64-gnu@npm:1.15.11" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-linux-x64-musl@npm:1.15.11" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-win32-arm64-msvc@npm:1.15.11" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-win32-ia32-msvc@npm:1.15.11" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.15.11": + version: 1.15.11 + resolution: "@swc/core-win32-x64-msvc@npm:1.15.11" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:^1.10.12": + version: 1.15.11 + resolution: "@swc/core@npm:1.15.11" + dependencies: + "@swc/core-darwin-arm64": "npm:1.15.11" + "@swc/core-darwin-x64": "npm:1.15.11" + "@swc/core-linux-arm-gnueabihf": "npm:1.15.11" + "@swc/core-linux-arm64-gnu": "npm:1.15.11" + "@swc/core-linux-arm64-musl": "npm:1.15.11" + "@swc/core-linux-x64-gnu": "npm:1.15.11" + "@swc/core-linux-x64-musl": "npm:1.15.11" + "@swc/core-win32-arm64-msvc": "npm:1.15.11" + "@swc/core-win32-ia32-msvc": "npm:1.15.11" + "@swc/core-win32-x64-msvc": "npm:1.15.11" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.25" + peerDependencies: + "@swc/helpers": ">=0.5.17" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10c0/84b9dbed8d4d39da9941b796f97f84a52a3ab1a5e002b0395e98d0c3368acab4dde84051eb97c47c85b67c5fc29e3e9b7a646cf238a96df93fc7c54177925c3e + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.25": + version: 0.1.25 + resolution: "@swc/types@npm:0.1.25" + dependencies: + "@swc/counter": "npm:^0.1.3" + checksum: 10c0/847a5b20b131281f89d640a7ed4887fb65724807d53d334b230e84b98c21097aa10cd28a074f9ed287a6ce109e443dd4bafbe7dcfb62333d7806c4ea3e7f8aca languageName: node linkType: hard @@ -280,6 +654,24 @@ __metadata: languageName: node linkType: hard +"@tokenizer/inflate@npm:^0.2.6": + version: 0.2.7 + resolution: "@tokenizer/inflate@npm:0.2.7" + dependencies: + debug: "npm:^4.4.0" + fflate: "npm:^0.8.2" + token-types: "npm:^6.0.0" + checksum: 10c0/75bd0c510810dfd62be9d963216b5852cde021e1f8aab43b37662bc6aa75e65fd7277fcab7d463186b55cee36a5b61129916161bdb2a7d18064016156c7daf4f + languageName: node + linkType: hard + +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 10c0/7ab9a822d4b5ff3f5bca7f7d14d46bdd8432528e028db4a52be7fbf90c7f495cc1af1324691dda2813c6af8dc4b8eb29de3107d4508165f9aa5b53e7d501f155 + languageName: node + linkType: hard + "@types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -290,9 +682,9 @@ __metadata: linkType: hard "@types/http-cache-semantics@npm:^4.0.2": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + version: 4.2.0 + resolution: "@types/http-cache-semantics@npm:4.2.0" + checksum: 10c0/82dd33cbe7d4843f1e884a251c6a12d385b62274353b9db167462e7fbffdbb3a83606f9952203017c5b8cabbd7b9eef0cf240a3a9dedd20f69875c9701939415 languageName: node linkType: hard @@ -303,18 +695,135 @@ __metadata: languageName: node linkType: hard +"@xhmikosr/archive-type@npm:^7.1.0": + version: 7.1.0 + resolution: "@xhmikosr/archive-type@npm:7.1.0" + dependencies: + file-type: "npm:^20.5.0" + checksum: 10c0/10e36dd8d4e8522d4e935820ba676e5125dbbe86360314bf67369bf5590c52663a32d38a0a31654a23fb7f92accd457847f19779e1069a790c16b5b51b198843 + languageName: node + linkType: hard + +"@xhmikosr/bin-check@npm:^7.1.0": + version: 7.1.0 + resolution: "@xhmikosr/bin-check@npm:7.1.0" + dependencies: + execa: "npm:^5.1.1" + isexe: "npm:^2.0.0" + checksum: 10c0/c609f9eae93774b49f15b38189b05253fd628c5f35e305bb06b509f7b12ab667ea2b68fb60ff0563283a1f3e35994023dc02393876e6f29a11a1640a805e5413 + languageName: node + linkType: hard + +"@xhmikosr/bin-wrapper@npm:^13.0.5": + version: 13.2.0 + resolution: "@xhmikosr/bin-wrapper@npm:13.2.0" + dependencies: + "@xhmikosr/bin-check": "npm:^7.1.0" + "@xhmikosr/downloader": "npm:^15.2.0" + "@xhmikosr/os-filter-obj": "npm:^3.0.0" + bin-version-check: "npm:^5.1.0" + checksum: 10c0/d20361b314d506f4b8d69e192f13438e2cd8f7b222f94693664234c8d9816d0044c000e38f7c11dd0c6681b846b0ab2072a37fe1e42e6f253101e3d144ad6d3c + languageName: node + linkType: hard + +"@xhmikosr/decompress-tar@npm:^8.0.1, @xhmikosr/decompress-tar@npm:^8.1.0": + version: 8.1.0 + resolution: "@xhmikosr/decompress-tar@npm:8.1.0" + dependencies: + file-type: "npm:^20.5.0" + is-stream: "npm:^2.0.1" + tar-stream: "npm:^3.1.7" + checksum: 10c0/d0ec69b0304780202890ccec82f1ce20f1483c7de085c546d18b9960d21f7cf8b8932d8707fce53f6bb7a8b585e6c76f1281762e0b6a0481380c0a321ba6e6e6 + languageName: node + linkType: hard + +"@xhmikosr/decompress-tarbz2@npm:^8.1.0": + version: 8.1.0 + resolution: "@xhmikosr/decompress-tarbz2@npm:8.1.0" + dependencies: + "@xhmikosr/decompress-tar": "npm:^8.0.1" + file-type: "npm:^20.5.0" + is-stream: "npm:^2.0.1" + seek-bzip: "npm:^2.0.0" + unbzip2-stream: "npm:^1.4.3" + checksum: 10c0/87c23631d99ca2f51b2f34c79a5a3db6812598bcd39eb9f15f77112eae16ac36ea43907a1fd0acdc83b64a85ed4273d7a321f44cc3a3ca842c533b433e3c97a5 + languageName: node + linkType: hard + +"@xhmikosr/decompress-targz@npm:^8.1.0": + version: 8.1.0 + resolution: "@xhmikosr/decompress-targz@npm:8.1.0" + dependencies: + "@xhmikosr/decompress-tar": "npm:^8.0.1" + file-type: "npm:^20.5.0" + is-stream: "npm:^2.0.1" + checksum: 10c0/6de5215a8197d0321db919b8ad89dd050f2fc90fbfd4e2392183d0a9a9aaa855633074ece1dd1e270f63965d7733ff0b7a9a8105235cb7f6f90c255455094154 + languageName: node + linkType: hard + +"@xhmikosr/decompress-unzip@npm:^7.1.0": + version: 7.1.0 + resolution: "@xhmikosr/decompress-unzip@npm:7.1.0" + dependencies: + file-type: "npm:^20.5.0" + get-stream: "npm:^6.0.1" + yauzl: "npm:^3.1.2" + checksum: 10c0/3583916ae1316a4250c5f5774276439a1170c8c90c92c9642ff28c2cc443cb8060707dc27ec57065cb19c699aea006d5c3dd9179f901113517bceb7b73d58c57 + languageName: node + linkType: hard + +"@xhmikosr/decompress@npm:^10.2.0": + version: 10.2.0 + resolution: "@xhmikosr/decompress@npm:10.2.0" + dependencies: + "@xhmikosr/decompress-tar": "npm:^8.1.0" + "@xhmikosr/decompress-tarbz2": "npm:^8.1.0" + "@xhmikosr/decompress-targz": "npm:^8.1.0" + "@xhmikosr/decompress-unzip": "npm:^7.1.0" + graceful-fs: "npm:^4.2.11" + strip-dirs: "npm:^3.0.0" + checksum: 10c0/d4af98c3a91d913dd210591c23b081d179ec07fcfd3ced2fe884b17ea315bcc7b2e7e0cb66e1ab04c5a85cde46c32f955692dcd7735b876a83008df1ffbb88a8 + languageName: node + linkType: hard + +"@xhmikosr/downloader@npm:^15.2.0": + version: 15.2.0 + resolution: "@xhmikosr/downloader@npm:15.2.0" + dependencies: + "@xhmikosr/archive-type": "npm:^7.1.0" + "@xhmikosr/decompress": "npm:^10.2.0" + content-disposition: "npm:^0.5.4" + defaults: "npm:^2.0.2" + ext-name: "npm:^5.0.0" + file-type: "npm:^20.5.0" + filenamify: "npm:^6.0.0" + get-stream: "npm:^6.0.1" + got: "npm:^13.0.0" + checksum: 10c0/b5ff18c00ab5163c1215d27f49ca0319b2153aafd22c43e1bb19c4460d52ecb50c71eb4e7b6eba491adeab5920f4154b8a57c7a2893cf0ae4f3d868363391a5e + languageName: node + linkType: hard + +"@xhmikosr/os-filter-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "@xhmikosr/os-filter-obj@npm:3.0.0" + dependencies: + arch: "npm:^3.0.0" + checksum: 10c0/e4f774ef8d36144b53749f02b602494653442379582756546415c05a5094f79931521cc0c430ab9f824a83a500ca64b8dd560e9f9b31e967bb608d2418050592 + languageName: node + linkType: hard + "abitype@npm:^1.0.8": - version: 1.0.8 - resolution: "abitype@npm:1.0.8" + version: 1.2.3 + resolution: "abitype@npm:1.2.3" peerDependencies: typescript: ">=5.0.4" - zod: ^3 >=3.22.0 + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: optional: true zod: optional: true - checksum: 10c0/d3393f32898c1f0f6da4eed2561da6830dcd0d5129a160fae9517214236ee6a6c8e5a0380b8b960c5bc1b949320bcbd015ec7f38b5d7444f8f2b854a1b5dd754 + checksum: 10c0/c8740de1ae4961723a153224a52cb9a34a57903fb5c2ad61d5082b0b79b53033c9335381aa8c663c7ec213c9955a9853f694d51e95baceedef27356f7745c634 languageName: node linkType: hard @@ -365,6 +874,13 @@ __metadata: languageName: node linkType: hard +"arch@npm:^3.0.0": + version: 3.0.0 + resolution: "arch@npm:3.0.0" + checksum: 10c0/abefcc6738a29632a2b48e7f5910f42fb26d2e2f9c6954cac80b6bdfc4048685c604ef8eb3fd862a7c0884785b20a66a1b44e2ba4b628fd34b80a0cc6a5a0493 + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -386,6 +902,18 @@ __metadata: languageName: node linkType: hard +"b4a@npm:^1.6.4": + version: 1.7.3 + resolution: "b4a@npm:1.7.3" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: 10c0/ac16d186e00fa0d16de1f1a4af413953bc762d50d5a0e382aaa744a13886600313b7293403ad77fc83f6b1489c3fc2610494d1026754a51d1b7cdac2115a7598 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -393,6 +921,46 @@ __metadata: languageName: node linkType: hard +"bare-events@npm:^2.7.0": + version: 2.8.2 + resolution: "bare-events@npm:2.8.2" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: 10c0/53fef240cf2cdcca62f78b6eead90ddb5a59b0929f414b13a63764c2b4f9de98ea8a578d033b04d64bb7b86dfbc402e937984e69950855cc3754c7b63da7db21 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bin-version-check@npm:^5.1.0": + version: 5.1.0 + resolution: "bin-version-check@npm:5.1.0" + dependencies: + bin-version: "npm:^6.0.0" + semver: "npm:^7.5.3" + semver-truncate: "npm:^3.0.0" + checksum: 10c0/f2a855b53b41e7200ab10fe6981fbd564430c2d58f7ae48cf71fe74b0071b802963efc0fa11fa066c0116057e8072e0a7cd63e2dae79283e37cc444a023116b4 + languageName: node + linkType: hard + +"bin-version@npm:^6.0.0": + version: 6.0.0 + resolution: "bin-version@npm:6.0.0" + dependencies: + execa: "npm:^5.0.0" + find-versions: "npm:^5.0.0" + checksum: 10c0/e06083cdeb056910009740687ae9ba3175d42c72082408d4c5cb88c91fa102d5a8aef9112c127e94c3b48b611ce048abef390a9b8376521e42541635dbd3c506 + languageName: node + linkType: hard + "brace-expansion@npm:^2.0.1": version: 2.0.2 resolution: "brace-expansion@npm:2.0.2" @@ -402,6 +970,32 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer@npm:^5.2.1": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -464,6 +1058,20 @@ __metadata: languageName: node linkType: hard +"commander@npm:^6.0.0": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + +"commander@npm:^8.3.0": + version: 8.3.0 + resolution: "commander@npm:8.3.0" + checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 + languageName: node + linkType: hard + "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -474,6 +1082,15 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:^0.5.4": + version: 0.5.4 + resolution: "content-disposition@npm:0.5.4" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb + languageName: node + linkType: hard + "cosmiconfig@npm:^8.0.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -500,15 +1117,26 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.4": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"cross-spawn@npm:^7.0.3": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 languageName: node linkType: hard @@ -528,6 +1156,13 @@ __metadata: languageName: node linkType: hard +"defaults@npm:^2.0.2": + version: 2.0.2 + resolution: "defaults@npm:2.0.2" + checksum: 10c0/3c10658b31cd388fde654a95bd37f69e95f199887cc2386031bd8ae0964f0af22d8ef221c4d4737cca38358be4a606f69f20bd3bb604afa6328f72b4e2a217a6 + languageName: node + linkType: hard + "defer-to-connect@npm:^2.0.1": version: 2.0.1 resolution: "defer-to-connect@npm:2.0.1" @@ -543,11 +1178,11 @@ __metadata: linkType: hard "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664 languageName: node linkType: hard @@ -563,51 +1198,178 @@ __metadata: languageName: node linkType: hard -"ethereum-cryptography@npm:^3.0.0": - version: 3.2.0 - resolution: "ethereum-cryptography@npm:3.2.0" - dependencies: - "@noble/ciphers": "npm:1.3.0" - "@noble/curves": "npm:1.9.0" - "@noble/hashes": "npm:1.8.0" - "@scure/bip32": "npm:1.7.0" - "@scure/bip39": "npm:1.6.0" - checksum: 10c0/55e9d7378f6660045a5f0f659eab2d92b232f4288b8415ed243f23c5b65ee1ad868124b20bb4a7c45d99b212316f746423b0cf4cac946590e5ae91a4ac45d7b0 +"ethereum-cryptography@npm:^3.0.0": + version: 3.2.0 + resolution: "ethereum-cryptography@npm:3.2.0" + dependencies: + "@noble/ciphers": "npm:1.3.0" + "@noble/curves": "npm:1.9.0" + "@noble/hashes": "npm:1.8.0" + "@scure/bip32": "npm:1.7.0" + "@scure/bip39": "npm:1.6.0" + checksum: 10c0/55e9d7378f6660045a5f0f659eab2d92b232f4288b8415ed243f23c5b65ee1ad868124b20bb4a7c45d99b212316f746423b0cf4cac946590e5ae91a4ac45d7b0 + languageName: node + linkType: hard + +"eventemitter3@npm:5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10c0/4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 + languageName: node + linkType: hard + +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: "npm:^2.7.0" + checksum: 10c0/a1d9a5e9f95843650f8ec240dd1221454c110189a9813f32cdf7185759b43f1f964367ac7dca4ebc69150b59043f2d77c7e122b0d03abf7c25477ea5494785a5 + languageName: node + linkType: hard + +"execa@npm:^5.0.0, execa@npm:^5.1.1": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"ext-list@npm:^2.0.0": + version: 2.2.2 + resolution: "ext-list@npm:2.2.2" + dependencies: + mime-db: "npm:^1.28.0" + checksum: 10c0/bfdb435f333dccbf3f9698dc9d8e38eb47b42d756800bfafa9ec0c1c8aace877c40095baf36f691bcfd09bb88ed247c6e51596e75a158280fa19cf8588a7e258 + languageName: node + linkType: hard + +"ext-name@npm:^5.0.0": + version: 5.0.0 + resolution: "ext-name@npm:5.0.0" + dependencies: + ext-list: "npm:^2.0.0" + sort-keys-length: "npm:^1.0.0" + checksum: 10c0/6750b34636bb6dca78e1bcc797615af68ecf50d62cf774624a32ee7879da99c949b5c41e8aa56ede4eb15c6abad6b1a8858d0934faab75ff6e2fd6f408debe18 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.5": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.20.1 + resolution: "fastq@npm:1.20.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/e5dd725884decb1f11e5c822221d76136f239d0236f176fab80b7b8f9e7619ae57e6b4e5b73defc21e6b9ef99437ee7b545cff8e6c2c337819633712fa9d352e + languageName: node + linkType: hard + +"fflate@npm:^0.8.2": + version: 0.8.2 + resolution: "fflate@npm:0.8.2" + checksum: 10c0/03448d630c0a583abea594835a9fdb2aaf7d67787055a761515bf4ed862913cfd693b4c4ffd5c3f3b355a70cf1e19033e9ae5aedcca103188aaff91b8bd6e293 languageName: node linkType: hard -"eventemitter3@npm:5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 10c0/4ba5c00c506e6c786b4d6262cfbce90ddc14c10d4667e5c83ae993c9de88aa856033994dd2b35b83e8dc1170e224e66a319fa80adc4c32adcd2379bbc75da814 +"file-type@npm:^20.5.0": + version: 20.5.0 + resolution: "file-type@npm:20.5.0" + dependencies: + "@tokenizer/inflate": "npm:^0.2.6" + strtok3: "npm:^10.2.0" + token-types: "npm:^6.0.0" + uint8array-extras: "npm:^1.4.0" + checksum: 10c0/9b13d7e4eca79752008f036712a42df78393f05b88b9013c5754b04d3eb90b051cb692836a04acf7d2c696cb9f28077ddf8ebd6830175807f14fddf837d63be3 languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 +"filename-reserved-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "filename-reserved-regex@npm:3.0.0" + checksum: 10c0/2b1df851a37f84723f9d8daf885ddfadd3dea2a124474db405295962abc1a01d6c9b6b27edec33bad32ef601e1a220f8a34d34f30ca5a911709700e2b517e268 languageName: node linkType: hard -"fast-diff@npm:^1.2.0": - version: 1.3.0 - resolution: "fast-diff@npm:1.3.0" - checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 +"filenamify@npm:^6.0.0": + version: 6.0.0 + resolution: "filenamify@npm:6.0.0" + dependencies: + filename-reserved-regex: "npm:^3.0.0" + checksum: 10c0/6798be1f7eea9eddb4517527a890a9d1b97083a6392b0ca392b79034d02d92411830d1b0e29f85ebfcb5cd4f8494388c7f9975fbada9d5f4088fc8474fdf20ae languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 languageName: node linkType: hard -"fast-uri@npm:^3.0.1": - version: 3.0.6 - resolution: "fast-uri@npm:3.0.6" - checksum: 10c0/74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 +"find-versions@npm:^5.0.0": + version: 5.1.0 + resolution: "find-versions@npm:5.1.0" + dependencies: + semver-regex: "npm:^4.0.5" + checksum: 10c0/f1ef79d0850e0bd1eba03def02892d31feccdef75129c14b2a2d1cec563e2c51ad5a01f6a7a2d59ddbf9ecca1014ff8a6353ff2e2885e004f7a81ab1488899d4 languageName: node linkType: hard @@ -625,13 +1387,22 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^6.0.1": +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 languageName: node linkType: hard +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + "glob@npm:^8.0.3": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -664,6 +1435,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^13.0.0": + version: 13.0.0 + resolution: "got@npm:13.0.0" + dependencies: + "@sindresorhus/is": "npm:^5.2.0" + "@szmarczak/http-timer": "npm:^5.0.1" + cacheable-lookup: "npm:^7.0.0" + cacheable-request: "npm:^10.2.8" + decompress-response: "npm:^6.0.0" + form-data-encoder: "npm:^2.1.2" + get-stream: "npm:^6.0.1" + http2-wrapper: "npm:^2.1.10" + lowercase-keys: "npm:^3.0.0" + p-cancelable: "npm:^3.0.0" + responselike: "npm:^3.0.0" + checksum: 10c0/d6a4648dc46f1f9df2637b8730d4e664349a93cb6df62c66dfbb48f7887ba79742a1cc90739a4eb1c15f790ca838ff641c5cdecdc877993627274aeb0f02b92d + languageName: node + linkType: hard + "graceful-fs@npm:4.2.10": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -671,6 +1461,13 @@ __metadata: languageName: node linkType: hard +"graceful-fs@npm:^4.2.11": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -695,6 +1492,20 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore@npm:^5.2.4": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -736,6 +1547,15 @@ __metadata: languageName: node linkType: hard +"inspect-with-kind@npm:^1.0.5": + version: 1.0.5 + resolution: "inspect-with-kind@npm:1.0.5" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/4a7ca641927d24b5f0fabbad48ed940cffa840d6cfa07b6bc475593f6e0679b4d30ec1714de289cb17b10214a36e6bdccc257262a1163e33741425e5d311e8d1 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -743,6 +1563,13 @@ __metadata: languageName: node linkType: hard +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -750,6 +1577,43 @@ __metadata: languageName: node linkType: hard +"is-glob@npm:^4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -758,13 +1622,13 @@ __metadata: linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7 languageName: node linkType: hard @@ -805,6 +1669,13 @@ __metadata: languageName: node linkType: hard +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + "latest-version@npm:^7.0.0": version: 7.0.0 resolution: "latest-version@npm:7.0.0" @@ -829,9 +1700,9 @@ __metadata: linkType: hard "lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 10c0/1264a90469f5bb95d4739c43eb6277d15b6d9e186df4ac68c3620443160fc669e2f14c11e7d8b2ccf078b81d06147c01a8ccced9aab9f9f63d50dcf8cace6bf6 languageName: node linkType: hard @@ -842,6 +1713,20 @@ __metadata: languageName: node linkType: hard +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + "micro-ftch@npm:^0.3.1": version: 0.3.1 resolution: "micro-ftch@npm:0.3.1" @@ -849,6 +1734,30 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"mime-db@npm:^1.28.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -872,6 +1781,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.3": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + "minimist@npm:^1.2.0": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -887,9 +1805,18 @@ __metadata: linkType: hard "normalize-url@npm:^8.0.0": - version: 8.0.2 - resolution: "normalize-url@npm:8.0.2" - checksum: 10c0/1c62eee6ce184ad4a463ff2984ce5e440a5058c9dd7c5ef80c0a7696bbb1d3638534e266afb14ef9678dfa07fb6c980ef4cde990c80eeee55900c378b7970584 + version: 8.1.1 + resolution: "normalize-url@npm:8.1.1" + checksum: 10c0/1beb700ce42acb2288f39453cdf8001eead55bbf046d407936a40404af420b8c1c6be97a869884ae9e659d7b1c744e40e905c875ac9290644eec2e3e6fb0b370 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac languageName: node linkType: hard @@ -902,9 +1829,18 @@ __metadata: languageName: node linkType: hard +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + "ox@npm:^0.8.3": - version: 0.8.3 - resolution: "ox@npm:0.8.3" + version: 0.8.9 + resolution: "ox@npm:0.8.9" dependencies: "@adraffy/ens-normalize": "npm:^1.11.0" "@noble/ciphers": "npm:^1.3.0" @@ -919,7 +1855,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/3fd2ef5322c2999331cfe46121b3685615236c30f94ca3d956097126e1ce04758c96a76e75198b6c6e34c4a0c5e2dbae7bfa0224ba7e38b9518558f0a3105123 + checksum: 10c0/d3a0c4e3f908e0d18914f17d9c832e777de6caf7d8395bf35978d9cca196e540fe63c230a40bfe462eb3a320c1aba0749e0bede0a5fc4e8501b20d4e784c64ad languageName: node linkType: hard @@ -963,6 +1899,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -970,6 +1913,13 @@ __metadata: languageName: node linkType: hard +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + "picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -977,6 +1927,25 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"piscina@npm:^4.3.1": + version: 4.9.2 + resolution: "piscina@npm:4.9.2" + dependencies: + "@napi-rs/nice": "npm:^1.0.1" + dependenciesMeta: + "@napi-rs/nice": + optional: true + checksum: 10c0/ab67830065ff41523cd901db41b11045cb00a0be43bf79323ff7b4ef2fbce5e3a56ad440d99d6c3944ce94451a0a69fd175500e3220b21efe54142e601322189 + languageName: node + linkType: hard + "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -1014,6 +1983,13 @@ __metadata: languageName: node linkType: hard +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -1036,11 +2012,11 @@ __metadata: linkType: hard "registry-auth-token@npm:^5.0.1": - version: 5.1.0 - resolution: "registry-auth-token@npm:5.1.0" + version: 5.1.1 + resolution: "registry-auth-token@npm:5.1.1" dependencies: - "@pnpm/npm-conf": "npm:^2.1.0" - checksum: 10c0/316229bd8a4acc29a362a7a3862ff809e608256f0fd9e0b133412b43d6a9ea18743756a0ec5ee1467a5384e1023602b85461b3d88d1336b11879e42f7cf02c12 + "@pnpm/npm-conf": "npm:^3.0.2" + checksum: 10c0/86b0f7fd87d327cb4177fee69bcf96563147ea72e206bc9c7a6a50a51c785a31b83a6c45956a489ed292d23b908b2755a075d0b2f7fec1ba91b1fb800b24cee3 languageName: node linkType: hard @@ -1083,12 +2059,93 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.4": - version: 7.7.2 - resolution: "semver@npm:7.7.2" +"reusify@npm:^1.0.4": + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"seek-bzip@npm:^2.0.0": + version: 2.0.0 + resolution: "seek-bzip@npm:2.0.0" + dependencies: + commander: "npm:^6.0.0" + bin: + seek-bunzip: bin/seek-bunzip + seek-table: bin/seek-bzip-table + checksum: 10c0/bca70b60aed2aa333b3c4f1f46a1306d3edc68aa6ac0e700c32fe40428bc9bdb8d38d7eacbf4bc276a062da25c761dccb926a91e8a02086e9897779626e9171d + languageName: node + linkType: hard + +"semver-regex@npm:^4.0.5": + version: 4.0.5 + resolution: "semver-regex@npm:4.0.5" + checksum: 10c0/c270eda133691dfaab90318df995e96222e4c26c47b17f7c8bd5e5fe88b81ed67b59695fe27546e0314b0f0423c7faed1f93379ad9db47c816df2ddf770918ff + languageName: node + linkType: hard + +"semver-truncate@npm:^3.0.0": + version: 3.0.0 + resolution: "semver-truncate@npm:3.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/faede4e69e81590ee6b4141f5e89ae1162cd0ecafe660f0ae72bca45f16677a01a3bc26283201b695cec8409e1e861b8b2b10b0621c1661983e7ab10736caeee + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.7.4 + resolution: "semver@npm:7.7.4" bin: semver: bin/semver.js - checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea + checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.3": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"slash@npm:3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b languageName: node linkType: hard @@ -1135,6 +2192,42 @@ __metadata: languageName: node linkType: hard +"sort-keys-length@npm:^1.0.0": + version: 1.0.1 + resolution: "sort-keys-length@npm:1.0.1" + dependencies: + sort-keys: "npm:^1.0.0" + checksum: 10c0/4567d08aa859c7e48b7e2cba14a8ae09a100f6a3bd7cf5d21dccd808d6332c945b9a7e2230a95c16e0e6eac1a943cd050ae51a5d1b4c8ec4b1e89a5801be9aa2 + languageName: node + linkType: hard + +"sort-keys@npm:^1.0.0": + version: 1.1.2 + resolution: "sort-keys@npm:1.1.2" + dependencies: + is-plain-obj: "npm:^1.0.0" + checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 + languageName: node + linkType: hard + +"source-map@npm:^0.7.3": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c + languageName: node + linkType: hard + +"streamx@npm:^2.15.0": + version: 2.23.0 + resolution: "streamx@npm:2.23.0" + dependencies: + events-universal: "npm:^1.0.0" + fast-fifo: "npm:^1.3.2" + text-decoder: "npm:^1.1.0" + checksum: 10c0/15708ce37818d588632fe1104e8febde573e33e8c0868bf583fce0703f3faf8d2a063c278e30df2270206811b69997f64eb78792099933a1fe757e786fbcbd44 + languageName: node + linkType: hard + "string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -1155,6 +2248,23 @@ __metadata: languageName: node linkType: hard +"strip-dirs@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-dirs@npm:3.0.0" + dependencies: + inspect-with-kind: "npm:^1.0.5" + is-plain-obj: "npm:^1.1.0" + checksum: 10c0/136cc8f3543f8785c5c59dc270d98106fb6625142e34304ea66a118338e5d5051681d650484a6737bee9bcfafd259fa5c044f4dda0f3bb5a5ffebf4e77effa11 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -1162,6 +2272,15 @@ __metadata: languageName: node linkType: hard +"strtok3@npm:^10.2.0": + version: 10.3.4 + resolution: "strtok3@npm:10.3.4" + dependencies: + "@tokenizer/token": "npm:^0.3.0" + checksum: 10c0/277ab69e417f4545e364ffaf9d560c991f531045dbace32d77b5c822cccd76a608b782785a2c60595274288d4d32dced184a5c21dc20348791da697127dc69a8 + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -1184,6 +2303,26 @@ __metadata: languageName: node linkType: hard +"tar-stream@npm:^3.1.7": + version: 3.1.7 + resolution: "tar-stream@npm:3.1.7" + dependencies: + b4a: "npm:^1.6.4" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 + languageName: node + linkType: hard + +"text-decoder@npm:^1.1.0": + version: 1.2.3 + resolution: "text-decoder@npm:1.2.3" + dependencies: + b4a: "npm:^1.6.4" + checksum: 10c0/569d776b9250158681c83656ef2c3e0a5d5c660c27ca69f87eedef921749a4fbf02095e5f9a0f862a25cf35258379b06e31dee9c125c9f72e273b7ca1a6d1977 + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -1191,6 +2330,50 @@ __metadata: languageName: node linkType: hard +"through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"token-types@npm:^6.0.0": + version: 6.1.2 + resolution: "token-types@npm:6.1.2" + dependencies: + "@borewit/text-codec": "npm:^0.2.1" + "@tokenizer/token": "npm:^0.3.0" + ieee754: "npm:^1.2.1" + checksum: 10c0/8786e28e3cb65b9e890bc3c38def98e6dfe4565538237f8c0e47dbe549ed8f5f00de8dc464717868308abb4729f1958f78f69e1c4c3deebbb685729113a6fee8 + languageName: node + linkType: hard + +"uint8array-extras@npm:^1.4.0": + version: 1.5.0 + resolution: "uint8array-extras@npm:1.5.0" + checksum: 10c0/0e74641ac7dadb02eadefc1ccdadba6010e007757bda824960de3c72bbe2b04e6d3af75648441f412148c4103261d54fcb60be45a2863beb76643a55fddba3bd + languageName: node + linkType: hard + +"unbzip2-stream@npm:^1.4.3": + version: 1.4.3 + resolution: "unbzip2-stream@npm:1.4.3" + dependencies: + buffer: "npm:^5.2.1" + through: "npm:^2.3.8" + checksum: 10c0/2ea2048f3c9db3499316ccc1d95ff757017ccb6f46c812d7c42466247e3b863fb178864267482f7f178254214247779daf68e85f50bd7736c3c97ba2d58b910a + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -1209,9 +2392,30 @@ __metadata: languageName: node linkType: hard +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 languageName: node linkType: hard + +"yauzl@npm:^3.1.2": + version: 3.2.0 + resolution: "yauzl@npm:3.2.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + pend: "npm:~1.2.0" + checksum: 10c0/7b40b3dc46b95761a2a764391d257a11f494d365875af73a1b48fe16d4bd103dd178612e60168d12a0e59a8ba4f6411a15a5e8871d5a5f78255d6cc1ce39ee62 + languageName: node + linkType: hard diff --git a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh index 4c73efdef968..1f768d9eb927 100755 --- a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh @@ -24,10 +24,9 @@ mkdir -p "l1-contracts/test/script" cp -p "$src/test/shouting.t.sol" "l1-contracts/test/" cp -p "$src"/test/script/*.sol "l1-contracts/test/script/" cp -p "$src"/{foundry.toml,foundry.lock,package.json,solc-*} "l1-contracts/" -# Compile the forge broadcast wrapper to JS (Node refuses to load .ts from node_modules). +# Copy the compiled forge broadcast wrapper (built by l1-contracts bootstrap). mkdir -p "l1-contracts/scripts" -npx swc "$src/scripts/forge_broadcast.ts" -o "l1-contracts/scripts/forge_broadcast.js" \ - --config-file="$(dirname "$0")/../../.swcrc" +cp -p "$src/scripts/forge_broadcast.js" "l1-contracts/scripts/" abs_dest=$(pwd)/l1-contracts # Keep only the foundry relevant files from lib (cd "$src" && find lib \( -name "*.sol" -o -name "remappings.txt" -o -name "foundry.toml" \) -exec cp --parents -t "$abs_dest" {} +) From d3dd0894dc3501bbae7cf87b40bd9b83c1b5c730 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 10 Feb 2026 11:52:19 +0000 Subject: [PATCH 11/11] chore: make forge_broadcast a plain .js file Node.js refuses to load .ts files from node_modules, so make the script plain JavaScript instead of compiling with swc. Removes @swc/cli and @swc/core devDependencies from l1-contracts. --- l1-contracts/.gitignore | 3 - l1-contracts/bootstrap.sh | 3 - l1-contracts/package.json | 2 - ...{forge_broadcast.ts => forge_broadcast.js} | 195 +-- l1-contracts/scripts/run_rollup_upgrade.sh | 2 +- l1-contracts/scripts/test_rollup_upgrade.sh | 2 +- l1-contracts/yarn.lock | 1220 +---------------- .../scripts/copy-foundry-artifacts.sh | 2 +- 8 files changed, 126 insertions(+), 1303 deletions(-) rename l1-contracts/scripts/{forge_broadcast.ts => forge_broadcast.js} (63%) diff --git a/l1-contracts/.gitignore b/l1-contracts/.gitignore index 6057088dbdc5..006a8750e720 100644 --- a/l1-contracts/.gitignore +++ b/l1-contracts/.gitignore @@ -28,9 +28,6 @@ solc-* yarn.lock .yarn/ -# Compiled JS from TypeScript (built by bootstrap) -scripts/forge_broadcast.js - # 'deploy_contracts' script output serve/ diff --git a/l1-contracts/bootstrap.sh b/l1-contracts/bootstrap.sh index 9c7b61323652..306495820577 100755 --- a/l1-contracts/bootstrap.sh +++ b/l1-contracts/bootstrap.sh @@ -108,9 +108,6 @@ function build_verifier { function build { build_src build_verifier - # Compile the forge broadcast wrapper to JS (Node refuses to load .ts from node_modules). - npx swc scripts/forge_broadcast.ts -o scripts/forge_broadcast.js \ - --no-swcrc -C jsc.target=es2022 -C jsc.parser.syntax=typescript -C module.type=es6 } function test_cmds { diff --git a/l1-contracts/package.json b/l1-contracts/package.json index 72a90d217d35..f7c83b6017d4 100644 --- a/l1-contracts/package.json +++ b/l1-contracts/package.json @@ -6,8 +6,6 @@ "description": "Aztec contracts for the Ethereum mainnet and testnets", "devDependencies": { "@openzeppelin/merkle-tree": "^1.0.8", - "@swc/cli": "^0.6.0", - "@swc/core": "^1.10.12", "ox": "^0.8.3", "solhint": "5.1.0" }, diff --git a/l1-contracts/scripts/forge_broadcast.ts b/l1-contracts/scripts/forge_broadcast.js similarity index 63% rename from l1-contracts/scripts/forge_broadcast.ts rename to l1-contracts/scripts/forge_broadcast.js index 60d3df98ac0f..d8df4462617a 100755 --- a/l1-contracts/scripts/forge_broadcast.ts +++ b/l1-contracts/scripts/forge_broadcast.js @@ -1,6 +1,7 @@ -#!/usr/bin/env -S node --experimental-strip-types +#!/usr/bin/env node +// Note: this would be .ts but Node.js refuses to load .ts from node_modules. -// forge_broadcast.ts - Reliable forge script broadcast with retry and timeout. +// forge_broadcast.js - Reliable forge script broadcast with retry and timeout. // // Wraps `forge script` with: // 1. --batch-size 8 to prevent forge broadcast hangs (forge bug with large RPC batches) @@ -16,13 +17,13 @@ // On real chains (where this anvil-specific bug doesn't apply), we use --resume. // // Usage: -// ./scripts/forge_broadcast.ts +// ./scripts/forge_broadcast.js // // Pass the same args you'd pass to `forge script`, WITHOUT --broadcast or --batch-size. // The wrapper adds those automatically. // // Example: -// ./scripts/forge_broadcast.ts script/deploy/Deploy.s.sol:Deploy \ +// ./scripts/forge_broadcast.js script/deploy/Deploy.s.sol:Deploy \ // --rpc-url "$RPC_URL" --private-key "$KEY" -vvv // // Environment variables: @@ -31,10 +32,10 @@ // // Uses only Node.js built-ins (no external dependencies). -import { spawn } from 'node:child_process'; -import { rmSync, writeSync } from 'node:fs'; -import { request as httpRequest } from 'node:http'; -import { request as httpsRequest } from 'node:https'; +import { spawn } from "node:child_process"; +import { rmSync, writeSync } from "node:fs"; +import { request as httpRequest } from "node:http"; +import { request as httpsRequest } from "node:https"; // Chain IDs for timeout selection. const MAINNET_CHAIN_ID = 1; @@ -42,12 +43,15 @@ const SEPOLIA_CHAIN_ID = 11155111; // Timeout per attempt: 300s for mainnet/sepolia (real chains are slow), 50s for everything else. // FORGE_BROADCAST_TIMEOUT env var overrides the auto-detected value. -function getDefaultTimeout(chainId: number | undefined): number { +function getDefaultTimeout(chainId) { if (chainId === MAINNET_CHAIN_ID || chainId === SEPOLIA_CHAIN_ID) return 300; return 50; } -const MAX_RETRIES = parseInt(process.env.FORGE_BROADCAST_MAX_RETRIES ?? '3', 10); +const MAX_RETRIES = parseInt( + process.env.FORGE_BROADCAST_MAX_RETRIES ?? "3", + 10, +); // Batch size of 8 prevents forge from hanging during broadcast. // See: https://github.com/foundry-rs/foundry/issues/6796 @@ -58,60 +62,68 @@ const EXIT_TIMEOUT = 124; // Delay before retry to let pending transactions settle in the mempool. const RETRY_DELAY = 10_000; -function log(msg: string): void { +function log(msg) { process.stderr.write(`[forge_broadcast] ${msg}\n`); } -function sleep(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); } /** Extract --rpc-url value from forge args. */ -function extractRpcUrl(args: string[]): string | undefined { +function extractRpcUrl(args) { for (let i = 0; i < args.length - 1; i++) { - if (args[i] === '--rpc-url') return args[i + 1]; + if (args[i] === "--rpc-url") return args[i + 1]; } return undefined; } /** Strip --verify from args, returning the filtered args and whether --verify was present. */ -function extractVerifyFlag(args: string[]): { args: string[]; verify: boolean } { - const filtered = args.filter(a => a !== '--verify'); +function extractVerifyFlag(args) { + const filtered = args.filter((a) => a !== "--verify"); return { args: filtered, verify: filtered.length !== args.length }; } const RPC_TIMEOUT = 10_000; /** JSON-RPC call using Node.js built-ins. Rejects on JSON-RPC errors and timeouts. */ -function rpcCall(rpcUrl: string, method: string, params: unknown[]): Promise { +function rpcCall(rpcUrl, method, params) { return new Promise((resolve, reject) => { const url = new URL(rpcUrl); - const body = JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }); - const reqFn = url.protocol === 'https:' ? httpsRequest : httpRequest; + const body = JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }); + const reqFn = url.protocol === "https:" ? httpsRequest : httpRequest; const timer = setTimeout(() => { req.destroy(); reject(new Error(`RPC call ${method} timed out after ${RPC_TIMEOUT}ms`)); }, RPC_TIMEOUT); - const req = reqFn(url, { method: 'POST', headers: { 'Content-Type': 'application/json' } }, res => { - let data = ''; - res.on('data', chunk => (data += chunk)); - res.on('end', () => { - clearTimeout(timer); - try { - const parsed = JSON.parse(data); - if (parsed.error) { - reject(new Error(`RPC error for ${method}: ${JSON.stringify(parsed.error)}`)); - } else { - resolve(parsed.result); + const req = reqFn( + url, + { method: "POST", headers: { "Content-Type": "application/json" } }, + (res) => { + let data = ""; + res.on("data", (chunk) => (data += chunk)); + res.on("end", () => { + clearTimeout(timer); + try { + const parsed = JSON.parse(data); + if (parsed.error) { + reject( + new Error( + `RPC error for ${method}: ${JSON.stringify(parsed.error)}`, + ), + ); + } else { + resolve(parsed.result); + } + } catch { + reject(new Error(`Bad RPC response: ${data.slice(0, 200)}`)); } - } catch { - reject(new Error(`Bad RPC response: ${data.slice(0, 200)}`)); - } - }); - }); - req.on('error', (err) => { + }); + }, + ); + req.on("error", (err) => { clearTimeout(timer); reject(err); }); @@ -121,50 +133,49 @@ function rpcCall(rpcUrl: string, method: string, params: unknown[]): Promise { +async function detectAnvil(rpcUrl) { try { - const version = (await rpcCall(rpcUrl, 'web3_clientVersion', [])) as string; - return version.toLowerCase().includes('anvil'); + const version = await rpcCall(rpcUrl, "web3_clientVersion", []); + return version.toLowerCase().includes("anvil"); } catch { return false; } } /** Get the chain ID from the RPC endpoint. */ -async function getChainId(rpcUrl: string): Promise { +async function getChainId(rpcUrl) { try { - const result = (await rpcCall(rpcUrl, 'eth_chainId', [])) as string; + const result = await rpcCall(rpcUrl, "eth_chainId", []); return parseInt(result, 16); } catch { return undefined; } } -interface ForgeResult { - exitCode: number; - stdout: Buffer[]; -} - -function runForge(args: string[], timeoutSecs: number): Promise { - return new Promise(resolve => { - const proc = spawn('forge', ['script', ...args, '--broadcast', '--batch-size', String(BATCH_SIZE)], { - stdio: ['ignore', 'pipe', 'inherit'], // buffer stdout, pass stderr through - }); +function runForge(args, timeoutSecs) { + return new Promise((resolve) => { + const proc = spawn( + "forge", + ["script", ...args, "--broadcast", "--batch-size", String(BATCH_SIZE)], + { + stdio: ["ignore", "pipe", "inherit"], // buffer stdout, pass stderr through + }, + ); - const stdout: Buffer[] = []; - proc.stdout!.on('data', (chunk: Buffer) => stdout.push(chunk)); + const stdout = []; + proc.stdout.on("data", (chunk) => stdout.push(chunk)); let timedOut = false; let settled = false; - let killTimer: ReturnType | undefined; + let killTimer; const timer = setTimeout(() => { timedOut = true; - proc.kill('SIGTERM'); - killTimer = setTimeout(() => proc.kill('SIGKILL'), KILL_GRACE); + proc.kill("SIGTERM"); + killTimer = setTimeout(() => proc.kill("SIGKILL"), KILL_GRACE); }, timeoutSecs * 1000); - const finish = (code: number): void => { + const finish = (code) => { if (settled) return; settled = true; clearTimeout(timer); @@ -172,8 +183,8 @@ function runForge(args: string[], timeoutSecs: number): Promise { resolve({ exitCode: timedOut ? EXIT_TIMEOUT : code, stdout }); }; - proc.on('error', () => finish(1)); - proc.on('close', code => finish(code ?? 1)); + proc.on("error", () => finish(1)); + proc.on("close", (code) => finish(code ?? 1)); }); } @@ -183,7 +194,9 @@ function runForge(args: string[], timeoutSecs: number): Promise { // happens after all receipts are collected (foundry-rs/foundry crates/script/src/lib.rs:333-338) // and forge exits non-zero if ANY verification fails (crates/script/src/verify.rs), even when // all transactions landed. We run verification as a separate step after broadcast succeeds. -const { args: forgeArgs, verify: wantsVerify } = extractVerifyFlag(process.argv.slice(2)); +const { args: forgeArgs, verify: wantsVerify } = extractVerifyFlag( + process.argv.slice(2), +); const rpcUrl = extractRpcUrl(forgeArgs); // Query chain info from RPC at startup. @@ -192,14 +205,16 @@ const TIMEOUT = process.env.FORGE_BROADCAST_TIMEOUT ? parseInt(process.env.FORGE_BROADCAST_TIMEOUT, 10) : getDefaultTimeout(chainId); -log(`chain_id=${chainId ?? 'unknown'}, timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}${wantsVerify ? ', verify=true (after broadcast)' : ''}`); +log( + `chain_id=${chainId ?? "unknown"}, timeout=${TIMEOUT}s, max_retries=${MAX_RETRIES}, batch_size=${BATCH_SIZE}${wantsVerify ? ", verify=true (after broadcast)" : ""}`, +); // Detect anvil once at startup. On anvil, retries reset the chain and start from scratch // instead of using --resume, because anvil's auto-miner can strand transactions in the // mempool in an unrecoverable state (neither evm_mine nor --resume can flush them). const isAnvil = rpcUrl ? await detectAnvil(rpcUrl) : false; if (isAnvil) { - log('Detected anvil — retries will reset chain instead of using --resume.'); + log("Detected anvil — retries will reset chain instead of using --resume."); } /** @@ -209,25 +224,41 @@ if (isAnvil) { * crates/script/src/verify.rs (verify_contracts). * Failure is logged but doesn't affect the exit code — transactions already landed. */ -async function runVerification(args: string[]): Promise { - log('Running contract verification (no timeout)...'); - const verifyResult = await new Promise(resolve => { - const proc = spawn('forge', ['script', ...args, '--broadcast', '--resume', '--verify'], { - stdio: ['ignore', 'inherit', 'inherit'], - }); +async function runVerification(args) { + log("Running contract verification (no timeout)..."); + const verifyResult = await new Promise((resolve) => { + const proc = spawn( + "forge", + ["script", ...args, "--broadcast", "--resume", "--verify"], + { + stdio: ["ignore", "inherit", "inherit"], + }, + ); let settled = false; - proc.on('error', () => { if (!settled) { settled = true; resolve(1); } }); - proc.on('close', code => { if (!settled) { settled = true; resolve(code ?? 1); } }); + proc.on("error", () => { + if (!settled) { + settled = true; + resolve(1); + } + }); + proc.on("close", (code) => { + if (!settled) { + settled = true; + resolve(code ?? 1); + } + }); }); if (verifyResult === 0) { - log('Contract verification succeeded.'); + log("Contract verification succeeded."); } else { - log(`Contract verification failed (exit ${verifyResult}). Transactions are on-chain; verify manually if needed.`); + log( + `Contract verification failed (exit ${verifyResult}). Transactions are on-chain; verify manually if needed.`, + ); } } /** Write buffered stdout to fd 1 (synchronous) and exit. */ -function emitAndExit(result: ForgeResult, code: number): never { +function emitAndExit(result, code) { const data = Buffer.concat(result.stdout); if (data.length > 0) { writeSync(1, data); @@ -236,7 +267,7 @@ function emitAndExit(result: ForgeResult, code: number): never { } /** Run verification if requested, then emit stdout and exit. */ -async function verifyAndExit(result: ForgeResult): Promise { +async function verifyAndExit(result) { if (wantsVerify) { await runVerification(forgeArgs); } @@ -248,11 +279,13 @@ log(`Attempt 1/${MAX_RETRIES + 1}: broadcasting...`); let result = await runForge(forgeArgs, TIMEOUT); if (result.exitCode === 0) { - log('Broadcast succeeded on first attempt.'); + log("Broadcast succeeded on first attempt."); await verifyAndExit(result); } -log(`Attempt 1 ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`); +log( + `Attempt 1 ${result.exitCode === EXIT_TIMEOUT ? `timed out after ${TIMEOUT}s` : `failed (exit ${result.exitCode})`}.`, +); for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { log(`Waiting ${RETRY_DELAY / 1000}s before retry...`); @@ -268,9 +301,11 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // - Forge computes new nonces from on-chain state // - New transactions replace any stuck ones with the same nonce // - The race condition is intermittent (~0.04%), so retries almost always succeed - rmSync('broadcast', { recursive: true, force: true }); + rmSync("broadcast", { recursive: true, force: true }); - log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: retrying from scratch (anvil)...`); + log( + `Attempt ${attempt + 1}/${MAX_RETRIES + 1}: retrying from scratch (anvil)...`, + ); result = await runForge(forgeArgs, TIMEOUT); } else { // On real chains: use --resume to pick up unmined transactions. @@ -279,7 +314,7 @@ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { // is only produced on the first attempt. We keep the first attempt's stdout (`result`) // and only check the exit code from the --resume attempt. log(`Attempt ${attempt + 1}/${MAX_RETRIES + 1}: --resume`); - const resumeResult = await runForge([...forgeArgs, '--resume'], TIMEOUT); + const resumeResult = await runForge([...forgeArgs, "--resume"], TIMEOUT); if (resumeResult.exitCode === 0) { log(`Broadcast succeeded on attempt ${attempt + 1}.`); diff --git a/l1-contracts/scripts/run_rollup_upgrade.sh b/l1-contracts/scripts/run_rollup_upgrade.sh index 66a71d038e73..3cabda3ecf09 100755 --- a/l1-contracts/scripts/run_rollup_upgrade.sh +++ b/l1-contracts/scripts/run_rollup_upgrade.sh @@ -21,7 +21,7 @@ echo "Registry: $registry_address" REGISTRY_ADDRESS="$registry_address" \ REAL_VERIFIER="${REAL_VERIFIER:-true}" \ -./scripts/forge_broadcast.ts \ +./scripts/forge_broadcast.js \ script/deploy/DeployRollupForUpgrade.s.sol:DeployRollupForUpgrade \ --rpc-url "$L1_RPC_URL" \ --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ diff --git a/l1-contracts/scripts/test_rollup_upgrade.sh b/l1-contracts/scripts/test_rollup_upgrade.sh index cabb79db7f00..5633984d94b9 100755 --- a/l1-contracts/scripts/test_rollup_upgrade.sh +++ b/l1-contracts/scripts/test_rollup_upgrade.sh @@ -32,7 +32,7 @@ export L1_RPC_URL="http://127.0.0.1:$ANVIL_PORT" export ROLLUP_DEPLOYMENT_PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" echo "=== Deploying initial L1 contracts ===" -./scripts/forge_broadcast.ts \ +./scripts/forge_broadcast.js \ script/deploy/DeployAztecL1Contracts.s.sol:DeployAztecL1Contracts \ --rpc-url "$L1_RPC_URL" \ --private-key "$ROLLUP_DEPLOYMENT_PRIVATE_KEY" \ diff --git a/l1-contracts/yarn.lock b/l1-contracts/yarn.lock index ff4f34ffc338..26f8e9c14913 100644 --- a/l1-contracts/yarn.lock +++ b/l1-contracts/yarn.lock @@ -17,8 +17,6 @@ __metadata: resolution: "@aztec/l1-contracts@workspace:." dependencies: "@openzeppelin/merkle-tree": "npm:^1.0.8" - "@swc/cli": "npm:^0.6.0" - "@swc/core": "npm:^1.10.12" ox: "npm:^0.8.3" solhint: "npm:5.1.0" languageName: unknown @@ -42,13 +40,6 @@ __metadata: languageName: node linkType: hard -"@borewit/text-codec@npm:^0.2.1": - version: 0.2.1 - resolution: "@borewit/text-codec@npm:0.2.1" - checksum: 10c0/aabd9c86497197aacc9ddb413857f112a98a9fd4be9ed56a24971a47bbec7c0d5d449efcad830f9895009c1a5914e5c448f972a0c968e97c4ebf99297dea7a6b - languageName: node - linkType: hard - "@ethereumjs/common@npm:^3.2.0": version: 3.2.0 resolution: "@ethereumjs/common@npm:3.2.0" @@ -125,185 +116,6 @@ __metadata: languageName: node linkType: hard -"@napi-rs/nice-android-arm-eabi@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-android-arm-eabi@npm:1.1.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@napi-rs/nice-android-arm64@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-android-arm64@npm:1.1.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/nice-darwin-arm64@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-darwin-arm64@npm:1.1.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/nice-darwin-x64@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-darwin-x64@npm:1.1.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/nice-freebsd-x64@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-freebsd-x64@npm:1.1.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/nice-linux-arm-gnueabihf@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-arm-gnueabihf@npm:1.1.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@napi-rs/nice-linux-arm64-gnu@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-arm64-gnu@npm:1.1.1" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/nice-linux-arm64-musl@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-arm64-musl@npm:1.1.1" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@napi-rs/nice-linux-ppc64-gnu@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-ppc64-gnu@npm:1.1.1" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/nice-linux-riscv64-gnu@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-riscv64-gnu@npm:1.1.1" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/nice-linux-s390x-gnu@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-s390x-gnu@npm:1.1.1" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/nice-linux-x64-gnu@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-x64-gnu@npm:1.1.1" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@napi-rs/nice-linux-x64-musl@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-linux-x64-musl@npm:1.1.1" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@napi-rs/nice-openharmony-arm64@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-openharmony-arm64@npm:1.1.1" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/nice-win32-arm64-msvc@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-win32-arm64-msvc@npm:1.1.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@napi-rs/nice-win32-ia32-msvc@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-win32-ia32-msvc@npm:1.1.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@napi-rs/nice-win32-x64-msvc@npm:1.1.1": - version: 1.1.1 - resolution: "@napi-rs/nice-win32-x64-msvc@npm:1.1.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/nice@npm:^1.0.1": - version: 1.1.1 - resolution: "@napi-rs/nice@npm:1.1.1" - dependencies: - "@napi-rs/nice-android-arm-eabi": "npm:1.1.1" - "@napi-rs/nice-android-arm64": "npm:1.1.1" - "@napi-rs/nice-darwin-arm64": "npm:1.1.1" - "@napi-rs/nice-darwin-x64": "npm:1.1.1" - "@napi-rs/nice-freebsd-x64": "npm:1.1.1" - "@napi-rs/nice-linux-arm-gnueabihf": "npm:1.1.1" - "@napi-rs/nice-linux-arm64-gnu": "npm:1.1.1" - "@napi-rs/nice-linux-arm64-musl": "npm:1.1.1" - "@napi-rs/nice-linux-ppc64-gnu": "npm:1.1.1" - "@napi-rs/nice-linux-riscv64-gnu": "npm:1.1.1" - "@napi-rs/nice-linux-s390x-gnu": "npm:1.1.1" - "@napi-rs/nice-linux-x64-gnu": "npm:1.1.1" - "@napi-rs/nice-linux-x64-musl": "npm:1.1.1" - "@napi-rs/nice-openharmony-arm64": "npm:1.1.1" - "@napi-rs/nice-win32-arm64-msvc": "npm:1.1.1" - "@napi-rs/nice-win32-ia32-msvc": "npm:1.1.1" - "@napi-rs/nice-win32-x64-msvc": "npm:1.1.1" - dependenciesMeta: - "@napi-rs/nice-android-arm-eabi": - optional: true - "@napi-rs/nice-android-arm64": - optional: true - "@napi-rs/nice-darwin-arm64": - optional: true - "@napi-rs/nice-darwin-x64": - optional: true - "@napi-rs/nice-freebsd-x64": - optional: true - "@napi-rs/nice-linux-arm-gnueabihf": - optional: true - "@napi-rs/nice-linux-arm64-gnu": - optional: true - "@napi-rs/nice-linux-arm64-musl": - optional: true - "@napi-rs/nice-linux-ppc64-gnu": - optional: true - "@napi-rs/nice-linux-riscv64-gnu": - optional: true - "@napi-rs/nice-linux-s390x-gnu": - optional: true - "@napi-rs/nice-linux-x64-gnu": - optional: true - "@napi-rs/nice-linux-x64-musl": - optional: true - "@napi-rs/nice-openharmony-arm64": - optional: true - "@napi-rs/nice-win32-arm64-msvc": - optional: true - "@napi-rs/nice-win32-ia32-msvc": - optional: true - "@napi-rs/nice-win32-x64-msvc": - optional: true - checksum: 10c0/517eacfd5d5de191f1469a6caad9f9e26924b25079550149fc792fb09d15184013a8a81966a666f08c0a93fbb17a458d50ba9e2e9d6a61141c6c515d083733b2 - languageName: node - linkType: hard - "@noble/ciphers@npm:1.3.0, @noble/ciphers@npm:^1.3.0": version: 1.3.0 resolution: "@noble/ciphers@npm:1.3.0" @@ -352,33 +164,6 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 - languageName: node - linkType: hard - "@openzeppelin/merkle-tree@npm:^1.0.8": version: 1.0.8 resolution: "@openzeppelin/merkle-tree@npm:1.0.8" @@ -486,165 +271,6 @@ __metadata: languageName: node linkType: hard -"@swc/cli@npm:^0.6.0": - version: 0.6.0 - resolution: "@swc/cli@npm:0.6.0" - dependencies: - "@swc/counter": "npm:^0.1.3" - "@xhmikosr/bin-wrapper": "npm:^13.0.5" - commander: "npm:^8.3.0" - fast-glob: "npm:^3.2.5" - minimatch: "npm:^9.0.3" - piscina: "npm:^4.3.1" - semver: "npm:^7.3.8" - slash: "npm:3.0.0" - source-map: "npm:^0.7.3" - peerDependencies: - "@swc/core": ^1.2.66 - chokidar: ^4.0.1 - peerDependenciesMeta: - chokidar: - optional: true - bin: - spack: bin/spack.js - swc: bin/swc.js - swcx: bin/swcx.js - checksum: 10c0/eaeac958e271c0ad41c94df0712b8fc65c884c8515439ac48451928f18bde6fa4f931c430cc3efc2bc3c2bc9af8fecca810e1c86962041e10a28200590314f6f - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-darwin-arm64@npm:1.15.11" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-x64@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-darwin-x64@npm:1.15.11" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.15.11" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@swc/core-linux-arm64-gnu@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-linux-arm64-gnu@npm:1.15.11" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-arm64-musl@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-linux-arm64-musl@npm:1.15.11" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-linux-x64-gnu@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-linux-x64-gnu@npm:1.15.11" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@swc/core-linux-x64-musl@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-linux-x64-musl@npm:1.15.11" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@swc/core-win32-arm64-msvc@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-win32-arm64-msvc@npm:1.15.11" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-win32-ia32-msvc@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-win32-ia32-msvc@npm:1.15.11" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@swc/core-win32-x64-msvc@npm:1.15.11": - version: 1.15.11 - resolution: "@swc/core-win32-x64-msvc@npm:1.15.11" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@swc/core@npm:^1.10.12": - version: 1.15.11 - resolution: "@swc/core@npm:1.15.11" - dependencies: - "@swc/core-darwin-arm64": "npm:1.15.11" - "@swc/core-darwin-x64": "npm:1.15.11" - "@swc/core-linux-arm-gnueabihf": "npm:1.15.11" - "@swc/core-linux-arm64-gnu": "npm:1.15.11" - "@swc/core-linux-arm64-musl": "npm:1.15.11" - "@swc/core-linux-x64-gnu": "npm:1.15.11" - "@swc/core-linux-x64-musl": "npm:1.15.11" - "@swc/core-win32-arm64-msvc": "npm:1.15.11" - "@swc/core-win32-ia32-msvc": "npm:1.15.11" - "@swc/core-win32-x64-msvc": "npm:1.15.11" - "@swc/counter": "npm:^0.1.3" - "@swc/types": "npm:^0.1.25" - peerDependencies: - "@swc/helpers": ">=0.5.17" - dependenciesMeta: - "@swc/core-darwin-arm64": - optional: true - "@swc/core-darwin-x64": - optional: true - "@swc/core-linux-arm-gnueabihf": - optional: true - "@swc/core-linux-arm64-gnu": - optional: true - "@swc/core-linux-arm64-musl": - optional: true - "@swc/core-linux-x64-gnu": - optional: true - "@swc/core-linux-x64-musl": - optional: true - "@swc/core-win32-arm64-msvc": - optional: true - "@swc/core-win32-ia32-msvc": - optional: true - "@swc/core-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@swc/helpers": - optional: true - checksum: 10c0/84b9dbed8d4d39da9941b796f97f84a52a3ab1a5e002b0395e98d0c3368acab4dde84051eb97c47c85b67c5fc29e3e9b7a646cf238a96df93fc7c54177925c3e - languageName: node - linkType: hard - -"@swc/counter@npm:^0.1.3": - version: 0.1.3 - resolution: "@swc/counter@npm:0.1.3" - checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 - languageName: node - linkType: hard - -"@swc/types@npm:^0.1.25": - version: 0.1.25 - resolution: "@swc/types@npm:0.1.25" - dependencies: - "@swc/counter": "npm:^0.1.3" - checksum: 10c0/847a5b20b131281f89d640a7ed4887fb65724807d53d334b230e84b98c21097aa10cd28a074f9ed287a6ce109e443dd4bafbe7dcfb62333d7806c4ea3e7f8aca - languageName: node - linkType: hard - "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -654,24 +280,6 @@ __metadata: languageName: node linkType: hard -"@tokenizer/inflate@npm:^0.2.6": - version: 0.2.7 - resolution: "@tokenizer/inflate@npm:0.2.7" - dependencies: - debug: "npm:^4.4.0" - fflate: "npm:^0.8.2" - token-types: "npm:^6.0.0" - checksum: 10c0/75bd0c510810dfd62be9d963216b5852cde021e1f8aab43b37662bc6aa75e65fd7277fcab7d463186b55cee36a5b61129916161bdb2a7d18064016156c7daf4f - languageName: node - linkType: hard - -"@tokenizer/token@npm:^0.3.0": - version: 0.3.0 - resolution: "@tokenizer/token@npm:0.3.0" - checksum: 10c0/7ab9a822d4b5ff3f5bca7f7d14d46bdd8432528e028db4a52be7fbf90c7f495cc1af1324691dda2813c6af8dc4b8eb29de3107d4508165f9aa5b53e7d501f155 - languageName: node - linkType: hard - "@types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -695,123 +303,6 @@ __metadata: languageName: node linkType: hard -"@xhmikosr/archive-type@npm:^7.1.0": - version: 7.1.0 - resolution: "@xhmikosr/archive-type@npm:7.1.0" - dependencies: - file-type: "npm:^20.5.0" - checksum: 10c0/10e36dd8d4e8522d4e935820ba676e5125dbbe86360314bf67369bf5590c52663a32d38a0a31654a23fb7f92accd457847f19779e1069a790c16b5b51b198843 - languageName: node - linkType: hard - -"@xhmikosr/bin-check@npm:^7.1.0": - version: 7.1.0 - resolution: "@xhmikosr/bin-check@npm:7.1.0" - dependencies: - execa: "npm:^5.1.1" - isexe: "npm:^2.0.0" - checksum: 10c0/c609f9eae93774b49f15b38189b05253fd628c5f35e305bb06b509f7b12ab667ea2b68fb60ff0563283a1f3e35994023dc02393876e6f29a11a1640a805e5413 - languageName: node - linkType: hard - -"@xhmikosr/bin-wrapper@npm:^13.0.5": - version: 13.2.0 - resolution: "@xhmikosr/bin-wrapper@npm:13.2.0" - dependencies: - "@xhmikosr/bin-check": "npm:^7.1.0" - "@xhmikosr/downloader": "npm:^15.2.0" - "@xhmikosr/os-filter-obj": "npm:^3.0.0" - bin-version-check: "npm:^5.1.0" - checksum: 10c0/d20361b314d506f4b8d69e192f13438e2cd8f7b222f94693664234c8d9816d0044c000e38f7c11dd0c6681b846b0ab2072a37fe1e42e6f253101e3d144ad6d3c - languageName: node - linkType: hard - -"@xhmikosr/decompress-tar@npm:^8.0.1, @xhmikosr/decompress-tar@npm:^8.1.0": - version: 8.1.0 - resolution: "@xhmikosr/decompress-tar@npm:8.1.0" - dependencies: - file-type: "npm:^20.5.0" - is-stream: "npm:^2.0.1" - tar-stream: "npm:^3.1.7" - checksum: 10c0/d0ec69b0304780202890ccec82f1ce20f1483c7de085c546d18b9960d21f7cf8b8932d8707fce53f6bb7a8b585e6c76f1281762e0b6a0481380c0a321ba6e6e6 - languageName: node - linkType: hard - -"@xhmikosr/decompress-tarbz2@npm:^8.1.0": - version: 8.1.0 - resolution: "@xhmikosr/decompress-tarbz2@npm:8.1.0" - dependencies: - "@xhmikosr/decompress-tar": "npm:^8.0.1" - file-type: "npm:^20.5.0" - is-stream: "npm:^2.0.1" - seek-bzip: "npm:^2.0.0" - unbzip2-stream: "npm:^1.4.3" - checksum: 10c0/87c23631d99ca2f51b2f34c79a5a3db6812598bcd39eb9f15f77112eae16ac36ea43907a1fd0acdc83b64a85ed4273d7a321f44cc3a3ca842c533b433e3c97a5 - languageName: node - linkType: hard - -"@xhmikosr/decompress-targz@npm:^8.1.0": - version: 8.1.0 - resolution: "@xhmikosr/decompress-targz@npm:8.1.0" - dependencies: - "@xhmikosr/decompress-tar": "npm:^8.0.1" - file-type: "npm:^20.5.0" - is-stream: "npm:^2.0.1" - checksum: 10c0/6de5215a8197d0321db919b8ad89dd050f2fc90fbfd4e2392183d0a9a9aaa855633074ece1dd1e270f63965d7733ff0b7a9a8105235cb7f6f90c255455094154 - languageName: node - linkType: hard - -"@xhmikosr/decompress-unzip@npm:^7.1.0": - version: 7.1.0 - resolution: "@xhmikosr/decompress-unzip@npm:7.1.0" - dependencies: - file-type: "npm:^20.5.0" - get-stream: "npm:^6.0.1" - yauzl: "npm:^3.1.2" - checksum: 10c0/3583916ae1316a4250c5f5774276439a1170c8c90c92c9642ff28c2cc443cb8060707dc27ec57065cb19c699aea006d5c3dd9179f901113517bceb7b73d58c57 - languageName: node - linkType: hard - -"@xhmikosr/decompress@npm:^10.2.0": - version: 10.2.0 - resolution: "@xhmikosr/decompress@npm:10.2.0" - dependencies: - "@xhmikosr/decompress-tar": "npm:^8.1.0" - "@xhmikosr/decompress-tarbz2": "npm:^8.1.0" - "@xhmikosr/decompress-targz": "npm:^8.1.0" - "@xhmikosr/decompress-unzip": "npm:^7.1.0" - graceful-fs: "npm:^4.2.11" - strip-dirs: "npm:^3.0.0" - checksum: 10c0/d4af98c3a91d913dd210591c23b081d179ec07fcfd3ced2fe884b17ea315bcc7b2e7e0cb66e1ab04c5a85cde46c32f955692dcd7735b876a83008df1ffbb88a8 - languageName: node - linkType: hard - -"@xhmikosr/downloader@npm:^15.2.0": - version: 15.2.0 - resolution: "@xhmikosr/downloader@npm:15.2.0" - dependencies: - "@xhmikosr/archive-type": "npm:^7.1.0" - "@xhmikosr/decompress": "npm:^10.2.0" - content-disposition: "npm:^0.5.4" - defaults: "npm:^2.0.2" - ext-name: "npm:^5.0.0" - file-type: "npm:^20.5.0" - filenamify: "npm:^6.0.0" - get-stream: "npm:^6.0.1" - got: "npm:^13.0.0" - checksum: 10c0/b5ff18c00ab5163c1215d27f49ca0319b2153aafd22c43e1bb19c4460d52ecb50c71eb4e7b6eba491adeab5920f4154b8a57c7a2893cf0ae4f3d868363391a5e - languageName: node - linkType: hard - -"@xhmikosr/os-filter-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "@xhmikosr/os-filter-obj@npm:3.0.0" - dependencies: - arch: "npm:^3.0.0" - checksum: 10c0/e4f774ef8d36144b53749f02b602494653442379582756546415c05a5094f79931521cc0c430ab9f824a83a500ca64b8dd560e9f9b31e967bb608d2418050592 - languageName: node - linkType: hard - "abitype@npm:^1.0.8": version: 1.2.3 resolution: "abitype@npm:1.2.3" @@ -874,13 +365,6 @@ __metadata: languageName: node linkType: hard -"arch@npm:^3.0.0": - version: 3.0.0 - resolution: "arch@npm:3.0.0" - checksum: 10c0/abefcc6738a29632a2b48e7f5910f42fb26d2e2f9c6954cac80b6bdfc4048685c604ef8eb3fd862a7c0884785b20a66a1b44e2ba4b628fd34b80a0cc6a5a0493 - languageName: node - linkType: hard - "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -902,18 +386,6 @@ __metadata: languageName: node linkType: hard -"b4a@npm:^1.6.4": - version: 1.7.3 - resolution: "b4a@npm:1.7.3" - peerDependencies: - react-native-b4a: "*" - peerDependenciesMeta: - react-native-b4a: - optional: true - checksum: 10c0/ac16d186e00fa0d16de1f1a4af413953bc762d50d5a0e382aaa744a13886600313b7293403ad77fc83f6b1489c3fc2610494d1026754a51d1b7cdac2115a7598 - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -921,46 +393,6 @@ __metadata: languageName: node linkType: hard -"bare-events@npm:^2.7.0": - version: 2.8.2 - resolution: "bare-events@npm:2.8.2" - peerDependencies: - bare-abort-controller: "*" - peerDependenciesMeta: - bare-abort-controller: - optional: true - checksum: 10c0/53fef240cf2cdcca62f78b6eead90ddb5a59b0929f414b13a63764c2b4f9de98ea8a578d033b04d64bb7b86dfbc402e937984e69950855cc3754c7b63da7db21 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"bin-version-check@npm:^5.1.0": - version: 5.1.0 - resolution: "bin-version-check@npm:5.1.0" - dependencies: - bin-version: "npm:^6.0.0" - semver: "npm:^7.5.3" - semver-truncate: "npm:^3.0.0" - checksum: 10c0/f2a855b53b41e7200ab10fe6981fbd564430c2d58f7ae48cf71fe74b0071b802963efc0fa11fa066c0116057e8072e0a7cd63e2dae79283e37cc444a023116b4 - languageName: node - linkType: hard - -"bin-version@npm:^6.0.0": - version: 6.0.0 - resolution: "bin-version@npm:6.0.0" - dependencies: - execa: "npm:^5.0.0" - find-versions: "npm:^5.0.0" - checksum: 10c0/e06083cdeb056910009740687ae9ba3175d42c72082408d4c5cb88c91fa102d5a8aef9112c127e94c3b48b611ce048abef390a9b8376521e42541635dbd3c506 - languageName: node - linkType: hard - "brace-expansion@npm:^2.0.1": version: 2.0.2 resolution: "brace-expansion@npm:2.0.2" @@ -970,32 +402,6 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.3": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 - languageName: node - linkType: hard - -"buffer@npm:^5.2.1": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e - languageName: node - linkType: hard - "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -1058,20 +464,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^6.0.0": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea - languageName: node - linkType: hard - -"commander@npm:^8.3.0": - version: 8.3.0 - resolution: "commander@npm:8.3.0" - checksum: 10c0/8b043bb8322ea1c39664a1598a95e0495bfe4ca2fad0d84a92d7d1d8d213e2a155b441d2470c8e08de7c4a28cf2bc6e169211c49e1b21d9f7edc6ae4d9356060 - languageName: node - linkType: hard - "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -1082,15 +474,6 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:^0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - "cosmiconfig@npm:^8.0.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -1117,18 +500,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.3": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"debug@npm:^4.3.4, debug@npm:^4.4.0": +"debug@npm:^4.3.4": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -1156,13 +528,6 @@ __metadata: languageName: node linkType: hard -"defaults@npm:^2.0.2": - version: 2.0.2 - resolution: "defaults@npm:2.0.2" - checksum: 10c0/3c10658b31cd388fde654a95bd37f69e95f199887cc2386031bd8ae0964f0af22d8ef221c4d4737cca38358be4a606f69f20bd3bb604afa6328f72b4e2a217a6 - languageName: node - linkType: hard - "defer-to-connect@npm:^2.0.1": version: 2.0.1 resolution: "defer-to-connect@npm:2.0.1" @@ -1218,82 +583,17 @@ __metadata: languageName: node linkType: hard -"events-universal@npm:^1.0.0": - version: 1.0.1 - resolution: "events-universal@npm:1.0.1" - dependencies: - bare-events: "npm:^2.7.0" - checksum: 10c0/a1d9a5e9f95843650f8ec240dd1221454c110189a9813f32cdf7185759b43f1f964367ac7dca4ebc69150b59043f2d77c7e122b0d03abf7c25477ea5494785a5 - languageName: node - linkType: hard - -"execa@npm:^5.0.0, execa@npm:^5.1.1": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f - languageName: node - linkType: hard - -"ext-list@npm:^2.0.0": - version: 2.2.2 - resolution: "ext-list@npm:2.2.2" - dependencies: - mime-db: "npm:^1.28.0" - checksum: 10c0/bfdb435f333dccbf3f9698dc9d8e38eb47b42d756800bfafa9ec0c1c8aace877c40095baf36f691bcfd09bb88ed247c6e51596e75a158280fa19cf8588a7e258 - languageName: node - linkType: hard - -"ext-name@npm:^5.0.0": - version: 5.0.0 - resolution: "ext-name@npm:5.0.0" - dependencies: - ext-list: "npm:^2.0.0" - sort-keys-length: "npm:^1.0.0" - checksum: 10c0/6750b34636bb6dca78e1bcc797615af68ecf50d62cf774624a32ee7879da99c949b5c41e8aa56ede4eb15c6abad6b1a8858d0934faab75ff6e2fd6f408debe18 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-diff@npm:^1.2.0": - version: 1.3.0 - resolution: "fast-diff@npm:1.3.0" - checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 - languageName: node - linkType: hard - -"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": - version: 1.3.2 - resolution: "fast-fifo@npm:1.3.2" - checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 languageName: node linkType: hard -"fast-glob@npm:^3.2.5": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.8" - checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 languageName: node linkType: hard @@ -1311,68 +611,6 @@ __metadata: languageName: node linkType: hard -"fastq@npm:^1.6.0": - version: 1.20.1 - resolution: "fastq@npm:1.20.1" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/e5dd725884decb1f11e5c822221d76136f239d0236f176fab80b7b8f9e7619ae57e6b4e5b73defc21e6b9ef99437ee7b545cff8e6c2c337819633712fa9d352e - languageName: node - linkType: hard - -"fflate@npm:^0.8.2": - version: 0.8.2 - resolution: "fflate@npm:0.8.2" - checksum: 10c0/03448d630c0a583abea594835a9fdb2aaf7d67787055a761515bf4ed862913cfd693b4c4ffd5c3f3b355a70cf1e19033e9ae5aedcca103188aaff91b8bd6e293 - languageName: node - linkType: hard - -"file-type@npm:^20.5.0": - version: 20.5.0 - resolution: "file-type@npm:20.5.0" - dependencies: - "@tokenizer/inflate": "npm:^0.2.6" - strtok3: "npm:^10.2.0" - token-types: "npm:^6.0.0" - uint8array-extras: "npm:^1.4.0" - checksum: 10c0/9b13d7e4eca79752008f036712a42df78393f05b88b9013c5754b04d3eb90b051cb692836a04acf7d2c696cb9f28077ddf8ebd6830175807f14fddf837d63be3 - languageName: node - linkType: hard - -"filename-reserved-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "filename-reserved-regex@npm:3.0.0" - checksum: 10c0/2b1df851a37f84723f9d8daf885ddfadd3dea2a124474db405295962abc1a01d6c9b6b27edec33bad32ef601e1a220f8a34d34f30ca5a911709700e2b517e268 - languageName: node - linkType: hard - -"filenamify@npm:^6.0.0": - version: 6.0.0 - resolution: "filenamify@npm:6.0.0" - dependencies: - filename-reserved-regex: "npm:^3.0.0" - checksum: 10c0/6798be1f7eea9eddb4517527a890a9d1b97083a6392b0ca392b79034d02d92411830d1b0e29f85ebfcb5cd4f8494388c7f9975fbada9d5f4088fc8474fdf20ae - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 - languageName: node - linkType: hard - -"find-versions@npm:^5.0.0": - version: 5.1.0 - resolution: "find-versions@npm:5.1.0" - dependencies: - semver-regex: "npm:^4.0.5" - checksum: 10c0/f1ef79d0850e0bd1eba03def02892d31feccdef75129c14b2a2d1cec563e2c51ad5a01f6a7a2d59ddbf9ecca1014ff8a6353ff2e2885e004f7a81ab1488899d4 - languageName: node - linkType: hard - "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -1387,22 +625,13 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": +"get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 languageName: node linkType: hard -"glob-parent@npm:^5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - "glob@npm:^8.0.3": version: 8.1.0 resolution: "glob@npm:8.1.0" @@ -1435,25 +664,6 @@ __metadata: languageName: node linkType: hard -"got@npm:^13.0.0": - version: 13.0.0 - resolution: "got@npm:13.0.0" - dependencies: - "@sindresorhus/is": "npm:^5.2.0" - "@szmarczak/http-timer": "npm:^5.0.1" - cacheable-lookup: "npm:^7.0.0" - cacheable-request: "npm:^10.2.8" - decompress-response: "npm:^6.0.0" - form-data-encoder: "npm:^2.1.2" - get-stream: "npm:^6.0.1" - http2-wrapper: "npm:^2.1.10" - lowercase-keys: "npm:^3.0.0" - p-cancelable: "npm:^3.0.0" - responselike: "npm:^3.0.0" - checksum: 10c0/d6a4648dc46f1f9df2637b8730d4e664349a93cb6df62c66dfbb48f7887ba79742a1cc90739a4eb1c15f790ca838ff641c5cdecdc877993627274aeb0f02b92d - languageName: node - linkType: hard - "graceful-fs@npm:4.2.10": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -1461,13 +671,6 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.2.11": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -1492,20 +695,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - "ignore@npm:^5.2.4": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -1547,15 +736,6 @@ __metadata: languageName: node linkType: hard -"inspect-with-kind@npm:^1.0.5": - version: 1.0.5 - resolution: "inspect-with-kind@npm:1.0.5" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 10c0/4a7ca641927d24b5f0fabbad48ed940cffa840d6cfa07b6bc475593f6e0679b4d30ec1714de289cb17b10214a36e6bdccc257262a1163e33741425e5d311e8d1 - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -1563,13 +743,6 @@ __metadata: languageName: node linkType: hard -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 - languageName: node - linkType: hard - "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -1577,43 +750,6 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -1669,13 +805,6 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 - languageName: node - linkType: hard - "latest-version@npm:^7.0.0": version: 7.0.0 resolution: "latest-version@npm:7.0.0" @@ -1713,20 +842,6 @@ __metadata: languageName: node linkType: hard -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb - languageName: node - linkType: hard - "micro-ftch@npm:^0.3.1": version: 0.3.1 resolution: "micro-ftch@npm:0.3.1" @@ -1734,30 +849,6 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 - languageName: node - linkType: hard - -"mime-db@npm:^1.28.0": - version: 1.54.0 - resolution: "mime-db@npm:1.54.0" - checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 - languageName: node - linkType: hard - "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -1781,15 +872,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.3": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - "minimist@npm:^1.2.0": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -1811,15 +893,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac - languageName: node - linkType: hard - "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -1829,15 +902,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f - languageName: node - linkType: hard - "ox@npm:^0.8.3": version: 0.8.9 resolution: "ox@npm:0.8.9" @@ -1899,13 +963,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -1913,13 +970,6 @@ __metadata: languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 - languageName: node - linkType: hard - "picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -1927,25 +977,6 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be - languageName: node - linkType: hard - -"piscina@npm:^4.3.1": - version: 4.9.2 - resolution: "piscina@npm:4.9.2" - dependencies: - "@napi-rs/nice": "npm:^1.0.1" - dependenciesMeta: - "@napi-rs/nice": - optional: true - checksum: 10c0/ab67830065ff41523cd901db41b11045cb00a0be43bf79323ff7b4ef2fbce5e3a56ad440d99d6c3944ce94451a0a69fd175500e3220b21efe54142e601322189 - languageName: node - linkType: hard - "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -1983,13 +1014,6 @@ __metadata: languageName: node linkType: hard -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 - languageName: node - linkType: hard - "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -2059,58 +1083,7 @@ __metadata: languageName: node linkType: hard -"reusify@npm:^1.0.4": - version: 1.1.0 - resolution: "reusify@npm:1.1.0" - checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"seek-bzip@npm:^2.0.0": - version: 2.0.0 - resolution: "seek-bzip@npm:2.0.0" - dependencies: - commander: "npm:^6.0.0" - bin: - seek-bunzip: bin/seek-bunzip - seek-table: bin/seek-bzip-table - checksum: 10c0/bca70b60aed2aa333b3c4f1f46a1306d3edc68aa6ac0e700c32fe40428bc9bdb8d38d7eacbf4bc276a062da25c761dccb926a91e8a02086e9897779626e9171d - languageName: node - linkType: hard - -"semver-regex@npm:^4.0.5": - version: 4.0.5 - resolution: "semver-regex@npm:4.0.5" - checksum: 10c0/c270eda133691dfaab90318df995e96222e4c26c47b17f7c8bd5e5fe88b81ed67b59695fe27546e0314b0f0423c7faed1f93379ad9db47c816df2ddf770918ff - languageName: node - linkType: hard - -"semver-truncate@npm:^3.0.0": - version: 3.0.0 - resolution: "semver-truncate@npm:3.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/faede4e69e81590ee6b4141f5e89ae1162cd0ecafe660f0ae72bca45f16677a01a3bc26283201b695cec8409e1e861b8b2b10b0621c1661983e7ab10736caeee - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.4": version: 7.7.4 resolution: "semver@npm:7.7.4" bin: @@ -2119,36 +1092,6 @@ __metadata: languageName: node linkType: hard -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.3": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"slash@npm:3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b - languageName: node - linkType: hard - "slice-ansi@npm:^4.0.0": version: 4.0.0 resolution: "slice-ansi@npm:4.0.0" @@ -2192,42 +1135,6 @@ __metadata: languageName: node linkType: hard -"sort-keys-length@npm:^1.0.0": - version: 1.0.1 - resolution: "sort-keys-length@npm:1.0.1" - dependencies: - sort-keys: "npm:^1.0.0" - checksum: 10c0/4567d08aa859c7e48b7e2cba14a8ae09a100f6a3bd7cf5d21dccd808d6332c945b9a7e2230a95c16e0e6eac1a943cd050ae51a5d1b4c8ec4b1e89a5801be9aa2 - languageName: node - linkType: hard - -"sort-keys@npm:^1.0.0": - version: 1.1.2 - resolution: "sort-keys@npm:1.1.2" - dependencies: - is-plain-obj: "npm:^1.0.0" - checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 - languageName: node - linkType: hard - -"source-map@npm:^0.7.3": - version: 0.7.6 - resolution: "source-map@npm:0.7.6" - checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c - languageName: node - linkType: hard - -"streamx@npm:^2.15.0": - version: 2.23.0 - resolution: "streamx@npm:2.23.0" - dependencies: - events-universal: "npm:^1.0.0" - fast-fifo: "npm:^1.3.2" - text-decoder: "npm:^1.1.0" - checksum: 10c0/15708ce37818d588632fe1104e8febde573e33e8c0868bf583fce0703f3faf8d2a063c278e30df2270206811b69997f64eb78792099933a1fe757e786fbcbd44 - languageName: node - linkType: hard - "string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -2248,23 +1155,6 @@ __metadata: languageName: node linkType: hard -"strip-dirs@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-dirs@npm:3.0.0" - dependencies: - inspect-with-kind: "npm:^1.0.5" - is-plain-obj: "npm:^1.1.0" - checksum: 10c0/136cc8f3543f8785c5c59dc270d98106fb6625142e34304ea66a118338e5d5051681d650484a6737bee9bcfafd259fa5c044f4dda0f3bb5a5ffebf4e77effa11 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f - languageName: node - linkType: hard - "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" @@ -2272,15 +1162,6 @@ __metadata: languageName: node linkType: hard -"strtok3@npm:^10.2.0": - version: 10.3.4 - resolution: "strtok3@npm:10.3.4" - dependencies: - "@tokenizer/token": "npm:^0.3.0" - checksum: 10c0/277ab69e417f4545e364ffaf9d560c991f531045dbace32d77b5c822cccd76a608b782785a2c60595274288d4d32dced184a5c21dc20348791da697127dc69a8 - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -2303,26 +1184,6 @@ __metadata: languageName: node linkType: hard -"tar-stream@npm:^3.1.7": - version: 3.1.7 - resolution: "tar-stream@npm:3.1.7" - dependencies: - b4a: "npm:^1.6.4" - fast-fifo: "npm:^1.2.0" - streamx: "npm:^2.15.0" - checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 - languageName: node - linkType: hard - -"text-decoder@npm:^1.1.0": - version: 1.2.3 - resolution: "text-decoder@npm:1.2.3" - dependencies: - b4a: "npm:^1.6.4" - checksum: 10c0/569d776b9250158681c83656ef2c3e0a5d5c660c27ca69f87eedef921749a4fbf02095e5f9a0f862a25cf35258379b06e31dee9c125c9f72e273b7ca1a6d1977 - languageName: node - linkType: hard - "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -2330,50 +1191,6 @@ __metadata: languageName: node linkType: hard -"through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 - languageName: node - linkType: hard - -"token-types@npm:^6.0.0": - version: 6.1.2 - resolution: "token-types@npm:6.1.2" - dependencies: - "@borewit/text-codec": "npm:^0.2.1" - "@tokenizer/token": "npm:^0.3.0" - ieee754: "npm:^1.2.1" - checksum: 10c0/8786e28e3cb65b9e890bc3c38def98e6dfe4565538237f8c0e47dbe549ed8f5f00de8dc464717868308abb4729f1958f78f69e1c4c3deebbb685729113a6fee8 - languageName: node - linkType: hard - -"uint8array-extras@npm:^1.4.0": - version: 1.5.0 - resolution: "uint8array-extras@npm:1.5.0" - checksum: 10c0/0e74641ac7dadb02eadefc1ccdadba6010e007757bda824960de3c72bbe2b04e6d3af75648441f412148c4103261d54fcb60be45a2863beb76643a55fddba3bd - languageName: node - linkType: hard - -"unbzip2-stream@npm:^1.4.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: "npm:^5.2.1" - through: "npm:^2.3.8" - checksum: 10c0/2ea2048f3c9db3499316ccc1d95ff757017ccb6f46c812d7c42466247e3b863fb178864267482f7f178254214247779daf68e85f50bd7736c3c97ba2d58b910a - languageName: node - linkType: hard - "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -2392,30 +1209,9 @@ __metadata: languageName: node linkType: hard -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 languageName: node linkType: hard - -"yauzl@npm:^3.1.2": - version: 3.2.0 - resolution: "yauzl@npm:3.2.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - pend: "npm:~1.2.0" - checksum: 10c0/7b40b3dc46b95761a2a764391d257a11f494d365875af73a1b48fe16d4bd103dd178612e60168d12a0e59a8ba4f6411a15a5e8871d5a5f78255d6cc1ce39ee62 - languageName: node - linkType: hard diff --git a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh index 1f768d9eb927..cb2f03b42cc5 100755 --- a/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/copy-foundry-artifacts.sh @@ -24,7 +24,7 @@ mkdir -p "l1-contracts/test/script" cp -p "$src/test/shouting.t.sol" "l1-contracts/test/" cp -p "$src"/test/script/*.sol "l1-contracts/test/script/" cp -p "$src"/{foundry.toml,foundry.lock,package.json,solc-*} "l1-contracts/" -# Copy the compiled forge broadcast wrapper (built by l1-contracts bootstrap). +# Copy the forge broadcast wrapper (now a plain .js source file). mkdir -p "l1-contracts/scripts" cp -p "$src/scripts/forge_broadcast.js" "l1-contracts/scripts/" abs_dest=$(pwd)/l1-contracts