chore: support bloomrouter bonk buy/sell

This commit is contained in:
2026-03-23 17:35:31 +08:00
parent 84645d9c09
commit e90a2533fd
2 changed files with 215 additions and 29 deletions

View File

@@ -26,11 +26,80 @@ func parseBloomRouterInstruction(tx VersionedTransaction, instructionIndex int)
return nil, nil
}
findPumpFun := func() (solana.PublicKey, solana.PublicKey, error) {
var mint solana.PublicKey
foundPumpFun := false
for i, acctIdx := range instruction.Accounts {
key, err := tx.GetAccount(int(acctIdx))
if err != nil {
return solana.PublicKey{}, solana.PublicKey{}, err
}
if key.Equals(pumpFunAccount) {
if i+2 >= len(instruction.Accounts) {
return solana.PublicKey{}, solana.PublicKey{}, fmt.Errorf("accounts too short for pumpfun mint, idx=%d len=%d", i, len(instruction.Accounts))
}
mintKey, err := tx.GetAccount(int(instruction.Accounts[i+2]))
if err != nil {
return solana.PublicKey{}, solana.PublicKey{}, err
}
mint = mintKey
foundPumpFun = true
break
}
}
if !foundPumpFun {
return solana.PublicKey{}, solana.PublicKey{}, nil
}
return mint, wrappedSOL, nil
}
findRaydiumLaunchLab := func(isBuy bool) (solana.PublicKey, solana.PublicKey, error) {
offset := 0
if isBuy {
offset = 10
} else {
offset = 9
}
var base solana.PublicKey
var quote solana.PublicKey
foundRaydiumLaunchLab := false
for i, acctIdx := range instruction.Accounts {
key, err := tx.GetAccount(int(acctIdx))
if err != nil {
return solana.PublicKey{}, solana.PublicKey{}, err
}
if key.Equals(raydiumLaunchLabProgramID) {
if i+offset+1 >= len(instruction.Accounts) {
return solana.PublicKey{}, solana.PublicKey{}, fmt.Errorf("accounts too short for raydium launch lab mint, idx=%d len=%d", i, len(instruction.Accounts))
}
var err error
base, err = tx.GetAccount(int(instruction.Accounts[i+offset]))
if err != nil {
return solana.PublicKey{}, solana.PublicKey{}, err
}
quote, err = tx.GetAccount(int(instruction.Accounts[i+offset+1]))
if err != nil {
return solana.PublicKey{}, solana.PublicKey{}, err
}
foundRaydiumLaunchLab = true
break
}
}
if !foundRaydiumLaunchLab {
return solana.PublicKey{}, solana.PublicKey{}, nil
}
return base, quote, nil
}
var (
amount uint64
sol uint64
exactIn bool
event string
program string
base solana.PublicKey
quote solana.PublicKey
err error
)
args, err := decodeBloomRouterArgs(instruction.Data)
@@ -41,8 +110,39 @@ func parseBloomRouterInstruction(tx VersionedTransaction, instructionIndex int)
case 0:
event = "buy"
exactIn = true
program = "Pump"
base, quote, err = findPumpFun()
if err != nil {
return nil, err
}
case 1:
event = "sell"
program = "Pump"
base, quote, err = findPumpFun()
if err != nil {
return nil, err
}
case 0x0b00:
event = "buy"
exactIn = true
program = "RaydiumLaunchLab"
base, quote, err = findRaydiumLaunchLab(true)
if err != nil {
return nil, err
}
if !quote.Equals(wrappedSOL) {
return nil, nil
}
case 0x0b01:
event = "sell"
program = "RaydiumLaunchLab"
base, quote, err = findRaydiumLaunchLab(false)
if err != nil {
return nil, err
}
if !quote.Equals(wrappedSOL) {
return nil, nil
}
default:
return nil, nil
}
@@ -61,43 +161,17 @@ func parseBloomRouterInstruction(tx VersionedTransaction, instructionIndex int)
return nil, err
}
var mint solana.PublicKey
foundPumpFun := false
for i, acctIdx := range instruction.Accounts {
key, err := tx.GetAccount(int(acctIdx))
if err != nil {
return nil, err
}
if key.Equals(pumpFunAccount) {
if i+2 >= len(instruction.Accounts) {
return nil, fmt.Errorf("accounts too short for pumpfun mint, idx=%d len=%d", i, len(instruction.Accounts))
}
mintKey, err := tx.GetAccount(int(instruction.Accounts[i+2]))
if err != nil {
return nil, err
}
mint = mintKey
foundPumpFun = true
break
}
}
if !foundPumpFun {
return nil, nil
}
return TxSignalBatch{&TxSignal{
TxHash: tx.Signatures[0].String(),
Label: "bloomrouter",
Maker: maker.String(),
Token0Address: mint.String(),
Token1Address: wsolMint,
Token0Address: base.String(),
Token1Address: quote.String(),
Token0Amount: formatTokenAmount(amount),
Token1Amount: formatSolAmount(sol),
Program: "Pump",
Program: program,
Event: event,
ExactSOL: exactIn,
IsToken2022: false,
IsMayhemMode: false,
Block: tx.Block,
Token0AmountUint64: amount,
Token1AmountUint64: sol,