pyth2wormhole/migrate: add pythnet rent adjustment (#315)
* pyth2wormhole/migrate: add pythnet rent adjustment * p2w/migrate: leave a note about rent calculation
This commit is contained in:
parent
983813d2f8
commit
c81a420a79
|
@ -3,12 +3,17 @@
|
||||||
use solana_program::{
|
use solana_program::{
|
||||||
program_error::ProgramError,
|
program_error::ProgramError,
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
|
rent::Rent,
|
||||||
|
system_instruction,
|
||||||
system_program,
|
system_program,
|
||||||
|
sysvar::Sysvar,
|
||||||
|
program::invoke,
|
||||||
};
|
};
|
||||||
|
|
||||||
use solitaire::{
|
use solitaire::{
|
||||||
trace,
|
trace,
|
||||||
AccountState,
|
AccountState,
|
||||||
|
AccountSize,
|
||||||
CreationLamports,
|
CreationLamports,
|
||||||
ExecutionContext,
|
ExecutionContext,
|
||||||
FromAccounts,
|
FromAccounts,
|
||||||
|
@ -70,18 +75,30 @@ pub fn migrate(ctx: &ExecutionContext, accs: &mut Migrate, data: ()) -> SoliResu
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(2022-09-06): This instruction does not contain the temporary rent
|
|
||||||
// adjustment snippet necessary for PythNet compatibility. This
|
|
||||||
// was done to minimize the footprint of this rather hacky
|
|
||||||
// workaround. In case the migrate ix needs to be ran in a
|
|
||||||
// weird-rent environment, copy the rent due snippet and adjust it
|
|
||||||
// to work against `accs.new_config`.
|
|
||||||
|
|
||||||
// Populate new config
|
// Populate new config
|
||||||
accs.new_config
|
accs.new_config
|
||||||
.create(ctx, accs.payer.info().key, CreationLamports::Exempt)?;
|
.create(ctx, accs.payer.info().key, CreationLamports::Exempt)?;
|
||||||
accs.new_config.1 = Pyth2WormholeConfig::from(old_config.clone());
|
accs.new_config.1 = Pyth2WormholeConfig::from(old_config.clone());
|
||||||
|
|
||||||
|
// Adjust new config lamports
|
||||||
|
// NOTE(2022-09-29): Necessary due to PythNet rent calculation
|
||||||
|
// differences, remove when solitaire supports Rent::get()?
|
||||||
|
let mut acc_lamports = accs.new_config.info().lamports();
|
||||||
|
|
||||||
|
let new_lamports = Rent::get()?.minimum_balance(accs.new_config.size());
|
||||||
|
|
||||||
|
let diff_lamports: u64 = (acc_lamports as i64 - new_lamports as i64).abs() as u64;
|
||||||
|
|
||||||
|
if acc_lamports < new_lamports {
|
||||||
|
// Less than enough lamports, debit the payer
|
||||||
|
let transfer_ix = system_instruction::transfer(
|
||||||
|
accs.payer.info().key,
|
||||||
|
accs.new_config.info().key,
|
||||||
|
diff_lamports,
|
||||||
|
);
|
||||||
|
invoke(&transfer_ix, ctx.accounts)?;
|
||||||
|
}
|
||||||
|
|
||||||
// Reclaim old config lamports
|
// Reclaim old config lamports
|
||||||
|
|
||||||
// Save current balance
|
// Save current balance
|
||||||
|
|
Loading…
Reference in New Issue