certora-cli-alpha-master 20250605.8.34.698591__py3-none-any.whl → 20250605.17.15.659237__py3-none-any.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.
@@ -42,6 +42,12 @@ def get_relevant_compiler(contract_file_path: Path, context: CertoraContext) ->
42
42
 
43
43
  if contract_file_path.is_absolute():
44
44
  contract_file_path = Path(os.path.relpath(contract_file_path, Path.cwd()))
45
+
46
+ # If the contract file is in the sources directory, we want to use the relative path from the "cwd" in the source tree.
47
+ if Util.get_certora_sources_dir() in contract_file_path.parents:
48
+ cwd_in_source = Util.get_certora_sources_dir() / context.cwd_rel_in_sources
49
+ contract_file_path = Path(os.path.relpath(contract_file_path, cwd_in_source))
50
+
45
51
  if context.compiler_map:
46
52
  match = match_path_to_mapping_key(contract_file_path, context.compiler_map)
47
53
  if match:
@@ -17,6 +17,7 @@ import json5
17
17
  import logging
18
18
  from pathlib import Path
19
19
  from typing import Dict, Any
20
+ from collections import OrderedDict
20
21
 
21
22
  import CertoraProver.certoraContext as Ctx
22
23
  import CertoraProver.certoraContextAttributes as Attrs
@@ -75,7 +76,7 @@ def read_from_conf_file(context: CertoraContext) -> None:
75
76
 
76
77
  try:
77
78
  with conf_file_path.open() as conf_file:
78
- context.conf_file_attr = json5.load(conf_file, allow_duplicate_keys=False)
79
+ context.conf_file_attr = json5.load(conf_file, allow_duplicate_keys=False, object_pairs_hook=OrderedDict)
79
80
  try:
80
81
  check_conf_content(context)
81
82
  except Util.CertoraUserInputError as e:
@@ -340,7 +340,7 @@ class EvmAttributes(AttrUtil.Attributes):
340
340
  default_desc="do not set via_ir during compilation unless solc_via_ir is set",
341
341
  argparse_args={
342
342
  'action': AttrUtil.UniqueStore,
343
- 'type': lambda value: Vf.parse_dict('solc_via_ir_map', value, bool)
343
+ 'type': lambda value: Vf.parse_ordered_dict('solc_via_ir_map', value, bool)
344
344
  },
345
345
  affects_build_cache_key=True,
346
346
  disables_build_cache=False,
@@ -382,7 +382,7 @@ class EvmAttributes(AttrUtil.Attributes):
382
382
  default_desc="Uses the same Solidity EVM version for all contracts",
383
383
  argparse_args={
384
384
  'action': AttrUtil.UniqueStore,
385
- 'type': lambda value: Vf.parse_dict('solc_evm_version_map', value)
385
+ 'type': lambda value: Vf.parse_ordered_dict('solc_evm_version_map', value)
386
386
  },
387
387
  affects_build_cache_key=True,
388
388
  disables_build_cache=False,
@@ -405,7 +405,7 @@ class EvmAttributes(AttrUtil.Attributes):
405
405
  default_desc="Uses the same Solidity compiler version for all contracts",
406
406
  argparse_args={
407
407
  'action': AttrUtil.UniqueStore,
408
- 'type': lambda value: Vf.parse_dict('solc_map', value)
408
+ 'type': lambda value: Vf.parse_ordered_dict('solc_map', value)
409
409
  },
410
410
  affects_build_cache_key=True,
411
411
  disables_build_cache=False,
@@ -428,7 +428,7 @@ class EvmAttributes(AttrUtil.Attributes):
428
428
  default_desc="Uses the same compiler version for all contracts",
429
429
  argparse_args={
430
430
  'action': AttrUtil.UniqueStore,
431
- 'type': lambda value: Vf.parse_dict('compiler_map', value)
431
+ 'type': lambda value: Vf.parse_ordered_dict('compiler_map', value)
432
432
  },
433
433
  affects_build_cache_key=True,
434
434
  disables_build_cache=False,
@@ -481,7 +481,7 @@ class EvmAttributes(AttrUtil.Attributes):
481
481
  default_desc="Compiles all contracts with the same optimization settings",
482
482
  argparse_args={
483
483
  'action': AttrUtil.UniqueStore,
484
- 'type': lambda value: Vf.parse_dict('solc_optimize_map', value)
484
+ 'type': lambda value: Vf.parse_ordered_dict('solc_optimize_map', value)
485
485
  },
486
486
  affects_build_cache_key=True,
487
487
  disables_build_cache=False,
@@ -19,9 +19,8 @@ import re
19
19
  import sys
20
20
  import itertools
21
21
  import tempfile
22
- import fnmatch
23
22
  from pathlib import Path
24
- from typing import Dict, List, Tuple, Set, Any, Union, Optional
23
+ from typing import Dict, List, Tuple, Set, Any, Union, OrderedDict
25
24
 
26
25
  import CertoraProver.certoraContext as Ctx
27
26
  import CertoraProver.certoraContextAttributes as Attrs
@@ -31,6 +30,7 @@ from Shared import certoraUtils as Util
31
30
  from Shared import certoraAttrUtil as AttrUtil
32
31
  from CertoraProver.certoraProjectScanner import scan_project
33
32
 
33
+
34
34
  scripts_dir_path = Path(__file__).parent.resolve() # containing directory
35
35
  sys.path.insert(0, str(scripts_dir_path))
36
36
 
@@ -375,19 +375,15 @@ def convert_to_compiler_map(context: CertoraContext) -> None:
375
375
  if context.solc_map:
376
376
  context.compiler_map = context.solc_map
377
377
  context.solc_map = None
378
- if context.solc:
379
- context.compiler_map = {'*.sol': f'{context.solc}'}
380
- if context.vyper:
381
- context.compiler_map = {'*.vy': f'{context.vyper}'}
378
+
382
379
 
383
380
  def check_vyper_flag(context: CertoraContext) -> None:
384
381
  if context.vyper:
385
- non_vy_paths = [path for path in context.files if not path.endswith(".vy")]
386
- if non_vy_paths:
387
- raise Util.CertoraUserInputError(f"vyper attribute can only be set for Vyper files: {non_vy_paths}")
382
+ vy_paths = [path for path in context.files if path.endswith(".vy")]
383
+ if not vy_paths:
384
+ validation_logger.warning("vyper attribute was set but no Vyper files were set")
388
385
  if context.solc:
389
386
  raise Util.CertoraUserInputError("cannot set both vyper attribute and solc attribute")
390
- context.solc = context.vyper
391
387
 
392
388
  def check_contract_name_arg_inputs(context: CertoraContext) -> None:
393
389
  """
@@ -671,37 +667,6 @@ def check_mode_of_operation(context: CertoraContext) -> None:
671
667
  raise Util.CertoraUserInputError("You must use 'verify' when running the Certora Prover")
672
668
 
673
669
 
674
- def _normalize_maps(context: CertoraContext, map_attr_name: str, map_attr: Dict) -> Dict[str, str]:
675
- """
676
-
677
- :param context:
678
- :param map_attr_name: name of the attribute e.g. solc_optimize_map
679
- :param map_attr: the value of the map attribute, a dictionary mapping contract/file to a value
680
- :return:
681
-
682
- all solc_XXX_map attributes are used to set attributes for the Solidity compiler. The value is based on the
683
- Solidity file to be compiled, therefore it translates all keys to a relative path to a file
684
- """
685
-
686
- def find_matching_files(context: CertoraContext, pattern: str) -> List[str]:
687
- file_part = pattern.split(':')[0]
688
- if Path(file_part).suffix == "": # no suffix means the key is a contract
689
- matching_contracts = fnmatch.filter(context.contracts, pattern) # find matching contracts
690
- return [context.contract_to_file[contract] for contract in matching_contracts]
691
- else:
692
- return [file_part]
693
-
694
- new_map_attr: Dict[str, str] = {}
695
- for (pattern, value) in map_attr.copy().items():
696
- matching_files = find_matching_files(context, pattern)
697
- for file in matching_files:
698
- file = str(Path(file).resolve(strict=False).relative_to(Path.cwd()))
699
- attr_value = new_map_attr.get(file)
700
- if attr_value is None: # key in file paths but no mapping yet
701
- new_map_attr[file] = value
702
- return new_map_attr
703
-
704
-
705
670
  def check_map_attributes(context: CertoraContext) -> None:
706
671
 
707
672
  map_attrs = Attrs.EvmAttributes.all_map_attrs()
@@ -718,27 +683,36 @@ def check_map_attributes(context: CertoraContext) -> None:
718
683
  # we also check the map value was not set to False explicitly in the conf file
719
684
  if base_attr and map_attr and not (base_attr is False and context.conf_options.get(base_attr) is not None):
720
685
  raise Util.CertoraUserInputError(f"You cannot use both '{attr_prefix}' and '{map_attr_name}' arguments")
721
- if not isinstance(map_attr, dict):
722
- raise RuntimeError(f"map_attr is not dictionary, got {map_attr}")
723
- map_attr = _normalize_maps(context, map_attr_name, map_attr)
724
- setattr(context, f"{map_attr_name}", map_attr)
725
-
726
- sources_mappings: Dict[str, Optional[str]] = {file_path: None for file_path in context.file_paths} # initially mapping files to None
727
- for file in sources_mappings.keys():
728
- match: Optional[str] = None
729
- for (pattern, value) in map_attr.items():
730
- if fnmatch.fnmatch(file, pattern):
731
- match = pattern
732
- break
733
- if not match:
734
- raise Util.CertoraUserInputError(f"No matching for {file} in {map_attr_name}. Pattens: {map_attr}")
735
- elif not sources_mappings.get(file): # key in file paths but no mapping yet
736
- sources_mappings[file] = match
737
-
738
- # Now we check if all sources were mapped
739
- paths_not_set = [path for path, value in sources_mappings.items() if value is None]
740
- if paths_not_set:
741
- raise Util.CertoraUserInputError(f"{' '.join(paths_not_set)} was not set in {map_attr_name}")
686
+ if not isinstance(map_attr, OrderedDict):
687
+ raise RuntimeError(f"`map_attr` is not an ordered dictionary, got {map_attr}")
688
+
689
+ # handle contracts
690
+ # creating a copy since we cannot modify the OrderedDict while iterating over it
691
+ new_map_attr = map_attr.copy()
692
+
693
+ for key, value in map_attr.items():
694
+ key_parts = key.split(':')
695
+ if Path(key_parts[0]).suffix == "" and key_parts[0] in context.contract_to_file:
696
+ # key is a contract in a known file
697
+ contract_key = key_parts[0]
698
+ contract_file = context.contract_to_file[contract_key]
699
+ if contract_file in map_attr:
700
+ if map_attr[contract_file] != value:
701
+ # contract binding conflicts with an existing binding
702
+ raise Util.CertoraUserInputError(f"mapping of `{key}` to `{value}` in `{map_attr_name}` conflicts"
703
+ f" with an existing binding of `{contract_file}` to"
704
+ f" `{map_attr[contract_file]}`")
705
+ else:
706
+ # no binding for the contract file, so we add it to the attribute
707
+ new_map_attr[contract_file] = value
708
+ # move to head
709
+ new_map_attr.move_to_end(contract_file, last=False)
710
+ setattr(context, map_attr_name, new_map_attr)
711
+
712
+ for path in context.file_paths:
713
+ match = Util.match_path_to_mapping_key(Path(path), new_map_attr)
714
+ if match is None:
715
+ raise RuntimeError(f'cannot match compiler to {path} from {map_attr_name}')
742
716
 
743
717
 
744
718
  def check_parametric_contracts(context: CertoraContext) -> None:
@@ -14,7 +14,6 @@
14
14
  # along with this program. If not, see <https://www.gnu.org/licenses/>.
15
15
 
16
16
  import csv
17
- import fnmatch
18
17
  import json
19
18
  import os
20
19
  import subprocess
@@ -31,7 +30,7 @@ import urllib3.util
31
30
  from collections import defaultdict
32
31
  from types import SimpleNamespace
33
32
 
34
- from typing import Any, Callable, Dict, List, Optional, Set, Union, Generator, Tuple, Iterable, Sequence, TypeVar
33
+ from typing import Any, Callable, Dict, List, Optional, Set, Union, Generator, Tuple, Iterable, Sequence, TypeVar, OrderedDict
35
34
  from pathlib import Path
36
35
 
37
36
  scripts_dir_path = Path(__file__).parent.parent.resolve() # containing directory
@@ -1176,20 +1175,30 @@ class AbstractAndSingleton(Singleton, ABCMeta):
1176
1175
  pass
1177
1176
 
1178
1177
 
1179
- def match_path_to_mapping_key(path: Path, m: Dict[str, str]) -> Optional[str]:
1178
+ def match_path_to_mapping_key(path: Path, m: OrderedDict[str, str]) -> Optional[str]:
1180
1179
  """
1181
- Matches the path to the best match in the dictionary's keys.
1182
- For example, given an absolute path `/Users/JohnDoe/Path/ToSolc/a.sol`, if the map contains
1183
- `b/a.sol` and `ToSolc/a.sol`, it will match on `ToSolc/a.sol`.
1180
+ Matches the path to the first key in the map that matches the path.
1181
+ paths may include wildcards
1182
+
1183
+ For example, if the ordered dictionary in compiler_map has the mapping:
1184
+
1185
+ dir/a.sol -> solc7.1
1186
+ dir/*.sol -> solc6.3
1187
+ **/*.sol -> 8.10
1188
+
1189
+ dir/a.sol will be matched by the first rule
1190
+ dir/b.sol by the second rule
1191
+ and
1192
+ a.sol by the third rule
1193
+
1184
1194
  @param path: the path to match against
1185
1195
  @param m: the map whose keys we're searching
1186
1196
  @return: the value from the map that best matches the path, None if not found.
1187
1197
  """
1188
1198
  for k, v in m.items():
1189
- if fnmatch.fnmatch(str(path), k):
1199
+ if match_pattern_to_source(k, path):
1190
1200
  return v
1191
- return None
1192
-
1201
+ return None # No match
1193
1202
 
1194
1203
  def find_in(dir_path: Path, file_to_find: Path) -> Optional[Path]:
1195
1204
  """
@@ -1452,3 +1461,31 @@ def eq_by(f: Callable[[T, T], bool], a: Sequence[T], b: Sequence[T]) -> bool:
1452
1461
  check if Sequences a and b are equal according to function f.
1453
1462
  """
1454
1463
  return len(a) == len(b) and all(map(f, a, b))
1464
+
1465
+ def file_in_source_tree(file_path: Path) -> bool:
1466
+ # if the file is under .certora_source, return True
1467
+ file_path = Path(file_path).absolute()
1468
+ parent_dir = get_certora_sources_dir().absolute()
1469
+
1470
+ try:
1471
+ file_path.relative_to(parent_dir)
1472
+ return True
1473
+ except ValueError:
1474
+ return False
1475
+
1476
+ def match_pattern_to_source(pattern: str, file_path: Path) -> bool:
1477
+
1478
+ if file_in_source_tree(file_path):
1479
+ base_dir = get_certora_sources_dir()
1480
+ else:
1481
+ base_dir = Path.cwd()
1482
+
1483
+ # Search for matches under base_dir
1484
+ for candidate in base_dir.rglob(pattern):
1485
+ try:
1486
+ if os.path.samefile(candidate, file_path):
1487
+ return True
1488
+ except FileNotFoundError:
1489
+ # candidate or file_path may not exist; skip safely
1490
+ continue
1491
+ return False
@@ -18,6 +18,8 @@ import sys
18
18
  import argparse
19
19
  import json
20
20
  import logging
21
+ from collections import OrderedDict
22
+
21
23
  import json5
22
24
  import re
23
25
  import urllib3.util
@@ -938,7 +940,7 @@ def validate_on_off(value: str) -> str:
938
940
  return __validate_enum_value(value, OnOffValue)
939
941
 
940
942
 
941
- def parse_dict(conf_key: str, input_string: str, value_type: Type = str) -> Dict[str, Union[str, bool]]:
943
+ def parse_ordered_dict(conf_key: str, input_string: str, value_type: Type = str) -> OrderedDict[str, Union[str, bool]]:
942
944
  """
943
945
  convert CLI flag value string of the form <key>=<value>,<key>=<value>,.. to a Dict.
944
946
  Keys with different values raise an exception
@@ -971,7 +973,7 @@ def parse_dict(conf_key: str, input_string: str, value_type: Type = str) -> Dict
971
973
  raise argparse.ArgumentTypeError(f"{conf_key} argument {input_string} is of wrong format. Must be of format:"
972
974
  f"<key>=<value>[,..]")
973
975
 
974
- return_dict = {} # type: Dict[str, Union[str, bool]]
976
+ return_dict = OrderedDict() # type: OrderedDict[str, Union[str, bool]]
975
977
 
976
978
  for match in input_string.split(','):
977
979
  key, value = match.split('=')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-alpha-master
3
- Version: 20250605.8.34.698591
3
+ Version: 20250605.17.15.659237
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-alpha-master
6
6
  Author: Certora
@@ -37,4 +37,4 @@ Dynamic: requires-dist
37
37
  Dynamic: requires-python
38
38
  Dynamic: summary
39
39
 
40
- Commit 184993b. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
40
+ Commit 74570f3. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -17,11 +17,11 @@ certora_cli/CertoraProver/certoraCloudIO.py,sha256=oYhNAcyhQa97_5OrpFsewcD6sksoK
17
17
  certora_cli/CertoraProver/certoraCollectConfigurationLayout.py,sha256=waMo5_nzirDaK7aoPCfoS7jOqqi_6huRc-_jTrDcZO8,14252
18
18
  certora_cli/CertoraProver/certoraCollectRunMetadata.py,sha256=n67E7hjVdPlBXMh1FMzcWSgu3v5SfFM_HOO2JpbCeY0,11787
19
19
  certora_cli/CertoraProver/certoraCompilerParameters.py,sha256=r35y03IRwWIoz1GCNC7PuW3n8JPz9J1NGwhwUYKdYtI,1452
20
- certora_cli/CertoraProver/certoraConfigIO.py,sha256=H3ebbIBO8xXTf8ArBPnZV1TmDBExQVDF2zc9Yu1v0Xo,7493
20
+ certora_cli/CertoraProver/certoraConfigIO.py,sha256=uq-uNnjVBzg9Kh41fDqn-lnwSJXe4k2_iy5GTnQIDa8,7560
21
21
  certora_cli/CertoraProver/certoraContext.py,sha256=0AihMYuUAGHWjbiSOMiDM6FVW5OyvEAxE51GPnMxSKg,25821
22
- certora_cli/CertoraProver/certoraContextAttributes.py,sha256=-YHYvHmWr7RmIAT3eZ5wAxZDWY2nYkylxViFFnyhqPs,69066
22
+ certora_cli/CertoraProver/certoraContextAttributes.py,sha256=tc5ieED4H1TaCG4FfEJmdx9b7NDyJzC3qlGfUbIFetg,69106
23
23
  certora_cli/CertoraProver/certoraContextClass.py,sha256=d7HDqM72K7YnswR7kEcAHGwkFNrTqRz5-_0m7cl2Mso,900
24
- certora_cli/CertoraProver/certoraContextValidator.py,sha256=iSB2byuHmi1G4xG-ViVvBrZv7e1mdxPmlWdV3AaN_l4,46492
24
+ certora_cli/CertoraProver/certoraContextValidator.py,sha256=A7blCXdJTnxTh5x1w1fADinWtRUPJoAZC3bfPj3W3Hs,45333
25
25
  certora_cli/CertoraProver/certoraContractFuncs.py,sha256=ipSwge5QQzp8qhUavY44bZ-eCR6szK_HWwSIWqQyuR0,6921
26
26
  certora_cli/CertoraProver/certoraExtensionInfo.py,sha256=YlShzdoqJQgXXj3r0TJ3fir1KntIR99Rk8JN5qii2lk,2026
27
27
  certora_cli/CertoraProver/certoraJobList.py,sha256=FBIYgJ60I0Ok7vchfTbcuJJbiXgnfAhrONoVeZoHti4,11464
@@ -36,7 +36,7 @@ certora_cli/CertoraProver/erc7201.py,sha256=BME5kBZsDx6lgqLn7EE91I1cEOZtsnZ8BlRV
36
36
  certora_cli/CertoraProver/splitRules.py,sha256=HfSqsKeeLZDeOnv8TGgpPDHoaXgdVc0HOrLcGk-cU1Q,7681
37
37
  certora_cli/CertoraProver/storageExtension.py,sha256=BZC9HJygeLxqS5TmhNxbIrVNfH3kLEPjN1VjsWQi8s8,15922
38
38
  certora_cli/CertoraProver/Compiler/CompilerCollector.py,sha256=cr-PIl7LY9VfNs4s4H3-EnSnomPiCgXudfwP9-KenMk,6740
39
- certora_cli/CertoraProver/Compiler/CompilerCollectorFactory.py,sha256=L-LAH0UU7gB7wYvCcXrwdtLGpBI8MX3rPts0ufQ-X9s,8157
39
+ certora_cli/CertoraProver/Compiler/CompilerCollectorFactory.py,sha256=seZwusxZNGicOaL0Qjp_uqhwdRIsKKfIhD_4bEA2KhA,8522
40
40
  certora_cli/CertoraProver/Compiler/CompilerCollectorSol.py,sha256=7nAY2FLMUlGJn4f_YoZMqpa3rf7THqhJVjLwTaChcBc,5027
41
41
  certora_cli/CertoraProver/Compiler/CompilerCollectorSolBased.py,sha256=UasYWyu8Of6R84vXsqRNGpscYcFQghmSIY_dyaAWDYA,1350
42
42
  certora_cli/CertoraProver/Compiler/CompilerCollectorVy.py,sha256=e95xOHK5Bz8BbzjbCVLCrGSutVs8ejqOImh5wH9o3Jk,69918
@@ -60,16 +60,16 @@ certora_cli/Shared/ExpectedComparator.py,sha256=eyRR-jni4WJoa6j2TK2lnZ89Tyb8U99w
60
60
  certora_cli/Shared/__init__.py,sha256=s0dhvolFtsS4sRNzPVhC_rlw8mm194rCZ0WhOxInY40,1025
61
61
  certora_cli/Shared/certoraAttrUtil.py,sha256=ZsoS6xbSZnAjEoPEcfiJi6CvHU-1ySBKubvVKh78ohs,8373
62
62
  certora_cli/Shared/certoraLogging.py,sha256=cV2UQMhQ5j8crGXgeq9CEamI-Lk4HgdiA3HCrP-kSR4,14013
63
- certora_cli/Shared/certoraUtils.py,sha256=fWb0-zZMCT_lRvhaPhf8GeXUySW6I0enChv1aOYhoOY,55185
64
- certora_cli/Shared/certoraValidateFuncs.py,sha256=WG4UiyES8u49o3XmuRIvNf79rcpWFuCKtV__QUptOEQ,41852
63
+ certora_cli/Shared/certoraUtils.py,sha256=hYRupYu8ajlFr1dGboxmJpPMY1rqBVDlWiD8_MhYB4Q,56181
64
+ certora_cli/Shared/certoraValidateFuncs.py,sha256=EGoCGTtGMRzWdN-T5GducwkYbyqZBcSjQZHpau0fWnQ,41922
65
65
  certora_cli/Shared/proverCommon.py,sha256=-Lw6_zEIlPA7i_n6xOUsmJeUKjqYWAnGW9GKWBB_GC0,11171
66
66
  certora_cli/Shared/rustProverCommon.py,sha256=NIZ5ECbhuiMegyRAl07CV3r68MFG2tBNKgUAQoV4uLI,2049
67
- certora_jars/CERTORA-CLI-VERSION-METADATA.json,sha256=McDT7MZ-f-v7J6-9e5-7FOAk3rHol_AezBEfZGTLuuE,168
68
- certora_jars/Typechecker.jar,sha256=Vxf6og3pHEWwLE8CKhO1KJn3dUeQnHkTyle0sHSeMZg,17139336
67
+ certora_jars/CERTORA-CLI-VERSION-METADATA.json,sha256=Ce-3jxCrPWyzAFCj1xGexrKQ7b2du6WoMQW_uwvjYg0,170
68
+ certora_jars/Typechecker.jar,sha256=oq53jnImLTWl_zY8n2UY8SUInBumIUCClLa9LLlCzV4,17139336
69
69
  certora_jars/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
- certora_cli_alpha_master-20250605.8.34.698591.dist-info/LICENSE,sha256=UGKSKIJSetF8m906JLKqNLkUS2CL60XfQdNvxBvpQXo,620
71
- certora_cli_alpha_master-20250605.8.34.698591.dist-info/METADATA,sha256=hkHC9_OwBOfmDnIl38hia_Mcscl_zT__NSXUeJbMb7w,1247
72
- certora_cli_alpha_master-20250605.8.34.698591.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
73
- certora_cli_alpha_master-20250605.8.34.698591.dist-info/entry_points.txt,sha256=_SQ5_uYOAJXtqEW992nIvq7blW9cWFSUVEdbMGuy--4,443
74
- certora_cli_alpha_master-20250605.8.34.698591.dist-info/top_level.txt,sha256=8C77w3JLanY0-NW45vpJsjRssyCqVP-qmPiN9FjWiX4,38
75
- certora_cli_alpha_master-20250605.8.34.698591.dist-info/RECORD,,
70
+ certora_cli_alpha_master-20250605.17.15.659237.dist-info/LICENSE,sha256=UGKSKIJSetF8m906JLKqNLkUS2CL60XfQdNvxBvpQXo,620
71
+ certora_cli_alpha_master-20250605.17.15.659237.dist-info/METADATA,sha256=5oozF1HiqqiBWa5Eaw7aZhS1rHK5cdB2V74lBqknW8w,1248
72
+ certora_cli_alpha_master-20250605.17.15.659237.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
73
+ certora_cli_alpha_master-20250605.17.15.659237.dist-info/entry_points.txt,sha256=_SQ5_uYOAJXtqEW992nIvq7blW9cWFSUVEdbMGuy--4,443
74
+ certora_cli_alpha_master-20250605.17.15.659237.dist-info/top_level.txt,sha256=8C77w3JLanY0-NW45vpJsjRssyCqVP-qmPiN9FjWiX4,38
75
+ certora_cli_alpha_master-20250605.17.15.659237.dist-info/RECORD,,
@@ -1 +1 @@
1
- {"name": "certora-cli-alpha-master", "tag": "", "branch": "master", "commit": "184993b", "timestamp": "20250605.8.34.698591", "version": "20250605.8.34.698591+184993b"}
1
+ {"name": "certora-cli-alpha-master", "tag": "", "branch": "master", "commit": "74570f3", "timestamp": "20250605.17.15.659237", "version": "20250605.17.15.659237+74570f3"}
Binary file