use anchor_lang::prelude::*;
use crate::crypto::constants::{
EXPECTED_EVMNET_CHAIN_HASH, EXPECTED_EVMNET_GENESIS_TIME, EXPECTED_EVMNET_PERIOD,
EXPECTED_EVMNET_PUBKEY,
};
use crate::errors::AleaError;
use crate::state::Config;
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = authority,
space = Config::LEN,
seeds = [b"config"],
bump,
)]
pub config: Account<'info, Config>,
#[account(mut)]
pub authority: Signer<'info>,
#[account(
seeds = [crate::ID.as_ref()],
bump,
seeds::program = anchor_lang::solana_program::bpf_loader_upgradeable::ID,
)]
pub program_data: Account<'info, ProgramData>,
pub system_program: Program<'info, System>,
}
pub fn initialize_handler(
ctx: Context<Initialize>,
pubkey_g2: [u8; 128],
genesis_time: u64,
period: u64,
chain_hash: [u8; 32],
) -> Result<()> {
let upgrade_authority = ctx.accounts.program_data.upgrade_authority_address;
require!(
upgrade_authority == Some(ctx.accounts.authority.key()),
AleaError::UnauthorizedInit,
);
require!(
chain_hash == EXPECTED_EVMNET_CHAIN_HASH,
AleaError::WrongChainHash
);
require!(pubkey_g2 == EXPECTED_EVMNET_PUBKEY, AleaError::WrongPubkey);
require!(
genesis_time == EXPECTED_EVMNET_GENESIS_TIME,
AleaError::InvalidGenesisTime
);
require!(period == EXPECTED_EVMNET_PERIOD, AleaError::InvalidPeriod);
let config = &mut ctx.accounts.config;
config.pubkey_g2 = pubkey_g2;
config.genesis_time = genesis_time;
config.period = period;
config.chain_hash = chain_hash;
config.authority = ctx.accounts.authority.key();
config.bump = ctx.bumps.config;
Ok(())
}