Skip to main content

pumpfun_sdk_client/
pumpswap.rs

1#![forbid(unsafe_code)]
2
3use pumpfun_sdk_idl::generated::pump_amm_min;
4use solana_client::rpc_client::RpcClient;
5use solana_commitment_config::CommitmentConfig;
6use solana_sdk::{
7    pubkey::Pubkey,
8    signature::{Keypair, Signature, Signer},
9    transaction::Transaction,
10};
11
12#[derive(Debug, thiserror::Error)]
13pub enum PumpswapClientError {
14    #[error("rpc error: {0}")]
15    Rpc(#[from] solana_client::client_error::ClientError),
16}
17
18pub struct PumpswapClient {
19    rpc: RpcClient,
20    commitment: CommitmentConfig,
21}
22
23impl PumpswapClient {
24    pub fn new(rpc_url: impl Into<String>) -> Self {
25        Self {
26            rpc: RpcClient::new(rpc_url.into()),
27            commitment: CommitmentConfig::confirmed(),
28        }
29    }
30
31    pub fn with_commitment(mut self, c: CommitmentConfig) -> Self {
32        self.commitment = c;
33        self
34    }
35
36    pub fn rpc(&self) -> &RpcClient {
37        &self.rpc
38    }
39
40    pub fn simulate_buy(
41        &self,
42        payer: &Keypair,
43        pumpswap_program_id: Pubkey,
44        accounts: pump_amm_min::buy::Accounts,
45        args: pump_amm_min::buy::Args,
46    ) -> Result<solana_client::rpc_response::RpcSimulateTransactionResult, PumpswapClientError> {
47        let ix = pump_amm_min::buy::build_ix(pumpswap_program_id, accounts, args);
48        let bh = self.rpc.get_latest_blockhash()?;
49        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
50        Ok(self.rpc.simulate_transaction(&tx)?.value)
51    }
52
53    pub fn send_buy(
54        &self,
55        payer: &Keypair,
56        pumpswap_program_id: Pubkey,
57        accounts: pump_amm_min::buy::Accounts,
58        args: pump_amm_min::buy::Args,
59    ) -> Result<Signature, PumpswapClientError> {
60        let ix = pump_amm_min::buy::build_ix(pumpswap_program_id, accounts, args);
61        let bh = self.rpc.get_latest_blockhash()?;
62        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
63        Ok(self
64            .rpc
65            .send_and_confirm_transaction_with_spinner_and_commitment(&tx, self.commitment)?)
66    }
67
68    pub fn simulate_sell(
69        &self,
70        payer: &Keypair,
71        pumpswap_program_id: Pubkey,
72        accounts: pump_amm_min::sell::Accounts,
73        args: pump_amm_min::sell::Args,
74    ) -> Result<solana_client::rpc_response::RpcSimulateTransactionResult, PumpswapClientError> {
75        let ix = pump_amm_min::sell::build_ix(pumpswap_program_id, accounts, args);
76        let bh = self.rpc.get_latest_blockhash()?;
77        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
78        Ok(self.rpc.simulate_transaction(&tx)?.value)
79    }
80
81    pub fn send_sell(
82        &self,
83        payer: &Keypair,
84        pumpswap_program_id: Pubkey,
85        accounts: pump_amm_min::sell::Accounts,
86        args: pump_amm_min::sell::Args,
87    ) -> Result<Signature, PumpswapClientError> {
88        let ix = pump_amm_min::sell::build_ix(pumpswap_program_id, accounts, args);
89        let bh = self.rpc.get_latest_blockhash()?;
90        let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[payer], bh);
91        Ok(self
92            .rpc
93            .send_and_confirm_transaction_with_spinner_and_commitment(&tx, self.commitment)?)
94    }
95}