diff --git a/audit-ci.jsonc b/audit-ci.jsonc index 90341e7e..3c89eb61 100644 --- a/audit-ci.jsonc +++ b/audit-ci.jsonc @@ -22,8 +22,6 @@ "GHSA-5h3x-9wvq-w4m2", // axios cookies data-privacy issue; used only in hardhat-deploy and sol2uml (dev deps) "GHSA-wf5p-g6vw-rhxx", - // semver vulnerable to Regular Expression Denial of Service - "GHSA-c2qf-rxjj-qqgw", // flat vulnerable to Prototype Pollution "GHSA-2j2x-2gpw-g8fm", // regular expression DoS in debug @@ -34,14 +32,10 @@ "GHSA-f8q6-p94x-37v3", // Server-Side Request Forgery in Request "GHSA-p8p7-x288-28g6", - // Prototype Pollution in lodash - "GHSA-p6mc-m468-83gw", // OpenZeppelin Contracts using MerkleProof multiproofs may allow proving arbitrary leaves for specific trees; unused "GHSA-wprv-93r4-jj2p", // follow-redirects improperly handles URLs in the url.parse() function "GHSA-jchw-25xp-jwwc", - // Undici's cookie header not cleared on cross-origin redirect in fetch, - "GHSA-wqq4-5wpv-mx2g", // yargs-parser Vulnerable to Prototype Pollution "GHSA-p9pc-299p-vxgp", // Axios vulnerable to Server-Side Request Forgery @@ -51,6 +45,8 @@ // Exposure of Sensitive Information to an Unauthorized Actor in follow-redirects "GHSA-pw2r-vq6v-hr8c", // Exposure of sensitive information in follow-redirects - "GHSA-74fj-2j2h-c42q" + "GHSA-74fj-2j2h-c42q", + // Open Zeppelin: Base64 encoding may read from potentially dirty memory + "GHSA-9vx6-7xxf-x967" ] } diff --git a/foundry.toml b/foundry.toml index 774b6a24..7ba3e2bb 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,7 +5,7 @@ libs = ['node_modules', 'lib'] test = 'test/foundry' cache_path = 'forge-cache/sol' optimizer = true -optimizer_runs = 20000 +optimizer_runs = 100 via_ir = false solc_version = '0.8.9' diff --git a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch b/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch deleted file mode 100644 index 9156511d..00000000 --- a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch +++ /dev/null @@ -1,263 +0,0 @@ -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -index 02997fe..ea8a589 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -@@ -1,6 +1,7 @@ - export declare const pluginName = "@nomiclabs/hardhat-etherscan"; - export declare const TASK_VERIFY = "verify"; - export declare const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+export declare const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - export declare const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; - export declare const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; - export declare const TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -index 3c39b90..3ea23f9 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -@@ -1,9 +1,10 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); --exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; -+exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_FULL_BUILD = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; - exports.pluginName = "@nomiclabs/hardhat-etherscan"; - exports.TASK_VERIFY = "verify"; - exports.TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+exports.TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; - exports.TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; - exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -index 0f8a4d5..3502c2c 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -@@ -140,9 +140,18 @@ Possible causes are: - const solcFullVersion = deployedBytecode.isOvmInferred() - ? contractInformation.solcVersion - : await (0, version_1.getLongVersion)(contractInformation.solcVersion); -- const minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { -- sourceName: contractInformation.sourceName, -- }); -+ let minimumBuild; -+ try { -+ minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } -+ catch (error) { -+ console.warn('Unable to produce minimum build, proceeding to use full build...'); -+ minimumBuild = await run(constants_1.TASK_VERIFY_GET_FULL_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } - const success = await run(constants_1.TASK_VERIFY_VERIFY_MINIMUM_BUILD, { - minimumBuild, - contractInformation, -@@ -276,6 +285,44 @@ const getMinimumBuild = async function ({ sourceName }, { run }) { - }); - return build; - }; -+const getFullBuild = async function ({ sourceName }, { run }) { -+ const sourcePaths = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS); -+ const sourceNames = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, { -+ sourcePaths, -+ }); -+ const dependencyGraph = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, { sourceNames }); -+ const resolvedFiles = dependencyGraph -+ .getResolvedFiles() -+ .filter((resolvedFile) => { -+ return resolvedFile.sourceName === sourceName; -+ }); -+ assertHardhatPluginInvariant(resolvedFiles.length === 1, `The plugin found an unexpected number of files for this contract.`); -+ const compilationJobsCreationResult = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { -+ dependencyGraph, -+ }); -+ await run(task_names_1.TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { -+ compilationJobsCreationErrors: compilationJobsCreationResult.errors, -+ }); -+ const compilationJobs = compilationJobsCreationResult.jobs; -+ // const filteredCompilationJobs: CompilationJob[] = await run( -+ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ // { compilationJobs, force: false } -+ // ); -+ const mergedCompilationJobs = await run(task_names_1.TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, { compilationJobs: compilationJobs }); -+ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { -+ return (cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > -+ 0); -+ }); -+ const compilationJob = targetCompilationJobs[0]; -+ const build = await run(task_names_1.TASK_COMPILE_SOLIDITY_COMPILE_JOB, { -+ compilationJob, -+ compilationJobs: [compilationJob], -+ compilationJobIndex: 0, -+ emitsArtifacts: false, -+ quiet: true, -+ }); -+ return build; -+}; - async function inferContract(artifacts, network, matchingCompilerVersions, deployedBytecode) { - const contractMatches = await (0, bytecode_1.lookupMatchingBytecode)(artifacts, matchingCompilerVersions, deployedBytecode); - if (contractMatches.length === 0) { -@@ -429,6 +476,9 @@ This means that unrelated contracts may be displayed on Etherscan... - (0, config_1.subtask)(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD) - .addParam("sourceName", undefined, undefined, config_1.types.string) - .setAction(getMinimumBuild); -+(0, config_1.subtask)(constants_1.TASK_VERIFY_GET_FULL_BUILD) -+ .addParam("sourceName", undefined, undefined, config_1.types.string) -+ .setAction(getFullBuild); - (0, config_1.task)(constants_1.TASK_VERIFY, "Verifies contract on Etherscan") - .addOptionalPositionalParam("address", "Address of the smart contract to verify") - .addOptionalParam("constructorArgs", "File path to a javascript module that exports the list of arguments.", undefined, config_1.types.inputFile) -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -index cb029e2..0e5341d 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -@@ -1,6 +1,7 @@ - export const pluginName = "@nomiclabs/hardhat-etherscan"; - export const TASK_VERIFY = "verify"; - export const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+export const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - export const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = - "verify:get-constructor-arguments"; - export const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -index e55c99b..5661415 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -@@ -1,8 +1,14 @@ - import { - TASK_COMPILE, - TASK_COMPILE_SOLIDITY_COMPILE_JOB, -+ TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, - TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, - TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS, -+ TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, -+ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, - } from "hardhat/builtin-tasks/task-names"; - import { extendConfig, subtask, task, types } from "hardhat/config"; - import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -@@ -10,6 +16,7 @@ import { - ActionType, - Artifacts, - CompilationJob, -+ CompilationJobsCreationResult, - CompilerInput, - CompilerOutput, - DependencyGraph, -@@ -33,6 +40,7 @@ import { - TASK_VERIFY_GET_ETHERSCAN_ENDPOINT, - TASK_VERIFY_GET_LIBRARIES, - TASK_VERIFY_GET_MINIMUM_BUILD, -+ TASK_VERIFY_GET_FULL_BUILD, - TASK_VERIFY_VERIFY, - TASK_VERIFY_VERIFY_MINIMUM_BUILD, - } from "./constants"; -@@ -292,9 +300,17 @@ Possible causes are: - ? contractInformation.solcVersion - : await getLongVersion(contractInformation.solcVersion); - -- const minimumBuild: Build = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { -- sourceName: contractInformation.sourceName, -- }); -+ let minimumBuild: Build; -+ try { -+ minimumBuild = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } catch (error) { -+ console.warn('Unable to produce minimum build, proceeding to use full build...') -+ minimumBuild = await run(TASK_VERIFY_GET_FULL_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } - - const success: boolean = await run(TASK_VERIFY_VERIFY_MINIMUM_BUILD, { - minimumBuild, -@@ -531,7 +547,74 @@ const getMinimumBuild: ActionType = async function ( - emitsArtifacts: false, - quiet: true, - }); -+ return build; -+}; -+ -+const getFullBuild: ActionType = async function ( -+ { sourceName }, -+ { run } -+): Promise { -+ const sourcePaths: string[] = await run( -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS -+ ); -+ -+ const sourceNames: string[] = await run( -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, -+ { -+ sourcePaths, -+ } -+ ); -+ -+ const dependencyGraph: DependencyGraph = await run( -+ TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -+ { sourceNames } -+ ); -+ -+ const resolvedFiles = dependencyGraph -+ .getResolvedFiles() -+ .filter((resolvedFile) => { -+ return resolvedFile.sourceName === sourceName; -+ }); -+ assertHardhatPluginInvariant( -+ resolvedFiles.length === 1, -+ `The plugin found an unexpected number of files for this contract.` -+ ); -+ -+ const compilationJobsCreationResult: CompilationJobsCreationResult = -+ await run(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { -+ dependencyGraph, -+ }); -+ await run(TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { -+ compilationJobsCreationErrors: compilationJobsCreationResult.errors, -+ }); -+ -+ const compilationJobs = compilationJobsCreationResult.jobs; -+ -+ // const filteredCompilationJobs: CompilationJob[] = await run( -+ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ // { compilationJobs, force: false } -+ // ); -+ -+ const mergedCompilationJobs: CompilationJob[] = await run( -+ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, -+ { compilationJobs: compilationJobs } -+ ); - -+ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { -+ return ( -+ cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > -+ 0 -+ ); -+ }); -+ const compilationJob = targetCompilationJobs[0]; -+ -+ const build: Build = await run(TASK_COMPILE_SOLIDITY_COMPILE_JOB, { -+ compilationJob, -+ compilationJobs: [compilationJob], -+ compilationJobIndex: 0, -+ emitsArtifacts: false, -+ quiet: true, -+ }); - return build; - }; - -@@ -807,6 +890,10 @@ subtask(TASK_VERIFY_GET_MINIMUM_BUILD) - .addParam("sourceName", undefined, undefined, types.string) - .setAction(getMinimumBuild); - -+subtask(TASK_VERIFY_GET_FULL_BUILD) -+ .addParam("sourceName", undefined, undefined, types.string) -+ .setAction(getFullBuild); -+ - task(TASK_VERIFY, "Verifies contract on Etherscan") - .addOptionalPositionalParam( - "address", diff --git a/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol b/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol new file mode 100644 index 00000000..423175ba --- /dev/null +++ b/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol @@ -0,0 +1,22 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "../precompiles/ArbSys.sol"; + +contract PendingBlkTimeAndNrAdvanceCheck { + uint256 immutable deployedAt; + uint256 immutable deployedAtBlock; + + constructor() { + deployedAt = block.timestamp; + deployedAtBlock = ArbSys(address(100)).arbBlockNumber(); + } + + function isAdvancing() external { + require(block.timestamp > deployedAt, "Time didn't advance"); + require(ArbSys(address(100)).arbBlockNumber() > deployedAtBlock, "Block didn't advance"); + } +} diff --git a/yarn.lock b/yarn.lock index a44f1017..4d72a239 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2424,13 +2424,6 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -3996,9 +3989,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.12.1, follow-redirects@^1.14.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== forever-agent@~0.6.1: version "0.6.1" @@ -6806,17 +6799,10 @@ semver@^7.0.0, semver@^7.5.4: dependencies: lru-cache "^6.0.0" -semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" @@ -7226,11 +7212,6 @@ stream-combiner@^0.2.2: duplexer "~0.1.1" through "~2.3.4" -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -7759,17 +7740,10 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -undici@^5.14.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" - integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== - dependencies: - busboy "^1.6.0" - -undici@^5.4.0: - version "5.28.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" - integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== +undici@^5.14.0, undici@^5.4.0: + version "5.28.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" + integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== dependencies: "@fastify/busboy" "^2.0.0"