@meteora-ag/dlmm 1.6.0-rc.17 → 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,27 +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;
13067
- console.log(m1.toNumber(), m2.toNumber());
13047
+ let m2 = maxDeltaId.addn(1);
13068
13048
  for (let m = m1.toNumber(); m <= m2.toNumber(); m++) {
13069
13049
  const binId = activeId.addn(m);
13070
13050
  const pm = getQPriceFromId(binId.neg(), binStep);
@@ -13073,8 +13053,7 @@ function findBaseDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId, minX
13073
13053
  const cDelta = new (0, _bnjs2.default)(m).mul(pm);
13074
13054
  c = c.add(cDelta);
13075
13055
  }
13076
- console.log(amountX.sub(minX0).shln(SCALE_OFFSET).div(c.sub(b)).toString());
13077
- return amountX.sub(minX0).shln(SCALE_OFFSET).div(c.sub(b));
13056
+ return amountX.shln(SCALE_OFFSET).div(c.sub(b));
13078
13057
  }
13079
13058
  function findX0AndDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId) {
13080
13059
  if (minDeltaId.gt(maxDeltaId) || amountX.lte(new (0, _bnjs2.default)(0)) || amountX.isZero()) {
@@ -13083,18 +13062,14 @@ function findX0AndDeltaX(amountX, minDeltaId, maxDeltaId, binStep, activeId) {
13083
13062
  delta: new (0, _bnjs2.default)(0)
13084
13063
  };
13085
13064
  }
13086
- const minX0 = findMinX0(amountX, minDeltaId, maxDeltaId, activeId, binStep);
13087
13065
  let baseDeltaX = findBaseDeltaX(
13088
13066
  amountX,
13089
13067
  minDeltaId,
13090
13068
  maxDeltaId,
13091
13069
  binStep,
13092
- activeId,
13093
- minX0
13070
+ activeId
13094
13071
  );
13095
- console.log("\u{1F680} ~ baseDeltaX:", baseDeltaX.toString());
13096
- const x0 = minDeltaId.neg().mul(baseDeltaX).add(minX0);
13097
- console.log("\u{1F680} ~ x0:", x0.toString());
13072
+ const x0 = minDeltaId.neg().mul(baseDeltaX).add(baseDeltaX);
13098
13073
  while (true) {
13099
13074
  const amountInBins = getAmountInBinsAskSide(
13100
13075
  activeId,
@@ -13124,6 +13099,58 @@ var BidAskStrategyParameterBuilder = class {
13124
13099
  findYParameters(amountY, minDeltaId, maxDeltaId, activeId) {
13125
13100
  return findY0AndDeltaY(amountY, minDeltaId, maxDeltaId, activeId);
13126
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
+ }
13127
13154
  };
13128
13155
 
13129
13156
  // src/dlmm/helpers/rebalance/liquidity_strategy/curve.ts
@@ -13228,6 +13255,56 @@ var CurveStrategyParameterBuilder = class {
13228
13255
  findYParameters(amountY, minDeltaId, maxDeltaId, activeId) {
13229
13256
  return findY0AndDeltaY2(amountY, minDeltaId, maxDeltaId, activeId);
13230
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
+ }
13231
13308
  };
13232
13309
 
13233
13310
  // src/dlmm/helpers/rebalance/liquidity_strategy/spot.ts
@@ -13291,9 +13368,52 @@ var SpotStrategyParameterBuilder = class {
13291
13368
  delta: new (0, _bnjs2.default)(0)
13292
13369
  };
13293
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
+ }
13294
13413
  };
13295
13414
 
13296
13415
  // src/dlmm/helpers/rebalance/liquidity_strategy/index.ts
13416
+
13297
13417
  function getLiquidityStrategyParameterBuilder(strategyType) {
13298
13418
  switch (strategyType) {
13299
13419
  case 0 /* Spot */:
@@ -18158,7 +18278,6 @@ var DLMM = class {
18158
18278
  shouldClaimReward: true,
18159
18279
  pairAddress: this.pubkey
18160
18280
  });
18161
- console.log("\u{1F680} ~ DLMM ~ rebalancePosition:", rebalancePosition);
18162
18281
  const rebalanceStrategyBuilder = new BalancedStrategyBuilder(
18163
18282
  new (0, _anchor.BN)(rebalancePosition.lbPair.activeId),
18164
18283
  new (0, _anchor.BN)(rebalancePosition.lbPair.binStep),
@@ -18184,10 +18303,65 @@ var DLMM = class {
18184
18303
  withdraws,
18185
18304
  deposits
18186
18305
  );
18187
- 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
+ );
18188
18311
  return {
18189
18312
  rebalancePosition,
18190
- 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
18191
18365
  };
18192
18366
  }
18193
18367
  /**
@@ -18217,9 +18391,15 @@ var DLMM = class {
18217
18391
  withdraws,
18218
18392
  deposits
18219
18393
  );
18394
+ const binArrayQuoteResult = await this.quoteBinArrayAccountsRentalCost(
18395
+ simulationResult.depositParams,
18396
+ simulationResult.withdrawParams,
18397
+ new (0, _anchor.BN)(rebalancePosition.lbPair.activeId)
18398
+ );
18220
18399
  return {
18221
18400
  rebalancePosition,
18222
- simulationResult
18401
+ simulationResult,
18402
+ ...binArrayQuoteResult
18223
18403
  };
18224
18404
  }
18225
18405
  /**
@@ -18297,12 +18477,10 @@ var DLMM = class {
18297
18477
  chunk,
18298
18478
  activeId
18299
18479
  );
18300
- console.log("\u{1F680} ~ DLMM ~ chunkedDepositParams:", chunkedDepositParams);
18301
18480
  const chunkedWithdrawParams = splitWithdrawParamsForChunk(
18302
18481
  withdrawParams,
18303
18482
  chunk
18304
18483
  );
18305
- console.log("\u{1F680} ~ DLMM ~ chunkedWithdrawParams:", chunkedWithdrawParams);
18306
18484
  if (chunkedDepositParams.length === 0 && chunkedWithdrawParams.length === 0)
18307
18485
  continue;
18308
18486
  const { slices, accounts: transferHookAccounts } = this.getPotentialToken2022IxDataAndAccounts(0 /* Liquidity */);