swap amount input
This commit is contained in:
@@ -4,9 +4,20 @@ import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
|
||||
agbinary "github.com/gagliardetto/binary"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
type raydiumCPmmSwapBaseInputArgs struct {
|
||||
AmountIn uint64
|
||||
MinimumAmountOut uint64
|
||||
}
|
||||
|
||||
type raydiumCPmmSwapBaseOutputArgs struct {
|
||||
MaxAmountIn uint64
|
||||
AmountOut uint64
|
||||
}
|
||||
|
||||
func raydiumCPmmParser(tx *Tx, instruction Instruction, innerInstructions InnerInstructions, offset [2]uint) ([]Swap, [2]uint, error) {
|
||||
if !tx.rawTx.accountList[instruction.ProgramIDIndex].Equals(raydiumCPmmProgramID) {
|
||||
return nil, increaseOffset(offset), fmt.Errorf("raydiumCPmm instruction not found, offset, %d, %d", offset[0], offset[1])
|
||||
@@ -327,6 +338,30 @@ func raydiumCPmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In
|
||||
}
|
||||
|
||||
var entryContract = tx.rawTx.accountList[tx.rawTx.Transaction.Message.Instructions[offset[0]].ProgramIDIndex]
|
||||
discriminator := *(*[8]byte)(instruction.Data[:8])
|
||||
var swapMode SwapMode
|
||||
var fixedAmount decimal.Decimal
|
||||
var limitAmount decimal.Decimal
|
||||
switch discriminator {
|
||||
case raydiumCPmmSwapBaseInputDiscriminator:
|
||||
var args raydiumCPmmSwapBaseInputArgs
|
||||
if err := agbinary.NewBorshDecoder(instruction.Data[8:]).Decode(&args); err != nil {
|
||||
return nil, increaseOffset(offset), fmt.Errorf("failed to decode raydium cpmm swap_base_input args: %w", err)
|
||||
}
|
||||
swapMode = SwapModeExactIn
|
||||
fixedAmount = decimal.NewFromUint64(args.AmountIn)
|
||||
limitAmount = decimal.NewFromUint64(args.MinimumAmountOut)
|
||||
case raydiumCPmmSwapBaseOutputDiscriminator:
|
||||
var args raydiumCPmmSwapBaseOutputArgs
|
||||
if err := agbinary.NewBorshDecoder(instruction.Data[8:]).Decode(&args); err != nil {
|
||||
return nil, increaseOffset(offset), fmt.Errorf("failed to decode raydium cpmm swap_base_output args: %w", err)
|
||||
}
|
||||
swapMode = SwapModeExactOut
|
||||
fixedAmount = decimal.NewFromUint64(args.AmountOut)
|
||||
limitAmount = decimal.NewFromUint64(args.MaxAmountIn)
|
||||
default:
|
||||
return nil, increaseOffset(offset), InstructionIgnoredError
|
||||
}
|
||||
market := tx.rawTx.accountList[instruction.Accounts[3]]
|
||||
// Get token accounts from instruction
|
||||
tokenIn := tx.rawTx.accountList[instruction.Accounts[4]]
|
||||
@@ -384,25 +419,26 @@ func raydiumCPmmSwapParser(tx *Tx, instruction Instruction, innerInstructions In
|
||||
return nil, increaseOffset(offset), fmt.Errorf("failed to find token transfer in inner instructions")
|
||||
}
|
||||
offset[1] += 2
|
||||
return []Swap{
|
||||
{
|
||||
Program: SolProgramRaydiumCPMM,
|
||||
Event: "sell",
|
||||
Pool: market,
|
||||
BaseMint: inputTokenMint,
|
||||
QuoteMint: outputTokenMint,
|
||||
BaseTokenProgram: baseTokenBalance.ProgramIDAccount,
|
||||
QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount,
|
||||
BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals),
|
||||
QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals),
|
||||
BaseReserve: baseReserve,
|
||||
QuoteReserve: quoteReserve,
|
||||
BaseAmount: baseAmount,
|
||||
QuoteAmount: quoteAmount,
|
||||
User: user,
|
||||
UserBaseBalance: userBase,
|
||||
UserQuoteBalance: userQuote,
|
||||
EntryContract: entryContract,
|
||||
},
|
||||
}, offset, nil
|
||||
swap := Swap{
|
||||
Program: SolProgramRaydiumCPMM,
|
||||
Event: "sell",
|
||||
Pool: market,
|
||||
BaseMint: inputTokenMint,
|
||||
QuoteMint: outputTokenMint,
|
||||
BaseTokenProgram: baseTokenBalance.ProgramIDAccount,
|
||||
QuoteTokenProgram: quoteTokenBalance.ProgramIDAccount,
|
||||
BaseMintDecimals: uint8(baseTokenBalance.UITokenAmount.Decimals),
|
||||
QuoteMintDecimals: uint8(quoteTokenBalance.UITokenAmount.Decimals),
|
||||
BaseReserve: baseReserve,
|
||||
QuoteReserve: quoteReserve,
|
||||
BaseAmount: baseAmount,
|
||||
QuoteAmount: quoteAmount,
|
||||
User: user,
|
||||
UserBaseBalance: userBase,
|
||||
UserQuoteBalance: userQuote,
|
||||
EntryContract: entryContract,
|
||||
}
|
||||
swap.SetSwapAmountInfo(swapMode, fixedAmount, limitAmount)
|
||||
|
||||
return []Swap{swap}, offset, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user