Skip to content
Merged
Prev Previous commit
Fix account migration from before revision (#285)
  • Loading branch information
anton-lisanin committed Feb 23, 2024
commit 4c3a26b9d463a1079510333baf0cd3180de5e7d8
13 changes: 8 additions & 5 deletions evm_loader/lib/src/account_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@ fn from_before_revision(account: &mut Account, new_tag: u8) {
const PREFIX_BEFORE: usize = ACCOUNT_PREFIX_LEN_BEFORE_REVISION;
const PREFIX_AFTER: usize = ACCOUNT_PREFIX_LEN;

assert!(account.data.len() > PREFIX_BEFORE);
let data: &mut Vec<u8> = &mut account.data;

let required_len = account.data.len() + PREFIX_AFTER - PREFIX_BEFORE;
account.data.resize(required_len, 0);
assert!(data.len() > PREFIX_BEFORE);
let data_len = data.len() - PREFIX_BEFORE;

account.data.copy_within(PREFIX_BEFORE.., PREFIX_AFTER);
account.data[0] = new_tag;
let required_len = data.len() + PREFIX_AFTER - PREFIX_BEFORE;
data.resize(required_len, 0);

data.copy_within(PREFIX_BEFORE..(PREFIX_BEFORE + data_len), PREFIX_AFTER);
data[0] = new_tag;
}

pub fn update_account(program_id: &Pubkey, key: &Pubkey, account: &mut Account) -> NeonResult<()> {
Expand Down
7 changes: 5 additions & 2 deletions evm_loader/program/src/account/legacy/update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,21 @@ pub fn from_before_revision<'a>(
const PREFIX_BEFORE: usize = ACCOUNT_PREFIX_LEN_BEFORE_REVISION;
const PREFIX_AFTER: usize = ACCOUNT_PREFIX_LEN;

assert!(account.data_len() > PREFIX_BEFORE);
let data_len = account.data_len() - PREFIX_BEFORE;

let required_len = account.data_len() + PREFIX_AFTER - PREFIX_BEFORE;
account.realloc(required_len, false)?;

let minimum_balance = rent.minimum_balance(account.data_len());
let minimum_balance = rent.minimum_balance(required_len);
if account.lamports() < minimum_balance {
let required_lamports = minimum_balance - account.lamports();
system.transfer(operator, account, required_lamports)?;
}

let mut account_data = account.try_borrow_mut_data()?;
account_data.copy_within(PREFIX_BEFORE..(PREFIX_BEFORE + data_len), PREFIX_AFTER);
account_data[0] = new_tag;
account_data.copy_within(PREFIX_BEFORE.., PREFIX_AFTER);

Ok(())
}