diff --git a/cmd/shreder/main.go b/cmd/shreder/main.go index af45b3a..fbec968 100644 --- a/cmd/shreder/main.go +++ b/cmd/shreder/main.go @@ -84,8 +84,13 @@ func main() { case txBatch := <-txCh: //jsonData, _ := json.MarshalIndent(txBatch, "", " ") for _, tx := range txBatch { - if tx.Label == "jupiterV6" { - fmt.Println("===============", tx.TxHash, tx.Token0Address, tx.Token0Amount) + if tx.Label == "flas" { + if tx.Event == "buy" { + fmt.Println("===============", tx.TxHash, tx.Program, tx.Event, tx.Token0Address, "token:", tx.Token0Amount, "sol:", tx.Token1Amount) + } else if tx.Event == "sell" { + fmt.Println("===============", tx.TxHash, tx.Program, tx.Event, tx.Token0Address, "token:", tx.Token0Amount) + + } } } //fmt.Println(txBatch[0].TxHash) diff --git a/pkg/shreder/txparser.go b/pkg/shreder/txparser.go index 15d3281..8d91e5f 100644 --- a/pkg/shreder/txparser.go +++ b/pkg/shreder/txparser.go @@ -148,9 +148,9 @@ type f5tfBuyArgs struct { TokenAmount uint64 } -type flasBuyArgs struct { - SolAmount uint64 - TokenAmount uint64 +type flasArgs struct { + Amount1 uint64 + Amount2 uint64 Placeholder [3]uint8 } @@ -766,10 +766,10 @@ func parseFlasInstruction(tx *versionedTransaction, instructionIndex int) (*TxSi return nil, fmt.Errorf("data too short for args flas instruction, len: %d", len(instruction.Data)) } methodData := instruction.Data[17:20] - if !matchMethod(methodData, flasBuyTokensIX) { - return nil, nil - } - if matchMethod(methodData, f5tfBuyTokensIX) { + //if !matchMethod(methodData, flasBuyTokensIX) { + // return nil, nil + //} + if matchMethod(methodData, flasBuyTokensIX) { return parseFlasBuy(tx, instructionIndex) } else if matchMethod(methodData, flasSellTokensIX) { return parseFlasSell(tx, instructionIndex) @@ -797,7 +797,7 @@ func parseFlasAmmSell(tx *versionedTransaction, instructionIndex int) (*TxSignal return nil, err } - var args flasBuyArgs + var args flasArgs if err := borsh.Deserialize(&args, instruction.Data[1:]); err != nil { return nil, fmt.Errorf("failed to parse buy tokens args: %w", err) } @@ -808,16 +808,16 @@ func parseFlasAmmSell(tx *versionedTransaction, instructionIndex int) (*TxSignal Maker: user.String(), Token0Address: mint.String(), Token1Address: wsolMint, - Token0Amount: decimal.Zero, - Token1Amount: formatSolAmount(args.TokenAmount), - Program: "Pump", + Token0Amount: formatSolAmount(args.Amount1), + Token1Amount: formatSolAmount(args.Amount2), + Program: "PumpAMM", Event: "sell", IsToken2022: false, IsMayhemMode: false, - ExactSOL: true, + ExactSOL: false, Block: tx.Block, - Token0AmountUint64: 0, - Token1AmountUint64: args.TokenAmount, + Token0AmountUint64: args.Amount1, + Token1AmountUint64: args.Amount2, }, nil } @@ -837,7 +837,7 @@ func parseFlasAmmBuy(tx *versionedTransaction, instructionIndex int) (*TxSignal, return nil, err } - var args flasBuyArgs + var args flasArgs if err := borsh.Deserialize(&args, instruction.Data[1:]); err != nil { return nil, fmt.Errorf("failed to parse buy tokens args: %w", err) } @@ -849,15 +849,15 @@ func parseFlasAmmBuy(tx *versionedTransaction, instructionIndex int) (*TxSignal, Token0Address: mint.String(), Token1Address: wsolMint, Token0Amount: decimal.Zero, - Token1Amount: formatSolAmount(args.TokenAmount), - Program: "Pump", - Event: "sell", + Token1Amount: formatSolAmount(args.Amount1), + Program: "PumpAMM", + Event: "buy", IsToken2022: false, IsMayhemMode: false, ExactSOL: true, Block: tx.Block, Token0AmountUint64: 0, - Token1AmountUint64: args.TokenAmount, + Token1AmountUint64: args.Amount1, }, nil } @@ -877,7 +877,7 @@ func parseFlasSell(tx *versionedTransaction, instructionIndex int) (*TxSignal, e return nil, err } - var args flasBuyArgs + var args flasArgs if err := borsh.Deserialize(&args, instruction.Data[1:]); err != nil { return nil, fmt.Errorf("failed to parse buy tokens args: %w", err) } @@ -888,15 +888,15 @@ func parseFlasSell(tx *versionedTransaction, instructionIndex int) (*TxSignal, e Maker: user.String(), Token0Address: mint.String(), Token1Address: wsolMint, - Token0Amount: formatTokenAmount(args.TokenAmount), - Token1Amount: formatSolAmount(args.SolAmount), + Token0Amount: formatTokenAmount(args.Amount1), + Token1Amount: formatSolAmount(args.Amount2), Program: "Pump", Event: "sell", IsToken2022: false, IsMayhemMode: false, Block: tx.Block, - Token0AmountUint64: args.TokenAmount, - Token1AmountUint64: args.SolAmount, + Token0AmountUint64: args.Amount1, + Token1AmountUint64: args.Amount2, }, nil } @@ -916,7 +916,7 @@ func parseFlasBuy(tx *versionedTransaction, instructionIndex int) (*TxSignal, er return nil, err } - var args flasBuyArgs + var args flasArgs if err := borsh.Deserialize(&args, instruction.Data[1:]); err != nil { return nil, fmt.Errorf("failed to parse buy tokens args: %w", err) } @@ -927,16 +927,16 @@ func parseFlasBuy(tx *versionedTransaction, instructionIndex int) (*TxSignal, er Maker: user.String(), Token0Address: mint.String(), Token1Address: wsolMint, - Token0Amount: formatTokenAmount(args.TokenAmount), - Token1Amount: formatSolAmount(args.SolAmount), + Token0Amount: formatTokenAmount(args.Amount2), + Token1Amount: formatSolAmount(args.Amount1), Program: "Pump", Event: "buy", IsToken2022: false, IsMayhemMode: false, ExactSOL: true, Block: tx.Block, - Token0AmountUint64: args.TokenAmount, - Token1AmountUint64: args.SolAmount, + Token0AmountUint64: args.Amount2, + Token1AmountUint64: args.Amount1, }, nil } diff --git a/pkg/shreder/txparser_test.go b/pkg/shreder/txparser_test.go new file mode 100644 index 0000000..d58b9d6 --- /dev/null +++ b/pkg/shreder/txparser_test.go @@ -0,0 +1,56 @@ +package shreder + +import ( + "encoding/hex" + "testing" + + "github.com/near/borsh-go" +) + +func TestDecodeAxiomArgs(t *testing.T) { + tests := []struct { + name string + hexData string + }{ + { + name: "pump amm sell Test 0", + hexData: "00686f08bb1b0000007eb4ac020000000001020200183c", + }, + { + name: "pump amm buy Test 1", + hexData: "00c09ee6050000000001c94d882600000000020200323c", + }, + { + name: "pump buy Test 2", + hexData: "00d8d3bc0000000000bb7c53f009000000000104185a", + }, + { + name: "pump sell Test 3", + hexData: "009bbf69ec08080000830bc61200000000010103a000", + }, + { + name: "pump swap sell Test 4", + hexData: "00c98ea7588b0000009adf3b010000000001020200283c", + }, + { + name: "pump swap sell Test 5", + hexData: "00d3727f9301000000f9a50b0100000000010202001e00", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + data, err := hex.DecodeString(tt.hexData) + if err != nil { + t.Fatalf("failed to decode hex string: %v", err) + return + } + var args flasArgs + if err := borsh.Deserialize(&args, data[1:]); err != nil { + t.Fatalf("failed to decode Axiom args: %v", err) + return + } + t.Logf("Decoded Axiom Args: %+v", args) + }) + } +}