From 7f58345dadf9b3f089ce56d6561b51daa4e0fcc9 Mon Sep 17 00:00:00 2001 From: Ryo Onodera Date: Mon, 13 Mar 2023 14:28:34 +0900 Subject: [PATCH] ci: test-checks.sh all sbf code & use nightly only (#30602) --- ci/test-checks.sh | 11 +++++------ programs/sbf/Cargo.toml | 4 ++++ programs/sbf/benches/bpf_loader.rs | 2 ++ programs/sbf/build.rs | 5 +++++ programs/sbf/rust/128bit/src/lib.rs | 2 ++ programs/sbf/rust/128bit_dep/src/lib.rs | 2 ++ programs/sbf/rust/alloc/src/lib.rs | 4 +++- programs/sbf/rust/custom_heap/src/lib.rs | 2 ++ programs/sbf/rust/deprecated_loader/src/lib.rs | 3 ++- programs/sbf/rust/dup_accounts/src/lib.rs | 2 ++ programs/sbf/rust/external_spend/src/lib.rs | 2 ++ .../rust/inner_instruction_alignment_check/src/lib.rs | 2 +- .../sbf/rust/instruction_introspection/src/lib.rs | 2 +- programs/sbf/rust/invoked/src/processor.rs | 1 + programs/sbf/rust/iter/src/lib.rs | 2 ++ programs/sbf/rust/many_args/src/helper.rs | 2 ++ programs/sbf/rust/many_args_dep/src/lib.rs | 2 ++ programs/sbf/rust/mem/Cargo.toml | 2 ++ programs/sbf/rust/mem/src/lib.rs | 2 +- programs/sbf/rust/mem/tests/lib.rs | 2 ++ programs/sbf/rust/panic/src/lib.rs | 2 +- programs/sbf/rust/param_passing_dep/src/lib.rs | 2 ++ programs/sbf/rust/sanity/Cargo.toml | 1 + programs/sbf/rust/sanity/src/lib.rs | 1 + programs/sbf/rust/sanity/tests/lib.rs | 2 +- programs/sbf/rust/secp256k1_recover/src/lib.rs | 2 +- .../sbf/rust/sibling_inner_instruction/src/lib.rs | 1 + programs/sbf/rust/simulation/src/lib.rs | 4 +++- programs/sbf/rust/simulation/tests/lib.rs | 2 +- programs/sbf/rust/simulation/tests/validator.rs | 2 +- programs/sbf/rust/spoof1_system/src/lib.rs | 2 ++ programs/sbf/rust/sysvar/Cargo.toml | 4 ++++ programs/sbf/rust/sysvar/tests/lib.rs | 2 ++ programs/sbf/tests/programs.rs | 9 +++++++++ version/Cargo.toml | 3 +++ 35 files changed, 78 insertions(+), 17 deletions(-) diff --git a/ci/test-checks.sh b/ci/test-checks.sh index 19094c9a38..3f9d995bb8 100755 --- a/ci/test-checks.sh +++ b/ci/test-checks.sh @@ -51,10 +51,12 @@ echo --- build environment export RUST_BACKTRACE=1 export RUSTFLAGS="-D warnings -A incomplete_features" +# run cargo check for all rust files in this monorepo for faster turnaround in +# case of any compilation/build error for nightly + # Only force up-to-date lock files on edge if [[ $CI_BASE_BRANCH = "$EDGE_CHANNEL" ]]; then - # Exclude --benches as it's not available in rust stable yet - if _ scripts/cargo-for-all-lock-files.sh check --locked --tests --bins --examples; then + if _ scripts/cargo-for-all-lock-files.sh "+${rust_nightly}" check --locked --workspace --all-targets --features dummy-for-ci-check; then true else check_status=$? @@ -63,9 +65,6 @@ if [[ $CI_BASE_BRANCH = "$EDGE_CHANNEL" ]]; then echo "$0: [tree (for outdated Cargo.lock sync)|check (for compilation error)|update -p foo --precise x.y.z (for your Cargo.toml update)] ..." >&2 exit "$check_status" fi - - # Ensure nightly and --benches - _ scripts/cargo-for-all-lock-files.sh "+${rust_nightly}" check --locked --all-targets else echo "Note: cargo-for-all-lock-files.sh skipped because $CI_BASE_BRANCH != $EDGE_CHANNEL" fi @@ -76,7 +75,7 @@ nightly_clippy_allows=() # -Z... is needed because of clippy bug: https://github.com/rust-lang/rust-clippy/issues/4612 # run nightly clippy for `sdk/` as there's a moderate amount of nightly-only code there - _ scripts/cargo-for-all-lock-files.sh -- "+${rust_nightly}" clippy -Zunstable-options --all-targets -- \ + _ scripts/cargo-for-all-lock-files.sh -- "+${rust_nightly}" clippy -Zunstable-options --workspace --all-targets --features dummy-for-ci-check -- \ --deny=warnings \ --deny=clippy::integer_arithmetic \ "${nightly_clippy_allows[@]}" diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 1d7d8b21ea..a413ef7063 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -66,6 +66,10 @@ edition = { workspace = true } [features] sbf_c = [] sbf_rust = [] +dummy-for-ci-check = [ + "sbf_c", + "sbf_rust", +] [build-dependencies] walkdir = "2" diff --git a/programs/sbf/benches/bpf_loader.rs b/programs/sbf/benches/bpf_loader.rs index 5e0a8b5f8c..f4b9753c09 100644 --- a/programs/sbf/benches/bpf_loader.rs +++ b/programs/sbf/benches/bpf_loader.rs @@ -1,5 +1,7 @@ #![feature(test)] #![cfg(feature = "sbf_c")] +#![allow(clippy::uninlined_format_args)] +#![allow(clippy::integer_arithmetic)] use {solana_rbpf::memory_region::MemoryState, std::slice}; diff --git a/programs/sbf/build.rs b/programs/sbf/build.rs index 2248920408..c6c95c9f4f 100644 --- a/programs/sbf/build.rs +++ b/programs/sbf/build.rs @@ -37,6 +37,11 @@ fn rerun_if_changed(files: &[&str], directories: &[&str], excludes: &[&str]) { } fn main() { + if env::var("CARGO_FEATURE_DUMMY_FOR_CI_CHECK").is_ok() { + println!("cargo:warning=(not a warning) Compiling with host toolchain for CI..."); + return; + } + let sbf_c = env::var("CARGO_FEATURE_SBF_C").is_ok(); if sbf_c { let install_dir = "OUT_DIR=../target/".to_string() + &env::var("PROFILE").unwrap() + "/sbf"; diff --git a/programs/sbf/rust/128bit/src/lib.rs b/programs/sbf/rust/128bit/src/lib.rs index 686df83180..de66b35034 100644 --- a/programs/sbf/rust/128bit/src/lib.rs +++ b/programs/sbf/rust/128bit/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program tests loop iteration +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; use solana_program::{custom_heap_default, custom_panic_default, entrypoint::SUCCESS}; diff --git a/programs/sbf/rust/128bit_dep/src/lib.rs b/programs/sbf/rust/128bit_dep/src/lib.rs index 9b8bbadcd0..7ed9f48a0f 100644 --- a/programs/sbf/rust/128bit_dep/src/lib.rs +++ b/programs/sbf/rust/128bit_dep/src/lib.rs @@ -1,5 +1,7 @@ //! Solana Rust-based SBF program utility functions and types +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; pub fn uadd(x: u128, y: u128) -> u128 { diff --git a/programs/sbf/rust/alloc/src/lib.rs b/programs/sbf/rust/alloc/src/lib.rs index 2cdc13bf37..356f9a82f7 100644 --- a/programs/sbf/rust/alloc/src/lib.rs +++ b/programs/sbf/rust/alloc/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program that test dynamic memory allocation +#![allow(clippy::integer_arithmetic)] + #[macro_use] extern crate alloc; use { @@ -37,7 +39,7 @@ pub extern "C" fn entrypoint(_input: *mut u8) -> u64 { *ptr.add(i) = i as u8; } for i in 0..ITERS { - assert_eq!(*ptr.add(i as usize), i as u8); + assert_eq!(*ptr.add(i), i as u8); } sol_log_64(0x3, 0, 0, 0, u64::from(*ptr.add(42))); assert_eq!(*ptr.add(42), 42); diff --git a/programs/sbf/rust/custom_heap/src/lib.rs b/programs/sbf/rust/custom_heap/src/lib.rs index 7a0deebbef..9bc4699d9e 100644 --- a/programs/sbf/rust/custom_heap/src/lib.rs +++ b/programs/sbf/rust/custom_heap/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF that tests out using a custom heap +#![allow(clippy::integer_arithmetic)] + use { solana_program::{ account_info::AccountInfo, diff --git a/programs/sbf/rust/deprecated_loader/src/lib.rs b/programs/sbf/rust/deprecated_loader/src/lib.rs index d3c73899ae..ddd81fca87 100644 --- a/programs/sbf/rust/deprecated_loader/src/lib.rs +++ b/programs/sbf/rust/deprecated_loader/src/lib.rs @@ -1,6 +1,7 @@ //! Example Rust-based SBF program that supports the deprecated loader #![allow(unreachable_code)] +#![allow(clippy::integer_arithmetic)] extern crate solana_program; use solana_program::{ @@ -23,7 +24,7 @@ fn return_sstruct() -> SStruct { #[no_mangle] fn custom_panic(info: &core::panic::PanicInfo<'_>) { // Full panic reporting - msg!(&format!("{}", info)); + msg!(&format!("{info}")); } solana_program::entrypoint_deprecated!(process_instruction); diff --git a/programs/sbf/rust/dup_accounts/src/lib.rs b/programs/sbf/rust/dup_accounts/src/lib.rs index 76fd6cfb3f..4c756050b7 100644 --- a/programs/sbf/rust/dup_accounts/src/lib.rs +++ b/programs/sbf/rust/dup_accounts/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program that tests duplicate accounts passed via accounts +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; use solana_program::{ account_info::AccountInfo, diff --git a/programs/sbf/rust/external_spend/src/lib.rs b/programs/sbf/rust/external_spend/src/lib.rs index a48fd47b54..d2d4ad7d72 100644 --- a/programs/sbf/rust/external_spend/src/lib.rs +++ b/programs/sbf/rust/external_spend/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program that moves a lamport from one account to another +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey}; diff --git a/programs/sbf/rust/inner_instruction_alignment_check/src/lib.rs b/programs/sbf/rust/inner_instruction_alignment_check/src/lib.rs index 966d4ab766..e7869c52ac 100644 --- a/programs/sbf/rust/inner_instruction_alignment_check/src/lib.rs +++ b/programs/sbf/rust/inner_instruction_alignment_check/src/lib.rs @@ -40,5 +40,5 @@ custom_heap_default!(); #[no_mangle] fn custom_panic(info: &core::panic::PanicInfo<'_>) { // Full panic reporting - msg!(&format!("{}", info)); + msg!(&format!("{info}")); } diff --git a/programs/sbf/rust/instruction_introspection/src/lib.rs b/programs/sbf/rust/instruction_introspection/src/lib.rs index a449ff784e..502521ea29 100644 --- a/programs/sbf/rust/instruction_introspection/src/lib.rs +++ b/programs/sbf/rust/instruction_introspection/src/lib.rs @@ -42,7 +42,7 @@ fn process_instruction( msg!(&format!("id: {}", instruction.program_id)); msg!(&format!("data[0]: {}", instruction.data[0])); - msg!(&format!("index: {}", current_instruction)); + msg!(&format!("index: {current_instruction}")); if instruction_data.len() == 2 { // CPI ourself with the same arguments to confirm the instructions sysvar reports the same diff --git a/programs/sbf/rust/invoked/src/processor.rs b/programs/sbf/rust/invoked/src/processor.rs index aa4d2fe801..42a427c74d 100644 --- a/programs/sbf/rust/invoked/src/processor.rs +++ b/programs/sbf/rust/invoked/src/processor.rs @@ -1,6 +1,7 @@ //! Example Rust-based SBF program that issues a cross-program-invocation #![cfg(feature = "program")] +#![allow(clippy::integer_arithmetic)] use { crate::instructions::*, diff --git a/programs/sbf/rust/iter/src/lib.rs b/programs/sbf/rust/iter/src/lib.rs index 9009b4f6f6..6fa13ac752 100644 --- a/programs/sbf/rust/iter/src/lib.rs +++ b/programs/sbf/rust/iter/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program tests loop iteration +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; use solana_program::{ custom_heap_default, custom_panic_default, entrypoint::SUCCESS, log::sol_log_64, diff --git a/programs/sbf/rust/many_args/src/helper.rs b/programs/sbf/rust/many_args/src/helper.rs index df89033a6c..f5196ab474 100644 --- a/programs/sbf/rust/many_args/src/helper.rs +++ b/programs/sbf/rust/many_args/src/helper.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program tests loop iteration +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; use solana_program::log::*; diff --git a/programs/sbf/rust/many_args_dep/src/lib.rs b/programs/sbf/rust/many_args_dep/src/lib.rs index ec572e0cd4..6030303477 100644 --- a/programs/sbf/rust/many_args_dep/src/lib.rs +++ b/programs/sbf/rust/many_args_dep/src/lib.rs @@ -1,5 +1,7 @@ //! Solana Rust-based SBF program utility functions and types +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; use solana_program::{log::sol_log_64, msg}; diff --git a/programs/sbf/rust/mem/Cargo.toml b/programs/sbf/rust/mem/Cargo.toml index 0e295863d7..8b5af0a9eb 100644 --- a/programs/sbf/rust/mem/Cargo.toml +++ b/programs/sbf/rust/mem/Cargo.toml @@ -11,6 +11,8 @@ edition = { workspace = true } [features] no-entrypoint = [] +test-bpf = [] +dummy-for-ci-check = ["test-bpf"] [dependencies] solana-program = { workspace = true } diff --git a/programs/sbf/rust/mem/src/lib.rs b/programs/sbf/rust/mem/src/lib.rs index a824036f68..325a87eee7 100644 --- a/programs/sbf/rust/mem/src/lib.rs +++ b/programs/sbf/rust/mem/src/lib.rs @@ -1,6 +1,6 @@ //! Test mem functions -#[cfg(not(feature = "no-entrypoint"))] +#[cfg(any(not(feature = "no-entrypoint"), feature = "test-bpf"))] pub mod entrypoint; pub trait MemOps { diff --git a/programs/sbf/rust/mem/tests/lib.rs b/programs/sbf/rust/mem/tests/lib.rs index 24edfc1a32..9b6a15568e 100644 --- a/programs/sbf/rust/mem/tests/lib.rs +++ b/programs/sbf/rust/mem/tests/lib.rs @@ -1,3 +1,5 @@ +#![cfg(feature = "test-bpf")] + use { solana_program_test::*, solana_sbf_rust_mem::entrypoint::process_instruction, diff --git a/programs/sbf/rust/panic/src/lib.rs b/programs/sbf/rust/panic/src/lib.rs index 9c542f9280..6e873933e2 100644 --- a/programs/sbf/rust/panic/src/lib.rs +++ b/programs/sbf/rust/panic/src/lib.rs @@ -5,7 +5,7 @@ fn custom_panic(info: &core::panic::PanicInfo<'_>) { // Note: Full panic reporting is included here for testing purposes solana_program::msg!("program custom panic enabled"); - solana_program::msg!(&format!("{}", info)); + solana_program::msg!(&format!("{info}")); } extern crate solana_program; diff --git a/programs/sbf/rust/param_passing_dep/src/lib.rs b/programs/sbf/rust/param_passing_dep/src/lib.rs index 1862f54cdf..3aa9fa8a41 100644 --- a/programs/sbf/rust/param_passing_dep/src/lib.rs +++ b/programs/sbf/rust/param_passing_dep/src/lib.rs @@ -1,5 +1,7 @@ //! Example Rust-based SBF program tests loop iteration +#![allow(clippy::integer_arithmetic)] + extern crate solana_program; #[derive(Debug)] diff --git a/programs/sbf/rust/sanity/Cargo.toml b/programs/sbf/rust/sanity/Cargo.toml index fe660d8aac..2f3033a697 100644 --- a/programs/sbf/rust/sanity/Cargo.toml +++ b/programs/sbf/rust/sanity/Cargo.toml @@ -11,6 +11,7 @@ edition = { workspace = true } [features] test-bpf = [] +dummy-for-ci-check = ["test-bpf"] [dependencies] solana-program = { workspace = true } diff --git a/programs/sbf/rust/sanity/src/lib.rs b/programs/sbf/rust/sanity/src/lib.rs index 15121743f5..c3545c48b0 100644 --- a/programs/sbf/rust/sanity/src/lib.rs +++ b/programs/sbf/rust/sanity/src/lib.rs @@ -1,6 +1,7 @@ //! Example Rust-based SBF sanity program that prints out the parameters passed to it #![allow(unreachable_code)] +#![allow(clippy::integer_arithmetic)] extern crate solana_program; use solana_program::{ diff --git a/programs/sbf/rust/sanity/tests/lib.rs b/programs/sbf/rust/sanity/tests/lib.rs index adefabc1b0..6a561bcae1 100644 --- a/programs/sbf/rust/sanity/tests/lib.rs +++ b/programs/sbf/rust/sanity/tests/lib.rs @@ -12,7 +12,7 @@ use { }; #[tokio::test] -async fn test_sysvars() { +async fn test_sanity() { let program_id = Pubkey::new_unique(); let program_test = ProgramTest::new( "solana_sbf_rust_sanity", diff --git a/programs/sbf/rust/secp256k1_recover/src/lib.rs b/programs/sbf/rust/secp256k1_recover/src/lib.rs index 5cdc07ad62..10253519ed 100644 --- a/programs/sbf/rust/secp256k1_recover/src/lib.rs +++ b/programs/sbf/rust/secp256k1_recover/src/lib.rs @@ -60,7 +60,7 @@ fn test_secp256k1_recover_malleability() { let signature = libsecp256k1::Signature::parse_standard_slice(&signature_bytes).unwrap(); // Flip the S value in the signature to make a different but valid signature. - let mut alt_signature = signature.clone(); + let mut alt_signature = signature; alt_signature.s = -alt_signature.s; let alt_recovery_id = libsecp256k1::RecoveryId::parse(recovery_id ^ 1).unwrap(); diff --git a/programs/sbf/rust/sibling_inner_instruction/src/lib.rs b/programs/sbf/rust/sibling_inner_instruction/src/lib.rs index ab5e9b0dd9..56df749d60 100644 --- a/programs/sbf/rust/sibling_inner_instruction/src/lib.rs +++ b/programs/sbf/rust/sibling_inner_instruction/src/lib.rs @@ -1,6 +1,7 @@ //! Example Rust-based SBF program that queries sibling instructions #![cfg(feature = "program")] +#![allow(clippy::integer_arithmetic)] use solana_program::{ account_info::AccountInfo, diff --git a/programs/sbf/rust/simulation/src/lib.rs b/programs/sbf/rust/simulation/src/lib.rs index cf6add4984..212619c220 100644 --- a/programs/sbf/rust/simulation/src/lib.rs +++ b/programs/sbf/rust/simulation/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(clippy::integer_arithmetic)] + use { solana_program::{ account_info::{next_account_info, AccountInfo}, @@ -29,7 +31,7 @@ pub fn process_instruction( let slot: u64 = u64::from_le_bytes(data[data.len() - 8..].try_into().unwrap()); let clock_from_cache = Clock::get().unwrap(); - let clock_from_account = Clock::from_account_info(&clock_account_info).unwrap(); + let clock_from_account = Clock::from_account_info(clock_account_info).unwrap(); msg!("next_slot from slot history is {:?} ", slot); msg!("clock from cache is in slot {:?} ", clock_from_cache.slot); diff --git a/programs/sbf/rust/simulation/tests/lib.rs b/programs/sbf/rust/simulation/tests/lib.rs index aab04b9f2a..f27cf52eeb 100644 --- a/programs/sbf/rust/simulation/tests/lib.rs +++ b/programs/sbf/rust/simulation/tests/lib.rs @@ -13,7 +13,7 @@ use { }; #[tokio::test] -async fn no_panic() { +async fn no_panic_banks_client() { let program_id = Pubkey::new_unique(); let program_test = ProgramTest::new( "solana_sbf_rust_simulation", diff --git a/programs/sbf/rust/simulation/tests/validator.rs b/programs/sbf/rust/simulation/tests/validator.rs index fc2701442b..3044ad9a64 100644 --- a/programs/sbf/rust/simulation/tests/validator.rs +++ b/programs/sbf/rust/simulation/tests/validator.rs @@ -11,7 +11,7 @@ use { }; #[test] -fn no_panic() { +fn no_panic_rpc_client() { solana_logger::setup_with_default("solana_program_runtime=debug"); let program_id = Pubkey::new_unique(); diff --git a/programs/sbf/rust/spoof1_system/src/lib.rs b/programs/sbf/rust/spoof1_system/src/lib.rs index df79bfec57..37ec33f275 100644 --- a/programs/sbf/rust/spoof1_system/src/lib.rs +++ b/programs/sbf/rust/spoof1_system/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(clippy::integer_arithmetic)] + use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey}; solana_program::entrypoint!(process_instruction); diff --git a/programs/sbf/rust/sysvar/Cargo.toml b/programs/sbf/rust/sysvar/Cargo.toml index e975c8a29f..564c701bb0 100644 --- a/programs/sbf/rust/sysvar/Cargo.toml +++ b/programs/sbf/rust/sysvar/Cargo.toml @@ -12,6 +12,10 @@ edition = { workspace = true } [dependencies] solana-program = { workspace = true } +[features] +test-bpf = [] +dummy-for-ci-check = ["test-bpf"] + [dev-dependencies] solana-program-runtime = { workspace = true } solana-program-test = { workspace = true } diff --git a/programs/sbf/rust/sysvar/tests/lib.rs b/programs/sbf/rust/sysvar/tests/lib.rs index 81e3e0069a..9294ccdc0b 100644 --- a/programs/sbf/rust/sysvar/tests/lib.rs +++ b/programs/sbf/rust/sysvar/tests/lib.rs @@ -1,3 +1,5 @@ +#![cfg(feature = "test-bpf")] + use { solana_program_test::*, solana_sbf_rust_sysvar::process_instruction, diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index bda6aeabd4..11bce75ef0 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -1,4 +1,13 @@ #![cfg(any(feature = "sbf_c", feature = "sbf_rust"))] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::needless_range_loop)] +#![allow(clippy::redundant_clone)] +#![allow(clippy::needless_borrow)] +#![allow(clippy::cmp_owned)] +#![allow(clippy::needless_collect)] +#![allow(clippy::match_like_matches_macro)] +#![allow(clippy::unnecessary_cast)] +#![allow(clippy::uninlined_format_args)] #[macro_use] extern crate solana_bpf_loader_program; diff --git a/version/Cargo.toml b/version/Cargo.toml index 85b2ef14b5..2b7e2eb2a5 100644 --- a/version/Cargo.toml +++ b/version/Cargo.toml @@ -18,6 +18,9 @@ solana-frozen-abi = { workspace = true } solana-frozen-abi-macro = { workspace = true } solana-sdk = { workspace = true } +[features] +dummy-for-ci-check = [] + [lib] name = "solana_version"