certora-cli-beta-mirror 8.6.1__py3-none-macosx_10_9_universal2.whl → 8.6.3__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.
@@ -23,6 +23,8 @@ from typing import Type
23
23
 
24
24
  class CertoraApp(ABC):
25
25
  attr_class: Type[AttrUtil.Attributes] = Attrs.EvmProverAttributes
26
+ ecosystem: str = "EVM"
27
+ product: str = "PROVER"
26
28
 
27
29
  class EvmAppClass(CertoraApp):
28
30
  pass
@@ -38,15 +40,21 @@ class MoveAppClass(CertoraApp):
38
40
 
39
41
  class SolanaApp(RustAppClass):
40
42
  attr_class = Attrs.SolanaProverAttributes
43
+ ecosystem: str = "SOLANA"
44
+
41
45
 
42
46
  class SorobanApp(RustAppClass):
43
47
  attr_class = Attrs.SorobanProverAttributes
48
+ ecosystem: str = "SOROBAN"
44
49
 
45
50
  class RangerApp(EvmAppClass):
46
51
  attr_class = Attrs.RangerAttributes
52
+ product = "RANGER"
47
53
 
48
54
  class ConcordApp(EvmAppClass):
49
55
  attr_class = Attrs.ConcordAttributes
56
+ product = "CONCORD"
50
57
 
51
58
  class SuiApp(MoveAppClass):
52
59
  attr_class = Attrs.SuiProverAttributes
60
+ ecosystem: str = "SUI"
@@ -69,18 +69,6 @@ Response = requests.models.Response
69
69
 
70
70
  FEATURES_REPORT_FILE = Path("featuresReport.json")
71
71
 
72
- class EcoEnum(Util.NoValEnum):
73
- EVM = Util.auto()
74
- SOROBAN = Util.auto()
75
- SOLANA = Util.auto()
76
- SUI = Util.auto()
77
-
78
- class ProductEnum(Util.NoValEnum):
79
- PROVER = Util.auto()
80
- RANGER = Util.auto()
81
- CONCORD = Util.auto()
82
-
83
-
84
72
  class TimeError(Exception):
85
73
  """A custom exception used to report on time elapsed errors"""
86
74
 
@@ -648,21 +636,8 @@ class CloudVerification:
648
636
 
649
637
  auth_data["useLatestFe"] = self.context.fe_version == str(Util.FeValue.LATEST)
650
638
 
651
- if Attrs.is_solana_app():
652
- auth_data["ecosystem"] = EcoEnum.SOLANA.name
653
- elif Attrs.is_soroban_app():
654
- auth_data["ecosystem"] = EcoEnum.SOROBAN.name
655
- elif Attrs.is_sui_app():
656
- auth_data["ecosystem"] = EcoEnum.SUI.name
657
- else:
658
- auth_data["ecosystem"] = EcoEnum.EVM.name
659
-
660
- if Attrs.is_ranger_app():
661
- auth_data["product"] = ProductEnum.RANGER.name
662
- elif Attrs.is_concord_app():
663
- auth_data["product"] = ProductEnum.CONCORD.name
664
- else:
665
- auth_data["product"] = ProductEnum.PROVER.name
639
+ auth_data["ecosystem"] = self.context.app.ecosystem
640
+ auth_data["product"] = self.context.app.product
666
641
 
667
642
  if Attrs.is_evm_app() and self.context.cache is not None:
668
643
  auth_data["toolSceneCacheKey"] = self.context.cache
@@ -64,7 +64,6 @@ class CardContent:
64
64
 
65
65
  DOC_LINK_PREFIX = 'https://docs.certora.com/en/latest/docs/'
66
66
  GIT_ATTRIBUTES = ['origin', 'revision', 'branch', 'dirty']
67
- ARG_LIST_ATTRIBUTES = ['prover_args', 'java_args']
68
67
 
69
68
 
70
69
  class AttributeJobConfigData:
@@ -297,7 +296,7 @@ def collect_attribute_configs(metadata: dict) -> list[CardContent]:
297
296
  # Find or create the subsection (if it doesn't exist)
298
297
  if isinstance(attr_value, list):
299
298
  content_type = ContentType.SIMPLE
300
- if attr_name in ARG_LIST_ATTRIBUTES:
299
+ if attr_name in Attrs.ARG_FLAG_LIST_ATTRIBUTES:
301
300
  attr_value = split_and_sort_arg_list_value(attr_value)
302
301
 
303
302
  elif isinstance(attr_value, dict):
@@ -74,6 +74,7 @@ class RunMetaData:
74
74
  conf_path -- the relative path form the cwd_relative to the configuration file
75
75
  group_id -- optional identifier for grouping this run
76
76
  java_version -- version of Java used during the run, if available
77
+ ecosystem -- the ecosystem of the current run (EVM, SOLANA, SOROBAN, SUI, etc)
77
78
  default_solc_version -- version of default solc version on current machine, if available
78
79
  python_version -- version of Python running the process
79
80
  certora_ci_client -- name of the CI client if available, derived from environment
@@ -84,7 +85,7 @@ class RunMetaData:
84
85
  """
85
86
  def __init__(self, raw_args: List[str], conf: Dict[str, Any], origin: str, revision: str,
86
87
  branch: str, cwd_relative: Path, dirty: bool, main_spec: Optional[str],
87
- conf_path: Optional[Path], group_id: Optional[str], java_version: str):
88
+ conf_path: Optional[Path], group_id: Optional[str], java_version: str, ecosystem: str):
88
89
  self.raw_args = raw_args
89
90
  self.conf = conf
90
91
  self.origin = origin
@@ -97,6 +98,7 @@ class RunMetaData:
97
98
  self.group_id = group_id
98
99
  self.python_version = ".".join(str(x) for x in sys.version_info[:3])
99
100
  self.java_version = java_version
101
+ self.ecosystem = ecosystem
100
102
  self.default_solc_version = get_solc_version(self.conf)
101
103
  self.certora_ci_client = Utils.get_certora_ci_name()
102
104
  self.timestamp = str(datetime.now(timezone.utc).timestamp())
@@ -119,6 +121,7 @@ class RunMetaData:
119
121
  f" group_id: {self.group_id}\n"
120
122
  f" python_version: {self.python_version}\n"
121
123
  f" java_version: {self.java_version}\n"
124
+ f" ecosystem: {self.ecosystem}\n"
122
125
  f" default_solc_version: {self.default_solc_version}\n"
123
126
  f" CertoraCI client: {self.certora_ci_client}\n"
124
127
  f" jar_flag_info: {self.jar_flag_info}\n"
@@ -198,7 +201,8 @@ def collect_run_metadata(wd: Path, raw_args: List[str], context: CertoraContext)
198
201
  main_spec=None,
199
202
  conf_path=None,
200
203
  group_id=None,
201
- java_version=context.java_version)
204
+ java_version=context.java_version,
205
+ ecosystem=context.app.ecosystem)
202
206
 
203
207
  # collect information about current git snapshot
204
208
  cwd_abs = wd.absolute()
@@ -227,7 +231,8 @@ def collect_run_metadata(wd: Path, raw_args: List[str], context: CertoraContext)
227
231
  main_spec=get_main_spec(context),
228
232
  conf_path=conf_path,
229
233
  group_id=context.group_id,
230
- java_version=context.java_version)
234
+ java_version=context.java_version,
235
+ ecosystem=context.app.ecosystem)
231
236
 
232
237
  try:
233
238
  sha_out = subprocess.run(['git', 'rev-parse', 'HEAD'], cwd=wd,
@@ -263,7 +268,8 @@ def collect_run_metadata(wd: Path, raw_args: List[str], context: CertoraContext)
263
268
  main_spec=get_main_spec(context),
264
269
  conf_path=conf_path,
265
270
  group_id=context.group_id,
266
- java_version=context.java_version)
271
+ java_version=context.java_version,
272
+ ecosystem=context.app.ecosystem)
267
273
 
268
274
  metadata_logger.debug(f' collected data:\n{str(data)}')
269
275
 
@@ -282,7 +288,8 @@ def collect_run_metadata(wd: Path, raw_args: List[str], context: CertoraContext)
282
288
  main_spec=get_main_spec(context),
283
289
  conf_path=conf_path,
284
290
  group_id=context.group_id,
285
- java_version=context.java_version)
291
+ java_version=context.java_version,
292
+ ecosystem=context.app.ecosystem)
286
293
 
287
294
 
288
295
  def get_solc_version(conf: Dict[str, Any]) -> Optional[str]:
@@ -1949,6 +1949,8 @@ class SolanaProverAttributes(CommonAttributes, InternalUseAttributes, BackendAtt
1949
1949
 
1950
1950
  ATTRIBUTES_CLASS: Optional[Type[AttrUtil.Attributes]] = None
1951
1951
 
1952
+ ARG_FLAG_LIST_ATTRIBUTES = ['prover_args', 'java_args']
1953
+
1952
1954
 
1953
1955
  def get_attribute_class() -> Type[AttrUtil.Attributes]:
1954
1956
  if not ATTRIBUTES_CLASS:
@@ -41,7 +41,6 @@ validation_logger = logging.getLogger("validation")
41
41
 
42
42
  KEY_ENV_VAR = "CERTORAKEY"
43
43
 
44
-
45
44
  class CertoraContextValidator:
46
45
  def __init__(self, context: CertoraContext):
47
46
  self.context = context
@@ -143,6 +142,14 @@ class CertoraContextValidator:
143
142
  f'"{conf_key}": [<comma separated list of values>]{Util.NEW_LINE}{Util.NEW_LINE}'
144
143
  raise Util.CertoraUserInputError(f"The value of attribute '{conf_key}' ('{value}')' is not a "
145
144
  f"list {syntax_suggestion}")
145
+
146
+ # Check for duplicates, we exclude ARG_FLAG_LIST_ATTRIBUTES as those can have duplicates e.g.
147
+ # prover_args value of “-rule rule1 -rule rule2" is valid, although the -rule string appears more than once.
148
+
149
+ if conf_key not in Attrs.ARG_FLAG_LIST_ATTRIBUTES:
150
+ if len(value) != len(set(value)):
151
+ raise Util.CertoraUserInputError(f"The value of attribute '{conf_key}' contains duplicate entries: {value}")
152
+
146
153
  for v in value:
147
154
  if not isinstance(v, str):
148
155
  raise Util.CertoraUserInputError(f"value in {conf_key} {v} in {value} is not a string")
@@ -20,7 +20,8 @@ import sys
20
20
  import json
21
21
  from pathlib import Path
22
22
  from argparse import Namespace, ArgumentParser
23
- from typing import List, Optional
23
+ from typing import List, TypeVar, Union, Optional
24
+
24
25
 
25
26
  # Credit for this work goes to Nick and Netanel.
26
27
 
@@ -51,6 +52,22 @@ CONTRACTS = "contracts"
51
52
  PROVER_ARGS = "prover_args"
52
53
  OPTIMISTIC_FALLBACK_SETTING = "optimistic_fallback"
53
54
 
55
+ T = TypeVar("T", str, Path)
56
+
57
+ def append_unique(lst: List[T], item: Union[str, Path]) -> None:
58
+ """
59
+ Append item to lst:
60
+ - If lst is List[Path] and item is str → convert to Path.
61
+ - If lst is List[str] → leave item as str.
62
+ """
63
+ if lst and isinstance(lst[0], Path) and isinstance(item, str):
64
+ if Path(item) in lst:
65
+ return
66
+ lst.append(Path(item)) # type: ignore[arg-type]
67
+ else:
68
+ if item in lst:
69
+ return
70
+ lst.append(item) # type: ignore[arg-type]
54
71
 
55
72
  class EquivalenceChecker:
56
73
 
@@ -134,7 +151,7 @@ class EquivalenceChecker:
134
151
  solc_i = self.solcs[i]
135
152
  with (self.path / SANITY_CONF_PATH).open() as sanity_conf:
136
153
  contents = json.load(sanity_conf)
137
- contents[FILES].append(str(file_i))
154
+ append_unique(contents[FILES], str(file_i))
138
155
  contents[SOLC] = solc_i
139
156
  contents[VERIFY] = f'{contract_i}:{self.path / SANITY_PATH}'
140
157
  contents["build_only"] = True
@@ -165,10 +182,10 @@ class EquivalenceChecker:
165
182
  for file in files:
166
183
  # if the conf file contains absolute path already then we use it
167
184
  if Path(file).exists():
168
- self.files.append(file)
185
+ append_unique(self.files, file)
169
186
  # otherwise append the relative path to the conf file location to create absolute path
170
187
  else:
171
- self.files.append(resolve_file(self.conf_path.parent / file))
188
+ append_unique(self.files, resolve_file(self.conf_path.parent / file))
172
189
  # case where either or both of these will be in the conf file
173
190
  if not self.functions and FUNCTIONS in contents:
174
191
  # if the user has functions in the conf file but manually inputs different ones
@@ -307,13 +324,13 @@ class EquivalenceChecker:
307
324
  contents['rule_sanity'] = "basic"
308
325
  contents[FILES] = list()
309
326
  for file in self.files:
310
- contents['files'].append(str(file))
327
+ append_unique(contents['files'], str(file))
311
328
  else:
312
329
  # update default conf_file for running
313
330
  with (self.path / DEFAULT_CONF_PATH).open() as conf_file:
314
331
  contents = json.load(conf_file)
315
332
  for file in self.files:
316
- contents[FILES].append(str(file))
333
+ append_unique(contents[FILES], str(file))
317
334
  if self.args.bitvector is True:
318
335
  contents.setdefault(PROVER_ARGS, []).append(["-smt_bitVectorTheory true"])
319
336
  if self.args.test_mode is True:
@@ -310,6 +310,7 @@ class ExitException(Exception):
310
310
  self.exit_code = exit_code # Store the integer data
311
311
 
312
312
  MIN_JAVA_VERSION = 19 # minimal java version to run the local type checker jar
313
+ RECOMMENDED_JAVA_VERSION = 21 # recommended java version to run the local type checker jar
313
314
 
314
315
 
315
316
  def text_style(txt: str, style: str) -> str:
@@ -626,20 +627,6 @@ def get_certora_root_directory() -> Path:
626
627
  def get_certora_envvar() -> str:
627
628
  return os.getenv(ENVVAR_CERTORA, "")
628
629
 
629
-
630
- def which(filename: str) -> Optional[str]:
631
- if is_windows() and not filename.endswith(".exe"):
632
- filename += ".exe"
633
-
634
- # TODO: find a better way to iterate over all directories in $Path
635
- for dirname in os.environ['PATH'].split(os.pathsep) + [os.getcwd()]:
636
- candidate = os.path.join(dirname, filename)
637
- if os.path.isfile(candidate) and os.access(candidate, os.X_OK):
638
- return filename
639
-
640
- return None
641
-
642
-
643
630
  def read_json_file(file_name: Path) -> Dict[str, Any]:
644
631
  with file_name.open() as json_file:
645
632
  json_obj = json.load(json_file)
@@ -1006,7 +993,7 @@ def get_java_version() -> str:
1006
993
  @return installed java version on success or empty string
1007
994
  """
1008
995
  # Check if java exists on the machine
1009
- java = which("java")
996
+ java = shutil.which("java")
1010
997
  if java is None:
1011
998
  return ''
1012
999
 
@@ -1028,17 +1015,23 @@ def is_java_installed(java_version: str) -> bool:
1028
1015
  if not java_version:
1029
1016
  typecheck_logger.warning(
1030
1017
  f"`java` is not installed. Installing Java version {MIN_JAVA_VERSION} or later will enable faster "
1031
- f"CVL specification syntax checking before uploading to the cloud.")
1018
+ f"CVL specification syntax checking before uploading to the cloud.\n"
1019
+ f"The recommended LTS version is {RECOMMENDED_JAVA_VERSION}.")
1032
1020
  return False
1033
1021
 
1034
1022
  else:
1035
1023
  major_java_version = java_version.split('.')[0]
1036
1024
  if int(major_java_version) < MIN_JAVA_VERSION:
1037
1025
  typecheck_logger.warning("Installed Java version is too old to check CVL specification files locally. "
1038
- f" Java version should be at least {MIN_JAVA_VERSION} to allow local java-based "
1039
- "type checking")
1026
+ f"Java version should be at least {MIN_JAVA_VERSION} to allow local java-based "
1027
+ "type checking\n"
1028
+ f"The recommended LTS version is {RECOMMENDED_JAVA_VERSION}.")
1040
1029
 
1041
1030
  return False
1031
+ elif int(major_java_version) < RECOMMENDED_JAVA_VERSION:
1032
+ typecheck_logger.warning(f"Installed Java version ({int(major_java_version)}) is not an LTS release. "
1033
+ f"Upgrading is recommended.\n"
1034
+ f"The recommended LTS version is {RECOMMENDED_JAVA_VERSION}.")
1042
1035
 
1043
1036
  return True
1044
1037
 
@@ -1319,6 +1312,7 @@ def check_packages_arguments(context: SimpleNamespace) -> None:
1319
1312
  package = package_str.split("=")[0]
1320
1313
  path = package_str.split("=")[1]
1321
1314
  if package in context.package_name_to_path:
1315
+
1322
1316
  raise CertoraUserInputError(
1323
1317
  f"package {package} was given two paths: {context.package_name_to_path[package]}, {path}")
1324
1318
  if path.endswith("/"):
@@ -1334,7 +1328,11 @@ def check_packages_arguments(context: SimpleNamespace) -> None:
1334
1328
  if PACKAGE_FILE.exists():
1335
1329
  try:
1336
1330
  with PACKAGE_FILE.open() as package_json_file:
1337
- package_json = json.load(package_json_file)
1331
+ try:
1332
+ package_json = json.load(package_json_file)
1333
+ except json.JSONDecodeError as e:
1334
+ raise CertoraUserInputError(f"Invalid JSON in package file: {PACKAGE_FILE}", e)
1335
+
1338
1336
  dict1 = package_json.get("dependencies", {})
1339
1337
  dict2 = package_json.get("devDependencies", {})
1340
1338
  dep_conflicts = {key: value for key, value in dict1.items() if key in dict2 and dict2[key] != value}
@@ -1352,7 +1350,7 @@ def check_packages_arguments(context: SimpleNamespace) -> None:
1352
1350
 
1353
1351
  packages_to_path_list += handle_remappings_file(context)
1354
1352
  if len(packages_to_path_list) > 0:
1355
- keys = [s.split('=')[0] for s in packages_to_path_list]
1353
+ keys = [s.split('=')[0].rstrip('/') for s in packages_to_path_list] # XXX and XXX/ are the same key
1356
1354
  if len(set(keys)) < len(keys):
1357
1355
  raise CertoraUserInputError(f"package.json and remappings.txt include duplicated keys in: {keys}")
1358
1356
  context.packages = sorted(packages_to_path_list, key=str.lower)
@@ -1380,7 +1378,9 @@ def get_mappings_from_forge_remappings() -> List[str]:
1380
1378
  for line in remappings_output.strip().split('\n'):
1381
1379
  key, value = line.split('=', 1)
1382
1380
  if key and value:
1383
- remappings.append(line.strip())
1381
+ new_remapping = line.strip()
1382
+ if new_remapping not in remappings:
1383
+ remappings.append(new_remapping)
1384
1384
  for suffix in ['contracts/', 'src/']:
1385
1385
  if value.endswith(suffix) and not key.endswith(suffix):
1386
1386
  new_remapping = f"{key}{suffix}={value}"
@@ -1415,30 +1415,38 @@ def check_remapping_file() -> None:
1415
1415
 
1416
1416
 
1417
1417
  def handle_remappings_file(context: SimpleNamespace) -> List[str]:
1418
- """"
1419
- Tries to reach packages from remappings.txt.
1420
- If the file exists in cwd and foundry.toml does not exist in cwd we return the mappings in
1421
- the file (legacy implementation).
1422
- In all other cases we add the remappings returned from running the "forge remappings" command. Forge remappings
1423
- takes into consideration mappings in remappings.txt but also mappings in foundry.toml and mappings from auto scan
1424
- :return:
1425
1418
  """
1426
- remappings = []
1427
- check_remapping_file()
1428
- if REMAPPINGS_FILE.exists() and not FOUNDRY_TOML_FILE.exists():
1419
+ Tries to fetch packages from remappings.txt. This function should not be called if the packages attribute
1420
+ was set in conf file on in CLI.
1421
+ If forge is installed and foundry.toml is found we run 'forge remappings' to get the package mappings (including possible auto scan).
1422
+ If the remappings.txt exists in cwd and foundry is not installed we parse the file (legacy behavior).
1423
+ """
1424
+
1425
+ def parse_remappings_file() -> List[str]:
1429
1426
  try:
1430
1427
  with REMAPPINGS_FILE.open() as remappings_file:
1431
1428
  remappings_set = set(filter(lambda x: x != "", map(lambda x: x.strip(), remappings_file.readlines())))
1432
- remappings = list(remappings_set)
1429
+ return list(remappings_set)
1433
1430
  except CertoraUserInputError as e:
1434
1431
  raise e from None
1435
1432
  except Exception as e:
1436
1433
  # create CertoraUserInputError from other exceptions
1437
1434
  raise CertoraUserInputError(f"Invalid remappings file: {REMAPPINGS_FILE}", e)
1438
- elif find_nearest_foundry_toml():
1435
+
1436
+ check_remapping_file()
1437
+ foundry_toml_exist = find_nearest_foundry_toml()
1438
+ remappings_text_exist_in_cwd = REMAPPINGS_FILE.exists()
1439
+ foundry_installed = shutil.which("forge") is not None
1440
+ remappings = []
1441
+ if foundry_installed and foundry_toml_exist:
1439
1442
  remappings = get_mappings_from_forge_remappings()
1443
+ elif remappings_text_exist_in_cwd:
1444
+ remappings = parse_remappings_file()
1440
1445
 
1441
- context.forge_remappings = remappings
1446
+ if foundry_toml_exist and not foundry_installed:
1447
+ context_logger.warning("foundry.toml was found but `forge` command not found. To add support for foundry "
1448
+ "please install `foundry` following instructions at "
1449
+ "https://book.getfoundry.sh/getting-started/installation")
1442
1450
 
1443
1451
  return remappings
1444
1452
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-beta-mirror
3
- Version: 8.6.1
3
+ Version: 8.6.3
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-beta-mirror
6
6
  Author: Certora
@@ -38,4 +38,4 @@ Dynamic: requires-dist
38
38
  Dynamic: requires-python
39
39
  Dynamic: summary
40
40
 
41
- Commit 6c493e0. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
41
+ Commit c4459c1. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -14,21 +14,21 @@ certora_cli/certoraSuiProver.py,sha256=gRs-iihB35ZSEIQ5-hJN-wLgrHZlcfmpk76Wr6vza
14
14
  certora_cli/rustMutator.py,sha256=j1YdY5HOWQcRNbz7TOxp5c79J0YaaYHtWZ6m2mSTeGc,14865
15
15
  certora_cli/CertoraProver/__init__.py,sha256=QHNr-PJQAoyuPgTkO7gg23GRchiWSXglWNG7yLSQZvs,849
16
16
  certora_cli/CertoraProver/castingInstrumenter.py,sha256=4FDjQjnN9s8I3B9J-_G9rug9Jf3LnWnAuRngr50oTH4,7898
17
- certora_cli/CertoraProver/certoraApp.py,sha256=RKJ2Krb_CzbRUvczbdE6FhUDrFcvrR8j0JS8MNWXX7s,1469
17
+ certora_cli/CertoraProver/certoraApp.py,sha256=7pkQnUYMzP9V-Yo0jszNV9Y9aB760Q6hMZtlcXuuRp8,1660
18
18
  certora_cli/CertoraProver/certoraBuild.py,sha256=h6lGjUyTcC0EnRCK1DXD26Qez4DEphpFjx_IoQRiuO8,231608
19
19
  certora_cli/CertoraProver/certoraBuildCacheManager.py,sha256=DnVd7w92xjmg0DIrMgoJnCvaU0yCz7ySy0M4RiHEXEM,13648
20
20
  certora_cli/CertoraProver/certoraBuildDataClasses.py,sha256=RGeoZCS4OztfbEUak0Oq02wIPgrmAOwLBad6-_XvX8c,14936
21
21
  certora_cli/CertoraProver/certoraBuildRust.py,sha256=ZPbNp4ttRmzcKhFsgHSiHDRExNPaLOzgxTRqu23o1D0,6061
22
22
  certora_cli/CertoraProver/certoraBuildSui.py,sha256=zMXD2XnC4oqRDzPcBvSZmVquL3UG5paBZkfUT3JPbYY,4180
23
- certora_cli/CertoraProver/certoraCloudIO.py,sha256=ElRVD-c69aSURtgobuxbEfg6rPzQDSTqtTZJmeT_SYU,54430
24
- certora_cli/CertoraProver/certoraCollectConfigurationLayout.py,sha256=Rln6LsqMp-u0H2fAFulTLAn7GW-j3ox2XZSz0ghdjk0,14116
25
- certora_cli/CertoraProver/certoraCollectRunMetadata.py,sha256=SonKgq2l6_8o6xySbinEinEd32Ufrk3VB0Roq-CmwoM,13718
23
+ certora_cli/CertoraProver/certoraCloudIO.py,sha256=nvB1x5237waj3iDnLcLYO5RlmEKGqFpDXWNOcxAgOQw,53701
24
+ certora_cli/CertoraProver/certoraCollectConfigurationLayout.py,sha256=2EXMMaQcjAhWIvVxDeyYatR1RZtRhVwJl1GUvudJLdc,14076
25
+ certora_cli/CertoraProver/certoraCollectRunMetadata.py,sha256=wjP6m8W2rBka15vcj4P6tPkD0fVf-u62NylVqrOwCo8,14138
26
26
  certora_cli/CertoraProver/certoraCompilerParameters.py,sha256=v-MIt4sDJSQ7vpEFmCt9XBkKBhdBbZuZA4PWNErJwcU,1807
27
27
  certora_cli/CertoraProver/certoraConfigIO.py,sha256=-1EhJYsiheYvyCgOOWrRCQBjqtqNXrpMKJYRq5cKJ0Y,8171
28
28
  certora_cli/CertoraProver/certoraContext.py,sha256=ezdLmR-tSDLTtokhTyS9DacnB3W64Ke_6e714Vuug3c,29196
29
- certora_cli/CertoraProver/certoraContextAttributes.py,sha256=BOa6L2kuTN_s2KPhHgCE4Wly2kSs_JGVXgTxXPSVpgk,73123
29
+ certora_cli/CertoraProver/certoraContextAttributes.py,sha256=3NCjyNAkEI9ZVQD1BsNBoyHDeAYSbWWBN1gKkj-PqsA,73180
30
30
  certora_cli/CertoraProver/certoraContextClass.py,sha256=d7HDqM72K7YnswR7kEcAHGwkFNrTqRz5-_0m7cl2Mso,900
31
- certora_cli/CertoraProver/certoraContextValidator.py,sha256=KEsxk6D_s_piucib5VeuCNJhKUZUsuCcOyoZRywjKz8,46448
31
+ certora_cli/CertoraProver/certoraContextValidator.py,sha256=II5xHZH5j2LIZ7XP08uybzAZ-HcW778qXcS7qhMAyv8,46901
32
32
  certora_cli/CertoraProver/certoraContractFuncs.py,sha256=IKe4xbDh0yFoYVCuLeAxnGg9h59rQCla3Qpy0GwS3HE,8236
33
33
  certora_cli/CertoraProver/certoraExtensionInfo.py,sha256=YlShzdoqJQgXXj3r0TJ3fir1KntIR99Rk8JN5qii2lk,2026
34
34
  certora_cli/CertoraProver/certoraJobList.py,sha256=FBIYgJ60I0Ok7vchfTbcuJJbiXgnfAhrONoVeZoHti4,11464
@@ -55,7 +55,7 @@ certora_cli/EquivalenceCheck/Eq_mc_template.spec,sha256=pbRhwqw0a_KHQ6W3biJeGS9o
55
55
  certora_cli/EquivalenceCheck/Eq_sanity.conf,sha256=BuBI5YNg25b--iQxpNxBzb4v-q-HByObCx7R5Uy1jRw,161
56
56
  certora_cli/EquivalenceCheck/Eq_template.spec,sha256=YGaG5KxSOhelDiBd1oxDnVC8VhPl6coaxHiY4lXVf6o,823
57
57
  certora_cli/EquivalenceCheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- certora_cli/EquivalenceCheck/equivCheck.py,sha256=nfKm1zyboMui_eOGwXZCAC9LkcmW67teUEx8YEANCyY,20671
58
+ certora_cli/EquivalenceCheck/equivCheck.py,sha256=w_AdgY03FuZS8M2ktM_xwTJsoctF_4C1rVCjYM3WMfM,21252
59
59
  certora_cli/EquivalenceCheck/sanity.spec,sha256=tWmE9z2Sq3_SWaqKDRQaNajRrw94maUrirvoUmX89LE,103
60
60
  certora_cli/Mutate/__init__.py,sha256=QHNr-PJQAoyuPgTkO7gg23GRchiWSXglWNG7yLSQZvs,849
61
61
  certora_cli/Mutate/mutateApp.py,sha256=UY4TWn9f318b2upVAFUL0cqcgzlyTDZ5XeNW3MjofkA,88701
@@ -67,16 +67,16 @@ certora_cli/Shared/ExpectedComparator.py,sha256=eyRR-jni4WJoa6j2TK2lnZ89Tyb8U99w
67
67
  certora_cli/Shared/__init__.py,sha256=s0dhvolFtsS4sRNzPVhC_rlw8mm194rCZ0WhOxInY40,1025
68
68
  certora_cli/Shared/certoraAttrUtil.py,sha256=Nw8ban5Axp6c6dT-KJfCD9i9tKnGk1DbvRDDNH3--DU,8574
69
69
  certora_cli/Shared/certoraLogging.py,sha256=cV2UQMhQ5j8crGXgeq9CEamI-Lk4HgdiA3HCrP-kSR4,14013
70
- certora_cli/Shared/certoraUtils.py,sha256=lHd7Da2BmpFAMUoVpdmg5IICsCEIX9qCuD7Ts5QaLpQ,59556
70
+ certora_cli/Shared/certoraUtils.py,sha256=WEvgDMqTeqC61Q0cW1inbTmGVEgFYawjq8H2vv26bmI,60574
71
71
  certora_cli/Shared/certoraValidateFuncs.py,sha256=gCM-YP0Tpngpasd2AWxhu90UNz1wtls3WqJYp18n_Q8,43503
72
72
  certora_cli/Shared/proverCommon.py,sha256=DUB-uEKjOkZ-8qil6xukPqfTynpigXW-gcrm0_kRUZY,11383
73
- certora_jars/ASTExtraction.jar,sha256=P3haha7dkTPBjnKf0QTbDIRVlPUG-baHBKOtJOfzItI,22000249
74
- certora_jars/CERTORA-CLI-VERSION-METADATA.json,sha256=U29RiJdpNGNdkCJUlqBVOgap5evGzsDWdwjXY7YXLu8,143
75
- certora_jars/Typechecker.jar,sha256=z8_ITj9uYbsMh8sGLdKPmZUgwamIMAznBs0JAFeMpog,21962361
73
+ certora_jars/ASTExtraction.jar,sha256=WW6yieuw0g2v_obN8ta_UNCo-s36aXSTalGrNlVcVlk,22010491
74
+ certora_jars/CERTORA-CLI-VERSION-METADATA.json,sha256=X52jjlrZ6HZa4glSelbBDKPXahSrm2zQLw8TGtVuCHU,144
75
+ certora_jars/Typechecker.jar,sha256=kCONcIoiI34Pn0MQn_cBI4Jvpxm41o0gi7syqLDWVok,21972603
76
76
  certora_jars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- certora_cli_beta_mirror-8.6.1.dist-info/LICENSE,sha256=UGKSKIJSetF8m906JLKqNLkUS2CL60XfQdNvxBvpQXo,620
78
- certora_cli_beta_mirror-8.6.1.dist-info/METADATA,sha256=DNa86WK5KGiqVrDohHqNWoMcLhaZOowS-JhWrjlu4iE,1254
79
- certora_cli_beta_mirror-8.6.1.dist-info/WHEEL,sha256=9Ig2YBzm5cpS_YWKLeuYxVAxcKv_uDQsCzy9XJbRZ_g,110
80
- certora_cli_beta_mirror-8.6.1.dist-info/entry_points.txt,sha256=YXGQmR4tGdYD9lLdG_TEJkmVNrRauCtCDE88HwvO2Jo,569
81
- certora_cli_beta_mirror-8.6.1.dist-info/top_level.txt,sha256=8C77w3JLanY0-NW45vpJsjRssyCqVP-qmPiN9FjWiX4,38
82
- certora_cli_beta_mirror-8.6.1.dist-info/RECORD,,
77
+ certora_cli_beta_mirror-8.6.3.dist-info/LICENSE,sha256=UGKSKIJSetF8m906JLKqNLkUS2CL60XfQdNvxBvpQXo,620
78
+ certora_cli_beta_mirror-8.6.3.dist-info/METADATA,sha256=j_4UsqDWfNyvCbiTBjK_gU_OWAuWPpVkAxxmSy-1d28,1254
79
+ certora_cli_beta_mirror-8.6.3.dist-info/WHEEL,sha256=9Ig2YBzm5cpS_YWKLeuYxVAxcKv_uDQsCzy9XJbRZ_g,110
80
+ certora_cli_beta_mirror-8.6.3.dist-info/entry_points.txt,sha256=YXGQmR4tGdYD9lLdG_TEJkmVNrRauCtCDE88HwvO2Jo,569
81
+ certora_cli_beta_mirror-8.6.3.dist-info/top_level.txt,sha256=8C77w3JLanY0-NW45vpJsjRssyCqVP-qmPiN9FjWiX4,38
82
+ certora_cli_beta_mirror-8.6.3.dist-info/RECORD,,
Binary file
@@ -1 +1 @@
1
- {"name": "certora-cli-beta-mirror", "tag": "8.6.1", "branch": "", "commit": "6c493e0", "timestamp": "20251203.9.56.869179", "version": "8.6.1"}
1
+ {"name": "certora-cli-beta-mirror", "tag": "8.6.3", "branch": "", "commit": "c4459c1", "timestamp": "20251218.13.53.990761", "version": "8.6.3"}
Binary file