diff --git a/Cargo.lock b/Cargo.lock index 77f2ee597..e11b65ae0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1309,7 +1309,7 @@ dependencies = [ "conjunto-addresses", "conjunto-core", "conjunto-providers", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=4af7f1c)", "serde", "solana-rpc-client", "solana-rpc-client-api", @@ -3920,7 +3920,7 @@ dependencies = [ "magicblock-committor-service", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-metrics", "magicblock-mutator", "magicblock-processor", @@ -3988,7 +3988,7 @@ dependencies = [ "magicblock-committor-service", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-geyser-plugin", "magicblock-ledger", "magicblock-metrics", @@ -4004,7 +4004,7 @@ dependencies = [ "solana-rpc", "solana-rpc-client", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "tempfile", "thiserror 1.0.69", "tokio", @@ -4044,7 +4044,7 @@ dependencies = [ "solana-program-runtime", "solana-rpc", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-svm-transaction", "solana-system-program", "solana-timings", @@ -4082,7 +4082,7 @@ dependencies = [ "lazy_static", "log", "magicblock-committor-program", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-rpc-client", "magicblock-table-mania", "rusqlite", @@ -4159,6 +4159,22 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "magicblock-delegation-program" +version = "1.0.0" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf#9570abf24ab6d03ba75ecdbf8a6a787bb0d69d3a" +dependencies = [ + "bincode", + "borsh 1.5.7", + "bytemuck", + "num_enum", + "paste", + "solana-curve25519", + "solana-program", + "solana-security-txt", + "thiserror 1.0.69", +] + [[package]] name = "magicblock-geyser-plugin" version = "0.1.7" @@ -4210,7 +4226,7 @@ dependencies = [ "solana-metrics", "solana-sdk", "solana-storage-proto 0.1.7", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-timings", "solana-transaction-status", "tempfile", @@ -4275,7 +4291,7 @@ dependencies = [ "solana-metrics", "solana-rayon-threadlimit", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-timings", "spl-token", "spl-token-2022 6.0.0", @@ -4413,7 +4429,7 @@ dependencies = [ "log", "magicblock-bank", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-transaction-status", ] @@ -4441,7 +4457,7 @@ dependencies = [ "log", "magicblock-accounts", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-program", "magicblock-rpc-client", "solana-rpc-client", @@ -6701,7 +6717,7 @@ dependencies = [ [[package]] name = "solana-account" version = "2.2.1" -source = "git+https://github.com/magicblock-labs/solana-account.git?rev=176540a#176540ae8445a3161b2e8d5ab97a4d48bab35679" +source = "git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c#121f23c8e7d26272ed0d9b432de5d181ce8c13d0" dependencies = [ "bincode", "qualifier_attr", @@ -6929,7 +6945,7 @@ dependencies = [ "solana-runtime-transaction", "solana-sdk", "solana-send-transaction-service", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git)", + "solana-svm", "tarpc", "tokio", "tokio-serde", @@ -7988,7 +8004,7 @@ dependencies = [ "solana-stake-program", "solana-storage-bigtable", "solana-storage-proto 2.2.1", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git)", + "solana-svm", "solana-svm-transaction", "solana-timings", "solana-transaction-status", @@ -8573,7 +8589,7 @@ dependencies = [ "solana-sbpf", "solana-sdk", "solana-sdk-ids", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git)", + "solana-svm", "solana-timings", "solana-vote-program", "thiserror 2.0.12", @@ -8818,7 +8834,7 @@ dependencies = [ "solana-stake-program", "solana-storage-bigtable", "solana-streamer", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git)", + "solana-svm", "solana-tpu-client", "solana-transaction-status", "solana-version", @@ -8985,7 +9001,7 @@ dependencies = [ "solana-runtime-transaction", "solana-sdk", "solana-stake-program", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git)", + "solana-svm", "solana-svm-rent-collector", "solana-svm-transaction", "solana-timings", @@ -9534,7 +9550,7 @@ dependencies = [ [[package]] name = "solana-svm" version = "2.2.1" -source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57#e93eb579767770c8a0f872117676c289a2164e87" +source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=0968d56#0968d5682b2759884002dc44810d29526e93396b" dependencies = [ "ahash 0.8.12", "log", @@ -9564,49 +9580,7 @@ dependencies = [ "solana-pubkey", "solana-rent", "solana-rent-debits", - "solana-sdk", - "solana-sdk-ids", - "solana-svm-rent-collector", - "solana-svm-transaction", - "solana-timings", - "solana-transaction-context", - "solana-transaction-error", - "solana-type-overrides", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-svm" -version = "2.2.1" -source = "git+https://github.com/magicblock-labs/magicblock-svm.git#e93eb579767770c8a0f872117676c289a2164e87" -dependencies = [ - "ahash 0.8.12", - "log", - "percentage", - "serde", - "serde_derive", - "solana-account", - "solana-bpf-loader-program", - "solana-clock", - "solana-compute-budget", - "solana-compute-budget-instruction", - "solana-feature-set", - "solana-fee-structure", - "solana-hash", - "solana-instruction", - "solana-instructions-sysvar", - "solana-loader-v4-program", - "solana-log-collector", - "solana-measure", - "solana-message", - "solana-nonce", - "solana-nonce-account", - "solana-precompiles", - "solana-program", - "solana-program-runtime", - "solana-pubkey", - "solana-rent", - "solana-rent-debits", + "solana-reserved-account-keys", "solana-sdk", "solana-sdk-ids", "solana-svm-rent-collector", @@ -10935,7 +10909,7 @@ dependencies = [ "solana-geyser-plugin-manager", "solana-rpc-client", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-timings", "tempfile", "test-tools-core", @@ -10948,7 +10922,7 @@ version = "0.1.7" dependencies = [ "env_logger 0.11.8", "log", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c99c9e1c5..32116d486 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -118,7 +118,7 @@ magicblock-config = { path = "./magicblock-config" } magicblock-config-helpers = { path = "./magicblock-config-helpers" } magicblock-config-macro = { path = "./magicblock-config-macro" } magicblock-core = { path = "./magicblock-core" } -magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "4af7f1c" } +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "9570abf", features = ["no-entrypoint"] } magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain-program.git", rev = "ea04d46", default-features = false } magicblock-geyser-plugin = { path = "./magicblock-geyser-plugin" } magicblock-ledger = { path = "./magicblock-ledger" } @@ -155,7 +155,7 @@ serde = "1.0.217" serde_derive = "1.0" serde_json = "1.0" sha3 = "0.10.8" -solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "176540a" } +solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "121f23c" } solana-accounts-db = { version = "2.2" } solana-account-decoder = { version = "2.2" } solana-address-lookup-table-program = { version = "2.2" } @@ -181,9 +181,7 @@ solana-rpc = "2.2" solana-rpc-client = { version = "2.2" } solana-rpc-client-api = { version = "2.2" } solana-sdk = { version = "2.2" } -solana-svm = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "e93eb57", features = [ - "dev-context-only-utils", -] } +solana-svm = { version = "2.2", features = ["dev-context-only-utils"] } solana-svm-transaction = { version = "2.2" } solana-storage-proto = { path = "storage-proto" } solana-system-program = { version = "2.2" } @@ -218,6 +216,6 @@ vergen = "8.3.1" # some solana dependencies have solana-storage-proto as dependency # we need to patch them with our version, because they use protobuf-src v1.1.0 # and we use protobuf-src v2.1.1. Otherwise compilation fails -solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "176540a" } -solana-storage-proto = { path = "./storage-proto" } -solana-svm = { git = "https://github.com/magicblock-labs/magicblock-svm.git" } +solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "121f23c" } +solana-svm = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "0968d56" } +solana-storage-proto = { path = "./storage-proto" } \ No newline at end of file diff --git a/magicblock-account-cloner/src/remote_account_cloner_worker.rs b/magicblock-account-cloner/src/remote_account_cloner_worker.rs index 11fd4ff7f..a58e24d3d 100644 --- a/magicblock-account-cloner/src/remote_account_cloner_worker.rs +++ b/magicblock-account-cloner/src/remote_account_cloner_worker.rs @@ -103,6 +103,7 @@ pub struct RemoteAccountClonerWorker { changeset_committor: Option>, allowed_program_ids: Option>, blacklisted_accounts: HashSet, + #[allow(dead_code)] validator_charges_fees: ValidatorCollectionMode, permissions: AccountClonerPermissions, fetch_retries: u64, @@ -392,7 +393,7 @@ where None => { // If we never cloned the account before, we can't use the cache match self.internal_account_provider.get_account(pubkey) { - Some(acc) if acc.is_delegated() => { + Some(acc) if acc.delegated() => { let res = self .do_clone_and_update_cache( pubkey, @@ -570,84 +571,14 @@ where let lamports = max(self.clone_config.auto_airdrop_lamports, *lamports); self.track_not_delegated_account(*pubkey).await?; - match self.validator_charges_fees { - ValidatorCollectionMode::NoFees => self - .do_clone_undelegated_account( - pubkey, - // TODO(GabrielePicco): change account fetching to return the account - &Account { - lamports, - owner: *owner, - ..Default::default() - }, - )?, - ValidatorCollectionMode::Fees => { - // Fetch the associated escrowed account - let escrowed_snapshot = match self - .try_fetch_feepayer_chain_snapshot(pubkey, None) - .await? - { - Some(snapshot) => snapshot, - None => { - return Ok(AccountClonerOutput::Unclonable { - pubkey: *pubkey, - reason: AccountClonerUnclonableReason::DoesNotHaveEscrowAccount, - at_slot: account_chain_snapshot.at_slot, - }); - } - }; - - let escrowed_account = match escrowed_snapshot - .chain_state - .account() - { - Some(account) => account, - None => { - return Ok(AccountClonerOutput::Unclonable { - pubkey: *pubkey, - reason: AccountClonerUnclonableReason::DoesNotHaveDelegatedEscrowAccount, - at_slot: escrowed_snapshot.at_slot, - }); - } - }; - - // Add the escrowed account as unclonable. - // Fail cloning if the account is already present. - // This prevents escrow PDA from being cloned if the lamports are mapped to the feepayer. - { - let mut last_clone_output = self - .last_clone_output - .write() - .expect("RwLock of RemoteAccountClonerWorker.last_clone_output is poisoned"); - - match last_clone_output - .entry(escrowed_snapshot.pubkey) - { - Entry::Occupied(_) => { - return Ok(AccountClonerOutput::Unclonable { - pubkey: *pubkey, - reason: AccountClonerUnclonableReason::DoesNotAllowFeepayerWithEscrowedPda, - at_slot: account_chain_snapshot.at_slot, - }); - } - Entry::Vacant(entry) => { - entry.insert(AccountClonerOutput::Unclonable { - pubkey: escrowed_snapshot.pubkey, - reason: AccountClonerUnclonableReason::DoesNotAllowEscrowedPda, - at_slot: Slot::MAX, - }); - } - } - } - - self.do_clone_feepayer_account( - pubkey, - escrowed_account.lamports, - owner, - Some(&escrowed_snapshot.pubkey), - )? - } - } + self.do_clone_undelegated_account( + pubkey, + &Account { + lamports, + owner: *owner, + ..Default::default() + }, + )? } // If the account is present on-chain, but not delegated, it's just readonly data // We need to differenciate between programs and other accounts @@ -785,6 +716,7 @@ where }) } + #[allow(dead_code)] fn do_clone_feepayer_account( &self, pubkey: &Pubkey, @@ -980,6 +912,7 @@ where .map_err(AccountClonerError::AccountFetcherError) } + #[allow(dead_code)] async fn try_fetch_feepayer_chain_snapshot( &self, feepayer: &Pubkey, diff --git a/magicblock-api/src/fund_account.rs b/magicblock-api/src/fund_account.rs index f30a27e3a..7dad302f3 100644 --- a/magicblock-api/src/fund_account.rs +++ b/magicblock-api/src/fund_account.rs @@ -48,6 +48,14 @@ pub(crate) fn fund_account_with_data( pub(crate) fn fund_validator_identity(bank: &Bank, validator_id: &Pubkey) { fund_account(bank, validator_id, u64::MAX / 2); + + // Ensure the account exists and mark it as delegated + if let Some(mut account) = bank.get_account(validator_id) { + account.set_delegated(true); + bank.store_account(*validator_id, account); + } else { + panic!("Validator identity {validator_id} should exist in the bank"); + } } /// Funds the faucet account. diff --git a/magicblock-committor-service/src/undelegate.rs b/magicblock-committor-service/src/undelegate.rs index 7064d5163..d394e748b 100644 --- a/magicblock-committor-service/src/undelegate.rs +++ b/magicblock-committor-service/src/undelegate.rs @@ -2,7 +2,6 @@ use std::collections::HashMap; use dlp::state::DelegationMetadata; use magicblock_rpc_client::MagicblockRpcClient; -use solana_account::ReadableAccount; use solana_pubkey::Pubkey; use solana_sdk::instruction::Instruction; @@ -43,7 +42,7 @@ pub(crate) async fn undelegate_commitables_ixs( ); }; let metadata = DelegationMetadata::try_from_bytes_with_discriminator( - metadata_acc.data(), + &metadata_acc.data, ) .map_err(|err| { CommittorServiceError::FailedToDeserializeDelegationMetadata( diff --git a/test-integration/Cargo.lock b/test-integration/Cargo.lock index baeb59aa4..163335cbc 100644 --- a/test-integration/Cargo.lock +++ b/test-integration/Cargo.lock @@ -1191,7 +1191,7 @@ dependencies = [ "conjunto-addresses", "conjunto-core", "conjunto-providers", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=4af7f1c)", "serde", "solana-rpc-client", "solana-rpc-client-api", @@ -3029,7 +3029,7 @@ dependencies = [ "log", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "rayon", "serde", "solana-pubkey", @@ -3676,7 +3676,7 @@ dependencies = [ "magicblock-bank", "magicblock-committor-service", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-metrics", "magicblock-mutator", "magicblock-processor", @@ -3710,7 +3710,7 @@ dependencies = [ "parking_lot 0.12.4", "reflink-copy", "serde", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-pubkey", "tempfile", "thiserror 1.0.69", @@ -3741,7 +3741,7 @@ dependencies = [ "magicblock-committor-service", "magicblock-config", "magicblock-core", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-geyser-plugin", "magicblock-ledger", "magicblock-metrics", @@ -3757,7 +3757,7 @@ dependencies = [ "solana-rpc", "solana-rpc-client", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "tempfile", "thiserror 1.0.69", "tokio", @@ -3792,7 +3792,7 @@ dependencies = [ "solana-program-runtime", "solana-rpc", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-svm-transaction", "solana-system-program", "solana-timings", @@ -3808,7 +3808,7 @@ dependencies = [ "borsh-derive 1.5.7", "log", "paste", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-program", "solana-pubkey", "thiserror 1.0.69", @@ -3824,11 +3824,11 @@ dependencies = [ "borsh 1.5.7", "log", "magicblock-committor-program", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-rpc-client", "magicblock-table-mania", "rusqlite", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-pubkey", "solana-rpc-client", "solana-rpc-client-api", @@ -3896,6 +3896,22 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "magicblock-delegation-program" +version = "1.0.0" +source = "git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf#9570abf24ab6d03ba75ecdbf8a6a787bb0d69d3a" +dependencies = [ + "bincode", + "borsh 1.5.7", + "bytemuck", + "num_enum", + "paste", + "solana-curve25519", + "solana-program", + "solana-security-txt", + "thiserror 1.0.69", +] + [[package]] name = "magicblock-geyser-plugin" version = "0.1.7" @@ -3947,7 +3963,7 @@ dependencies = [ "solana-metrics", "solana-sdk", "solana-storage-proto 0.1.7", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-timings", "solana-transaction-status", "thiserror 1.0.69", @@ -4006,7 +4022,7 @@ dependencies = [ "solana-metrics", "solana-rayon-threadlimit", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-timings", "spl-token", "spl-token-2022 6.0.0", @@ -4139,7 +4155,7 @@ dependencies = [ "log", "magicblock-bank", "solana-sdk", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", "solana-transaction-status", ] @@ -4151,7 +4167,7 @@ dependencies = [ "log", "magicblock-accounts", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-program", "magicblock-rpc-client", "solana-rpc-client", @@ -5083,6 +5099,7 @@ version = "0.0.0" dependencies = [ "borsh 1.5.7", "ephemeral-rollups-sdk", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "solana-program", ] @@ -5927,10 +5944,10 @@ dependencies = [ "log", "magicblock-committor-program", "magicblock-committor-service", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-rpc-client", "program-flexi-counter", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=9a62efa)", "solana-pubkey", "solana-rpc-client", "solana-rpc-client-api", @@ -6333,7 +6350,25 @@ dependencies = [ [[package]] name = "solana-account" version = "2.2.1" -source = "git+https://github.com/magicblock-labs/solana-account.git?rev=176540a#176540ae8445a3161b2e8d5ab97a4d48bab35679" +source = "git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c#121f23c8e7d26272ed0d9b432de5d181ce8c13d0" +dependencies = [ + "bincode", + "qualifier_attr", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-sysvar", +] + +[[package]] +name = "solana-account" +version = "2.2.1" +source = "git+https://github.com/magicblock-labs/solana-account.git?rev=9a62efa#9a62efad44190731c3dc83716e7b8cbe70ff8a62" dependencies = [ "bincode", "qualifier_attr", @@ -6363,7 +6398,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-account-decoder-client-types", "solana-clock", "solana-config-program", @@ -6398,7 +6433,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-pubkey", "zstd", ] @@ -6601,7 +6636,7 @@ dependencies = [ "libsecp256k1", "qualifier_attr", "scopeguard", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-account-info", "solana-big-mod-exp", "solana-bincode", @@ -6766,7 +6801,7 @@ dependencies = [ "log", "quinn", "rayon", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-client-traits", "solana-commitment-config", "solana-connection-cache", @@ -6802,7 +6837,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83f0071874e629f29e0eb3dab8a863e98502ac7aba55b7e0df1803fc5cac72a7" dependencies = [ - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-commitment-config", "solana-epoch-info", "solana-hash", @@ -6915,7 +6950,7 @@ dependencies = [ "chrono", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bincode", "solana-instruction", "solana-log-collector", @@ -7189,7 +7224,7 @@ dependencies = [ "bincode", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-account-info", "solana-instruction", "solana-program-error", @@ -7269,7 +7304,7 @@ dependencies = [ "memmap2 0.5.10", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-clock", "solana-cluster-type", "solana-epoch-schedule", @@ -7303,7 +7338,7 @@ dependencies = [ "libloading 0.7.4", "log", "serde_json", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-accounts-db", "solana-clock", "solana-entry", @@ -7569,7 +7604,7 @@ dependencies = [ "solana-stake-program", "solana-storage-bigtable", "solana-storage-proto 2.2.1", - "solana-svm 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-svm", "solana-svm-transaction", "solana-timings", "solana-transaction-status", @@ -7640,7 +7675,7 @@ checksum = "81b24999844b09096c79567c1298617efe084860149d875b702ef76e2faa2462" dependencies = [ "log", "qualifier_attr", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bincode", "solana-bpf-loader-program", "solana-compute-budget", @@ -7799,7 +7834,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde971a20b8dbf60144d6a84439dda86b5466e00e2843091fe731083cda614da" dependencies = [ - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-hash", "solana-nonce", "solana-sdk-ids", @@ -8097,7 +8132,7 @@ dependencies = [ "percentage", "rand 0.8.5", "serde", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-clock", "solana-compute-budget", "solana-epoch-rewards", @@ -8273,7 +8308,7 @@ checksum = "7c1e19f5d5108b0d824244425e43bc78bbb9476e2199e979b0230c9f632d3bf4" dependencies = [ "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-clock", "solana-epoch-schedule", "solana-genesis-config", @@ -8362,7 +8397,7 @@ dependencies = [ "solana-stake-program", "solana-storage-bigtable", "solana-streamer", - "solana-svm 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-svm", "solana-tpu-client", "solana-transaction-status", "solana-version", @@ -8394,7 +8429,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-account-decoder-client-types", "solana-clock", "solana-commitment-config", @@ -8430,7 +8465,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-account-decoder-client-types", "solana-clock", "solana-commitment-config", @@ -8451,7 +8486,7 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0244e2bf439ec424179414173cdc8b43e34371608752799c5610bf17430eee18" dependencies = [ - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-commitment-config", "solana-hash", "solana-message", @@ -8529,7 +8564,7 @@ dependencies = [ "solana-runtime-transaction", "solana-sdk", "solana-stake-program", - "solana-svm 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-svm", "solana-svm-rent-collector", "solana-svm-transaction", "solana-timings", @@ -8604,7 +8639,7 @@ dependencies = [ "js-sys", "serde", "serde_json", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bn254", "solana-client-traits", "solana-cluster-type", @@ -8924,7 +8959,7 @@ checksum = "dabc713c25ff999424ec68ac4572f2ff6bfd6317922c7864435ccaf9c76504a8" dependencies = [ "bincode", "log", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bincode", "solana-clock", "solana-config-program", @@ -9077,52 +9112,7 @@ dependencies = [ [[package]] name = "solana-svm" version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850baf834aba4a94a7558fa6cf6ca93fad284abf0363dec5fb9cab173a11fc4" -dependencies = [ - "ahash 0.8.12", - "itertools 0.12.1", - "log", - "percentage", - "serde", - "serde_derive", - "solana-account", - "solana-bpf-loader-program", - "solana-clock", - "solana-compute-budget", - "solana-compute-budget-instruction", - "solana-feature-set", - "solana-fee-structure", - "solana-hash", - "solana-instruction", - "solana-instructions-sysvar", - "solana-loader-v4-program", - "solana-log-collector", - "solana-measure", - "solana-message", - "solana-nonce", - "solana-nonce-account", - "solana-precompiles", - "solana-program", - "solana-program-runtime", - "solana-pubkey", - "solana-rent", - "solana-rent-debits", - "solana-sdk", - "solana-sdk-ids", - "solana-svm-rent-collector", - "solana-svm-transaction", - "solana-timings", - "solana-transaction-context", - "solana-transaction-error", - "solana-type-overrides", - "thiserror 2.0.12", -] - -[[package]] -name = "solana-svm" -version = "2.2.1" -source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57#e93eb579767770c8a0f872117676c289a2164e87" +source = "git+https://github.com/magicblock-labs/magicblock-svm.git?rev=0968d56#0968d5682b2759884002dc44810d29526e93396b" dependencies = [ "ahash 0.8.12", "log", @@ -9130,7 +9120,7 @@ dependencies = [ "qualifier_attr", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bpf-loader-program", "solana-clock", "solana-compute-budget", @@ -9152,6 +9142,7 @@ dependencies = [ "solana-pubkey", "solana-rent", "solana-rent-debits", + "solana-reserved-account-keys", "solana-sdk", "solana-sdk-ids", "solana-svm-rent-collector", @@ -9212,7 +9203,7 @@ dependencies = [ "log", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bincode", "solana-instruction", "solana-log-collector", @@ -9299,7 +9290,7 @@ dependencies = [ "bincode", "log", "rayon", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-client-traits", "solana-clock", "solana-commitment-config", @@ -9420,7 +9411,7 @@ dependencies = [ "bincode", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-instruction", "solana-pubkey", "solana-rent", @@ -9589,7 +9580,7 @@ dependencies = [ "log", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bincode", "solana-clock", "solana-hash", @@ -9640,7 +9631,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-account", + "solana-account 2.2.1 (git+https://github.com/magicblock-labs/solana-account.git?rev=121f23c)", "solana-bincode", "solana-clock", "solana-epoch-schedule", @@ -10369,6 +10360,20 @@ dependencies = [ "test-tools-core", ] +[[package]] +name = "test-fees" +version = "0.0.0" +dependencies = [ + "anyhow", + "ephemeral-rollups-sdk", + "integration-test-tools", + "log", + "program-schedulecommit", + "solana-rpc-client-api", + "solana-sdk", + "test-tools-core", +] + [[package]] name = "test-issues" version = "0.0.0" @@ -10405,7 +10410,7 @@ dependencies = [ "magic-domain-program", "magicblock-api", "magicblock-config", - "magicblock-delegation-program", + "magicblock-delegation-program 1.0.0 (git+https://github.com/magicblock-labs/delegation-program.git?rev=9570abf)", "magicblock-program", "magicblock-validator-admin", "solana-rpc-client", @@ -10457,7 +10462,7 @@ version = "0.1.7" dependencies = [ "env_logger 0.11.8", "log", - "solana-svm 2.2.1 (git+https://github.com/magicblock-labs/magicblock-svm.git?rev=e93eb57)", + "solana-svm", ] [[package]] diff --git a/test-integration/Cargo.toml b/test-integration/Cargo.toml index d518ba188..f0d764489 100644 --- a/test-integration/Cargo.toml +++ b/test-integration/Cargo.toml @@ -13,6 +13,7 @@ members = [ "test-ledger-restore", "test-magicblock-api", "test-runner", + "test-fees", "test-table-mania", "test-tools", "test-pubsub", @@ -43,7 +44,7 @@ magicblock-core = { path = "../magicblock-core" } magicblock-committor-program = { path = "../magicblock-committor-program", features = [ "no-entrypoint", ] } -magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "4af7f1c" } +magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "9570abf", features = ["no-entrypoint"] } magicblock-committor-service = { path = "../magicblock-committor-service" } magicblock-rpc-client = { path = "../magicblock-rpc-client" } magicblock-table-mania = { path = "../magicblock-table-mania" } @@ -54,7 +55,7 @@ program-schedulecommit-security = { path = "programs/schedulecommit-security" } rayon = "1.10.0" schedulecommit-client = { path = "schedulecommit/client" } serde = "1.0.217" -solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "176540a" } +solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "9a62efa" } solana-program = "2.2" solana-program-test = "2.2" solana-pubkey = { version = "2.2" } @@ -77,4 +78,5 @@ tokio = "1.0" # and we use protobuf-src v2.1.1. Otherwise compilation fails solana-storage-proto = { path = "../storage-proto" } # same reason as above -solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "176540a" } +solana-account = { git = "https://github.com/magicblock-labs/solana-account.git", rev = "121f23c" } +solana-svm = { git = "https://github.com/magicblock-labs/magicblock-svm.git", rev = "0968d56" } diff --git a/test-integration/configs/charge-fees.ephem.toml b/test-integration/configs/charge-fees.ephem.toml new file mode 100644 index 000000000..319244542 --- /dev/null +++ b/test-integration/configs/charge-fees.ephem.toml @@ -0,0 +1,33 @@ +[accounts] +remote.url = "http://0.0.0.0:7799" +lifecycle = "ephemeral" + +[accounts.db] +# size of the main storage, we have to preallocate in advance +# it's advised to set this value based on formula 1KB * N * 3, +# where N is the number of accounts expected to be stored in +# database, e.g. for million accounts this would be 3GB +db-size = 1048576000 # 1GB +# minimal indivisible unit of addressing in main storage +# offsets are calculated in terms of blocks +block-size = "block256" # possible values block128 | block256 | block512 +# size of index file, we have to preallocate, +# can be as low as 1% of main storage size, but setting it to higher values won't hurt +index-map-size = 2048576 +# max number of snapshots to keep around +max-snapshots = 7 +# how frequently (slot-wise) we should take snapshots +snapshot-frequency = 1024 + +[ledger] +resume-strategy = { kind = "reset" } + +[validator] +base-fees = 5000 + +[rpc] +port = 8899 + +[metrics] +enabled = true +port = 9000 diff --git a/test-integration/configs/run-test-validator.sh b/test-integration/configs/run-test-validator.sh index 23d3be225..f241a6b63 100755 --- a/test-integration/configs/run-test-validator.sh +++ b/test-integration/configs/run-test-validator.sh @@ -16,7 +16,7 @@ solana-test-validator \ 1000000 \ --bpf-program \ CoMtrr6j336NSB5PAoAWpLe5hPgkcShWKbPgHhZxaxh \ - $DIR/../../target/deploy/magicblock_committor_program.so \ \ + $DIR/../../target/deploy/magicblock_committor_program.so \ --bpf-program \ DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh \ $DIR/../schedulecommit/elfs/dlp.so \ @@ -25,5 +25,4 @@ solana-test-validator \ $DIR/../target/deploy/program_schedulecommit.so \ --bpf-program \ 4RaQH3CUBMSMQsSHPVaww2ifeNEEuaDZjF9CUdFwr3xr \ - $DIR/../target/deploy/program_schedulecommit_security.so - + $DIR/../target/deploy/program_schedulecommit_security.so \ No newline at end of file diff --git a/test-integration/programs/schedulecommit/Cargo.toml b/test-integration/programs/schedulecommit/Cargo.toml index 04de1f1fb..ee96ba272 100644 --- a/test-integration/programs/schedulecommit/Cargo.toml +++ b/test-integration/programs/schedulecommit/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true [dependencies] borsh = { workspace = true } ephemeral-rollups-sdk = { workspace = true } +magicblock-delegation-program = { workspace = true } solana-program = { workspace = true } [lib] diff --git a/test-integration/programs/schedulecommit/src/api.rs b/test-integration/programs/schedulecommit/src/api.rs index a10139e0c..1aa1c54aa 100644 --- a/test-integration/programs/schedulecommit/src/api.rs +++ b/test-integration/programs/schedulecommit/src/api.rs @@ -1,14 +1,10 @@ -use ephemeral_rollups_sdk::{ - consts::BUFFER, - delegate_args::{DelegateAccountMetas, DelegateAccounts}, - pda::{ - delegation_metadata_pda_from_delegated_account, - delegation_record_pda_from_delegated_account, - ephemeral_balance_pda_from_payer, - }, +use dlp::args::DelegateEphemeralBalanceArgs; +use ephemeral_rollups_sdk::delegate_args::{ + DelegateAccountMetas, DelegateAccounts, }; use solana_program::{ instruction::{AccountMeta, Instruction}, + native_token::LAMPORTS_PER_SOL, pubkey::Pubkey, system_program, }; @@ -37,52 +33,19 @@ pub fn init_account_instruction( pub fn init_payer_escrow(payer: Pubkey) -> [Instruction; 2] { // Top-up Ix - let ephemeral_balance_pda = ephemeral_balance_pda_from_payer(&payer, 0); - let top_up_ix = Instruction { - program_id: ephemeral_rollups_sdk::id(), - accounts: vec![ - AccountMeta::new(payer, true), - AccountMeta::new_readonly(payer, false), - AccountMeta::new(ephemeral_balance_pda, false), - AccountMeta::new_readonly(system_program::id(), false), - ], - // discriminator + TopUpEphemeralBalanceArgs from the magicblock-delegation-program - data: [ - vec![9, 0, 0, 0, 0, 0, 0, 0], - vec![0, 163, 225, 17, 0, 0, 0, 0, 0], - ] - .concat(), - }; + let top_up_ix = dlp::instruction_builder::top_up_ephemeral_balance( + payer, + payer, + Some(LAMPORTS_PER_SOL / 3), + None, + ); // Delegate ephemeral balance Ix - let buffer = Pubkey::find_program_address( - &[BUFFER, &ephemeral_balance_pda.to_bytes()], - &ephemeral_rollups_sdk::id(), + let delegate_ix = dlp::instruction_builder::delegate_ephemeral_balance( + payer, + payer, + DelegateEphemeralBalanceArgs::default(), ); - let delegation_record_pda = - delegation_record_pda_from_delegated_account(&ephemeral_balance_pda); - let delegation_metadata_pda = - delegation_metadata_pda_from_delegated_account(&ephemeral_balance_pda); - - let delegate_ix = Instruction { - program_id: ephemeral_rollups_sdk::id(), - accounts: vec![ - AccountMeta::new(payer, true), - AccountMeta::new_readonly(payer, true), - AccountMeta::new(ephemeral_balance_pda, false), - AccountMeta::new(buffer.0, false), - AccountMeta::new(delegation_record_pda, false), - AccountMeta::new(delegation_metadata_pda, false), - AccountMeta::new_readonly(system_program::id(), false), - AccountMeta::new_readonly(ephemeral_rollups_sdk::id(), false), - ], - // discriminator + DelegateEphemeralBalanceArgs from the magicblock-delegation-program - data: [ - vec![10, 0, 0, 0, 0, 0, 0, 0], - vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - ] - .concat(), - }; [top_up_ix, delegate_ix] } diff --git a/test-integration/schedulecommit/elfs/dlp.so b/test-integration/schedulecommit/elfs/dlp.so index 748c0d84b..cdfdf3e2d 100755 Binary files a/test-integration/schedulecommit/elfs/dlp.so and b/test-integration/schedulecommit/elfs/dlp.so differ diff --git a/test-integration/test-fees/Cargo.toml b/test-integration/test-fees/Cargo.toml new file mode 100644 index 000000000..956f13762 --- /dev/null +++ b/test-integration/test-fees/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "test-fees" +version.workspace = true +edition.workspace = true + +[dev-dependencies] +integration-test-tools = { workspace = true } +log = { workspace = true } +test-tools-core = { workspace = true } +solana-rpc-client-api = { workspace = true } +solana-sdk = { workspace = true } +program-schedulecommit = { workspace = true } +ephemeral-rollups-sdk = { workspace = true } +anyhow = { workspace = true } + +[features] +no-entrypoint = [] +cpi = ["no-entrypoint"] +default = [] diff --git a/test-integration/test-fees/tests/01_test_charging_escrow.rs b/test-integration/test-fees/tests/01_test_charging_escrow.rs new file mode 100644 index 000000000..97c4fef57 --- /dev/null +++ b/test-integration/test-fees/tests/01_test_charging_escrow.rs @@ -0,0 +1,99 @@ +use anyhow::Context; +use ephemeral_rollups_sdk::pda::ephemeral_balance_pda_from_payer; +use integration_test_tools::IntegrationTestContext; +use log::*; +use program_schedulecommit::api::init_payer_escrow; +use solana_rpc_client_api::config::RpcSendTransactionConfig; +use solana_sdk::{ + account::ReadableAccount, commitment_config::CommitmentConfig, + compute_budget::ComputeBudgetInstruction, native_token::LAMPORTS_PER_SOL, + signature::Keypair, signer::Signer, transaction::Transaction, +}; +use test_tools_core::init_logger; + +#[test] +fn test_charging_escrow_with_not_delegated_feepayer() { + init_logger!(); + info!("==== test_charging_escrow_with_not_delegated_feepayer ===="); + let ctx = IntegrationTestContext::try_new().unwrap(); + let ephem_client = ctx.try_ephem_client().unwrap(); + let chain_client = ctx.try_chain_client().unwrap(); + let ephem_blockhash = ctx.ephem_blockhash.unwrap(); + + let payer = Keypair::new(); + + // Init and fund the escrow for the payer + assert!(chain_client + .request_airdrop(&payer.pubkey(), LAMPORTS_PER_SOL) + .is_ok()); + let mut ixs = init_payer_escrow(payer.pubkey()).to_vec(); + ixs.push(ComputeBudgetInstruction::set_compute_unit_limit(1_000_000)); + let tx = Transaction::new_signed_with_payer( + &ixs, + Some(&payer.pubkey()), + &[&payer], + ctx.chain_blockhash.unwrap(), + ); + let res_escrow = chain_client + .send_and_confirm_transaction_with_spinner_and_config( + &tx, + CommitmentConfig::confirmed(), + RpcSendTransactionConfig { + skip_preflight: true, + ..Default::default() + }, + ) + .with_context(|| "Failed to escrow fund for payer"); + println!("res_escrow: {res_escrow:?}"); + assert!(res_escrow.is_ok()); + + // Assert the escrow account has been cloned in the ephemeral client + let escrow_pda = ephemeral_balance_pda_from_payer(&payer.pubkey(), 0); + assert!(ephem_client + .request_airdrop(&escrow_pda, LAMPORTS_PER_SOL) + .is_err()); + assert!(ephem_client.get_account(&escrow_pda).unwrap().lamports() > 0); + + // Record initial balances + let init_payer_balance = chain_client + .get_account(&payer.pubkey()) + .map(|a| a.lamports()) + .unwrap_or(0); + let init_escrow_balance = + ephem_client.get_account(&escrow_pda).unwrap().lamports(); + + // Create an arbitrary transaction + let ix = ComputeBudgetInstruction::set_compute_unit_limit(1_000_000); + let tx = Transaction::new_signed_with_payer( + &[ix], + Some(&payer.pubkey()), + &[&payer], + ephem_blockhash, + ); + + let _sig = tx.signatures[0]; + let res = ephem_client + .send_and_confirm_transaction_with_spinner_and_config( + &tx, + ctx.commitment, + RpcSendTransactionConfig { + skip_preflight: true, + ..Default::default() + }, + ); + assert!(res.is_ok()); + + // Record final balances + let final_payer_balance = ephem_client + .get_account(&payer.pubkey()) + .map(|a| a.lamports()) + .unwrap_or(0); + let final_escrow_balance = + ephem_client.get_account(&escrow_pda).unwrap().lamports(); + + // Payer balance should remain the same + assert_eq!(init_payer_balance, final_payer_balance); + + // Fee should be charged from the escrow account + assert_eq!(init_escrow_balance, final_escrow_balance + 5000); +} diff --git a/test-integration/test-runner/bin/run_tests.rs b/test-integration/test-runner/bin/run_tests.rs index 96c16a67d..aee4f53f5 100644 --- a/test-integration/test-runner/bin/run_tests.rs +++ b/test-integration/test-runner/bin/run_tests.rs @@ -44,6 +44,10 @@ pub fn main() { return; }; + let Ok(fees_output) = run_fees_tests(&manifest_dir, &config) else { + return; + }; + let Ok(magicblock_api_output) = run_magicblock_api_tests(&manifest_dir, &config) else { @@ -74,6 +78,7 @@ pub fn main() { "issues_frequent_commits", ); assert_cargo_tests_passed(restore_ledger_output, "restore_ledger"); + assert_cargo_tests_passed(fees_output, "fees"); assert_cargo_tests_passed(magicblock_api_output, "magicblock_api"); assert_cargo_tests_passed(table_mania_output, "table_mania"); assert_cargo_tests_passed(committor_output, "committor"); @@ -458,6 +463,74 @@ fn run_cloning_tests( } } +fn run_fees_tests( + manifest_dir: &str, + config: &TestConfigViaEnvVars, +) -> Result> { + const TEST_NAME: &str = "fees"; + if config.skip_entirely(TEST_NAME) { + return Ok(success_output()); + } + + let loaded_chain_accounts = + LoadedAccounts::with_delegation_program_test_authority(); + + let start_devnet_validator = || match start_validator( + "schedulecommit-conf.devnet.toml", + ValidatorCluster::Chain(None), + &loaded_chain_accounts, + ) { + Some(validator) => validator, + None => { + panic!("Failed to start devnet validator properly"); + } + }; + + let start_ephem_validator = || match start_validator( + "charge-fees.ephem.toml", + ValidatorCluster::Ephem, + &loaded_chain_accounts, + ) { + Some(validator) => validator, + None => { + panic!("Failed to start ephemeral validator properly"); + } + }; + + if config.run_test(TEST_NAME) { + eprintln!("======== RUNNING FEES TESTS ========"); + + let mut devnet_validator = start_devnet_validator(); + let mut ephem_validator = start_ephem_validator(); + + let test_dir = format!("{}/../{}", manifest_dir, "test-fees"); + eprintln!("Running fees tests in {}", test_dir); + + let output = match run_test( + test_dir, + RunTestConfig { + package: Some("test-fees"), + ..Default::default() + }, + ) { + Ok(output) => output, + Err(err) => { + eprintln!("Failed to run fees tests: {:?}", err); + cleanup_validators(&mut ephem_validator, &mut devnet_validator); + return Err(err.into()); + } + }; + cleanup_validators(&mut ephem_validator, &mut devnet_validator); + Ok(output) + } else { + let devnet_validator = + config.setup_devnet(TEST_NAME).then(start_devnet_validator); + let ephem_validator = + config.setup_ephem(TEST_NAME).then(start_ephem_validator); + wait_for_ctrlc(devnet_validator, ephem_validator, success_output()) + } +} + fn run_magicblock_api_tests( manifest_dir: &str, config: &TestConfigViaEnvVars,