@meteora-ag/cp-amm-sdk 1.0.0-rc.3 → 1.0.0-rc.5
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.mts +48 -9
- package/dist/index.d.ts +48 -9
- package/dist/index.js +342 -216
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +342 -216
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -6401,7 +6401,6 @@ var SCALE_OFFSET = 64;
|
|
|
6401
6401
|
var BASIS_POINT_MAX = 1e4;
|
|
6402
6402
|
var MAX_FEE_NUMERATOR = 5e8;
|
|
6403
6403
|
var FEE_DENOMINATOR = 1e9;
|
|
6404
|
-
var PRECISION = 1e6;
|
|
6405
6404
|
var MIN_SQRT_PRICE = new BN("4295048016");
|
|
6406
6405
|
var MAX_SQRT_PRICE = new BN("79226673521066979257578248091");
|
|
6407
6406
|
var MIN_CU_BUFFER = 5e4;
|
|
@@ -6493,12 +6492,6 @@ function derivePositionNftAccount(positionNftMint) {
|
|
|
6493
6492
|
CP_AMM_PROGRAM_ID
|
|
6494
6493
|
)[0];
|
|
6495
6494
|
}
|
|
6496
|
-
function deriveTokenBadge(tokenMint) {
|
|
6497
|
-
return PublicKey2.findProgramAddressSync(
|
|
6498
|
-
[Buffer.from("token_badge"), tokenMint.toBuffer()],
|
|
6499
|
-
CP_AMM_PROGRAM_ID
|
|
6500
|
-
)[0];
|
|
6501
|
-
}
|
|
6502
6495
|
|
|
6503
6496
|
// src/helpers/token.ts
|
|
6504
6497
|
import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes";
|
|
@@ -6516,7 +6509,6 @@ import {
|
|
|
6516
6509
|
TokenInvalidAccountOwnerError
|
|
6517
6510
|
} from "@solana/spl-token";
|
|
6518
6511
|
import {
|
|
6519
|
-
PublicKey as PublicKey3,
|
|
6520
6512
|
SystemProgram,
|
|
6521
6513
|
TransactionInstruction
|
|
6522
6514
|
} from "@solana/web3.js";
|
|
@@ -6590,16 +6582,6 @@ var unwrapSOLInstruction = (owner, allowOwnerOffCurve = true) => __async(void 0,
|
|
|
6590
6582
|
}
|
|
6591
6583
|
return null;
|
|
6592
6584
|
});
|
|
6593
|
-
function getNftOwner(connection, nftMint) {
|
|
6594
|
-
return __async(this, null, function* () {
|
|
6595
|
-
const largesTokenAccount = yield connection.getTokenLargestAccounts(nftMint);
|
|
6596
|
-
const accountInfo = yield connection.getParsedAccountInfo(
|
|
6597
|
-
largesTokenAccount.value[0].address
|
|
6598
|
-
);
|
|
6599
|
-
const owner = new PublicKey3(accountInfo.value.data.parsed.info.owner);
|
|
6600
|
-
return new PublicKey3(owner);
|
|
6601
|
-
});
|
|
6602
|
-
}
|
|
6603
6585
|
function getAllUserPositionNftAccount(connection, user) {
|
|
6604
6586
|
return __async(this, null, function* () {
|
|
6605
6587
|
const filters = [
|
|
@@ -6634,6 +6616,24 @@ function getAllUserPositionNftAccount(connection, user) {
|
|
|
6634
6616
|
return userPositionNftAccount;
|
|
6635
6617
|
});
|
|
6636
6618
|
}
|
|
6619
|
+
function getAllPositionNftAccountByOwner(connection, user) {
|
|
6620
|
+
return __async(this, null, function* () {
|
|
6621
|
+
const tokenAccounts = yield connection.getTokenAccountsByOwner(user, {
|
|
6622
|
+
programId: TOKEN_2022_PROGRAM_ID
|
|
6623
|
+
});
|
|
6624
|
+
const userPositionNftAccount = [];
|
|
6625
|
+
for (const { account, pubkey } of tokenAccounts.value) {
|
|
6626
|
+
const tokenAccountData = AccountLayout.decode(account.data);
|
|
6627
|
+
if (tokenAccountData.amount.toString() === "1") {
|
|
6628
|
+
userPositionNftAccount.push({
|
|
6629
|
+
positionNft: tokenAccountData.mint,
|
|
6630
|
+
positionNftAccount: pubkey
|
|
6631
|
+
});
|
|
6632
|
+
}
|
|
6633
|
+
}
|
|
6634
|
+
return userPositionNftAccount;
|
|
6635
|
+
});
|
|
6636
|
+
}
|
|
6637
6637
|
|
|
6638
6638
|
// src/helpers/fee.ts
|
|
6639
6639
|
import { BN as BN5 } from "@coral-xyz/anchor";
|
|
@@ -6752,12 +6752,6 @@ function mulDiv(x, y, denominator, rounding) {
|
|
|
6752
6752
|
}
|
|
6753
6753
|
return div;
|
|
6754
6754
|
}
|
|
6755
|
-
function divCeil(a, b) {
|
|
6756
|
-
if (a.isZero()) {
|
|
6757
|
-
return new BN3(0);
|
|
6758
|
-
}
|
|
6759
|
-
return a.add(b.sub(new BN3(1))).div(b);
|
|
6760
|
-
}
|
|
6761
6755
|
function q64ToDecimal(num, decimalPlaces) {
|
|
6762
6756
|
return new Decimal(num.toString()).div(Decimal.pow(2, 64)).toDecimalPlaces(decimalPlaces);
|
|
6763
6757
|
}
|
|
@@ -6772,7 +6766,8 @@ function getNextSqrtPrice(amount, sqrtPrice, liquidity, aToB) {
|
|
|
6772
6766
|
if (aToB) {
|
|
6773
6767
|
const product = amount.mul(sqrtPrice);
|
|
6774
6768
|
const denominator = liquidity.add(product);
|
|
6775
|
-
|
|
6769
|
+
const numerator = liquidity.mul(sqrtPrice);
|
|
6770
|
+
result = numerator.add(denominator.sub(new BN4(1))).div(denominator);
|
|
6776
6771
|
} else {
|
|
6777
6772
|
const quotient = amount.shln(SCALE_OFFSET * 2).div(liquidity);
|
|
6778
6773
|
result = sqrtPrice.add(quotient);
|
|
@@ -6849,7 +6844,7 @@ function getFeeNumerator(currentPoint, activationPoint, numberOfPeriod, periodFr
|
|
|
6849
6844
|
new BN5(binStep),
|
|
6850
6845
|
new BN5(variableFeeControl)
|
|
6851
6846
|
);
|
|
6852
|
-
feeNumerator.add(dynamicFeeNumberator);
|
|
6847
|
+
feeNumerator = feeNumerator.add(dynamicFeeNumberator);
|
|
6853
6848
|
}
|
|
6854
6849
|
return feeNumerator.gt(new BN5(MAX_FEE_NUMERATOR)) ? new BN5(MAX_FEE_NUMERATOR) : feeNumerator;
|
|
6855
6850
|
}
|
|
@@ -7164,11 +7159,11 @@ function getAvailableVestingLiquidity(vestingData, currentPoint) {
|
|
|
7164
7159
|
numberOfPeriod,
|
|
7165
7160
|
totalReleasedLiquidity
|
|
7166
7161
|
} = vestingData;
|
|
7167
|
-
if (currentPoint
|
|
7162
|
+
if (currentPoint.lt(cliffPoint)) {
|
|
7168
7163
|
return new BN9(0);
|
|
7169
7164
|
}
|
|
7170
7165
|
if (periodFrequency.isZero()) {
|
|
7171
|
-
return cliffUnlockLiquidity
|
|
7166
|
+
return cliffUnlockLiquidity;
|
|
7172
7167
|
}
|
|
7173
7168
|
let passedPeriod = new BN9(currentPoint).sub(cliffPoint).div(periodFrequency);
|
|
7174
7169
|
passedPeriod = min(passedPeriod, new BN9(numberOfPeriod));
|
|
@@ -7246,12 +7241,12 @@ var CpAmm = class {
|
|
|
7246
7241
|
getTokenBadgeAccounts(tokenAMint, tokenBMint) {
|
|
7247
7242
|
return [
|
|
7248
7243
|
{
|
|
7249
|
-
pubkey:
|
|
7244
|
+
pubkey: deriveTokenBadgeAddress(tokenAMint),
|
|
7250
7245
|
isWritable: false,
|
|
7251
7246
|
isSigner: false
|
|
7252
7247
|
},
|
|
7253
7248
|
{
|
|
7254
|
-
pubkey:
|
|
7249
|
+
pubkey: deriveTokenBadgeAddress(tokenBMint),
|
|
7255
7250
|
isWritable: false,
|
|
7256
7251
|
isSigner: false
|
|
7257
7252
|
}
|
|
@@ -7509,6 +7504,34 @@ var CpAmm = class {
|
|
|
7509
7504
|
return instructions;
|
|
7510
7505
|
});
|
|
7511
7506
|
}
|
|
7507
|
+
/**
|
|
7508
|
+
* Builds a instruction to create a position.
|
|
7509
|
+
* @param {CreatePositionParams} params - Parameters for position creation.
|
|
7510
|
+
* @returns Transaction instruction.
|
|
7511
|
+
*/
|
|
7512
|
+
buildCreatePositionInstruction(params) {
|
|
7513
|
+
return __async(this, null, function* () {
|
|
7514
|
+
const { owner, payer, pool, positionNft } = params;
|
|
7515
|
+
const position = derivePositionAddress(positionNft);
|
|
7516
|
+
const positionNftAccount = derivePositionNftAccount(positionNft);
|
|
7517
|
+
const ix = yield this._program.methods.createPosition().accountsPartial({
|
|
7518
|
+
owner,
|
|
7519
|
+
positionNftMint: positionNft,
|
|
7520
|
+
poolAuthority: this.poolAuthority,
|
|
7521
|
+
positionNftAccount,
|
|
7522
|
+
payer,
|
|
7523
|
+
pool,
|
|
7524
|
+
position,
|
|
7525
|
+
tokenProgram: TOKEN_2022_PROGRAM_ID2,
|
|
7526
|
+
systemProgram: SystemProgram2.programId
|
|
7527
|
+
}).instruction();
|
|
7528
|
+
return {
|
|
7529
|
+
ix,
|
|
7530
|
+
position,
|
|
7531
|
+
positionNftAccount
|
|
7532
|
+
};
|
|
7533
|
+
});
|
|
7534
|
+
}
|
|
7512
7535
|
/**
|
|
7513
7536
|
* Fetches the Config state of the program.
|
|
7514
7537
|
* @param config - Public key of the config account.
|
|
@@ -7612,7 +7635,7 @@ var CpAmm = class {
|
|
|
7612
7635
|
*/
|
|
7613
7636
|
getPositionsByUser(user) {
|
|
7614
7637
|
return __async(this, null, function* () {
|
|
7615
|
-
const userPositionAccounts = yield
|
|
7638
|
+
const userPositionAccounts = yield getAllPositionNftAccountByOwner(
|
|
7616
7639
|
this._program.provider.connection,
|
|
7617
7640
|
user
|
|
7618
7641
|
);
|
|
@@ -7700,93 +7723,117 @@ var CpAmm = class {
|
|
|
7700
7723
|
return poolState !== null;
|
|
7701
7724
|
});
|
|
7702
7725
|
}
|
|
7726
|
+
/**
|
|
7727
|
+
* Computes the liquidity delta based on the provided token amounts and sqrt price
|
|
7728
|
+
*
|
|
7729
|
+
* @param {LiquidityDeltaParams} params - The parameters for liquidity calculation
|
|
7730
|
+
* @returns {Promise<BN>} - The computed liquidity delta in Q64 value.
|
|
7731
|
+
*/
|
|
7732
|
+
getLiquidityDelta(params) {
|
|
7733
|
+
const {
|
|
7734
|
+
maxAmountTokenA,
|
|
7735
|
+
maxAmountTokenB,
|
|
7736
|
+
sqrtMaxPrice,
|
|
7737
|
+
sqrtMinPrice,
|
|
7738
|
+
sqrtPrice
|
|
7739
|
+
} = params;
|
|
7740
|
+
const liquidityDeltaFromAmountA = getLiquidityDeltaFromAmountA(
|
|
7741
|
+
maxAmountTokenA,
|
|
7742
|
+
sqrtPrice,
|
|
7743
|
+
sqrtMaxPrice
|
|
7744
|
+
);
|
|
7745
|
+
const liquidityDeltaFromAmountB = getLiquidityDeltaFromAmountB(
|
|
7746
|
+
maxAmountTokenB,
|
|
7747
|
+
sqrtMinPrice,
|
|
7748
|
+
sqrtPrice
|
|
7749
|
+
);
|
|
7750
|
+
return min2(liquidityDeltaFromAmountA, liquidityDeltaFromAmountB);
|
|
7751
|
+
}
|
|
7703
7752
|
/**
|
|
7704
7753
|
* Calculates swap quote based on input amount and pool state.
|
|
7705
7754
|
* @param params - Swap parameters including input amount, pool state, slippage, etc.
|
|
7706
7755
|
* @returns Swap quote including expected output amount, fee, and price impact.
|
|
7707
7756
|
*/
|
|
7708
7757
|
getQuote(params) {
|
|
7709
|
-
|
|
7710
|
-
|
|
7758
|
+
const {
|
|
7759
|
+
inAmount,
|
|
7760
|
+
inputTokenMint,
|
|
7761
|
+
slippage,
|
|
7762
|
+
poolState,
|
|
7763
|
+
currentTime,
|
|
7764
|
+
currentSlot,
|
|
7765
|
+
inputTokenInfo,
|
|
7766
|
+
outputTokenInfo
|
|
7767
|
+
} = params;
|
|
7768
|
+
const {
|
|
7769
|
+
sqrtPrice: sqrtPriceQ64,
|
|
7770
|
+
liquidity: liquidityQ64,
|
|
7771
|
+
activationType,
|
|
7772
|
+
activationPoint,
|
|
7773
|
+
collectFeeMode,
|
|
7774
|
+
poolFees
|
|
7775
|
+
} = poolState;
|
|
7776
|
+
const {
|
|
7777
|
+
feeSchedulerMode,
|
|
7778
|
+
cliffFeeNumerator,
|
|
7779
|
+
numberOfPeriod,
|
|
7780
|
+
reductionFactor,
|
|
7781
|
+
periodFrequency
|
|
7782
|
+
} = poolFees.baseFee;
|
|
7783
|
+
const dynamicFee = poolFees.dynamicFee;
|
|
7784
|
+
let actualAmountIn = inAmount;
|
|
7785
|
+
if (inputTokenInfo) {
|
|
7786
|
+
actualAmountIn = calculateTransferFeeExcludedAmount(
|
|
7711
7787
|
inAmount,
|
|
7712
|
-
|
|
7713
|
-
|
|
7714
|
-
|
|
7715
|
-
|
|
7716
|
-
|
|
7717
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
7720
|
-
const {
|
|
7721
|
-
|
|
7722
|
-
|
|
7723
|
-
|
|
7724
|
-
|
|
7725
|
-
|
|
7726
|
-
|
|
7727
|
-
|
|
7728
|
-
|
|
7729
|
-
|
|
7730
|
-
|
|
7731
|
-
|
|
7732
|
-
|
|
7733
|
-
|
|
7734
|
-
|
|
7735
|
-
|
|
7736
|
-
|
|
7737
|
-
|
|
7738
|
-
|
|
7739
|
-
|
|
7740
|
-
|
|
7741
|
-
|
|
7742
|
-
|
|
7743
|
-
|
|
7744
|
-
|
|
7745
|
-
|
|
7746
|
-
|
|
7747
|
-
|
|
7748
|
-
|
|
7749
|
-
|
|
7750
|
-
|
|
7751
|
-
|
|
7752
|
-
|
|
7753
|
-
|
|
7754
|
-
|
|
7755
|
-
|
|
7756
|
-
|
|
7757
|
-
|
|
7758
|
-
|
|
7759
|
-
|
|
7760
|
-
|
|
7761
|
-
const { amountOut, totalFee } = getSwapAmount(
|
|
7762
|
-
actualAmountIn,
|
|
7763
|
-
sqrtPriceQ64,
|
|
7764
|
-
liquidityQ64,
|
|
7765
|
-
tradeFeeNumerator,
|
|
7766
|
-
aToB,
|
|
7767
|
-
collectFeeMode
|
|
7768
|
-
);
|
|
7769
|
-
let actualAmountOut = amountOut;
|
|
7770
|
-
if (outputTokenInfo) {
|
|
7771
|
-
actualAmountOut = calculateTransferFeeExcludedAmount(
|
|
7772
|
-
amountOut,
|
|
7773
|
-
outputTokenInfo.mint,
|
|
7774
|
-
outputTokenInfo.currentEpoch
|
|
7775
|
-
).amount;
|
|
7776
|
-
}
|
|
7777
|
-
const minSwapOutAmount = getMinAmountWithSlippage(
|
|
7778
|
-
actualAmountOut,
|
|
7779
|
-
slippage
|
|
7780
|
-
);
|
|
7781
|
-
return {
|
|
7782
|
-
swapInAmount: inAmount,
|
|
7783
|
-
consumedInAmount: actualAmountIn,
|
|
7784
|
-
swapOutAmount: actualAmountOut,
|
|
7785
|
-
minSwapOutAmount,
|
|
7786
|
-
totalFee,
|
|
7787
|
-
priceImpact: getPriceImpact(minSwapOutAmount, actualAmountOut)
|
|
7788
|
-
};
|
|
7789
|
-
});
|
|
7788
|
+
inputTokenInfo.mint,
|
|
7789
|
+
inputTokenInfo.currentEpoch
|
|
7790
|
+
).amount;
|
|
7791
|
+
}
|
|
7792
|
+
const aToB = poolState.tokenAMint.equals(inputTokenMint);
|
|
7793
|
+
const currentPoint = activationType ? currentTime : currentSlot;
|
|
7794
|
+
let dynamicFeeParams;
|
|
7795
|
+
if (dynamicFee.initialized) {
|
|
7796
|
+
const { volatilityAccumulator, binStep, variableFeeControl } = dynamicFee;
|
|
7797
|
+
dynamicFeeParams = { volatilityAccumulator, binStep, variableFeeControl };
|
|
7798
|
+
}
|
|
7799
|
+
const tradeFeeNumerator = getFeeNumerator(
|
|
7800
|
+
currentPoint,
|
|
7801
|
+
activationPoint,
|
|
7802
|
+
numberOfPeriod,
|
|
7803
|
+
periodFrequency,
|
|
7804
|
+
feeSchedulerMode,
|
|
7805
|
+
cliffFeeNumerator,
|
|
7806
|
+
reductionFactor,
|
|
7807
|
+
dynamicFeeParams
|
|
7808
|
+
);
|
|
7809
|
+
const { amountOut, totalFee } = getSwapAmount(
|
|
7810
|
+
actualAmountIn,
|
|
7811
|
+
sqrtPriceQ64,
|
|
7812
|
+
liquidityQ64,
|
|
7813
|
+
tradeFeeNumerator,
|
|
7814
|
+
aToB,
|
|
7815
|
+
collectFeeMode
|
|
7816
|
+
);
|
|
7817
|
+
let actualAmountOut = amountOut;
|
|
7818
|
+
if (outputTokenInfo) {
|
|
7819
|
+
actualAmountOut = calculateTransferFeeExcludedAmount(
|
|
7820
|
+
amountOut,
|
|
7821
|
+
outputTokenInfo.mint,
|
|
7822
|
+
outputTokenInfo.currentEpoch
|
|
7823
|
+
).amount;
|
|
7824
|
+
}
|
|
7825
|
+
const minSwapOutAmount = getMinAmountWithSlippage(
|
|
7826
|
+
actualAmountOut,
|
|
7827
|
+
slippage
|
|
7828
|
+
);
|
|
7829
|
+
return {
|
|
7830
|
+
swapInAmount: inAmount,
|
|
7831
|
+
consumedInAmount: actualAmountIn,
|
|
7832
|
+
swapOutAmount: actualAmountOut,
|
|
7833
|
+
minSwapOutAmount,
|
|
7834
|
+
totalFee,
|
|
7835
|
+
priceImpact: getPriceImpact(minSwapOutAmount, actualAmountOut)
|
|
7836
|
+
};
|
|
7790
7837
|
}
|
|
7791
7838
|
/**
|
|
7792
7839
|
* Calculates the deposit quote for liquidity pool.
|
|
@@ -7799,61 +7846,59 @@ var CpAmm = class {
|
|
|
7799
7846
|
* @returns {BN} returns.liquidityDelta - The amount of liquidity that will be added to the pool.
|
|
7800
7847
|
*/
|
|
7801
7848
|
getDepositQuote(params) {
|
|
7802
|
-
|
|
7803
|
-
|
|
7849
|
+
const {
|
|
7850
|
+
inAmount,
|
|
7851
|
+
isTokenA,
|
|
7852
|
+
inputTokenInfo,
|
|
7853
|
+
outputTokenInfo,
|
|
7854
|
+
minSqrtPrice,
|
|
7855
|
+
maxSqrtPrice,
|
|
7856
|
+
sqrtPrice
|
|
7857
|
+
} = params;
|
|
7858
|
+
const actualAmountIn = inputTokenInfo ? inAmount.sub(
|
|
7859
|
+
calculateTransferFeeIncludedAmount(
|
|
7804
7860
|
inAmount,
|
|
7805
|
-
|
|
7806
|
-
inputTokenInfo
|
|
7807
|
-
|
|
7861
|
+
inputTokenInfo.mint,
|
|
7862
|
+
inputTokenInfo.currentEpoch
|
|
7863
|
+
).transferFee
|
|
7864
|
+
) : inAmount;
|
|
7865
|
+
const { liquidityDelta, rawAmount } = isTokenA ? {
|
|
7866
|
+
liquidityDelta: getLiquidityDeltaFromAmountA(
|
|
7867
|
+
actualAmountIn,
|
|
7868
|
+
sqrtPrice,
|
|
7869
|
+
maxSqrtPrice
|
|
7870
|
+
),
|
|
7871
|
+
rawAmount: (delta) => getAmountBFromLiquidityDelta(
|
|
7872
|
+
delta,
|
|
7873
|
+
sqrtPrice,
|
|
7874
|
+
minSqrtPrice,
|
|
7875
|
+
0 /* Up */
|
|
7876
|
+
)
|
|
7877
|
+
} : {
|
|
7878
|
+
liquidityDelta: getLiquidityDeltaFromAmountB(
|
|
7879
|
+
actualAmountIn,
|
|
7808
7880
|
minSqrtPrice,
|
|
7809
|
-
maxSqrtPrice,
|
|
7810
7881
|
sqrtPrice
|
|
7811
|
-
|
|
7812
|
-
|
|
7813
|
-
|
|
7814
|
-
|
|
7815
|
-
|
|
7816
|
-
|
|
7817
|
-
|
|
7818
|
-
|
|
7819
|
-
|
|
7820
|
-
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
7824
|
-
|
|
7825
|
-
|
|
7826
|
-
|
|
7827
|
-
|
|
7828
|
-
|
|
7829
|
-
|
|
7830
|
-
|
|
7831
|
-
} : {
|
|
7832
|
-
liquidityDelta: getLiquidityDeltaFromAmountB(
|
|
7833
|
-
actualAmountIn,
|
|
7834
|
-
minSqrtPrice,
|
|
7835
|
-
sqrtPrice
|
|
7836
|
-
),
|
|
7837
|
-
rawAmount: (delta) => getAmountAFromLiquidityDelta(
|
|
7838
|
-
delta,
|
|
7839
|
-
sqrtPrice,
|
|
7840
|
-
maxSqrtPrice,
|
|
7841
|
-
0 /* Up */
|
|
7842
|
-
)
|
|
7843
|
-
};
|
|
7844
|
-
const rawOutputAmount = new BN10(rawAmount(liquidityDelta));
|
|
7845
|
-
const outputAmount = outputTokenInfo ? calculateTransferFeeIncludedAmount(
|
|
7846
|
-
rawOutputAmount,
|
|
7847
|
-
outputTokenInfo.mint,
|
|
7848
|
-
outputTokenInfo.currentEpoch
|
|
7849
|
-
).amount : rawOutputAmount;
|
|
7850
|
-
return {
|
|
7851
|
-
actualInputAmount: actualAmountIn,
|
|
7852
|
-
consumedInputAmount: inAmount,
|
|
7853
|
-
liquidityDelta,
|
|
7854
|
-
outputAmount
|
|
7855
|
-
};
|
|
7856
|
-
});
|
|
7882
|
+
),
|
|
7883
|
+
rawAmount: (delta) => getAmountAFromLiquidityDelta(
|
|
7884
|
+
delta,
|
|
7885
|
+
sqrtPrice,
|
|
7886
|
+
maxSqrtPrice,
|
|
7887
|
+
0 /* Up */
|
|
7888
|
+
)
|
|
7889
|
+
};
|
|
7890
|
+
const rawOutputAmount = new BN10(rawAmount(liquidityDelta));
|
|
7891
|
+
const outputAmount = outputTokenInfo ? calculateTransferFeeIncludedAmount(
|
|
7892
|
+
rawOutputAmount,
|
|
7893
|
+
outputTokenInfo.mint,
|
|
7894
|
+
outputTokenInfo.currentEpoch
|
|
7895
|
+
).amount : rawOutputAmount;
|
|
7896
|
+
return {
|
|
7897
|
+
actualInputAmount: actualAmountIn,
|
|
7898
|
+
consumedInputAmount: inAmount,
|
|
7899
|
+
liquidityDelta,
|
|
7900
|
+
outputAmount
|
|
7901
|
+
};
|
|
7857
7902
|
}
|
|
7858
7903
|
/**
|
|
7859
7904
|
* Calculates the withdrawal quote for removing liquidity from a concentrated liquidity pool.
|
|
@@ -7869,41 +7914,39 @@ var CpAmm = class {
|
|
|
7869
7914
|
* @returns {BN} returns.outAmountB - The calculated amount of token B to be received (after deducting transfer fees)
|
|
7870
7915
|
*/
|
|
7871
7916
|
getWithdrawQuote(params) {
|
|
7872
|
-
|
|
7873
|
-
|
|
7874
|
-
|
|
7875
|
-
|
|
7876
|
-
|
|
7877
|
-
|
|
7878
|
-
|
|
7879
|
-
|
|
7880
|
-
|
|
7881
|
-
|
|
7882
|
-
|
|
7883
|
-
|
|
7884
|
-
|
|
7885
|
-
|
|
7886
|
-
|
|
7887
|
-
|
|
7888
|
-
|
|
7889
|
-
|
|
7890
|
-
|
|
7891
|
-
|
|
7892
|
-
|
|
7893
|
-
|
|
7894
|
-
|
|
7895
|
-
|
|
7896
|
-
|
|
7897
|
-
|
|
7898
|
-
|
|
7899
|
-
|
|
7900
|
-
|
|
7901
|
-
|
|
7902
|
-
|
|
7903
|
-
|
|
7904
|
-
|
|
7905
|
-
};
|
|
7906
|
-
});
|
|
7917
|
+
const {
|
|
7918
|
+
liquidityDelta,
|
|
7919
|
+
sqrtPrice,
|
|
7920
|
+
maxSqrtPrice,
|
|
7921
|
+
minSqrtPrice,
|
|
7922
|
+
tokenATokenInfo,
|
|
7923
|
+
tokenBTokenInfo
|
|
7924
|
+
} = params;
|
|
7925
|
+
const amountA = getAmountAFromLiquidityDelta(
|
|
7926
|
+
liquidityDelta,
|
|
7927
|
+
sqrtPrice,
|
|
7928
|
+
maxSqrtPrice,
|
|
7929
|
+
1 /* Down */
|
|
7930
|
+
);
|
|
7931
|
+
const amountB = getAmountBFromLiquidityDelta(
|
|
7932
|
+
liquidityDelta,
|
|
7933
|
+
sqrtPrice,
|
|
7934
|
+
minSqrtPrice,
|
|
7935
|
+
1 /* Down */
|
|
7936
|
+
);
|
|
7937
|
+
return {
|
|
7938
|
+
liquidityDelta,
|
|
7939
|
+
outAmountA: tokenATokenInfo ? calculateTransferFeeExcludedAmount(
|
|
7940
|
+
amountA,
|
|
7941
|
+
tokenATokenInfo.mint,
|
|
7942
|
+
tokenATokenInfo.currentEpoch
|
|
7943
|
+
).amount : amountA,
|
|
7944
|
+
outAmountB: tokenBTokenInfo ? calculateTransferFeeExcludedAmount(
|
|
7945
|
+
amountB,
|
|
7946
|
+
tokenBTokenInfo.mint,
|
|
7947
|
+
tokenBTokenInfo.currentEpoch
|
|
7948
|
+
).amount : amountB
|
|
7949
|
+
};
|
|
7907
7950
|
}
|
|
7908
7951
|
/**
|
|
7909
7952
|
* Calculates liquidity and corresponding token amounts for token A single-sided pool creation
|
|
@@ -8181,20 +8224,8 @@ var CpAmm = class {
|
|
|
8181
8224
|
*/
|
|
8182
8225
|
createPosition(params) {
|
|
8183
8226
|
return __async(this, null, function* () {
|
|
8184
|
-
const {
|
|
8185
|
-
|
|
8186
|
-
const positionNftAccount = derivePositionNftAccount(positionNft);
|
|
8187
|
-
return yield this._program.methods.createPosition().accountsPartial({
|
|
8188
|
-
owner,
|
|
8189
|
-
positionNftMint: positionNft,
|
|
8190
|
-
poolAuthority: this.poolAuthority,
|
|
8191
|
-
positionNftAccount,
|
|
8192
|
-
payer,
|
|
8193
|
-
pool,
|
|
8194
|
-
position,
|
|
8195
|
-
tokenProgram: TOKEN_2022_PROGRAM_ID2,
|
|
8196
|
-
systemProgram: SystemProgram2.programId
|
|
8197
|
-
}).transaction();
|
|
8227
|
+
const { ix } = yield this.buildCreatePositionInstruction(params);
|
|
8228
|
+
return new Transaction().add(ix);
|
|
8198
8229
|
});
|
|
8199
8230
|
}
|
|
8200
8231
|
/**
|
|
@@ -8281,6 +8312,104 @@ var CpAmm = class {
|
|
|
8281
8312
|
return transaction;
|
|
8282
8313
|
});
|
|
8283
8314
|
}
|
|
8315
|
+
/**
|
|
8316
|
+
* Creates a new position and add liquidity to position it in a single transaction.
|
|
8317
|
+
* Handles both native SOL and other tokens, automatically wrapping/unwrapping SOL as needed.
|
|
8318
|
+
*
|
|
8319
|
+
* @param {CreatePositionAndAddLiquidity} params - Parameters for creating position and adding liquidity
|
|
8320
|
+
*
|
|
8321
|
+
* @returns {Transaction} A transaction that creates a position and adds liquidity
|
|
8322
|
+
*
|
|
8323
|
+
**/
|
|
8324
|
+
createPositionAndAddLiquidity(params) {
|
|
8325
|
+
return __async(this, null, function* () {
|
|
8326
|
+
const {
|
|
8327
|
+
owner,
|
|
8328
|
+
pool,
|
|
8329
|
+
positionNft,
|
|
8330
|
+
liquidityDelta,
|
|
8331
|
+
maxAmountTokenA,
|
|
8332
|
+
maxAmountTokenB,
|
|
8333
|
+
tokenAAmountThreshold,
|
|
8334
|
+
tokenBAmountThreshold,
|
|
8335
|
+
tokenAMint,
|
|
8336
|
+
tokenBMint,
|
|
8337
|
+
tokenAVault,
|
|
8338
|
+
tokenBVault,
|
|
8339
|
+
tokenAProgram,
|
|
8340
|
+
tokenBProgram
|
|
8341
|
+
} = params;
|
|
8342
|
+
const {
|
|
8343
|
+
tokenAAta: tokenAAccount,
|
|
8344
|
+
tokenBAta: tokenBAccount,
|
|
8345
|
+
instructions: preInstructions
|
|
8346
|
+
} = yield this.prepareTokenAccounts(
|
|
8347
|
+
owner,
|
|
8348
|
+
tokenAMint,
|
|
8349
|
+
tokenBMint,
|
|
8350
|
+
tokenAProgram,
|
|
8351
|
+
tokenBProgram
|
|
8352
|
+
);
|
|
8353
|
+
if (tokenAMint.equals(NATIVE_MINT2)) {
|
|
8354
|
+
const wrapSOLIx = wrapSOLInstruction(
|
|
8355
|
+
owner,
|
|
8356
|
+
tokenAAccount,
|
|
8357
|
+
BigInt(maxAmountTokenA.toString())
|
|
8358
|
+
);
|
|
8359
|
+
preInstructions.push(...wrapSOLIx);
|
|
8360
|
+
}
|
|
8361
|
+
if (tokenBMint.equals(NATIVE_MINT2)) {
|
|
8362
|
+
const wrapSOLIx = wrapSOLInstruction(
|
|
8363
|
+
owner,
|
|
8364
|
+
tokenBAccount,
|
|
8365
|
+
BigInt(maxAmountTokenB.toString())
|
|
8366
|
+
);
|
|
8367
|
+
preInstructions.push(...wrapSOLIx);
|
|
8368
|
+
}
|
|
8369
|
+
const postInstructions = [];
|
|
8370
|
+
if ([tokenAMint.toBase58(), tokenBMint.toBase58()].includes(
|
|
8371
|
+
NATIVE_MINT2.toBase58()
|
|
8372
|
+
)) {
|
|
8373
|
+
const closeWrappedSOLIx = yield unwrapSOLInstruction(owner);
|
|
8374
|
+
closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);
|
|
8375
|
+
}
|
|
8376
|
+
const {
|
|
8377
|
+
ix: createPositionIx,
|
|
8378
|
+
position,
|
|
8379
|
+
positionNftAccount
|
|
8380
|
+
} = yield this.buildCreatePositionInstruction({
|
|
8381
|
+
owner,
|
|
8382
|
+
payer: owner,
|
|
8383
|
+
pool,
|
|
8384
|
+
positionNft
|
|
8385
|
+
});
|
|
8386
|
+
const addLiquidityInstruction = yield this.buildAddLiquidityInstruction({
|
|
8387
|
+
pool,
|
|
8388
|
+
position,
|
|
8389
|
+
positionNftAccount,
|
|
8390
|
+
owner,
|
|
8391
|
+
tokenAAccount,
|
|
8392
|
+
tokenBAccount,
|
|
8393
|
+
tokenAMint,
|
|
8394
|
+
tokenBMint,
|
|
8395
|
+
tokenAVault,
|
|
8396
|
+
tokenBVault,
|
|
8397
|
+
tokenAProgram,
|
|
8398
|
+
tokenBProgram,
|
|
8399
|
+
liquidityDelta,
|
|
8400
|
+
tokenAAmountThreshold,
|
|
8401
|
+
tokenBAmountThreshold
|
|
8402
|
+
});
|
|
8403
|
+
const transaction = new Transaction();
|
|
8404
|
+
transaction.add(createPositionIx);
|
|
8405
|
+
transaction.add(
|
|
8406
|
+
...preInstructions.length > 0 ? preInstructions : [],
|
|
8407
|
+
addLiquidityInstruction,
|
|
8408
|
+
...postInstructions.length > 0 ? postInstructions : []
|
|
8409
|
+
);
|
|
8410
|
+
return transaction;
|
|
8411
|
+
});
|
|
8412
|
+
}
|
|
8284
8413
|
/**
|
|
8285
8414
|
* Builds a transaction to remove liquidity from a position.
|
|
8286
8415
|
* @param {RemoveLiquidityParams} params - Parameters for removing liquidity.
|
|
@@ -9072,7 +9201,6 @@ export {
|
|
|
9072
9201
|
MIN_CU_BUFFER,
|
|
9073
9202
|
MIN_SQRT_PRICE,
|
|
9074
9203
|
ONE,
|
|
9075
|
-
PRECISION,
|
|
9076
9204
|
Rounding,
|
|
9077
9205
|
SCALE_OFFSET,
|
|
9078
9206
|
TradeDirection,
|
|
@@ -9089,10 +9217,9 @@ export {
|
|
|
9089
9217
|
derivePositionAddress,
|
|
9090
9218
|
derivePositionNftAccount,
|
|
9091
9219
|
deriveRewardVaultAddress,
|
|
9092
|
-
deriveTokenBadge,
|
|
9093
9220
|
deriveTokenBadgeAddress,
|
|
9094
9221
|
deriveTokenVaultAddress,
|
|
9095
|
-
|
|
9222
|
+
getAllPositionNftAccountByOwner,
|
|
9096
9223
|
getAllUserPositionNftAccount,
|
|
9097
9224
|
getAmountAFromLiquidityDelta,
|
|
9098
9225
|
getAmountBFromLiquidityDelta,
|
|
@@ -9108,7 +9235,6 @@ export {
|
|
|
9108
9235
|
getMaxAmountWithSlippage,
|
|
9109
9236
|
getMinAmountWithSlippage,
|
|
9110
9237
|
getNextSqrtPrice,
|
|
9111
|
-
getNftOwner,
|
|
9112
9238
|
getOrCreateATAInstruction,
|
|
9113
9239
|
getPriceFromSqrtPrice,
|
|
9114
9240
|
getPriceImpact,
|