From 0ef57cf79aaa21225afc2320ed2f7f35cf6b14b4 Mon Sep 17 00:00:00 2001 From: bijianing97 <826015751@qq.com> Date: Fri, 20 Mar 2026 17:06:37 +0800 Subject: [PATCH] Add dlmm add_liquidity_by_weight --- meta.go | 1 + metaoradlmm.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/meta.go b/meta.go index 0bb1a2d..65bfdf0 100644 --- a/meta.go +++ b/meta.go @@ -88,6 +88,7 @@ var ( meteoraDlmmAddLiquidity2Discriminator = calculateDiscriminator("global:add_liquidity2") meteoraDlmmAddLiquidityByStrategyDiscriminator = calculateDiscriminator("global:add_liquidity_by_strategy") meteoraDlmmAddLiquidityByStrategy2Discriminator = calculateDiscriminator("global:add_liquidity_by_strategy2") + meteoraDlmmAddLiquidityByWeightDiscriminator = calculateDiscriminator("global:add_liquidity_by_weight") meteoraDlmmClaimFeeDiscriminator = calculateDiscriminator("global:claim_fee") meteoraDlmmClaimFee2Discriminator = calculateDiscriminator("global:claim_fee2") meteoraDlmmRebalanceLiquidityDiscriminator = calculateDiscriminator("global:rebalance_liquidity") diff --git a/metaoradlmm.go b/metaoradlmm.go index 0c7ccb7..b7a6f56 100644 --- a/metaoradlmm.go +++ b/metaoradlmm.go @@ -117,6 +117,11 @@ type dlmmBinLiquidityDistribution struct { DistributionY uint16 } +type dlmmBinLiquidityDistributionByWeight struct { + BinId int32 + Weight uint16 +} + type dlmmBinLiquidityReduction struct { BinId int32 BpsToRemove uint16 @@ -143,6 +148,14 @@ type dlmmLiquidityParameterByStrategy struct { StrategyParameters dlmmStrategyParameters } +type dlmmLiquidityParameterByWeight struct { + AmountX uint64 + AmountY uint64 + ActiveID int32 + MaxActiveBinSlippage int32 + BinLiquidityDist []dlmmBinLiquidityDistributionByWeight +} + type dlmmAddLiquidityArgs struct { LiquidityParameter dlmmLiquidityParameter } @@ -161,6 +174,10 @@ type dlmmAddLiquidityByStrategy2Args struct { RemainingAccountsInfo dlmmRemainingAccountsInfo } +type dlmmAddLiquidityByWeightArgs struct { + LiquidityParameter dlmmLiquidityParameterByWeight +} + type dlmmRemoveLiquidityArgs struct { BinLiquidityRemoval []dlmmBinLiquidityReduction } @@ -276,7 +293,8 @@ func metaoradlmmParser(tx *Tx, instruction Instruction, innerInstructions InnerI case meteoraDlmmSwap2Discriminator, meteoraDlmmSwapExactOut2Discriminator, meteoraDlmmSwapWithPriceImpact2Discriminator: return metaoradlmmSwap2Parser(tx, instruction, innerInstructions, offset) case meteoraDlmmAddLiquidityDiscriminator, meteoraDlmmAddLiquidity2Discriminator, - meteoraDlmmAddLiquidityByStrategyDiscriminator, meteoraDlmmAddLiquidityByStrategy2Discriminator: + meteoraDlmmAddLiquidityByStrategyDiscriminator, meteoraDlmmAddLiquidityByStrategy2Discriminator, + meteoraDlmmAddLiquidityByWeightDiscriminator: return metaoradlmmAddLiquidityParser(tx, instruction, innerInstructions, offset) case meteoraDlmmClaimFeeDiscriminator, meteoraDlmmClaimFee2Discriminator: return metaoradlmmClaimFeeParser(tx, instruction, innerInstructions, offset) @@ -705,6 +723,7 @@ func metaoradlmmAddLiquidityParser(tx *Tx, instruction Instruction, innerInstruc amountX uint64 amountY uint64 binDist []dlmmBinLiquidityDistribution + weightDist []dlmmBinLiquidityDistributionByWeight startBinId int32 endBinId int32 hasRange bool @@ -751,6 +770,16 @@ func metaoradlmmAddLiquidityParser(tx *Tx, instruction Instruction, innerInstruc startBinId = args.LiquidityParameter.StrategyParameters.MinBinId endBinId = args.LiquidityParameter.StrategyParameters.MaxBinId 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: return nil, increaseOffset(offset), InstructionIgnoredError } @@ -771,6 +800,9 @@ func metaoradlmmAddLiquidityParser(tx *Tx, instruction Instruction, innerInstruc binChanges := []DlmmBinLiquidityChange(nil) if len(binDist) > 0 { 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 { binChanges = dlmmBinChangesFromRange(startBinId, endBinId, 0) } @@ -2047,6 +2079,23 @@ func dlmmMinMaxBinIdFromDistribution(dist []dlmmBinLiquidityDistribution) (int32 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) { if len(reduction) == 0 { return 0, 0