From 94e8345eec4e415157208797f5da2785341e0dc0 Mon Sep 17 00:00:00 2001 From: codewithgun Date: Fri, 3 Jan 2025 15:40:06 +0800 Subject: [PATCH] wip --- artifacts/lb_clmm.so | Bin 1654448 -> 1654288 bytes ts-client/src/dlmm/helpers/derive.ts | 11 + ts-client/src/dlmm/helpers/index.ts | 19 +- ts-client/src/dlmm/index.ts | 266 ++-- ts-client/src/dlmm/types/index.ts | 1 + ts-client/src/test/sdk.test.ts | 10 +- ts-client/src/test/sdk_token2022.test.ts | 1469 ++++++++++++++++++++++ 7 files changed, 1675 insertions(+), 101 deletions(-) diff --git a/artifacts/lb_clmm.so b/artifacts/lb_clmm.so index f32b1705ab7c4443f0b9e441c671ea4be2be37d1..56fa24392cf3e38f0a702ea724039d308828eb8e 100644 GIT binary patch delta 173694 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 Kxnp-5nfU)#xlHK* delta 174371 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%0A{B!l#a#53d~LGhf$SlN#y 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 diff --git a/ts-client/src/dlmm/helpers/derive.ts b/ts-client/src/dlmm/helpers/derive.ts index 1ae39262..4668401f 100644 --- a/ts-client/src/dlmm/helpers/derive.ts +++ b/ts-client/src/dlmm/helpers/derive.ts @@ -217,3 +217,14 @@ export function deriveEventAuthority(programId: PublicKey) { programId ); } + +export function deriveRewardVault( + lbPair: PublicKey, + rewardIndex: BN, + programId: PublicKey +) { + return PublicKey.findProgramAddressSync( + [lbPair.toBuffer(), rewardIndex.toArrayLike(Buffer, "le", 8)], + programId + ); +} diff --git a/ts-client/src/dlmm/helpers/index.ts b/ts-client/src/dlmm/helpers/index.ts index 542a6bab..87406441 100644 --- a/ts-client/src/dlmm/helpers/index.ts +++ b/ts-client/src/dlmm/helpers/index.ts @@ -1,5 +1,6 @@ import { BN, EventParser } from "@coral-xyz/anchor"; import { + ASSOCIATED_TOKEN_PROGRAM_ID, NATIVE_MINT, TOKEN_PROGRAM_ID, TokenAccountNotFoundError, @@ -37,11 +38,7 @@ export function chunks(array: T[], size: number): T[][] { ); } -export function range( - min: number, - max: number, - mapfn: (i: number) => T -) { +export function range(min: number, max: number, mapfn: (i: number) => T) { const length = max - min + 1; return Array.from({ length }, (_, i) => mapfn(min + i)); } @@ -93,17 +90,21 @@ export const getOrCreateATAInstruction = async ( connection: Connection, tokenMint: PublicKey, owner: PublicKey, + programId?: PublicKey, payer: PublicKey = owner, allowOwnerOffCurve = true ): Promise => { + programId = programId ?? TOKEN_PROGRAM_ID; const toAccount = getAssociatedTokenAddressSync( tokenMint, owner, - allowOwnerOffCurve + allowOwnerOffCurve, + programId, + ASSOCIATED_TOKEN_PROGRAM_ID ); try { - await getAccount(connection, toAccount); + await getAccount(connection, toAccount, connection.commitment, programId); return { ataPubKey: toAccount, ix: undefined }; } catch (e) { @@ -115,7 +116,9 @@ export const getOrCreateATAInstruction = async ( payer, toAccount, owner, - tokenMint + tokenMint, + programId, + ASSOCIATED_TOKEN_PROGRAM_ID ); return { ataPubKey: toAccount, ix }; diff --git a/ts-client/src/dlmm/index.ts b/ts-client/src/dlmm/index.ts index 01af9d75..f11d688d 100644 --- a/ts-client/src/dlmm/index.ts +++ b/ts-client/src/dlmm/index.ts @@ -152,6 +152,11 @@ type Opt = { programId?: PublicKey; }; +interface MintKeyWithOwner { + mint: PublicKey; + owner: PublicKey; +} + export class DLMM { constructor( public pubkey: PublicKey, @@ -240,24 +245,35 @@ export class DLMM { return lbPairKey; } - const presetParametersWthIndex = + const presetParametersWithIndex = await program.account.presetParameter2.all([ presetParameter2BinStepFilter(binStep), presetParameter2BaseFactorFilter(baseFactor), presetParameter2BaseFeePowerFactor(baseFeePowerFactor), ]); - if (presetParametersWthIndex.length > 0) { - const [lbPairKey] = deriveLbPairWithPresetParamWithIndexKey( - presetParametersWthIndex[0].publicKey, - tokenX, - tokenY, - program.programId + if (presetParametersWithIndex.length > 0) { + const possibleLbPairKeys = presetParametersWithIndex.map((account) => { + return deriveLbPairWithPresetParamWithIndexKey( + account.publicKey, + tokenX, + tokenY, + program.programId + )[0]; + }); + + const accounts = await chunkedGetMultipleAccountInfos( + program.provider.connection, + possibleLbPairKeys ); - const account = await program.account.lbPair.fetchNullable(lbPairKey); - if (account) { - return lbPairKey; + for (let i = 0; i < possibleLbPairKeys.length; i++) { + const pairKey = possibleLbPairKeys[i]; + const account = accounts[i]; + + if (account) { + return pairKey; + } } } @@ -1258,7 +1274,12 @@ export class DLMM { padding: Array(64).fill(0), }; - const userTokenX = getAssociatedTokenAddressSync(tokenX, creatorKey); + const userTokenX = getAssociatedTokenAddressSync( + tokenX, + creatorKey, + true, + tokenXAccount.owner + ); return program.methods .initializeCustomizablePermissionlessLbPair2(ixData) @@ -2358,12 +2379,14 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, this.tokenX.publicKey, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, - user + user, + this.tokenY.owner ), ]); createPayerTokenXIx && preInstructions.push(createPayerTokenXIx); @@ -2435,8 +2458,8 @@ export class DLMM { tokenYMint: this.lbPair.tokenYMint, binArrayBitmapExtension, sender: user, - tokenXProgram: TOKEN_PROGRAM_ID, - tokenYProgram: TOKEN_PROGRAM_ID, + tokenXProgram: this.tokenX.owner, + tokenYProgram: this.tokenY.owner, memoProgram: MEMO_PROGRAM_ID, }; @@ -2557,12 +2580,14 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, this.tokenX.publicKey, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, - user + user, + this.tokenY.owner ), ]); createPayerTokenXIx && preInstructions.push(createPayerTokenXIx); @@ -2800,15 +2825,6 @@ export class DLMM { const strategyParameters: LiquidityParameterByStrategy["strategyParameters"] = toStrategyParameters(strategy) as ProgramStrategyParameter; - const positionAccount = - await this.program.provider.connection.getAccountInfo(positionPubKey); - - const position = wrapPosition( - this.program, - positionPubKey, - positionAccount - ); - const binArrayIndexes = getBinArrayIndexesCoverage( new BN(minBinId), new BN(maxBinId) @@ -2834,14 +2850,17 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, this.tokenX.publicKey, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, - user + user, + this.tokenY.owner ), ]); + createPayerTokenXIx && preInstructions.push(createPayerTokenXIx); createPayerTokenYIx && preInstructions.push(createPayerTokenYIx); @@ -3046,12 +3065,14 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, this.tokenX.publicKey, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, - user + user, + this.tokenY.owner ), ]); createPayerTokenXIx && preInstructions.push(createPayerTokenXIx); @@ -3282,25 +3303,29 @@ export class DLMM { this.program.provider.connection, this.tokenX.publicKey, owner, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, owner, - user + user, + this.tokenY.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenX.publicKey, walletToReceiveFee, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, walletToReceiveFee, - user + user, + this.tokenY.owner ), ]); @@ -3346,7 +3371,8 @@ export class DLMM { const { ataPubKey, ix: rewardAtaIx } = await getOrCreateATAInstruction( this.program.provider.connection, rewardInfo.mint, - user + user, + this.rewards[i].owner ); rewardAtaIx && preInstructions.push(rewardAtaIx); @@ -3494,12 +3520,12 @@ export class DLMM { */ public async decreasePositionLength({ - lengthToAdd: lengthToReduce, + lengthToReduce, position, side, feePayer, }: { - lengthToAdd: BN; + lengthToReduce: BN; position: PublicKey; side: ResizeSide; feePayer: PublicKey; @@ -3997,10 +4023,6 @@ export class DLMM { .div(new Decimal(outAmountWithoutSlippage.toString())) .mul(new Decimal(100)); - const minOutAmount = totalOutAmount - .mul(new BN(BASIS_POINT_MAX).sub(allowedSlippage)) - .div(new BN(BASIS_POINT_MAX)); - const endPrice = getPriceOfBinByBinId( lastFilledActiveBinId.toNumber(), this.lbPair.binStep @@ -4012,6 +4034,10 @@ export class DLMM { this.clock.epoch.toNumber() ).amount; + const minOutAmount = transferFeeExcludedAmountOut + .mul(new BN(BASIS_POINT_MAX).sub(allowedSlippage)) + .div(new BN(BASIS_POINT_MAX)); + return { consumedInAmount: transferFeeIncludedInAmount, outAmount: transferFeeExcludedAmountOut, @@ -4046,12 +4072,14 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, inToken, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, outToken, - user + user, + this.tokenY.owner ), ]); createInTokenAccountIx && preInstructions.push(createInTokenAccountIx); @@ -4157,12 +4185,14 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, inToken, - user + user, + this.tokenX.owner ), getOrCreateATAInstruction( this.program.provider.connection, outToken, - user + user, + this.tokenY.owner ), ]); createInTokenAccountIx && preInstructions.push(createInTokenAccountIx); @@ -4269,6 +4299,12 @@ export class DLMM { const preInstructions: TransactionInstruction[] = []; const postInstructions: Array = []; + const [inTokenProgram, outTokenProgram] = inToken.equals( + this.lbPair.tokenXMint + ) + ? [this.tokenX.owner, this.tokenY.owner] + : [this.tokenY.owner, this.tokenX.owner]; + const [ { ataPubKey: userTokenIn, ix: createInTokenAccountIx }, { ataPubKey: userTokenOut, ix: createOutTokenAccountIx }, @@ -4276,12 +4312,14 @@ export class DLMM { getOrCreateATAInstruction( this.program.provider.connection, inToken, - user + user, + inTokenProgram ), getOrCreateATAInstruction( this.program.provider.connection, outToken, - user + user, + outTokenProgram ), ]); createInTokenAccountIx && preInstructions.push(createInTokenAccountIx); @@ -4482,19 +4520,39 @@ export class DLMM { public async claimSwapFee({ owner, position, + binRange, }: { owner: PublicKey; position: LbPosition; + binRange?: { + minBinId: BN; + maxBinId: BN; + }; }): Promise { - const claimFeeTx = await this.createClaimSwapFeeMethod({ owner, position }); + const claimFeeTx = await this.createClaimSwapFeeMethod({ + owner, + position, + shouldIncludePretIx: true, + shouldIncludePostIx: true, + binRange, + }); + + const setCUIx = await getEstimatedComputeUnitIxWithBuffer( + this.program.provider.connection, + claimFeeTx.instructions, + owner + ); + + const instructions = [setCUIx, ...claimFeeTx.instructions]; const { blockhash, lastValidBlockHeight } = await this.program.provider.connection.getLatestBlockhash("confirmed"); + return new Transaction({ blockhash, lastValidBlockHeight, feePayer: owner, - }).add(claimFeeTx); + }).add(...instructions); } /** @@ -4507,7 +4565,8 @@ export class DLMM { public async claimAllSwapFee({ owner, positions, - }: { + }: // todo: range + { owner: PublicKey; positions: LbPosition[]; }): Promise { @@ -4573,16 +4632,28 @@ export class DLMM { }): Promise { const preInstructions: TransactionInstruction[] = []; - const pairTokens = [this.tokenX.publicKey, this.tokenY.publicKey]; - const tokensInvolved = [...pairTokens]; + const pairTokens: MintKeyWithOwner[] = [ + { + mint: this.tokenX.publicKey, + owner: this.tokenX.owner, + }, + { + mint: this.tokenY.publicKey, + owner: this.tokenY.owner, + }, + ]; + const tokensInvolved: MintKeyWithOwner[] = [...pairTokens]; for (let i = 0; i < 2; i++) { const rewardMint = this.lbPair.rewardInfos[i].mint; if ( - !tokensInvolved.some((pubkey) => rewardMint.equals(pubkey)) && + !tokensInvolved.some(({ mint }) => rewardMint.equals(mint)) && !rewardMint.equals(PublicKey.default) ) { - tokensInvolved.push(this.lbPair.rewardInfos[i].mint); + tokensInvolved.push({ + mint: this.rewards[i].publicKey, + owner: this.rewards[i].owner, + }); } } @@ -4594,11 +4665,12 @@ export class DLMM { tokensInvolved.map((token) => { // Single position. Swap fee only belongs to owner, or the customized fee owner. - if (pairTokens.some((t) => t.equals(token))) { + if (pairTokens.some((t) => t.mint.equals(token.mint))) { return getOrCreateATAInstruction( this.program.provider.connection, - token, + token.mint, feeOwner, + token.owner, owner ); } @@ -4606,8 +4678,9 @@ export class DLMM { // Reward return getOrCreateATAInstruction( this.program.provider.connection, - token, - owner + token.mint, + owner, + token.owner ); }) ); @@ -4631,7 +4704,7 @@ export class DLMM { ); const postInstructions: TransactionInstruction[] = []; - if (tokensInvolved.some((pubkey) => pubkey.equals(NATIVE_MINT))) { + if (tokensInvolved.some(({ mint }) => mint.equals(NATIVE_MINT))) { const closeWrappedSOLIx = await unwrapSOLInstruction(owner); closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } @@ -4748,13 +4821,15 @@ export class DLMM { const operatorTokenX = getAssociatedTokenAddressSync( this.lbPair.tokenXMint, operator, - true + true, + this.tokenX.owner ); const ownerTokenX = getAssociatedTokenAddressSync( this.lbPair.tokenXMint, owner, - true + true, + this.tokenY.owner ); const initializePositionByOperatorTx = await this.program.methods @@ -4800,15 +4875,28 @@ export class DLMM { positions: LbPosition[]; }): Promise { const preInstructions: TransactionInstruction[] = []; - const pairsToken = [this.tokenX.publicKey, this.tokenY.publicKey]; + const pairsToken: MintKeyWithOwner[] = [ + { + mint: this.tokenX.publicKey, + owner: this.tokenX.owner, + }, + { + mint: this.tokenY.publicKey, + owner: this.tokenY.owner, + }, + ]; + const tokensInvolved = [...pairsToken]; for (let i = 0; i < 2; i++) { const rewardMint = this.lbPair.rewardInfos[i].mint; if ( - !tokensInvolved.some((pubkey) => rewardMint.equals(pubkey)) && + !tokensInvolved.some(({ mint }) => rewardMint.equals(mint)) && !rewardMint.equals(PublicKey.default) ) { - tokensInvolved.push(this.lbPair.rewardInfos[i].mint); + tokensInvolved.push({ + mint: this.rewards[i].publicKey, + owner: this.rewards[i].owner, + }); } } @@ -4834,12 +4922,13 @@ export class DLMM { tokensInvolved .map((token) => { // There's multiple positions, therefore swap fee ATA might includes account from owner, and customized fee owners - if (pairsToken.some((p) => p.equals(token))) { + if (pairsToken.some((p) => p.mint.equals(token.mint))) { return feeOwners.map((customOwner) => getOrCreateATAInstruction( this.program.provider.connection, - token, + token.mint, customOwner, + token.owner, owner ) ); @@ -4848,8 +4937,9 @@ export class DLMM { return [ getOrCreateATAInstruction( this.program.provider.connection, - token, - owner + token.mint, + owner, + token.owner ), ]; }) @@ -4899,7 +4989,7 @@ export class DLMM { ); const postInstructions: TransactionInstruction[] = []; - if (tokensInvolved.some((pubkey) => pubkey.equals(NATIVE_MINT))) { + if (tokensInvolved.some(({ mint }) => mint.equals(NATIVE_MINT))) { const closeWrappedSOLIx = await unwrapSOLInstruction(owner); closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx); } @@ -5447,6 +5537,7 @@ export class DLMM { }); }); + // TODO: Merge it into above iteration and allow quote chunk swap fee const { feeX, feeY } = await this.getClaimableSwapFee( program, position, @@ -5528,6 +5619,7 @@ export class DLMM { rewardTwoExcludeTransferFee, feeXExcludeTransferFee, feeYExcludeTransferFee, + owner: position.owner(), }; } @@ -5569,23 +5661,21 @@ export class DLMM { binArray.bins.forEach((bin, idx) => { const binId = lowerBinIdForBinArray.toNumber() + idx; if (binId >= lowerBinId && binId <= upperBinId) { - if (binId >= lowerBinId && binId <= upperBinId) { - const pricePerLamport = getPriceOfBinByBinId( - binId, - lbPair.binStep - ).toString(); - bins.push({ - binId, - xAmount: bin.amountX, - yAmount: bin.amountY, - supply: bin.liquiditySupply, - price: pricePerLamport, - version: binArray.version, - pricePerToken: new Decimal(pricePerLamport) - .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal))) - .toString(), - }); - } + const pricePerLamport = getPriceOfBinByBinId( + binId, + lbPair.binStep + ).toString(); + bins.push({ + binId, + xAmount: bin.amountX, + yAmount: bin.amountY, + supply: bin.liquiditySupply, + price: pricePerLamport, + version: binArray.version, + pricePerToken: new Decimal(pricePerLamport) + .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal))) + .toString(), + }); } }); } @@ -5829,7 +5919,7 @@ export class DLMM { position: position.publicKey, rewardVault: rewardInfo.vault, rewardMint: rewardInfo.mint, - tokenProgram: TOKEN_PROGRAM_ID, + tokenProgram: this.rewards[i].owner, userTokenAccount: ataPubKey, memoProgram: MEMO_PROGRAM_ID, }) @@ -5885,12 +5975,14 @@ export class DLMM { this.program.provider.connection, this.tokenX.publicKey, walletToReceiveFee, + this.tokenX.owner, owner ), getOrCreateATAInstruction( this.program.provider.connection, this.tokenY.publicKey, walletToReceiveFee, + this.tokenY.owner, owner ), ]); diff --git a/ts-client/src/dlmm/types/index.ts b/ts-client/src/dlmm/types/index.ts index 0dae11f5..c9d22ac6 100644 --- a/ts-client/src/dlmm/types/index.ts +++ b/ts-client/src/dlmm/types/index.ts @@ -320,6 +320,7 @@ export interface PositionData { rewardTwoExcludeTransferFee: BN; totalXAmountExcludeTransferFee: BN; totalYAmountExcludeTransferFee: BN; + owner: PublicKey; } export interface SwapWithPriceImpactParams { diff --git a/ts-client/src/test/sdk.test.ts b/ts-client/src/test/sdk.test.ts index e61f598a..4ecd1450 100644 --- a/ts-client/src/test/sdk.test.ts +++ b/ts-client/src/test/sdk.test.ts @@ -890,13 +890,11 @@ describe("SDK test", () => { }); it("fetch all preset parameter", async () => { - const { presetParameter, presetParameter2 } = - await DLMM.getAllPresetParameters(connection, { - cluster: "localhost", - }); + const { presetParameter } = await DLMM.getAllPresetParameters(connection, { + cluster: "localhost", + }); - const length = presetParameter.length + presetParameter2.length; - expect(length).toBeGreaterThan(0); + expect(presetParameter.length).toBeGreaterThan(0); }); it("create LB pair with bitmap extension", async () => { diff --git a/ts-client/src/test/sdk_token2022.test.ts b/ts-client/src/test/sdk_token2022.test.ts index e69de29b..10b3e7e6 100644 --- a/ts-client/src/test/sdk_token2022.test.ts +++ b/ts-client/src/test/sdk_token2022.test.ts @@ -0,0 +1,1469 @@ +import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + createInitializeMintInstruction, + createInitializeTransferFeeConfigInstruction, + createInitializeTransferHookInstruction, + createMint, + ExtensionType, + getAssociatedTokenAddressSync, + getMintLen, + getOrCreateAssociatedTokenAccount, + mintTo, + TOKEN_2022_PROGRAM_ID, + TOKEN_PROGRAM_ID, + unpackAccount, +} from "@solana/spl-token"; +import { + AccountInfo, + Cluster, + Connection, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + sendAndConfirmTransaction, + SystemProgram, + Transaction, +} from "@solana/web3.js"; +import BN from "bn.js"; +import fs from "fs"; +import { DLMM } from "../dlmm"; +import { LBCLMM_PROGRAM_IDS } from "../dlmm/constants"; +import { + deriveCustomizablePermissionlessLbPair, + deriveLbPairWithPresetParamWithIndexKey, + derivePermissionLbPair, + derivePresetParameterWithIndex, + deriveRewardVault, + deriveTokenBadge, + toAmountsBothSideByStrategy, +} from "../dlmm/helpers"; +import { IDL } from "../dlmm/idl"; +import { ActivationType, ResizeSide, StrategyType } from "../dlmm/types"; +import { createExtraAccountMetaListAndCounter } from "./external/helper"; +import { + createTransferHookCounterProgram, + TRANSFER_HOOK_COUNTER_PROGRAM_ID, +} from "./external/program"; +import Decimal from "decimal.js"; + +const keypairBuffer = fs.readFileSync( + "../keys/localnet/admin-bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1.json", + "utf-8" +); +const connection = new Connection("http://127.0.0.1:8899", "confirmed"); +const keypair = Keypair.fromSecretKey( + new Uint8Array(JSON.parse(keypairBuffer)) +); + +const btcDecimal = 6; +const usdcDecimal = 6; +const metDecimal = 6; + +const BTCKeypair = Keypair.generate(); +const USDCKeypair = Keypair.generate(); +const METKeypair = Keypair.generate(); + +const BTC2022 = BTCKeypair.publicKey; +const USDC = USDCKeypair.publicKey; +const MET2022 = METKeypair.publicKey; + +const transferFeeBps = 500; // 5% +const maxFee = BigInt(100_000) * BigInt(10 ** btcDecimal); + +let presetParameter2Key: PublicKey; +let pairKey: PublicKey; + +const provider = new AnchorProvider( + connection, + new Wallet(keypair), + AnchorProvider.defaultOptions() +); +const program = new Program(IDL, LBCLMM_PROGRAM_IDS["localhost"], provider); + +const widePositionKeypair = Keypair.generate(); +const tightPositionKeypair = Keypair.generate(); + +type Opt = { + cluster?: Cluster | "localhost"; + programId?: PublicKey; +}; + +const opt: Opt = { + cluster: "localhost", +}; + +describe("SDK token2022 test", () => { + // Token setup + beforeAll(async () => { + const airdropSig = await connection.requestAirdrop( + keypair.publicKey, + 10 * LAMPORTS_PER_SOL + ); + await connection.confirmTransaction(airdropSig, "confirmed"); + + await createMint( + connection, + keypair, + keypair.publicKey, + null, + usdcDecimal, + USDCKeypair, + { + commitment: "confirmed", + } + ); + + const userUsdcAccount = await getOrCreateAssociatedTokenAccount( + connection, + keypair, + USDC, + keypair.publicKey, + true, + "confirmed", + { + commitment: "confirmed", + }, + TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + + const userUsdcAta = userUsdcAccount.address; + + await mintTo( + connection, + keypair, + USDC, + userUsdcAta, + keypair, + BigInt(1_000_000_000) * BigInt(10 ** usdcDecimal), + [], + { + commitment: "confirmed", + }, + TOKEN_PROGRAM_ID + ); + + const extensions = [ + ExtensionType.TransferFeeConfig, + ExtensionType.TransferHook, + ]; + + const mintLen = getMintLen(extensions); + const minLamports = await connection.getMinimumBalanceForRentExemption( + mintLen + ); + + const createBtcTx = new Transaction() + .add( + SystemProgram.createAccount({ + fromPubkey: keypair.publicKey, + newAccountPubkey: BTCKeypair.publicKey, + space: mintLen, + lamports: minLamports, + programId: TOKEN_2022_PROGRAM_ID, + }) + ) + .add( + createInitializeTransferFeeConfigInstruction( + BTC2022, + keypair.publicKey, + keypair.publicKey, + transferFeeBps, + maxFee, + TOKEN_2022_PROGRAM_ID + ) + ) + .add( + createInitializeTransferHookInstruction( + BTC2022, + keypair.publicKey, + TRANSFER_HOOK_COUNTER_PROGRAM_ID, + TOKEN_2022_PROGRAM_ID + ) + ) + .add( + createInitializeMintInstruction( + BTC2022, + btcDecimal, + keypair.publicKey, + null, + TOKEN_2022_PROGRAM_ID + ) + ); + + await sendAndConfirmTransaction( + connection, + createBtcTx, + [keypair, BTCKeypair], + { commitment: "confirmed" } + ); + + const transferHookCounterProgram = createTransferHookCounterProgram( + new Wallet(keypair), + TRANSFER_HOOK_COUNTER_PROGRAM_ID, + connection + ); + + await createExtraAccountMetaListAndCounter( + transferHookCounterProgram, + BTC2022 + ); + + const userBtcAccount = await getOrCreateAssociatedTokenAccount( + connection, + keypair, + BTC2022, + keypair.publicKey, + true, + "confirmed", + { + commitment: "confirmed", + }, + TOKEN_2022_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + + const userBtcAta = userBtcAccount.address; + + await mintTo( + connection, + keypair, + BTC2022, + userBtcAta, + keypair, + BigInt(1_000_000_000) * BigInt(10 ** btcDecimal), + [], + { + commitment: "confirmed", + }, + TOKEN_2022_PROGRAM_ID + ); + + const createMetTx = new Transaction() + .add( + SystemProgram.createAccount({ + fromPubkey: keypair.publicKey, + newAccountPubkey: METKeypair.publicKey, + space: mintLen, + lamports: minLamports, + programId: TOKEN_2022_PROGRAM_ID, + }) + ) + .add( + createInitializeTransferFeeConfigInstruction( + MET2022, + keypair.publicKey, + keypair.publicKey, + transferFeeBps, + maxFee, + TOKEN_2022_PROGRAM_ID + ) + ) + .add( + createInitializeTransferHookInstruction( + MET2022, + keypair.publicKey, + TRANSFER_HOOK_COUNTER_PROGRAM_ID, + TOKEN_2022_PROGRAM_ID + ) + ) + .add( + createInitializeMintInstruction( + MET2022, + metDecimal, + keypair.publicKey, + null, + TOKEN_2022_PROGRAM_ID + ) + ); + + await sendAndConfirmTransaction( + connection, + createMetTx, + [keypair, METKeypair], + { commitment: "confirmed" } + ); + + const userMetAccount = await getOrCreateAssociatedTokenAccount( + connection, + keypair, + MET2022, + keypair.publicKey, + true, + "confirmed", + { + commitment: "confirmed", + }, + TOKEN_2022_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + + const userMetAta = userMetAccount.address; + + await mintTo( + connection, + keypair, + MET2022, + userMetAta, + keypair, + BigInt(1_000_000_000) * BigInt(10 ** metDecimal), + [], + { + commitment: "confirmed", + }, + TOKEN_2022_PROGRAM_ID + ); + }); + + // DLMM related setup + beforeAll(async () => { + const presetParameter2 = await program.account.presetParameter2.all(); + const idx = presetParameter2.length; + + [presetParameter2Key] = derivePresetParameterWithIndex( + new BN(idx), + program.programId + ); + + await program.methods + .initializePresetParameter2({ + index: idx, + binStep: 10, + baseFactor: 10_000, + filterPeriod: 30, + decayPeriod: 600, + reductionFactor: 5000, + variableFeeControl: 40000, + protocolShare: 0, + maxVolatilityAccumulator: 350000, + baseFeePowerFactor: 1, + }) + .accounts({ + presetParameter: presetParameter2Key, + admin: keypair.publicKey, + systemProgram: SystemProgram.programId, + }) + .rpc(); + + const [btcTokenBadge] = deriveTokenBadge(BTC2022, program.programId); + + await program.methods + .initializeTokenBadge() + .accounts({ + tokenBadge: btcTokenBadge, + admin: keypair.publicKey, + systemProgram: SystemProgram.programId, + tokenMint: BTC2022, + }) + .rpc(); + + const [metTokenBadge] = deriveTokenBadge(MET2022, program.programId); + + await program.methods + .initializeTokenBadge() + .accounts({ + tokenBadge: metTokenBadge, + admin: keypair.publicKey, + systemProgram: SystemProgram.programId, + tokenMint: MET2022, + }) + .rpc(); + }); + + it("getAllPresetParameters return created preset parameter 2", async () => { + const { presetParameter2 } = await DLMM.getAllPresetParameters( + connection, + opt + ); + + expect(presetParameter2.length).toBeGreaterThan(0); + }); + + describe("Pair", () => { + it("createPermissionPair with token 2022", async () => { + const binStep = new BN(1); + const feeBps = new BN(100); + const protocolFeeBps = new BN(500); + const activeId = new BN(0); + + const createPermissionPairTx = await DLMM.createPermissionLbPair( + connection, + binStep, + BTC2022, + USDC, + activeId, + keypair.publicKey, + keypair.publicKey, + feeBps, + ActivationType.Timestamp, + protocolFeeBps, + opt + ); + + await sendAndConfirmTransaction(connection, createPermissionPairTx, [ + keypair, + ]); + + const [pairKey] = derivePermissionLbPair( + keypair.publicKey, + BTC2022, + USDC, + binStep, + program.programId + ); + + const dlmm = await DLMM.create(connection, pairKey, opt); + + const feeInfo = dlmm.getFeeInfo(); + expect(feeInfo.baseFeeRatePercentage.toNumber()).toBe(1); + expect(feeInfo.protocolFeePercentage.toNumber()).toBe(5); + }); + + it("createLbPair2 with token 2022", async () => { + const activeId = new BN(0); + + const createLbPair2Tx = await DLMM.createLbPair2( + connection, + keypair.publicKey, + BTC2022, + USDC, + presetParameter2Key, + activeId, + opt + ); + + await sendAndConfirmTransaction(connection, createLbPair2Tx, [keypair], { + commitment: "confirmed", + }); + + [pairKey] = deriveLbPairWithPresetParamWithIndexKey( + presetParameter2Key, + BTC2022, + USDC, + program.programId + ); + + const dlmm = await DLMM.create(connection, pairKey, opt); + + const feeInfo = dlmm.getFeeInfo(); + expect(feeInfo.baseFeeRatePercentage.toNumber()).toBe(1); + expect(dlmm.lbPair.binStep).toBe(10); + }); + + it("createCustomizablePermissionlessLbPair2 with token 2022", async () => { + const binStep = new BN(1); + const activeId = new BN(0); + const feeBps = new BN(150); + + const createCustomizablePermissionlessLbPair2Tx = + await DLMM.createCustomizablePermissionlessLbPair2( + connection, + binStep, + BTC2022, + USDC, + activeId, + feeBps, + ActivationType.Timestamp, + false, + keypair.publicKey, + null, + opt + ); + + await sendAndConfirmTransaction( + connection, + createCustomizablePermissionlessLbPair2Tx, + [keypair] + ); + + const [pairKey] = deriveCustomizablePermissionlessLbPair( + BTC2022, + USDC, + program.programId + ); + + const dlmm = await DLMM.create(connection, pairKey, opt); + + const feeInfo = dlmm.getFeeInfo(); + expect(feeInfo.baseFeeRatePercentage.toNumber()).toBe(1.5); + expect(feeInfo.protocolFeePercentage.toNumber()).toBe(20); + }); + + it("getPairPubkeyIfExists return pair permissionless pair pubkey", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + + const pairPubkey = await DLMM.getPairPubkeyIfExists( + connection, + dlmm.lbPair.tokenXMint, + dlmm.lbPair.tokenYMint, + new BN(dlmm.lbPair.binStep), + new BN(dlmm.lbPair.parameters.baseFactor), + new BN(dlmm.lbPair.parameters.baseFeePowerFactor), + opt + ); + + expect(pairPubkey.toBase58()).toBe(pairKey.toBase58()); + }); + + it("createMultiple works", async () => { + const lbPairs = await DLMM.getLbPairs(connection, opt); + + const dlmms = await DLMM.createMultiple( + connection, + lbPairs.map((x) => x.publicKey), + opt + ); + + for (let i = 0; i < lbPairs.length; i++) { + const dlmm = dlmms[i]; + const lbPair = lbPairs[i]; + + expect(dlmm.pubkey.toBase58()).toBe(lbPair.publicKey.toBase58()); + expect(dlmm.tokenX.publicKey.toBase58()).toBe( + lbPair.account.tokenXMint.toBase58() + ); + expect(dlmm.tokenY.publicKey.toBase58()).toBe( + lbPair.account.tokenYMint.toBase58() + ); + } + }); + }); + + describe("Position management", () => { + beforeAll(async () => { + const rewardIndex = new BN(0); + const rewardDuration = new BN(3600); + const funder = keypair.publicKey; + + const [rewardVault] = deriveRewardVault( + pairKey, + rewardIndex, + program.programId + ); + + const [tokenBadge] = deriveTokenBadge(MET2022, program.programId); + + await program.methods + .initializeReward(rewardIndex, rewardDuration, funder) + .accounts({ + lbPair: pairKey, + rewardMint: MET2022, + rewardVault, + admin: keypair.publicKey, + tokenBadge, + tokenProgram: TOKEN_2022_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .rpc(); + }); + + it("createEmptyPosition", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + + const minBinId = -30; + const maxBinId = 30; + + const createPositionAndBinArraysTx = await dlmm.createEmptyPosition({ + positionPubKey: widePositionKeypair.publicKey, + minBinId, + maxBinId, + user: keypair.publicKey, + }); + + await sendAndConfirmTransaction( + connection, + createPositionAndBinArraysTx, + [keypair, widePositionKeypair] + ); + + const position = await dlmm.getPosition(widePositionKeypair.publicKey); + expect(position.publicKey.toBase58()).toBe( + widePositionKeypair.publicKey.toBase58() + ); + + const { positionData } = position; + expect(positionData.lowerBinId).toBe(minBinId); + expect(positionData.upperBinId).toBe(maxBinId); + + const binCount = maxBinId - minBinId + 1; + expect(positionData.positionBinData.length).toBe(binCount); + }); + + it("increasePositionLength", async () => { + const lengthToAdd = 30; + + const dlmm = await DLMM.create(connection, pairKey, opt); + + let before = await dlmm.getPosition(widePositionKeypair.publicKey); + + const increaseBuySideLengthTx = await dlmm.increasePositionLength({ + lengthToAdd: new BN(lengthToAdd), + position: widePositionKeypair.publicKey, + payer: keypair.publicKey, + side: ResizeSide.Lower, + }); + + await sendAndConfirmTransaction(connection, increaseBuySideLengthTx, [ + keypair, + ]); + + let after = await dlmm.getPosition(widePositionKeypair.publicKey); + let { positionData } = after; + expect(positionData.lowerBinId).toBe( + before.positionData.lowerBinId - lengthToAdd + ); + expect(positionData.upperBinId).toBe(before.positionData.upperBinId); + + let binCount = positionData.upperBinId - positionData.lowerBinId + 1; + expect(positionData.positionBinData.length).toBe(binCount); + + before = after; + + const increaseSellSideLengthTx = await dlmm.increasePositionLength({ + lengthToAdd: new BN(lengthToAdd), + position: widePositionKeypair.publicKey, + payer: keypair.publicKey, + side: ResizeSide.Upper, + }); + + await sendAndConfirmTransaction(connection, increaseSellSideLengthTx, [ + keypair, + ]); + + after = await dlmm.getPosition(widePositionKeypair.publicKey); + ({ positionData } = after); + expect(positionData.lowerBinId).toBe(before.positionData.lowerBinId); + expect(positionData.upperBinId).toBe( + before.positionData.upperBinId + lengthToAdd + ); + + binCount = positionData.upperBinId - positionData.lowerBinId + 1; + expect(positionData.positionBinData.length).toBe(binCount); + }); + + it("decreasePositionLength", async () => { + const lengthToReduce = 5; + + const dlmm = await DLMM.create(connection, pairKey, opt); + + let before = await dlmm.getPosition(widePositionKeypair.publicKey); + + const decreaseBuySideLengthTx = await dlmm.decreasePositionLength({ + lengthToReduce: new BN(lengthToReduce), + position: widePositionKeypair.publicKey, + feePayer: keypair.publicKey, + side: ResizeSide.Lower, + }); + + await sendAndConfirmTransaction(connection, decreaseBuySideLengthTx, [ + keypair, + ]); + + let after = await dlmm.getPosition(widePositionKeypair.publicKey); + let { positionData } = after; + expect(positionData.lowerBinId).toBe( + before.positionData.lowerBinId + lengthToReduce + ); + expect(positionData.upperBinId).toBe(before.positionData.upperBinId); + + let binCount = positionData.upperBinId - positionData.lowerBinId + 1; + expect(positionData.positionBinData.length).toBe(binCount); + + before = after; + + const decreaseSellSideLengthTx = await dlmm.decreasePositionLength({ + lengthToReduce: new BN(lengthToReduce), + position: widePositionKeypair.publicKey, + feePayer: keypair.publicKey, + side: ResizeSide.Upper, + }); + + await sendAndConfirmTransaction(connection, decreaseSellSideLengthTx, [ + keypair, + ]); + + after = await dlmm.getPosition(widePositionKeypair.publicKey); + ({ positionData } = after); + expect(positionData.lowerBinId).toBe(before.positionData.lowerBinId); + expect(positionData.upperBinId).toBe( + before.positionData.upperBinId - lengthToReduce + ); + + binCount = positionData.upperBinId - positionData.lowerBinId + 1; + expect(positionData.positionBinData.length).toBe(binCount); + }); + }); + + describe("Add liquidity", () => { + it("Add liquidity by strategy", async () => { + const totalXAmount = new BN(100_000).mul(new BN(10 ** btcDecimal)); + const totalYAmount = new BN(100_000).mul(new BN(10 ** usdcDecimal)); + + const dlmm = await DLMM.create(connection, pairKey, opt); + let position = await dlmm.getPosition(widePositionKeypair.publicKey); + + const activeBinInfo = await dlmm.getActiveBin(); + + const computedInBinAmount = toAmountsBothSideByStrategy( + dlmm.lbPair.activeId, + dlmm.lbPair.binStep, + position.positionData.lowerBinId, + position.positionData.upperBinId, + totalXAmount, + totalYAmount, + activeBinInfo.xAmount, + activeBinInfo.yAmount, + StrategyType.SpotImBalanced, + dlmm.tokenX.mint, + dlmm.tokenY.mint, + dlmm.clock + ); + + const addLiquidityTx = await dlmm.addLiquidityByStrategy({ + positionPubKey: widePositionKeypair.publicKey, + totalXAmount, + totalYAmount, + user: keypair.publicKey, + strategy: { + strategyType: StrategyType.SpotImBalanced, + minBinId: position.positionData.lowerBinId, + maxBinId: position.positionData.upperBinId, + }, + slippage: 0, + }); + + const [beforeReserveXAccount, beforeReserveYAccount] = + await connection.getMultipleAccountsInfo([ + dlmm.tokenX.reserve, + dlmm.tokenY.reserve, + ]); + + await sendAndConfirmTransaction(connection, addLiquidityTx, [keypair]); + position = await dlmm.getPosition(widePositionKeypair.publicKey); + + const [afterReserveXAccount, afterReserveYAccount] = + await connection.getMultipleAccountsInfo([ + dlmm.tokenX.reserve, + dlmm.tokenY.reserve, + ]); + + const [computedInAmountX, computedInAmountY] = computedInBinAmount.reduce( + ([totalXAmount, totalYAmount], { amountX, amountY }) => { + return [totalXAmount.add(amountX), totalYAmount.add(amountY)]; + }, + [new BN(0), new BN(0)] + ); + + expect(computedInAmountX.lte(totalXAmount)).toBeTruthy(); + expect(computedInAmountY.lte(totalYAmount)).toBeTruthy(); + + const beforeReserveX = unpackAccount( + dlmm.tokenX.reserve, + beforeReserveXAccount, + beforeReserveXAccount.owner + ); + + const beforeReserveY = unpackAccount( + dlmm.tokenY.reserve, + beforeReserveYAccount, + beforeReserveYAccount.owner + ); + + const afterReserveX = unpackAccount( + dlmm.tokenX.reserve, + afterReserveXAccount, + afterReserveXAccount.owner + ); + + const afterReserveY = unpackAccount( + dlmm.tokenY.reserve, + afterReserveYAccount, + afterReserveYAccount.owner + ); + + const reserveXReceivedAmount = + afterReserveX.amount - beforeReserveX.amount; + + const reserveYReceivedAmount = + afterReserveY.amount - beforeReserveY.amount; + + expect(new BN(reserveXReceivedAmount.toString()).toString()).toBe( + computedInAmountX.toString() + ); + + expect(new BN(reserveYReceivedAmount.toString()).toString()).toBe( + computedInAmountY.toString() + ); + + const positionXAmount = new BN(position.positionData.totalXAmount); + const positionYAmount = new BN(position.positionData.totalYAmount); + + const xDiff = computedInAmountX.sub(positionXAmount); + const yDiff = computedInAmountY.sub(positionYAmount); + + expect(xDiff.lte(new BN(1))).toBeTruthy(); + expect(yDiff.lte(new BN(1))).toBeTruthy(); + + expect(positionXAmount.add(xDiff).toString()).toBe( + computedInAmountX.toString() + ); + + expect(positionYAmount.add(yDiff).toString()).toBe( + computedInAmountY.toString() + ); + }); + + it("Initialize position and add liquidity by strategy", async () => { + const totalXAmount = new BN(100_000).mul(new BN(10 ** btcDecimal)); + const totalYAmount = new BN(100_000).mul(new BN(10 ** usdcDecimal)); + + const dlmm = await DLMM.create(connection, pairKey, opt); + + const minBinId = dlmm.lbPair.activeId - 30; + const maxBinId = dlmm.lbPair.activeId + 30; + + const activeBinInfo = await dlmm.getActiveBin(); + + const computedInBinAmount = toAmountsBothSideByStrategy( + dlmm.lbPair.activeId, + dlmm.lbPair.binStep, + minBinId, + maxBinId, + totalXAmount, + totalYAmount, + activeBinInfo.xAmount, + activeBinInfo.yAmount, + StrategyType.SpotImBalanced, + dlmm.tokenX.mint, + dlmm.tokenY.mint, + dlmm.clock + ); + + const initAndAddLiquidityTx = + await dlmm.initializePositionAndAddLiquidityByStrategy({ + positionPubKey: tightPositionKeypair.publicKey, + totalXAmount, + totalYAmount, + strategy: { + strategyType: StrategyType.SpotImBalanced, + minBinId, + maxBinId, + }, + slippage: 0, + user: keypair.publicKey, + }); + + const [beforeReserveXAccount, beforeReserveYAccount] = + await connection.getMultipleAccountsInfo([ + dlmm.tokenX.reserve, + dlmm.tokenY.reserve, + ]); + + await sendAndConfirmTransaction(connection, initAndAddLiquidityTx, [ + keypair, + tightPositionKeypair, + ]); + + const [afterReserveXAccount, afterReserveYAccount] = + await connection.getMultipleAccountsInfo([ + dlmm.tokenX.reserve, + dlmm.tokenY.reserve, + ]); + + await dlmm.refetchStates(); + + const position = await dlmm.getPosition(tightPositionKeypair.publicKey); + expect(position.positionData.lowerBinId).toBe(minBinId); + expect(position.positionData.upperBinId).toBe(maxBinId); + + const [computedInAmountX, computedInAmountY] = computedInBinAmount.reduce( + ([totalXAmount, totalYAmount], { amountX, amountY }) => { + return [totalXAmount.add(amountX), totalYAmount.add(amountY)]; + }, + [new BN(0), new BN(0)] + ); + + expect(computedInAmountX.lte(totalXAmount)).toBeTruthy(); + expect(computedInAmountY.lte(totalYAmount)).toBeTruthy(); + + const beforeReserveX = unpackAccount( + dlmm.tokenX.reserve, + beforeReserveXAccount, + beforeReserveXAccount.owner + ); + + const beforeReserveY = unpackAccount( + dlmm.tokenY.reserve, + beforeReserveYAccount, + beforeReserveYAccount.owner + ); + + const afterReserveX = unpackAccount( + dlmm.tokenX.reserve, + afterReserveXAccount, + afterReserveXAccount.owner + ); + + const afterReserveY = unpackAccount( + dlmm.tokenY.reserve, + afterReserveYAccount, + afterReserveYAccount.owner + ); + + const reserveXReceivedAmount = + afterReserveX.amount - beforeReserveX.amount; + + const reserveYReceivedAmount = + afterReserveY.amount - beforeReserveY.amount; + + expect(new BN(reserveXReceivedAmount.toString()).toString()).toBe( + computedInAmountX.toString() + ); + + expect(new BN(reserveYReceivedAmount.toString()).toString()).toBe( + computedInAmountY.toString() + ); + + const positionXAmount = new BN(position.positionData.totalXAmount); + const positionYAmount = new BN(position.positionData.totalYAmount); + + const xDiff = computedInAmountX.sub(positionXAmount); + const yDiff = computedInAmountY.sub(positionYAmount); + + expect(xDiff.lte(new BN(1))).toBeTruthy(); + expect(yDiff.lte(new BN(1))).toBeTruthy(); + + expect(positionXAmount.add(xDiff).toString()).toBe( + computedInAmountX.toString() + ); + + expect(positionYAmount.add(yDiff).toString()).toBe( + computedInAmountY.toString() + ); + }); + }); + + describe("Swap", () => { + it("Swap quote X into Y and execute swap", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + const inAmount = new BN(100_000).mul(new BN(10 ** btcDecimal)); + const swapForY = true; + + const bidBinArrays = await dlmm.getBinArrayForSwap(swapForY, 3); + const quoteResult = dlmm.swapQuote( + inAmount, + swapForY, + new BN(0), + bidBinArrays, + false + ); + + const swapTx = await dlmm.swap({ + inAmount, + inToken: dlmm.tokenX.publicKey, + outToken: dlmm.tokenY.publicKey, + minOutAmount: quoteResult.minOutAmount, + lbPair: pairKey, + user: keypair.publicKey, + binArraysPubkey: bidBinArrays.map((b) => b.publicKey), + }); + + const [beforeUserXAccount, beforeUserYAccount] = + await connection.getMultipleAccountsInfo([ + getAssociatedTokenAddressSync( + dlmm.tokenX.publicKey, + keypair.publicKey, + true, + dlmm.tokenX.owner + ), + getAssociatedTokenAddressSync( + dlmm.tokenY.publicKey, + keypair.publicKey, + true, + dlmm.tokenY.owner + ), + ]); + + await sendAndConfirmTransaction(connection, swapTx, [keypair]); + + const [afterUserXAccount, afterUserYAccount] = + await connection.getMultipleAccountsInfo([ + getAssociatedTokenAddressSync( + dlmm.tokenX.publicKey, + keypair.publicKey, + true, + dlmm.tokenX.owner + ), + getAssociatedTokenAddressSync( + dlmm.tokenY.publicKey, + keypair.publicKey, + true, + dlmm.tokenY.owner + ), + ]); + + const beforeUserX = unpackAccount( + dlmm.tokenX.publicKey, + beforeUserXAccount, + beforeUserXAccount.owner + ); + + const beforeUserY = unpackAccount( + dlmm.tokenY.publicKey, + beforeUserYAccount, + beforeUserYAccount.owner + ); + + const afterUserX = unpackAccount( + dlmm.tokenX.publicKey, + afterUserXAccount, + afterUserXAccount.owner + ); + + const afterUserY = unpackAccount( + dlmm.tokenY.publicKey, + afterUserYAccount, + afterUserYAccount.owner + ); + + const consumedXAmount = new BN( + (beforeUserX.amount - afterUserX.amount).toString() + ); + const receivedYAmount = new BN( + (afterUserY.amount - beforeUserY.amount).toString() + ); + + expect(consumedXAmount.toString()).toBe( + quoteResult.consumedInAmount.toString() + ); + expect(receivedYAmount.toString()).toBe(quoteResult.outAmount.toString()); + }); + + it("Swap quote Y into X and execute swap", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + const inAmount = new BN(100_000).mul(new BN(10 ** usdcDecimal)); + const swapForY = false; + + const askBinArrays = await dlmm.getBinArrayForSwap(swapForY, 3); + const quoteResult = dlmm.swapQuote( + inAmount, + swapForY, + new BN(0), + askBinArrays, + false + ); + + const swapTx = await dlmm.swap({ + inAmount, + inToken: dlmm.tokenY.publicKey, + outToken: dlmm.tokenX.publicKey, + minOutAmount: quoteResult.minOutAmount, + lbPair: pairKey, + user: keypair.publicKey, + binArraysPubkey: askBinArrays.map((b) => b.publicKey), + }); + + const [beforeUserXAccount, beforeUserYAccount] = + await connection.getMultipleAccountsInfo([ + getAssociatedTokenAddressSync( + dlmm.tokenX.publicKey, + keypair.publicKey, + true, + dlmm.tokenX.owner + ), + getAssociatedTokenAddressSync( + dlmm.tokenY.publicKey, + keypair.publicKey, + true, + dlmm.tokenY.owner + ), + ]); + + await sendAndConfirmTransaction(connection, swapTx, [keypair]); + + const [afterUserXAccount, afterUserYAccount] = + await connection.getMultipleAccountsInfo([ + getAssociatedTokenAddressSync( + dlmm.tokenX.publicKey, + keypair.publicKey, + true, + dlmm.tokenX.owner + ), + getAssociatedTokenAddressSync( + dlmm.tokenY.publicKey, + keypair.publicKey, + true, + dlmm.tokenY.owner + ), + ]); + + const beforeUserX = unpackAccount( + dlmm.tokenX.publicKey, + beforeUserXAccount, + beforeUserXAccount.owner + ); + + const beforeUserY = unpackAccount( + dlmm.tokenY.publicKey, + beforeUserYAccount, + beforeUserYAccount.owner + ); + + const afterUserX = unpackAccount( + dlmm.tokenX.publicKey, + afterUserXAccount, + afterUserXAccount.owner + ); + + const afterUserY = unpackAccount( + dlmm.tokenY.publicKey, + afterUserYAccount, + afterUserYAccount.owner + ); + + const consumedYAmount = new BN( + (beforeUserY.amount - afterUserY.amount).toString() + ); + const receivedXAmount = new BN( + (afterUserX.amount - beforeUserX.amount).toString() + ); + + expect(consumedYAmount.toString()).toBe( + quoteResult.consumedInAmount.toString() + ); + expect(receivedXAmount.toString()).toBe(quoteResult.outAmount.toString()); + }); + }); + + describe("Claim fees and rewards", () => { + let userXAta: PublicKey, userYAta: PublicKey; + + beforeEach(async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + + // Generate some swap fees + const inAmount = new BN(100_000); + for (const [inToken, outToken] of [ + [dlmm.tokenX, dlmm.tokenY], + [dlmm.tokenY, dlmm.tokenX], + ]) { + const binArraysPubkey = await dlmm + .getBinArrayForSwap( + inToken.publicKey.equals(dlmm.tokenX.publicKey), + 3 + ) + .then((b) => b.map((b) => b.publicKey)); + + const swapTx = await dlmm.swap({ + inToken: inToken.publicKey, + outToken: outToken.publicKey, + inAmount: inAmount.mul(new BN(10 ** inToken.mint.decimals)), + minOutAmount: new BN(0), + user: keypair.publicKey, + lbPair: pairKey, + binArraysPubkey, + }); + + await sendAndConfirmTransaction(connection, swapTx, [keypair]); + await dlmm.refetchStates(); + } + + userXAta = getAssociatedTokenAddressSync( + dlmm.tokenX.publicKey, + keypair.publicKey, + true, + dlmm.tokenX.owner + ); + + userYAta = getAssociatedTokenAddressSync( + dlmm.tokenY.publicKey, + keypair.publicKey, + true, + dlmm.tokenY.owner + ); + }); + + const assertUserTokenBalanceWithDelta = ( + beforeAccount: AccountInfo>, + afterAccount: AccountInfo>, + expectedAmount: BN + ) => { + const before = unpackAccount( + PublicKey.default, + beforeAccount, + beforeAccount.owner + ); + + const after = unpackAccount( + PublicKey.default, + afterAccount, + afterAccount.owner + ); + + const delta = + before.amount > after.amount + ? before.amount - after.amount + : after.amount - before.amount; + + const deltaBn = new BN(delta.toString()); + expect(deltaBn.toString()).toBe(expectedAmount.toString()); + }; + + it("Claim all swap fees", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + + const [beforeUserXAccount, beforeUserYAccount] = + await connection.getMultipleAccountsInfo([userXAta, userYAta]); + + const [widePosition, tightPosition] = await Promise.all([ + dlmm.getPosition(widePositionKeypair.publicKey), + dlmm.getPosition(tightPositionKeypair.publicKey), + ]); + + const totalClaimableFeeX = + widePosition.positionData.feeXExcludeTransferFee.add( + tightPosition.positionData.feeXExcludeTransferFee + ); + + const totalClaimableFeeY = + widePosition.positionData.feeYExcludeTransferFee.add( + tightPosition.positionData.feeYExcludeTransferFee + ); + + const claimFeeTxs = await dlmm.claimAllSwapFee({ + owner: keypair.publicKey, + positions: [widePosition, tightPosition], + }); + + await Promise.all( + claimFeeTxs.map((tx) => + sendAndConfirmTransaction(connection, tx, [keypair]) + ) + ); + + const [afterUserXAccount, afterUserYAccount] = + await connection.getMultipleAccountsInfo([userXAta, userYAta]); + + assertUserTokenBalanceWithDelta( + beforeUserXAccount, + afterUserXAccount, + totalClaimableFeeX + ); + + assertUserTokenBalanceWithDelta( + beforeUserYAccount, + afterUserYAccount, + totalClaimableFeeY + ); + }); + + it("Claim swap fee", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + + for (const positionKey of [ + widePositionKeypair.publicKey, + tightPositionKeypair.publicKey, + ]) { + const position = await dlmm.getPosition(positionKey); + + const [beforeUserXAccount, beforeUserYAccount] = + await connection.getMultipleAccountsInfo([userXAta, userYAta]); + + const claimFeeTx = await dlmm.claimSwapFee({ + owner: keypair.publicKey, + position, + }); + + await sendAndConfirmTransaction(connection, claimFeeTx, [keypair]); + + const [afterUserXAccount, afterUserYAccount] = + await connection.getMultipleAccountsInfo([userXAta, userYAta]); + + assertUserTokenBalanceWithDelta( + beforeUserXAccount, + afterUserXAccount, + position.positionData.feeXExcludeTransferFee + ); + + assertUserTokenBalanceWithDelta( + beforeUserYAccount, + afterUserYAccount, + position.positionData.feeYExcludeTransferFee + ); + } + }); + + it("Claim swap fee chunk", async () => { + const dlmm = await DLMM.create(connection, pairKey, opt); + + for (const positionKey of [ + widePositionKeypair.publicKey, + tightPositionKeypair.publicKey, + ]) { + const position = await dlmm.getPosition(positionKey); + + const binRangeToShrink = + (position.positionData.upperBinId - + position.positionData.lowerBinId) * + 0.4; + + const minBinId = new BN( + Math.ceil(position.positionData.lowerBinId + binRangeToShrink) + ); + + const maxBinId = new BN( + Math.floor(position.positionData.upperBinId - binRangeToShrink) + ); + + const [beforeUserXAccount, beforeUserYAccount] = + await connection.getMultipleAccountsInfo([userXAta, userYAta]); + + const claimFeeTx = await dlmm.claimSwapFee({ + owner: keypair.publicKey, + position, + binRange: { + minBinId, + maxBinId, + }, + }); + + await sendAndConfirmTransaction(connection, claimFeeTx, [keypair]); + + const [afterUserXAccount, afterUserYAccount] = + await connection.getMultipleAccountsInfo([userXAta, userYAta]); + + const beforeUserX = unpackAccount( + dlmm.tokenX.publicKey, + beforeUserXAccount, + beforeUserXAccount.owner + ); + + const afterUserX = unpackAccount( + dlmm.tokenX.publicKey, + afterUserXAccount, + afterUserXAccount.owner + ); + + const beforeUserY = unpackAccount( + dlmm.tokenY.publicKey, + beforeUserYAccount, + beforeUserYAccount.owner + ); + + const afterUserY = unpackAccount( + dlmm.tokenY.publicKey, + afterUserYAccount, + afterUserYAccount.owner + ); + + const claimedAmountX = new BN( + (afterUserX.amount - beforeUserX.amount).toString() + ); + + const claimedAmountY = new BN( + (afterUserY.amount - beforeUserY.amount).toString() + ); + + console.log( + claimedAmountX.toString(), + position.positionData.feeXExcludeTransferFee.toString() + ); + + console.log( + claimedAmountY.toString(), + position.positionData.feeYExcludeTransferFee.toString() + ); + + expect( + claimedAmountX.lt(position.positionData.feeXExcludeTransferFee) + ).toBeTruthy(); + expect( + claimedAmountY.lt(position.positionData.feeYExcludeTransferFee) + ).toBeTruthy(); + } + }); + }); + + describe("Position fetcher", () => { + const pairWithPositionKey: { + pair: PublicKey; + position: PublicKey; + user: PublicKey; + }[] = []; + + beforeAll(async () => { + const pairs = await DLMM.getLbPairs(connection, opt); + + for (const pair of pairs) { + const userKeypair = Keypair.generate(); + + const airdropSig = await connection.requestAirdrop( + userKeypair.publicKey, + 1 * LAMPORTS_PER_SOL + ); + + await connection.confirmTransaction(airdropSig, "confirmed"); + + const positionKeypair = Keypair.generate(); + const dlmm = await DLMM.create(connection, pair.publicKey, opt); + + const minBinId = -30; + const maxBinId = 30; + + const createPositionAndBinArraysTx = await dlmm.createEmptyPosition({ + positionPubKey: positionKeypair.publicKey, + minBinId, + maxBinId, + user: userKeypair.publicKey, + }); + + await sendAndConfirmTransaction( + connection, + createPositionAndBinArraysTx, + [userKeypair, positionKeypair] + ); + + pairWithPositionKey.push({ + pair: pair.publicKey, + position: positionKeypair.publicKey, + user: userKeypair.publicKey, + }); + } + }); + + it("Load position by user and pair successfully", async () => { + for (const { pair, position, user } of pairWithPositionKey) { + const dlmm = await DLMM.create(connection, pair, opt); + const { userPositions } = await dlmm.getPositionsByUserAndLbPair(user); + + expect(userPositions.length).toBe(1); + expect( + userPositions.find((x) => x.publicKey.equals(position)) + ).toBeDefined(); + expect( + userPositions.filter((x) => x.positionData.owner.equals(user)).length + ).toBe(userPositions.length); + } + }); + + it("Load all positions by user successfully", async () => { + const pairKeyedPosition = await DLMM.getAllLbPairPositionsByUser( + connection, + keypair.publicKey, + opt + ); + + const positionContainers = Array.from(pairKeyedPosition.values()); + const positions = positionContainers.flatMap( + (x) => x.lbPairPositionsData + ); + + for (const position of positions) { + expect( + position.positionData.owner.equals(keypair.publicKey) + ).toBeTruthy(); + } + }); + }); +});