| Crates.io | solana-pump-grpc-sdk |
| lib.rs | solana-pump-grpc-sdk |
| version | 0.1.0 |
| created_at | 2025-11-13 20:15:53.517881+00 |
| updated_at | 2025-11-13 20:15:53.517881+00 |
| description | Solana Pump/PumpAmm gRPC event listener SDK |
| homepage | https://github.com/vnxfsc/solana-pump-grpc-sdk |
| repository | https://github.com/vnxfsc/solana-pump-grpc-sdk |
| max_upload_size | |
| id | 1931816 |
| size | 163,600 |
这是一个用于监听 Solana 链上 Pump 和 PumpAmm 程序事件的 高性能 Rust SDK。基于 yellowstone-grpc,提供简单易用的 API 来处理各种事件。
6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6PCreateEvent / CreateV2Event:创建代币(含 is_mayhem_mode 标记)CompleteEvent:曲线完成TradeEvent:买卖撮合pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEABuyEvent:买入SellEvent:卖出CreatePoolEvent:创建池在你的 Cargo.toml 中添加依赖:
[dependencies]
solana-pump-grpc-sdk = "0.1.0"
tokio = { version = "1.48", features = ["full"] }
log = "0.4"
pretty_env_logger = "0.5"
[dependencies]
solana-pump-grpc-sdk = { git = "https://github.com/vnxfsc/solana-pump-grpc-sdk" }
[dependencies]
solana-pump-grpc-sdk = { path = "../solana-pump-grpc-sdk" }
然后运行:
cargo build
use solana_pump_grpc_sdk::{GrpcClient, Config, EventFilter, FilteredLoggingEventHandler};
use rustls::crypto::ring;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 设置日志级别,如果环境变量 RUST_LOG 未设置,则默认使用 info
if std::env::var("RUST_LOG").is_err() {
std::env::set_var("RUST_LOG", "info");
}
pretty_env_logger::init();
ring::default_provider()
.install_default()
.expect("failed to install Rustls crypto provider");
// Yellowstone gRPC server URL
let url = "https://solana-yellowstone-grpc.publicnode.com".to_string();
let client = GrpcClient::new(Config::new(url));
// 配置要打印的事件类型
let filter = EventFilter {
create: false, // Pump CreateEvent
create_v2: false, // Pump CreateV2Event
complete: false, // Pump CompleteEvent
trade: true, // Pump TradeEvent
buy: true, // PumpAmm BuyEvent
sell: false, // PumpAmm SellEvent
create_pool: false, // PumpAmm CreatePoolEvent
};
let handler = FilteredLoggingEventHandler::new(filter);
// 订阅多个程序
let program_ids = vec![
"6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P", // Pump
"pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA", // PumpAmm
];
for program_id in program_ids {
let client = client.clone();
let handler = handler.clone();
tokio::spawn(async move {
if let Err(e) = client.subscribe(program_id.to_string(), handler).await {
log::error!("订阅程序 {} 失败: {:?}", program_id, e);
}
});
}
tokio::signal::ctrl_c().await?;
Ok(())
}
如果需要自定义事件处理逻辑,可以实现 EventHandler trait:
use solana_pump_grpc_sdk::{EventHandler, EventContext, GrpcClient, Config};
use solana_pump_grpc_sdk::models::*;
use rustls::crypto::ring;
struct MyEventHandler;
impl EventHandler for MyEventHandler {
fn on_create_event(&self, event: &CreateEvent, ctx: &EventContext) {
println!("创建事件: {:?}", event);
println!("槽位: {}, 签名: {}", ctx.slot, ctx.signature);
}
fn on_trade_event(&self, event: &TradeEvent, ctx: &EventContext) {
println!("交易事件: {:?}", event);
println!("耗时: {:?}", ctx.elapsed);
}
// 实现其他感兴趣的事件处理方法...
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
pretty_env_logger::init();
ring::default_provider()
.install_default()
.expect("failed to install Rustls crypto provider");
let url = "https://solana-yellowstone-grpc.publicnode.com".to_string();
let client = GrpcClient::new(Config::new(url));
let handler = MyEventHandler;
client.subscribe(
"6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P".to_string(),
handler
).await?;
Ok(())
}
use solana_pump_grpc_sdk::{Config, GrpcClient};
use std::time::Duration;
use yellowstone_grpc_proto::geyser::CommitmentLevel;
// 自定义配置
let config = Config::new("https://solana-yellowstone-grpc.publicnode.com".to_string())
.with_connect_timeout(Duration::from_secs(30))
.with_timeout(Duration::from_secs(120))
.with_keep_alive(true)
.with_commitment(CommitmentLevel::Confirmed);
let client = GrpcClient::new(config);
Config客户端配置结构体。
pub struct Config {
pub url: String,
pub connect_timeout: Duration,
pub timeout: Duration,
pub keep_alive_while_idle: bool,
pub commitment: CommitmentLevel,
}
方法:
new(url: String) -> Self:创建新配置with_connect_timeout(timeout: Duration) -> Self:设置连接超时with_timeout(timeout: Duration) -> Self:设置请求超时with_keep_alive(keep_alive: bool) -> Self:设置是否保持连接with_commitment(commitment: CommitmentLevel) -> Self:设置承诺级别GrpcClientgRPC 客户端。
impl GrpcClient {
pub fn new(config: Config) -> Self;
pub async fn subscribe<H: EventHandler>(
&self,
program_id: String,
handler: H,
) -> Result<()>;
}
EventHandler事件处理器 trait。所有方法都有默认的空实现,只需实现感兴趣的事件处理方法。
pub trait EventHandler: Send + Sync {
fn on_create_event(&self, event: &CreateEvent, ctx: &EventContext);
fn on_create_v2_event(&self, event: &CreateV2Event, ctx: &EventContext);
fn on_complete_event(&self, event: &CompleteEvent, ctx: &EventContext);
fn on_trade_event(&self, event: &TradeEvent, ctx: &EventContext);
fn on_buy_event(&self, event: &BuyEvent, ctx: &EventContext);
fn on_sell_event(&self, event: &SellEvent, ctx: &EventContext);
fn on_create_pool_event(&self, event: &CreatePoolEvent, ctx: &EventContext);
}
LoggingEventHandler内置的日志事件处理器,自动将所有事件记录到日志中。
pub struct LoggingEventHandler;
使用示例:
let handler = LoggingEventHandler;
client.subscribe(program_id, handler).await?;
EventFilter 和 FilteredLoggingEventHandler事件过滤器,用于选择性地打印特定类型的事件。
pub struct EventFilter {
pub create: bool, // CreateEvent
pub create_v2: bool, // CreateV2Event
pub complete: bool, // CompleteEvent
pub trade: bool, // TradeEvent
pub buy: bool, // BuyEvent
pub sell: bool, // SellEvent
pub create_pool: bool, // CreatePoolEvent
}
方法:
all() -> Self:启用所有事件(默认)none() -> Self:禁用所有事件pump_only() -> Self:只启用 Pump 相关事件(Create, CreateV2, Complete, Trade)pumpamm_only() -> Self:只启用 PumpAmm 相关事件(Buy, Sell, CreatePool)使用示例:
// 使用预定义过滤器
let filter = EventFilter::pump_only();
let handler = FilteredLoggingEventHandler::new(filter);
// 或自定义过滤器
let filter = EventFilter {
trade: true,
buy: true,
..EventFilter::none()
};
let handler = FilteredLoggingEventHandler::new(filter);
EventContext事件上下文,包含事件发生的上下文信息。
pub struct EventContext {
pub slot: u64, // 区块槽位
pub tx_index: u64, // 交易索引
pub signature: Signature, // 交易签名
pub timestamp: Instant, // 事件处理开始时间戳
pub elapsed: Duration, // 从开始处理到当前事件的耗时
}
项目包含一个基本使用示例:
# 运行示例(无需设置环境变量)
cargo run --example basic
# 或者设置日志级别
RUST_LOG=debug cargo run --example basic
.
├── Cargo.toml
├── README.md
├── src/
│ ├── lib.rs # 库入口
│ ├── client/ # gRPC 客户端
│ │ ├── mod.rs
│ │ ├── config.rs # 配置结构
│ │ ├── handler.rs # 事件处理器 trait
│ │ └── grpc.rs # gRPC 客户端实现
│ ├── models/ # 事件模型
│ │ └── mod.rs
│ ├── parser/ # 事件解析器
│ │ ├── mod.rs
│ │ └── events.rs # EventTrait 和 discriminator 常量定义
│ └── error.rs # 错误类型
└── examples/
└── basic.rs # 基本使用示例
SDK 使用 Result<T, Error> 类型进行错误处理。错误类型包括:
GrpcClient:gRPC 客户端错误GrpcBuilder:gRPC 客户端构建错误GrpcConnection:gRPC 连接错误TlsConfig:TLS 配置错误SubscribeError:订阅错误ParseError:事件解析错误BorshDeserialize:Borsh 反序列化错误SignatureParse:签名解析错误tokio:异步运行时yellowstone-grpc-client:Yellowstone gRPC 客户端borsh:Borsh 序列化/反序列化solana-sdk:Solana SDKthiserror:错误处理MIT