Examples¶
Practical code examples for common use cases.
Parse All Data¶
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
dexparser "github.com/DefaultPerson/solana-dex-parser-go"
"github.com/DefaultPerson/solana-dex-parser-go/adapter"
)
func main() {
// Get transaction from RPC
signature := "4Cod1cNGv6RboJ7rSB79yeVCR4Lfd25rFgLY3eiPJfTJjTGyYP1r2i1upAYZHQsWDqUbGd1bhTRm1bpSQcpWMnEz"
tx, _ := getTransaction(signature, "https://api.mainnet-beta.solana.com")
// Parse all data in one call
parser := dexparser.NewDexParser()
result := parser.ParseAll(tx, nil)
fmt.Printf("Trades: %d\n", len(result.Trades))
fmt.Printf("Liquidities: %d\n", len(result.Liquidities))
fmt.Printf("Transfers: %d\n", len(result.Transfers))
fmt.Printf("MemeEvents: %d\n", len(result.MemeEvents))
}
func getTransaction(sig, rpc string) (*adapter.SolanaTransaction, error) {
payload := fmt.Sprintf(`{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["%s",{"encoding":"jsonParsed","maxSupportedTransactionVersion":0}]}`, sig)
resp, err := http.Post(rpc, "application/json", strings.NewReader(payload))
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var rpcResp struct {
Result *adapter.SolanaTransaction `json:"result"`
}
json.Unmarshal(body, &rpcResp)
return rpcResp.Result, nil
}
Output:
Parse Trades¶
parser := dexparser.NewDexParser()
trades := parser.ParseTrades(&tx, nil)
for _, trade := range trades {
fmt.Printf("Type: %s\n", trade.Type)
fmt.Printf("AMM: %s\n", trade.AMM)
fmt.Printf("Input: %s (%.6f)\n", trade.InputToken.Mint[:8], trade.InputToken.Amount)
fmt.Printf("Output: %s (%.6f)\n", trade.OutputToken.Mint[:8], trade.OutputToken.Amount)
fmt.Printf("User: %s\n", trade.User)
}
Output:
Type: BUY
AMM: Pumpfun
Input: So11111.. (0.050000)
Output: 9gyfSMQ.. (1234567.890000)
User: 7xKXtg2..
Parse Liquidity Events¶
events := parser.ParseLiquidity(&tx, nil)
for _, event := range events {
fmt.Printf("Type: %s\n", event.Type)
fmt.Printf("Pool: %s\n", event.PoolId[:8])
fmt.Printf("Token0: %s (%.2f)\n", event.Token0Mint[:8], event.Token0Amount)
fmt.Printf("Token1: %s (%.2f)\n", event.Token1Mint[:8], event.Token1Amount)
fmt.Printf("LP Tokens: %.2f\n", event.LpAmount)
}
Output:
Parse Meme Events¶
result := parser.ParseAll(&tx, nil)
for _, event := range result.MemeEvents {
fmt.Printf("Type: %s\n", event.Type)
fmt.Printf("Protocol: %s\n", event.Protocol)
fmt.Printf("Mint: %s\n", event.BaseMint[:8])
fmt.Printf("User: %s\n", event.User[:8])
}
Output:
Filter by Program¶
import "github.com/DefaultPerson/solana-dex-parser-go/constants"
config := &types.ParseConfig{
ProgramIds: []string{
constants.DEX_PROGRAMS.PUMP_FUN.ID,
constants.DEX_PROGRAMS.RAYDIUM_V4.ID,
},
}
result := parser.ParseAll(tx, config)
Ignore Specific Programs¶
config := &types.ParseConfig{
IgnoreProgramIds: []string{
constants.DEX_PROGRAMS.PHOENIX.ID,
},
}
result := parser.ParseAll(&tx, config)
Aggregate Trades¶
config := &types.ParseConfig{
AggregateTrades: true,
}
result := parser.ParseAll(&tx, config)
if result.AggregateTrade != nil {
fmt.Printf("Total Input: %.6f\n", result.AggregateTrade.InputToken.Amount)
fmt.Printf("Total Output: %.6f\n", result.AggregateTrade.OutputToken.Amount)
}
ShredParser for gRPC Streams¶
ShredParser provides pre-execution instruction analysis for real-time blockchain monitoring via gRPC streams (Helius, Triton, etc.).
Basic Usage¶
import (
dexparser "github.com/DefaultPerson/solana-dex-parser-go"
"github.com/DefaultPerson/solana-dex-parser-go/constants"
"github.com/DefaultPerson/solana-dex-parser-go/types"
)
shredParser := dexparser.NewShredParser()
config := &types.ParseConfig{
ProgramIds: []string{
constants.DEX_PROGRAMS.PUMP_FUN.ID,
constants.DEX_PROGRAMS.RAYDIUM_V4.ID,
},
}
result := shredParser.ParseAll(&tx, config)
// Access parsed instructions by program
for program, instructions := range result.Instructions {
fmt.Printf("[%s] %d instructions\n", program[:8], len(instructions))
}
// Access typed instructions
for _, inst := range result.ParsedInstructions {
fmt.Printf("[%s] %s\n", inst.ProgramName, inst.Action)
if inst.Trade != nil {
fmt.Printf(" Trade: %s -> %s\n",
inst.Trade.InputToken.Mint[:8],
inst.Trade.OutputToken.Mint[:8])
}
}
Output:
Supported Protocols¶
| Protocol | Instructions | Notes |
|---|---|---|
| Jupiter V6 | Route variants | All route types including shared accounts |
| Raydium V4 | Swap, Create, Add/Remove Liquidity | Full AMM support |
| Raydium Launchpad | Buy, Sell, Create, Migrate | Meme token launches |
| Meteora DBC | Swap, Init Pool, Migrate | Dynamic bonding curve |
| DFlow | Swap routing | Order flow aggregation |
| Photon | Multi-hop swaps | Cross-AMM routing |
| System/Token | Transfers | SOL and SPL tokens |
Use Cases¶
- MEV Detection: Monitor instructions pre-execution
- Real-time Pricing: Track incoming trades
- Launch Monitoring: Detect new token launches instantly
Raydium Logs Decode¶
import "github.com/DefaultPerson/solana-dex-parser-go/parsers/raydium"
// logData is the base64-encoded log from transaction
log := raydium.DecodeRaydiumLog(logData)
if log != nil {
if swap := raydium.ParseRaydiumSwapLog(log); swap != nil {
fmt.Printf("Type: %s\n", swap.Type)
fmt.Printf("Mode: %s\n", swap.Mode)
fmt.Printf("Input: %s\n", swap.InputAmount.String())
fmt.Printf("Output: %s\n", swap.OutputAmount.String())
}
}
Output: