Compare commits

...

1 Commits

Author SHA1 Message Date
bijianing97
0ef57cf79a Add dlmm add_liquidity_by_weight 2026-03-20 17:06:37 +08:00
2 changed files with 51 additions and 1 deletions

View File

@@ -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")

View File

@@ -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)
@@ -705,6 +723,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 +770,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 +800,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)
} }
@@ -2047,6 +2079,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