@@ -37,12 +37,15 @@ mod types;
37
37
pub use settings:: { ZkSettings , ZkSolcSettings } ;
38
38
pub use types:: { ErrorType , WarningType } ;
39
39
40
- /// ZKsync solc release used for all ZKsync solc versions
41
- pub const ZKSYNC_SOLC_RELEASE : Version = Version :: new ( 1 , 0 , 1 ) ;
40
+ /// ZKsync solc revisions used for all ZKsync solc versions
41
+ pub const ZKSYNC_SOLC_REVISIONS : [ Version ; 2 ] = [ Version :: new ( 1 , 0 , 1 ) , Version :: new ( 1 , 0 , 2 ) ] ;
42
42
43
43
/// Get zksolc versions that are specifically not supported
44
44
pub const ZKSOLC_UNSUPPORTED_VERSIONS : [ Version ; 1 ] = [ Version :: new ( 1 , 5 , 9 ) ] ;
45
45
46
+ /// The first zksolc version where CBOR-encoded metadata is supported
47
+ pub const ZKSOLC_FIRST_VERSION_SUPPORTS_CBOR : Version = Version :: new ( 1 , 5 , 13 ) ;
48
+
46
49
#[ cfg( test) ]
47
50
macro_rules! take_solc_installer_lock {
48
51
( $lock: ident) => {
@@ -214,14 +217,23 @@ impl ZkSolcCompiler {
214
217
"{}.{}.{}" ,
215
218
input. solc_version. major, input. solc_version. minor, input. solc_version. patch
216
219
) ;
217
- let maybe_solc =
218
- ZkSolc :: find_solc_installed_version ( & solc_version_without_metadata) ?;
220
+ let solc_revision = if input. zksolc_version >= ZKSOLC_FIRST_VERSION_SUPPORTS_CBOR {
221
+ & ZKSYNC_SOLC_REVISIONS [ 1 ]
222
+ } else {
223
+ & ZKSYNC_SOLC_REVISIONS [ 0 ]
224
+ } ;
225
+ let maybe_solc = ZkSolc :: find_solc_installed_version (
226
+ & solc_version_without_metadata,
227
+ & solc_revision. to_string ( ) ,
228
+ ) ?;
219
229
if let Some ( solc) = maybe_solc {
220
230
Some ( solc)
221
231
} else {
222
232
{
223
- let installed_solc_path =
224
- ZkSolc :: solc_blocking_install ( & solc_version_without_metadata) ?;
233
+ let installed_solc_path = ZkSolc :: solc_blocking_install (
234
+ & solc_version_without_metadata,
235
+ & solc_revision. to_string ( ) ,
236
+ ) ?;
225
237
Some ( installed_solc_path)
226
238
}
227
239
}
@@ -241,9 +253,9 @@ impl ZkSolcCompiler {
241
253
/// Version metadata. Will include `zksync_version` if compiler is zksync solc.
242
254
#[ derive( Debug , Clone , Eq , PartialEq , PartialOrd , Ord , Serialize , Deserialize ) ]
243
255
pub struct SolcVersionInfo {
244
- /// The solc compiler version (e.g: 0.8.20 )
256
+ /// The solc compiler version (e.g: 0.8.30 )
245
257
pub version : Version ,
246
- /// The full zksync solc compiler version (e.g: 0.8.20 -1.0.1 )
258
+ /// The full zksync solc compiler version (e.g: 0.8.30 -1.0.2 )
247
259
pub zksync_version : Option < Version > ,
248
260
}
249
261
@@ -395,7 +407,9 @@ impl ZkSolc {
395
407
. filter_map ( std:: result:: Result :: ok)
396
408
. filter ( |e| e. file_type ( ) . is_file ( ) )
397
409
. filter_map ( |e| e. file_name ( ) . to_str ( ) . map ( |s| s. to_string ( ) ) )
398
- . filter ( |e| e. ends_with ( & ZKSYNC_SOLC_RELEASE . to_string ( ) ) )
410
+ . filter ( |e| {
411
+ ZKSYNC_SOLC_REVISIONS . iter ( ) . any ( |v| e. ends_with ( v. to_string ( ) . as_str ( ) ) )
412
+ } )
399
413
. filter_map ( |e| {
400
414
e. strip_prefix ( solc_prefix)
401
415
. and_then ( |s| s. split ( '-' ) . next ( ) )
@@ -412,7 +426,7 @@ impl ZkSolc {
412
426
/// Get supported zksolc versions
413
427
pub fn zksolc_supported_versions ( ) -> Vec < Version > {
414
428
let mut ret = vec ! [ ] ;
415
- let version_ranges = vec ! [ ( 1 , 5 , 6 ..=12 ) ] ;
429
+ let version_ranges = vec ! [ ( 1 , 5 , 6 ..=15 ) ] ;
416
430
417
431
for ( major, minor, patch_range) in version_ranges {
418
432
for patch in patch_range {
@@ -440,7 +454,7 @@ impl ZkSolc {
440
454
pub fn solc_available_versions ( ) -> Vec < Version > {
441
455
let mut ret = vec ! [ ] ;
442
456
let version_ranges =
443
- vec ! [ ( 0 , 4 , 12 ..=26 ) , ( 0 , 5 , 0 ..=17 ) , ( 0 , 6 , 0 ..=12 ) , ( 0 , 7 , 0 ..=6 ) , ( 0 , 8 , 0 ..=29 ) ] ;
457
+ vec ! [ ( 0 , 4 , 12 ..=26 ) , ( 0 , 5 , 0 ..=17 ) , ( 0 , 6 , 0 ..=12 ) , ( 0 , 7 , 0 ..=6 ) , ( 0 , 8 , 0 ..=30 ) ] ;
444
458
for ( major, minor, patch_range) in version_ranges {
445
459
for patch in patch_range {
446
460
ret. push ( Version :: new ( major, minor, patch) ) ;
@@ -508,14 +522,10 @@ impl ZkSolc {
508
522
Ok ( Self :: compilers_dir ( ) ?. join ( format ! ( "{}v{}" , os. get_zksolc_prefix( ) , version) ) )
509
523
}
510
524
511
- fn solc_path ( version_str : & str ) -> Result < PathBuf > {
525
+ fn solc_path ( version_str : & str , revision_str : & str ) -> Result < PathBuf > {
512
526
let os = get_operating_system ( ) ?;
513
- Ok ( Self :: compilers_dir ( ) ?. join ( format ! (
514
- "{}{}-{}" ,
515
- os. get_solc_prefix( ) ,
516
- version_str,
517
- ZKSYNC_SOLC_RELEASE
518
- ) ) )
527
+ Ok ( Self :: compilers_dir ( ) ?
528
+ . join ( format ! ( "{}{version_str}-{revision_str}" , os. get_solc_prefix( ) , ) ) )
519
529
}
520
530
521
531
/// Install zksolc version and block the thread
@@ -560,19 +570,19 @@ impl ZkSolc {
560
570
}
561
571
562
572
/// Install zksync solc version and block the thread
563
- pub fn solc_blocking_install ( version_str : & str ) -> Result < PathBuf > {
573
+ pub fn solc_blocking_install ( version_str : & str , revision_str : & str ) -> Result < PathBuf > {
564
574
let os = get_operating_system ( ) ?;
565
575
let solc_os_namespace = os. get_solc_prefix ( ) ;
566
576
let download_url = format ! (
567
- "https://github.com/matter-labs/era-solidity/releases/download/{version_str}-{ZKSYNC_SOLC_RELEASE }/{solc_os_namespace}{version_str}-{ZKSYNC_SOLC_RELEASE }" ,
577
+ "https://github.com/matter-labs/era-solidity/releases/download/{version_str}-{revision_str }/{solc_os_namespace}{version_str}-{revision_str }" ,
568
578
) ;
569
579
570
580
let compilers_dir = Self :: compilers_dir ( ) ?;
571
581
if !compilers_dir. exists ( ) {
572
582
create_dir_all ( compilers_dir)
573
583
. map_err ( |e| SolcError :: msg ( format ! ( "Could not create compilers path: {e}" ) ) ) ?;
574
584
}
575
- let solc_path = Self :: solc_path ( version_str) ?;
585
+ let solc_path = Self :: solc_path ( version_str, revision_str ) ?;
576
586
let lock_path = lock_file_path ( "solc" , version_str) ;
577
587
578
588
let label = format ! ( "solc-{version_str}" ) ;
@@ -590,8 +600,11 @@ impl ZkSolc {
590
600
}
591
601
592
602
/// Get path for installed ZKsync solc version. Returns `Ok(None)` if not installed
593
- pub fn find_solc_installed_version ( version_str : & str ) -> Result < Option < PathBuf > > {
594
- let solc = Self :: solc_path ( version_str) ?;
603
+ pub fn find_solc_installed_version (
604
+ version_str : & str ,
605
+ revision_str : & str ,
606
+ ) -> Result < Option < PathBuf > > {
607
+ let solc = Self :: solc_path ( version_str, revision_str) ?;
595
608
596
609
if !solc. is_file ( ) {
597
610
return Ok ( None ) ;
@@ -768,14 +781,16 @@ mod tests {
768
781
fn zksolc ( ) -> ZkSolc {
769
782
let zksolc_path =
770
783
ZkSolc :: get_path_for_version ( & ZkSolc :: zksolc_latest_supported_version ( ) ) . unwrap ( ) ;
771
- let solc_version = "0.8.27" ;
784
+ let solc_version = "0.8.30" ;
785
+ let solc_revision = ZKSYNC_SOLC_REVISIONS . last ( ) . unwrap ( ) . to_string ( ) ;
772
786
773
787
take_solc_installer_lock ! ( _lock) ;
774
- let maybe_solc = ZkSolc :: find_solc_installed_version ( solc_version) . unwrap ( ) ;
788
+ let maybe_solc =
789
+ ZkSolc :: find_solc_installed_version ( solc_version, solc_revision. as_str ( ) ) . unwrap ( ) ;
775
790
let solc_path = if let Some ( solc) = maybe_solc {
776
791
solc
777
792
} else {
778
- ZkSolc :: solc_blocking_install ( solc_version) . unwrap ( )
793
+ ZkSolc :: solc_blocking_install ( solc_version, solc_revision . as_str ( ) ) . unwrap ( )
779
794
} ;
780
795
ZkSolc :: new ( zksolc_path, Some ( solc_path) ) . unwrap ( )
781
796
}
@@ -801,7 +816,7 @@ mod tests {
801
816
let zksync_v = solc_v. zksync_version . unwrap ( ) ;
802
817
let prerelease = Version :: parse ( zksync_v. pre . as_str ( ) ) . unwrap ( ) ;
803
818
assert_eq ! ( solc_v. version. minor, 8 ) ;
804
- assert_eq ! ( prerelease, ZKSYNC_SOLC_RELEASE ) ;
819
+ assert ! ( ZKSYNC_SOLC_REVISIONS . contains ( & prerelease) ) ;
805
820
}
806
821
807
822
#[ test]
0 commit comments