pumpfun_sdk_client/
pumpswap.rs1#![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}