diff --git a/token-lending/program/src/lib.rs b/token-lending/program/src/lib.rs index d8e2b2db..48b925d6 100644 --- a/token-lending/program/src/lib.rs +++ b/token-lending/program/src/lib.rs @@ -13,4 +13,4 @@ pub mod state; // Export current sdk types for downstream users building with a different sdk version pub use solana_program; -solana_program::declare_id!("TokenLend1ng1111111111111111111111111111111"); +solana_program::declare_id!("TokenLending1111111111111111111111111111111"); diff --git a/token-lending/program/tests/genesis_accounts.rs b/token-lending/program/tests/genesis_accounts.rs index 393ea96e..6595dbed 100644 --- a/token-lending/program/tests/genesis_accounts.rs +++ b/token-lending/program/tests/genesis_accounts.rs @@ -2,7 +2,6 @@ mod helpers; -use helpers::genesis::GenesisAccounts; use helpers::*; use solana_sdk::signature::Keypair; use spl_token_lending::{ @@ -252,27 +251,31 @@ async fn test_success() { ) .await; - let mut genesis_accounts = GenesisAccounts::default(); - lending_market - .add_to_genesis(&mut banks_client, &mut genesis_accounts) - .await; - sol_reserve - .add_to_genesis(&mut banks_client, &mut genesis_accounts) - .await; - srm_reserve - .add_to_genesis(&mut banks_client, &mut genesis_accounts) - .await; - usdc_reserve - .add_to_genesis(&mut banks_client, &mut genesis_accounts) - .await; - sol_usdc_dex_market - .add_to_genesis(&mut banks_client, &mut genesis_accounts) - .await; - srm_usdc_dex_market - .add_to_genesis(&mut banks_client, &mut genesis_accounts) - .await; - // Only dump the accounts if the feature is specified #[cfg(feature = "test-dump-genesis-accounts")] - genesis_accounts.write_yaml(); + { + use helpers::genesis::GenesisAccounts; + let mut genesis_accounts = GenesisAccounts::default(); + lending_market + .add_to_genesis(&mut banks_client, &mut genesis_accounts) + .await; + sol_reserve + .add_to_genesis(&mut banks_client, &mut genesis_accounts) + .await; + srm_reserve + .add_to_genesis(&mut banks_client, &mut genesis_accounts) + .await; + usdc_reserve + .add_to_genesis(&mut banks_client, &mut genesis_accounts) + .await; + sol_usdc_dex_market + .add_to_genesis(&mut banks_client, &mut genesis_accounts) + .await; + srm_usdc_dex_market + .add_to_genesis(&mut banks_client, &mut genesis_accounts) + .await; + genesis_accounts + .insert_upgradeable_program(spl_token_lending::id(), "spl_token_lending.so"); + genesis_accounts.write_yaml(); + } } diff --git a/token-lending/program/tests/helpers/genesis.rs b/token-lending/program/tests/helpers/genesis.rs index 31a87956..9ecd59bb 100644 --- a/token-lending/program/tests/helpers/genesis.rs +++ b/token-lending/program/tests/helpers/genesis.rs @@ -1,6 +1,12 @@ use serde::{Deserialize, Serialize}; +use solana_program::bpf_loader_upgradeable; use solana_program_test::*; -use solana_sdk::{account::Account, pubkey::Pubkey}; +use solana_sdk::{ + account::Account, + bpf_loader_upgradeable::UpgradeableLoaderState, + pubkey::Pubkey, + signature::{read_keypair_file, Signer}, +}; use std::{collections::HashMap, fs::File, io::Write, path::Path}; /// An account where the data is encoded as a Base64 string. @@ -12,21 +18,68 @@ pub struct Base64Account { pub executable: bool, } +impl From for Base64Account { + fn from(account: Account) -> Self { + Self { + owner: account.owner.to_string(), + balance: account.lamports, + executable: account.executable, + data: base64::encode(&account.data), + } + } +} + #[derive(Default)] pub struct GenesisAccounts(HashMap); impl GenesisAccounts { - pub async fn fetch_and_insert(&mut self, banks_client: &mut BanksClient, pubkey: Pubkey) { - let account: Account = banks_client.get_account(pubkey).await.unwrap().unwrap(); - self.0.insert( - pubkey.to_string(), - Base64Account { - owner: account.owner.to_string(), - balance: u32::MAX as u64, - executable: false, - data: base64::encode(&account.data), + pub fn insert_upgradeable_program(&mut self, program_id: Pubkey, filename: &str) { + let program_file = + find_file(filename).unwrap_or_else(|| panic!("couldn't find {}", filename)); + let program_data = read_file(program_file); + let upgrade_authority_keypair = + read_keypair_file("tests/fixtures/lending_market.json").unwrap(); + + let programdata_address = + Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; + let programdata_data_offset = UpgradeableLoaderState::programdata_data_offset().unwrap(); + let programdata_space = 2 * program_data.len() + programdata_data_offset; + let mut programdata_account = Account::new_data_with_space( + u32::MAX as u64, + &UpgradeableLoaderState::ProgramData { + slot: 0, + upgrade_authority_address: Some(upgrade_authority_keypair.pubkey()), }, - ); + programdata_space, + &bpf_loader_upgradeable::id(), + ) + .unwrap(); + + programdata_account.data + [programdata_data_offset..programdata_data_offset + program_data.len()] + .copy_from_slice(&program_data[..]); + + self.0 + .insert(programdata_address.to_string(), programdata_account.into()); + + let mut program_account = Account::new_data( + u32::MAX as u64, + &UpgradeableLoaderState::Program { + programdata_address, + }, + &bpf_loader_upgradeable::id(), + ) + .unwrap(); + program_account.executable = true; + + self.0 + .insert(program_id.to_string(), program_account.into()); + } + + pub async fn fetch_and_insert(&mut self, banks_client: &mut BanksClient, pubkey: Pubkey) { + let mut account: Account = banks_client.get_account(pubkey).await.unwrap().unwrap(); + account.lamports = u32::MAX as u64; + self.0.insert(pubkey.to_string(), account.into()); } pub fn write_yaml(&self) {