certora-cli-beta-mirror 8.1.1__py3-none-macosx_10_9_universal2.whl → 8.2.1__py3-none-macosx_10_9_universal2.whl

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.
@@ -33,6 +33,9 @@ class EvmApp(EvmAppClass):
33
33
  class RustAppClass(CertoraApp):
34
34
  pass
35
35
 
36
+ class MoveAppClass(CertoraApp):
37
+ pass
38
+
36
39
  class SolanaApp(RustAppClass):
37
40
  attr_class = Attrs.SolanaProverAttributes
38
41
 
@@ -45,5 +48,5 @@ class RangerApp(EvmAppClass):
45
48
  class ConcordApp(EvmAppClass):
46
49
  attr_class = Attrs.ConcordAttributes
47
50
 
48
- class SuiApp(EvmAppClass):
51
+ class SuiApp(MoveAppClass):
49
52
  attr_class = Attrs.SuiProverAttributes
@@ -2505,7 +2505,7 @@ class CertoraBuildGenerator:
2505
2505
  mut=InsertAfter())
2506
2506
  return function_finder_by_contract, function_finder_instrumentation
2507
2507
 
2508
- def add_internal_func_harnesses(self, contract_file: str, sdc: SDC, specCalls: List[str]) -> Optional[Tuple[Dict[str, str], Dict[str, Dict[int, Instrumentation]]]]:
2508
+ def add_internal_func_harnesses(self, contract_file: str, sdc: SDC, spec_calls: List[str]) -> Optional[Tuple[Dict[str, str], Dict[str, Dict[int, Instrumentation]]]]:
2509
2509
  # contract file -> byte offset -> to insert
2510
2510
  harness_function_instrumentation: Dict[str, Dict[int, Instrumentation]] = defaultdict(dict)
2511
2511
  # internal function name -> harness fuction name
@@ -2519,7 +2519,7 @@ class CertoraBuildGenerator:
2519
2519
 
2520
2520
  for c in sdc.contracts:
2521
2521
  for f in c.internal_funcs:
2522
- if f"{sdc.primary_contract}.{f.name}" not in specCalls:
2522
+ if f"{sdc.primary_contract}.{f.name}" not in spec_calls:
2523
2523
  continue
2524
2524
 
2525
2525
  if f.fromLib:
@@ -2669,12 +2669,12 @@ class CertoraBuildGenerator:
2669
2669
  def build(self, certora_verify_generator: CertoraVerifyGenerator) -> None:
2670
2670
  context = self.context
2671
2671
 
2672
- specCalls: List[str] = []
2672
+ spec_calls: List[str] = []
2673
2673
  if context.verify and not context.disallow_internal_function_calls:
2674
2674
  with tempfile.NamedTemporaryFile("r", dir=Util.get_build_dir()) as tmp_file:
2675
2675
  try:
2676
2676
  Ctx.run_local_spec_check(False, context, ["-listCalls", tmp_file.name], print_errors=False)
2677
- specCalls = tmp_file.read().split("\n")
2677
+ spec_calls = tmp_file.read().split("\n")
2678
2678
  except Exception as e:
2679
2679
  instrumentation_logger.warning(f"Failed to get calls from spec\n{e}")
2680
2680
 
@@ -2729,7 +2729,7 @@ class CertoraBuildGenerator:
2729
2729
  # We start by trying to instrument _all_ finders, both autofinders and source finders
2730
2730
  added_finders, all_finders_success, src_finders_gen_success, post_backup_dir = self.finders_compilation_round(
2731
2731
  build_arg_contract_file, i, ignore_patterns, path_for_compiler_collector_file, pre_backup_dir,
2732
- sdc_pre_finders, not context.disable_source_finders, specCalls)
2732
+ sdc_pre_finders, not context.disable_source_finders, spec_calls)
2733
2733
 
2734
2734
  # we could have a case where source finders failed but regular finders succeeded.
2735
2735
  # e.g. if we processed the AST wrong and skipped source finders generation
@@ -2741,7 +2741,7 @@ class CertoraBuildGenerator:
2741
2741
  # let's try just the function autofinders
2742
2742
  added_finders, function_autofinder_success, _, post_backup_dir = self.finders_compilation_round(
2743
2743
  build_arg_contract_file, i, ignore_patterns, path_for_compiler_collector_file, pre_backup_dir,
2744
- sdc_pre_finders, False, specCalls)
2744
+ sdc_pre_finders, False, spec_calls)
2745
2745
 
2746
2746
  if not function_autofinder_success:
2747
2747
  self.auto_finders_failed = True
@@ -3089,12 +3089,12 @@ class CertoraBuildGenerator:
3089
3089
  pre_backup_dir: Path,
3090
3090
  sdc_pre_finders: List[SDC],
3091
3091
  with_source_finders: bool,
3092
- specCalls: List[str]) -> Tuple[
3092
+ spec_calls: List[str]) -> Tuple[
3093
3093
  List[Tuple[Dict[str, InternalFunc], Dict[str, UnspecializedSourceFinder], Dict[str, str], SDC]], bool, bool, Path]:
3094
3094
  added_finders_to_sdc, finders_compilation_success, source_finders_gen_success = \
3095
3095
  self.instrument_auto_finders(
3096
3096
  build_arg_contract_file, i, sdc_pre_finders,
3097
- path_for_compiler_collector_file, with_source_finders, specCalls)
3097
+ path_for_compiler_collector_file, with_source_finders, spec_calls)
3098
3098
  # successful or not, we backup current .certora_sources for either debuggability, or for availability
3099
3099
  # of sources.
3100
3100
  post_backup_dir = self.get_fresh_backupdir(Util.POST_AUTOFINDER_BACKUP_DIR)
@@ -3167,7 +3167,7 @@ class CertoraBuildGenerator:
3167
3167
  sdc_pre_finders: List[SDC],
3168
3168
  path_for_compiler_collector_file: str,
3169
3169
  instrument_source_finders: bool,
3170
- specCalls: List[str]) -> Tuple[
3170
+ spec_calls: List[str]) -> Tuple[
3171
3171
  List[Tuple[Dict[str, InternalFunc], Dict[str, UnspecializedSourceFinder], Dict[str, str], SDC]], bool, bool]:
3172
3172
 
3173
3173
  # initialization
@@ -3188,7 +3188,7 @@ class CertoraBuildGenerator:
3188
3188
 
3189
3189
  added_internal_function_harnesses: Dict[str, str] = {}
3190
3190
  if not self.context.disallow_internal_function_calls:
3191
- added_internal_func_harness_tuple = self.add_internal_func_harnesses(build_arg_contract_file, sdc_pre_finder, specCalls)
3191
+ added_internal_func_harness_tuple = self.add_internal_func_harnesses(build_arg_contract_file, sdc_pre_finder, spec_calls)
3192
3192
  if added_internal_func_harness_tuple:
3193
3193
  instr = CertoraBuildGenerator.merge_dicts_instrumentation(function_instr, added_internal_func_harness_tuple[1])
3194
3194
  added_internal_function_harnesses = added_internal_func_harness_tuple[0]
@@ -3887,21 +3887,19 @@ def build_from_scratch(context: CertoraContext,
3887
3887
  def build_from_cache_or_scratch(context: CertoraContext,
3888
3888
  certora_build_generator: CertoraBuildGenerator,
3889
3889
  certora_verify_generator: CertoraVerifyGenerator) \
3890
- -> Tuple[bool, bool, CachedFiles]:
3890
+ -> Tuple[bool, CachedFiles]:
3891
3891
  """
3892
3892
  Builds either from cache (fast path) or from scratch (slow path)
3893
- @returns 1st tuple element whether there was a cache hit or not
3894
- @returns 2nd tuple element whether the build cache is enabled and applicable
3895
- @returns 3rd tuple element the artifacts of the build to potentially be cached
3893
+ @returns 1st tuple element whether the cache should be saved
3894
+ @returns 2nd tuple element the artifacts of the build to potentially be cached
3896
3895
  """
3897
- cache_hit = False
3898
3896
  cached_files: Optional[CachedFiles] = None
3899
3897
 
3900
3898
  if not context.build_cache:
3901
3899
  cached_files = build_from_scratch(context, certora_build_generator,
3902
3900
  certora_verify_generator,
3903
3901
  False)
3904
- return cache_hit, False, cached_files
3902
+ return False, cached_files
3905
3903
 
3906
3904
  build_cache_applicable = CertoraBuildCacheManager.cache_is_applicable(context)
3907
3905
 
@@ -3912,34 +3910,60 @@ def build_from_cache_or_scratch(context: CertoraContext,
3912
3910
  cached_files = build_from_scratch(context, certora_build_generator,
3913
3911
  certora_verify_generator,
3914
3912
  False)
3915
- return cache_hit, False, cached_files
3913
+ return False, cached_files
3916
3914
 
3917
3915
  cached_files = CertoraBuildCacheManager.build_from_cache(context)
3918
- # if no match, will rebuild from scratch
3919
- if cached_files is not None:
3920
- # write to .certora_build.json
3921
- shutil.copyfile(cached_files.certora_build_file, Util.get_certora_build_file())
3922
- # write build_output_props file
3923
- shutil.copyfile(cached_files.build_output_props_file, Util.get_built_output_props_file())
3924
- # write build_cache indicator file
3925
- with open(Util.get_build_cache_indicator_file(), "w+") as indicator_handle:
3926
- json.dump({"build_cache_hit": True}, indicator_handle)
3927
- # write in sources all the additional paths found
3928
- for p in cached_files.path_with_additional_included_files.glob("*"):
3929
- if p.is_dir():
3930
- Util.safe_copy_folder(p,
3931
- Util.get_certora_sources_dir() / p.name,
3932
- shutil.ignore_patterns())
3933
- else:
3934
- shutil.copyfile(p, Util.get_certora_sources_dir() / p.name)
3935
- cache_hit = True
3936
- else:
3937
- # rebuild
3916
+
3917
+ if not cached_files:
3918
+ # No match, rebuild
3938
3919
  cached_files = build_from_scratch(context, certora_build_generator,
3939
3920
  certora_verify_generator,
3940
3921
  True)
3922
+ return True, cached_files
3923
+
3924
+ # Cache hit!
3925
+
3926
+ # write to .certora_build.json
3927
+ # This must happen _before_ searching for new internal function calls - the typechecker needs this file.
3928
+ shutil.copyfile(cached_files.certora_build_file, Util.get_certora_build_file())
3929
+
3930
+ # Check whether there are any new internal function calls in the spec file - if there are then we need to build
3931
+ # from scratch in order to create the relevant harness function.
3932
+ if context.verify and not context.disallow_internal_function_calls:
3933
+ with tempfile.NamedTemporaryFile("r", dir=Util.get_build_dir()) as tmp_file:
3934
+ internal_calls = []
3935
+ try:
3936
+ Ctx.run_local_spec_check(True, context, ["-listCalls", tmp_file.name], print_errors=False)
3937
+ output = tmp_file.read().strip()
3938
+ if output:
3939
+ internal_calls = output.split("\n")
3940
+ except Exception as e:
3941
+ instrumentation_logger.warning(f"Failed to get calls from spec\n{e}")
3942
+
3943
+ if internal_calls:
3944
+ build_logger.info("Found new internal calls in the spec file, need to recompile anyway")
3945
+ # There are new internal calls in the spec, we need to rebuild in order to generate the
3946
+ # external harness functions for them.
3947
+ cached_files = build_from_scratch(context, certora_build_generator,
3948
+ certora_verify_generator,
3949
+ True)
3950
+ return True, cached_files
3951
+
3952
+ # write build_output_props file
3953
+ shutil.copyfile(cached_files.build_output_props_file, Util.get_built_output_props_file())
3954
+ # write build_cache indicator file
3955
+ with open(Util.get_build_cache_indicator_file(), "w+") as indicator_handle:
3956
+ json.dump({"build_cache_hit": True}, indicator_handle)
3957
+ # write in sources all the additional paths found
3958
+ for p in cached_files.path_with_additional_included_files.glob("*"):
3959
+ if p.is_dir():
3960
+ Util.safe_copy_folder(p,
3961
+ Util.get_certora_sources_dir() / p.name,
3962
+ shutil.ignore_patterns())
3963
+ else:
3964
+ shutil.copyfile(p, Util.get_certora_sources_dir() / p.name)
3941
3965
 
3942
- return cache_hit, True, cached_files
3966
+ return False, cached_files
3943
3967
 
3944
3968
 
3945
3969
  def build(context: CertoraContext, ignore_spec_syntax_check: bool = False) -> None:
@@ -3969,9 +3993,9 @@ def build(context: CertoraContext, ignore_spec_syntax_check: bool = False) -> No
3969
3993
  build_logger.warning(
3970
3994
  "Local checks of CVL specification files disabled. It is recommended to enable the checks.")
3971
3995
 
3972
- cache_hit, build_cache_enabled, cached_files = build_from_cache_or_scratch(context,
3973
- certora_build_generator,
3974
- certora_verify_generator)
3996
+ should_save_cache, cached_files = build_from_cache_or_scratch(context,
3997
+ certora_build_generator,
3998
+ certora_verify_generator)
3975
3999
 
3976
4000
  # avoid running the same test over and over again for each split run, context.split_rules is true only for
3977
4001
  # the first run and is set to [] for split runs
@@ -3990,7 +4014,7 @@ def build(context: CertoraContext, ignore_spec_syntax_check: bool = False) -> No
3990
4014
  build_logger.debug("build_source_tree failed", exc_info=e)
3991
4015
 
3992
4016
  # save in build cache
3993
- if not cache_hit and build_cache_enabled and cached_files.may_store_in_build_cache:
4017
+ if should_save_cache and cached_files.may_store_in_build_cache:
3994
4018
  CertoraBuildCacheManager.save_build_cache(context, cached_files)
3995
4019
 
3996
4020
  certora_verify_generator.update_certora_verify_struct(True)
@@ -41,6 +41,46 @@ class MutateValidator:
41
41
  self.validate_arg_types()
42
42
  self.validate_gambit_objs()
43
43
  self.validate_attribute_combinations()
44
+ self.validate_manual_mutation()
45
+
46
+ def validate_manual_mutation(self) -> None:
47
+ if self.mutate_app.manual_mutants:
48
+ if not isinstance(self.mutate_app.manual_mutants, list):
49
+ raise Util.CertoraUserInputError("manual_mutants should be a list of objects")
50
+ for mutant in self.mutate_app.manual_mutants:
51
+ if not isinstance(mutant, dict):
52
+ raise Util.CertoraUserInputError(f"manual_mutants should be a list of objects, "
53
+ f"but found {type(mutant)} instead")
54
+
55
+ mandatory_keys = {Constants.FILE_TO_MUTATE, Constants.MUTANTS_LOCATION}
56
+ mutant_keys = set(mutant.keys())
57
+
58
+ missing_keys = mandatory_keys - mutant_keys
59
+ extra_keys = mutant_keys - mandatory_keys
60
+
61
+ if missing_keys:
62
+ raise Util.CertoraUserInputError(f"manual_mutants object must contain keys: {mandatory_keys}, "
63
+ f"missing: {missing_keys}")
64
+ if extra_keys:
65
+ raise Util.CertoraUserInputError(f"manual_mutants object contains invalid keys: {extra_keys}, "
66
+ f"only allowed: {mandatory_keys}")
67
+ try:
68
+ Vf.validate_readable_file(mutant[Constants.FILE_TO_MUTATE], Util.SOL_EXT)
69
+ except Exception as e:
70
+ raise Util.CertoraUserInputError(f"Invalid file_to_mutate in manual mutant: {mutant[Constants.FILE_TO_MUTATE]}", e)
71
+
72
+ mutants_location = mutant[Constants.MUTANTS_LOCATION]
73
+ if Path(mutants_location).is_dir():
74
+ try:
75
+ Vf.validate_dir(mutants_location)
76
+ except Exception as e:
77
+ raise Util.CertoraUserInputError(f"Invalid directory for mutants location {mutants_location}",
78
+ e)
79
+ else:
80
+ try:
81
+ Vf.validate_readable_file(mutants_location, Util.SOL_EXT)
82
+ except Exception as e:
83
+ raise Util.CertoraUserInputError(f"Invalid file for mutants location {mutants_location}", e)
44
84
 
45
85
  def mutation_attribute_in_prover(self) -> None:
46
86
  gambit_attrs = ['filename', 'contract', 'functions', 'seed', 'num_mutants']
@@ -1369,6 +1369,30 @@ def get_mappings_from_forge_remappings() -> List[str]:
1369
1369
 
1370
1370
  return remappings
1371
1371
 
1372
+ def check_remapping_file() -> None:
1373
+ seen: Dict[str, str] = {}
1374
+
1375
+ if not REMAPPINGS_FILE.exists():
1376
+ return
1377
+ with open(REMAPPINGS_FILE) as f:
1378
+ for lineno, line in enumerate(f, 1):
1379
+ line = line.strip()
1380
+ if not line or line.startswith("#") or "=" not in line:
1381
+ continue
1382
+ parts = line.split("=")
1383
+ if len(parts) != 2:
1384
+ raise CertoraUserInputError(f"Invalid remapping in {REMAPPINGS_FILE} line {lineno}: {line}")
1385
+ key, value = map(str.strip, parts)
1386
+
1387
+ if key in seen:
1388
+ if seen[key] == value:
1389
+ io_logger.warning(f"Warning: duplicate key-value pair at line {lineno}: {key}={value}")
1390
+ else:
1391
+ raise CertoraUserInputError(f"Conflicting values in {REMAPPINGS_FILE} for key '{key}' "
1392
+ f"at line {lineno} (previous: '{seen[key]}', new: '{value}')")
1393
+ else:
1394
+ seen[key] = value
1395
+
1372
1396
 
1373
1397
  def handle_remappings_file(context: SimpleNamespace) -> List[str]:
1374
1398
  """"
@@ -1380,13 +1404,12 @@ def handle_remappings_file(context: SimpleNamespace) -> List[str]:
1380
1404
  :return:
1381
1405
  """
1382
1406
  remappings = []
1407
+ check_remapping_file()
1383
1408
  if REMAPPINGS_FILE.exists() and not FOUNDRY_TOML_FILE.exists():
1384
1409
  try:
1385
1410
  with REMAPPINGS_FILE.open() as remappings_file:
1386
- remappings = list(filter(lambda x: x != "", map(lambda x: x.strip(), remappings_file.readlines())))
1387
- keys = [s.split('=')[0] for s in remappings]
1388
- if len(set(keys)) < len(keys):
1389
- raise CertoraUserInputError(f"remappings.txt includes duplicated keys in: {keys}")
1411
+ remappings_set = set(filter(lambda x: x != "", map(lambda x: x.strip(), remappings_file.readlines())))
1412
+ remappings = list(remappings_set)
1390
1413
  except CertoraUserInputError as e:
1391
1414
  raise e from None
1392
1415
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-beta-mirror
3
- Version: 8.1.1
3
+ Version: 8.2.1
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-beta-mirror
6
6
  Author: Certora
@@ -39,4 +39,4 @@ Dynamic: requires-dist
39
39
  Dynamic: requires-python
40
40
  Dynamic: summary
41
41
 
42
- Commit b03ee33. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
42
+ Commit a27f12a. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -12,8 +12,8 @@ certora_cli/certoraSolanaProver.py,sha256=1R1YnGHCofb05GqFgpxRh3ZmHkmwMm1hPM7rfe
12
12
  certora_cli/certoraSorobanProver.py,sha256=SYJKz5Sw-N0bJrSa1njRCE53R9_PMz7IWLhfamOjisk,2840
13
13
  certora_cli/rustMutator.py,sha256=6AvOGU8Ijz89zW_ZJCWlfXkeobJsk7EsqZhK7Eqwn-Y,14544
14
14
  certora_cli/CertoraProver/__init__.py,sha256=QHNr-PJQAoyuPgTkO7gg23GRchiWSXglWNG7yLSQZvs,849
15
- certora_cli/CertoraProver/certoraApp.py,sha256=ffHaqpokTOH0OcNpf8pzrbfygVJtNKyxShvjixnlsQg,1426
16
- certora_cli/CertoraProver/certoraBuild.py,sha256=IFADu1Oi3bIRLgw0Hc-HoXeNpeOVSXJvEEBTT_DqCnI,221048
15
+ certora_cli/CertoraProver/certoraApp.py,sha256=RKJ2Krb_CzbRUvczbdE6FhUDrFcvrR8j0JS8MNWXX7s,1469
16
+ certora_cli/CertoraProver/certoraBuild.py,sha256=CEavCUO0mBZ74dxR23RRInyDskHAddoX8Ox8-gaqnJk,222188
17
17
  certora_cli/CertoraProver/certoraBuildCacheManager.py,sha256=YnZmBZ_gCIbLwExgK5oxFlVDQGe4_YuGIpDLMy589E0,13318
18
18
  certora_cli/CertoraProver/certoraBuildDataClasses.py,sha256=hO0w3YK9V9gZsTbh4gxxlnEAaOiubUwfzNEw6uL1HaE,14841
19
19
  certora_cli/CertoraProver/certoraBuildRust.py,sha256=ZPbNp4ttRmzcKhFsgHSiHDRExNPaLOzgxTRqu23o1D0,6061
@@ -60,21 +60,21 @@ certora_cli/Mutate/mutateApp.py,sha256=UY4TWn9f318b2upVAFUL0cqcgzlyTDZ5XeNW3Mjof
60
60
  certora_cli/Mutate/mutateAttributes.py,sha256=2onGaPmztwmHg5V_X7BUG4HcQCThhqYzGYKBy695Izc,10587
61
61
  certora_cli/Mutate/mutateConstants.py,sha256=LRrz3wMM8WpPYSshkc-PLYqT0nexcWQeBNsehip-LOE,3945
62
62
  certora_cli/Mutate/mutateUtil.py,sha256=B7MCIFtZBetjR4MMxU6F5ikYsaot1wTG7XYMjgVXl4k,2287
63
- certora_cli/Mutate/mutateValidate.py,sha256=BV1nwGQfNvWlvNDgqY8679Rz5Uy0XKdcRuAJAludUQ4,7436
63
+ certora_cli/Mutate/mutateValidate.py,sha256=6DRYfnE-HCMvMxbb0v1dx2BTSd-x8YeFRVp35KplVPc,9760
64
64
  certora_cli/Shared/ExpectedComparator.py,sha256=eyRR-jni4WJoa6j2TK2lnZ89Tyb8U99wT2PNdu4se8w,18457
65
65
  certora_cli/Shared/__init__.py,sha256=s0dhvolFtsS4sRNzPVhC_rlw8mm194rCZ0WhOxInY40,1025
66
66
  certora_cli/Shared/certoraAttrUtil.py,sha256=Nw8ban5Axp6c6dT-KJfCD9i9tKnGk1DbvRDDNH3--DU,8574
67
67
  certora_cli/Shared/certoraLogging.py,sha256=cV2UQMhQ5j8crGXgeq9CEamI-Lk4HgdiA3HCrP-kSR4,14013
68
- certora_cli/Shared/certoraUtils.py,sha256=Pj319ac48U0pQZEvCAaIQ0RHVPxK9olcxiVGWT4-tXc,57521
68
+ certora_cli/Shared/certoraUtils.py,sha256=buUE95PnbpDEbYEZss_jcP7pWCRJhXnfV-eOA6-zvYM,58407
69
69
  certora_cli/Shared/certoraValidateFuncs.py,sha256=BPLuVsS3yAcYIuCvkXtDuFQKf2qaT74TIddB0lM84yM,42508
70
70
  certora_cli/Shared/proverCommon.py,sha256=uZkl9PDLPj81kKRnBnlPUmvhMZovNP25_74No_7jaQ4,11215
71
- certora_jars/ASTExtraction.jar,sha256=chudYF-_mStmKDgqsZHxhZDzyZ1c5IPjyi0H4sioUmM,17562779
72
- certora_jars/CERTORA-CLI-VERSION-METADATA.json,sha256=PNje5L4z_LLNebQk3DqGwhNXPiTaBJKVmuBQIiaW_bE,143
73
- certora_jars/Typechecker.jar,sha256=KopfIVe2A3lLPpef8IcWFnNbMsSIyQm9HUt7d79ss2s,17524936
71
+ certora_jars/ASTExtraction.jar,sha256=tRIhYz0x7agtytWLH0ta8zZMR6maGEzM13fOMrRBMMw,17614868
72
+ certora_jars/CERTORA-CLI-VERSION-METADATA.json,sha256=RHCGld9OX7ZGd559dhshflPnahIJShAHjF8GAaAzl1I,143
73
+ certora_jars/Typechecker.jar,sha256=u4KLY6doS3MNtQSPhF6BGgim7RViZ5jfXjSBMC7XVAs,17577025
74
74
  certora_jars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- certora_cli_beta_mirror-8.1.1.dist-info/LICENSE,sha256=UGKSKIJSetF8m906JLKqNLkUS2CL60XfQdNvxBvpQXo,620
76
- certora_cli_beta_mirror-8.1.1.dist-info/METADATA,sha256=-IrQQVdM-CWRDoFTuEVu9mnRJ7OUwq6JvC3t3rG2S8g,1286
77
- certora_cli_beta_mirror-8.1.1.dist-info/WHEEL,sha256=9Ig2YBzm5cpS_YWKLeuYxVAxcKv_uDQsCzy9XJbRZ_g,110
78
- certora_cli_beta_mirror-8.1.1.dist-info/entry_points.txt,sha256=ClZiFkCYDdK25_ufxZvnE2Rx_kNk1_4vj7KpgYUKxGM,509
79
- certora_cli_beta_mirror-8.1.1.dist-info/top_level.txt,sha256=8C77w3JLanY0-NW45vpJsjRssyCqVP-qmPiN9FjWiX4,38
80
- certora_cli_beta_mirror-8.1.1.dist-info/RECORD,,
75
+ certora_cli_beta_mirror-8.2.1.dist-info/LICENSE,sha256=UGKSKIJSetF8m906JLKqNLkUS2CL60XfQdNvxBvpQXo,620
76
+ certora_cli_beta_mirror-8.2.1.dist-info/METADATA,sha256=sqpw-Q34_jE5LItMjWt-BRiLsYxn7-eKSj9Wgv_2lBs,1286
77
+ certora_cli_beta_mirror-8.2.1.dist-info/WHEEL,sha256=9Ig2YBzm5cpS_YWKLeuYxVAxcKv_uDQsCzy9XJbRZ_g,110
78
+ certora_cli_beta_mirror-8.2.1.dist-info/entry_points.txt,sha256=ClZiFkCYDdK25_ufxZvnE2Rx_kNk1_4vj7KpgYUKxGM,509
79
+ certora_cli_beta_mirror-8.2.1.dist-info/top_level.txt,sha256=8C77w3JLanY0-NW45vpJsjRssyCqVP-qmPiN9FjWiX4,38
80
+ certora_cli_beta_mirror-8.2.1.dist-info/RECORD,,
Binary file
@@ -1 +1 @@
1
- {"name": "certora-cli-beta-mirror", "tag": "8.1.1", "branch": "", "commit": "b03ee33", "timestamp": "20250812.16.6.250096", "version": "8.1.1"}
1
+ {"name": "certora-cli-beta-mirror", "tag": "8.2.1", "branch": "", "commit": "a27f12a", "timestamp": "20250828.9.26.267405", "version": "8.2.1"}
Binary file