Files
sol-trade-sdk/src/lib.rs
T

262 lines
7.3 KiB
Rust
Raw Normal View History

2024-12-31 16:51:58 +08:00
pub mod accounts;
pub mod constants;
pub mod error;
pub mod instruction;
2025-01-23 17:48:10 +08:00
pub mod grpc;
2025-01-23 21:15:55 +08:00
pub mod common;
2025-02-21 20:47:28 +08:00
pub mod ipfs;
2025-04-10 12:29:42 +08:00
pub mod swqos;
2025-04-02 13:39:59 +08:00
pub mod pumpfun;
2025-02-21 20:47:28 +08:00
use std::sync::Arc;
2025-01-23 17:48:10 +08:00
2025-04-10 12:29:42 +08:00
use swqos::{FeeClient, JitoClient, NextBlockClient, ZeroSlotClient};
2025-04-02 13:39:59 +08:00
use rustls::crypto::{ring::default_provider, CryptoProvider};
2025-01-23 17:48:10 +08:00
use solana_sdk::{
2025-02-21 20:47:28 +08:00
commitment_config::CommitmentConfig,
pubkey::Pubkey,
2025-04-02 13:39:59 +08:00
signature::{Keypair, Signer},
2024-12-31 16:51:58 +08:00
};
2025-01-14 19:18:48 +08:00
2025-04-02 13:39:59 +08:00
use common::{logs_data::TradeInfo, logs_events::PumpfunEvent, logs_subscribe, Cluster, PriorityFee, SolanaRpcClient};
2025-01-23 21:15:55 +08:00
use common::logs_subscribe::SubscriptionHandle;
2025-02-21 20:47:28 +08:00
use ipfs::TokenMetadataIPFS;
2025-01-03 14:43:26 +08:00
2024-12-31 16:51:58 +08:00
pub struct PumpFun {
pub payer: Arc<Keypair>,
2025-04-02 13:39:59 +08:00
pub rpc: Arc<SolanaRpcClient>,
pub fee_clients: Vec<Arc<FeeClient>>,
2025-02-21 23:02:15 +08:00
pub priority_fee: PriorityFee,
2025-04-02 13:39:59 +08:00
pub cluster: Cluster,
}
impl Clone for PumpFun {
fn clone(&self) -> Self {
Self {
payer: self.payer.clone(),
rpc: self.rpc.clone(),
fee_clients: self.fee_clients.clone(),
priority_fee: self.priority_fee.clone(),
cluster: self.cluster.clone(),
}
}
2025-01-09 00:12:43 +08:00
}
2024-12-31 16:51:58 +08:00
impl PumpFun {
2025-02-15 18:53:17 +08:00
#[inline]
2025-04-02 13:39:59 +08:00
pub async fn new(
2025-02-21 20:47:28 +08:00
payer: Arc<Keypair>,
2025-04-02 13:39:59 +08:00
cluster: &Cluster,
2024-12-31 16:51:58 +08:00
) -> Self {
2025-04-02 13:39:59 +08:00
if CryptoProvider::get_default().is_none() {
let _ = default_provider()
.install_default()
.map_err(|e| anyhow::anyhow!("Failed to install crypto provider: {:?}", e));
}
2024-12-31 16:51:58 +08:00
2025-04-02 13:39:59 +08:00
let rpc = SolanaRpcClient::new_with_commitment(
cluster.clone().rpc_url,
cluster.clone().commitment
);
let mut fee_clients: Vec<Arc<FeeClient>> = vec![];
if cluster.clone().use_jito {
let jito_client = JitoClient::new(
cluster.clone().rpc_url,
cluster.clone().block_engine_url
).await.expect("Failed to create Jito client");
fee_clients.push(Arc::new(jito_client));
}
if cluster.clone().use_zeroslot {
let zeroslot_client = ZeroSlotClient::new(
cluster.clone().rpc_url,
cluster.clone().zeroslot_url,
cluster.clone().zeroslot_auth_token
);
fee_clients.push(Arc::new(zeroslot_client));
}
if cluster.clone().use_nextblock {
let nextblock_client = NextBlockClient::new(
cluster.clone().rpc_url,
cluster.clone().nextblock_url,
cluster.clone().nextblock_auth_token
);
fee_clients.push(Arc::new(nextblock_client));
}
2025-01-03 14:43:26 +08:00
2024-12-31 16:51:58 +08:00
Self {
payer,
2025-04-02 13:39:59 +08:00
rpc: Arc::new(rpc),
fee_clients,
priority_fee: cluster.clone().priority_fee,
cluster: cluster.clone(),
2024-12-31 16:51:58 +08:00
}
}
2025-04-02 13:39:59 +08:00
2025-01-09 00:12:43 +08:00
/// Buy tokens
2024-12-31 16:51:58 +08:00
pub async fn buy(
&self,
2025-04-02 13:39:59 +08:00
mint: Pubkey,
2024-12-31 16:51:58 +08:00
amount_sol: u64,
slippage_basis_points: Option<u64>,
2025-04-02 13:39:59 +08:00
) -> Result<(), anyhow::Error> {
pumpfun::buy::buy(
self.rpc.clone(),
self.payer.clone(),
2024-12-31 16:51:58 +08:00
mint,
2025-02-21 20:47:28 +08:00
amount_sol,
slippage_basis_points,
2025-04-02 13:39:59 +08:00
self.priority_fee.clone(),
2025-02-21 20:47:28 +08:00
).await
2024-12-31 16:51:58 +08:00
}
2025-01-09 00:12:43 +08:00
/// Buy tokens using Jito
2025-04-02 13:39:59 +08:00
pub async fn buy_with_tip(
2025-01-03 14:43:26 +08:00
&self,
2025-04-02 13:39:59 +08:00
mint: Pubkey,
2025-02-21 20:47:28 +08:00
amount_sol: u64,
2025-01-03 14:43:26 +08:00
slippage_basis_points: Option<u64>,
2025-04-02 13:39:59 +08:00
) -> Result<(), anyhow::Error> {
pumpfun::buy::buy_with_tip(
self.rpc.clone(),
self.fee_clients.clone(),
self.payer.clone(),
2025-01-03 14:43:26 +08:00
mint,
2025-02-21 20:47:28 +08:00
amount_sol,
slippage_basis_points,
2025-04-02 13:39:59 +08:00
self.priority_fee.clone(),
2025-02-21 20:47:28 +08:00
).await
2025-01-03 14:43:26 +08:00
}
2025-01-09 00:12:43 +08:00
/// Sell tokens
2024-12-31 16:51:58 +08:00
pub async fn sell(
&self,
2025-04-02 13:39:59 +08:00
mint: Pubkey,
2024-12-31 16:51:58 +08:00
amount_token: Option<u64>,
2025-04-02 13:39:59 +08:00
) -> Result<(), anyhow::Error> {
pumpfun::sell::sell(
self.rpc.clone(),
self.payer.clone(),
mint.clone(),
2025-02-21 20:47:28 +08:00
amount_token,
2025-04-02 13:39:59 +08:00
self.priority_fee.clone(),
2025-02-21 20:47:28 +08:00
).await
2025-01-07 13:18:31 +08:00
}
2025-01-09 00:12:43 +08:00
/// Sell tokens by percentage
2025-01-07 13:18:31 +08:00
pub async fn sell_by_percent(
&self,
2025-04-02 13:39:59 +08:00
mint: Pubkey,
2025-01-07 13:18:31 +08:00
percent: u64,
2025-04-02 13:39:59 +08:00
) -> Result<(), anyhow::Error> {
pumpfun::sell::sell_by_percent(
self.rpc.clone(),
self.payer.clone(),
mint.clone(),
2025-02-21 20:47:28 +08:00
percent,
2025-04-02 13:39:59 +08:00
self.priority_fee.clone(),
2025-02-21 20:47:28 +08:00
).await
2024-12-31 16:51:58 +08:00
}
2025-04-02 14:08:48 +08:00
pub async fn sell_by_percent_with_tip(
2025-01-14 19:18:48 +08:00
&self,
2025-04-02 13:39:59 +08:00
mint: Pubkey,
2025-01-14 19:18:48 +08:00
percent: u64,
2025-04-02 13:39:59 +08:00
) -> Result<(), anyhow::Error> {
2025-04-02 14:08:48 +08:00
pumpfun::sell::sell_by_percent_with_tip(
2025-04-02 13:39:59 +08:00
self.rpc.clone(),
self.fee_clients.clone(),
self.payer.clone(),
2025-02-21 20:47:28 +08:00
mint,
percent,
2025-04-02 13:39:59 +08:00
self.priority_fee.clone(),
2025-02-21 22:32:43 +08:00
).await
2025-01-14 19:18:48 +08:00
}
2025-01-09 00:12:43 +08:00
/// Sell tokens using Jito
2025-04-02 14:08:48 +08:00
pub async fn sell_with_tip(
2025-01-03 14:43:26 +08:00
&self,
2025-04-02 13:39:59 +08:00
mint: Pubkey,
2025-01-03 14:43:26 +08:00
amount_token: Option<u64>,
2025-04-02 13:39:59 +08:00
) -> Result<(), anyhow::Error> {
2025-04-02 14:08:48 +08:00
pumpfun::sell::sell_with_tip(
2025-04-02 13:39:59 +08:00
self.rpc.clone(),
self.fee_clients.clone(),
self.payer.clone(),
2025-01-03 14:43:26 +08:00
mint,
2025-02-21 20:47:28 +08:00
amount_token,
2025-04-02 13:39:59 +08:00
self.priority_fee.clone(),
2025-02-21 20:47:28 +08:00
).await
2024-12-31 16:51:58 +08:00
}
2025-01-07 13:18:31 +08:00
2025-02-15 18:53:17 +08:00
#[inline]
2025-01-07 13:18:31 +08:00
pub async fn tokens_subscription<F>(
&self,
ws_url: &str,
commitment: CommitmentConfig,
callback: F,
bot_wallet: Option<Pubkey>,
) -> Result<SubscriptionHandle, Box<dyn std::error::Error>>
where
2025-01-25 16:01:16 +08:00
F: Fn(PumpfunEvent) + Send + Sync + 'static,
2025-01-07 13:18:31 +08:00
{
logs_subscribe::tokens_subscription(ws_url, commitment, callback, bot_wallet).await
}
2025-02-15 18:53:17 +08:00
#[inline]
2025-01-07 13:18:31 +08:00
pub async fn stop_subscription(&self, subscription_handle: SubscriptionHandle) {
subscription_handle.shutdown().await;
}
2025-01-09 01:21:20 +08:00
2025-02-15 18:53:17 +08:00
#[inline]
2025-04-02 13:39:59 +08:00
pub async fn get_sol_balance(&self, payer: &Pubkey) -> Result<u64, anyhow::Error> {
pumpfun::common::get_sol_balance(&self.rpc, payer).await
2025-01-09 01:21:20 +08:00
}
2025-01-13 18:42:21 +08:00
2025-02-15 18:53:17 +08:00
#[inline]
2025-04-02 13:39:59 +08:00
pub async fn get_payer_sol_balance(&self) -> Result<u64, anyhow::Error> {
pumpfun::common::get_sol_balance(&self.rpc, &self.payer.pubkey()).await
2025-02-21 21:15:10 +08:00
}
#[inline]
2025-04-02 13:39:59 +08:00
pub async fn get_token_balance(&self, payer: &Pubkey, mint: &Pubkey) -> Result<u64, anyhow::Error> {
println!("get_token_balance payer: {}, mint: {}, cluster: {}", payer, mint, self.cluster.rpc_url);
pumpfun::common::get_token_balance(&self.rpc, payer, mint).await
2025-01-13 18:42:21 +08:00
}
2025-02-15 18:53:17 +08:00
#[inline]
2025-04-02 13:39:59 +08:00
pub async fn get_payer_token_balance(&self, mint: &Pubkey) -> Result<u64, anyhow::Error> {
pumpfun::common::get_token_balance(&self.rpc, &self.payer.pubkey(), mint).await
2025-02-21 20:47:28 +08:00
}
2025-01-25 17:16:52 +08:00
2025-02-21 21:15:10 +08:00
#[inline]
pub fn get_payer_pubkey(&self) -> Pubkey {
self.payer.pubkey()
}
#[inline]
pub fn get_payer(&self) -> &Keypair {
self.payer.as_ref()
}
2025-02-21 20:47:28 +08:00
#[inline]
pub fn get_token_price(&self,virtual_sol_reserves: u64, virtual_token_reserves: u64) -> f64 {
2025-04-02 13:39:59 +08:00
pumpfun::common::get_token_price(virtual_sol_reserves, virtual_token_reserves)
2025-02-21 20:47:28 +08:00
}
#[inline]
pub fn get_buy_price(&self, amount: u64, trade_info: &TradeInfo) -> u64 {
2025-04-02 13:39:59 +08:00
pumpfun::common::get_buy_price(amount, trade_info)
2025-02-21 20:47:28 +08:00
}
#[inline]
pub async fn transfer_sol(&self, payer: &Keypair, receive_wallet: &Pubkey, amount: u64) -> Result<(), anyhow::Error> {
2025-04-02 13:39:59 +08:00
pumpfun::common::transfer_sol(&self.rpc, payer, receive_wallet, amount).await
2024-12-31 16:51:58 +08:00
}
}