Add dlmm add_liquidity_by_weight
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user