From cc865ef277393f8a1e83a07bdef905aa5fc0fa88 Mon Sep 17 00:00:00 2001 From: Bengt Lofgren Date: Mon, 19 May 2025 17:04:28 +0100 Subject: [PATCH 1/4] one line fix Cargo.toml --- solana/Cargo.lock | 10 ---------- solana/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/solana/Cargo.lock b/solana/Cargo.lock index e27de4ac..839efc20 100644 --- a/solana/Cargo.lock +++ b/solana/Cargo.lock @@ -6971,7 +6971,6 @@ dependencies = [ [[package]] name = "wormhole-svm-definitions" version = "0.1.0" -source = "git+https://github.com/wormhole-foundation/wormhole.git?rev=33dd6a56541c2d15d3e20faa1330ba542a5fa727#33dd6a56541c2d15d3e20faa1330ba542a5fa727" dependencies = [ "borsh 1.5.0", "cfg-if", @@ -6982,7 +6981,6 @@ dependencies = [ [[package]] name = "wormhole-svm-shim" version = "0.1.0" -source = "git+https://github.com/wormhole-foundation/wormhole.git?rev=33dd6a56541c2d15d3e20faa1330ba542a5fa727#33dd6a56541c2d15d3e20faa1330ba542a5fa727" dependencies = [ "solana-program", "wormhole-svm-definitions", @@ -7173,11 +7171,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "wormhole-svm-definitions" -version = "0.1.0" - -[[patch.unused]] -name = "wormhole-svm-shim" -version = "0.1.0" diff --git a/solana/Cargo.toml b/solana/Cargo.toml index 558cb435..7575ed56 100644 --- a/solana/Cargo.toml +++ b/solana/Cargo.toml @@ -52,7 +52,7 @@ bytemuck = "1.13.0" wormhole-svm-shim = { git = "https://github.com/wormhole-foundation/wormhole.git", rev = "33dd6a56541c2d15d3e20faa1330ba542a5fa727" } wormhole-svm-definitions = { git = "https://github.com/wormhole-foundation/wormhole.git", rev = "33dd6a56541c2d15d3e20faa1330ba542a5fa727", features = ["borsh"] } -[patch."https://github.com/wormholelabs-xyz/wormhole.git"] +[patch."https://github.com/wormhole-foundation/wormhole.git"] wormhole-svm-shim = { path = "lib/wormhole/svm/wormhole-core-shims/crates/shim" } wormhole-svm-definitions = { path = "lib/wormhole/svm/wormhole-core-shims/crates/definitions" } From 7b1f9338b44b34aaf2c53f69dce31ef801aa90a5 Mon Sep 17 00:00:00 2001 From: Bengt Lofgren Date: Mon, 19 May 2025 17:03:13 +0100 Subject: [PATCH 2/4] changed variable names --- .../tests/shimful/fast_market_order_shim.rs | 7 +++--- .../processor/initialize_fast_market_order.rs | 25 +++++++------------ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs b/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs index 5177a533..0dca4789 100644 --- a/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs +++ b/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs @@ -162,13 +162,12 @@ pub fn initialize_fast_market_order_shimful_instruction( .0; let create_fast_market_order_accounts = InitializeFastMarketOrderFallbackAccounts { - signer: &payer_signer.pubkey(), - fast_market_order_account: &fast_market_order_account, + payer: &payer_signer.pubkey(), + new_fast_market_order: &fast_market_order_account, guardian_set: &guardian_signature_info.guardian_set_pubkey, - guardian_set_signatures: &guardian_signature_info.guardian_signatures_pubkey, + shim_guardian_signatures: &guardian_signature_info.guardian_signatures_pubkey, from_endpoint, verify_vaa_shim_program: &WORMHOLE_VERIFY_VAA_SHIM_PID, - system_program: &solana_program::system_program::ID, }; InitializeFastMarketOrderFallback { diff --git a/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs b/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs index 20196ca3..2c68a84c 100644 --- a/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs +++ b/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs @@ -10,8 +10,7 @@ pub struct InitializeFastMarketOrderAccounts<'ix> { /// Lamports from this signer will be used to create the new fast market /// order account. This account will be the only authority allowed to /// close this account. - // TODO: Rename to "payer". - pub signer: &'ix Pubkey, // 0 + pub payer: &'ix Pubkey, // 0 /// The from router endpoint account for the hash of the fast market order pub from_endpoint: &'ix Pubkey, @@ -21,14 +20,10 @@ pub struct InitializeFastMarketOrderAccounts<'ix> { pub verify_vaa_shim_program: &'ix Pubkey, // 1 pub guardian_set: &'ix Pubkey, // 2 /// The guardian set signatures of fast market order VAA. - // TODO: Rename to "shim_guardian_signatures". - pub guardian_set_signatures: &'ix Pubkey, // 3 + pub shim_guardian_signatures: &'ix Pubkey, // 3 /// The fast market order account pubkey (that is created by the /// instruction). - // TODO: Rename to "new_fast_market_order". - pub fast_market_order_account: &'ix Pubkey, // 4 - // TODO: Remove. - pub system_program: &'ix Pubkey, // 5 + pub new_fast_market_order: &'ix Pubkey, // 4 } #[derive(Debug, Copy, Clone, Pod, Zeroable)] @@ -71,14 +66,13 @@ pub struct InitializeFastMarketOrder<'ix> { impl InitializeFastMarketOrder<'_> { pub fn instruction(&self) -> Instruction { let InitializeFastMarketOrderAccounts { - signer: payer, - fast_market_order_account: new_fast_market_order, + payer, + new_fast_market_order, from_endpoint, guardian_set: wormhole_guardian_set, - guardian_set_signatures: shim_guardian_signatures, + shim_guardian_signatures, verify_vaa_shim_program, - system_program: _, } = self.accounts; let accounts = vec![ @@ -195,13 +189,12 @@ mod test { InitializeFastMarketOrder { program_id: &Default::default(), accounts: InitializeFastMarketOrderAccounts { - signer: &Default::default(), - fast_market_order_account: &Default::default(), + payer: &Default::default(), + new_fast_market_order: &Default::default(), from_endpoint: &Default::default(), verify_vaa_shim_program: &Default::default(), guardian_set: &Default::default(), - guardian_set_signatures: &Default::default(), - system_program: &Default::default(), + shim_guardian_signatures: &Default::default(), }, data: InitializeFastMarketOrderData::new( FastMarketOrder::new(FastMarketOrderParams { From b970874b2d6b80ff2949b465e6a0f1c2b8e73957 Mon Sep 17 00:00:00 2001 From: Bengt Lofgren Date: Mon, 19 May 2025 18:09:55 +0100 Subject: [PATCH 3/4] FastMarketOrderParams used in instruction data builder --- solana/Makefile | 2 +- .../tests/shimful/fast_market_order_shim.rs | 40 ++++++++++--------- .../tests/shimful/shims_make_offer.rs | 14 +++++-- .../shimful/shims_prepare_order_response.rs | 2 +- .../tests/test_scenarios/make_offer.rs | 3 +- .../tests/testing_engine/config.rs | 7 ++-- .../tests/testing_engine/engine.rs | 9 +++-- .../src/fallback/processor/execute_order.rs | 2 +- .../processor/initialize_fast_market_order.rs | 40 ++++++++++--------- .../fallback/processor/place_initial_offer.rs | 2 +- .../processor/prepare_order_response.rs | 6 +-- .../src/state/fast_market_order.rs | 5 +-- 12 files changed, 73 insertions(+), 59 deletions(-) diff --git a/solana/Makefile b/solana/Makefile index ca2ff462..0ebe297f 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -75,7 +75,7 @@ test-sbf: cargo build-sbf --features mainnet ### Unfortunately we cannot saturate all CPUs to perform tests due to nondeterministic `RpcError` ### reverts. We constrain the number of threads when we run these tests. - cd modules/matching-engine-testing && cargo test-sbf --features mainnet -- --test-threads 1 + cd modules/matching-engine-testing && cargo test-sbf --features mainnet -- --test-threads 5 .PHONY: anchor-test anchor-test: anchor-test-setup diff --git a/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs b/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs index 0dca4789..ec1e0cde 100644 --- a/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs +++ b/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs @@ -51,12 +51,13 @@ pub async fn initialize_fast_market_order_shimful( let program_id = &testing_context.get_matching_engine_program_id(); let test_vaa_pair = current_state.get_test_vaa_pair(config.vaa_index); let fast_transfer_vaa = test_vaa_pair.fast_transfer_vaa.clone(); - let fast_market_order = create_fast_market_order_state_from_vaa_data( + let fast_market_order_params = create_fast_market_order_params_from_vaa_data( &fast_transfer_vaa.vaa_data, config .close_account_refund_recipient .unwrap_or_else(|| testing_context.testing_actors.solvers[0].pubkey()), ); + let fast_market_order = FastMarketOrderState::new(&fast_market_order_params); let payer_signer = config .payer_signer .clone() @@ -75,7 +76,7 @@ pub async fn initialize_fast_market_order_shimful( let (fast_market_order_account, fast_market_order_bump) = Pubkey::find_program_address( &[ FastMarketOrderState::SEED_PREFIX, - &fast_market_order.digest(), + &fast_market_order.digest().as_ref(), &fast_market_order.close_account_refund_recipient.as_ref(), ], program_id, @@ -89,7 +90,7 @@ pub async fn initialize_fast_market_order_shimful( let initialize_fast_market_order_ix = initialize_fast_market_order_shimful_instruction( &payer_signer, program_id, - fast_market_order, + &fast_market_order_params, &guardian_signature_info, &from_endpoint, ); @@ -138,7 +139,7 @@ pub async fn initialize_fast_market_order_shimful( /// /// * `payer_signer` - The payer signer keypair /// * `program_id` - The program id -/// * `fast_market_order` - The fast market order state +/// * `fast_market_order_params` - The fast market order params /// * `guardian_signature_info` - Information about guardian signatures /// /// # Returns @@ -147,14 +148,15 @@ pub async fn initialize_fast_market_order_shimful( pub fn initialize_fast_market_order_shimful_instruction( payer_signer: &Rc, program_id: &Pubkey, - fast_market_order: FastMarketOrderState, + fast_market_order_params: &FastMarketOrderParams, guardian_signature_info: &GuardianSignatureInfo, from_endpoint: &Pubkey, ) -> solana_program::instruction::Instruction { + let fast_market_order = FastMarketOrderState::new(fast_market_order_params); let fast_market_order_account = Pubkey::find_program_address( &[ FastMarketOrderState::SEED_PREFIX, - &fast_market_order.digest(), + &fast_market_order.digest().as_ref(), &fast_market_order.close_account_refund_recipient.as_ref(), ], program_id, @@ -164,7 +166,7 @@ pub fn initialize_fast_market_order_shimful_instruction( let create_fast_market_order_accounts = InitializeFastMarketOrderFallbackAccounts { payer: &payer_signer.pubkey(), new_fast_market_order: &fast_market_order_account, - guardian_set: &guardian_signature_info.guardian_set_pubkey, + wormhole_guardian_set: &guardian_signature_info.guardian_set_pubkey, shim_guardian_signatures: &guardian_signature_info.guardian_signatures_pubkey, from_endpoint, verify_vaa_shim_program: &WORMHOLE_VERIFY_VAA_SHIM_PID, @@ -174,7 +176,7 @@ pub fn initialize_fast_market_order_shimful_instruction( program_id, accounts: create_fast_market_order_accounts, data: InitializeFastMarketOrderFallbackData::new( - fast_market_order, + fast_market_order_params, guardian_signature_info.guardian_set_bump, ), } @@ -228,9 +230,9 @@ pub async fn close_fast_market_order_fallback( .await; } -/// Create the fast market order state from the vaa data +/// Create the fast market order params from the vaa data /// -/// This function creates the fast market order state from the vaa data +/// This function creates the fast market order params from the vaa data /// /// # Arguments /// @@ -239,11 +241,11 @@ pub async fn close_fast_market_order_fallback( /// /// # Returns /// -/// * `fast_market_order_state` - The fast market order state -pub fn create_fast_market_order_state_from_vaa_data( +/// * `fast_market_order_params` - The fast market order params +pub fn create_fast_market_order_params_from_vaa_data( vaa_data: &utils::vaa::PostedVaaData, close_account_refund_recipient: Pubkey, -) -> FastMarketOrderState { +) -> FastMarketOrderParams { let vaa_message = matching_engine::fallback::place_initial_offer::VaaMessageBodyHeader::new( vaa_data.consistency_level, vaa_data.vaa_time, @@ -267,7 +269,7 @@ pub fn create_fast_market_order_state_from_vaa_data( fixed_array }; - let fast_market_order = FastMarketOrderState::new(FastMarketOrderParams { + let fast_market_order_params = FastMarketOrderParams { amount_in: order.amount_in, min_amount_out: order.min_amount_out, deadline: order.deadline, @@ -285,13 +287,15 @@ pub fn create_fast_market_order_state_from_vaa_data( vaa_emitter_chain: vaa_data.emitter_chain, vaa_consistency_level: vaa_data.consistency_level, vaa_emitter_address: vaa_data.emitter_address, - }); + }; - assert_eq!(fast_market_order.redeemer, order.redeemer); + assert_eq!(fast_market_order_params.redeemer, order.redeemer); assert_eq!( - vaa_message.digest(&fast_market_order).as_ref(), + vaa_message + .digest(&FastMarketOrderState::new(&fast_market_order_params)) + .as_ref(), vaa_data.digest().as_ref() ); - fast_market_order + fast_market_order_params } diff --git a/solana/modules/matching-engine-testing/tests/shimful/shims_make_offer.rs b/solana/modules/matching-engine-testing/tests/shimful/shims_make_offer.rs index 8f830fb8..0846c795 100644 --- a/solana/modules/matching-engine-testing/tests/shimful/shims_make_offer.rs +++ b/solana/modules/matching-engine-testing/tests/shimful/shims_make_offer.rs @@ -11,10 +11,10 @@ use matching_engine::fallback::place_initial_offer::{ PlaceInitialOfferCctpShimAccounts as PlaceInitialOfferCctpShimFallbackAccounts, PlaceInitialOfferCctpShimData as PlaceInitialOfferCctpShimFallbackData, }; -use matching_engine::state::Auction; +use matching_engine::state::{Auction, FastMarketOrder}; use solana_program_test::ProgramTestContext; -use super::fast_market_order_shim::create_fast_market_order_state_from_vaa_data; +use super::fast_market_order_shim::create_fast_market_order_params_from_vaa_data; use solana_sdk::{pubkey::Pubkey, signer::Signer}; /// Places an initial offer using the fallback program. The vaa is constructed from a passed in PostedVaaData struct. The nonce is forced to 0. @@ -295,7 +295,10 @@ impl PlaceInitialOfferShimfulAccounts { .fast_transfer_vaa; let vaa_data = fast_transfer_vaa.get_vaa_data(); let fast_market_order_state = - create_fast_market_order_state_from_vaa_data(vaa_data, close_account_refund_recipient); + FastMarketOrder::new(&create_fast_market_order_params_from_vaa_data( + vaa_data, + close_account_refund_recipient, + )); let offer_actor = config.actor.get_actor(&testing_context.testing_actors); let offer_token = match &config.custom_accounts { Some(custom_accounts) => match custom_accounts.offer_token_address { @@ -309,7 +312,10 @@ impl PlaceInitialOfferShimfulAccounts { .unwrap(), }; let auction = Pubkey::find_program_address( - &[Auction::SEED_PREFIX, &fast_market_order_state.digest()], + &[ + Auction::SEED_PREFIX, + &fast_market_order_state.digest().as_ref(), + ], &program_id, ) .0; diff --git a/solana/modules/matching-engine-testing/tests/shimful/shims_prepare_order_response.rs b/solana/modules/matching-engine-testing/tests/shimful/shims_prepare_order_response.rs index a97fefb1..e0a04a46 100644 --- a/solana/modules/matching-engine-testing/tests/shimful/shims_prepare_order_response.rs +++ b/solana/modules/matching-engine-testing/tests/shimful/shims_prepare_order_response.rs @@ -384,7 +384,7 @@ impl PrepareOrderResponseShimAccountsHelper { let fast_market_order_digest = data.fast_market_order.digest(); let prepared_order_response_seeds = [ PreparedOrderResponse::SEED_PREFIX, - &fast_market_order_digest, + &fast_market_order_digest.as_ref(), ]; let (prepared_order_response_pda, _prepared_order_response_bump) = diff --git a/solana/modules/matching-engine-testing/tests/test_scenarios/make_offer.rs b/solana/modules/matching-engine-testing/tests/test_scenarios/make_offer.rs index 244966d1..3281a11d 100644 --- a/solana/modules/matching-engine-testing/tests/test_scenarios/make_offer.rs +++ b/solana/modules/matching-engine-testing/tests/test_scenarios/make_offer.rs @@ -83,7 +83,8 @@ pub async fn test_place_initial_offer_shimful() { .fast_market_order() .unwrap() .fast_market_order - .digest(), + .digest() + .as_ref(), final_state .base() .vaas diff --git a/solana/modules/matching-engine-testing/tests/testing_engine/config.rs b/solana/modules/matching-engine-testing/tests/testing_engine/config.rs index f2a7c63d..c3197f7a 100644 --- a/solana/modules/matching-engine-testing/tests/testing_engine/config.rs +++ b/solana/modules/matching-engine-testing/tests/testing_engine/config.rs @@ -21,7 +21,7 @@ use std::{ }; use crate::{ - shimful::fast_market_order_shim::create_fast_market_order_state_from_vaa_data, + shimful::fast_market_order_shim::create_fast_market_order_params_from_vaa_data, shimless::initialize::AuctionParametersConfig, utils::{ auction::{ActiveAuctionState, AuctionAccounts}, @@ -657,14 +657,15 @@ impl CombinedInstructionConfig { ) -> Self { let test_vaa_pair = current_state.get_test_vaa_pair(0); let fast_transfer_vaa = test_vaa_pair.fast_transfer_vaa.clone(); - let fast_market_order = create_fast_market_order_state_from_vaa_data( + let fast_market_order_params = create_fast_market_order_params_from_vaa_data( &fast_transfer_vaa.vaa_data, testing_actors.solvers[0].pubkey(), ); + let fast_market_order = FastMarketOrderState::new(&fast_market_order_params); let (fast_market_order_address, _fast_market_order_bump) = Pubkey::find_program_address( &[ FastMarketOrderState::SEED_PREFIX, - &fast_market_order.digest(), + &fast_market_order.digest().as_ref(), &fast_market_order.close_account_refund_recipient.as_ref(), ], program_id, diff --git a/solana/modules/matching-engine-testing/tests/testing_engine/engine.rs b/solana/modules/matching-engine-testing/tests/testing_engine/engine.rs index efb1245e..867af4e1 100644 --- a/solana/modules/matching-engine-testing/tests/testing_engine/engine.rs +++ b/solana/modules/matching-engine-testing/tests/testing_engine/engine.rs @@ -33,7 +33,7 @@ use super::setup::TestingContext; use super::{config::*, state::*}; use crate::shimful; use crate::shimful::fast_market_order_shim::{ - create_fast_market_order_state_from_vaa_data, initialize_fast_market_order_shimful, + create_fast_market_order_params_from_vaa_data, initialize_fast_market_order_shimful, initialize_fast_market_order_shimful_instruction, }; use crate::shimful::shims_make_offer::{ @@ -858,12 +858,13 @@ impl TestingEngine { let test_vaa_pair = current_state.get_test_vaa_pair(create_fast_market_order_config.vaa_index); let fast_transfer_vaa = test_vaa_pair.fast_transfer_vaa.clone(); - let fast_market_order = create_fast_market_order_state_from_vaa_data( + let fast_market_order_params = create_fast_market_order_params_from_vaa_data( &fast_transfer_vaa.vaa_data, create_fast_market_order_config .close_account_refund_recipient .unwrap_or_else(|| self.testing_context.testing_actors.solvers[0].pubkey()), ); + let fast_market_order = FastMarketOrder::new(&fast_market_order_params); let create_fast_market_order_payer_signer = create_fast_market_order_config .payer_signer .clone() @@ -881,7 +882,7 @@ impl TestingEngine { let (fast_market_order_account, fast_market_order_bump) = Pubkey::find_program_address( &[ FastMarketOrder::SEED_PREFIX, - &fast_market_order.digest(), + &fast_market_order.digest().as_ref(), &fast_market_order.close_account_refund_recipient.as_ref(), ], program_id, @@ -895,7 +896,7 @@ impl TestingEngine { let create_fast_market_order_instruction = initialize_fast_market_order_shimful_instruction( &create_fast_market_order_payer_signer, program_id, - fast_market_order, + &fast_market_order_params, &guardian_signature_info, &from_endpoint_pubkey, ); diff --git a/solana/programs/matching-engine/src/fallback/processor/execute_order.rs b/solana/programs/matching-engine/src/fallback/processor/execute_order.rs index 1c06ab40..a0da40c7 100644 --- a/solana/programs/matching-engine/src/fallback/processor/execute_order.rs +++ b/solana/programs/matching-engine/src/fallback/processor/execute_order.rs @@ -213,7 +213,7 @@ pub(super) fn process(accounts: &[AccountInfo]) -> Result<()> { let active_auction_inner_info = active_auction.info.as_ref().unwrap(); require!( - active_auction.vaa_hash == fast_market_order.digest(), + active_auction.vaa_hash == fast_market_order.digest().as_ref(), MatchingEngineError::VaaMismatch ); diff --git a/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs b/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs index 2c68a84c..dcdd8923 100644 --- a/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs +++ b/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs @@ -1,8 +1,12 @@ use anchor_lang::{prelude::*, Discriminator}; use bytemuck::{Pod, Zeroable}; -use solana_program::{instruction::Instruction, keccak}; +use solana_program::instruction::Instruction; -use crate::{error::MatchingEngineError, state::FastMarketOrder, ID}; +use crate::{ + error::MatchingEngineError, + state::{FastMarketOrder, FastMarketOrderParams}, + ID, +}; const NUM_ACCOUNTS: usize = 7; @@ -11,19 +15,18 @@ pub struct InitializeFastMarketOrderAccounts<'ix> { /// order account. This account will be the only authority allowed to /// close this account. pub payer: &'ix Pubkey, // 0 - /// The from router endpoint account for the hash of the fast market order - pub from_endpoint: &'ix Pubkey, + pub from_endpoint: &'ix Pubkey, // 1 + /// The verify VAA shim program account + pub verify_vaa_shim_program: &'ix Pubkey, // 2 /// Wormhole guardian set account used to check recovered pubkeys using /// [Self::guardian_set_signatures]. - // TODO: Rename to "wormhole_guardian_set" - pub verify_vaa_shim_program: &'ix Pubkey, // 1 - pub guardian_set: &'ix Pubkey, // 2 + pub wormhole_guardian_set: &'ix Pubkey, // 3 /// The guardian set signatures of fast market order VAA. - pub shim_guardian_signatures: &'ix Pubkey, // 3 + pub shim_guardian_signatures: &'ix Pubkey, // 4 /// The fast market order account pubkey (that is created by the /// instruction). - pub new_fast_market_order: &'ix Pubkey, // 4 + pub new_fast_market_order: &'ix Pubkey, // 5 } #[derive(Debug, Copy, Clone, Pod, Zeroable)] @@ -39,10 +42,9 @@ pub struct InitializeFastMarketOrderData { impl InitializeFastMarketOrderData { // Adds the padding to the InitializeFastMarketOrderData - // TODO: change FastMarketOrder to FastMarketOrderParams. - pub fn new(fast_market_order: FastMarketOrder, guardian_set_bump: u8) -> Self { + pub fn new(fast_market_order_params: &FastMarketOrderParams, guardian_set_bump: u8) -> Self { Self { - fast_market_order, + fast_market_order: FastMarketOrder::new(fast_market_order_params), guardian_set_bump, _padding: Default::default(), } @@ -70,7 +72,7 @@ impl InitializeFastMarketOrder<'_> { new_fast_market_order, from_endpoint, - guardian_set: wormhole_guardian_set, + wormhole_guardian_set, shim_guardian_signatures, verify_vaa_shim_program, } = self.accounts; @@ -129,7 +131,7 @@ pub(super) fn process( 3, // wormhole_guardian_set_index 4, // shim_guardian_signatures_index data.guardian_set_bump, - keccak::Hash(fast_market_order_vaa_digest), + fast_market_order_vaa_digest, accounts, )?; @@ -140,7 +142,7 @@ pub(super) fn process( let (expected_fast_market_order_key, fast_market_order_bump) = Pubkey::find_program_address( &[ FastMarketOrder::SEED_PREFIX, - &fast_market_order_vaa_digest, + &fast_market_order_vaa_digest.as_ref(), fast_market_order.close_account_refund_recipient.as_ref(), ], &ID, @@ -159,7 +161,7 @@ pub(super) fn process( &ID, &[&[ FastMarketOrder::SEED_PREFIX, - &fast_market_order_vaa_digest, + &fast_market_order_vaa_digest.as_ref(), // TODO: Replace with payer_info.key. fast_market_order.close_account_refund_recipient.as_ref(), &[fast_market_order_bump], @@ -193,11 +195,11 @@ mod test { new_fast_market_order: &Default::default(), from_endpoint: &Default::default(), verify_vaa_shim_program: &Default::default(), - guardian_set: &Default::default(), + wormhole_guardian_set: &Default::default(), shim_guardian_signatures: &Default::default(), }, data: InitializeFastMarketOrderData::new( - FastMarketOrder::new(FastMarketOrderParams { + &FastMarketOrderParams { amount_in: Default::default(), min_amount_out: Default::default(), deadline: Default::default(), @@ -215,7 +217,7 @@ mod test { vaa_emitter_chain: Default::default(), vaa_consistency_level: Default::default(), vaa_emitter_address: Default::default(), - }), + }, Default::default(), ), } diff --git a/solana/programs/matching-engine/src/fallback/processor/place_initial_offer.rs b/solana/programs/matching-engine/src/fallback/processor/place_initial_offer.rs index aa50eecc..9d5ba061 100644 --- a/solana/programs/matching-engine/src/fallback/processor/place_initial_offer.rs +++ b/solana/programs/matching-engine/src/fallback/processor/place_initial_offer.rs @@ -344,7 +344,7 @@ mod tests { #[test] fn test_bytemuck() { - let test_fast_market_order = FastMarketOrder::new(FastMarketOrderParams { + let test_fast_market_order = FastMarketOrder::new(&FastMarketOrderParams { amount_in: 1000000000000000000, min_amount_out: 1000000000000000000, deadline: 1000000000, diff --git a/solana/programs/matching-engine/src/fallback/processor/prepare_order_response.rs b/solana/programs/matching-engine/src/fallback/processor/prepare_order_response.rs index 9c49dd8f..534da98d 100644 --- a/solana/programs/matching-engine/src/fallback/processor/prepare_order_response.rs +++ b/solana/programs/matching-engine/src/fallback/processor/prepare_order_response.rs @@ -280,7 +280,7 @@ pub(super) fn process( Pubkey::find_program_address( &[ PreparedOrderResponse::SEED_PREFIX, - &fast_market_order_digest, + &fast_market_order_digest.as_ref(), ], &ID, ); @@ -294,7 +294,7 @@ pub(super) fn process( &ID, &[&[ PreparedOrderResponse::SEED_PREFIX, - &fast_market_order_digest, + &fast_market_order_digest.as_ref(), &[prepared_order_response_bump], ]], )?; @@ -411,7 +411,7 @@ pub(super) fn process( PreparedOrderResponse { seeds: PreparedOrderResponseSeeds { - fast_vaa_hash: fast_market_order_digest, + fast_vaa_hash: <[u8; 32]>::try_from(fast_market_order_digest.as_ref()).unwrap(), bump: prepared_order_response_bump, }, info: PreparedOrderResponseInfo { diff --git a/solana/programs/matching-engine/src/state/fast_market_order.rs b/solana/programs/matching-engine/src/state/fast_market_order.rs index 503e45de..9b93055e 100644 --- a/solana/programs/matching-engine/src/state/fast_market_order.rs +++ b/solana/programs/matching-engine/src/state/fast_market_order.rs @@ -75,7 +75,7 @@ pub struct FastMarketOrderParams { impl FastMarketOrder { pub const SEED_PREFIX: &'static [u8] = b"fast_market_order"; - pub fn new(params: FastMarketOrderParams) -> Self { + pub fn new(params: &FastMarketOrderParams) -> Self { Self { amount_in: params.amount_in, min_amount_out: params.min_amount_out, @@ -123,7 +123,7 @@ impl FastMarketOrder { /// A double hash of the serialised fast market order. Used for seeds and /// verification. // TODO: Change return type to keccak::Hash - pub fn digest(&self) -> [u8; 32] { + pub fn digest(&self) -> keccak::Hash { wormhole_svm_definitions::compute_keccak_digest( keccak::hashv(&[ &self.vaa_timestamp.to_be_bytes(), @@ -137,6 +137,5 @@ impl FastMarketOrder { ]), None, ) - .0 } } From 62927260183f09ecf08d27c72c1a387bc83a2744 Mon Sep 17 00:00:00 2001 From: Bengt Lofgren Date: Mon, 19 May 2025 19:20:45 +0100 Subject: [PATCH 4/4] [broken] forcing payer_signer to be close_account_refund_recipient --- .../tests/shimful/fast_market_order_shim.rs | 6 +- .../create_and_close_fast_market_order.rs | 56 +------------------ solana/programs/matching-engine/src/error.rs | 2 +- .../processor/initialize_fast_market_order.rs | 11 +++- .../src/state/fast_market_order.rs | 2 +- 5 files changed, 14 insertions(+), 63 deletions(-) diff --git a/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs b/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs index ec1e0cde..57e56a6a 100644 --- a/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs +++ b/solana/modules/matching-engine-testing/tests/shimful/fast_market_order_shim.rs @@ -61,7 +61,7 @@ pub async fn initialize_fast_market_order_shimful( let payer_signer = config .payer_signer .clone() - .unwrap_or_else(|| testing_context.testing_actors.payer_signer.clone()); + .unwrap_or_else(|| testing_context.testing_actors.solvers[0].keypair().clone()); let guardian_signature_info = create_guardian_signatures( testing_context, test_context, @@ -77,7 +77,7 @@ pub async fn initialize_fast_market_order_shimful( &[ FastMarketOrderState::SEED_PREFIX, &fast_market_order.digest().as_ref(), - &fast_market_order.close_account_refund_recipient.as_ref(), + &payer_signer.pubkey().as_ref(), ], program_id, ); @@ -157,7 +157,7 @@ pub fn initialize_fast_market_order_shimful_instruction( &[ FastMarketOrderState::SEED_PREFIX, &fast_market_order.digest().as_ref(), - &fast_market_order.close_account_refund_recipient.as_ref(), + &payer_signer.pubkey().as_ref(), ], program_id, ) diff --git a/solana/modules/matching-engine-testing/tests/test_scenarios/create_and_close_fast_market_order.rs b/solana/modules/matching-engine-testing/tests/test_scenarios/create_and_close_fast_market_order.rs index c2ab5eb8..7dec5300 100644 --- a/solana/modules/matching-engine-testing/tests/test_scenarios/create_and_close_fast_market_order.rs +++ b/solana/modules/matching-engine-testing/tests/test_scenarios/create_and_close_fast_market_order.rs @@ -114,47 +114,6 @@ pub async fn test_close_fast_market_order_fallback() { .await; } -/// Test that the close fast market order account works correctly for the fallback instruction -#[tokio::test] -pub async fn test_close_fast_market_order_fallback_with_custom_refund_recipient() { - let vaa_args = vec![VaaArgs { - post_vaa: false, - ..VaaArgs::default() - }]; - let (testing_context, mut test_context) = setup_environment( - ShimMode::VerifyAndPostSignature, - TransferDirection::FromArbitrumToEthereum, - Some(vaa_args), - ) - .await; - let solver_1 = &testing_context.testing_actors.solvers[1].clone(); - let solver_1_balance_before = solver_1.get_lamport_balance(&mut test_context).await; - let testing_engine = TestingEngine::new(testing_context).await; - let instruction_triggers = vec![ - InstructionTrigger::InitializeProgram(InitializeInstructionConfig::default()), - InstructionTrigger::CreateCctpRouterEndpoints( - CreateCctpRouterEndpointsInstructionConfig::default(), - ), - InstructionTrigger::InitializeFastMarketOrderShim( - InitializeFastMarketOrderShimInstructionConfig { - close_account_refund_recipient: Some(solver_1.pubkey()), - ..InitializeFastMarketOrderShimInstructionConfig::default() - }, - ), - InstructionTrigger::CloseFastMarketOrderShim(CloseFastMarketOrderShimInstructionConfig { - close_account_refund_recipient_keypair: Some(solver_1.keypair()), - ..CloseFastMarketOrderShimInstructionConfig::default() - }), - ]; - testing_engine - .execute(&mut test_context, instruction_triggers, None) - .await; - let solver_1_balance_after = solver_1.get_lamport_balance(&mut test_context).await; - assert!( - solver_1_balance_after > solver_1_balance_before, - "Solver 1 balance after is not greater than balance before" - ); -} /* Sad path tests Section @@ -332,7 +291,6 @@ pub async fn test_multiple_fast_market_orders_can_be_opened_and_closed_by_differ ) .await; let solver_1 = testing_context.testing_actors.solvers[1].clone(); - let solver_2 = testing_context.testing_actors.solvers[2].clone(); let testing_engine = TestingEngine::new(testing_context).await; let instruction_triggers = vec![ InstructionTrigger::InitializeProgram(InitializeInstructionConfig::default()), @@ -357,6 +315,7 @@ pub async fn test_multiple_fast_market_orders_can_be_opened_and_closed_by_differ let instruction_triggers_1 = vec![InstructionTrigger::InitializeFastMarketOrderShim( InitializeFastMarketOrderShimInstructionConfig { fast_market_order_id: 1, + payer_signer: Some(solver_1.keypair()), close_account_refund_recipient: Some(solver_1.pubkey()), ..InitializeFastMarketOrderShimInstructionConfig::default() }, @@ -377,13 +336,6 @@ pub async fn test_multiple_fast_market_orders_can_be_opened_and_closed_by_differ fast_market_order_address: Some(fast_market_order_0_pubkey), ..CloseFastMarketOrderShimInstructionConfig::default() }), - InstructionTrigger::InitializeFastMarketOrderShim( - InitializeFastMarketOrderShimInstructionConfig { - fast_market_order_id: 2, - close_account_refund_recipient: Some(solver_2.pubkey()), - ..InitializeFastMarketOrderShimInstructionConfig::default() - }, - ), ]; let current_state = testing_engine .execute( @@ -398,12 +350,6 @@ pub async fn test_multiple_fast_market_orders_can_be_opened_and_closed_by_differ .fast_market_order_address; let instruction_triggers_3 = vec![ InstructionTrigger::CloseFastMarketOrderShim(CloseFastMarketOrderShimInstructionConfig { - close_account_refund_recipient_keypair: Some(solver_2.keypair()), - fast_market_order_address: Some(fast_market_order_2_pubkey), - ..CloseFastMarketOrderShimInstructionConfig::default() - }), - InstructionTrigger::CloseFastMarketOrderShim(CloseFastMarketOrderShimInstructionConfig { - close_account_refund_recipient_keypair: Some(solver_1.keypair()), fast_market_order_address: Some(fast_market_order_1_pubkey), ..CloseFastMarketOrderShimInstructionConfig::default() }), diff --git a/solana/programs/matching-engine/src/error.rs b/solana/programs/matching-engine/src/error.rs index ab56bae8..8c143758 100644 --- a/solana/programs/matching-engine/src/error.rs +++ b/solana/programs/matching-engine/src/error.rs @@ -92,7 +92,7 @@ pub enum MatchingEngineError { InvalidVerifyVaaShimProgram = 0x600, - // Fallback matching engine errors + // V2 matching engine errors AccountAlreadyInitialized = 0x700, AccountNotWritable = 0x702, BorshDeserializationError = 0x704, diff --git a/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs b/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs index dcdd8923..7f41e1dd 100644 --- a/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs +++ b/solana/programs/matching-engine/src/fallback/processor/initialize_fast_market_order.rs @@ -115,6 +115,12 @@ pub(super) fn process( // fast market order account. let payer_info = &accounts[0]; + require_keys_eq!( + *payer_info.key, + fast_market_order.close_account_refund_recipient, + MatchingEngineError::MismatchingCloseAccountRefundRecipient + ); + // These accounts will be used by the Verify VAA shim program. let from_endpoint = super::helpers::try_live_endpoint_account(&accounts[1], "from_endpoint") .map_err(|e: Error| e.with_account_name("from_endpoint"))?; @@ -143,7 +149,7 @@ pub(super) fn process( &[ FastMarketOrder::SEED_PREFIX, &fast_market_order_vaa_digest.as_ref(), - fast_market_order.close_account_refund_recipient.as_ref(), + payer_info.key.as_ref(), ], &ID, ); @@ -162,8 +168,7 @@ pub(super) fn process( &[&[ FastMarketOrder::SEED_PREFIX, &fast_market_order_vaa_digest.as_ref(), - // TODO: Replace with payer_info.key. - fast_market_order.close_account_refund_recipient.as_ref(), + payer_info.key.as_ref(), &[fast_market_order_bump], ]], )?; diff --git a/solana/programs/matching-engine/src/state/fast_market_order.rs b/solana/programs/matching-engine/src/state/fast_market_order.rs index 9b93055e..8579f485 100644 --- a/solana/programs/matching-engine/src/state/fast_market_order.rs +++ b/solana/programs/matching-engine/src/state/fast_market_order.rs @@ -64,7 +64,7 @@ pub struct FastMarketOrderParams { pub max_fee: u64, pub init_auction_fee: u64, pub redeemer_message: [u8; 512], - pub close_account_refund_recipient: Pubkey, + pub close_account_refund_recipient: Pubkey, // Same as the payer pub vaa_sequence: u64, pub vaa_timestamp: u32, pub vaa_emitter_chain: u16,