@meteora-ag/dlmm 1.6.0-rc.0 → 1.6.0-rc.10
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 +12 -46
- package/dist/index.js +316 -359
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +316 -359
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -18,7 +18,6 @@ var _spltoken = require('@solana/spl-token');
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
|
|
22
21
|
var _web3js = require('@solana/web3.js');
|
|
23
22
|
var _decimaljs = require('decimal.js'); var _decimaljs2 = _interopRequireDefault(_decimaljs);
|
|
24
23
|
|
|
@@ -12180,20 +12179,6 @@ function isPositionNoFee(position) {
|
|
|
12180
12179
|
function isPositionNoReward(position) {
|
|
12181
12180
|
return position.rewardOne.isZero() && position.rewardTwo.isZero();
|
|
12182
12181
|
}
|
|
12183
|
-
function chunkBinRangeIntoExtendedPositions(minBinId, maxBinId) {
|
|
12184
|
-
const chunkedBinRange = [];
|
|
12185
|
-
for (let currentMinBinId = minBinId; currentMinBinId <= maxBinId; currentMinBinId += POSITION_MAX_LENGTH.toNumber()) {
|
|
12186
|
-
const currentMaxBinId = Math.min(
|
|
12187
|
-
currentMinBinId + POSITION_MAX_LENGTH.toNumber() - 1,
|
|
12188
|
-
maxBinId
|
|
12189
|
-
);
|
|
12190
|
-
chunkedBinRange.push({
|
|
12191
|
-
lowerBinId: currentMinBinId,
|
|
12192
|
-
upperBinId: currentMaxBinId
|
|
12193
|
-
});
|
|
12194
|
-
}
|
|
12195
|
-
return chunkedBinRange;
|
|
12196
|
-
}
|
|
12197
12182
|
function chunkBinRange(minBinId, maxBinId) {
|
|
12198
12183
|
const chunkedBinRange = [];
|
|
12199
12184
|
let startBinId = minBinId;
|
|
@@ -15122,78 +15107,14 @@ var DLMM = class {
|
|
|
15122
15107
|
lowerBinArrayIndex.add(new (0, _anchor.BN)(1))
|
|
15123
15108
|
);
|
|
15124
15109
|
const binArraysCount = (await this.binArraysToBeCreate(lowerBinArrayIndex, upperBinArrayIndex)).length;
|
|
15125
|
-
const
|
|
15126
|
-
(maxBinId - minBinId + 1) /
|
|
15110
|
+
const transactionCount = Math.ceil(
|
|
15111
|
+
(maxBinId - minBinId + 1) / DEFAULT_BIN_PER_POSITION.toNumber()
|
|
15127
15112
|
);
|
|
15128
15113
|
const binArrayCost = binArraysCount * BIN_ARRAY_FEE;
|
|
15129
|
-
const positionCost = positionCount * POSITION_FEE;
|
|
15130
|
-
return {
|
|
15131
|
-
binArraysCount,
|
|
15132
|
-
binArrayCost,
|
|
15133
|
-
positionCount,
|
|
15134
|
-
positionCost
|
|
15135
|
-
};
|
|
15136
|
-
}
|
|
15137
|
-
/**
|
|
15138
|
-
* Estimates the cost to create a new position based on the given strategy.
|
|
15139
|
-
*
|
|
15140
|
-
* This function calculates the costs associated with creating bin arrays, positions
|
|
15141
|
-
* and extending positions for a specified range of bins.
|
|
15142
|
-
*
|
|
15143
|
-
* @param {TQuoteCreatePositionParams} param0 - The settings of the requested new position,
|
|
15144
|
-
* including the strategy with minimum and maximum bin IDs.
|
|
15145
|
-
* @returns An object containing:
|
|
15146
|
-
* - binArraysCount: The number of bin arrays required.
|
|
15147
|
-
* - binArrayCost: The estimated cost for creating bin arrays.
|
|
15148
|
-
* - positionCount: The number of positions required.
|
|
15149
|
-
* - positionCost: The fee cost for creating positions.
|
|
15150
|
-
* - positionExtendCost: The rent cost in lamports for extending positions.
|
|
15151
|
-
*/
|
|
15152
|
-
async quoteCreateMultiplePositions({
|
|
15153
|
-
strategy
|
|
15154
|
-
}) {
|
|
15155
|
-
const { minBinId, maxBinId } = strategy;
|
|
15156
|
-
const minBinIdBN = new (0, _anchor.BN)(minBinId);
|
|
15157
|
-
const maxBinIdBN = new (0, _anchor.BN)(maxBinId);
|
|
15158
|
-
const lowerBinArrayIndex = binIdToBinArrayIndex(minBinIdBN);
|
|
15159
|
-
const upperBinArrayIndex = binIdToBinArrayIndex(maxBinIdBN);
|
|
15160
|
-
const binArraysCount = (await this.binArraysToBeCreate(lowerBinArrayIndex, upperBinArrayIndex)).length;
|
|
15161
|
-
const binArrayCost = new (0, _decimaljs2.default)(binArraysCount).mul(
|
|
15162
|
-
new (0, _decimaljs2.default)(BIN_ARRAY_FEE)
|
|
15163
|
-
);
|
|
15164
|
-
let positionCost = new (0, _decimaljs2.default)(0);
|
|
15165
|
-
let positionExtendCost = new (0, _decimaljs2.default)(0);
|
|
15166
|
-
const chunkedPositionBinRange = chunkBinRangeIntoExtendedPositions(
|
|
15167
|
-
minBinId,
|
|
15168
|
-
maxBinId
|
|
15169
|
-
);
|
|
15170
|
-
const positionCount = chunkedPositionBinRange.length;
|
|
15171
|
-
for (const { lowerBinId, upperBinId } of chunkedPositionBinRange) {
|
|
15172
|
-
positionCost = positionCost.add(new (0, _decimaljs2.default)(POSITION_FEE));
|
|
15173
|
-
const lowerBinIdBN = new (0, _anchor.BN)(lowerBinId);
|
|
15174
|
-
const upperBinIdBN = new (0, _anchor.BN)(upperBinId);
|
|
15175
|
-
const extendedBinCount = getExtendedPositionBinCount(
|
|
15176
|
-
lowerBinIdBN,
|
|
15177
|
-
upperBinIdBN
|
|
15178
|
-
);
|
|
15179
|
-
const upperBinIdBeforeExtend = upperBinIdBN.sub(extendedBinCount);
|
|
15180
|
-
positionExtendCost = positionExtendCost.add(
|
|
15181
|
-
await getPositionExpandRentExemption(
|
|
15182
|
-
lowerBinIdBN,
|
|
15183
|
-
upperBinIdBeforeExtend,
|
|
15184
|
-
this.program.provider.connection,
|
|
15185
|
-
extendedBinCount
|
|
15186
|
-
).then(
|
|
15187
|
-
(lamports) => new (0, _decimaljs2.default)(lamports).div(new (0, _decimaljs2.default)(_web3js.LAMPORTS_PER_SOL))
|
|
15188
|
-
)
|
|
15189
|
-
);
|
|
15190
|
-
}
|
|
15191
15114
|
return {
|
|
15192
15115
|
binArraysCount,
|
|
15193
15116
|
binArrayCost,
|
|
15194
|
-
|
|
15195
|
-
positionCost,
|
|
15196
|
-
positionExtendCost
|
|
15117
|
+
transactionCount
|
|
15197
15118
|
};
|
|
15198
15119
|
}
|
|
15199
15120
|
/**
|
|
@@ -15234,84 +15155,6 @@ var DLMM = class {
|
|
|
15234
15155
|
feePayer: user
|
|
15235
15156
|
}).add(setCUIx, ...instructions);
|
|
15236
15157
|
}
|
|
15237
|
-
/**
|
|
15238
|
-
* Creates multiple empty positions for a user in specified bin ranges with necessary bin arrays.
|
|
15239
|
-
*
|
|
15240
|
-
* @param {number} minBinId - The minimum bin ID for the positions.
|
|
15241
|
-
* @param {number} maxBinId - The maximum bin ID for the positions.
|
|
15242
|
-
* @param {PublicKey} user - The public key of the user for whom the positions are created.
|
|
15243
|
-
*
|
|
15244
|
-
* @returns An object containing arrays of transactions for initializing positions, extending positions and initialzing bin arrays.
|
|
15245
|
-
*/
|
|
15246
|
-
async createMultipleEmptyPositions({
|
|
15247
|
-
minBinId,
|
|
15248
|
-
maxBinId,
|
|
15249
|
-
user
|
|
15250
|
-
}) {
|
|
15251
|
-
const chunkedBinRange = chunkBinRangeIntoExtendedPositions(
|
|
15252
|
-
minBinId,
|
|
15253
|
-
maxBinId
|
|
15254
|
-
);
|
|
15255
|
-
const positionCount = chunkedBinRange.length;
|
|
15256
|
-
const positionKeypairs = [];
|
|
15257
|
-
const initPositionIxs = [];
|
|
15258
|
-
const initBinArrayIxs = [];
|
|
15259
|
-
const binArrayIndexSet = /* @__PURE__ */ new Set();
|
|
15260
|
-
for (let i = 0; i < positionCount; i++) {
|
|
15261
|
-
const positionKeypair = _web3js.Keypair.generate();
|
|
15262
|
-
positionKeypairs.push(positionKeypair);
|
|
15263
|
-
const { lowerBinId, upperBinId } = chunkedBinRange[i];
|
|
15264
|
-
let width = upperBinId - lowerBinId + 1;
|
|
15265
|
-
width = Math.min(width, DEFAULT_BIN_PER_POSITION.toNumber());
|
|
15266
|
-
const initPositionIx = await this.createInitAndExtendPositionIx(
|
|
15267
|
-
lowerBinId,
|
|
15268
|
-
upperBinId,
|
|
15269
|
-
width,
|
|
15270
|
-
user,
|
|
15271
|
-
positionKeypair.publicKey
|
|
15272
|
-
);
|
|
15273
|
-
initPositionIxs.push(initPositionIx);
|
|
15274
|
-
const binArrayIndexes = getBinArrayIndexesCoverage(
|
|
15275
|
-
new (0, _anchor.BN)(lowerBinId),
|
|
15276
|
-
new (0, _anchor.BN)(upperBinId)
|
|
15277
|
-
).filter((idx) => !binArrayIndexSet.has(idx.toNumber()));
|
|
15278
|
-
const createBinArrayIxs = await this.createBinArraysIfNeeded(
|
|
15279
|
-
binArrayIndexes,
|
|
15280
|
-
user
|
|
15281
|
-
).then(
|
|
15282
|
-
(ixs) => ixs.map((ix) => [
|
|
15283
|
-
_web3js.ComputeBudgetProgram.setComputeUnitLimit({
|
|
15284
|
-
units: DEFAULT_INIT_BIN_ARRAY_CU
|
|
15285
|
-
}),
|
|
15286
|
-
ix
|
|
15287
|
-
])
|
|
15288
|
-
);
|
|
15289
|
-
binArrayIndexes.map((idx) => {
|
|
15290
|
-
binArrayIndexSet.add(idx.toNumber());
|
|
15291
|
-
});
|
|
15292
|
-
initBinArrayIxs.push(...createBinArrayIxs);
|
|
15293
|
-
}
|
|
15294
|
-
const { blockhash, lastValidBlockHeight } = await this.program.provider.connection.getLatestBlockhash("confirmed");
|
|
15295
|
-
const initPositionTxs = initPositionIxs.map((ix) => {
|
|
15296
|
-
return new (0, _web3js.Transaction)({
|
|
15297
|
-
blockhash,
|
|
15298
|
-
lastValidBlockHeight,
|
|
15299
|
-
feePayer: user
|
|
15300
|
-
}).add(...ix);
|
|
15301
|
-
});
|
|
15302
|
-
const initBinArrayTxs = initBinArrayIxs.map((ix) => {
|
|
15303
|
-
return new (0, _web3js.Transaction)({
|
|
15304
|
-
blockhash,
|
|
15305
|
-
lastValidBlockHeight,
|
|
15306
|
-
feePayer: user
|
|
15307
|
-
}).add(...ix);
|
|
15308
|
-
});
|
|
15309
|
-
return {
|
|
15310
|
-
positionKeypairs,
|
|
15311
|
-
initPositionTxs,
|
|
15312
|
-
initBinArrayTxs
|
|
15313
|
-
};
|
|
15314
|
-
}
|
|
15315
15158
|
/**
|
|
15316
15159
|
* The function `getPosition` retrieves position information for a given public key and processes it
|
|
15317
15160
|
* using various data to return a `LbPosition` object.
|
|
@@ -18387,220 +18230,334 @@ var DLMM = class {
|
|
|
18387
18230
|
const { lbPair, shouldClaimFee, shouldClaimReward, owner, address } = rebalancePosition;
|
|
18388
18231
|
const { depositParams, withdrawParams } = simulationResult;
|
|
18389
18232
|
const activeId = new (0, _anchor.BN)(lbPair.activeId);
|
|
18390
|
-
|
|
18391
|
-
|
|
18392
|
-
const
|
|
18393
|
-
|
|
18394
|
-
|
|
18395
|
-
|
|
18396
|
-
|
|
18397
|
-
|
|
18398
|
-
|
|
18399
|
-
|
|
18400
|
-
|
|
18401
|
-
|
|
18402
|
-
|
|
18403
|
-
|
|
18404
|
-
|
|
18405
|
-
|
|
18406
|
-
|
|
18407
|
-
|
|
18408
|
-
|
|
18409
|
-
|
|
18410
|
-
|
|
18411
|
-
|
|
18412
|
-
|
|
18413
|
-
|
|
18414
|
-
|
|
18415
|
-
|
|
18416
|
-
|
|
18417
|
-
|
|
18418
|
-
|
|
18233
|
+
let minBinId = Number.POSITIVE_INFINITY;
|
|
18234
|
+
let maxBinId = Number.NEGATIVE_INFINITY;
|
|
18235
|
+
for (const param of depositParams) {
|
|
18236
|
+
const min = activeId.toNumber() + param.minDeltaId;
|
|
18237
|
+
const max = activeId.toNumber() + param.maxDeltaId;
|
|
18238
|
+
if (min < minBinId)
|
|
18239
|
+
minBinId = min;
|
|
18240
|
+
if (max > maxBinId)
|
|
18241
|
+
maxBinId = max;
|
|
18242
|
+
}
|
|
18243
|
+
for (const param of withdrawParams) {
|
|
18244
|
+
if (param.minBinId !== null && param.minBinId < minBinId)
|
|
18245
|
+
minBinId = param.minBinId;
|
|
18246
|
+
if (param.maxBinId !== null && param.maxBinId > maxBinId)
|
|
18247
|
+
maxBinId = param.maxBinId;
|
|
18248
|
+
}
|
|
18249
|
+
if (!Number.isFinite(minBinId) || !Number.isFinite(maxBinId)) {
|
|
18250
|
+
throw new Error("Unable to determine min/max binId for chunking");
|
|
18251
|
+
}
|
|
18252
|
+
const binChunks = chunkBinRange(minBinId, maxBinId);
|
|
18253
|
+
function splitDepositParamsForChunk(params, chunk, activeId2) {
|
|
18254
|
+
const res = [];
|
|
18255
|
+
for (const param of params) {
|
|
18256
|
+
const absMin = activeId2.toNumber() + param.minDeltaId;
|
|
18257
|
+
const absMax = activeId2.toNumber() + param.maxDeltaId;
|
|
18258
|
+
if (absMax < chunk.lowerBinId || absMin > chunk.upperBinId)
|
|
18259
|
+
continue;
|
|
18260
|
+
const newMin = Math.max(absMin, chunk.lowerBinId);
|
|
18261
|
+
const newMax = Math.min(absMax, chunk.upperBinId);
|
|
18262
|
+
res.push({
|
|
18263
|
+
...param,
|
|
18264
|
+
minDeltaId: newMin - activeId2.toNumber(),
|
|
18265
|
+
maxDeltaId: newMax - activeId2.toNumber()
|
|
18266
|
+
});
|
|
18267
|
+
}
|
|
18268
|
+
return res;
|
|
18269
|
+
}
|
|
18270
|
+
function splitWithdrawParamsForChunk(params, chunk) {
|
|
18271
|
+
const res = [];
|
|
18272
|
+
for (const param of params) {
|
|
18273
|
+
const absMin = param.minBinId !== null ? param.minBinId : activeId.toNumber();
|
|
18274
|
+
const absMax = param.maxBinId !== null ? param.maxBinId : activeId.toNumber();
|
|
18275
|
+
if (absMax < chunk.lowerBinId || absMin > chunk.upperBinId)
|
|
18276
|
+
continue;
|
|
18277
|
+
const newMin = Math.max(absMin, chunk.lowerBinId);
|
|
18278
|
+
const newMax = Math.min(absMax, chunk.upperBinId);
|
|
18279
|
+
res.push({
|
|
18280
|
+
...param,
|
|
18281
|
+
minBinId: newMin,
|
|
18282
|
+
maxBinId: newMax
|
|
18283
|
+
});
|
|
18284
|
+
}
|
|
18285
|
+
return res;
|
|
18286
|
+
}
|
|
18287
|
+
const allInstructions = [];
|
|
18288
|
+
for (const chunk of binChunks) {
|
|
18289
|
+
const chunkedDepositParams = splitDepositParamsForChunk(
|
|
18290
|
+
depositParams,
|
|
18291
|
+
chunk,
|
|
18292
|
+
activeId
|
|
18293
|
+
);
|
|
18294
|
+
const chunkedWithdrawParams = splitWithdrawParamsForChunk(
|
|
18295
|
+
withdrawParams,
|
|
18296
|
+
chunk
|
|
18297
|
+
);
|
|
18298
|
+
if (chunkedDepositParams.length === 0 && chunkedWithdrawParams.length === 0)
|
|
18299
|
+
continue;
|
|
18300
|
+
const { slices, accounts: transferHookAccounts } = this.getPotentialToken2022IxDataAndAccounts(0 /* Liquidity */);
|
|
18301
|
+
const preInstructions = [];
|
|
18302
|
+
const harvestRewardRemainingAccountMetas = [];
|
|
18303
|
+
if (shouldClaimReward) {
|
|
18304
|
+
for (const [idx, reward] of this.lbPair.rewardInfos.entries()) {
|
|
18305
|
+
if (!reward.mint.equals(_web3js.PublicKey.default)) {
|
|
18306
|
+
const rewardTokenInfo = this.rewards[idx];
|
|
18307
|
+
slices.push({
|
|
18308
|
+
accountsType: {
|
|
18309
|
+
transferHookMultiReward: {
|
|
18310
|
+
0: idx
|
|
18311
|
+
}
|
|
18312
|
+
},
|
|
18313
|
+
length: rewardTokenInfo.transferHookAccountMetas.length
|
|
18314
|
+
});
|
|
18315
|
+
transferHookAccounts.push(
|
|
18316
|
+
...rewardTokenInfo.transferHookAccountMetas
|
|
18317
|
+
);
|
|
18318
|
+
const userTokenRewardAddress = _spltoken.getAssociatedTokenAddressSync.call(void 0,
|
|
18419
18319
|
reward.mint,
|
|
18320
|
+
owner,
|
|
18321
|
+
true,
|
|
18420
18322
|
rewardTokenInfo.owner
|
|
18421
|
-
)
|
|
18422
|
-
|
|
18423
|
-
|
|
18424
|
-
|
|
18425
|
-
|
|
18426
|
-
|
|
18427
|
-
|
|
18428
|
-
|
|
18429
|
-
|
|
18430
|
-
|
|
18431
|
-
|
|
18432
|
-
|
|
18433
|
-
|
|
18434
|
-
|
|
18435
|
-
|
|
18436
|
-
|
|
18437
|
-
|
|
18438
|
-
|
|
18439
|
-
|
|
18440
|
-
|
|
18441
|
-
|
|
18442
|
-
|
|
18443
|
-
|
|
18444
|
-
|
|
18445
|
-
|
|
18446
|
-
|
|
18447
|
-
|
|
18448
|
-
|
|
18323
|
+
);
|
|
18324
|
+
preInstructions.push(
|
|
18325
|
+
_spltoken.createAssociatedTokenAccountIdempotentInstruction.call(void 0,
|
|
18326
|
+
owner,
|
|
18327
|
+
userTokenRewardAddress,
|
|
18328
|
+
owner,
|
|
18329
|
+
reward.mint,
|
|
18330
|
+
rewardTokenInfo.owner
|
|
18331
|
+
)
|
|
18332
|
+
);
|
|
18333
|
+
const rewardVault = {
|
|
18334
|
+
pubkey: reward.vault,
|
|
18335
|
+
isSigner: false,
|
|
18336
|
+
isWritable: true
|
|
18337
|
+
};
|
|
18338
|
+
const userTokenReward = {
|
|
18339
|
+
pubkey: userTokenRewardAddress,
|
|
18340
|
+
isSigner: false,
|
|
18341
|
+
isWritable: true
|
|
18342
|
+
};
|
|
18343
|
+
const rewardMint = {
|
|
18344
|
+
pubkey: reward.mint,
|
|
18345
|
+
isSigner: false,
|
|
18346
|
+
isWritable: false
|
|
18347
|
+
};
|
|
18348
|
+
const rewardTokenProgram = {
|
|
18349
|
+
pubkey: rewardTokenInfo.owner,
|
|
18350
|
+
isSigner: false,
|
|
18351
|
+
isWritable: false
|
|
18352
|
+
};
|
|
18353
|
+
harvestRewardRemainingAccountMetas.push(
|
|
18354
|
+
rewardVault,
|
|
18355
|
+
userTokenReward,
|
|
18356
|
+
rewardMint,
|
|
18357
|
+
rewardTokenProgram
|
|
18358
|
+
);
|
|
18359
|
+
}
|
|
18449
18360
|
}
|
|
18450
18361
|
}
|
|
18451
|
-
|
|
18452
|
-
|
|
18453
|
-
|
|
18454
|
-
|
|
18455
|
-
|
|
18456
|
-
activeId.toNumber(),
|
|
18457
|
-
this.pubkey,
|
|
18458
|
-
this.program.programId
|
|
18459
|
-
);
|
|
18460
|
-
const binArrayPublicKeys = binArrayIndexes.map((index) => {
|
|
18461
|
-
const [binArrayPubkey] = deriveBinArray(
|
|
18362
|
+
const initBinArrayInstructions = [];
|
|
18363
|
+
const { binArrayBitmap, binArrayIndexes } = getRebalanceBinArrayIndexesAndBitmapCoverage(
|
|
18364
|
+
chunkedDepositParams,
|
|
18365
|
+
chunkedWithdrawParams,
|
|
18366
|
+
activeId.toNumber(),
|
|
18462
18367
|
this.pubkey,
|
|
18463
|
-
index,
|
|
18464
18368
|
this.program.programId
|
|
18465
18369
|
);
|
|
18466
|
-
|
|
18467
|
-
|
|
18468
|
-
|
|
18469
|
-
|
|
18470
|
-
|
|
18471
|
-
|
|
18472
|
-
|
|
18473
|
-
|
|
18474
|
-
|
|
18475
|
-
|
|
18476
|
-
|
|
18477
|
-
|
|
18478
|
-
|
|
18479
|
-
|
|
18480
|
-
|
|
18481
|
-
|
|
18482
|
-
|
|
18370
|
+
const binArrayPublicKeys = binArrayIndexes.map((index) => {
|
|
18371
|
+
const [binArrayPubkey] = deriveBinArray(
|
|
18372
|
+
this.pubkey,
|
|
18373
|
+
index,
|
|
18374
|
+
this.program.programId
|
|
18375
|
+
);
|
|
18376
|
+
return binArrayPubkey;
|
|
18377
|
+
});
|
|
18378
|
+
const binArrayAccounts = await chunkedGetMultipleAccountInfos(
|
|
18379
|
+
this.program.provider.connection,
|
|
18380
|
+
binArrayPublicKeys
|
|
18381
|
+
);
|
|
18382
|
+
for (let i = 0; i < binArrayAccounts.length; i++) {
|
|
18383
|
+
const binArrayAccount = binArrayAccounts[i];
|
|
18384
|
+
if (!binArrayAccount) {
|
|
18385
|
+
const binArrayPubkey = binArrayPublicKeys[i];
|
|
18386
|
+
const binArrayIndex = binArrayIndexes[i];
|
|
18387
|
+
const initBinArrayIx = await this.program.methods.initializeBinArray(binArrayIndex).accountsPartial({
|
|
18388
|
+
binArray: binArrayPubkey,
|
|
18389
|
+
funder: owner,
|
|
18390
|
+
lbPair: this.pubkey
|
|
18391
|
+
}).instruction();
|
|
18392
|
+
initBinArrayInstructions.push(initBinArrayIx);
|
|
18393
|
+
}
|
|
18483
18394
|
}
|
|
18484
|
-
|
|
18485
|
-
|
|
18486
|
-
|
|
18487
|
-
|
|
18488
|
-
|
|
18489
|
-
|
|
18490
|
-
|
|
18491
|
-
|
|
18492
|
-
|
|
18493
|
-
|
|
18494
|
-
|
|
18495
|
-
|
|
18496
|
-
|
|
18497
|
-
|
|
18395
|
+
if (!binArrayBitmap.equals(_web3js.PublicKey.default)) {
|
|
18396
|
+
const bitmapAccount = await this.program.provider.connection.getAccountInfo(binArrayBitmap);
|
|
18397
|
+
if (!bitmapAccount) {
|
|
18398
|
+
const initBitmapExtensionIx = await this.program.methods.initializeBinArrayBitmapExtension().accountsPartial({
|
|
18399
|
+
binArrayBitmapExtension: binArrayBitmap,
|
|
18400
|
+
funder: owner,
|
|
18401
|
+
lbPair: this.pubkey
|
|
18402
|
+
}).preInstructions([
|
|
18403
|
+
_web3js.ComputeBudgetProgram.setComputeUnitLimit({
|
|
18404
|
+
units: DEFAULT_INIT_BIN_ARRAY_CU
|
|
18405
|
+
})
|
|
18406
|
+
]).instruction();
|
|
18407
|
+
preInstructions.push(initBitmapExtensionIx);
|
|
18408
|
+
}
|
|
18498
18409
|
}
|
|
18499
|
-
|
|
18500
|
-
|
|
18501
|
-
|
|
18502
|
-
|
|
18503
|
-
|
|
18504
|
-
|
|
18505
|
-
|
|
18506
|
-
|
|
18507
|
-
|
|
18508
|
-
|
|
18509
|
-
|
|
18510
|
-
|
|
18511
|
-
|
|
18512
|
-
|
|
18513
|
-
|
|
18410
|
+
const [
|
|
18411
|
+
{ ataPubKey: userTokenX, ix: createUserTokenXIx },
|
|
18412
|
+
{ ataPubKey: userTokenY, ix: createUserTokenYIx }
|
|
18413
|
+
] = await Promise.all([
|
|
18414
|
+
getOrCreateATAInstruction(
|
|
18415
|
+
this.program.provider.connection,
|
|
18416
|
+
this.tokenX.publicKey,
|
|
18417
|
+
owner,
|
|
18418
|
+
this.tokenX.owner
|
|
18419
|
+
),
|
|
18420
|
+
getOrCreateATAInstruction(
|
|
18421
|
+
this.program.provider.connection,
|
|
18422
|
+
this.tokenY.publicKey,
|
|
18423
|
+
owner,
|
|
18424
|
+
this.tokenY.owner
|
|
18425
|
+
)
|
|
18426
|
+
]);
|
|
18427
|
+
createUserTokenXIx && preInstructions.push(createUserTokenXIx);
|
|
18428
|
+
createUserTokenYIx && preInstructions.push(createUserTokenYIx);
|
|
18429
|
+
slippage = capSlippagePercentage(slippage);
|
|
18430
|
+
const applySlippageMaxAmount = (amount, slippage2) => {
|
|
18431
|
+
return slippage2 == 100 ? U64_MAX : amount.muln(100 + slippage2).divn(100);
|
|
18432
|
+
};
|
|
18433
|
+
const applySlippageMinAmount = (amount, slippage2) => {
|
|
18434
|
+
return amount.muln(100 - slippage2).divn(100);
|
|
18435
|
+
};
|
|
18436
|
+
const maxDepositXAmount = applySlippageMaxAmount(
|
|
18437
|
+
simulationResult.actualAmountXDeposited,
|
|
18438
|
+
slippage
|
|
18439
|
+
);
|
|
18440
|
+
const maxDepositYAmount = applySlippageMaxAmount(
|
|
18441
|
+
simulationResult.actualAmountYDeposited,
|
|
18442
|
+
slippage
|
|
18443
|
+
);
|
|
18444
|
+
const minWithdrawXAmount = applySlippageMinAmount(
|
|
18445
|
+
simulationResult.actualAmountXWithdrawn,
|
|
18446
|
+
slippage
|
|
18447
|
+
);
|
|
18448
|
+
const minWithdrawYAmount = applySlippageMinAmount(
|
|
18449
|
+
simulationResult.actualAmountYWithdrawn,
|
|
18450
|
+
slippage
|
|
18451
|
+
);
|
|
18452
|
+
const postInstructions = [];
|
|
18453
|
+
if (this.tokenX.publicKey.equals(_spltoken.NATIVE_MINT) && simulationResult.actualAmountXDeposited.gtn(0)) {
|
|
18454
|
+
const wrapSOLIx = wrapSOLInstruction(
|
|
18455
|
+
owner,
|
|
18456
|
+
userTokenX,
|
|
18457
|
+
BigInt(simulationResult.actualAmountXDeposited.toString())
|
|
18458
|
+
);
|
|
18459
|
+
preInstructions.push(...wrapSOLIx);
|
|
18460
|
+
}
|
|
18461
|
+
if (this.tokenY.publicKey.equals(_spltoken.NATIVE_MINT) && simulationResult.actualAmountYDeposited.gtn(0)) {
|
|
18462
|
+
const wrapSOLIx = wrapSOLInstruction(
|
|
18463
|
+
owner,
|
|
18464
|
+
userTokenY,
|
|
18465
|
+
BigInt(simulationResult.actualAmountYDeposited.toString())
|
|
18466
|
+
);
|
|
18467
|
+
preInstructions.push(...wrapSOLIx);
|
|
18468
|
+
}
|
|
18469
|
+
if (this.tokenX.publicKey.equals(_spltoken.NATIVE_MINT) || this.tokenY.publicKey.equals(_spltoken.NATIVE_MINT)) {
|
|
18470
|
+
const closeWrappedSOLIx = await unwrapSOLInstruction(owner);
|
|
18471
|
+
closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);
|
|
18472
|
+
}
|
|
18473
|
+
const instruction = await this.program.methods.rebalanceLiquidity(
|
|
18474
|
+
{
|
|
18475
|
+
adds: chunkedDepositParams,
|
|
18476
|
+
removes: chunkedWithdrawParams,
|
|
18477
|
+
activeId: activeId.toNumber(),
|
|
18478
|
+
shouldClaimFee,
|
|
18479
|
+
shouldClaimReward,
|
|
18480
|
+
maxActiveBinSlippage: maxActiveBinSlippage.toNumber(),
|
|
18481
|
+
maxDepositXAmount,
|
|
18482
|
+
maxDepositYAmount,
|
|
18483
|
+
minWithdrawXAmount,
|
|
18484
|
+
minWithdrawYAmount,
|
|
18485
|
+
padding: Array(32).fill(0)
|
|
18486
|
+
},
|
|
18487
|
+
{
|
|
18488
|
+
slices
|
|
18489
|
+
}
|
|
18490
|
+
).accountsPartial({
|
|
18491
|
+
lbPair: this.pubkey,
|
|
18492
|
+
binArrayBitmapExtension: binArrayBitmap,
|
|
18493
|
+
position: address,
|
|
18514
18494
|
owner,
|
|
18515
18495
|
userTokenX,
|
|
18516
|
-
owner,
|
|
18517
|
-
this.tokenX.publicKey,
|
|
18518
|
-
this.tokenX.owner
|
|
18519
|
-
)
|
|
18520
|
-
);
|
|
18521
|
-
preInstructions.push(
|
|
18522
|
-
_spltoken.createAssociatedTokenAccountIdempotentInstruction.call(void 0,
|
|
18523
|
-
owner,
|
|
18524
18496
|
userTokenY,
|
|
18525
|
-
|
|
18526
|
-
this.
|
|
18527
|
-
this.
|
|
18528
|
-
|
|
18529
|
-
|
|
18530
|
-
|
|
18531
|
-
|
|
18532
|
-
|
|
18533
|
-
|
|
18534
|
-
|
|
18535
|
-
|
|
18536
|
-
|
|
18537
|
-
|
|
18538
|
-
|
|
18539
|
-
|
|
18540
|
-
|
|
18541
|
-
|
|
18542
|
-
|
|
18543
|
-
|
|
18544
|
-
|
|
18545
|
-
|
|
18546
|
-
|
|
18547
|
-
|
|
18548
|
-
|
|
18549
|
-
|
|
18550
|
-
|
|
18551
|
-
|
|
18497
|
+
reserveX: this.lbPair.reserveX,
|
|
18498
|
+
reserveY: this.lbPair.reserveY,
|
|
18499
|
+
tokenXMint: this.tokenX.publicKey,
|
|
18500
|
+
tokenYMint: this.tokenY.publicKey,
|
|
18501
|
+
tokenXProgram: this.tokenX.owner,
|
|
18502
|
+
tokenYProgram: this.tokenY.owner,
|
|
18503
|
+
memoProgram: MEMO_PROGRAM_ID,
|
|
18504
|
+
rentPayer: _nullishCoalesce(rentPayer, () => ( owner))
|
|
18505
|
+
}).remainingAccounts(transferHookAccounts).remainingAccounts(
|
|
18506
|
+
binArrayPublicKeys.map((pubkey) => {
|
|
18507
|
+
return {
|
|
18508
|
+
pubkey,
|
|
18509
|
+
isSigner: false,
|
|
18510
|
+
isWritable: true
|
|
18511
|
+
};
|
|
18512
|
+
})
|
|
18513
|
+
).instruction();
|
|
18514
|
+
const setCUIX = await getEstimatedComputeUnitIxWithBuffer(
|
|
18515
|
+
this.program.provider.connection,
|
|
18516
|
+
[instruction],
|
|
18517
|
+
owner
|
|
18518
|
+
);
|
|
18519
|
+
const rebalancePositionInstruction = [
|
|
18520
|
+
setCUIX,
|
|
18521
|
+
...preInstructions,
|
|
18522
|
+
instruction,
|
|
18523
|
+
...postInstructions
|
|
18524
|
+
];
|
|
18525
|
+
allInstructions.push({
|
|
18526
|
+
initBinArrayInstructions,
|
|
18527
|
+
rebalancePositionInstruction,
|
|
18528
|
+
chunk
|
|
18529
|
+
});
|
|
18530
|
+
}
|
|
18531
|
+
return allInstructions;
|
|
18532
|
+
}
|
|
18533
|
+
/**
|
|
18534
|
+
* Create an extended empty position.
|
|
18535
|
+
*
|
|
18536
|
+
* @param lowerBinid The lowest bin of the position.
|
|
18537
|
+
* @param upperBinId The highest bin of the position.
|
|
18538
|
+
* @param position The public key of the position.
|
|
18539
|
+
* @param owner The owner of the position.
|
|
18540
|
+
* @returns The instructions to create the extended empty position.
|
|
18541
|
+
*/
|
|
18542
|
+
async createExtendedEmptyPosition(lowerBinid, upperBinId, position, owner) {
|
|
18543
|
+
const positionWidth = upperBinId - lowerBinid + 1;
|
|
18544
|
+
const basePositionWidth = Math.min(
|
|
18545
|
+
positionWidth,
|
|
18546
|
+
DEFAULT_BIN_PER_POSITION.toNumber()
|
|
18552
18547
|
);
|
|
18553
|
-
const
|
|
18554
|
-
|
|
18555
|
-
|
|
18556
|
-
|
|
18557
|
-
activeId: activeId.toNumber(),
|
|
18558
|
-
shouldClaimFee,
|
|
18559
|
-
shouldClaimReward,
|
|
18560
|
-
maxActiveBinSlippage: maxActiveBinSlippage.toNumber(),
|
|
18561
|
-
maxDepositXAmount,
|
|
18562
|
-
maxDepositYAmount,
|
|
18563
|
-
minWithdrawXAmount,
|
|
18564
|
-
minWithdrawYAmount,
|
|
18565
|
-
padding: Array(32).fill(0)
|
|
18566
|
-
},
|
|
18567
|
-
{
|
|
18568
|
-
slices
|
|
18569
|
-
}
|
|
18570
|
-
).accountsPartial({
|
|
18571
|
-
lbPair: this.pubkey,
|
|
18572
|
-
binArrayBitmapExtension: binArrayBitmap,
|
|
18573
|
-
position: address,
|
|
18548
|
+
const ixs = await this.createInitAndExtendPositionIx(
|
|
18549
|
+
lowerBinid,
|
|
18550
|
+
upperBinId,
|
|
18551
|
+
basePositionWidth,
|
|
18574
18552
|
owner,
|
|
18575
|
-
|
|
18576
|
-
userTokenY,
|
|
18577
|
-
reserveX: this.lbPair.reserveX,
|
|
18578
|
-
reserveY: this.lbPair.reserveY,
|
|
18579
|
-
tokenXMint: this.tokenX.publicKey,
|
|
18580
|
-
tokenYMint: this.tokenY.publicKey,
|
|
18581
|
-
tokenXProgram: this.tokenX.owner,
|
|
18582
|
-
tokenYProgram: this.tokenY.owner,
|
|
18583
|
-
memoProgram: MEMO_PROGRAM_ID,
|
|
18584
|
-
rentPayer: _nullishCoalesce(rentPayer, () => ( owner))
|
|
18585
|
-
}).preInstructions(preInstructions).remainingAccounts(transferHookAccounts).remainingAccounts(
|
|
18586
|
-
binArrayPublicKeys.map((pubkey) => {
|
|
18587
|
-
return {
|
|
18588
|
-
pubkey,
|
|
18589
|
-
isSigner: false,
|
|
18590
|
-
isWritable: true
|
|
18591
|
-
};
|
|
18592
|
-
})
|
|
18593
|
-
).instruction();
|
|
18594
|
-
const setCUIX = await getEstimatedComputeUnitIxWithBuffer(
|
|
18595
|
-
this.program.provider.connection,
|
|
18596
|
-
[instruction],
|
|
18597
|
-
owner
|
|
18553
|
+
position
|
|
18598
18554
|
);
|
|
18599
|
-
const
|
|
18600
|
-
|
|
18601
|
-
|
|
18602
|
-
|
|
18603
|
-
};
|
|
18555
|
+
const latestBlockhashInfo = await this.program.provider.connection.getLatestBlockhash();
|
|
18556
|
+
const tx = new (0, _web3js.Transaction)({
|
|
18557
|
+
...latestBlockhashInfo,
|
|
18558
|
+
feePayer: owner
|
|
18559
|
+
}).add(...ixs);
|
|
18560
|
+
return tx;
|
|
18604
18561
|
}
|
|
18605
18562
|
async createInitAndExtendPositionIx(lowerBinId, upperBinId, basePositionWidth, user, position) {
|
|
18606
18563
|
const createPositionIx = await this.program.methods.initializePosition(lowerBinId, basePositionWidth).accountsPartial({
|