fix pump parser
This commit is contained in:
49
pump.go
49
pump.go
@@ -231,6 +231,19 @@ func pumpTradeAmountInfoFromArgs(args PumpTradeArgs) (swapMode SwapMode, fixedAm
|
||||
}
|
||||
}
|
||||
|
||||
func pumpCompleteMatchesTradeEvent(completeEvent CompleteEvent, tradeEvent PumpTradeEvent, bondingCurve solana.PublicKey) bool {
|
||||
if completeEvent.Mint != tradeEvent.Mint {
|
||||
return false
|
||||
}
|
||||
if completeEvent.User != tradeEvent.User {
|
||||
return false
|
||||
}
|
||||
if completeEvent.BondingCurve != bondingCurve {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func normalizePumpQuoteSideMint(s *Swap) {
|
||||
if s.FixedAmountSide == SwapAmountSideQuote && s.FixedMint.IsZero() {
|
||||
s.FixedMint = wSolMint
|
||||
@@ -366,6 +379,7 @@ func BuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerIns
|
||||
completeEvent CompleteEvent
|
||||
completed bool
|
||||
newoffset [2]uint
|
||||
tradeFound bool
|
||||
)
|
||||
|
||||
var prefixLen = offset[1]
|
||||
@@ -394,6 +408,9 @@ func BuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerIns
|
||||
}
|
||||
if innerInstr.ProgramIDIndex == programIndex && bytes.Equal(innerInstr.Data[:8], pumpEventDiscriminator[:]) {
|
||||
if bytes.Equal(innerInstr.Data[8:16], pumpTradeEventDiscriminator[8:16]) {
|
||||
if tradeFound {
|
||||
break
|
||||
}
|
||||
err = agbinary.NewBorshDecoder(innerInstr.Data[16:]).Decode(&tradeEvent)
|
||||
if offset[1] == 0 {
|
||||
newoffset = [2]uint{offset[0] + 1, offset[1]}
|
||||
@@ -403,19 +420,31 @@ func BuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerIns
|
||||
if err != nil {
|
||||
return nil, newoffset, fmt.Errorf("pump buy event decode error: %v, offset, %d, %d", err, offset[0], offset[1])
|
||||
}
|
||||
expectedIsBuy := !bytes.Equal(instruction.Data[:8], pumpSellDiscriminator[:])
|
||||
if tradeEvent.IsBuy != expectedIsBuy {
|
||||
tradeEvent = PumpTradeEvent{}
|
||||
continue
|
||||
}
|
||||
tradeFound = true
|
||||
if !tradeEvent.IsBuy {
|
||||
break
|
||||
}
|
||||
} else if bytes.Equal(innerInstr.Data[8:16], pumpCompleteEventDiscriminator[:]) {
|
||||
if !tradeFound {
|
||||
continue
|
||||
}
|
||||
err = agbinary.NewBorshDecoder(innerInstr.Data[16:]).Decode(&completeEvent)
|
||||
if err != nil {
|
||||
return nil, increaseOffset(offset), fmt.Errorf("pump completeEvent event decode error: %v, offset, %d, %d", err, offset[0], offset[1])
|
||||
}
|
||||
if !pumpCompleteMatchesTradeEvent(completeEvent, tradeEvent, result.accountList[instruction.Accounts[3]]) {
|
||||
break
|
||||
}
|
||||
if offset[1] == 0 {
|
||||
newoffset = [2]uint{offset[0] + 1, offset[1]}
|
||||
} else {
|
||||
newoffset = [2]uint{offset[0], prefixLen + uint(innerIndex) + 1}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, newoffset, fmt.Errorf("pump completeEvent event decode error: %v, offset, %d, %d", err, offset[0], offset[1])
|
||||
}
|
||||
completed = true
|
||||
break
|
||||
}
|
||||
@@ -428,6 +457,11 @@ func BuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerIns
|
||||
|
||||
offset = [2]uint{newoffset[0], newoffset[1]}
|
||||
|
||||
var args PumpTradeArgs
|
||||
if err := agbinary.NewBorshDecoder(instruction.Data[:]).Decode(&args); err != nil {
|
||||
return nil, increaseOffset(offset), fmt.Errorf("failed tx pump buy/sell decode error: %v, offset, %d, %d", err, offset[0], offset[1])
|
||||
}
|
||||
|
||||
event := ""
|
||||
baseTokenProgram := solana.TokenProgramID
|
||||
if tradeEvent.IsBuy {
|
||||
@@ -495,12 +529,9 @@ func BuyOrSellParser(tx *Tx, instruction Instruction, innerInstructions InnerIns
|
||||
Cashback: isCashbackCoin,
|
||||
},
|
||||
}
|
||||
var args PumpTradeArgs
|
||||
if err := agbinary.NewBorshDecoder(instruction.Data[:]).Decode(&args); err == nil {
|
||||
if swapMode, fixedAmount, limitAmount, ok := pumpTradeAmountInfoFromArgs(args); ok {
|
||||
swaps[0].SetSwapAmountInfo(swapMode, fixedAmount, limitAmount)
|
||||
normalizePumpQuoteSideMint(&swaps[0])
|
||||
}
|
||||
if swapMode, fixedAmount, limitAmount, ok := pumpTradeAmountInfoFromArgs(args); ok {
|
||||
swaps[0].SetSwapAmountInfo(swapMode, fixedAmount, limitAmount)
|
||||
normalizePumpQuoteSideMint(&swaps[0])
|
||||
}
|
||||
if completed {
|
||||
swaps = append(swaps, Swap{
|
||||
|
||||
Reference in New Issue
Block a user