@meteora-ag/dlmm 1.6.0-rc.16 → 1.6.0-rc.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -9585,6 +9585,12 @@ interface RebalancePositionResponse {
9585
9585
  rebalancePosition: RebalancePosition;
9586
9586
  simulationResult: SimulateRebalanceResp;
9587
9587
  }
9588
+ interface RebalancePositionBinArrayRentalCostQuote {
9589
+ binArrayExistence: Set<string>;
9590
+ binArrayCount: number;
9591
+ binArrayCost: number;
9592
+ bitmapExtensionCost: number;
9593
+ }
9588
9594
 
9589
9595
  /** private */
9590
9596
  declare function derivePresetParameterWithIndex(index: BN$1, programId: PublicKey): [PublicKey, number];
@@ -10658,8 +10664,9 @@ declare class DLMM {
10658
10664
  * @returns The transaction to execute this instruction.
10659
10665
  */
10660
10666
  increasePositionLength(position: PublicKey, side: ResizeSide, length: BN$1, funder: PublicKey, allowParallelExecution?: boolean): Promise<Transaction[]>;
10661
- simulateRebalancePositionWithBalancedStrategy(positionAddress: PublicKey, positionData: PositionData, strategy: StrategyType, topUpAmountX: BN$1, topUpAmountY: BN$1, xWithdrawBps: BN$1, yWithdrawBps: BN$1): Promise<RebalancePositionResponse>;
10667
+ simulateRebalancePositionWithBalancedStrategy(positionAddress: PublicKey, positionData: PositionData, strategy: StrategyType, topUpAmountX: BN$1, topUpAmountY: BN$1, xWithdrawBps: BN$1, yWithdrawBps: BN$1): Promise<RebalancePositionResponse & RebalancePositionBinArrayRentalCostQuote>;
10662
10668
  private simulateRebalancePositionWithStrategy;
10669
+ private quoteBinArrayAccountsRentalCost;
10663
10670
  /**
10664
10671
  * Simulates a rebalance operation on a position without actually executing it. It's recommended to use simulateRebalancePositionWithXStrategy instead unless you know what you're doing.
10665
10672
  *
@@ -10670,7 +10677,7 @@ declare class DLMM {
10670
10677
  * @param deposits An array of RebalanceWithDeposit objects representing the deposits to simulate.
10671
10678
  * @param withdraws An array of RebalanceWithWithdraw objects representing the withdraws to simulate.
10672
10679
  */
10673
- simulateRebalancePosition(positionAddress: PublicKey, positionData: PositionData, shouldClaimFee: boolean, shouldClaimReward: boolean, deposits: RebalanceWithDeposit[], withdraws: RebalanceWithWithdraw[]): Promise<RebalancePositionResponse>;
10680
+ simulateRebalancePosition(positionAddress: PublicKey, positionData: PositionData, shouldClaimFee: boolean, shouldClaimReward: boolean, deposits: RebalanceWithDeposit[], withdraws: RebalanceWithWithdraw[]): Promise<RebalancePositionResponse & RebalancePositionBinArrayRentalCostQuote>;
10674
10681
  /**
10675
10682
  * Rebalances a position and claim rewards if specified.
10676
10683
  *
@@ -21603,4 +21610,4 @@ declare const MAX_EXTRA_BIN_ARRAYS = 3;
21603
21610
  declare const U64_MAX: BN$1;
21604
21611
  declare const MAX_BINS_PER_POSITION: BN$1;
21605
21612
 
21606
- export { ADMIN, AccountName, ActionType, ActivationType, BASIS_POINT_MAX, BIN_ARRAY_BITMAP_FEE, BIN_ARRAY_BITMAP_FEE_BN, BIN_ARRAY_BITMAP_SIZE, BIN_ARRAY_FEE, BIN_ARRAY_FEE_BN, Bin, BinAndAmount, BinArray, BinArrayAccount, BinArrayBitmapExtension, BinArrayBitmapExtensionAccount, BinLiquidity, BinLiquidityDistribution, BinLiquidityReduction, BitmapType, ClmmProgram, Clock, ClockLayout, CompressedBinDepositAmount, CompressedBinDepositAmounts, DEFAULT_BIN_PER_POSITION, DLMMError, DlmmSdkError, EXTENSION_BINARRAY_BITMAP_SIZE, EmissionRate, ExtendedPositionBinData, FEE_PRECISION, FeeInfo, GetOrCreateATAResponse, IAccountsCache, IDL, ILM_BASE, InitCustomizablePermissionlessPairIx, InitPermissionPairIx, LBCLMM_PROGRAM_IDS, LMRewards, LbClmm, LbPair, LbPairAccount, LbPosition, LiquidityOneSideParameter, LiquidityParameter, LiquidityParameterByStrategy, LiquidityParameterByStrategyOneSide, LiquidityParameterByWeight, MAX_ACTIVE_BIN_SLIPPAGE, MAX_BINS_PER_POSITION, MAX_BIN_ARRAY_SIZE, MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX, MAX_CLAIM_ALL_ALLOWED, MAX_EXTRA_BIN_ARRAYS, MAX_FEE_RATE, MAX_RESIZE_LENGTH, MEMO_PROGRAM_ID, Network, Opt, POOL_FEE, POOL_FEE_BN, POSITION_BIN_DATA_SIZE, POSITION_FEE, POSITION_FEE_BN, POSITION_MAX_LENGTH, POSITION_MIN_SIZE, PRECISION, PairLockInfo, PairStatus, PairType, Position, PositionBinData, PositionData, PositionInfo, PositionLockInfo, PositionV2, PositionVersion, PresetParameter, PresetParameter2, ProgramStrategyParameter, ProgramStrategyType, RebalanceAddLiquidityParam, RebalancePositionResponse, RebalanceRemoveLiquidityParam, RemainingAccountInfo, RemainingAccountsInfoSlice, ResizeSide, ResizeSideEnum, RewardInfo, RewardInfos, SCALE, SCALE_OFFSET, SIMULATION_USER, SeedLiquidityCostBreakdown, SeedLiquidityResponse, SeedLiquiditySingleBinResponse, Strategy, StrategyParameters, StrategyType, SwapExactOutParams, SwapFee, SwapParams, SwapQuote, SwapQuoteExactOut, SwapWithPriceImpactParams, TInitializeMultiplePositionAndAddLiquidityParamsByStrategy, TInitializePositionAndAddLiquidityParams, TInitializePositionAndAddLiquidityParamsByStrategy, TOKEN_ACCOUNT_FEE, TOKEN_ACCOUNT_FEE_BN, TQuoteCreatePositionParams, TokenReserve, U64_MAX, UserFeeInfo, UserRewardInfo, autoFillXByStrategy, autoFillXByWeight, autoFillYByStrategy, autoFillYByWeight, binIdToBinArrayIndex, calculateBidAskDistribution, calculateNormalDistribution, calculateSpotDistribution, capSlippagePercentage, chunkedFetchMultipleBinArrayBitmapExtensionAccount, chunkedFetchMultiplePoolAccount, chunkedGetMultipleAccountInfos, chunks, computeFee, computeFeeFromAmount, computeProtocolFee, createProgram, decodeAccount, DLMM as default, deriveBinArray, deriveBinArrayBitmapExtension, deriveCustomizablePermissionlessLbPair, deriveEventAuthority, deriveLbPair, deriveLbPair2, deriveLbPairWithPresetParamWithIndexKey, deriveOracle, derivePermissionLbPair, derivePosition, derivePresetParameter, derivePresetParameter2, derivePresetParameterWithIndex, deriveReserve, deriveRewardVault, deriveTokenBadge, enumerateBins, findNextBinArrayIndexWithLiquidity, findNextBinArrayWithLiquidity, fromWeightDistributionToAmount, fromWeightDistributionToAmountOneSide, getAccountDiscriminator, getBaseFee, getBinArrayLowerUpperBinId, getBinArraysRequiredByPositionRange, getBinFromBinArray, getBinIdIndexInBinArray, getEstimatedComputeUnitIxWithBuffer, getEstimatedComputeUnitUsageWithBuffer, getOrCreateATAInstruction, getOutAmount, getPriceOfBinByBinId, getTokenBalance, getTokenDecimals, getTokenProgramId, getTokensMintFromPoolAddress, getTotalFee, getVariableFee, isBinIdWithinBinArray, isOverflowDefaultBinArrayBitmap, parseLogs, range, sParameters, swapExactInQuoteAtBin, swapExactOutQuoteAtBin, toAmountAskSide, toAmountBidSide, toAmountBothSide, toAmountsBothSideByStrategy, toStrategyParameters, toWeightDistribution, unwrapSOLInstruction, updateBinArray, vParameters, wrapSOLInstruction };
21613
+ export { ADMIN, AccountName, ActionType, ActivationType, BASIS_POINT_MAX, BIN_ARRAY_BITMAP_FEE, BIN_ARRAY_BITMAP_FEE_BN, BIN_ARRAY_BITMAP_SIZE, BIN_ARRAY_FEE, BIN_ARRAY_FEE_BN, Bin, BinAndAmount, BinArray, BinArrayAccount, BinArrayBitmapExtension, BinArrayBitmapExtensionAccount, BinLiquidity, BinLiquidityDistribution, BinLiquidityReduction, BitmapType, ClmmProgram, Clock, ClockLayout, CompressedBinDepositAmount, CompressedBinDepositAmounts, DEFAULT_BIN_PER_POSITION, DLMMError, DlmmSdkError, EXTENSION_BINARRAY_BITMAP_SIZE, EmissionRate, ExtendedPositionBinData, FEE_PRECISION, FeeInfo, GetOrCreateATAResponse, IAccountsCache, IDL, ILM_BASE, InitCustomizablePermissionlessPairIx, InitPermissionPairIx, LBCLMM_PROGRAM_IDS, LMRewards, LbClmm, LbPair, LbPairAccount, LbPosition, LiquidityOneSideParameter, LiquidityParameter, LiquidityParameterByStrategy, LiquidityParameterByStrategyOneSide, LiquidityParameterByWeight, MAX_ACTIVE_BIN_SLIPPAGE, MAX_BINS_PER_POSITION, MAX_BIN_ARRAY_SIZE, MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX, MAX_CLAIM_ALL_ALLOWED, MAX_EXTRA_BIN_ARRAYS, MAX_FEE_RATE, MAX_RESIZE_LENGTH, MEMO_PROGRAM_ID, Network, Opt, POOL_FEE, POOL_FEE_BN, POSITION_BIN_DATA_SIZE, POSITION_FEE, POSITION_FEE_BN, POSITION_MAX_LENGTH, POSITION_MIN_SIZE, PRECISION, PairLockInfo, PairStatus, PairType, Position, PositionBinData, PositionData, PositionInfo, PositionLockInfo, PositionV2, PositionVersion, PresetParameter, PresetParameter2, ProgramStrategyParameter, ProgramStrategyType, RebalanceAddLiquidityParam, RebalancePositionBinArrayRentalCostQuote, RebalancePositionResponse, RebalanceRemoveLiquidityParam, RemainingAccountInfo, RemainingAccountsInfoSlice, ResizeSide, ResizeSideEnum, RewardInfo, RewardInfos, SCALE, SCALE_OFFSET, SIMULATION_USER, SeedLiquidityCostBreakdown, SeedLiquidityResponse, SeedLiquiditySingleBinResponse, Strategy, StrategyParameters, StrategyType, SwapExactOutParams, SwapFee, SwapParams, SwapQuote, SwapQuoteExactOut, SwapWithPriceImpactParams, TInitializeMultiplePositionAndAddLiquidityParamsByStrategy, TInitializePositionAndAddLiquidityParams, TInitializePositionAndAddLiquidityParamsByStrategy, TOKEN_ACCOUNT_FEE, TOKEN_ACCOUNT_FEE_BN, TQuoteCreatePositionParams, TokenReserve, U64_MAX, UserFeeInfo, UserRewardInfo, autoFillXByStrategy, autoFillXByWeight, autoFillYByStrategy, autoFillYByWeight, binIdToBinArrayIndex, calculateBidAskDistribution, calculateNormalDistribution, calculateSpotDistribution, capSlippagePercentage, chunkedFetchMultipleBinArrayBitmapExtensionAccount, chunkedFetchMultiplePoolAccount, chunkedGetMultipleAccountInfos, chunks, computeFee, computeFeeFromAmount, computeProtocolFee, createProgram, decodeAccount, DLMM as default, deriveBinArray, deriveBinArrayBitmapExtension, deriveCustomizablePermissionlessLbPair, deriveEventAuthority, deriveLbPair, deriveLbPair2, deriveLbPairWithPresetParamWithIndexKey, deriveOracle, derivePermissionLbPair, derivePosition, derivePresetParameter, derivePresetParameter2, derivePresetParameterWithIndex, deriveReserve, deriveRewardVault, deriveTokenBadge, enumerateBins, findNextBinArrayIndexWithLiquidity, findNextBinArrayWithLiquidity, fromWeightDistributionToAmount, fromWeightDistributionToAmountOneSide, getAccountDiscriminator, getBaseFee, getBinArrayLowerUpperBinId, getBinArraysRequiredByPositionRange, getBinFromBinArray, getBinIdIndexInBinArray, getEstimatedComputeUnitIxWithBuffer, getEstimatedComputeUnitUsageWithBuffer, getOrCreateATAInstruction, getOutAmount, getPriceOfBinByBinId, getTokenBalance, getTokenDecimals, getTokenProgramId, getTokensMintFromPoolAddress, getTotalFee, getVariableFee, isBinIdWithinBinArray, isOverflowDefaultBinArrayBitmap, parseLogs, range, sParameters, swapExactInQuoteAtBin, swapExactOutQuoteAtBin, toAmountAskSide, toAmountBidSide, toAmountBothSide, toAmountsBothSideByStrategy, toStrategyParameters, toWeightDistribution, unwrapSOLInstruction, updateBinArray, vParameters, wrapSOLInstruction };
package/dist/index.js CHANGED
@@ -12992,26 +12992,20 @@ function getRebalanceBinArrayIndexesAndBitmapCoverage(adds, removes, activeId, p
12992
12992
 
12993
12993
  // src/dlmm/helpers/rebalance/liquidity_strategy/bidAsk.ts
12994
12994
 
12995
- function findMinY0(amountY, minDeltaId, maxDeltaId) {
12996
- const binCount = maxDeltaId.sub(minDeltaId).addn(1);
12997
- const totalWeight = binCount.mul(binCount.addn(1)).divn(2);
12998
- return amountY.div(totalWeight);
12999
- }
13000
- function findBaseDeltaY(amountY, minDeltaId, maxDeltaId, minY0) {
12995
+ function findBaseDeltaY(amountY, minDeltaId, maxDeltaId) {
13001
12996
  if (minDeltaId.gt(maxDeltaId) || amountY.lte(new (0, _bnjs2.default)(0))) {
13002
12997
  return new (0, _bnjs2.default)(0);
13003
12998
  }
13004
12999
  if (minDeltaId.eq(maxDeltaId)) {
13005
13000
  return amountY;
13006
13001
  }
13007
- const m1 = minDeltaId.neg();
13002
+ const m1 = minDeltaId.neg().subn(1);
13008
13003
  const m2 = maxDeltaId.neg();
13009
13004
  const b = m2.neg().mul(m1.sub(m2).addn(1));
13010
13005
  const c = m1.mul(m1.addn(1)).divn(2);
13011
13006
  const d = m2.mul(m2.subn(1)).divn(2);
13012
13007
  const a = b.add(c.sub(d));
13013
- const e = minY0;
13014
- return amountY.sub(e).div(a);
13008
+ return amountY.div(a);
13015
13009
  }
13016
13010
  function findY0AndDeltaY(amountY, minDeltaId, maxDeltaId, activeId) {
13017
13011
  if (minDeltaId.gt(maxDeltaId) || amountY.isZero()) {
@@ -13020,9 +13014,8 @@ function findY0AndDeltaY(amountY, minDeltaId, maxDeltaId, activeId) {
13020
13014
  delta: new (0, _bnjs2.default)(0)
13021
13015
  };
13022
13016
  }
13023
- const minY0 = findMinY0(amountY, minDeltaId, maxDeltaId);
13024
- let baseDeltaY = findBaseDeltaY(amountY, minDeltaId, maxDeltaId, minY0);
13025
- const y0 = baseDeltaY.neg().mul(maxDeltaId).add(minY0);
13017
+ let baseDeltaY = findBaseDeltaY(amountY, minDeltaId, maxDeltaId);
13018
+ const y0 = baseDeltaY.neg().mul(maxDeltaId).add(baseDeltaY);
13026
13019
  while (true) {
13027
13020
  const amountInBins = getAmountInBinsBidSide(
13028
13021
  activeId,
@@ -13044,26 +13037,14 @@ function findY0AndDeltaY(amountY, minDeltaId, maxDeltaId, activeId) {
13044
13037
  }
13045
13038
  }
13046
13039
  }
13047
- function findMinX0(amountX, minDeltaId, maxDeltaId, activeId, binStep) {
13048
- const minBinId = activeId.add(minDeltaId);
13049
- const maxBinId = activeId.add(maxDeltaId);
13050
- let totalWeight = new (0, _bnjs2.default)(0);
13051
- for (let binId = minBinId.toNumber(); binId <= maxBinId.toNumber(); binId++) {
13052
- const binDelta = binId - minBinId.toNumber() + 1;
13053
- const binPrice = getQPriceFromId(new (0, _bnjs2.default)(binId), binStep);
13054
- const weight = new (0, _bnjs2.default)(binDelta).mul(binPrice);
13055
- totalWeight = totalWeight.add(weight);
13056
- }
13057
- return amountX.shln(SCALE_OFFSET).div(totalWeight);
13058
- }
13059
- function findBaseDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId, minX0) {
13040
+ function findBaseDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId) {
13060
13041
  if (minDeltaId.gt(maxDeltaId) || amountX.lte(new (0, _bnjs2.default)(0))) {
13061
13042
  return new (0, _bnjs2.default)(0);
13062
13043
  }
13063
13044
  let b = new (0, _bnjs2.default)(0);
13064
13045
  let c = new (0, _bnjs2.default)(0);
13065
13046
  let m1 = minDeltaId;
13066
- let m2 = maxDeltaId;
13047
+ let m2 = maxDeltaId.addn(1);
13067
13048
  for (let m = m1.toNumber(); m <= m2.toNumber(); m++) {
13068
13049
  const binId = activeId.addn(m);
13069
13050
  const pm = getQPriceFromId(binId.neg(), binStep);
@@ -13072,8 +13053,7 @@ function findBaseDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId, minX
13072
13053
  const cDelta = new (0, _bnjs2.default)(m).mul(pm);
13073
13054
  c = c.add(cDelta);
13074
13055
  }
13075
- console.log(amountX.sub(minX0).shln(SCALE_OFFSET).div(c.sub(b)).toString());
13076
- return amountX.sub(minX0).shln(SCALE_OFFSET).div(c.sub(b));
13056
+ return amountX.shln(SCALE_OFFSET).div(c.sub(b));
13077
13057
  }
13078
13058
  function findX0AndDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId) {
13079
13059
  if (minDeltaId.gt(maxDeltaId) || amountX.lte(new (0, _bnjs2.default)(0)) || amountX.isZero()) {
@@ -13082,18 +13062,14 @@ function findX0AndDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId) {
13082
13062
  delta: new (0, _bnjs2.default)(0)
13083
13063
  };
13084
13064
  }
13085
- const minX0 = findMinX0(amountX, minDeltaId, maxDeltaId, activeId, binStep);
13086
13065
  let baseDeltaX = findBaseDeltaX(
13087
13066
  amountX,
13088
13067
  minDeltaId,
13089
13068
  maxDeltaId,
13090
13069
  binStep,
13091
- activeId,
13092
- minX0
13070
+ activeId
13093
13071
  );
13094
- console.log("\u{1F680} ~ baseDeltaX:", baseDeltaX.toString());
13095
- const x0 = minDeltaId.neg().mul(baseDeltaX).add(minX0);
13096
- console.log("\u{1F680} ~ x0:", x0.toString());
13072
+ const x0 = minDeltaId.neg().mul(baseDeltaX).add(baseDeltaX);
13097
13073
  while (true) {
13098
13074
  const amountInBins = getAmountInBinsAskSide(
13099
13075
  activeId,
@@ -13123,6 +13099,58 @@ var BidAskStrategyParameterBuilder = class {
13123
13099
  findYParameters(amountY, minDeltaId, maxDeltaId, activeId) {
13124
13100
  return findY0AndDeltaY(amountY, minDeltaId, maxDeltaId, activeId);
13125
13101
  }
13102
+ suggestBalancedXParametersFromY(activeId, binStep, favorXInActiveBin, minDeltaId, maxDeltaId, amountY) {
13103
+ const deltaX = amountY.div(
13104
+ maxDeltaId.addn(1).mul(maxDeltaId.addn(2)).divn(2)
13105
+ );
13106
+ const x0 = minDeltaId.neg().mul(deltaX).add(deltaX);
13107
+ const totalAmountX = toAmountIntoBins(
13108
+ activeId,
13109
+ minDeltaId,
13110
+ maxDeltaId,
13111
+ deltaX,
13112
+ new (0, _bnjs2.default)(0),
13113
+ x0,
13114
+ new (0, _bnjs2.default)(0),
13115
+ binStep,
13116
+ favorXInActiveBin
13117
+ ).reduce((acc, bin) => {
13118
+ return acc.add(bin.amountX);
13119
+ }, new (0, _bnjs2.default)(0));
13120
+ return {
13121
+ base: x0,
13122
+ delta: deltaX,
13123
+ amountX: totalAmountX
13124
+ };
13125
+ }
13126
+ suggestBalancedYParametersFromX(activeId, binStep, favorXInActiveBin, minDeltaId, maxDeltaId, amountXInQuoteValue) {
13127
+ const m1 = minDeltaId.neg().subn(1);
13128
+ const m2 = maxDeltaId.neg();
13129
+ const a1 = m2.neg().mul(m1.sub(m2).addn(1));
13130
+ const a2 = m1.mul(m1.addn(1)).divn(2);
13131
+ const a3 = m2.mul(m2.subn(1)).divn(2);
13132
+ const a = a1.add(a2.sub(a3));
13133
+ const deltaY = amountXInQuoteValue.div(a);
13134
+ const y0 = deltaY.neg().mul(m2).add(deltaY);
13135
+ const amountY = toAmountIntoBins(
13136
+ activeId,
13137
+ minDeltaId,
13138
+ maxDeltaId,
13139
+ new (0, _bnjs2.default)(0),
13140
+ deltaY,
13141
+ new (0, _bnjs2.default)(0),
13142
+ y0,
13143
+ binStep,
13144
+ favorXInActiveBin
13145
+ ).reduce((acc, bin) => {
13146
+ return acc.add(bin.amountY);
13147
+ }, new (0, _bnjs2.default)(0));
13148
+ return {
13149
+ base: y0,
13150
+ delta: deltaY,
13151
+ amountY
13152
+ };
13153
+ }
13126
13154
  };
13127
13155
 
13128
13156
  // src/dlmm/helpers/rebalance/liquidity_strategy/curve.ts
@@ -13227,6 +13255,56 @@ var CurveStrategyParameterBuilder = class {
13227
13255
  findYParameters(amountY, minDeltaId, maxDeltaId, activeId) {
13228
13256
  return findY0AndDeltaY2(amountY, minDeltaId, maxDeltaId, activeId);
13229
13257
  }
13258
+ suggestBalancedXParametersFromY(activeId, binStep, favorXInActiveBin, minDeltaId, maxDeltaId, amountY) {
13259
+ const x0 = amountY.muln(2).div(maxDeltaId.addn(1));
13260
+ const deltaX = x0.neg().div(maxDeltaId);
13261
+ const totalAmountX = toAmountIntoBins(
13262
+ activeId,
13263
+ minDeltaId,
13264
+ maxDeltaId,
13265
+ deltaX,
13266
+ new (0, _bnjs2.default)(0),
13267
+ x0,
13268
+ new (0, _bnjs2.default)(0),
13269
+ binStep,
13270
+ favorXInActiveBin
13271
+ ).reduce((acc, bin) => {
13272
+ return acc.add(bin.amountX);
13273
+ }, new (0, _bnjs2.default)(0));
13274
+ return {
13275
+ base: x0,
13276
+ delta: deltaX,
13277
+ amountX: totalAmountX
13278
+ };
13279
+ }
13280
+ suggestBalancedYParametersFromX(activeId, binStep, favorXInActiveBin, minDeltaId, maxDeltaId, amountXInQuoteValue) {
13281
+ const m1 = minDeltaId.neg();
13282
+ const m2 = maxDeltaId.neg();
13283
+ const a1 = m1.sub(m2).addn(1);
13284
+ const a2 = m1.mul(m1.addn(1)).divn(2);
13285
+ const a3 = m2.mul(m2.subn(1)).divn(2);
13286
+ const a = m1.sub(a3.sub(a2)).div(m1);
13287
+ const y0 = amountXInQuoteValue.div(a);
13288
+ const deltaY = y0.neg().div(m1);
13289
+ const amountY = toAmountIntoBins(
13290
+ activeId,
13291
+ minDeltaId,
13292
+ maxDeltaId,
13293
+ new (0, _bnjs2.default)(0),
13294
+ deltaY,
13295
+ new (0, _bnjs2.default)(0),
13296
+ y0,
13297
+ binStep,
13298
+ favorXInActiveBin
13299
+ ).reduce((acc, bin) => {
13300
+ return acc.add(bin.amountY);
13301
+ }, new (0, _bnjs2.default)(0));
13302
+ return {
13303
+ base: y0,
13304
+ delta: deltaY,
13305
+ amountY
13306
+ };
13307
+ }
13230
13308
  };
13231
13309
 
13232
13310
  // src/dlmm/helpers/rebalance/liquidity_strategy/spot.ts
@@ -13290,9 +13368,52 @@ var SpotStrategyParameterBuilder = class {
13290
13368
  delta: new (0, _bnjs2.default)(0)
13291
13369
  };
13292
13370
  }
13371
+ suggestBalancedXParametersFromY(activeId, binStep, favorXInActiveBin, minDeltaId, maxDeltaId, amountY) {
13372
+ const x0 = amountY.div(maxDeltaId.addn(1));
13373
+ const totalAmountX = toAmountIntoBins(
13374
+ activeId,
13375
+ minDeltaId,
13376
+ maxDeltaId,
13377
+ new (0, _bnjs2.default)(0),
13378
+ new (0, _bnjs2.default)(0),
13379
+ x0,
13380
+ new (0, _bnjs2.default)(0),
13381
+ binStep,
13382
+ favorXInActiveBin
13383
+ ).reduce((acc, bin) => {
13384
+ return acc.add(bin.amountX);
13385
+ }, new (0, _bnjs2.default)(0));
13386
+ return {
13387
+ base: new (0, _bnjs2.default)(x0.toString()),
13388
+ delta: new (0, _bnjs2.default)(0),
13389
+ amountX: totalAmountX
13390
+ };
13391
+ }
13392
+ suggestBalancedYParametersFromX(activeId, binStep, favorXInActiveBin, minDeltaId, maxDeltaId, amountXInQuoteValue) {
13393
+ const y0 = amountXInQuoteValue.div(maxDeltaId.sub(minDeltaId).addn(1));
13394
+ const amountY = toAmountIntoBins(
13395
+ activeId,
13396
+ minDeltaId,
13397
+ maxDeltaId,
13398
+ new (0, _bnjs2.default)(0),
13399
+ new (0, _bnjs2.default)(0),
13400
+ new (0, _bnjs2.default)(0),
13401
+ y0,
13402
+ binStep,
13403
+ favorXInActiveBin
13404
+ ).reduce((acc, bin) => {
13405
+ return acc.add(bin.amountY);
13406
+ }, new (0, _bnjs2.default)(0));
13407
+ return {
13408
+ base: y0,
13409
+ delta: new (0, _bnjs2.default)(0),
13410
+ amountY
13411
+ };
13412
+ }
13293
13413
  };
13294
13414
 
13295
13415
  // src/dlmm/helpers/rebalance/liquidity_strategy/index.ts
13416
+
13296
13417
  function getLiquidityStrategyParameterBuilder(strategyType) {
13297
13418
  switch (strategyType) {
13298
13419
  case 0 /* Spot */:
@@ -18157,7 +18278,6 @@ var DLMM = class {
18157
18278
  shouldClaimReward: true,
18158
18279
  pairAddress: this.pubkey
18159
18280
  });
18160
- console.log("\u{1F680} ~ DLMM ~ rebalancePosition:", rebalancePosition);
18161
18281
  const rebalanceStrategyBuilder = new BalancedStrategyBuilder(
18162
18282
  new (0, _anchor.BN)(rebalancePosition.lbPair.activeId),
18163
18283
  new (0, _anchor.BN)(rebalancePosition.lbPair.binStep),
@@ -18183,10 +18303,65 @@ var DLMM = class {
18183
18303
  withdraws,
18184
18304
  deposits
18185
18305
  );
18186
- console.log("\u{1F680} ~ DLMM ~ simulationResult:", simulationResult);
18306
+ const binArrayQuoteResult = await this.quoteBinArrayAccountsRentalCost(
18307
+ simulationResult.depositParams,
18308
+ simulationResult.withdrawParams,
18309
+ new (0, _anchor.BN)(rebalancePosition.lbPair.activeId)
18310
+ );
18187
18311
  return {
18188
18312
  rebalancePosition,
18189
- simulationResult
18313
+ simulationResult,
18314
+ ...binArrayQuoteResult
18315
+ };
18316
+ }
18317
+ async quoteBinArrayAccountsRentalCost(deposits, withdraws, activeId) {
18318
+ const { binArrayBitmap, binArrayIndexes } = getRebalanceBinArrayIndexesAndBitmapCoverage(
18319
+ deposits,
18320
+ withdraws,
18321
+ activeId.toNumber(),
18322
+ this.pubkey,
18323
+ this.program.programId
18324
+ );
18325
+ const binArrayPublicKeys = binArrayIndexes.map((index) => {
18326
+ const [binArrayPubkey] = deriveBinArray(
18327
+ this.pubkey,
18328
+ index,
18329
+ this.program.programId
18330
+ );
18331
+ return binArrayPubkey;
18332
+ });
18333
+ const accountPublicKeys = [...binArrayPublicKeys];
18334
+ if (!binArrayBitmap.equals(_web3js.PublicKey.default)) {
18335
+ accountPublicKeys.push(binArrayBitmap);
18336
+ }
18337
+ const accounts = await chunkedGetMultipleAccountInfos(
18338
+ this.program.provider.connection,
18339
+ binArrayPublicKeys
18340
+ );
18341
+ const binArrayAccounts = accounts.splice(0, binArrayPublicKeys.length);
18342
+ let binArrayCount = 0;
18343
+ let bitmapExtensionCost = 0;
18344
+ const binArraySet = /* @__PURE__ */ new Set();
18345
+ for (let i = 0; i < binArrayAccounts.length; i++) {
18346
+ const binArrayAccount = binArrayAccounts[i];
18347
+ const binArrayPubkey = binArrayPublicKeys[i];
18348
+ if (!binArrayAccount) {
18349
+ binArrayCount++;
18350
+ } else {
18351
+ binArraySet.add(binArrayPubkey.toBase58());
18352
+ }
18353
+ }
18354
+ if (!binArrayBitmap.equals(_web3js.PublicKey.default)) {
18355
+ const bitmapAccount = accounts.pop();
18356
+ if (!bitmapAccount) {
18357
+ bitmapExtensionCost = BIN_ARRAY_BITMAP_FEE;
18358
+ }
18359
+ }
18360
+ return {
18361
+ binArrayCost: binArrayCount * BIN_ARRAY_FEE,
18362
+ binArrayCount,
18363
+ binArrayExistence: binArraySet,
18364
+ bitmapExtensionCost
18190
18365
  };
18191
18366
  }
18192
18367
  /**
@@ -18216,9 +18391,15 @@ var DLMM = class {
18216
18391
  withdraws,
18217
18392
  deposits
18218
18393
  );
18394
+ const binArrayQuoteResult = await this.quoteBinArrayAccountsRentalCost(
18395
+ simulationResult.depositParams,
18396
+ simulationResult.withdrawParams,
18397
+ new (0, _anchor.BN)(rebalancePosition.lbPair.activeId)
18398
+ );
18219
18399
  return {
18220
18400
  rebalancePosition,
18221
- simulationResult
18401
+ simulationResult,
18402
+ ...binArrayQuoteResult
18222
18403
  };
18223
18404
  }
18224
18405
  /**
@@ -18296,12 +18477,10 @@ var DLMM = class {
18296
18477
  chunk,
18297
18478
  activeId
18298
18479
  );
18299
- console.log("\u{1F680} ~ DLMM ~ chunkedDepositParams:", chunkedDepositParams);
18300
18480
  const chunkedWithdrawParams = splitWithdrawParamsForChunk(
18301
18481
  withdrawParams,
18302
18482
  chunk
18303
18483
  );
18304
- console.log("\u{1F680} ~ DLMM ~ chunkedWithdrawParams:", chunkedWithdrawParams);
18305
18484
  if (chunkedDepositParams.length === 0 && chunkedWithdrawParams.length === 0)
18306
18485
  continue;
18307
18486
  const { slices, accounts: transferHookAccounts } = this.getPotentialToken2022IxDataAndAccounts(0 /* Liquidity */);