chore: streamline SDK documentation and validation artifacts

This commit is contained in:
0xfnzero
2026-10-07 10:32:28 +08:00
parent f84b3d8f60
commit edba2123e1
4 changed files with 0 additions and 781 deletions
-398
View File
@@ -1,398 +0,0 @@
# Migration Guide: v0.5.x to v1.x.x
## Overview
Version 1.0.0 introduces a significant architectural improvement by transitioning from a trait-based event system to an enum-based event system. This change brings:
- **Better Type Safety**: Compile-time guarantees for event types
- **Improved Performance**: Eliminates dynamic dispatch overhead (no `Box<dyn Trait>`)
- **Simpler Code**: Standard Rust patterns instead of custom macros
- **Better IDE Support**: Full autocomplete and type inference
## Breaking Changes Summary
| Component | v0.5.x | v1.x.x |
| ------------------ | --------------------------- | --------------------------- |
| Event Type | `Box<dyn UnifiedEvent>` | `DexEvent` (enum) |
| Callback Signature | `Fn(Box<dyn UnifiedEvent>)` | `Fn(DexEvent)` |
| Event Matching | `match_event!` macro | Standard `match` expression |
| Metadata Access | `.event_type()` | `.metadata().event_type` |
| Event Properties | `.signature()` | `.metadata().signature` |
## Migration Steps
### Step 1: Update Callback Signatures
**Before (v0.5.x):**
```rust
use solana_streamer_sdk::streaming::event_parser::UnifiedEvent;
let callback = |event: Box<dyn UnifiedEvent>| {
println!("Received event: {:?}", event);
};
```
**After (v1.x.x):**
```rust
use solana_streamer_sdk::streaming::event_parser::DexEvent;
let callback = |event: DexEvent| {
println!("Received event: {:?}", event);
};
```
### Step 2: Update Event Matching
**Before (v0.5.x):**
```rust
use solana_streamer_sdk::match_event;
match_event!(event, {
PumpFunTradeEvent => |e: PumpFunTradeEvent| {
println!("PumpFun trade: {:?}", e);
},
RaydiumCpmmSwapEvent => |e: RaydiumCpmmSwapEvent| {
println!("Raydium swap: {:?}", e);
},
});
```
**After (v1.x.x):**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => {
println!("PumpFun trade: {:?}", e);
}
DexEvent::RaydiumCpmmSwapEvent(e) => {
println!("Raydium swap: {:?}", e);
}
_ => {}
}
```
### Step 3: Update Metadata Access
**Before (v0.5.x):**
```rust
let event_type = event.event_type();
let signature = event.signature();
let slot = event.slot();
let protocol = event.protocol();
```
**After (v1.x.x):**
```rust
let event_type = event.metadata().event_type;
let signature = event.metadata().signature;
let slot = event.metadata().slot;
let protocol = event.metadata().protocol;
```
### Step 4: Update Import Statements
**Before (v0.5.x):**
```rust
use solana_streamer_sdk::{
match_event,
streaming::event_parser::{
UnifiedEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::{RaydiumCpmmSwapEvent},
},
},
};
```
**After (v1.x.x):**
```rust
use solana_streamer_sdk::streaming::event_parser::{
DexEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::{RaydiumCpmmSwapEvent},
},
};
```
Note: The `match_event!` macro is no longer needed or available.
## Complete Example Migration
### Before (v0.5.x)
```rust
use solana_streamer_sdk::{
match_event,
streaming::{
event_parser::{
UnifiedEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::RaydiumCpmmSwapEvent,
},
},
YellowstoneGrpc,
},
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let grpc = YellowstoneGrpc::new(
"grpc-endpoint".to_string(),
Some("api-key".to_string()),
)?;
let callback = |event: Box<dyn UnifiedEvent>| {
println!(
"Event type: {:?}, Signature: {}",
event.event_type(),
event.signature()
);
match_event!(event, {
PumpFunTradeEvent => |e: PumpFunTradeEvent| {
println!("PumpFun trade: {} SOL", e.sol_amount);
},
PumpFunCreateTokenEvent => |e: PumpFunCreateTokenEvent| {
println!("New token: {}", e.name);
},
RaydiumCpmmSwapEvent => |e: RaydiumCpmmSwapEvent| {
println!("Raydium swap");
},
});
};
grpc.subscribe_events(
protocols,
event_filter,
tx_filter,
account_filter,
callback,
).await?;
Ok(())
}
```
### After (v1.x.x)
```rust
use solana_streamer_sdk::streaming::{
event_parser::{
DexEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::RaydiumCpmmSwapEvent,
},
},
YellowstoneGrpc,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let grpc = YellowstoneGrpc::new(
"grpc-endpoint".to_string(),
Some("api-key".to_string()),
)?;
let callback = |event: DexEvent| {
println!(
"Event type: {:?}, Signature: {}",
event.metadata().event_type,
event.metadata().signature
);
match event {
DexEvent::PumpFunTradeEvent(e) => {
println!("PumpFun trade: {} SOL", e.sol_amount);
}
DexEvent::PumpFunCreateTokenEvent(e) => {
println!("New token: {}", e.name);
}
DexEvent::RaydiumCpmmSwapEvent(e) => {
println!("Raydium swap");
}
_ => {}
}
};
grpc.subscribe_events(
protocols,
event_filter,
tx_filter,
account_filter,
callback,
).await?;
Ok(())
}
```
## Advanced Patterns
### Pattern 1: Event Filtering with Match
**v1.x.x:**
```rust
let callback = |event: DexEvent| {
// Only process specific event types
match event {
DexEvent::PumpFunTradeEvent(e) if e.is_buy => {
println!("Buy: {} tokens", e.token_amount);
}
DexEvent::PumpFunTradeEvent(e) if !e.is_buy => {
println!("Sell: {} tokens", e.token_amount);
}
_ => {} // Ignore other events
}
};
```
### Pattern 2: Generic Event Processing
**v1.x.x:**
```rust
fn process_event(event: DexEvent) {
let metadata = event.metadata();
println!("Protocol: {:?}", metadata.protocol);
println!("Event Type: {:?}", metadata.event_type);
println!("Signature: {}", metadata.signature);
println!("Slot: {}", metadata.slot);
// Process specific event types
match event {
DexEvent::PumpFunTradeEvent(e) => handle_pumpfun_trade(e),
DexEvent::RaydiumCpmmSwapEvent(e) => handle_raydium_swap(e),
_ => {}
}
}
```
### Pattern 3: Event Type Categorization
**v1.x.x:**
```rust
fn categorize_event(event: &DexEvent) -> &'static str {
match event {
DexEvent::PumpFunTradeEvent(_)
| DexEvent::PumpSwapBuyEvent(_)
| DexEvent::PumpSwapSellEvent(_) => "Trade",
DexEvent::PumpFunCreateTokenEvent(_)
| DexEvent::PumpSwapCreatePoolEvent(_) => "Creation",
DexEvent::RaydiumCpmmDepositEvent(_)
| DexEvent::RaydiumCpmmWithdrawEvent(_) => "Liquidity",
_ => "Other",
}
}
```
## EventParser API Changes
### Parsing Transactions
**Before (v0.5.x):**
```rust
let parser = Arc::new(EventParser::new(protocols, event_filter));
parser.parse_encoded_confirmed_transaction_with_status_meta(
signature,
transaction,
Arc::new(|event: &Box<dyn UnifiedEvent>| {
println!("{:?}", event);
}),
).await?;
```
**After (v1.x.x):**
```rust
EventParser::parse_encoded_confirmed_transaction_with_status_meta(
&protocols,
event_filter.as_ref(),
signature,
transaction,
Arc::new(|event: &DexEvent| {
println!("{:?}", event);
}),
).await?;
```
The `EventParser` is now stateless with static methods, eliminating the need to create an instance.
## Common Pitfalls
### Pitfall 1: Forgetting to Handle All Variants
❌ **Incorrect:**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => { /* ... */ }
// Missing other variants!
}
```
✅ **Correct:**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => { /* ... */ }
_ => {} // Handle or ignore other events
}
```
### Pitfall 2: Using Old Metadata Access Pattern
❌ **Incorrect:**
```rust
let sig = event.signature(); // Method doesn't exist anymore
```
✅ **Correct:**
```rust
let sig = event.metadata().signature;
```
### Pitfall 3: Attempting to Use `match_event!` Macro
❌ **Incorrect:**
```rust
match_event!(event, { /* ... */ }); // Macro no longer exists
```
✅ **Correct:**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => { /* ... */ }
_ => {}
}
```
## Benefits of the New System
1. **Type Safety**: The compiler catches more errors at compile time
2. **Performance**: No dynamic dispatch overhead
3. **Simplicity**: Standard Rust patterns, no custom macros
4. **Better Tooling**: Full IDE support with autocomplete
5. **Easier Debugging**: Clearer stack traces and error messages
6. **Serialization**: Built-in `Serialize`/`Deserialize` support for all events
-379
View File
@@ -1,379 +0,0 @@
# 迁移指南:v0.5.x 到 v1.x.x
## 概述
版本 0.6.0 引入了一个重要的架构改进,从基于 trait 的事件系统过渡到基于 enum 的事件系统。此变更带来:
- **更好的类型安全**: 编译时保证事件类型
- **改进的性能**: 消除动态分发开销(不再使用 `Box<dyn Trait>`)
- **更简单的代码**: 标准 Rust 模式而不是自定义宏
- **更好的 IDE 支持**: 完整的自动补全和类型推断
## 破坏性变更摘要
| 组件 | v0.5.x | v1.x.x |
|-----------|--------|--------|
| 事件类型 | `Box<dyn UnifiedEvent>` | `DexEvent`(枚举) |
| 回调签名 | `Fn(Box<dyn UnifiedEvent>)` | `Fn(DexEvent)` |
| 事件匹配 | `match_event!` 宏 | 标准 `match` 表达式 |
| 元数据访问 | `.event_type()` | `.metadata().event_type` |
| 事件属性 | `.signature()` | `.metadata().signature` |
## 迁移步骤
### 步骤 1:更新回调签名
**之前 (v0.5.x):**
```rust
use solana_streamer_sdk::streaming::event_parser::UnifiedEvent;
let callback = |event: Box<dyn UnifiedEvent>| {
println!("接收到事件: {:?}", event);
};
```
**之后 (v1.x.x):**
```rust
use solana_streamer_sdk::streaming::event_parser::DexEvent;
let callback = |event: DexEvent| {
println!("接收到事件: {:?}", event);
};
```
### 步骤 2:更新事件匹配
**之前 (v0.5.x):**
```rust
use solana_streamer_sdk::match_event;
match_event!(event, {
PumpFunTradeEvent => |e: PumpFunTradeEvent| {
println!("PumpFun 交易: {:?}", e);
},
RaydiumCpmmSwapEvent => |e: RaydiumCpmmSwapEvent| {
println!("Raydium 交换: {:?}", e);
},
});
```
**之后 (v1.x.x):**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => {
println!("PumpFun 交易: {:?}", e);
}
DexEvent::RaydiumCpmmSwapEvent(e) => {
println!("Raydium 交换: {:?}", e);
}
_ => {}
}
```
### 步骤 3:更新元数据访问
**之前 (v0.5.x):**
```rust
let event_type = event.event_type();
let signature = event.signature();
let slot = event.slot();
let protocol = event.protocol();
```
**之后 (v1.x.x):**
```rust
let event_type = event.metadata().event_type;
let signature = event.metadata().signature;
let slot = event.metadata().slot;
let protocol = event.metadata().protocol;
```
### 步骤 4:更新导入语句
**之前 (v0.5.x):**
```rust
use solana_streamer_sdk::{
match_event,
streaming::event_parser::{
UnifiedEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::{RaydiumCpmmSwapEvent},
},
},
};
```
**之后 (v1.x.x):**
```rust
use solana_streamer_sdk::streaming::event_parser::{
DexEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::{RaydiumCpmmSwapEvent},
},
};
```
注意:`match_event!` 宏不再需要或可用。
## 完整示例迁移
### 之前 (v0.5.x)
```rust
use solana_streamer_sdk::{
match_event,
streaming::{
event_parser::{
UnifiedEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::RaydiumCpmmSwapEvent,
},
},
YellowstoneGrpc,
},
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let grpc = YellowstoneGrpc::new(
"grpc-endpoint".to_string(),
Some("api-key".to_string()),
)?;
let callback = |event: Box<dyn UnifiedEvent>| {
println!(
"事件类型: {:?}, 签名: {}",
event.event_type(),
event.signature()
);
match_event!(event, {
PumpFunTradeEvent => |e: PumpFunTradeEvent| {
println!("PumpFun 交易: {} SOL", e.sol_amount);
},
PumpFunCreateTokenEvent => |e: PumpFunCreateTokenEvent| {
println!("新代币: {}", e.name);
},
RaydiumCpmmSwapEvent => |e: RaydiumCpmmSwapEvent| {
println!("Raydium 交换");
},
});
};
grpc.subscribe_events(
protocols,
event_filter,
tx_filter,
account_filter,
callback,
).await?;
Ok(())
}
```
### 之后 (v1.x.x)
```rust
use solana_streamer_sdk::streaming::{
event_parser::{
DexEvent,
protocols::{
pumpfun::{PumpFunTradeEvent, PumpFunCreateTokenEvent},
raydium_cpmm::RaydiumCpmmSwapEvent,
},
},
YellowstoneGrpc,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let grpc = YellowstoneGrpc::new(
"grpc-endpoint".to_string(),
Some("api-key".to_string()),
)?;
let callback = |event: DexEvent| {
println!(
"事件类型: {:?}, 签名: {}",
event.metadata().event_type,
event.metadata().signature
);
match event {
DexEvent::PumpFunTradeEvent(e) => {
println!("PumpFun 交易: {} SOL", e.sol_amount);
}
DexEvent::PumpFunCreateTokenEvent(e) => {
println!("新代币: {}", e.name);
}
DexEvent::RaydiumCpmmSwapEvent(e) => {
println!("Raydium 交换");
}
_ => {}
}
};
grpc.subscribe_events(
protocols,
event_filter,
tx_filter,
account_filter,
callback,
).await?;
Ok(())
}
```
## 高级模式
### 模式 1:使用 Match 进行事件过滤
**v1.x.x:**
```rust
let callback = |event: DexEvent| {
// 只处理特定事件类型
match event {
DexEvent::PumpFunTradeEvent(e) if e.is_buy => {
println!("买入: {} 代币", e.token_amount);
}
DexEvent::PumpFunTradeEvent(e) if !e.is_buy => {
println!("卖出: {} 代币", e.token_amount);
}
_ => {} // 忽略其他事件
}
};
```
### 模式 2:通用事件处理
**v1.x.x:**
```rust
fn process_event(event: DexEvent) {
let metadata = event.metadata();
println!("协议: {:?}", metadata.protocol);
println!("事件类型: {:?}", metadata.event_type);
println!("签名: {}", metadata.signature);
println!("插槽: {}", metadata.slot);
// 处理特定事件类型
match event {
DexEvent::PumpFunTradeEvent(e) => handle_pumpfun_trade(e),
DexEvent::RaydiumCpmmSwapEvent(e) => handle_raydium_swap(e),
_ => {}
}
}
```
### 模式 3:事件类型分类
**v1.x.x:**
```rust
fn categorize_event(event: &DexEvent) -> &'static str {
match event {
DexEvent::PumpFunTradeEvent(_)
| DexEvent::PumpSwapBuyEvent(_)
| DexEvent::PumpSwapSellEvent(_) => "交易",
DexEvent::PumpFunCreateTokenEvent(_)
| DexEvent::PumpSwapCreatePoolEvent(_) => "创建",
DexEvent::RaydiumCpmmDepositEvent(_)
| DexEvent::RaydiumCpmmWithdrawEvent(_) => "流动性",
_ => "其他",
}
}
```
## EventParser API 变更
### 解析交易
**之前 (v0.5.x):**
```rust
let parser = Arc::new(EventParser::new(protocols, event_filter));
parser.parse_encoded_confirmed_transaction_with_status_meta(
signature,
transaction,
Arc::new(|event: &Box<dyn UnifiedEvent>| {
println!("{:?}", event);
}),
).await?;
```
**之后 (v1.x.x):**
```rust
EventParser::parse_encoded_confirmed_transaction_with_status_meta(
&protocols,
event_filter.as_ref(),
signature,
transaction,
Arc::new(|event: &DexEvent| {
println!("{:?}", event);
}),
).await?;
```
`EventParser` 现在是无状态的,使用静态方法,无需创建实例。
## 常见陷阱
### 陷阱 1:忘记处理所有变体
❌ **错误:**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => { /* ... */ }
// 缺少其他变体!
}
```
✅ **正确:**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => { /* ... */ }
_ => {} // 处理或忽略其他事件
}
```
### 陷阱 2:使用旧的元数据访问模式
❌ **错误:**
```rust
let sig = event.signature(); // 此方法不再存在
```
✅ **正确:**
```rust
let sig = event.metadata().signature;
```
### 陷阱 3:尝试使用 `match_event!` 宏
❌ **错误:**
```rust
match_event!(event, { /* ... */ }); // 宏不再存在
```
✅ **正确:**
```rust
match event {
DexEvent::PumpFunTradeEvent(e) => { /* ... */ }
_ => {}
}
```
## 新系统的优势
1. **类型安全**: 编译器在编译时捕获更多错误
2. **性能**: 无动态分发开销
3. **简洁性**: 标准 Rust 模式,无自定义宏
4. **更好的工具支持**: 完整的 IDE 自动补全支持
5. **更易调试**: 更清晰的堆栈跟踪和错误消息
6. **序列化**: 所有事件内置 `Serialize`/`Deserialize` 支持
-2
View File
@@ -289,8 +289,6 @@ Version 1.0.0 introduces a major architectural change from trait-based event han
3. **Event Matching** - Use standard Rust `match` instead of `match_event!` macro
4. **Metadata Access** - Event properties now accessed through `.metadata()` method
For detailed migration steps and code examples, see [MIGRATION.md](MIGRATION.md) or [MIGRATION_CN.md](MIGRATION_CN.md) (Chinese version).
**Quick Migration Example:**
```rust
-2
View File
@@ -288,8 +288,6 @@ v1.4.12 使用 `sol-parser-sdk 0.4.17`,会把 legacy PumpFun SOL 的 `quote_mi
3. **事件匹配** - 使用标准 Rust `match` 而不是 `match_event!` 宏
4. **元数据访问** - 事件属性现在通过 `.metadata()` 方法访问
详细的迁移步骤和代码示例,请参阅 [MIGRATION.md](MIGRATION.md) 或 [MIGRATION_CN.md](MIGRATION_CN.md)(中文版本)。
**快速迁移示例:**
```rust