2025-06-16 18:21:23 +08:00
# Sol Trade SDK
2024-12-31 16:51:58 +08:00
2025-06-16 18:21:23 +08:00
A comprehensive Rust SDK for seamless interaction with Solana DEX trading programs. This SDK provides a robust set of tools and interfaces to integrate PumpFun and PumpSwap functionality into your applications.
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
## Features
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
1. **PumpFun Trading** : Support for `create` , `buy` , `sell` operations
2. **PumpSwap Trading** : Support for PumpSwap pool trading operations
3. **Logs Subscription** : Subscribe to PumpFun program transaction logs
4. **Yellowstone gRPC** : Subscribe to program logs using gRPC
5. **Multiple MEV Protection** : Support for Jito, Nextblock, 0slot, Nozomi services
6. **Concurrent Transactions** : Submit transactions using multiple MEV services simultaneously; the fastest succeeds while others fail
7. **IPFS Integration** : Support for token metadata IPFS uploads
8. **Real-time Pricing** : Get real-time token prices and liquidity information
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
## Installation
Clone this project to your project directory:
```bash
cd your_project_root_directory
git clone https://github.com/0xfnzero/sol-trade-sdk
2025-05-19 14:19:21 +08:00
```
2025-06-16 18:21:23 +08:00
Add the dependency to your `Cargo.toml` :
2025-05-19 14:19:21 +08:00
```toml
2025-06-16 18:21:23 +08:00
# Add to your Cargo.toml
sol-trade-sdk = { path = "./sol-trade-sdk" , version = "0.1.0" }
2025-05-19 14:19:21 +08:00
```
2025-06-16 18:21:23 +08:00
## Usage Examples
### 1. Logs Subscription - Monitor Token Creation and Trading
2025-05-19 14:19:21 +08:00
```rust
2025-06-16 18:21:23 +08:00
use sol_trade_sdk ::{ common ::pumpfun ::logs_events ::PumpfunEvent , grpc ::YellowstoneGrpc };
use solana_sdk ::signature ::Keypair ;
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Create gRPC client
2025-05-19 14:19:21 +08:00
let grpc_url = "http://127.0.0.1:10000" ;
2025-06-16 18:21:23 +08:00
let x_token = None ; // Optional auth token
let client = YellowstoneGrpc ::new ( grpc_url . to_string (), x_token ) ? ;
2025-05-19 14:19:21 +08:00
// Define callback function
let callback = | event : PumpfunEvent | {
match event {
PumpfunEvent ::NewToken ( token_info ) => {
println! ( "Received new token event: {:?} " , token_info );
},
PumpfunEvent ::NewDevTrade ( trade_info ) => {
println! ( "Received dev trade event: {:?} " , trade_info );
},
PumpfunEvent ::NewUserTrade ( trade_info ) => {
println! ( "Received new trade event: {:?} " , trade_info );
},
PumpfunEvent ::NewBotTrade ( trade_info ) => {
println! ( "Received new bot trade event: {:?} " , trade_info );
}
PumpfunEvent ::Error ( err ) => {
println! ( "Received error: {} " , err );
}
}
};
2025-06-16 18:21:23 +08:00
let payer_keypair = Keypair ::from_base58_string ( "your_private_key" );
2025-05-19 14:19:21 +08:00
client . subscribe_pumpfun ( callback , Some ( payer_keypair . pubkey ())). await ? ;
```
2025-06-16 18:21:23 +08:00
### 2. Initialize PumpFun Instance
2025-05-19 14:19:21 +08:00
```rust
use std ::sync ::Arc ;
2025-06-16 18:21:23 +08:00
use sol_trade_sdk ::{ common ::{ Cluster , PriorityFee }, PumpFun };
use solana_sdk ::{ commitment_config ::CommitmentConfig , signature ::Keypair };
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Configure priority fees
let priority_fee = PriorityFee {
2025-05-19 14:19:21 +08:00
unit_limit : 190000 ,
unit_price : 1000000 ,
2025-06-16 18:21:23 +08:00
rpc_unit_limit : 500000 ,
rpc_unit_price : 500000 ,
2025-05-19 14:19:21 +08:00
buy_tip_fee : 0.001 ,
2025-06-16 18:21:23 +08:00
buy_tip_fees : vec ! [ 0.001 , 0.002 ],
2025-05-19 14:19:21 +08:00
sell_tip_fee : 0.0001 ,
};
2025-06-16 18:21:23 +08:00
// Configure cluster
2025-05-19 14:19:21 +08:00
let cluster = Cluster {
rpc_url : "https://api.mainnet-beta.solana.com" . to_string (),
block_engine_url : "https://block-engine.example.com" . to_string (),
nextblock_url : "https://nextblock.example.com" . to_string (),
nextblock_auth_token : "nextblock_api_token" . to_string (),
zeroslot_url : "https://zeroslot.example.com" . to_string (),
zeroslot_auth_token : "zeroslot_api_token" . to_string (),
2025-06-16 18:21:23 +08:00
nozomi_url : "https://nozomi.example.com" . to_string (),
nozomi_auth_token : "nozomi_api_token" . to_string (),
2025-05-19 14:19:21 +08:00
use_jito : true ,
use_nextblock : false ,
use_zeroslot : false ,
2025-06-16 18:21:23 +08:00
use_nozomi : false ,
use_rpc : true ,
2025-05-19 14:19:21 +08:00
priority_fee ,
commitment : CommitmentConfig ::processed (),
2025-06-16 18:21:23 +08:00
lookup_table_key : None , // Optional lookup table
2025-05-19 14:19:21 +08:00
};
2025-06-16 18:21:23 +08:00
// Create PumpFun instance
let payer = Keypair ::from_base58_string ( "your_private_key" );
let pumpfun = PumpFun ::new ( Arc ::new ( payer ), & cluster ). await ;
2025-05-19 14:19:21 +08:00
```
2025-06-16 18:21:23 +08:00
### 3. Create Token
2025-05-19 14:19:21 +08:00
```rust
2025-06-16 18:21:23 +08:00
use sol_trade_sdk ::{ PumpFun , ipfs ::CreateTokenMetadata , ipfs ::create_token_metadata };
use solana_sdk ::signature ::Keypair ;
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Create token keypair
let mint_keypair = Keypair ::new ();
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Prepare token metadata
let metadata = CreateTokenMetadata {
name : "My Token" . to_string (),
symbol : "MTK" . to_string (),
description : "This is a test token" . to_string (),
file : "path/to/image.png" . to_string (), // Local file path
twitter : Some ( "https://twitter.com/example" . to_string ()),
telegram : Some ( "https://t.me/example" . to_string ()),
website : Some ( "https://example.com" . to_string ()),
metadata_uri : None , // Will be generated
};
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Upload metadata to IPFS
let api_token = "your_pinata_api_token" ;
let ipfs_response = create_token_metadata ( metadata , api_token ). await ? ;
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Create token
pumpfun . create ( mint_keypair , ipfs_response ). await ? ;
2025-05-19 14:19:21 +08:00
```
2025-06-16 18:21:23 +08:00
### 4. Buy Tokens
2025-05-19 14:19:21 +08:00
```rust
2025-06-16 18:21:23 +08:00
use solana_sdk ::{ pubkey ::Pubkey , hash ::Hash };
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
let mint_pubkey = Pubkey ::from_str ( "token_address" ) ? ;
let creator = Pubkey ::from_str ( "creator_address" ) ? ;
let recent_blockhash = Hash ::default (); // Get latest blockhash
// Sniper buy (fast purchase when new token launches)
pumpfun . sniper_buy_with_tip (
mint_pubkey ,
creator ,
1000000 , // dev_buy_token
10000 , // dev_sol_cost
50000 , // buy_sol_cost (lamports)
Some ( 100 ), // slippage (1%)
recent_blockhash ,
). await ? ;
// Copy buy (follow other traders)
pumpfun . copy_buy_with_tip (
mint_pubkey ,
creator ,
1000000 , // dev_buy_token
10000 , // dev_sol_cost
50000 , // buy_sol_cost (lamports)
Some ( 100 ), // slippage (1%)
recent_blockhash ,
"pumpfun" . to_string (), // trading platform
). await ? ;
```
### 5. Sell Tokens
```rust
// Sell by amount
pumpfun . sell_by_amount_with_tip (
mint_pubkey ,
creator ,
1000000 , // token amount
recent_blockhash ,
"pumpfun" . to_string (),
). await ? ;
// Sell by percentage
pumpfun . sell_by_percent_with_tip (
mint_pubkey ,
creator ,
50 , // percentage (50%)
2000000 , // total token amount
recent_blockhash ,
"pumpfun" . to_string (),
). await ? ;
```
### 6. Get Price and Balance Information
```rust
// Get current token price
let price = pumpfun . get_current_price ( & mint_pubkey ). await ? ;
println! ( "Current price: {} " , price );
// Get SOL balance
let sol_balance = pumpfun . get_payer_sol_balance (). await ? ;
println! ( "SOL balance: {} lamports" , sol_balance );
// Get token balance
let token_balance = pumpfun . get_payer_token_balance ( & mint_pubkey ). await ? ;
println! ( "Token balance: {} " , token_balance );
// Get liquidity information
let sol_reserves = pumpfun . get_real_sol_reserves ( & mint_pubkey ). await ? ;
println! ( "SOL reserves: {} lamports" , sol_reserves );
```
### 7. PumpSwap Subscription - Monitor AMM Events
```rust
use sol_trade_sdk ::{ common ::pumpswap ::logs_events ::PumpSwapEvent , grpc ::YellowstoneGrpc };
// Create gRPC client (same as above)
let grpc_url = "http://127.0.0.1:10000" ;
let x_token = None ;
let client = YellowstoneGrpc ::new ( grpc_url . to_string (), x_token ) ? ;
// Define callback function for PumpSwap events
let callback = | event : PumpSwapEvent | {
match event {
PumpSwapEvent ::Buy ( buy_event ) => {
println! ( "PumpSwap Buy Event: {:?} " , buy_event );
},
PumpSwapEvent ::Sell ( sell_event ) => {
println! ( "PumpSwap Sell Event: {:?} " , sell_event );
},
PumpSwapEvent ::CreatePool ( pool_event ) => {
println! ( "PumpSwap Pool Created: {:?} " , pool_event );
},
PumpSwapEvent ::Deposit ( deposit_event ) => {
println! ( "PumpSwap Deposit: {:?} " , deposit_event );
},
PumpSwapEvent ::Withdraw ( withdraw_event ) => {
println! ( "PumpSwap Withdraw: {:?} " , withdraw_event );
},
PumpSwapEvent ::Disable ( disable_event ) => {
println! ( "PumpSwap Pool Disabled: {:?} " , disable_event );
},
PumpSwapEvent ::UpdateAdmin ( admin_event ) => {
println! ( "PumpSwap Admin Updated: {:?} " , admin_event );
},
PumpSwapEvent ::UpdateFeeConfig ( fee_event ) => {
println! ( "PumpSwap Fee Config Updated: {:?} " , fee_event );
},
PumpSwapEvent ::Error ( err ) => {
println! ( "PumpSwap Error: {} " , err );
}
}
};
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
// Subscribe to PumpSwap events
client . subscribe_pumpswap ( callback ). await ? ;
```
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
### 8. PumpSwap Trading Operations
2025-05-19 14:19:21 +08:00
2025-06-16 18:21:23 +08:00
```rust
use solana_sdk ::{ pubkey ::Pubkey , hash ::Hash };
let mint_pubkey = Pubkey ::from_str ( "token_address" ) ? ;
let creator = Pubkey ::from_str ( "creator_address" ) ? ;
let recent_blockhash = Hash ::default ();
// Buy tokens on PumpSwap
pumpfun . copy_buy_with_tip (
mint_pubkey ,
creator ,
1000000 , // dev_buy_token
10000 , // dev_sol_cost
50000 , // buy_sol_cost (lamports)
Some ( 100 ), // slippage (1%)
recent_blockhash ,
"pumpswap" . to_string (), // Use PumpSwap platform
). await ? ;
// Sell tokens on PumpSwap by amount
pumpfun . sell_by_amount_with_tip (
mint_pubkey ,
creator ,
1000000 , // token amount
recent_blockhash ,
"pumpswap" . to_string (), // Use PumpSwap platform
). await ? ;
// Sell tokens on PumpSwap by percentage
pumpfun . sell_by_percent_with_tip (
mint_pubkey ,
creator ,
50 , // percentage (50%)
2000000 , // total token amount
recent_blockhash ,
"pumpswap" . to_string (), // Use PumpSwap platform
). await ? ;
2025-05-28 12:47:19 +08:00
```
2025-06-16 18:21:23 +08:00
### 9. PumpSwap Pool Information
```rust
use solana_sdk ::pubkey ::Pubkey ;
let pool_address = Pubkey ::from_str ( "pool_address" ) ? ;
// Get current price from PumpSwap pool
let price = pumpfun . get_current_price_with_pumpswap ( & pool_address ). await ? ;
println! ( "PumpSwap pool price: {} " , price );
// Get SOL reserves in PumpSwap pool
let sol_reserves = pumpfun . get_real_sol_reserves_with_pumpswap ( & pool_address ). await ? ;
println! ( "PumpSwap SOL reserves: {} lamports" , sol_reserves );
// Get token balance in PumpSwap pool
let token_balance = pumpfun . get_payer_token_balance_with_pumpswap ( & pool_address ). await ? ;
println! ( "PumpSwap token balance: {} " , token_balance );
```
## Supported Trading Platforms
- **PumpFun**: Primary meme coin trading platform
- **PumpSwap**: PumpFun's swap protocol
- **Raydium**: Integrated Raydium DEX functionality
## MEV Protection Services
- **Jito**: High-performance block space
- **Nextblock**: Fast transaction execution
- **0slot**: Zero-latency transactions
- **Nozomi**: MEV protection service
## Project Structure
```
src/
├── accounts/ # Account-related definitions
├── common/ # Common utilities and tools
├── constants/ # Constant definitions
├── error/ # Error handling
├── grpc/ # gRPC clients
├── instruction/ # Instruction building
├── ipfs/ # IPFS integration
├── pumpfun/ # PumpFun trading functionality
├── pumpswap/ # PumpSwap trading functionality
├── swqos/ # MEV service clients
├── lib.rs # Main library file
└── main.rs # Example program
```
## License
MIT License
## Contact
- Repository: https://github.com/0xfnzero/sol-trade-sdk
- Telegram Group: https://t.me/fnzero_group
## Important Notes
1. Test thoroughly before using on mainnet
2. Properly configure private keys and API tokens
3. Pay attention to slippage settings to avoid transaction failures
4. Monitor balances and transaction fees
5. Comply with relevant laws and regulations
## Language Versions
- [English ](README.md )
- [中文 ](README_CN.md )
2025-06-16 18:26:08 +08:00