|
|
|
|
@@ -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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -171,16 +171,6 @@ type pumpAmmBuyArgs struct {
|
|
|
|
|
MaxSolCost uint64
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type _6hb1BuyArgs struct {
|
|
|
|
|
SolAmount uint64
|
|
|
|
|
TokenNumber uint64
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type _8rsrBuyArgs struct {
|
|
|
|
|
SolIn uint64
|
|
|
|
|
TokenOut uint64
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type boboBuyArgs struct {
|
|
|
|
|
Placeholder1 uint64
|
|
|
|
|
Placeholder2 uint64
|
|
|
|
|
@@ -254,44 +244,44 @@ func ParseTransaction(update *SubscribeUpdateTransaction, loader *AddressTables)
|
|
|
|
|
switch programID {
|
|
|
|
|
case pumpProgramID:
|
|
|
|
|
txRes, err := parsePumpInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "pump")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "pump", pumpProgramID.String())
|
|
|
|
|
case azczProgramID:
|
|
|
|
|
txRes, err := parseAzczInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "azcz")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "azcz", azczProgramID.String())
|
|
|
|
|
case f5tfProgramID:
|
|
|
|
|
txRes, err := parseF5tfInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "f5tf")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "f5tf", f5tfProgramID.String())
|
|
|
|
|
case flasProgramID:
|
|
|
|
|
txRes, err := parseFlasInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "flas")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "flas", flasProgramID.String())
|
|
|
|
|
case photonProgramID:
|
|
|
|
|
txRes, err := parsePhotonInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "photon")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "photon", photonProgramID.String())
|
|
|
|
|
case pumpAmmProgramID:
|
|
|
|
|
txRes, err := parsePumpAmmInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "pumpamm")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "pumpamm", pumpAmmProgramID.String())
|
|
|
|
|
case boboProgramID:
|
|
|
|
|
txRes, err := parseBoboInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "bobo")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "bobo", boboProgramID.String())
|
|
|
|
|
case qtkvProgramID:
|
|
|
|
|
txRes, err := parseQtkvInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "qtkv")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "qtkv", qtkvProgramID.String())
|
|
|
|
|
case fjszProgramID:
|
|
|
|
|
txRes, err := parseFjszInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "fjsz")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "fjsz", fjszProgramID.String())
|
|
|
|
|
case terminalProgramID:
|
|
|
|
|
txRes, err := parseTermInstruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "terminal")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "terminal", terminalProgramID.String())
|
|
|
|
|
case jupiterV6ProgramID:
|
|
|
|
|
txRes, err := parseJupiterV6Instruction(versioned, i)
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "jupiterv6")
|
|
|
|
|
parsed = appendParsed(parsed, txRes, err, txHash, "jupiterv6", jupiterV6ProgramID.String())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return parsed
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func appendParsed(list []*TxSignal, parsed *TxSignal, err error, txHash [64]byte, label string) []*TxSignal {
|
|
|
|
|
func appendParsed(list []*TxSignal, parsed *TxSignal, err error, txHash [64]byte, label string, entryContract string) []*TxSignal {
|
|
|
|
|
if err != nil {
|
|
|
|
|
if !strings.HasPrefix(err.Error(), "account index") {
|
|
|
|
|
logger.Debug("txparser: failed to parse", "label", label, "instruction", err, "tx_hash", base58.Encode(txHash[:]))
|
|
|
|
|
@@ -299,6 +289,7 @@ func appendParsed(list []*TxSignal, parsed *TxSignal, err error, txHash [64]byte
|
|
|
|
|
return list
|
|
|
|
|
}
|
|
|
|
|
if parsed != nil {
|
|
|
|
|
parsed.EntryContract = entryContract
|
|
|
|
|
list = append(list, parsed)
|
|
|
|
|
}
|
|
|
|
|
return list
|
|
|
|
|
@@ -766,10 +757,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 +788,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 +799,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: formatTokenAmount(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 +828,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 +840,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 +868,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 +879,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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -915,8 +906,10 @@ func parseFlasBuy(tx *versionedTransaction, instructionIndex int) (*TxSignal, er
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var args flasBuyArgs
|
|
|
|
|
if len(instruction.Data) > 20 {
|
|
|
|
|
instruction.Data = instruction.Data[:20]
|
|
|
|
|
}
|
|
|
|
|
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 +920,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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|