From d8e45ec4c94059b42a0dacd2dd1c7fd2a43f3daa Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 15:44:48 +0100 Subject: [PATCH 1/9] Fix cargo test errors --- Cargo.toml | 20 ++-- src/extensions/client/banks_client.rs | 6 +- src/extensions/client/mod.rs | 16 ++-- src/extensions/client/rpc_client.rs | 63 ++++++++----- src/extensions/mod.rs | 4 +- src/extensions/program_test.rs | 8 +- src/extensions/program_test_context.rs | 3 +- tests/artifacts/program_for_tests.so | Bin 175256 -> 0 bytes tests/artifacts/program_for_tests/Anchor.toml | 9 -- tests/artifacts/program_for_tests/Cargo.toml | 17 ---- .../testsuite/artifacts/program_for_tests.so | Bin 0 -> 317008 bytes .../artifacts/program_for_tests/Anchor.toml | 19 ++++ .../artifacts/program_for_tests/Cargo.toml | 30 ++++++ .../artifacts/program_for_tests/Xargo.toml | 0 .../artifacts/program_for_tests/src/lib.rs | 2 +- tests/{ => testsuite}/artifacts/usdc_mint | Bin tests/{ => testsuite}/banks_client.rs | 35 +------ tests/{ => testsuite}/helpers.rs | 14 ++- tests/testsuite/main.rs | 5 + tests/{ => testsuite}/program_test.rs | 6 +- tests/{ => testsuite}/program_test_context.rs | 7 +- tests/{ => testsuite}/rpc_client.rs | 87 ++++++++---------- 22 files changed, 181 insertions(+), 170 deletions(-) delete mode 100755 tests/artifacts/program_for_tests.so delete mode 100644 tests/artifacts/program_for_tests/Anchor.toml delete mode 100644 tests/artifacts/program_for_tests/Cargo.toml create mode 100755 tests/testsuite/artifacts/program_for_tests.so create mode 100644 tests/testsuite/artifacts/program_for_tests/Anchor.toml create mode 100644 tests/testsuite/artifacts/program_for_tests/Cargo.toml rename tests/{ => testsuite}/artifacts/program_for_tests/Xargo.toml (100%) rename tests/{ => testsuite}/artifacts/program_for_tests/src/lib.rs (98%) rename tests/{ => testsuite}/artifacts/usdc_mint (100%) rename tests/{ => testsuite}/banks_client.rs (90%) rename tests/{ => testsuite}/helpers.rs (63%) create mode 100644 tests/testsuite/main.rs rename tests/{ => testsuite}/program_test.rs (98%) rename tests/{ => testsuite}/program_test_context.rs (95%) rename tests/{ => testsuite}/rpc_client.rs (72%) diff --git a/Cargo.toml b/Cargo.toml index 85c8a16..04314ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,26 +11,26 @@ anchor = ["anchor-lang"] pyth = ["pyth-sdk-solana"] [dependencies] -solana-program-test = "1.18" -solana-sdk = "1.18" -solana-program ="1.18" -solana-banks-client = "1.18" -solana-program-runtime = "1.18" -solana-client = "1.18" +solana-program-test = "=1.18" +solana-sdk = "=1.18" +solana-program = "=1.18" +solana-banks-client = "=1.18" +solana-program-runtime = "=1.18" +solana-client = "=1.18" spl-token = "4.0.0" spl-associated-token-account = "1.1.2" anchor-lang = { version = "0.30.0", optional = true } async-trait = "0.1.52" futures = "0.3" -borsh = "0.9" +borsh = "0.10.3" bincode = "1.3.3" log = "0.4" chrono-humanize = "0.2" pyth-sdk-solana = { version = "0.10.1", optional = true } -serde = { version = "1.0.152"} +serde = { version = "1.0.152" } serde_json = { version = "1.0.91", optional = true } thiserror = "1.0.38" [dev-dependencies] -program-for-tests = {path="tests/artifacts/program_for_tests"} -solana-test-validator = "1.18" \ No newline at end of file +program-for-tests = { path = "tests/testsuite/artifacts/program_for_tests" } +solana-test-validator = "=1.18" diff --git a/src/extensions/client/banks_client.rs b/src/extensions/client/banks_client.rs index f4ee492..ce9be51 100644 --- a/src/extensions/client/banks_client.rs +++ b/src/extensions/client/banks_client.rs @@ -196,8 +196,7 @@ impl ClientExtensions for BanksClient { // multiply by 2 so program can be updated later on let program_len = buffer_len; let minimum_balance = Rent::default().minimum_balance( - bpf_loader_upgradeable::UpgradeableLoaderState::programdata_len(program_len) - .expect("Cannot get program len"), + bpf_loader_upgradeable::UpgradeableLoaderState::size_of_programdata(program_len), ); let latest_blockhash = self.get_latest_blockhash().await?; @@ -263,8 +262,7 @@ impl ClientExtensions for BanksClient { // multiply by 2 so program can be updated later on let program_len = buffer_len * 2; let minimum_balance = Rent::default().minimum_balance( - bpf_loader_upgradeable::UpgradeableLoaderState::programdata_len(program_len) - .expect("Cannot get program len"), + bpf_loader_upgradeable::UpgradeableLoaderState::size_of_programdata(program_len), ); // 1 Create buffer diff --git a/src/extensions/client/mod.rs b/src/extensions/client/mod.rs index 84b661f..ff678dd 100644 --- a/src/extensions/client/mod.rs +++ b/src/extensions/client/mod.rs @@ -1,10 +1,7 @@ use async_trait::async_trait; use borsh::BorshDeserialize; use futures::FutureExt; -use solana_program::{ - bpf_loader_upgradeable, - program_pack::Pack -}; +use solana_program::{bpf_loader_upgradeable, program_pack::Pack}; use solana_sdk::{ bpf_loader, instruction::Instruction, @@ -13,10 +10,11 @@ use solana_sdk::{ signature::{Keypair, Signer}, system_transaction, sysvar::rent::Rent, - transaction::Transaction + transaction::Transaction, }; use spl_associated_token_account::{ - get_associated_token_address, instruction::create_associated_token_account as create_associated_token_account_ix, + get_associated_token_address, + instruction::create_associated_token_account as create_associated_token_account_ix, }; #[cfg(feature = "anchor")] @@ -27,7 +25,9 @@ pub use solana_banks_client::{BanksClient, BanksClientError}; mod banks_client; mod rpc_client; +#[allow(unused_imports)] pub use banks_client::*; +#[allow(unused_imports)] pub use rpc_client::*; use crate::util; @@ -68,7 +68,6 @@ pub trait ClientExtensions { unimplemented!(); } - #[cfg(feature = "pyth")] async fn get_pyth_price_account( &mut self, @@ -123,6 +122,7 @@ pub trait ClientExtensions { unimplemented!(); } + #[deprecated] /// Deploy a program async fn deploy_program( &mut self, @@ -144,4 +144,4 @@ pub trait ClientExtensions { ) -> Result<(), Box> { unimplemented!(); } -} \ No newline at end of file +} diff --git a/src/extensions/client/rpc_client.rs b/src/extensions/client/rpc_client.rs index fded2ee..15f976a 100644 --- a/src/extensions/client/rpc_client.rs +++ b/src/extensions/client/rpc_client.rs @@ -1,8 +1,9 @@ use super::*; -use solana_client::rpc_client::RpcClient; +use futures::future::join_all; #[cfg(feature = "pyth")] use pyth_sdk_solana::state::PriceAccount; +use solana_client::nonblocking::rpc_client::RpcClient; #[async_trait] impl ClientExtensions for RpcClient { @@ -12,7 +13,7 @@ impl ClientExtensions for RpcClient { payer: &Keypair, signers: Vec<&Keypair>, ) -> Result> { - let latest_blockhash = self.get_latest_blockhash()?; + let latest_blockhash = self.get_latest_blockhash().await?; Ok(Transaction::new_signed_with_payer( ixs, @@ -27,7 +28,7 @@ impl ClientExtensions for RpcClient { &mut self, address: Pubkey, ) -> Result> { - self.get_account_data(&address).map(|account_data| { + self.get_account_data(&address).await.map(|account_data| { T::try_deserialize(&mut account_data.as_ref()).map_err(Into::into) })? } @@ -37,6 +38,7 @@ impl ClientExtensions for RpcClient { address: Pubkey, ) -> Result> { self.get_account_data(&address) + .await .map(|account_data| T::deserialize(&mut account_data.as_ref()).map_err(Into::into))? } @@ -45,7 +47,7 @@ impl ClientExtensions for RpcClient { &mut self, address: Pubkey, ) -> Result> { - self.get_account_data(&address).map(|account_data| { + self.get_account_data(&address).await.map(|account_data| { //PriceFeed::deserialize(&mut account_data.as_ref()).map_err(Into::into) let data = account_data; let price_account = @@ -64,7 +66,7 @@ impl ClientExtensions for RpcClient { space: u64, owner: Pubkey, ) -> Result<(), Box> { - let latest_blockhash = self.get_latest_blockhash()?; + let latest_blockhash = self.get_latest_blockhash().await?; self.send_and_confirm_transaction(&system_transaction::create_account( from, @@ -74,6 +76,7 @@ impl ClientExtensions for RpcClient { space, &owner, )) + .await .map(|_| ()) .map_err(Into::into) } @@ -86,7 +89,7 @@ impl ClientExtensions for RpcClient { decimals: u8, payer: &Keypair, ) -> Result<(), Box> { - let latest_blockhash = self.get_latest_blockhash()?; + let latest_blockhash = self.get_latest_blockhash().await?; self.send_and_confirm_transaction(&system_transaction::create_account( payer, mint, @@ -94,7 +97,8 @@ impl ClientExtensions for RpcClient { Rent::default().minimum_balance(spl_token::state::Mint::get_packed_len()), spl_token::state::Mint::get_packed_len() as u64, &spl_token::id(), - ))?; + )) + .await?; let tx = self .transaction_from_instructions( @@ -111,6 +115,7 @@ impl ClientExtensions for RpcClient { .await?; self.send_and_confirm_transaction(&tx) + .await .map(|_| ()) .map_err(Into::into) } @@ -122,7 +127,7 @@ impl ClientExtensions for RpcClient { mint: &Pubkey, payer: &Keypair, ) -> Result<(), Box> { - let latest_blockhash = self.get_latest_blockhash()?; + let latest_blockhash = self.get_latest_blockhash().await?; self.send_and_confirm_transaction(&system_transaction::create_account( payer, @@ -131,7 +136,8 @@ impl ClientExtensions for RpcClient { Rent::default().minimum_balance(spl_token::state::Account::get_packed_len()), spl_token::state::Account::get_packed_len() as u64, &spl_token::id(), - ))?; + )) + .await?; let tx = self .transaction_from_instructions( @@ -147,6 +153,7 @@ impl ClientExtensions for RpcClient { .await?; self.send_and_confirm_transaction(&tx) + .await .map(|_| ()) .map_err(Into::into) } @@ -174,6 +181,7 @@ impl ClientExtensions for RpcClient { .await?; self.send_and_confirm_transaction(&tx) + .await .map(|_| associated_token_account) .map_err(Into::into) } @@ -191,10 +199,9 @@ impl ClientExtensions for RpcClient { // multiply by 2 so program can be updated later on let program_len = buffer_len; let minimum_balance = Rent::default().minimum_balance( - bpf_loader_upgradeable::UpgradeableLoaderState::programdata_len(program_len) - .expect("Cannot get program len"), + bpf_loader_upgradeable::UpgradeableLoaderState::size_of_programdata(program_len), ); - let latest_blockhash = self.get_latest_blockhash()?; + let latest_blockhash = self.get_latest_blockhash().await?; // 1 Create account self.send_and_confirm_transaction(&system_transaction::create_account( @@ -204,7 +211,8 @@ impl ClientExtensions for RpcClient { minimum_balance, program_len as u64, &bpf_loader::id(), - ))?; + )) + .await?; // 2. Write to buffer let deploy_ix = |offset: u32, bytes: Vec| { @@ -220,7 +228,7 @@ impl ClientExtensions for RpcClient { .await .unwrap(); - self.send_and_confirm_transaction(&tx)?; + self.send_and_confirm_transaction(&tx).await?; } // 3. Finalize @@ -247,6 +255,7 @@ impl ClientExtensions for RpcClient { .unwrap(); self.send_and_confirm_transaction(&finalize_tx) + .await .map(|_| ()) .map_err(Into::into) } @@ -266,8 +275,7 @@ impl ClientExtensions for RpcClient { // multiply by 2 so program can be updated later on let program_len = buffer_len * 2; let minimum_balance = Rent::default().minimum_balance( - bpf_loader_upgradeable::UpgradeableLoaderState::programdata_len(program_len) - .expect("Cannot get program len"), + bpf_loader_upgradeable::UpgradeableLoaderState::size_of_programdata(program_len), ); // 1 Create buffer @@ -288,7 +296,7 @@ impl ClientExtensions for RpcClient { ) .await?; - self.send_and_confirm_transaction(&tx)?; + self.send_and_confirm_transaction(&tx).await?; // 2 Write to buffer let deploy_ix = |offset: u32, bytes: Vec| { @@ -303,17 +311,25 @@ impl ClientExtensions for RpcClient { let chunk_size = util::calculate_chunk_size(deploy_ix, &vec![payer, buffer_authority_signer]); + let mut txs = vec![]; + for (chunk, i) in program_data.chunks(chunk_size).zip(0..) { - let ix = deploy_ix(i * chunk_size as u32, chunk.to_vec()); + txs.push(Transaction::new_signed_with_payer( + &[deploy_ix(i * chunk_size as u32, chunk.to_vec())], + Some(&payer.pubkey()), + &vec![payer, buffer_authority_signer], + self.get_latest_blockhash().await?, + )); + } - tx = self - .transaction_from_instructions(&[ix], payer, vec![payer, buffer_authority_signer]) - .await - .unwrap(); + let mut futures = vec![]; - self.send_and_confirm_transaction(&tx)?; + for tx in txs.iter() { + futures.push(self.send_and_confirm_transaction(tx)); } + join_all(futures).await; + // 3. Finalize tx = self .transaction_from_instructions( @@ -333,6 +349,7 @@ impl ClientExtensions for RpcClient { .await?; self.send_and_confirm_transaction(&tx) + .await .map(|_| ()) .map_err(Into::into) } diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index 9006f19..ec98ccf 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -1,7 +1,7 @@ mod client; -mod program_test_context; mod program_test; +mod program_test_context; pub use client::*; +pub use program_test::*; pub use program_test_context::*; -pub use program_test::*; \ No newline at end of file diff --git a/src/extensions/program_test.rs b/src/extensions/program_test.rs index aaa26a8..9f9f004 100644 --- a/src/extensions/program_test.rs +++ b/src/extensions/program_test.rs @@ -79,6 +79,7 @@ pub trait ProgramTestExtension { ); /// Adds an SPL Token account to the test environment. + #[allow(clippy::too_many_arguments)] fn add_token_account( &mut self, pubkey: Pubkey, @@ -93,6 +94,7 @@ pub trait ProgramTestExtension { /// Adds an associated token account to the test environment. /// Returns the address of the created account. + #[allow(clippy::too_many_arguments)] fn add_associated_token_account( &mut self, mint: Pubkey, @@ -114,15 +116,15 @@ pub trait ProgramTestExtension { process_instruction: Option, ); - /// Adds a BPF program to the test environment. - /// The program is upgradeable if `Some` `program_authority` and then providing the program data account + /// Adds a BPF program to the test environment. + /// The program is upgradeable if `Some` `program_authority` and then providing the program data account /// This is useful for those programs which the program data has to be a spefic one, if not, use add_bpf_program fn add_bpf_program_with_program_data( &mut self, program_name: &str, program_id: Pubkey, program_authority: Option, - program_data: Pubkey, + program_data: Pubkey, process_instruction: Option, ); diff --git a/src/extensions/program_test_context.rs b/src/extensions/program_test_context.rs index 5bcb1d8..92d208e 100644 --- a/src/extensions/program_test_context.rs +++ b/src/extensions/program_test_context.rs @@ -1,7 +1,6 @@ use async_trait::async_trait; -use solana_program::pubkey::Pubkey; use solana_program_test::{ProgramTestContext, ProgramTestError}; -use solana_sdk::{account::AccountSharedData, sysvar::clock::Clock}; +use solana_sdk::sysvar::clock::Clock; #[cfg(feature = "pyth")] use { diff --git a/tests/artifacts/program_for_tests.so b/tests/artifacts/program_for_tests.so deleted file mode 100755 index 8c6487aada2d6d625f8948b492134714754ba7a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175256 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�tBkeu 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 diff --git a/tests/artifacts/program_for_tests/Anchor.toml b/tests/artifacts/program_for_tests/Anchor.toml deleted file mode 100644 index f60d23b..0000000 --- a/tests/artifacts/program_for_tests/Anchor.toml +++ /dev/null @@ -1,9 +0,0 @@ -[provider] -cluster = "localnet" -wallet = "~/.config/solana/id.json" - -[programs.localnet] -basic_4 = "CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr" - -[scripts] -test = "yarn run mocha -t 1000000 tests/" diff --git a/tests/artifacts/program_for_tests/Cargo.toml b/tests/artifacts/program_for_tests/Cargo.toml deleted file mode 100644 index 827b0be..0000000 --- a/tests/artifacts/program_for_tests/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "program-for-tests" -version = "0.1.0" -description = "Created with Anchor" -rust-version = "1.56" -edition = "2021" - -[lib] -crate-type = ["cdylib", "lib"] -name = "program_for_tests" - -[features] -no-entrypoint = [] -cpi = ["no-entrypoint"] - -[dependencies] -anchor-lang = { version = "0.26.0" } diff --git a/tests/testsuite/artifacts/program_for_tests.so b/tests/testsuite/artifacts/program_for_tests.so new file mode 100755 index 0000000000000000000000000000000000000000..d153bba7860054a520c7d425f78cd46ddb2e5dcb GIT binary patch literal 317008 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 ProgramResult { + program_for_tests::entry( + program_id, + unsafe { &*(accounts as *const [AccountInfo]) }, + data, + ) +} + pub fn add_program() -> (ProgramTest, Pubkey) { let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); let program = ProgramTest::new( "program_for_tests", program_id, - processor!(program_for_tests::entry), + solana_program_test::processor!(correct_entry), ); (program, program_id) @@ -29,5 +39,5 @@ pub fn add_payer(program: &mut ProgramTest) -> Keypair { }, ); - return payer; + payer } diff --git a/tests/testsuite/main.rs b/tests/testsuite/main.rs new file mode 100644 index 0000000..8293a41 --- /dev/null +++ b/tests/testsuite/main.rs @@ -0,0 +1,5 @@ +mod banks_client; +mod helpers; +mod program_test; +mod program_test_context; +mod rpc_client; diff --git a/tests/program_test.rs b/tests/testsuite/program_test.rs similarity index 98% rename from tests/program_test.rs rename to tests/testsuite/program_test.rs index 851651d..983c7c1 100644 --- a/tests/program_test.rs +++ b/tests/testsuite/program_test.rs @@ -15,11 +15,10 @@ use borsh::BorshDeserialize; #[cfg(feature = "anchor")] use {anchor_lang::AccountDeserialize, program_for_tests::CountTracker}; +use crate::helpers; #[cfg(feature = "pyth")] use pyth_sdk_solana::state::{PriceAccount, PriceInfo, PriceStatus}; -mod helpers; - #[tokio::test] async fn generate_accounts() { let (mut program, _) = helpers::add_program(); @@ -47,7 +46,8 @@ async fn add_account_with_data() { // USDC Mint from mainnet // got using solana account --output-file usdc_mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v - let (data, _) = solana_test_framework::util::load_file_to_bytes("tests/artifacts/usdc_mint"); + let (data, _) = + solana_test_framework::util::load_file_to_bytes("tests/testsuite/artifacts/usdc_mint"); program.add_account_with_data(acc_pubkey, owner, &data[..], false); diff --git a/tests/program_test_context.rs b/tests/testsuite/program_test_context.rs similarity index 95% rename from tests/program_test_context.rs rename to tests/testsuite/program_test_context.rs index e77d40d..b136d05 100644 --- a/tests/program_test_context.rs +++ b/tests/testsuite/program_test_context.rs @@ -4,8 +4,7 @@ use solana_sdk::{pubkey::Pubkey, sysvar::clock::Clock}; use std::str::FromStr; -mod helpers; - +use crate::helpers::correct_entry; #[cfg(feature = "pyth")] use pyth_sdk_solana::state::{PriceAccount, PriceInfo, PriceStatus}; @@ -15,7 +14,7 @@ async fn transaction_from_instructions() { let program = ProgramTest::new( "program_for_tests", program_id, - processor!(program_for_tests::entry), + solana_program_test::processor!(correct_entry), ); let mut program_context = program.start_with_context().await; @@ -40,7 +39,7 @@ async fn transaction_from_instructions() { #[cfg(feature = "pyth")] #[tokio::test] async fn update_pyth_oracle() { - let (mut program, program_id) = helpers::add_program(); + let (mut program, program_id) = crate::helpers::add_program(); let oracle = Pubkey::new_unique(); diff --git a/tests/rpc_client.rs b/tests/testsuite/rpc_client.rs similarity index 72% rename from tests/rpc_client.rs rename to tests/testsuite/rpc_client.rs index 7ce6525..1211cb5 100644 --- a/tests/rpc_client.rs +++ b/tests/testsuite/rpc_client.rs @@ -10,7 +10,7 @@ use { spl_token::state::Mint, }; -use solana_test_validator::{ProgramInfo, TestValidatorGenesis}; +use solana_test_validator::{TestValidatorGenesis, UpgradeableProgramInfo}; use spl_token::state::Account as TokenAccount; @@ -20,16 +20,17 @@ use std::str::FromStr; async fn transaction_from_instructions() { let mut genesis_config = TestValidatorGenesis::default(); let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); - let program_path = "tests/artifacts/program_for_tests.so"; + let program_path = "tests/testsuite/artifacts/program_for_tests.so"; - genesis_config.add_programs_with_path(&[ProgramInfo { + genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, loader: solana_sdk::bpf_loader::id(), + upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); + let mut rpc_client = test_validator.get_async_rpc_client(); let acc_1 = Keypair::new(); let acc_2 = Keypair::new(); @@ -53,9 +54,9 @@ async fn transaction_from_instructions() { .await .unwrap(); - assert!(rpc_client.send_and_confirm_transaction(&tx).is_ok()); - let acc1_data = rpc_client.get_account(&acc_1.pubkey()).unwrap(); - let acc2_data = rpc_client.get_account(&acc_2.pubkey()).unwrap(); + assert!(rpc_client.send_and_confirm_transaction(&tx).await.is_ok()); + let acc1_data = rpc_client.get_account(&acc_1.pubkey()).await.unwrap(); + let acc2_data = rpc_client.get_account(&acc_2.pubkey()).await.unwrap(); assert_eq!(acc1_data.owner, acc_1.pubkey()); assert_eq!(acc2_data.owner, acc_2.pubkey()); } @@ -64,16 +65,17 @@ async fn transaction_from_instructions() { async fn create_account() { let mut genesis_config = TestValidatorGenesis::default(); let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); - let program_path = "tests/artifacts/program_for_tests.so"; + let program_path = "tests/testsuite/artifacts/program_for_tests.so"; - genesis_config.add_programs_with_path(&[ProgramInfo { + genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, loader: solana_sdk::bpf_loader::id(), + upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); + let mut rpc_client = test_validator.get_async_rpc_client(); let lamports = 1_000_000; let new_acc = Keypair::new(); @@ -83,7 +85,7 @@ async fn create_account() { .await .unwrap(); - let acc = rpc_client.get_account(&new_acc.pubkey()).unwrap(); + let acc = rpc_client.get_account(&new_acc.pubkey()).await.unwrap(); assert_eq!(acc.lamports, lamports); } @@ -91,16 +93,17 @@ async fn create_account() { async fn create_token_mint() { let mut genesis_config = TestValidatorGenesis::default(); let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); - let program_path = "tests/artifacts/program_for_tests.so"; + let program_path = "tests/testsuite/artifacts/program_for_tests.so"; - genesis_config.add_programs_with_path(&[ProgramInfo { + genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, loader: solana_sdk::bpf_loader::id(), + upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); + let mut rpc_client = test_validator.get_async_rpc_client(); let mint = Keypair::new(); let freeze_pubkey = Pubkey::new_unique(); @@ -118,7 +121,7 @@ async fn create_token_mint() { .await .unwrap(); //Test mint with defaults creation - let mint_acc = rpc_client.get_account(&mint.pubkey()).unwrap(); + let mint_acc = rpc_client.get_account(&mint.pubkey()).await.unwrap(); let mint_data = Mint::unpack(&mint_acc.data).unwrap(); assert_eq!(mint_data.freeze_authority.unwrap(), freeze_pubkey); assert_eq!(mint_data.decimals, decimals); @@ -129,16 +132,17 @@ async fn create_token_mint() { async fn create_token_account() { let mut genesis_config = TestValidatorGenesis::default(); let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); - let program_path = "tests/artifacts/program_for_tests.so"; + let program_path = "tests/testsuite/artifacts/program_for_tests.so"; - genesis_config.add_programs_with_path(&[ProgramInfo { + genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, loader: solana_sdk::bpf_loader::id(), + upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); + let mut rpc_client = test_validator.get_async_rpc_client(); let mint = Keypair::new(); let freeze_pubkey = Pubkey::new_unique(); @@ -163,7 +167,10 @@ async fn create_token_account() { .await .unwrap(); - let token_account = rpc_client.get_account(&token_account.pubkey()).unwrap(); + let token_account = rpc_client + .get_account(&token_account.pubkey()) + .await + .unwrap(); let token_account_data = TokenAccount::unpack(&token_account.data).unwrap(); @@ -175,17 +182,18 @@ async fn create_token_account() { async fn create_associated_token_account() { let mut genesis_config = TestValidatorGenesis::default(); let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); - let program_path = "tests/artifacts/program_for_tests.so"; + let program_path = "tests/testsuite/artifacts/program_for_tests.so"; let token_program_id = spl_token::ID; //could also use token-2022 ID - genesis_config.add_programs_with_path(&[ProgramInfo { + genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, loader: solana_sdk::bpf_loader::id(), + upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); + let mut rpc_client = test_validator.get_async_rpc_client(); let mint = Keypair::new(); let freeze_pubkey = Pubkey::new_unique(); @@ -208,7 +216,7 @@ async fn create_associated_token_account() { .await .unwrap(); - let token_account = rpc_client.get_account(&token_account).unwrap(); + let token_account = rpc_client.get_account(&token_account).await.unwrap(); let token_account_data = TokenAccount::unpack(&token_account.data).unwrap(); @@ -216,35 +224,11 @@ async fn create_associated_token_account() { assert_eq!(token_account_data.owner, payer.pubkey()); } -#[tokio::test(flavor = "multi_thread")] -async fn deploy_program() { - let genesis_config = TestValidatorGenesis::default(); - let program_keypair = Keypair::new(); - - let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); - - rpc_client - .deploy_program( - "tests/artifacts/program_for_tests.so", - &program_keypair, - &payer, - ) - .await - .unwrap(); - let deployed_program_account = rpc_client.get_account(&program_keypair.pubkey()).unwrap(); - - assert_eq!( - deployed_program_account.owner, - Pubkey::from_str("BPFLoader2111111111111111111111111111111111").unwrap() - ); -} - #[tokio::test(flavor = "multi_thread")] async fn deploy_upgradable_program() { let genesis_config = TestValidatorGenesis::default(); let (test_validator, payer) = genesis_config.start_async().await; - let mut rpc_client = test_validator.get_rpc_client(); + let mut rpc_client = test_validator.get_async_rpc_client(); let program_keypair = Keypair::new(); let buffer_keypair = Keypair::new(); @@ -252,7 +236,7 @@ async fn deploy_upgradable_program() { rpc_client .deploy_upgradable_program( - "tests/artifacts/program_for_tests.so", + "tests/testsuite/artifacts/program_for_tests.so", &buffer_keypair, &buffer_authority_signer, &program_keypair, @@ -260,7 +244,10 @@ async fn deploy_upgradable_program() { ) .await .unwrap(); - let deployed_program_account = rpc_client.get_account(&program_keypair.pubkey()).unwrap(); + let deployed_program_account = rpc_client + .get_account(&program_keypair.pubkey()) + .await + .unwrap(); assert_eq!( deployed_program_account.owner, From 064e8d238fad24080170afd36a18699a02252921 Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 15:48:22 +0100 Subject: [PATCH 2/9] Cargo upgrade and pin spl dependency versions to Agave repo versions on v1.18 branch --- Cargo.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 04314ac..c4156b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,19 +17,19 @@ solana-program = "=1.18" solana-banks-client = "=1.18" solana-program-runtime = "=1.18" solana-client = "=1.18" -spl-token = "4.0.0" -spl-associated-token-account = "1.1.2" -anchor-lang = { version = "0.30.0", optional = true } -async-trait = "0.1.52" +spl-token = "=4.0.0" +spl-associated-token-account = "=2.3.0" +anchor-lang = { version = "0.30.1", optional = true } +async-trait = "0.1.81" futures = "0.3" borsh = "0.10.3" bincode = "1.3.3" log = "0.4" chrono-humanize = "0.2" pyth-sdk-solana = { version = "0.10.1", optional = true } -serde = { version = "1.0.152" } -serde_json = { version = "1.0.91", optional = true } -thiserror = "1.0.38" +serde = { version = "1.0.207" } +serde_json = { version = "1.0.124", optional = true } +thiserror = "1.0.63" [dev-dependencies] program-for-tests = { path = "tests/testsuite/artifacts/program_for_tests" } From e39de5fe6985448611e36ada1dcd08b9776c17c2 Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 16:02:51 +0100 Subject: [PATCH 3/9] Fix pyth --- src/extensions/client/banks_client.rs | 4 +-- src/extensions/client/mod.rs | 4 +-- src/extensions/client/rpc_client.rs | 4 +-- src/extensions/program_test.rs | 34 ++++++++++++------------- src/extensions/program_test_context.rs | 8 +++--- src/util.rs | 8 +++--- tests/testsuite/program_test.rs | 4 +-- tests/testsuite/program_test_context.rs | 6 ++--- 8 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/extensions/client/banks_client.rs b/src/extensions/client/banks_client.rs index ce9be51..8d9639d 100644 --- a/src/extensions/client/banks_client.rs +++ b/src/extensions/client/banks_client.rs @@ -1,7 +1,7 @@ use super::*; #[cfg(feature = "pyth")] -use pyth_sdk_solana::state::PriceAccount; +use pyth_sdk_solana::state::SolanaPriceAccount; #[async_trait] impl ClientExtensions for BanksClient { @@ -54,7 +54,7 @@ impl ClientExtensions for BanksClient { async fn get_pyth_price_account( &mut self, address: Pubkey, - ) -> Result> { + ) -> Result> { let account = self.get_account(address).await?.unwrap(); let price_account = pyth_sdk_solana::state::load_price_account(account.data.as_ref()) diff --git a/src/extensions/client/mod.rs b/src/extensions/client/mod.rs index ff678dd..8306302 100644 --- a/src/extensions/client/mod.rs +++ b/src/extensions/client/mod.rs @@ -33,7 +33,7 @@ pub use rpc_client::*; use crate::util; #[cfg(feature = "pyth")] -use pyth_sdk_solana::state::PriceAccount; +use pyth_sdk_solana::state::SolanaPriceAccount; /// Convenience functions for clients #[async_trait] @@ -72,7 +72,7 @@ pub trait ClientExtensions { async fn get_pyth_price_account( &mut self, _address: Pubkey, - ) -> Result> { + ) -> Result> { unimplemented!(); } diff --git a/src/extensions/client/rpc_client.rs b/src/extensions/client/rpc_client.rs index 15f976a..0c401bf 100644 --- a/src/extensions/client/rpc_client.rs +++ b/src/extensions/client/rpc_client.rs @@ -2,7 +2,7 @@ use super::*; use futures::future::join_all; #[cfg(feature = "pyth")] -use pyth_sdk_solana::state::PriceAccount; +use pyth_sdk_solana::state::SolanaPriceAccount; use solana_client::nonblocking::rpc_client::RpcClient; #[async_trait] @@ -46,7 +46,7 @@ impl ClientExtensions for RpcClient { async fn get_pyth_price_account( &mut self, address: Pubkey, - ) -> Result> { + ) -> Result> { self.get_account_data(&address).await.map(|account_data| { //PriceFeed::deserialize(&mut account_data.as_ref()).map_err(Into::into) let data = account_data; diff --git a/src/extensions/program_test.rs b/src/extensions/program_test.rs index 9f9f004..deb1f49 100644 --- a/src/extensions/program_test.rs +++ b/src/extensions/program_test.rs @@ -23,7 +23,7 @@ use anchor_lang::{AnchorSerialize, Discriminator}; #[cfg(feature = "pyth")] use { crate::util::PriceAccountWrapper, - pyth_sdk_solana::state::{PriceAccount, PriceInfo}, + pyth_sdk_solana::state::{PriceInfo, SolanaPriceAccount}, solana_program_test::BanksClientError, }; @@ -134,7 +134,7 @@ pub trait ProgramTestExtension { &mut self, oracle: Pubkey, program_id: Pubkey, - price_account: Option, + price_account: Option, price_info: Option, timestamp: Option, ) -> Result<(), BanksClientError>; @@ -468,28 +468,26 @@ impl ProgramTestExtension for ProgramTest { &mut self, oracle: Pubkey, program_id: Pubkey, - price_account: Option, + price_account: Option, price_info: Option, timestamp: Option, ) -> Result<(), BanksClientError> { let data = if let Some(price_account) = price_account { bincode::serialize(&PriceAccountWrapper(&price_account)).unwrap() } else if let (Some(price_info), Some(timestamp)) = (price_info, timestamp) { - bincode::serialize(&PriceAccountWrapper( - &pyth_sdk_solana::state::PriceAccount { - magic: 0xa1b2c3d4, - ver: 2, - expo: 5, - atype: 3, - agg: price_info, - timestamp, - prev_timestamp: 100, - prev_price: 60, - prev_conf: 70, - prev_slot: 1, - ..Default::default() - }, - )) + bincode::serialize(&PriceAccountWrapper(&SolanaPriceAccount { + magic: 0xa1b2c3d4, + ver: 2, + expo: 5, + atype: 3, + agg: price_info, + timestamp, + prev_timestamp: 100, + prev_price: 60, + prev_conf: 70, + prev_slot: 1, + ..Default::default() + })) .unwrap() } else { return Err(BanksClientError::ClientError( diff --git a/src/extensions/program_test_context.rs b/src/extensions/program_test_context.rs index 92d208e..db3f1b4 100644 --- a/src/extensions/program_test_context.rs +++ b/src/extensions/program_test_context.rs @@ -6,7 +6,9 @@ use solana_sdk::sysvar::clock::Clock; use { crate::error::TestFrameWorkError, crate::util::PriceAccountWrapper, - pyth_sdk_solana::state::{PriceAccount, PriceInfo}, + pyth_sdk_solana::state::{PriceInfo, SolanaPriceAccount}, + solana_program::pubkey::Pubkey, + solana_sdk::account::AccountSharedData, }; #[async_trait] @@ -18,7 +20,7 @@ pub trait ProgramTestContextExtension { async fn update_pyth_oracle( &mut self, address: Pubkey, - price_account: Option, + price_account: Option, price_info: Option, timestamp: Option, valid_slots: Option, @@ -62,7 +64,7 @@ impl ProgramTestContextExtension for ProgramTestContext { async fn update_pyth_oracle( &mut self, address: Pubkey, - price_account: Option, + price_account: Option, price_info: Option, timestamp: Option, valid_slot: Option, diff --git a/src/util.rs b/src/util.rs index 315cb68..b07ef5c 100644 --- a/src/util.rs +++ b/src/util.rs @@ -7,7 +7,7 @@ use std::io::Read; #[cfg(feature = "pyth")] use { - pyth_sdk_solana::state::{PriceAccount, PriceComp, PriceInfo, PriceType, Rational}, + pyth_sdk_solana::state::{PriceComp, PriceInfo, PriceType, Rational, SolanaPriceAccount}, serde::{Deserialize, Serialize}, solana_sdk::pubkey::Pubkey, }; @@ -40,11 +40,11 @@ pub fn calculate_chunk_size) -> Instruction>( #[cfg(feature = "pyth")] #[derive(serde::Serialize)] -pub struct PriceAccountWrapper<'a>(#[serde(with = "PriceAccountDef")] pub &'a PriceAccount); +pub struct PriceAccountWrapper<'a>(#[serde(with = "PriceAccountDef")] pub &'a SolanaPriceAccount); #[cfg(feature = "pyth")] #[derive(Serialize, Deserialize)] -#[serde(remote = "PriceAccount")] +#[serde(remote = "SolanaPriceAccount")] #[repr(C)] pub struct PriceAccountDef { /// pyth magic number @@ -97,4 +97,6 @@ pub struct PriceAccountDef { pub agg: PriceInfo, /// price components one per quoter pub comp: [PriceComp; 32], + /// additional extended account data + pub extended: (), } diff --git a/tests/testsuite/program_test.rs b/tests/testsuite/program_test.rs index 983c7c1..94dabe4 100644 --- a/tests/testsuite/program_test.rs +++ b/tests/testsuite/program_test.rs @@ -17,7 +17,7 @@ use {anchor_lang::AccountDeserialize, program_for_tests::CountTracker}; use crate::helpers; #[cfg(feature = "pyth")] -use pyth_sdk_solana::state::{PriceAccount, PriceInfo, PriceStatus}; +use pyth_sdk_solana::state::{PriceInfo, PriceStatus, SolanaPriceAccount}; #[tokio::test] async fn generate_accounts() { @@ -256,7 +256,7 @@ async fn add_pyth_price_feed() { pub_slot: 3, ..Default::default() }; - let price_account = PriceAccount { + let price_account = SolanaPriceAccount { magic: 0xa1b2c3d4, ver: 2, expo: 5, diff --git a/tests/testsuite/program_test_context.rs b/tests/testsuite/program_test_context.rs index b136d05..6e85f5c 100644 --- a/tests/testsuite/program_test_context.rs +++ b/tests/testsuite/program_test_context.rs @@ -6,7 +6,7 @@ use std::str::FromStr; use crate::helpers::correct_entry; #[cfg(feature = "pyth")] -use pyth_sdk_solana::state::{PriceAccount, PriceInfo, PriceStatus}; +use pyth_sdk_solana::state::{PriceInfo, PriceStatus, SolanaPriceAccount}; #[tokio::test] async fn transaction_from_instructions() { @@ -52,7 +52,7 @@ async fn update_pyth_oracle() { ..Default::default() }; let valid_slot = 10; - let price_account = PriceAccount { + let price_account = SolanaPriceAccount { magic: 0xa1b2c3d4, ver: 2, expo: 5, @@ -86,7 +86,7 @@ async fn update_pyth_oracle() { pub_slot: 3, ..Default::default() }; - let price_account2 = PriceAccount { + let price_account2 = SolanaPriceAccount { magic: 0xa1b2c3d4, ver: 2, expo: 5, From 3b8a72d9723f35811d2e6f294d7b19825bd40548 Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 16:10:01 +0100 Subject: [PATCH 4/9] Add more filters to .gitignore Add .idea to .gitignore Add .anchor to .gitignore Fix ignore target in .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ba4f6fe..4ccd6e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Generated by Cargo # will have compiled files and executables -/target/ +target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html @@ -14,3 +14,6 @@ Cargo.lock !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json + +.idea +.anchor From 9864c2d01631c3e7bcac3d3cedfe0c2a707a07fa Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 16:13:48 +0100 Subject: [PATCH 5/9] Remove deprecated deploy_program (https://github.com/solana-labs/solana/pull/35164) Replace bpf_loader::id() with bpf_loader_upgradeable::id() --- README.md | 13 ----- src/extensions/client/banks_client.rs | 64 ----------------------- src/extensions/client/mod.rs | 13 ----- src/extensions/client/rpc_client.rs | 74 --------------------------- tests/testsuite/rpc_client.rs | 10 ++-- 5 files changed, 5 insertions(+), 169 deletions(-) diff --git a/README.md b/README.md index 83cf5b0..449976b 100644 --- a/README.md +++ b/README.md @@ -134,19 +134,6 @@ async fn create_associated_token_account(   -Deploy a final program - -```rust -async fn deploy_program( - &mut self, - path_to_program: &str, - program_keypair: &Keypair, - payer: &Keypair, -) -> Result<(), Box> -``` - -  - Deploy an upgradeable program ```rust diff --git a/src/extensions/client/banks_client.rs b/src/extensions/client/banks_client.rs index 8d9639d..b1ba846 100644 --- a/src/extensions/client/banks_client.rs +++ b/src/extensions/client/banks_client.rs @@ -183,70 +183,6 @@ impl ClientExtensions for BanksClient { return Ok(associated_token_account); } - async fn deploy_program( - &mut self, - path_to_program: &str, - program_keypair: &Keypair, - payer: &Keypair, - ) -> Result<(), Box> { - let (buffer, buffer_len) = util::load_file_to_bytes(path_to_program); - - let program_data = buffer; - - // multiply by 2 so program can be updated later on - let program_len = buffer_len; - let minimum_balance = Rent::default().minimum_balance( - bpf_loader_upgradeable::UpgradeableLoaderState::size_of_programdata(program_len), - ); - let latest_blockhash = self.get_latest_blockhash().await?; - - // 1 Create account - self.process_transaction(system_transaction::create_account( - payer, - program_keypair, - latest_blockhash, - minimum_balance, - program_len as u64, - &bpf_loader::id(), - )) - .await - .unwrap(); - - // 2. Write to buffer - let deploy_ix = |offset: u32, bytes: Vec| { - loader_instruction::write(&program_keypair.pubkey(), &bpf_loader::id(), offset, bytes) - }; - - let chunk_size = util::calculate_chunk_size(deploy_ix, &vec![payer, program_keypair]); - - for (chunk, i) in program_data.chunks(chunk_size).zip(0..) { - let ix = deploy_ix(i * chunk_size as u32, chunk.to_vec()); - let tx = self - .transaction_from_instructions(&[ix], payer, vec![payer, program_keypair]) - .await - .unwrap(); - - self.process_transaction(tx).await?; - } - - // 3. Finalize - let finalize_tx = self - .transaction_from_instructions( - &[loader_instruction::finalize( - &program_keypair.pubkey(), - &bpf_loader::id(), - )], - payer, - vec![payer, program_keypair], - ) - .await - .unwrap(); - - self.process_transaction(finalize_tx).await?; - - return Ok(()); - } - async fn deploy_upgradable_program( &mut self, path_to_program: &str, diff --git a/src/extensions/client/mod.rs b/src/extensions/client/mod.rs index 8306302..6cbfc1a 100644 --- a/src/extensions/client/mod.rs +++ b/src/extensions/client/mod.rs @@ -3,9 +3,7 @@ use borsh::BorshDeserialize; use futures::FutureExt; use solana_program::{bpf_loader_upgradeable, program_pack::Pack}; use solana_sdk::{ - bpf_loader, instruction::Instruction, - loader_instruction, pubkey::Pubkey, signature::{Keypair, Signer}, system_transaction, @@ -122,17 +120,6 @@ pub trait ClientExtensions { unimplemented!(); } - #[deprecated] - /// Deploy a program - async fn deploy_program( - &mut self, - _path_to_program: &str, - _program_keypair: &Keypair, - _payer: &Keypair, - ) -> Result<(), Box> { - unimplemented!(); - } - /// Deploy an upgradable program async fn deploy_upgradable_program( &mut self, diff --git a/src/extensions/client/rpc_client.rs b/src/extensions/client/rpc_client.rs index 0c401bf..49909a8 100644 --- a/src/extensions/client/rpc_client.rs +++ b/src/extensions/client/rpc_client.rs @@ -186,80 +186,6 @@ impl ClientExtensions for RpcClient { .map_err(Into::into) } - async fn deploy_program( - &mut self, - path_to_program: &str, - program_keypair: &Keypair, - payer: &Keypair, - ) -> Result<(), Box> { - let (buffer, buffer_len) = util::load_file_to_bytes(path_to_program); - - let program_data = buffer; - - // multiply by 2 so program can be updated later on - let program_len = buffer_len; - let minimum_balance = Rent::default().minimum_balance( - bpf_loader_upgradeable::UpgradeableLoaderState::size_of_programdata(program_len), - ); - let latest_blockhash = self.get_latest_blockhash().await?; - - // 1 Create account - self.send_and_confirm_transaction(&system_transaction::create_account( - payer, - program_keypair, - latest_blockhash, - minimum_balance, - program_len as u64, - &bpf_loader::id(), - )) - .await?; - - // 2. Write to buffer - let deploy_ix = |offset: u32, bytes: Vec| { - loader_instruction::write(&program_keypair.pubkey(), &bpf_loader::id(), offset, bytes) - }; - - let chunk_size = util::calculate_chunk_size(deploy_ix, &vec![payer, program_keypair]); - - for (chunk, i) in program_data.chunks(chunk_size).zip(0..) { - let ix = deploy_ix(i * chunk_size as u32, chunk.to_vec()); - let tx = self - .transaction_from_instructions(&[ix], payer, vec![payer, program_keypair]) - .await - .unwrap(); - - self.send_and_confirm_transaction(&tx).await?; - } - - // 3. Finalize - // let finalize_msg = Message::new_with_blockhash( - // &[loader_instruction::finalize( - // &program_keypair.pubkey(), - // &bpf_loader::id(), - // )], - // Some(&payer.pubkey()), - // &latest_blockhash, - // ); - // let finalize_tx = Transaction::new(&[payer, program_keypair], finalize_msg, latest_blockhash); - - let finalize_tx = self - .transaction_from_instructions( - &[loader_instruction::finalize( - &program_keypair.pubkey(), - &bpf_loader::id(), - )], - payer, - vec![payer, program_keypair], - ) - .await - .unwrap(); - - self.send_and_confirm_transaction(&finalize_tx) - .await - .map(|_| ()) - .map_err(Into::into) - } - async fn deploy_upgradable_program( &mut self, path_to_program: &str, diff --git a/tests/testsuite/rpc_client.rs b/tests/testsuite/rpc_client.rs index 1211cb5..7dd4c86 100644 --- a/tests/testsuite/rpc_client.rs +++ b/tests/testsuite/rpc_client.rs @@ -24,7 +24,7 @@ async fn transaction_from_instructions() { genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, - loader: solana_sdk::bpf_loader::id(), + loader: solana_sdk::bpf_loader_upgradeable::id(), upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); @@ -69,7 +69,7 @@ async fn create_account() { genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, - loader: solana_sdk::bpf_loader::id(), + loader: solana_sdk::bpf_loader_upgradeable::id(), upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); @@ -97,7 +97,7 @@ async fn create_token_mint() { genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, - loader: solana_sdk::bpf_loader::id(), + loader: solana_sdk::bpf_loader_upgradeable::id(), upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); @@ -136,7 +136,7 @@ async fn create_token_account() { genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, - loader: solana_sdk::bpf_loader::id(), + loader: solana_sdk::bpf_loader_upgradeable::id(), upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); @@ -187,7 +187,7 @@ async fn create_associated_token_account() { genesis_config.add_upgradeable_programs_with_path(&[UpgradeableProgramInfo { program_id, - loader: solana_sdk::bpf_loader::id(), + loader: solana_sdk::bpf_loader_upgradeable::id(), upgrade_authority: Default::default(), program_path: std::path::PathBuf::from(program_path), }]); From e257726d7e68892345417e4b30ffac016f729873 Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 16:44:55 +0100 Subject: [PATCH 6/9] Extract new processor macro --- src/lib.rs | 33 ++++++++++++++++--------- tests/testsuite/helpers.rs | 12 +-------- tests/testsuite/program_test_context.rs | 3 +-- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1a664b6..c55e94f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,17 +7,26 @@ pub use solana_program_test::tokio; pub use solana_program_test::*; #[macro_export] -macro_rules! processor { - ($process_instruction:expr) => { - Some( - |first_instruction_account: usize, - invoke_context: &mut solana_program_test::InvokeContext| { - $crate::builtin_process_instruction( - $process_instruction, - first_instruction_account, - invoke_context, - ) - }, - ) +macro_rules! correct_entry { + ($correct_entry:ident, $entry:path) => { + fn $correct_entry( + program_id: &solana_program::pubkey::Pubkey, + accounts: &[solana_program::account_info::AccountInfo], + data: &[u8], + ) -> solana_program::entrypoint::ProgramResult { + $entry( + program_id, + unsafe { &*(accounts as *const [solana_program::account_info::AccountInfo]) }, + data, + ) + } }; } + +#[macro_export] +macro_rules! processor { + ($entry:path) => {{ + $crate::correct_entry!(__correct_entry, $entry); + solana_program_test::processor!(__correct_entry) + }}; +} diff --git a/tests/testsuite/helpers.rs b/tests/testsuite/helpers.rs index 4690fcf..885aa75 100644 --- a/tests/testsuite/helpers.rs +++ b/tests/testsuite/helpers.rs @@ -6,24 +6,14 @@ use solana_sdk::{ signature::{Keypair, Signer}, }; -use solana_program::account_info::AccountInfo; -use solana_program::entrypoint::ProgramResult; use std::str::FromStr; -pub fn correct_entry(program_id: &Pubkey, accounts: &[AccountInfo], data: &[u8]) -> ProgramResult { - program_for_tests::entry( - program_id, - unsafe { &*(accounts as *const [AccountInfo]) }, - data, - ) -} - pub fn add_program() -> (ProgramTest, Pubkey) { let program_id = Pubkey::from_str("CwrqeMj2U8tFr1Rhkgwc84tpAsqbt9pTt2a4taoTADPr").unwrap(); let program = ProgramTest::new( "program_for_tests", program_id, - solana_program_test::processor!(correct_entry), + processor!(program_for_tests::entry), ); (program, program_id) diff --git a/tests/testsuite/program_test_context.rs b/tests/testsuite/program_test_context.rs index 6e85f5c..18b7e8a 100644 --- a/tests/testsuite/program_test_context.rs +++ b/tests/testsuite/program_test_context.rs @@ -4,7 +4,6 @@ use solana_sdk::{pubkey::Pubkey, sysvar::clock::Clock}; use std::str::FromStr; -use crate::helpers::correct_entry; #[cfg(feature = "pyth")] use pyth_sdk_solana::state::{PriceInfo, PriceStatus, SolanaPriceAccount}; @@ -14,7 +13,7 @@ async fn transaction_from_instructions() { let program = ProgramTest::new( "program_for_tests", program_id, - solana_program_test::processor!(correct_entry), + processor!(program_for_tests::entry), ); let mut program_context = program.start_with_context().await; From b2553e62e4adb9c205d963a6004f07684a417cee Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 16:48:14 +0100 Subject: [PATCH 7/9] Fix create_associated_token_account for spl_token_2022::ID --- src/extensions/client/banks_client.rs | 3 ++- src/extensions/client/mod.rs | 2 +- src/extensions/client/rpc_client.rs | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/extensions/client/banks_client.rs b/src/extensions/client/banks_client.rs index b1ba846..6756d69 100644 --- a/src/extensions/client/banks_client.rs +++ b/src/extensions/client/banks_client.rs @@ -168,7 +168,8 @@ impl ClientExtensions for BanksClient { token_program_id: &Pubkey, ) -> Result> { let latest_blockhash = self.get_latest_blockhash().await?; - let associated_token_account = get_associated_token_address(account, mint); + let associated_token_account = + get_associated_token_address_with_program_id(account, mint, token_program_id); let ix = create_associated_token_account_ix(&payer.pubkey(), account, mint, token_program_id); diff --git a/src/extensions/client/mod.rs b/src/extensions/client/mod.rs index 6cbfc1a..050b7b2 100644 --- a/src/extensions/client/mod.rs +++ b/src/extensions/client/mod.rs @@ -11,7 +11,7 @@ use solana_sdk::{ transaction::Transaction, }; use spl_associated_token_account::{ - get_associated_token_address, + get_associated_token_address_with_program_id, instruction::create_associated_token_account as create_associated_token_account_ix, }; diff --git a/src/extensions/client/rpc_client.rs b/src/extensions/client/rpc_client.rs index 49909a8..c1b6578 100644 --- a/src/extensions/client/rpc_client.rs +++ b/src/extensions/client/rpc_client.rs @@ -165,7 +165,8 @@ impl ClientExtensions for RpcClient { payer: &Keypair, token_program_id: &Pubkey, ) -> Result> { - let associated_token_account = get_associated_token_address(account, mint); + let associated_token_account = + get_associated_token_address_with_program_id(account, mint, token_program_id); let tx = self .transaction_from_instructions( From 727a0c6aeb615cab8fc1e02da23aedd67aff2f93 Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Wed, 14 Aug 2024 16:59:04 +0100 Subject: [PATCH 8/9] Fix add_empty_account_with_anchor for future Anchor versions (https://github.com/coral-xyz/anchor/pull/3163) --- src/extensions/program_test.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extensions/program_test.rs b/src/extensions/program_test.rs index deb1f49..f81779d 100644 --- a/src/extensions/program_test.rs +++ b/src/extensions/program_test.rs @@ -180,7 +180,7 @@ impl ProgramTestExtension for ProgramTest { anchor_data: T, executable: bool, ) { - let discriminator = &T::discriminator(); + let discriminator = &T::DISCRIMINATOR; let data = anchor_data .try_to_vec() .expect("Cannot serialize provided anchor account"); @@ -190,7 +190,7 @@ impl ProgramTestExtension for ProgramTest { self.add_account_with_data(pubkey, owner, &v, executable); } - //Note that the total size is 8 (disciminator) + size + //Note that the total size is 8 (discriminator) + size #[cfg(feature = "anchor")] fn add_empty_account_with_anchor( &mut self, @@ -198,7 +198,7 @@ impl ProgramTestExtension for ProgramTest { owner: Pubkey, size: usize, ) { - let discriminator = &T::discriminator(); + let discriminator = &T::DISCRIMINATOR; let data = vec![0_u8; size]; let mut v = Vec::new(); v.extend_from_slice(discriminator); From 4d6b28908d584324960f75db1dbc2a1f79938b4b Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Thu, 15 Aug 2024 14:36:55 +0100 Subject: [PATCH 9/9] Use futures crate less --- src/extensions/client/banks_client.rs | 34 ++++++++++++++------------- src/extensions/client/mod.rs | 1 - 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/extensions/client/banks_client.rs b/src/extensions/client/banks_client.rs index 6756d69..fd3d6cb 100644 --- a/src/extensions/client/banks_client.rs +++ b/src/extensions/client/banks_client.rs @@ -26,28 +26,30 @@ impl ClientExtensions for BanksClient { &mut self, address: Pubkey, ) -> Result> { - self.get_account(address) - .map(|result| { - let account = result?.ok_or(BanksClientError::ClientError("Account not found"))?; - T::try_deserialize(&mut account.data.as_ref()) - .map_err(|_| BanksClientError::ClientError("Failed to deserialize account")) - }) - .await - .map_err(Into::into) + let account = self + .get_account(address) + .await? + .ok_or(BanksClientError::ClientError("Account not found"))?; + T::try_deserialize(&mut account.data.as_ref()).map_err(|_| { + Into::into(BanksClientError::ClientError( + "Failed to deserialize account", + )) + }) } async fn get_account_with_borsh( &mut self, address: Pubkey, ) -> Result> { - self.get_account(address) - .map(|result| { - let account = result?.ok_or(BanksClientError::ClientError("Account not found"))?; - T::deserialize(&mut account.data.as_ref()) - .map_err(|_| BanksClientError::ClientError("Failed to deserialize account")) - }) - .await - .map_err(Into::into) + let account = self + .get_account(address) + .await? + .ok_or(BanksClientError::ClientError("Account not found"))?; + T::deserialize(&mut account.data.as_ref()).map_err(|_| { + Into::into(BanksClientError::ClientError( + "Failed to deserialize account", + )) + }) } #[cfg(feature = "pyth")] diff --git a/src/extensions/client/mod.rs b/src/extensions/client/mod.rs index 050b7b2..106dcd5 100644 --- a/src/extensions/client/mod.rs +++ b/src/extensions/client/mod.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; use borsh::BorshDeserialize; -use futures::FutureExt; use solana_program::{bpf_loader_upgradeable, program_pack::Pack}; use solana_sdk::{ instruction::Instruction,