diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/api.rs b/solana/anchor-bridge/programs/anchor-bridge/src/api.rs index de5b4a5a..aea881d0 100644 --- a/solana/anchor-bridge/programs/anchor-bridge/src/api.rs +++ b/solana/anchor-bridge/programs/anchor-bridge/src/api.rs @@ -1,4 +1,6 @@ +pub mod initialize; pub mod verify_signatures; // Re-expose underlying module functions and data, for consuming APIs to use. +pub use initialize::*; pub use verify_signatures::*; diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/api/initialize.rs b/solana/anchor-bridge/programs/anchor-bridge/src/api/initialize.rs new file mode 100644 index 00000000..2a0fec07 --- /dev/null +++ b/solana/anchor-bridge/programs/anchor-bridge/src/api/initialize.rs @@ -0,0 +1,6 @@ +use crate::{accounts, Initialize, InitializeData}; +use anchor_lang::{prelude::*, solana_program}; + +pub fn initialize(ctx: Context, data: InitializeData) -> ProgramResult { + Ok(()) +} diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs b/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs index 41b23ba7..032de37b 100644 --- a/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs +++ b/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs @@ -2,9 +2,10 @@ use anchor_lang::{prelude::*, solana_program}; mod account; mod api; +mod types; -use account::BridgeInfo; -use account::GuardianSetInfo; +use account::{BridgeInfo, GuardianSetInfo}; +use types::BridgeConfig; /// An enum with labeled network identifiers. These must be consistent accross all wormhole /// contracts deployed on each chain. @@ -18,16 +19,6 @@ pub const CHAIN_ID_SOLANA: u8 = Chain::Solana as u8; /// maximum number of guardians pub const MAX_LEN_GUARDIAN_KEYS: usize = 20; -#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Debug)] -pub struct VerifySigsData { - /// hash of the VAA - pub hash: [u8; 32], - /// instruction indices of signers (-1 for missing) - pub signers: [i8; MAX_LEN_GUARDIAN_KEYS], - /// indicates whether this verification should only succeed if the sig account does not exist - pub initial_creation: bool, -} - #[derive(Accounts)] pub struct VerifySig<'info> { pub bridge: AccountInfo<'info>, @@ -39,10 +30,37 @@ pub struct VerifySig<'info> { pub payer_info: AccountInfo<'info>, } +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Debug)] +pub struct VerifySigsData { + /// hash of the VAA + pub hash: [u8; 32], + /// instruction indices of signers (-1 for missing) + pub signers: [i8; MAX_LEN_GUARDIAN_KEYS], + /// indicates whether this verification should only succeed if the sig account does not exist + pub initial_creation: bool, +} + +#[derive(Accounts)] +pub struct Initialize {} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Debug)] +pub struct InitializeData { + /// number of initial guardians + pub len_guardians: u8, + /// guardians that are allowed to sign mints + pub initial_guardian: [[u8; 20]; MAX_LEN_GUARDIAN_KEYS], + /// config for the bridge + pub config: BridgeConfig, +} + #[program] pub mod anchor_bridge { use super::*; + pub fn initialize(ctx: Context, data: InitializeData) -> ProgramResult { + api::initialize(ctx, data) + } + pub fn verify_signatures(ctx: Context, data: VerifySigsData) -> ProgramResult { api::verify_signatures(ctx, data) } diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/types.rs b/solana/anchor-bridge/programs/anchor-bridge/src/types.rs new file mode 100644 index 00000000..15bfc711 --- /dev/null +++ b/solana/anchor-bridge/programs/anchor-bridge/src/types.rs @@ -0,0 +1,11 @@ +use anchor_lang::prelude::*; + +#[repr(C)] +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Debug)] +pub struct BridgeConfig { + /// Period for how long a guardian set is valid after it has been replaced by a new one. This + /// guarantees that VAAs issued by that set can still be submitted for a certain period. In + /// this period we still trust the old guardian set. + pub guardian_set_expiration_time: u32, +} +