Conversation
Manual Deploy AvailableYou can trigger a manual deploy of this PR branch to testnet: Alternative: Comment
Comment updated automatically when the PR is synchronized. |
📝 WalkthroughWalkthroughThe PR modifies the Assessment against linked issues
Suggested reviewers
✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
magicblock-api/src/fund_account.rs (1)
25-39: 🧹 Nitpick | 🔵 Trivial
fund_account_with_dataunconditionally zeros existing account data — the root cause of issue#984.This function's "exists" branch (line 33) resets data to zeroes even for pre-existing accounts. The PR correctly bypasses it for
MagicContext, but any future caller relying on data preservation for a sized account will hit the same trap. Consider either renaming the function to clarify it always resets data, or adding apreserve_dataflag / a separatefund_account_preserve_datahelper to prevent repeat bugs.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@magicblock-api/src/fund_account.rs` around lines 25 - 39, The function fund_account_with_data currently overwrites existing account data by calling set_data(vec![0; size]) in the exists branch (accountsdb.get_account -> acc.set_data), which causes unintended zeroing; update this function to either (A) accept a preserve_data: bool parameter and only call acc.set_data when preserve_data is false or when the existing data length differs from size, or (B) split into two helpers (fund_account_with_zeroed_data and fund_account_preserve_data) and move the zeroing behavior into the former; ensure callers of fund_account_with_data (and any tests) are updated to use the appropriate new API and keep the insert_account call (accountsdb.insert_account) unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@magicblock-api/src/fund_account.rs`:
- Around line 85-89: The AccountSharedData creation for the MagicContext uses
the system program as owner; update the owner argument in the
AccountSharedData::new call that uses CONTEXT_LAMPORTS and MagicContext::SIZE to
pass &magic_program::id() (the magic program ID) instead of &Default::default()
so the account owner matches the tests and the ephemeral vault account.
---
Outside diff comments:
In `@magicblock-api/src/fund_account.rs`:
- Around line 25-39: The function fund_account_with_data currently overwrites
existing account data by calling set_data(vec![0; size]) in the exists branch
(accountsdb.get_account -> acc.set_data), which causes unintended zeroing;
update this function to either (A) accept a preserve_data: bool parameter and
only call acc.set_data when preserve_data is false or when the existing data
length differs from size, or (B) split into two helpers
(fund_account_with_zeroed_data and fund_account_preserve_data) and move the
zeroing behavior into the former; ensure callers of fund_account_with_data (and
any tests) are updated to use the appropriate new API and keep the
insert_account call (accountsdb.insert_account) unchanged.
| AccountSharedData::new( | ||
| CONTEXT_LAMPORTS, | ||
| MagicContext::SIZE, | ||
| &Default::default(), | ||
| ) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
echo "=== MagicContext struct and SIZE definition ==="
rg -n "struct MagicContext" -A 25 --type rust magicblock-api/
echo ""
echo "=== MagicContext SIZE constant ==="
rg -n "const SIZE" --type rust magicblock-api/
echo ""
echo "=== Git diff to see previous implementation ==="
git diff HEAD -- magicblock-api/src/fund_account.rs | head -100
echo ""
echo "=== How account owner is set in similar contexts ==="
rg -n "AccountSharedData::new" -B 2 -A 2 --type rust magicblock-api/ | head -50
echo ""
echo "=== Check MAGIC_CONTEXT_PUBKEY usage and owner validation ==="
rg -n "MAGIC_CONTEXT_PUBKEY" -C 5 --type rust magicblock-api/Repository: magicblock-labs/magicblock-validator
Length of output: 4237
🏁 Script executed:
#!/bin/bash
echo "=== Search for MagicContext definition across all crates ==="
find . -type f -name "*.rs" | xargs rg "struct MagicContext" -A 20 2>/dev/null | head -100
echo ""
echo "=== Search for SIZE constant in MagicContext ==="
rg "MagicContext::SIZE" --type rust -B 5 -A 2
echo ""
echo "=== Check if magic_program crate defines MagicContext ==="
find . -path "*/magic_program*" -name "*.rs" | head -20
echo ""
echo "=== Look for explicit owner validation on MagicContext account ==="
rg "MAGIC_CONTEXT_PUBKEY" --type rust -A 10 | rg -i "owner|is_signer|delegated"
echo ""
echo "=== Check MagicContext implementation and serialization ==="
rg "impl MagicContext" -A 30 --type rust | head -80Repository: magicblock-labs/magicblock-validator
Length of output: 7139
🏁 Script executed:
#!/bin/bash
echo "=== MAGIC_CONTEXT_SIZE value ==="
rg "MAGIC_CONTEXT_SIZE" --type rust -B 2 -A 2 | head -40
echo ""
echo "=== Test setup pattern - MagicContext account owner ==="
rg "MAGIC_CONTEXT_PUBKEY" --type rust -B 5 -A 5 | grep -A 8 "AccountSharedData::new.*MagicContext::SIZE"
echo ""
echo "=== fund_ephemeral_vault - shows expected owner pattern ==="
rg -n "set_owner\|magic_program::ID" --type rust magicblock-api/src/fund_account.rs
echo ""
echo "=== Check all locations where MagicContext account is created ==="
rg "AccountSharedData::new.*MagicContext::SIZE" -B 3 -A 3 --type rustRepository: magicblock-labs/magicblock-validator
Length of output: 5083
🏁 Script executed:
#!/bin/bash
echo "=== Check program initialization to see how MagicContext owner should be set ==="
rg "magic_program::ID\|magic_program::id()" --type rust magicblock-api/src/ -B 3 -A 3
echo ""
echo "=== Check if there's any comment or documentation about MagicContext ownership ==="
rg -n "fund_magic_context\|MagicContext" magicblock-api/src/fund_account.rs | head -30
echo ""
echo "=== Verify the full fund_magic_context function ==="
sed -n '72,94p' magicblock-api/src/fund_account.rsRepository: magicblock-labs/magicblock-validator
Length of output: 1101
Fix the MagicContext account owner—it should be the magic program, not the system program.
The account is currently created with &Default::default() (system program) as owner. However, test code in process_schedule_commit_tests.rs creates the same account with &crate::id() (magic_program), and the ephemeral vault account is explicitly set to magic_program::ID. Change line 88 to use &magic_program::id() instead of &Default::default().
Current code (incorrect)
AccountSharedData::new(
CONTEXT_LAMPORTS,
MagicContext::SIZE,
&Default::default(),
)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@magicblock-api/src/fund_account.rs` around lines 85 - 89, The
AccountSharedData creation for the MagicContext uses the system program as
owner; update the owner argument in the AccountSharedData::new call that uses
CONTEXT_LAMPORTS and MagicContext::SIZE to pass &magic_program::id() (the magic
program ID) instead of &Default::default() so the account owner matches the
tests and the ephemeral vault account.
| } | ||
|
|
||
| pub(crate) fn fund_magic_context(accountsdb: &AccountsDb) { | ||
| fund_account_with_data( |
There was a problem hiding this comment.
I think it's better to tweak the fund_account_with_data method to prevent any mutation if account already exists, all use cases assume that anyway.
There was a problem hiding this comment.
If that is the case, then it is better. Do we want to refill lamports for all of them tho?
There was a problem hiding this comment.
no, in case of EPHEMERAL VAULT account that would be a logic error, so we want to keep the state intact between restarts
Summary
Fixes MagicContext reset on restart.
Compatibility
Testing
Checklist
Summary by CodeRabbit