diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/api/publish_message.rs b/solana/anchor-bridge/programs/anchor-bridge/src/api/publish_message.rs index 4e3f2de2..1195bbe3 100644 --- a/solana/anchor-bridge/programs/anchor-bridge/src/api/publish_message.rs +++ b/solana/anchor-bridge/programs/anchor-bridge/src/api/publish_message.rs @@ -13,4 +13,3 @@ pub fn publish_message( ) -> ProgramResult { Ok(()) } - diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/api/verify_signatures.rs b/solana/anchor-bridge/programs/anchor-bridge/src/api/verify_signatures.rs index 9c35ba11..5ef5c7fe 100644 --- a/solana/anchor-bridge/programs/anchor-bridge/src/api/verify_signatures.rs +++ b/solana/anchor-bridge/programs/anchor-bridge/src/api/verify_signatures.rs @@ -22,6 +22,21 @@ struct SecpInstructionPart<'a> { msg_size: u16, } +#[inline(always)] +fn filter_empty_signatures(signers: &[i8; MAX_LEN_GUARDIAN_KEYS]) -> Vec { + signers + .iter() + .enumerate() + .filter_map(|(i, p)| match *p { + -1 => None, + ix => Some(SigInfo { + sig_index: ix as u8, + signer_index: i as u8, + }), + }) + .collect() +} + pub fn verify_signatures( bridge: &mut Bridge, ctx: Context, @@ -29,20 +44,7 @@ pub fn verify_signatures( signers: [i8; MAX_LEN_GUARDIAN_KEYS], initial_creation: bool, ) -> ProgramResult { - let sig_infos: Vec = signers - .iter() - .enumerate() - .filter_map(|(i, p)| { - if *p == -1 { - return None; - } - - return Some(SigInfo { - sig_index: *p as u8, - signer_index: i as u8, - }); - }) - .collect(); + let sig_infos = filter_empty_signatures(&signers); // We check this manually because the type-level checks are // not available for Instructions yet. See the VerifySig diff --git a/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs b/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs index 20a972e1..c8dfa134 100644 --- a/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs +++ b/solana/anchor-bridge/programs/anchor-bridge/src/lib.rs @@ -70,7 +70,32 @@ pub struct InitializeData { } #[derive(Accounts)] -pub struct PublishMessage {} +pub struct PublishMessage<'info> { + /// Clock used for timestamping. + pub clock: Sysvar<'info, Clock>, + + /// Instructions used for transaction reflection. + pub instructions: AccountInfo<'info>, + + /// Derived account verified to match the expected pubkey via Bridge::check_and_create_account. + #[account(init)] + pub message: AccountInfo<'info>, + + /// No need to verify - only used as the fee payer for account creation. + #[account(signer)] + pub payer: AccountInfo<'info>, + + /// The emitter, only used as metadata. We verify that the account is a signer to prevent + /// messages from being spoofed. + #[account(signer)] + pub emitter: AccountInfo<'info>, + + /// Required by Anchor for associated accounts. + pub rent: Sysvar<'info, Rent>, + + /// Required by Anchor for associated accounts. + pub system_program: AccountInfo<'info>, +} #[derive(AnchorSerialize, AnchorDeserialize, Clone, Copy, Debug)] pub struct PublishMessageData {}