certora-cli-beta 8.16.2__tar.gz → 8.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. {certora_cli_beta-8.16.2/certora_cli_beta.egg-info → certora_cli_beta-8.17.0}/PKG-INFO +2 -2
  2. certora_cli_beta-8.17.0/README.md +1 -0
  3. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraBuild.py +6 -1
  4. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraContext.py +8 -0
  5. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraContextAttributes.py +1 -1
  6. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/certoraValidateFuncs.py +44 -24
  7. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0/certora_cli_beta.egg-info}/PKG-INFO +2 -2
  8. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_jars/ASTExtraction.jar +0 -0
  9. certora_cli_beta-8.17.0/certora_jars/CERTORA-CLI-VERSION-METADATA.json +1 -0
  10. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_jars/Typechecker.jar +0 -0
  11. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/setup.py +2 -2
  12. certora_cli_beta-8.16.2/README.md +0 -1
  13. certora_cli_beta-8.16.2/certora_jars/CERTORA-CLI-VERSION-METADATA.json +0 -1
  14. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/LICENSE +0 -0
  15. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/MANIFEST.in +0 -0
  16. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_bins/__init__.py +0 -0
  17. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/CompilerCollector.py +0 -0
  18. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/CompilerCollectorFactory.py +0 -0
  19. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/CompilerCollectorSol.py +0 -0
  20. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/CompilerCollectorSolBased.py +0 -0
  21. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/CompilerCollectorVy.py +0 -0
  22. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/CompilerCollectorYul.py +0 -0
  23. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/Compiler/__init__.py +0 -0
  24. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/__init__.py +0 -0
  25. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/castingInstrumenter.py +0 -0
  26. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraApp.py +0 -0
  27. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraBuildCacheManager.py +0 -0
  28. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraBuildDataClasses.py +0 -0
  29. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraBuildRust.py +0 -0
  30. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraBuildSui.py +0 -0
  31. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraCloudIO.py +0 -0
  32. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraCollectConfigurationLayout.py +0 -0
  33. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraCollectRunMetadata.py +0 -0
  34. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraCompilerParameters.py +0 -0
  35. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraConfigIO.py +0 -0
  36. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraContextClass.py +0 -0
  37. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraContextValidator.py +0 -0
  38. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraContractFuncs.py +0 -0
  39. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraExtensionInfo.py +0 -0
  40. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraJobList.py +0 -0
  41. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraMiniSpecParser.py +0 -0
  42. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraNodeFilters.py +0 -0
  43. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraOffsetConverter.py +0 -0
  44. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraParseBuildScript.py +0 -0
  45. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraProjectScanner.py +0 -0
  46. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraSourceFinders.py +0 -0
  47. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraType.py +0 -0
  48. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/certoraVerifyGenerator.py +0 -0
  49. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/erc7201.py +0 -0
  50. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/splitRules.py +0 -0
  51. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/storageExtension.py +0 -0
  52. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/CertoraProver/uncheckedOverflowInstrumenter.py +0 -0
  53. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/Eq_default.conf +0 -0
  54. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/Eq_mc_no_out_template.spec +0 -0
  55. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/Eq_mc_template.spec +0 -0
  56. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/Eq_sanity.conf +0 -0
  57. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/Eq_template.spec +0 -0
  58. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/__init__.py +0 -0
  59. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/equivCheck.py +0 -0
  60. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/EquivalenceCheck/sanity.spec +0 -0
  61. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Mutate/__init__.py +0 -0
  62. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Mutate/mutateApp.py +0 -0
  63. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Mutate/mutateAttributes.py +0 -0
  64. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Mutate/mutateConstants.py +0 -0
  65. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Mutate/mutateUtil.py +0 -0
  66. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Mutate/mutateValidate.py +0 -0
  67. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/ExpectedComparator.py +0 -0
  68. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/__init__.py +0 -0
  69. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/certoraAttrUtil.py +0 -0
  70. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/certoraLogging.py +0 -0
  71. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/certoraUtils.py +0 -0
  72. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/Shared/proverCommon.py +0 -0
  73. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/__init__.py +0 -0
  74. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraCVLFormatter.py +0 -0
  75. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraConcord.py +0 -0
  76. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraEVMProver.py +0 -0
  77. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraEqCheck.py +0 -0
  78. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraMutate.py +0 -0
  79. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraRanger.py +0 -0
  80. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraRun.py +0 -0
  81. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraSolanaProver.py +0 -0
  82. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraSorobanProver.py +0 -0
  83. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/certoraSuiProver.py +0 -0
  84. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli/rustMutator.py +0 -0
  85. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli_beta.egg-info/SOURCES.txt +0 -0
  86. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli_beta.egg-info/dependency_links.txt +0 -0
  87. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli_beta.egg-info/entry_points.txt +0 -0
  88. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli_beta.egg-info/requires.txt +0 -0
  89. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_cli_beta.egg-info/top_level.txt +0 -0
  90. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/certora_jars/__init__.py +0 -0
  91. {certora_cli_beta-8.16.2 → certora_cli_beta-8.17.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-beta
3
- Version: 8.16.2
3
+ Version: 8.17.0
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-beta
6
6
  Author: Certora
@@ -38,4 +38,4 @@ Dynamic: requires-dist
38
38
  Dynamic: requires-python
39
39
  Dynamic: summary
40
40
 
41
- Commit 94b86f7. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
41
+ Commit fb2c469. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -0,0 +1 @@
1
+ Commit fb2c469. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -1980,7 +1980,12 @@ class CertoraBuildGenerator:
1980
1980
  compiler_logger.debug(f"about to run in {compile_wd} the command: {collect_cmd}")
1981
1981
  compiler_logger.debug(f"solc input = {json.dumps(input_for_solc, indent=4)}")
1982
1982
 
1983
- if self.context.test == str(Util.TestValue.CHECK_SOLC_OPTIONS) and eval(self.context.test_condition):
1983
+ # test_condition gates this checkpoint to a specific contract file (the compile loop runs per-file).
1984
+ # Default 'True' fires for every file; otherwise it is treated as a filename suffix to match.
1985
+ # It is matched as a plain string (never evaluated).
1986
+ expected_file_suffix = self.context.test_condition
1987
+ if self.context.test == str(Util.TestValue.CHECK_SOLC_OPTIONS) and \
1988
+ (expected_file_suffix == 'True' or build_arg_contract_file.endswith(expected_file_suffix)):
1984
1989
  raise Util.TestResultsReady({'standard_json_input': standard_json_input, 'main_path': main_path})
1985
1990
  Util.run_compiler_cmd(collect_cmd, f"{sdc_name}.standard.json", wd=compile_wd,
1986
1991
  compiler_input=standard_json_input)
@@ -313,6 +313,14 @@ def get_args(args_list: List[str], app: Type[App.CertoraApp]) -> CertoraContext:
313
313
  # Setup defaults (defaults are not recorded in conf file)
314
314
  context.expected_file = context.expected_file or "expected.json"
315
315
  context.run_source = context.run_source or Vf.RunSources.COMMAND.name.upper()
316
+ if context.run_source.upper() \
317
+ in [Vf.RunSources.AUTO_PROVER.name.upper(), Vf.RunSources.STATIC_ANALYZER.name.upper()] \
318
+ and os.environ.get("CERTORA_PROVER_GROUP_ID") is not None:
319
+
320
+ context_logger.info("Running with run source auto_prover or static_analysis will override the group_id")
321
+ context_logger.info(f'group_id: {context.group_id}, override: {os.environ.get("CERTORA_PROVER_GROUP_ID")}')
322
+ context.group_id = os.environ.get("CERTORA_PROVER_GROUP_ID")
323
+
316
324
  context.java_version = Util.get_java_version()
317
325
 
318
326
  context_logger.debug("parsed args successfully.")
@@ -1706,7 +1706,7 @@ class BackendAttributes(AttrUtil.Attributes):
1706
1706
  )
1707
1707
 
1708
1708
  JOB_DEFINITION = AttrUtil.AttributeDefinition(
1709
- attr_validation_func=Vf.validate_job_definition,
1709
+ arg_type=AttrUtil.AttrArgType.STRING,
1710
1710
  argparse_args={
1711
1711
  'action': AttrUtil.UniqueStore
1712
1712
  },
@@ -34,11 +34,9 @@ from uuid import UUID
34
34
  scripts_dir_path = Path(__file__).parent.resolve() # containing directory
35
35
  sys.path.insert(0, str(scripts_dir_path))
36
36
 
37
-
38
37
  from Shared import certoraUtils as Util
39
38
  from Mutate import mutateConstants as Constants
40
39
 
41
-
42
40
  validation_logger = logging.getLogger("validation")
43
41
 
44
42
 
@@ -176,12 +174,15 @@ def validate_non_negative_integer(string: str) -> str:
176
174
  raise Util.CertoraUserInputError(f'expected a non-negative integer, instead given {string}') from e
177
175
  return string
178
176
 
177
+
179
178
  def validate_manual_mutants(value: Any) -> Any:
180
179
  return validate_mutant_attributes(value, Constants.MANUAL_MUTANTS)
181
180
 
181
+
182
182
  def validate_universal_mutator_mutants(value: Any) -> Any:
183
183
  return validate_mutant_attributes(value, Constants.UNIVERSAL_MUTATOR)
184
184
 
185
+
185
186
  def validate_mutant_attributes(value: Any, attr_name: str) -> Any:
186
187
  error_message = (f"Bad value. '{attr_name}' should be a list of dictionaries, each dictionary should"
187
188
  f" have 2 entries: '{Constants.FILE_TO_MUTATE}' and '{Constants.MUTANTS_LOCATION}'. Got {value}")
@@ -268,6 +269,7 @@ def validate_optional_readable_file(filename: str) -> str:
268
269
  def validate_spec_file(filename: str) -> str:
269
270
  return validate_readable_file(filename, (".spec", ".cvl"))
270
271
 
272
+
271
273
  def validate_soroban_extension(filename: str) -> str:
272
274
  if not filename.lower().endswith(Util.SOROBAN_EXEC_EXTENSION):
273
275
  raise Util.CertoraUserInputError(f"{filename} does not end with {Util.SOROBAN_EXEC_EXTENSION}")
@@ -435,8 +437,8 @@ def validate_contract_extension_attr(map: Any) -> Dict[str, List[Dict[str, Any]]
435
437
  for extension in extensions:
436
438
  if not isinstance(extension, dict) or \
437
439
  "extension" not in extension or \
438
- "exclude" not in extension or \
439
- not isinstance(extension["exclude"], list) or \
440
+ "exclude" not in extension or \
441
+ not isinstance(extension["exclude"], list) or \
440
442
  len(extension) > 2:
441
443
  raise Util.CertoraUserInputError(f'Each extension for {extended} must be of the form '
442
444
  f'`{{ "extension": "ExtenderContractA", '
@@ -535,8 +537,9 @@ def validate_prototype_attr(string: str) -> str:
535
537
  def validate_storage_extension_harness_attr(link: str) -> str:
536
538
  contracts = link.split("=", 2)
537
539
  if len(contracts) != 2:
538
- raise Util.CertoraUserInputError(f"Invalid storage extension harness format: '{link}'. Expected 'ContractA=ContractB'."
539
- "specified as ContractA=ContractB")
540
+ raise Util.CertoraUserInputError(
541
+ f"Invalid storage extension harness format: '{link}'. Expected 'ContractA=ContractB'."
542
+ "specified as ContractA=ContractB")
540
543
  validate_contract_name(contracts[0])
541
544
  validate_contract_name(contracts[1])
542
545
  if contracts[0] == contracts[1]:
@@ -571,6 +574,7 @@ def validate_equivalence_contracts(equiv_string: str) -> str:
571
574
  )
572
575
  return equiv_string
573
576
 
577
+
574
578
  def validate_packages(package: str) -> str:
575
579
  if not re.search("^[^=]+=[^=]+$", package):
576
580
  raise Util.CertoraUserInputError("a package must have the form name=path")
@@ -684,7 +688,8 @@ def validate_address(value: str) -> str:
684
688
  def validate_boolean_map(args: Dict[str, bool], attr_name: str) -> None:
685
689
  attr_map_name = attr_name + "_map"
686
690
  if not isinstance(args, dict):
687
- raise Util.CertoraUserInputError(f"'{attr_map_name}' should be stored as a map (type was {type(args).__name__})")
691
+ raise Util.CertoraUserInputError(
692
+ f"'{attr_map_name}' should be stored as a map (type was {type(args).__name__})")
688
693
 
689
694
  for contract, value in args.items():
690
695
  if not isinstance(value, bool):
@@ -698,14 +703,18 @@ def validate_boolean_map(args: Dict[str, bool], attr_name: str) -> None:
698
703
  if first:
699
704
  validation_logger.warning(f"all {attr_map_name} values are set to True '{attr_name}' can be used instead")
700
705
  else:
701
- validation_logger.warning(f"all {attr_map_name} values are set to False, this flag/attribute can be omitted")
706
+ validation_logger.warning(
707
+ f"all {attr_map_name} values are set to False, this flag/attribute can be omitted")
708
+
702
709
 
703
710
  def validate_solc_via_ir_map(args: Dict[str, bool]) -> None:
704
711
  validate_boolean_map(args, 'solc_via_ir')
705
712
 
713
+
706
714
  def validate_vyper_venom_map(args: Dict[str, bool]) -> None:
707
715
  validate_boolean_map(args, 'vyper_venom')
708
716
 
717
+
709
718
  def validate_solc_evm_version_map(args: Dict[str, str]) -> None:
710
719
  if not isinstance(args, dict):
711
720
  raise Util.CertoraUserInputError("'solc_evm_version_map' should be stored as a map "
@@ -723,6 +732,7 @@ def validate_solc_evm_version_map(args: Dict[str, str]) -> None:
723
732
  validation_logger.warning(f"All EVM versions in --solc_evm_version_map are the same."
724
733
  f" --solc_evm_version {first} can be used instead")
725
734
 
735
+
726
736
  def validate_solc_optimize_map(args: Dict[str, str]) -> None:
727
737
  if not isinstance(args, dict):
728
738
  raise Util.CertoraUserInputError("'solc_optimize_map' should be stored as a map "
@@ -775,7 +785,8 @@ def validate_vyper_custom_std_json_in_map(args: Dict[str, str]) -> None:
775
785
  :raises CertoraUserInputError if the format is wrong
776
786
  """
777
787
  if not isinstance(args, dict):
778
- raise Util.CertoraUserInputError(f"vyper custom std json in should be stored as a map (type was {type(args).__name__})")
788
+ raise Util.CertoraUserInputError(
789
+ f"vyper custom std json in should be stored as a map (type was {type(args).__name__})")
779
790
 
780
791
  for source_file, json_file in args.items():
781
792
  if not Util.is_vyper_file(source_file):
@@ -808,10 +819,12 @@ def validate_git_hash(git_hash: str) -> str:
808
819
  raise Util.CertoraUserInputError("Git hash must consist of between 1 and 40 characters")
809
820
  return git_hash
810
821
 
822
+
811
823
  def validate_check_method_flag(method: str) -> str:
812
824
  if '.' in method:
813
- raise Util.CertoraUserInputError(f"Malformed `check_mathod` argument '{method}': checked method cannot contain a dot. Use only the method name without the contract prefix."
814
- "the contract part is not allowed in `--check_method`")
825
+ raise Util.CertoraUserInputError(
826
+ f"Malformed `check_mathod` argument '{method}': checked method cannot contain a dot. Use only the method name without the contract prefix."
827
+ "the contract part is not allowed in `--check_method`")
815
828
  if ' ' in method:
816
829
  raise Util.CertoraUserInputError(f"Malformed method '{method}' in `--check_method`: remove all whitespace")
817
830
 
@@ -819,10 +832,12 @@ def validate_check_method_flag(method: str) -> str:
819
832
  raise Util.CertoraUserInputError(f"Malformed method '{method}' in `--check_method`: unmatched parenthesis")
820
833
  return method
821
834
 
835
+
822
836
  def validate_evm_method_flag(method: str) -> str:
823
837
  contract_and_method = method.split('.')
824
838
  if len(contract_and_method) > 2:
825
- raise Util.CertoraUserInputError(f"Malformed method '{method}' in `--method` list: a method should be of the form `[ContractName.]functionABISignature(...)`")
839
+ raise Util.CertoraUserInputError(
840
+ f"Malformed method '{method}' in `--method` list: a method should be of the form `[ContractName.]functionABISignature(...)`")
826
841
  elif (len(contract_and_method) == 2):
827
842
  contract = contract_and_method[0]
828
843
  validate_contract_name(contract)
@@ -838,9 +853,11 @@ def validate_evm_method_flag(method: str) -> str:
838
853
 
839
854
  return method
840
855
 
856
+
841
857
  def validate_move_method_flag(method: str) -> str:
842
858
  return validate_move_function_name(method)
843
859
 
860
+
844
861
  def __validate_matching_parens(s: str) -> bool:
845
862
  stack = []
846
863
  matching_pairs = {")": "(", "]": "["}
@@ -875,30 +892,36 @@ def __validate_solidity_id(string: str, object: str) -> str:
875
892
  def validate_contract_name(contract_name: str) -> str:
876
893
  return __validate_solidity_id(contract_name, "contract")
877
894
 
895
+
878
896
  def validate_rule_pattern_string(rule_str: str) -> str:
879
897
  if not re.match(r"^[a-zA-Z0-9_$*]+$", rule_str):
880
898
  raise Util.CertoraUserInputError(f"invalid rule pattern \"{rule_str}\": rule patterns must contain only "
881
899
  "letters, digits, dollar signs, underscores, or asterisks")
882
900
  return rule_str
883
901
 
902
+
884
903
  def validate_evm_rule_name(rule_str: str) -> str:
885
904
  if ("*" in rule_str):
886
905
  return validate_rule_pattern_string(rule_str)
887
906
  else:
888
907
  return __validate_solidity_id(rule_str, "rule")
889
908
 
909
+
890
910
  def validate_move_rule_pattern_string(rule_str: str) -> str:
891
911
  if not re.match(r"^([a-zA-Z0-9_$*]|::)+$", rule_str):
892
912
  raise Util.CertoraUserInputError(f"invalid rule pattern \"{rule_str}\": rule patterns must contain only "
893
913
  "letters, digits, dollar signs, underscores, asterisks, or double colons")
894
914
  return rule_str
895
915
 
916
+
896
917
  def validate_move_function_name(name: str) -> str:
897
- if not re.match(r"^(0x[0-9a-fA-F]+|([a-zA-Z_][a-zA-Z0-9_]*))::[a-zA-Z_][a-zA-Z0-9_]*::[a-zA-Z_][a-zA-Z0-9_]*$", name):
918
+ if not re.match(r"^(0x[0-9a-fA-F]+|([a-zA-Z_][a-zA-Z0-9_]*))::[a-zA-Z_][a-zA-Z0-9_]*::[a-zA-Z_][a-zA-Z0-9_]*$",
919
+ name):
898
920
  raise Util.CertoraUserInputError(f"invalid Move function name \"{name}\": must be a fully-qualified Move "
899
921
  "function name")
900
922
  return name
901
923
 
924
+
902
925
  def validate_move_rule_name(rule_str: str) -> str:
903
926
  if ("*" in rule_str):
904
927
  return validate_move_rule_pattern_string(rule_str)
@@ -910,7 +933,6 @@ MAX_MSG_LEN: int = 256
910
933
 
911
934
 
912
935
  def validate_msg(msg: str) -> str:
913
-
914
936
  if len(msg) > MAX_MSG_LEN:
915
937
  msg = (msg[:MAX_MSG_LEN - 3] + "...")
916
938
  validation_logger.warning(f"'msg' can't accept strings longer than {MAX_MSG_LEN} chars, string was truncated")
@@ -952,7 +974,14 @@ def validate_run_source(string: str) -> str:
952
974
  We allow the user to insert the run source in any casing they want
953
975
  (e.g., we accept command, Command, COMMAND and CoMmAnD, but always send COMMAND)
954
976
  """
955
- return __validate_enum_value(string, RunSources).upper()
977
+ output = __validate_enum_value(string, RunSources).upper()
978
+ # output should either be correct or we raised an exception in __validate_enum_value
979
+
980
+ if string.upper() in [RunSources.AUTO_PROVER.name.upper(), RunSources.STATIC_ANALYZER.name.upper()] \
981
+ and os.environ.get("CERTORA_PROVER_GROUP_ID") is not None:
982
+ validate_uuid(os.environ.get("CERTORA_PROVER_GROUP_ID") or '')
983
+
984
+ return output
956
985
 
957
986
 
958
987
  def validate_multi_example_value(value: str) -> str:
@@ -997,15 +1026,6 @@ def validate_prover_version(value: str) -> str:
997
1026
  return value
998
1027
 
999
1028
 
1000
- def validate_job_definition(value: str) -> str:
1001
- """
1002
- A job definition may consist only of letters, numbers and underscores
1003
- """
1004
- if not re.match(r"^\w+$", value):
1005
- raise Util.CertoraUserInputError(f"illegal 'job_definition' argument {value}, job definition may consist only "
1006
- "of letters, numbers and underscores")
1007
- return value
1008
-
1009
1029
  def validate_false(value: str) -> str:
1010
1030
  """
1011
1031
  This is used when there's a jar flag with a default value of true that we want to set to
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-beta
3
- Version: 8.16.2
3
+ Version: 8.17.0
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-beta
6
6
  Author: Certora
@@ -38,4 +38,4 @@ Dynamic: requires-dist
38
38
  Dynamic: requires-python
39
39
  Dynamic: summary
40
40
 
41
- Commit 94b86f7. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
41
+ Commit fb2c469. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -0,0 +1 @@
1
+ {"name": "certora-cli-beta", "tag": "8.17.0", "branch": "", "commit": "fb2c469", "timestamp": "20260629.14.2.550326", "version": "8.17.0"}
@@ -3,11 +3,11 @@ import setuptools
3
3
 
4
4
  setuptools.setup(
5
5
  name="certora-cli-beta",
6
- version="8.16.2",
6
+ version="8.17.0",
7
7
  author="Certora",
8
8
  author_email="support@certora.com",
9
9
  description="Runner for the Certora Prover",
10
- long_description="Commit 94b86f7. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.",
10
+ long_description="Commit fb2c469. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.",
11
11
  long_description_content_type="text/markdown",
12
12
  url="https://pypi.org/project/certora-cli-beta",
13
13
  packages=setuptools.find_packages(),
@@ -1 +0,0 @@
1
- Commit 94b86f7. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -1 +0,0 @@
1
- {"name": "certora-cli-beta", "tag": "8.16.2", "branch": "", "commit": "94b86f7", "timestamp": "20260625.10.50.595039", "version": "8.16.2"}