From 378b8fc324fda804bffb57386b35fc95c367d24e Mon Sep 17 00:00:00 2001 From: vibes Date: Wed, 25 Mar 2026 11:05:41 +0000 Subject: [PATCH] Add PumpSwapParams::from_pool_data() to avoid redundant pool fetch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using find_by_mint() followed by from_pool_address_by_rpc(), the pool account is fetched twice via getAccount — once in find_by_mint (which returns the decoded Pool) and again in from_pool_address_by_rpc. from_pool_data() accepts a pre-decoded Pool reference and only fetches the 2 token balance RPC calls, saving 1 getAccount per trade. from_pool_address_by_rpc() now delegates to from_pool_data() internally, so existing callers are unaffected. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/trading/core/params.rs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/trading/core/params.rs b/src/trading/core/params.rs index 2fcf5bb..71bb06f 100755 --- a/src/trading/core/params.rs +++ b/src/trading/core/params.rs @@ -404,8 +404,21 @@ impl PumpSwapParams { pool_address: &Pubkey, ) -> Result { let pool_data = crate::instruction::utils::pumpswap::fetch_pool(rpc, pool_address).await?; + Self::from_pool_data(rpc, pool_address, &pool_data).await + } + + /// Build params from an already-decoded Pool, only fetching token balances. + /// + /// Saves 1 RPC `getAccount` call vs `from_pool_address_by_rpc` when pool data + /// is already available (e.g. from `pumpswap::find_by_mint` which returns the + /// decoded Pool). + pub async fn from_pool_data( + rpc: &SolanaRpcClient, + pool_address: &Pubkey, + pool_data: &crate::instruction::utils::pumpswap_types::Pool, + ) -> Result { let (pool_base_token_reserves, pool_quote_token_reserves) = - crate::instruction::utils::pumpswap::get_token_balances(&pool_data, rpc).await?; + crate::instruction::utils::pumpswap::get_token_balances(pool_data, rpc).await?; let creator = pool_data.coin_creator; let coin_creator_vault_ata = crate::instruction::utils::pumpswap::coin_creator_vault_ata( creator, @@ -415,12 +428,12 @@ impl PumpSwapParams { crate::instruction::utils::pumpswap::coin_creator_vault_authority(creator); let base_token_program_ata = get_associated_token_address_with_program_id( - &pool_address, + pool_address, &pool_data.base_mint, &crate::constants::TOKEN_PROGRAM, ); let quote_token_program_ata = get_associated_token_address_with_program_id( - &pool_address, + pool_address, &pool_data.quote_mint, &crate::constants::TOKEN_PROGRAM, ); @@ -431,10 +444,10 @@ impl PumpSwapParams { quote_mint: pool_data.quote_mint, pool_base_token_account: pool_data.pool_base_token_account, pool_quote_token_account: pool_data.pool_quote_token_account, - pool_base_token_reserves: pool_base_token_reserves, - pool_quote_token_reserves: pool_quote_token_reserves, - coin_creator_vault_ata: coin_creator_vault_ata, - coin_creator_vault_authority: coin_creator_vault_authority, + pool_base_token_reserves, + pool_quote_token_reserves, + coin_creator_vault_ata, + coin_creator_vault_authority, base_token_program: if pool_data.pool_base_token_account == base_token_program_ata { crate::constants::TOKEN_PROGRAM } else {