pyth-crosschain/solana/pyth2wormhole/program/src/initialize.rs

62 lines
1.5 KiB
Rust

use solana_program::{
program::invoke,
pubkey::Pubkey,
rent::Rent,
system_instruction,
sysvar::Sysvar,
};
use solitaire::{
trace,
AccountState,
CreationLamports,
ExecutionContext,
FromAccounts,
Info,
Keyed,
Mut,
Peel,
Result as SoliResult,
Signer,
};
use crate::config::{
P2WConfigAccount,
Pyth2WormholeConfig,
};
#[derive(FromAccounts)]
pub struct Initialize<'b> {
pub new_config: Mut<P2WConfigAccount<'b, { AccountState::Uninitialized }>>,
pub payer: Mut<Signer<Info<'b>>>,
pub system_program: Info<'b>,
}
/// Must be called right after deployment
pub fn initialize(
ctx: &ExecutionContext,
accs: &mut Initialize,
data: Pyth2WormholeConfig,
) -> SoliResult<()> {
accs.new_config
.create(ctx, accs.payer.info().key, CreationLamports::Exempt)?;
accs.new_config.1 = data;
// TODO(2022-09-05): Remove this rent collection after
// sysvar-based rent calculation becomes mainline in Solitaire.
let config_balance = accs.new_config.info().lamports();
let config_rent_exempt = Rent::get()?.minimum_balance(accs.new_config.info().data_len());
if config_balance < config_rent_exempt {
let required_deposit = config_rent_exempt - config_balance;
let transfer_ix = system_instruction::transfer(
accs.payer.key,
accs.new_config.info().key,
required_deposit,
);
invoke(&transfer_ix, ctx.accounts)?
}
Ok(())
}