chore: support bloomrouter bonk buy/sell
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user