Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
047b549d0f | ||
|
|
9327eab010 | ||
|
|
0ef57cf79a |
1
meta.go
1
meta.go
@@ -88,6 +88,7 @@ var (
|
|||||||
meteoraDlmmAddLiquidity2Discriminator = calculateDiscriminator("global:add_liquidity2")
|
meteoraDlmmAddLiquidity2Discriminator = calculateDiscriminator("global:add_liquidity2")
|
||||||
meteoraDlmmAddLiquidityByStrategyDiscriminator = calculateDiscriminator("global:add_liquidity_by_strategy")
|
meteoraDlmmAddLiquidityByStrategyDiscriminator = calculateDiscriminator("global:add_liquidity_by_strategy")
|
||||||
meteoraDlmmAddLiquidityByStrategy2Discriminator = calculateDiscriminator("global:add_liquidity_by_strategy2")
|
meteoraDlmmAddLiquidityByStrategy2Discriminator = calculateDiscriminator("global:add_liquidity_by_strategy2")
|
||||||
|
meteoraDlmmAddLiquidityByWeightDiscriminator = calculateDiscriminator("global:add_liquidity_by_weight")
|
||||||
meteoraDlmmClaimFeeDiscriminator = calculateDiscriminator("global:claim_fee")
|
meteoraDlmmClaimFeeDiscriminator = calculateDiscriminator("global:claim_fee")
|
||||||
meteoraDlmmClaimFee2Discriminator = calculateDiscriminator("global:claim_fee2")
|
meteoraDlmmClaimFee2Discriminator = calculateDiscriminator("global:claim_fee2")
|
||||||
meteoraDlmmRebalanceLiquidityDiscriminator = calculateDiscriminator("global:rebalance_liquidity")
|
meteoraDlmmRebalanceLiquidityDiscriminator = calculateDiscriminator("global:rebalance_liquidity")
|
||||||
|
|||||||
@@ -117,6 +117,11 @@ type dlmmBinLiquidityDistribution struct {
|
|||||||
DistributionY uint16
|
DistributionY uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type dlmmBinLiquidityDistributionByWeight struct {
|
||||||
|
BinId int32
|
||||||
|
Weight uint16
|
||||||
|
}
|
||||||
|
|
||||||
type dlmmBinLiquidityReduction struct {
|
type dlmmBinLiquidityReduction struct {
|
||||||
BinId int32
|
BinId int32
|
||||||
BpsToRemove uint16
|
BpsToRemove uint16
|
||||||
@@ -143,6 +148,14 @@ type dlmmLiquidityParameterByStrategy struct {
|
|||||||
StrategyParameters dlmmStrategyParameters
|
StrategyParameters dlmmStrategyParameters
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type dlmmLiquidityParameterByWeight struct {
|
||||||
|
AmountX uint64
|
||||||
|
AmountY uint64
|
||||||
|
ActiveID int32
|
||||||
|
MaxActiveBinSlippage int32
|
||||||
|
BinLiquidityDist []dlmmBinLiquidityDistributionByWeight
|
||||||
|
}
|
||||||
|
|
||||||
type dlmmAddLiquidityArgs struct {
|
type dlmmAddLiquidityArgs struct {
|
||||||
LiquidityParameter dlmmLiquidityParameter
|
LiquidityParameter dlmmLiquidityParameter
|
||||||
}
|
}
|
||||||
@@ -161,6 +174,10 @@ type dlmmAddLiquidityByStrategy2Args struct {
|
|||||||
RemainingAccountsInfo dlmmRemainingAccountsInfo
|
RemainingAccountsInfo dlmmRemainingAccountsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type dlmmAddLiquidityByWeightArgs struct {
|
||||||
|
LiquidityParameter dlmmLiquidityParameterByWeight
|
||||||
|
}
|
||||||
|
|
||||||
type dlmmRemoveLiquidityArgs struct {
|
type dlmmRemoveLiquidityArgs struct {
|
||||||
BinLiquidityRemoval []dlmmBinLiquidityReduction
|
BinLiquidityRemoval []dlmmBinLiquidityReduction
|
||||||
}
|
}
|
||||||
@@ -276,7 +293,8 @@ func metaoradlmmParser(tx *Tx, instruction Instruction, innerInstructions InnerI
|
|||||||
case meteoraDlmmSwap2Discriminator, meteoraDlmmSwapExactOut2Discriminator, meteoraDlmmSwapWithPriceImpact2Discriminator:
|
case meteoraDlmmSwap2Discriminator, meteoraDlmmSwapExactOut2Discriminator, meteoraDlmmSwapWithPriceImpact2Discriminator:
|
||||||
return metaoradlmmSwap2Parser(tx, instruction, innerInstructions, offset)
|
return metaoradlmmSwap2Parser(tx, instruction, innerInstructions, offset)
|
||||||
case meteoraDlmmAddLiquidityDiscriminator, meteoraDlmmAddLiquidity2Discriminator,
|
case meteoraDlmmAddLiquidityDiscriminator, meteoraDlmmAddLiquidity2Discriminator,
|
||||||
meteoraDlmmAddLiquidityByStrategyDiscriminator, meteoraDlmmAddLiquidityByStrategy2Discriminator:
|
meteoraDlmmAddLiquidityByStrategyDiscriminator, meteoraDlmmAddLiquidityByStrategy2Discriminator,
|
||||||
|
meteoraDlmmAddLiquidityByWeightDiscriminator:
|
||||||
return metaoradlmmAddLiquidityParser(tx, instruction, innerInstructions, offset)
|
return metaoradlmmAddLiquidityParser(tx, instruction, innerInstructions, offset)
|
||||||
case meteoraDlmmClaimFeeDiscriminator, meteoraDlmmClaimFee2Discriminator:
|
case meteoraDlmmClaimFeeDiscriminator, meteoraDlmmClaimFee2Discriminator:
|
||||||
return metaoradlmmClaimFeeParser(tx, instruction, innerInstructions, offset)
|
return metaoradlmmClaimFeeParser(tx, instruction, innerInstructions, offset)
|
||||||
@@ -392,10 +410,13 @@ func metaoradlmmPositionCreateParser(tx *Tx, instruction Instruction, innerInstr
|
|||||||
return nil, increaseOffset(offset), fmt.Errorf("meteora dlmm create position accounts parse error: %v, offset, %d, %d", err, offset[0], offset[1])
|
return nil, increaseOffset(offset), fmt.Errorf("meteora dlmm create position accounts parse error: %v, offset, %d, %d", err, offset[0], offset[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
createEvent, nextOffset, err := dlmmPositionCreateEventFromInnerInstructions(innerInstructions, instruction, offset)
|
createEvent, nextOffset, found, err := dlmmPositionCreateEventFromInnerInstructions(innerInstructions, instruction, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nextOffset, err
|
return nil, nextOffset, err
|
||||||
}
|
}
|
||||||
|
if !found {
|
||||||
|
return nil, nextOffset, InstructionIgnoredError
|
||||||
|
}
|
||||||
offset = nextOffset
|
offset = nextOffset
|
||||||
|
|
||||||
if !createEvent.LbPair.IsZero() {
|
if !createEvent.LbPair.IsZero() {
|
||||||
@@ -705,6 +726,7 @@ func metaoradlmmAddLiquidityParser(tx *Tx, instruction Instruction, innerInstruc
|
|||||||
amountX uint64
|
amountX uint64
|
||||||
amountY uint64
|
amountY uint64
|
||||||
binDist []dlmmBinLiquidityDistribution
|
binDist []dlmmBinLiquidityDistribution
|
||||||
|
weightDist []dlmmBinLiquidityDistributionByWeight
|
||||||
startBinId int32
|
startBinId int32
|
||||||
endBinId int32
|
endBinId int32
|
||||||
hasRange bool
|
hasRange bool
|
||||||
@@ -751,6 +773,16 @@ func metaoradlmmAddLiquidityParser(tx *Tx, instruction Instruction, innerInstruc
|
|||||||
startBinId = args.LiquidityParameter.StrategyParameters.MinBinId
|
startBinId = args.LiquidityParameter.StrategyParameters.MinBinId
|
||||||
endBinId = args.LiquidityParameter.StrategyParameters.MaxBinId
|
endBinId = args.LiquidityParameter.StrategyParameters.MaxBinId
|
||||||
hasRange = true
|
hasRange = true
|
||||||
|
case meteoraDlmmAddLiquidityByWeightDiscriminator:
|
||||||
|
var args dlmmAddLiquidityByWeightArgs
|
||||||
|
if err := agbinary.NewBorshDecoder(decode[8:]).Decode(&args); err != nil {
|
||||||
|
return nil, increaseOffset(offset), fmt.Errorf("meteora dlmm add liquidity by weight decode error: %v, offset, %d, %d", err, offset[0], offset[1])
|
||||||
|
}
|
||||||
|
amountX = args.LiquidityParameter.AmountX
|
||||||
|
amountY = args.LiquidityParameter.AmountY
|
||||||
|
weightDist = args.LiquidityParameter.BinLiquidityDist
|
||||||
|
startBinId, endBinId = dlmmMinMaxBinIdFromWeightDistribution(weightDist)
|
||||||
|
hasRange = len(weightDist) > 0
|
||||||
default:
|
default:
|
||||||
return nil, increaseOffset(offset), InstructionIgnoredError
|
return nil, increaseOffset(offset), InstructionIgnoredError
|
||||||
}
|
}
|
||||||
@@ -771,6 +803,9 @@ func metaoradlmmAddLiquidityParser(tx *Tx, instruction Instruction, innerInstruc
|
|||||||
binChanges := []DlmmBinLiquidityChange(nil)
|
binChanges := []DlmmBinLiquidityChange(nil)
|
||||||
if len(binDist) > 0 {
|
if len(binDist) > 0 {
|
||||||
binChanges = dlmmBinChangesFromDistribution(amountX, amountY, binDist)
|
binChanges = dlmmBinChangesFromDistribution(amountX, amountY, binDist)
|
||||||
|
} else if len(weightDist) > 0 {
|
||||||
|
// Weight-only params do not preserve per-side amounts for each bin, so keep the affected range only.
|
||||||
|
binChanges = dlmmBinChangesFromRange(startBinId, endBinId, 0)
|
||||||
} else if hasRange {
|
} else if hasRange {
|
||||||
binChanges = dlmmBinChangesFromRange(startBinId, endBinId, 0)
|
binChanges = dlmmBinChangesFromRange(startBinId, endBinId, 0)
|
||||||
}
|
}
|
||||||
@@ -1446,11 +1481,11 @@ func dlmmRebalancingEventFromInnerInstructions(innerInstructions InnerInstructio
|
|||||||
return dlmmRebalancingEvent{}, increaseOffset(offset), fmt.Errorf("meteora dlmm rebalance liquidity event not found, offset, %d, %d", offset[0], prefixLen)
|
return dlmmRebalancingEvent{}, increaseOffset(offset), fmt.Errorf("meteora dlmm rebalance liquidity event not found, offset, %d, %d", offset[0], prefixLen)
|
||||||
}
|
}
|
||||||
|
|
||||||
func dlmmPositionCreateEventFromInnerInstructions(innerInstructions InnerInstructions, instruction Instruction, offset [2]uint) (dlmmPositionCreateEvent, [2]uint, error) {
|
func dlmmPositionCreateEventFromInnerInstructions(innerInstructions InnerInstructions, instruction Instruction, offset [2]uint) (dlmmPositionCreateEvent, [2]uint, bool, error) {
|
||||||
var prefixLen = offset[1]
|
var prefixLen = offset[1]
|
||||||
inners, err := getInnerInstructions(innerInstructions, prefixLen)
|
inners, err := getInnerInstructions(innerInstructions, prefixLen)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return dlmmPositionCreateEvent{}, increaseOffset(offset), fmt.Errorf("meteora dlmm create position get inner instructions error: %v, offset, %d, %d", err, offset[0], prefixLen)
|
return dlmmPositionCreateEvent{}, increaseOffset(offset), false, fmt.Errorf("meteora dlmm create position get inner instructions error: %v, offset, %d, %d", err, offset[0], prefixLen)
|
||||||
}
|
}
|
||||||
for innerIndex, innerInstr := range inners {
|
for innerIndex, innerInstr := range inners {
|
||||||
if innerInstr.ProgramIDIndex != instruction.ProgramIDIndex {
|
if innerInstr.ProgramIDIndex != instruction.ProgramIDIndex {
|
||||||
@@ -1465,9 +1500,9 @@ func dlmmPositionCreateEventFromInnerInstructions(innerInstructions InnerInstruc
|
|||||||
} else {
|
} else {
|
||||||
offset[1] = uint(innerIndex) + 1 + prefixLen
|
offset[1] = uint(innerIndex) + 1 + prefixLen
|
||||||
}
|
}
|
||||||
return event, offset, nil
|
return event, offset, true, nil
|
||||||
}
|
}
|
||||||
return dlmmPositionCreateEvent{}, increaseOffset(offset), fmt.Errorf("meteora dlmm create position event not found, offset, %d, %d", offset[0], prefixLen)
|
return dlmmPositionCreateEvent{}, increaseOffset(offset), false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func dlmmPositionCloseEventFromInnerInstructions(innerInstructions InnerInstructions, instruction Instruction, offset [2]uint) (dlmmPositionCloseEvent, [2]uint, bool, error) {
|
func dlmmPositionCloseEventFromInnerInstructions(innerInstructions InnerInstructions, instruction Instruction, offset [2]uint) (dlmmPositionCloseEvent, [2]uint, bool, error) {
|
||||||
@@ -2047,6 +2082,23 @@ func dlmmMinMaxBinIdFromDistribution(dist []dlmmBinLiquidityDistribution) (int32
|
|||||||
return min, max
|
return min, max
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dlmmMinMaxBinIdFromWeightDistribution(dist []dlmmBinLiquidityDistributionByWeight) (int32, int32) {
|
||||||
|
if len(dist) == 0 {
|
||||||
|
return 0, 0
|
||||||
|
}
|
||||||
|
min := dist[0].BinId
|
||||||
|
max := dist[0].BinId
|
||||||
|
for _, item := range dist[1:] {
|
||||||
|
if item.BinId < min {
|
||||||
|
min = item.BinId
|
||||||
|
}
|
||||||
|
if item.BinId > max {
|
||||||
|
max = item.BinId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min, max
|
||||||
|
}
|
||||||
|
|
||||||
func dlmmMinMaxBinIdFromReduction(reduction []dlmmBinLiquidityReduction) (int32, int32) {
|
func dlmmMinMaxBinIdFromReduction(reduction []dlmmBinLiquidityReduction) (int32, int32) {
|
||||||
if len(reduction) == 0 {
|
if len(reduction) == 0 {
|
||||||
return 0, 0
|
return 0, 0
|
||||||
|
|||||||
2
rawtx.go
2
rawtx.go
@@ -872,7 +872,9 @@ func ConvertYellowstoneGrpcTransactionToSolanaTransaction(y *pb.SubscribeUpdateT
|
|||||||
}
|
}
|
||||||
sTx.Meta.Fee = meta.Fee
|
sTx.Meta.Fee = meta.Fee
|
||||||
//sTx.Meta.InnerInstructions = meta.InnerInstructions
|
//sTx.Meta.InnerInstructions = meta.InnerInstructions
|
||||||
|
if meta.ComputeUnitsConsumed != nil {
|
||||||
sTx.Meta.ComputeUnitsConsumed = *meta.ComputeUnitsConsumed
|
sTx.Meta.ComputeUnitsConsumed = *meta.ComputeUnitsConsumed
|
||||||
|
}
|
||||||
for _, innerInstr := range meta.InnerInstructions {
|
for _, innerInstr := range meta.InnerInstructions {
|
||||||
var instrs []Instruction
|
var instrs []Instruction
|
||||||
for _, instr := range innerInstr.Instructions {
|
for _, instr := range innerInstr.Instructions {
|
||||||
|
|||||||
Reference in New Issue
Block a user