package shreder import ( "fmt" "github.com/gagliardetto/solana-go" "github.com/near/borsh-go" ) // only buy function with pump program var fjszProgramID = solana.MustPublicKeyFromBase58("FJsZbftBqRLfF7uqUKpm4s2goDr6xsQ5Q3mN7AFJB6hK") var ( fjszBuyTokensIX = []byte{0xe7, 0x3f, 0x99, 0x83, 0xf3, 0xed, 0xe3, 0x3c} ) type fjszBuyArgs struct { SolAmount uint64 TokenAmount uint64 } func parseFjszInstruction(tx VersionedTransaction, instructionIndex int) (TxSignalBatch, error) { if instructionIndex >= len(tx.Instructions) { return nil, fmt.Errorf("instruction index out of bounds") } instruction := tx.Instructions[instructionIndex] if len(instruction.Data) == 0 { return nil, fmt.Errorf("data is empty") } if !matchMethod(instruction.Data, fjszBuyTokensIX) { return nil, nil } if len(instruction.Accounts) < 7 { return nil, fmt.Errorf("accounts too short") } if len(instruction.Data) < 16 { return nil, fmt.Errorf("data too short for fjzs buy args, len=%d", len(instruction.Data)) } mint, err := tx.GetAccount(int(instruction.Accounts[2])) if err != nil { return nil, err } user, err := tx.GetAccount(int(instruction.Accounts[6])) if err != nil { return nil, err } var args fjszBuyArgs if err := borsh.Deserialize(&args, instruction.Data[8:]); err != nil { return nil, fmt.Errorf("failed to parse buy tokens args: %w", err) } return TxSignalBatch{&TxSignal{ TxHash: tx.Signatures[0].String(), Label: "fjsz", Maker: user.String(), Token0Address: mint.String(), Token1Address: wsolMint, Token0Amount: formatTokenAmount(args.TokenAmount), Token1Amount: formatSolAmount(args.SolAmount), Program: "Pump", Event: "buy", IsToken2022: false, IsMayhemMode: false, Block: tx.Block, Token0AmountUint64: args.TokenAmount, Token1AmountUint64: args.SolAmount, }}, nil }