# Snapshot report for `src/cli/cli.test.ts`

The actual snapshot is saved in `cli.test.ts.snap`.

Generated by [AVA](https://avajs.dev).

## help

> Snapshot 1

    `Usage: npx @solidusnetwork/solidus-upgrades-core validate [<BUILD_INFO_DIR>] [<OPTIONS>]␊
    ␊
    Detects upgradeable contracts from a build info directory and validates whether they are upgrade safe.␊
    ␊
    Arguments:␊
      <BUILD_INFO_DIR>  Optional path to the build info directory which contains JSON files with Solidity compiler input and output. Defaults to 'artifacts/build-info' for Hardhat projects or 'out/build-info' for Foundry projects. If your project uses a custom output directory, you must specify its build info directory here.␊
    ␊
    Options:␊
      --contract <CONTRACT>  The name or fully qualified name of the contract to validate. If not specified, all upgradeable contracts in the build info directory will be validated.␊
      --reference <REFERENCE_CONTRACT>  Can only be used when the --contract option is also provided. The name or fully qualified name of the reference contract to use for storage layout comparisons. If not specified, uses the @custom:oz-upgrades-from annotation if it is defined in the contract that is being validated.␊
      --requireReference  Can only be used when the --contract option is also provided. Not compatible with --unsafeSkipStorageCheck. If specified, requires either the --reference option to be provided or the contract to have a @custom:oz-upgrades-from annotation.␊
      --referenceBuildInfoDirs "<BUILD_INFO_DIR>[,<BUILD_INFO_DIR>...]"  Optional paths of additional build info directories from previous versions of the project to use for storage layout comparisons. When using this option, refer to one of these directories using prefix '<dirName>:' before the contract name or fully qualified name in the --reference option or @custom:oz-upgrades-from annotation, where <dirName> is the directory short name. Each directory short name must be unique, including compared to the main build info directory. If passing in multiple directories, separate them with commas or call the option multiple times, once for each directory.␊
      --exclude "<GLOB_PATTERN>" [--exclude "<GLOB_PATTERN>"...]  Exclude validations for contracts in source file paths that match any of the given glob patterns. For example, --exclude "contracts/mocks/**/*.sol". Does not apply to reference contracts. If passing in multiple patterns, call the option multiple times, once for each pattern.␊
      --unsafeAllow "<VALIDATION_ERROR>[,<VALIDATION_ERROR>...]"  Selectively disable one or more validation errors. Comma-separated list with one or more of the following: state-variable-assignment, state-variable-immutable, external-library-linking, struct-definition, enum-definition, constructor, delegatecall, selfdestruct, missing-public-upgradeto, internal-function-storage␊
      --unsafeAllowRenames  Configure storage layout check to allow variable renaming.␊
      --unsafeSkipStorageCheck  Skips checking for storage layout compatibility errors. This is a dangerous option meant to be used as a last resort.␊
    `

## no args

> Snapshot 1

    `Usage: npx @solidusnetwork/solidus-upgrades-core validate [<BUILD_INFO_DIR>] [<OPTIONS>]␊
    ␊
    Detects upgradeable contracts from a build info directory and validates whether they are upgrade safe.␊
    ␊
    Arguments:␊
      <BUILD_INFO_DIR>  Optional path to the build info directory which contains JSON files with Solidity compiler input and output. Defaults to 'artifacts/build-info' for Hardhat projects or 'out/build-info' for Foundry projects. If your project uses a custom output directory, you must specify its build info directory here.␊
    ␊
    Options:␊
      --contract <CONTRACT>  The name or fully qualified name of the contract to validate. If not specified, all upgradeable contracts in the build info directory will be validated.␊
      --reference <REFERENCE_CONTRACT>  Can only be used when the --contract option is also provided. The name or fully qualified name of the reference contract to use for storage layout comparisons. If not specified, uses the @custom:oz-upgrades-from annotation if it is defined in the contract that is being validated.␊
      --requireReference  Can only be used when the --contract option is also provided. Not compatible with --unsafeSkipStorageCheck. If specified, requires either the --reference option to be provided or the contract to have a @custom:oz-upgrades-from annotation.␊
      --referenceBuildInfoDirs "<BUILD_INFO_DIR>[,<BUILD_INFO_DIR>...]"  Optional paths of additional build info directories from previous versions of the project to use for storage layout comparisons. When using this option, refer to one of these directories using prefix '<dirName>:' before the contract name or fully qualified name in the --reference option or @custom:oz-upgrades-from annotation, where <dirName> is the directory short name. Each directory short name must be unique, including compared to the main build info directory. If passing in multiple directories, separate them with commas or call the option multiple times, once for each directory.␊
      --exclude "<GLOB_PATTERN>" [--exclude "<GLOB_PATTERN>"...]  Exclude validations for contracts in source file paths that match any of the given glob patterns. For example, --exclude "contracts/mocks/**/*.sol". Does not apply to reference contracts. If passing in multiple patterns, call the option multiple times, once for each pattern.␊
      --unsafeAllow "<VALIDATION_ERROR>[,<VALIDATION_ERROR>...]"  Selectively disable one or more validation errors. Comma-separated list with one or more of the following: state-variable-assignment, state-variable-immutable, external-library-linking, struct-definition, enum-definition, constructor, delegatecall, selfdestruct, missing-public-upgradeto, internal-function-storage␊
      --unsafeAllowRenames  Configure storage layout check to allow variable renaming.␊
      --unsafeSkipStorageCheck  Skips checking for storage layout compatibility errors. This is a dangerous option meant to be used as a last resort.␊
    `

## validate - errors

> Snapshot 1

    `Stdout:  ✔  contracts/test/cli/Validate.sol:Safe␊
    ␊
     ✔  contracts/test/cli/Validate.sol:HasInitializer␊
    ␊
     ✔  contracts/test/cli/Validate.sol:HasUpgradeTo␊
    ␊
     ✘  contracts/test/cli/Validate.sol:HasUpgradeToConstructorUnsafe␊
    ␊
          contracts/test/cli/Validate.sol:33: Contract \`HasUpgradeToConstructorUnsafe\` has a constructor␊
              Define an initializer instead␊
              https://zpl.in/upgrades/error-001␊
    ␊
     ✘  contracts/test/cli/Validate.sol:MultipleUnsafe␊
    ␊
          contracts/test/cli/Validate.sol:53: Use of delegatecall is not allowed␊
              https://zpl.in/upgrades/error-002␊
          ␊
          contracts/test/cli/Validate.sol:58: Use of delegatecall is not allowed␊
              https://zpl.in/upgrades/error-002␊
          ␊
          contracts/test/cli/Validate.sol:44: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
     ✘  contracts/test/cli/Validate.sol:InheritsMultipleUnsafe␊
    ␊
          contracts/test/cli/Validate.sol:53: Use of delegatecall is not allowed␊
              https://zpl.in/upgrades/error-002␊
          ␊
          contracts/test/cli/Validate.sol:58: Use of delegatecall is not allowed␊
              https://zpl.in/upgrades/error-002␊
          ␊
          contracts/test/cli/Validate.sol:44: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
     ✘  contracts/test/cli/Validate.sol:UpgradesFromUUPS (upgrades from contracts/test/cli/Validate.sol:HasUpgradeTo)␊
    ␊
          contracts/test/cli/Validate.sol:72: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
              Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
              @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
              https://zpl.in/upgrades/error-008␊
    ␊
     ✔  contracts/test/cli/Validate.sol:UpgradesFromTransparent (upgrades from contracts/test/cli/Validate.sol:HasInitializer)␊
    ␊
     ✘  contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          contracts/test/cli/Validate.sol:97: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
          contracts/test/cli/Validate.sol:94: Layout changed for \`__gap\` (uint256[49] -> uint256[49])␊
            - Slot changed from 1 to 2␊
            > Set __gap array to size 48␊
    ␊
     ✔  contracts/test/cli/Validate.sol:BecomesSafe (upgrades from contracts/test/cli/Validate.sol:MultipleUnsafe)␊
    ␊
     ✘  contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:BecomesSafe)␊
    ␊
          BecomesSafe: Deleted \`x\`␊
            > Keep the variable even if unused␊
    ␊
     ✘  contracts/test/cli/Validate.sol:StillUnsafe (upgrades from contracts/test/cli/Validate.sol:NonUpgradeable)␊
    ␊
          contracts/test/cli/Validate.sol:119: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
     ✔  contracts/test/cli/Validate.sol:InheritsAbstractUpgradeable␊
    ␊
     ✘  contracts/test/cli/Validate.sol:BothAnnotationsUnsafe (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          contracts/test/cli/Validate.sol:140: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
          contracts/test/cli/Validate.sol:137: Layout changed for \`__gap\` (uint256[49] -> uint256[49])␊
            - Slot changed from 1 to 2␊
            > Set __gap array to size 48␊
    ␊
    FAILED (14 upgradeable contracts detected, 6 passed, 8 failed)␊
    ␊
    Stderr: `

## validate - single contract

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:NonUpgradeable␊
    ␊
          contracts/test/cli/Validate.sol:14: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - single contract, has upgrades-from

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          contracts/test/cli/Validate.sol:97: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
          contracts/test/cli/Validate.sol:94: Layout changed for \`__gap\` (uint256[49] -> uint256[49])␊
            - Slot changed from 1 to 2␊
            > Set __gap array to size 48␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - single contract, reference overrides upgrades-from

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:UnsafeAndStorageLayoutErrors (upgrades from contracts/test/cli/Validate.sol:Safe)␊
    ␊
          contracts/test/cli/Validate.sol:97: Use of selfdestruct is not allowed␊
              https://zpl.in/upgrades/error-003␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - single contract, reference is uups, overrides upgrades-from

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:HasUpgradeTo)␊
    ␊
          contracts/test/cli/Validate.sol:111: Implementation is missing a public \`upgradeTo(address)\` or \`upgradeToAndCall(address,bytes)\` function␊
              Inherit UUPSUpgradeable to include one or both of these functions in your contract␊
              @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol␊
              https://zpl.in/upgrades/error-008␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - single contract, reference

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          StorageV1: Deleted \`x\`␊
            > Keep the variable even if unused␊
          ␊
          StorageV1: Deleted \`__gap\`␊
            > Keep the variable even if unused␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - single contract, reference with same build info dir

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          StorageV1: Deleted \`x\`␊
            > Keep the variable even if unused␊
          ␊
          StorageV1: Deleted \`__gap\`␊
            > Keep the variable even if unused␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - single contract, reference, fully qualified names

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          StorageV1: Deleted \`x\`␊
            > Keep the variable even if unused␊
          ␊
          StorageV1: Deleted \`__gap\`␊
            > Keep the variable even if unused␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - requireReference - no reference, has upgradesFrom - safe

> Snapshot 1

    ` ✔  contracts/test/cli/Validate.sol:BecomesSafe (upgrades from contracts/test/cli/Validate.sol:MultipleUnsafe)␊
    ␊
    SUCCESS␊
    `

## validate - requireReference - no reference, has upgradesFrom - unsafe

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:BecomesBadLayout (upgrades from contracts/test/cli/Validate.sol:BecomesSafe)␊
    ␊
          BecomesSafe: Deleted \`x\`␊
            > Keep the variable even if unused␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - requireReference - has reference - unsafe

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/Validate.sol:StorageV2_Bad_NoAnnotation (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
          contracts/test/cli/Validate.sol:147: Layout changed for \`__gap\` (uint256[49] -> uint256[49])␊
            - Slot changed from 1 to 2␊
            > Set __gap array to size 48␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - requireReference - has reference - safe

> Snapshot 1

    ` ✔  contracts/test/cli/Validate.sol:StorageV2_Ok_NoAnnotation (upgrades from contracts/test/cli/Validate.sol:StorageV1)␊
    ␊
    SUCCESS␊
    `

## validate - no upgradeable

> Snapshot 1

    `No upgradeable contracts detected.␊
    `

## validate - ok

> Snapshot 1

    ` ✔  contracts/test/cli/Annotation.sol:Annotation␊
    ␊
    SUCCESS (1 upgradeable contract detected, 1 passed, 0 failed)␊
    `

## validate - single contract - ok

> Snapshot 1

    ` ✔  contracts/test/cli/Annotation.sol:Annotation␊
    ␊
    SUCCESS␊
    `

## validate - fully qualified version of ambiguous contract name

> Snapshot 1

    ` ✔  contracts/test/ValidationsSameNameSafe.sol:SameName␊
    ␊
    SUCCESS␊
    `

## validate - references fully qualified version of ambiguous contract name

> Snapshot 1

    ` ✔  contracts/test/ValidationsSameNameSafe.sol:SameName (upgrades from contracts/test/ValidationsSameNameUnsafe.sol:SameName)␊
    ␊
    SUCCESS␊
    `

## validate - references other build info dir by command - ok

> Snapshot 1

    {
      stderr: '',
      stdout: ` ✔  contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
      ␊
      SUCCESS␊
      `,
    }

## validate - references other build info dir by command with fully qualified names - ok

> Snapshot 1

    {
      stderr: '',
      stdout: ` ✔  contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
      ␊
      SUCCESS␊
      `,
    }

## validate - references other build info dir by command - bad

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/ValidateBuildInfoV2_Bad.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
    ␊
          MyContract: Deleted \`y\`␊
            > Keep the variable even if unused␊
          ␊
          contracts/test/cli/ValidateBuildInfoV2_Bad.sol:6: Upgraded \`__gap\` to an incompatible type␊
            - Bad storage gap resize from 48 to 49␊
              Size cannot increase␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - references other build info dir by command with fully qualified names - bad

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/ValidateBuildInfoV2_Bad.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
    ␊
          MyContract: Deleted \`y\`␊
            > Keep the variable even if unused␊
          ␊
          contracts/test/cli/ValidateBuildInfoV2_Bad.sol:6: Upgraded \`__gap\` to an incompatible type␊
            - Bad storage gap resize from 48 to 49␊
              Size cannot increase␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - references multiple build info dirs by annotation

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/ValidateBuildInfoV2_Branch_Bad.sol:MyContract (upgrades from build-info-v2:contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract)␊
    ␊
          contracts/test/cli/ValidateBuildInfoV2_Branch_Bad.sol:8: Renamed \`z\` to \`zBranch\`␊
    ␊
     ✔  contracts/test/cli/ValidateBuildInfoV2_Branch_Ok.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
    ␊
    FAILED (2 upgradeable contracts detected, 1 passed, 1 failed)␊
    ␊
    Stderr: `

## validate - references multiple build info dirs by annotation - same arg multiple times

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/ValidateBuildInfoV2_Branch_Bad.sol:MyContract (upgrades from build-info-v2:contracts/test/cli/ValidateBuildInfoV2_Ok.sol:MyContract)␊
    ␊
          contracts/test/cli/ValidateBuildInfoV2_Branch_Bad.sol:8: Renamed \`z\` to \`zBranch\`␊
    ␊
     ✔  contracts/test/cli/ValidateBuildInfoV2_Branch_Ok.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
    ␊
    FAILED (2 upgradeable contracts detected, 1 passed, 1 failed)␊
    ␊
    Stderr: `

## validate - references other build info dir by annotation - ok

> Snapshot 1

    {
      stderr: '',
      stdout: ` ✔  contracts/test/cli/ValidateBuildInfoV2_Annotation_Ok.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
      ␊
      SUCCESS␊
      `,
    }

## validate - references other build info dir by annotation - bad

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/ValidateBuildInfoV2_Annotation_Bad.sol:MyContract (upgrades from build-info-v1:contracts/test/cli/ValidateBuildInfoV1.sol:MyContract)␊
    ␊
          MyContract: Deleted \`y\`␊
            > Keep the variable even if unused␊
          ␊
          contracts/test/cli/ValidateBuildInfoV2_Annotation_Bad.sol:7: Upgraded \`__gap\` to an incompatible type␊
            - Bad storage gap resize from 48 to 49␊
              Size cannot increase␊
    ␊
    FAILED␊
    ␊
    Stderr: `

## validate - excludes by pattern - no match

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/excludes/UsesAbstractUUPS.sol:UsesAbstractUUPS␊
    ␊
          contracts/test/cli/excludes/UsesAbstractUUPS.sol:9: Contract \`UsesAbstractUUPS\` has a constructor␊
              Define an initializer instead␊
              https://zpl.in/upgrades/error-001␊
          ␊
          contracts/test/cli/excludes/AbstractUUPS.sol:11: Contract \`AbstractUUPS\` has a constructor␊
              Define an initializer instead␊
              https://zpl.in/upgrades/error-001␊
          ␊
          contracts/test/cli/excludes/AbstractUUPS.sol:9: Variable \`z\` is immutable and will be initialized on the implementation␊
              If by design, annotate with '@custom:oz-upgrades-unsafe-allow state-variable-immutable'␊
          Otherwise, consider a constant variable or use a mutable variable instead␊
              https://zpl.in/upgrades/error-005␊
          ␊
          contracts/test/cli/excludes/Abstract2.sol:7: Contract \`Abstract2\` has a constructor␊
              Define an initializer instead␊
              https://zpl.in/upgrades/error-001␊
          ␊
          contracts/test/cli/excludes/Abstract2.sol:5: Variable \`y\` is immutable and will be initialized on the implementation␊
              If by design, annotate with '@custom:oz-upgrades-unsafe-allow state-variable-immutable'␊
          Otherwise, consider a constant variable or use a mutable variable instead␊
              https://zpl.in/upgrades/error-005␊
          ␊
          contracts/test/cli/excludes/Abstract1.sol:7: Contract \`Abstract1\` has a constructor␊
              Define an initializer instead␊
              https://zpl.in/upgrades/error-001␊
          ␊
          contracts/test/cli/excludes/Abstract1.sol:5: Variable \`x\` is immutable and will be initialized on the implementation␊
              If by design, annotate with '@custom:oz-upgrades-unsafe-allow state-variable-immutable'␊
          Otherwise, consider a constant variable or use a mutable variable instead␊
              https://zpl.in/upgrades/error-005␊
    ␊
    FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
    ␊
    Stderr: `

## validate - excludes by pattern - some match

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/excludes/UsesAbstractUUPS.sol:UsesAbstractUUPS␊
    ␊
          contracts/test/cli/excludes/UsesAbstractUUPS.sol:9: Contract \`UsesAbstractUUPS\` has a constructor␊
              Define an initializer instead␊
              https://zpl.in/upgrades/error-001␊
    ␊
    FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
    ␊
    Stderr: `

## validate - excludes by pattern - all match

> Snapshot 1

    {
      stderr: '',
      stdout: `No upgradeable contracts detected.␊
      `,
    }

## validate - excludes by pattern - all match using commas within glob

> Snapshot 1

    {
      stderr: '',
      stdout: `No upgradeable contracts detected.␊
      `,
    }

## validate - exclude passed multiple times

> Snapshot 1

    {
      stderr: '',
      stdout: `No upgradeable contracts detected.␊
      `,
    }

## validate - excludes UpgradeableBeacon and its parents by default

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/excludes/V2Bad1.sol:V2Bad1 (upgrades from contracts/test/cli/excludes/V1.sol:V1)␊
    ␊
          V1: Deleted \`x\`␊
            > Keep the variable even if unused␊
    ␊
     ✘  contracts/test/cli/excludes/V2Bad2.sol:V2Bad2 (upgrades from contracts/test/cli/excludes/V1.sol:V1)␊
    ␊
          V1: Deleted \`x\`␊
            > Keep the variable even if unused␊
    ␊
    FAILED (2 upgradeable contracts detected, 0 passed, 2 failed)␊
    ␊
    Stderr: `

## validate - excludes UpgradeableBeacon and its parents by default, and excludes one contract from layout comparisions

> Snapshot 1

    `Stdout:  ✘  contracts/test/cli/excludes/V2Bad2.sol:V2Bad2 (upgrades from contracts/test/cli/excludes/V1.sol:V1)␊
    ␊
          V1: Deleted \`x\`␊
            > Keep the variable even if unused␊
    ␊
    FAILED (1 upgradeable contract detected, 0 passed, 1 failed)␊
    ␊
    Stderr: `
