chore: support maestro bonk buy/sell

This commit is contained in:
2026-03-23 16:54:23 +08:00
parent b860ff1719
commit 84645d9c09
2 changed files with 201 additions and 15 deletions

View File

@@ -106,7 +106,6 @@ func maestroMultiSwap2DexName(dexID uint8) string {
return "OrcaWhirPool"
case 9:
return "MeteoraPools"
case 10:
return "MeteoraDynamicBondingCurve"
default:
@@ -125,20 +124,7 @@ func parseMaestroInstruction(tx VersionedTransaction, idx int) (TxSignalBatch, e
return parseMaestroInstructionDataAndAccounts(tx, ix.Data, ix.Accounts)
}
func parseMaestroInstructionDataAndAccounts(tx VersionedTransaction, ixData []byte, ixAccounts []uint8) (TxSignalBatch, error) {
args, err := decodeMaestroMultiSwap2Args(ixData)
if err != nil {
return nil, nil
}
// only decode pump amm
if len(args.Routes) != 1 {
return nil, nil
}
if args.Routes[0].DexID != 4 {
return nil, nil
}
func parsePumpAMMMaestroInstructionDataAndAccounts(tx VersionedTransaction, ixAccounts []uint8, args *MaestroMultiSwap2Args) (TxSignalBatch, error) {
var (
event string
token0Amount uint64
@@ -255,3 +241,91 @@ func parseMaestroInstructionDataAndAccounts(tx VersionedTransaction, ixData []by
},
}, nil
}
func parseRaydiumLaunchLabMaestroInstructionDataAndAccounts(tx VersionedTransaction, ixAccounts []uint8, args *MaestroMultiSwap2Args) (TxSignalBatch, error) {
var (
event string
token0Amount uint64
token1Amount uint64
// pool solana.PublicKey
baseMint solana.PublicKey
quoteMint solana.PublicKey
err error
)
routeFlag := args.Routes[0].RouteKeyIdx
if routeFlag == 0x0b {
event = "buy"
token0Amount = args.MinAmountOut
token1Amount = args.AmountIn
if len(ixAccounts) < 18 {
return nil, nil
}
quoteMint, err = tx.GetAccount(int(ixAccounts[7]))
if err != nil {
return nil, err
}
baseMint, err = tx.GetAccount(int(ixAccounts[17]))
if err != nil {
return nil, err
}
} else if routeFlag == 0x08 {
event = "sell"
token0Amount = args.AmountIn
token1Amount = args.MinAmountOut
if len(ixAccounts) < 18 {
return nil, nil
}
quoteMint, err = tx.GetAccount(int(ixAccounts[17]))
if err != nil {
return nil, err
}
baseMint, err = tx.GetAccount(int(ixAccounts[7]))
if err != nil {
return nil, err
}
} else {
return nil, nil
}
if !quoteMint.Equals(wrappedSOL) {
return nil, nil
}
return TxSignalBatch{
&TxSignal{
TxHash: tx.Signatures[0].String(),
Maker: tx.StaticAccountKeys[0].String(),
Token0Address: baseMint.String(),
Token1Address: wsolMint,
Token0Amount: formatTokenAmount(token0Amount),
Token1Amount: formatTokenAmount(token1Amount),
Event: event,
Program: "RaydiumLaunchLab",
ExactSOL: event == "buy",
Token0AmountUint64: token0Amount,
Token1AmountUint64: token1Amount,
},
}, nil
}
func parseMaestroInstructionDataAndAccounts(tx VersionedTransaction, ixData []byte, ixAccounts []uint8) (TxSignalBatch, error) {
args, err := decodeMaestroMultiSwap2Args(ixData)
if err != nil {
return nil, nil
}
// only decode 1 route
if len(args.Routes) != 1 {
return nil, nil
}
if args.Routes[0].DexID == 4 {
return parsePumpAMMMaestroInstructionDataAndAccounts(tx, ixAccounts, args)
} else if args.Routes[0].DexID == 3 {
return parseRaydiumLaunchLabMaestroInstructionDataAndAccounts(tx, ixAccounts, args)
}
return nil, nil
}