From 1a58df6e51442619b3d2768b2e6371af87666022 Mon Sep 17 00:00:00 2001 From: Gabriele Picco Date: Thu, 20 Nov 2025 09:01:07 +0400 Subject: [PATCH 1/3] feat: persist all accounts --- configs/ephem-devnet.toml | 2 +- magicblock-chainlink/src/chainlink/mod.rs | 33 ++++++++++------------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/configs/ephem-devnet.toml b/configs/ephem-devnet.toml index e1683b38e..a5cef76d1 100644 --- a/configs/ephem-devnet.toml +++ b/configs/ephem-devnet.toml @@ -1,5 +1,5 @@ [accounts] -remote.cluster = "devnet" +remote = { cluster = "custom", url = "https://rpc.magicblock.app/devnet" } lifecycle = "ephemeral" commit = { frequency-millis = 50_000 } diff --git a/magicblock-chainlink/src/chainlink/mod.rs b/magicblock-chainlink/src/chainlink/mod.rs index 5b8606e3a..981a530cb 100644 --- a/magicblock-chainlink/src/chainlink/mod.rs +++ b/magicblock-chainlink/src/chainlink/mod.rs @@ -243,36 +243,30 @@ Kept: {} delegated, {} blacklisted", .copied() .collect::>(); let feepayer = tx.message().fee_payer(); - // In the case of transactions we need to clone the feepayer account - let clone_escrow = { - // If the fee payer account is in the bank we only clone the balance - // escrow account if the fee payer is not delegated - // If it is not in the bank we include it just in case, it is fine - // if it doesn't exist and once we cloned the feepayer account itself - // and it turns out to be delegated, then we will avoid cloning the - // escrow account next time - self.accounts_bank - .get_account(feepayer) - .is_none_or(|a| !a.delegated()) - }; - // Always allow the fee payer to be treated as empty-if-not-found so that - // transactions can still be processed in gasless mode - let mut mark_empty_if_not_found = vec![*feepayer]; + // Determine if we need to clone the escrow account for the feepayer + let clone_escrow = self + .accounts_bank + .get_account(feepayer) + .is_none_or(|a| !a.delegated()); + // If cloning escrow, add the balance PDA if clone_escrow { let balance_pda = ephemeral_balance_pda_from_payer(feepayer, 0); trace!("Adding balance PDA {balance_pda} for feepayer {feepayer}"); pubkeys.push(balance_pda); - mark_empty_if_not_found.push(balance_pda); } - let mark_empty_if_not_found = (!mark_empty_if_not_found.is_empty()) - .then(|| &mark_empty_if_not_found[..]); + + // Mark *all* pubkeys as empty-if-not-found + let mark_empty_if_not_found: Vec = pubkeys.clone(); + let mark_empty_if_not_found = Some(mark_empty_if_not_found.as_slice()); + + // Ensure accounts let res = self .ensure_accounts(&pubkeys, mark_empty_if_not_found) .await?; - // Best-effort auto airdrop for fee payer if configured and still empty locally + // Best-effort auto airdrop for fee payer if configured if self.auto_airdrop_lamports > 0 { if let Some(fetch_cloner) = self.fetch_cloner() { let lamports = self @@ -280,6 +274,7 @@ Kept: {} delegated, {} blacklisted", .get_account(feepayer) .map(|a| a.lamports()) .unwrap_or(0); + if lamports == 0 { if let Err(err) = fetch_cloner .airdrop_account_if_empty( From fd1b90776100b2d35ddf578a5dc6a8b1a143c086 Mon Sep 17 00:00:00 2001 From: Gabriele Picco Date: Thu, 20 Nov 2025 09:28:10 +0400 Subject: [PATCH 2/3] chore: revert config --- configs/ephem-devnet.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/ephem-devnet.toml b/configs/ephem-devnet.toml index a5cef76d1..e1683b38e 100644 --- a/configs/ephem-devnet.toml +++ b/configs/ephem-devnet.toml @@ -1,5 +1,5 @@ [accounts] -remote = { cluster = "custom", url = "https://rpc.magicblock.app/devnet" } +remote.cluster = "devnet" lifecycle = "ephemeral" commit = { frequency-millis = 50_000 } From 91693ba7fd0488a5769d2bdd52f91fccd5262813 Mon Sep 17 00:00:00 2001 From: Gabriele Picco Date: Thu, 20 Nov 2025 09:33:40 +0400 Subject: [PATCH 3/3] chore: avoid allocation --- magicblock-chainlink/src/chainlink/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/magicblock-chainlink/src/chainlink/mod.rs b/magicblock-chainlink/src/chainlink/mod.rs index 981a530cb..1ef11a28b 100644 --- a/magicblock-chainlink/src/chainlink/mod.rs +++ b/magicblock-chainlink/src/chainlink/mod.rs @@ -258,8 +258,7 @@ Kept: {} delegated, {} blacklisted", } // Mark *all* pubkeys as empty-if-not-found - let mark_empty_if_not_found: Vec = pubkeys.clone(); - let mark_empty_if_not_found = Some(mark_empty_if_not_found.as_slice()); + let mark_empty_if_not_found = Some(pubkeys.as_slice()); // Ensure accounts let res = self