pumpfun-sdk-client 0.1.1

Off-chain client helpers for pumpfun-sdk (send/simulate transactions)
Documentation
#![forbid(unsafe_code)]

use pumpfun_sdk_idl::generated::pump_amm_min;
use solana_client::rpc_client::RpcClient;
use solana_commitment_config::CommitmentConfig;
use solana_sdk::{
    pubkey::Pubkey,
    signature::{Keypair, Signature, Signer},
    transaction::Transaction,
};

#[derive(Debug, thiserror::Error)]
pub enum PumpswapClientError {
    #[error("rpc error: {0}")]
    Rpc(#[from] solana_client::client_error::ClientError),
}

pub struct PumpswapClient {
    rpc: RpcClient,
    commitment: CommitmentConfig,
}

impl PumpswapClient {
    pub fn new(rpc_url: impl Into<String>) -> Self {
        Self {
            rpc: RpcClient::new(rpc_url.into()),
            commitment: CommitmentConfig::confirmed(),
        }
    }

    pub fn with_commitment(mut self, c: CommitmentConfig) -> Self {
        self.commitment = c;
        self
    }

    pub fn rpc(&self) -> &RpcClient {
        &self.rpc
    }

    pub fn simulate_buy(
        &self,
        payer: &Keypair,
        pumpswap_program_id: Pubkey,
        accounts: pump_amm_min::buy::Accounts,
        args: pump_amm_min::buy::Args,
    ) -> Result<solana_client::rpc_response::RpcSimulateTransactionResult, PumpswapClientError> {
        let ix = pump_amm_min::buy::build_ix(pumpswap_program_id, accounts, args);
        let bh = self.rpc.get_latest_blockhash()?;
        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
        Ok(self.rpc.simulate_transaction(&tx)?.value)
    }

    pub fn send_buy(
        &self,
        payer: &Keypair,
        pumpswap_program_id: Pubkey,
        accounts: pump_amm_min::buy::Accounts,
        args: pump_amm_min::buy::Args,
    ) -> Result<Signature, PumpswapClientError> {
        let ix = pump_amm_min::buy::build_ix(pumpswap_program_id, accounts, args);
        let bh = self.rpc.get_latest_blockhash()?;
        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
        Ok(self
            .rpc
            .send_and_confirm_transaction_with_spinner_and_commitment(&tx, self.commitment)?)
    }

    pub fn simulate_sell(
        &self,
        payer: &Keypair,
        pumpswap_program_id: Pubkey,
        accounts: pump_amm_min::sell::Accounts,
        args: pump_amm_min::sell::Args,
    ) -> Result<solana_client::rpc_response::RpcSimulateTransactionResult, PumpswapClientError> {
        let ix = pump_amm_min::sell::build_ix(pumpswap_program_id, accounts, args);
        let bh = self.rpc.get_latest_blockhash()?;
        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
        Ok(self.rpc.simulate_transaction(&tx)?.value)
    }

    pub fn send_sell(
        &self,
        payer: &Keypair,
        pumpswap_program_id: Pubkey,
        accounts: pump_amm_min::sell::Accounts,
        args: pump_amm_min::sell::Args,
    ) -> Result<Signature, PumpswapClientError> {
        let ix = pump_amm_min::sell::build_ix(pumpswap_program_id, accounts, args);
        let bh = self.rpc.get_latest_blockhash()?;
        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
        Ok(self
            .rpc
            .send_and_confirm_transaction_with_spinner_and_commitment(&tx, self.commitment)?)
    }
}