Skip to content

Commit f2b2bea

Browse files
committed
solana: more clean up
1 parent 325df0d commit f2b2bea

File tree

6 files changed

+411
-196
lines changed

6 files changed

+411
-196
lines changed

solana/programs/matching-engine/src/fallback/processor/close_fast_market_order.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use solana_program::instruction::Instruction;
33

44
use crate::error::MatchingEngineError;
55

6+
const NUM_ACCOUNTS: usize = 2;
7+
68
pub struct CloseFastMarketOrderAccounts<'ix> {
79
/// The fast market order account to be closed.
810
pub fast_market_order: &'ix Pubkey,
@@ -26,19 +28,22 @@ impl CloseFastMarketOrder<'_> {
2628
close_account_refund_recipient: refund_recipient,
2729
} = self.accounts;
2830

31+
let accounts = vec![
32+
AccountMeta::new(*fast_market_order, false),
33+
AccountMeta::new(*refund_recipient, true),
34+
];
35+
debug_assert_eq!(accounts.len(), NUM_ACCOUNTS);
36+
2937
Instruction {
3038
program_id: *self.program_id,
31-
accounts: vec![
32-
AccountMeta::new(*fast_market_order, false),
33-
AccountMeta::new(*refund_recipient, true),
34-
],
39+
accounts,
3540
data: super::FallbackMatchingEngineInstruction::CloseFastMarketOrder.to_vec(),
3641
}
3742
}
3843
}
3944

4045
pub fn process(accounts: &[AccountInfo]) -> Result<()> {
41-
super::helpers::require_min_account_infos_len(accounts, 2)?;
46+
super::helpers::require_min_account_infos_len(accounts, NUM_ACCOUNTS)?;
4247

4348
// We need to check the refund recipient account against what we know as the
4449
// refund recipient encoded in the fast market order account.
@@ -75,3 +80,20 @@ pub fn process(accounts: &[AccountInfo]) -> Result<()> {
7580

7681
Ok(())
7782
}
83+
84+
#[cfg(test)]
85+
mod test {
86+
use super::*;
87+
88+
#[test]
89+
fn test_instruction() {
90+
CloseFastMarketOrder {
91+
program_id: &Default::default(),
92+
accounts: CloseFastMarketOrderAccounts {
93+
fast_market_order: &Default::default(),
94+
close_account_refund_recipient: &Default::default(),
95+
},
96+
}
97+
.instruction();
98+
}
99+
}

solana/programs/matching-engine/src/fallback/processor/execute_order.rs

Lines changed: 88 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ use crate::{
1616

1717
use super::burn_and_post::{burn_and_post, PostMessageAccounts};
1818

19+
const NUM_ACCOUNTS: usize = 32;
20+
1921
// TODO: Rename to "ExecuteOrderCctpV2Accounts".
2022
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
2123
pub struct ExecuteOrderShimAccounts<'ix> {
2224
/// The signer account.
23-
// TODO: Rename payer.
25+
// TODO: Rename to "payer".
2426
pub signer: &'ix Pubkey, // 0
2527
/// The cctp message account. Seeds must be \["cctp-msg", auction_address.as_ref()\].
2628
// TODO: Rename to "new_cctp_message".
@@ -142,50 +144,53 @@ impl ExecuteOrderCctpShim<'_> {
142144
clock: _,
143145
} = self.accounts;
144146

147+
let accounts = vec![
148+
AccountMeta::new(*payer, true),
149+
AccountMeta::new(*new_cctp_message, false),
150+
AccountMeta::new(*custodian, false),
151+
AccountMeta::new_readonly(*fast_market_order, false),
152+
AccountMeta::new(*active_auction, false),
153+
AccountMeta::new(*auction_custody, false),
154+
AccountMeta::new_readonly(*auction_config, false),
155+
AccountMeta::new(*auction_best_offer_token, false),
156+
AccountMeta::new(*executor_token, false),
157+
AccountMeta::new(*auction_initial_offer_token, false),
158+
AccountMeta::new(*auction_initial_participant, false),
159+
AccountMeta::new_readonly(*to_endpoint, false),
160+
AccountMeta::new_readonly(*post_message_shim_program, false),
161+
AccountMeta::new(*core_bridge_emitter_sequence, false),
162+
AccountMeta::new(*shim_message, false),
163+
AccountMeta::new_readonly(*cctp_token_messenger_minter_program, false),
164+
AccountMeta::new(*cctp_mint, false),
165+
AccountMeta::new_readonly(*cctp_token_messenger_minter_sender_authority, false),
166+
AccountMeta::new(*cctp_message_transmitter_config, false),
167+
AccountMeta::new_readonly(*cctp_token_messenger, false),
168+
AccountMeta::new_readonly(*cctp_remote_token_messenger, false),
169+
AccountMeta::new_readonly(*cctp_token_minter, false),
170+
AccountMeta::new(*cctp_local_token, false),
171+
AccountMeta::new_readonly(*cctp_token_messenger_minter_event_authority, false),
172+
AccountMeta::new_readonly(*cctp_message_transmitter_program, false),
173+
AccountMeta::new_readonly(*core_bridge_program, false),
174+
AccountMeta::new(*core_bridge_config, false),
175+
AccountMeta::new(*core_bridge_fee_collector, false),
176+
AccountMeta::new(*post_message_shim_event_authority, false),
177+
AccountMeta::new_readonly(solana_program::system_program::ID, false),
178+
AccountMeta::new_readonly(spl_token::ID, false),
179+
AccountMeta::new_readonly(solana_program::sysvar::clock::ID, false),
180+
];
181+
debug_assert_eq!(accounts.len(), NUM_ACCOUNTS);
182+
145183
Instruction {
146184
program_id: *self.program_id,
147-
accounts: vec![
148-
AccountMeta::new(*payer, true),
149-
AccountMeta::new(*new_cctp_message, false),
150-
AccountMeta::new(*custodian, false),
151-
AccountMeta::new_readonly(*fast_market_order, false),
152-
AccountMeta::new(*active_auction, false),
153-
AccountMeta::new(*auction_custody, false),
154-
AccountMeta::new_readonly(*auction_config, false),
155-
AccountMeta::new(*auction_best_offer_token, false),
156-
AccountMeta::new(*executor_token, false),
157-
AccountMeta::new(*auction_initial_offer_token, false),
158-
AccountMeta::new(*auction_initial_participant, false),
159-
AccountMeta::new_readonly(*to_endpoint, false),
160-
AccountMeta::new_readonly(*post_message_shim_program, false),
161-
AccountMeta::new(*core_bridge_emitter_sequence, false),
162-
AccountMeta::new(*shim_message, false),
163-
AccountMeta::new_readonly(*cctp_token_messenger_minter_program, false),
164-
AccountMeta::new(*cctp_mint, false),
165-
AccountMeta::new_readonly(*cctp_token_messenger_minter_sender_authority, false),
166-
AccountMeta::new(*cctp_message_transmitter_config, false),
167-
AccountMeta::new_readonly(*cctp_token_messenger, false),
168-
AccountMeta::new_readonly(*cctp_remote_token_messenger, false),
169-
AccountMeta::new_readonly(*cctp_token_minter, false),
170-
AccountMeta::new(*cctp_local_token, false),
171-
AccountMeta::new_readonly(*cctp_token_messenger_minter_event_authority, false),
172-
AccountMeta::new_readonly(*cctp_message_transmitter_program, false),
173-
AccountMeta::new_readonly(*core_bridge_program, false),
174-
AccountMeta::new(*core_bridge_config, false),
175-
AccountMeta::new(*core_bridge_fee_collector, false),
176-
AccountMeta::new(*post_message_shim_event_authority, false),
177-
AccountMeta::new_readonly(solana_program::system_program::ID, false),
178-
AccountMeta::new_readonly(spl_token::ID, false),
179-
AccountMeta::new_readonly(solana_program::sysvar::clock::ID, false),
180-
],
185+
accounts,
181186
data: super::FallbackMatchingEngineInstruction::ExecuteOrderCctpShim.to_vec(),
182187
}
183188
}
184189
}
185190

186191
pub(super) fn process(accounts: &[AccountInfo]) -> Result<()> {
187192
// This saves stack space whereas having that in the body does not
188-
super::helpers::require_min_account_infos_len(accounts, 31)?;
193+
super::helpers::require_min_account_infos_len(accounts, NUM_ACCOUNTS)?;
189194

190195
// Get the accounts
191196
let payer_info = &accounts[0];
@@ -638,3 +643,50 @@ pub(super) fn process(accounts: &[AccountInfo]) -> Result<()> {
638643
invoke_signed_unchecked(&close_account_ix, accounts, &[Custodian::SIGNER_SEEDS])
639644
.map_err(Into::into)
640645
}
646+
647+
#[cfg(test)]
648+
mod test {
649+
use super::*;
650+
651+
#[test]
652+
fn test_instruction() {
653+
ExecuteOrderCctpShim {
654+
program_id: &Default::default(),
655+
accounts: ExecuteOrderShimAccounts {
656+
signer: &Default::default(),
657+
cctp_message: &Default::default(),
658+
custodian: &Default::default(),
659+
fast_market_order: &Default::default(),
660+
active_auction: &Default::default(),
661+
active_auction_custody_token: &Default::default(),
662+
active_auction_config: &Default::default(),
663+
active_auction_best_offer_token: &Default::default(),
664+
executor_token: &Default::default(),
665+
initial_offer_token: &Default::default(),
666+
initial_participant: &Default::default(),
667+
to_router_endpoint: &Default::default(),
668+
post_message_shim_program: &Default::default(),
669+
core_bridge_emitter_sequence: &Default::default(),
670+
post_shim_message: &Default::default(),
671+
cctp_deposit_for_burn_mint: &Default::default(),
672+
cctp_deposit_for_burn_token_messenger_minter_sender_authority: &Default::default(),
673+
cctp_deposit_for_burn_message_transmitter_config: &Default::default(),
674+
cctp_deposit_for_burn_token_messenger: &Default::default(),
675+
cctp_deposit_for_burn_remote_token_messenger: &Default::default(),
676+
cctp_deposit_for_burn_token_minter: &Default::default(),
677+
cctp_deposit_for_burn_local_token: &Default::default(),
678+
cctp_deposit_for_burn_token_messenger_minter_event_authority: &Default::default(),
679+
cctp_deposit_for_burn_token_messenger_minter_program: &Default::default(),
680+
cctp_deposit_for_burn_message_transmitter_program: &Default::default(),
681+
core_bridge_program: &Default::default(),
682+
core_bridge_config: &Default::default(),
683+
core_bridge_fee_collector: &Default::default(),
684+
post_message_shim_event_authority: &Default::default(),
685+
system_program: &Default::default(),
686+
token_program: &Default::default(),
687+
clock: &Default::default(),
688+
},
689+
}
690+
.instruction();
691+
}
692+
}

solana/programs/matching-engine/src/fallback/processor/helpers.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use solana_program::{
1010
program_pack::Pack,
1111
system_instruction,
1212
};
13+
use wormhole_svm_shim::verify_vaa;
1314

1415
use crate::{
1516
error::MatchingEngineError,
@@ -140,6 +141,34 @@ pub fn try_fast_market_order_account<'a>(
140141
}))
141142
}
142143

144+
pub fn invoke_verify_hash(
145+
verify_vaa_shim_program_index: usize,
146+
wormhole_guardian_set_index: usize,
147+
shim_guardian_signatures_index: usize,
148+
guardian_set_bump: u8,
149+
vaa_message_digest: keccak::Hash,
150+
accounts: &[AccountInfo],
151+
) -> Result<()> {
152+
if accounts[verify_vaa_shim_program_index].key
153+
!= &wormhole_svm_definitions::solana::VERIFY_VAA_SHIM_PROGRAM_ID
154+
{
155+
return Err(ErrorCode::ConstraintAddress.into())
156+
.map_err(|e: Error| e.with_account_name("verify_vaa_shim_program"));
157+
}
158+
159+
let verify_hash_ix = verify_vaa::VerifyHash {
160+
program_id: &wormhole_svm_definitions::solana::VERIFY_VAA_SHIM_PROGRAM_ID,
161+
accounts: verify_vaa::VerifyHashAccounts {
162+
guardian_set: accounts[wormhole_guardian_set_index].key,
163+
guardian_signatures: accounts[shim_guardian_signatures_index].key,
164+
},
165+
data: verify_vaa::VerifyHashData::new(guardian_set_bump, vaa_message_digest),
166+
}
167+
.instruction();
168+
169+
invoke_signed_unchecked(&verify_hash_ix, accounts, &[]).map_err(Into::into)
170+
}
171+
143172
pub fn create_account_reliably(
144173
payer_key: &Pubkey,
145174
account_key: &Pubkey,

0 commit comments

Comments
 (0)