diff --git a/programs/cp-amm/src/lib.rs b/programs/cp-amm/src/lib.rs index fea451a8..53e29222 100644 --- a/programs/cp-amm/src/lib.rs +++ b/programs/cp-amm/src/lib.rs @@ -86,7 +86,7 @@ pub mod cp_amm { use super::*; - /// ADMIN FUNCTIONS ///// + /// ADMIN FUNCTIONS //// pub fn create_operator_account( ctx: Context, permission: u128, diff --git a/tests/addLiquidity.test.ts b/tests/addLiquidity.test.ts index 192a222a..6acc781f 100644 --- a/tests/addLiquidity.test.ts +++ b/tests/addLiquidity.test.ts @@ -1,7 +1,7 @@ -import { generateKpAndFund } from "./helpers/common"; import { Keypair, PublicKey } from "@solana/web3.js"; import BN from "bn.js"; import { expect } from "chai"; +import { LiteSVM } from "litesvm"; import { addLiquidity, AddLiquidityParams, @@ -24,13 +24,13 @@ import { startSvm, U64_MAX, } from "./helpers"; +import { generateKpAndFund } from "./helpers/common"; +import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; import { createToken2022, createTransferFeeExtensionWithInstruction, mintToToken2022, } from "./helpers/token2022"; -import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Add liquidity", () => { describe("SPL Token", () => { @@ -217,7 +217,7 @@ describe("Add liquidity", () => { creator = generateKpAndFund(svm); whitelistedAccount = generateKpAndFund(svm); - await createToken2022( + createToken2022( svm, tokenAExtensions, tokenAMintKeypair, diff --git a/tests/frozenRewardVault.test.ts b/tests/frozenRewardVault.test.ts index a1c87ddd..34806e38 100644 --- a/tests/frozenRewardVault.test.ts +++ b/tests/frozenRewardVault.test.ts @@ -1,40 +1,39 @@ -import { generateKpAndFund } from "./helpers/common"; import { Keypair, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; +import { expect } from "chai"; +import { LiteSVM } from "litesvm"; +import { describe } from "mocha"; import { addLiquidity, AddLiquidityParams, claimReward, createConfigIx, CreateConfigParams, + createOperator, createPosition, + createToken, + deriveRewardVaultAddress, + encodePermissions, + expectThrowsErrorMessage, + freezeTokenAccount, fundReward, + getPosition, + getTokenAccount, initializePool, InitializePoolParams, initializeReward, InitializeRewardParams, - MIN_LP_AMOUNT, MAX_SQRT_PRICE, + MIN_LP_AMOUNT, MIN_SQRT_PRICE, - createToken, mintSplTokenTo, - freezeTokenAccount, - deriveRewardVaultAddress, - getTokenAccount, - U64_MAX, - getCpAmmProgramErrorCode, - getPosition, - encodePermissions, OperatorPermission, - createOperator, startSvm, + U64_MAX, warpToTimestamp, - expectThrowsErrorCode, } from "./helpers"; -import BN from "bn.js"; -import { describe } from "mocha"; -import { expect } from "chai"; +import { generateKpAndFund } from "./helpers/common"; import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Frozen reward vault", () => { let svm: LiteSVM; @@ -187,17 +186,15 @@ describe("Frozen reward vault", () => { expect(rewardVaultInfo.state).eq(2); // frozen // check error - const errorCode = getCpAmmProgramErrorCode("RewardVaultFrozenSkipRequired"); - expectThrowsErrorCode( + await expectThrowsErrorMessage(async () => { await claimReward(svm, { index, user, pool, position, skipReward: 0, // skip_reward is required in case reward vault frozen - }), - errorCode - ); + }); + }, "RewardVaultFrozenSkipRequired"); // // claim reward await claimReward(svm, { diff --git a/tests/helpers/cpAmm.ts b/tests/helpers/cpAmm.ts index 15193816..bedb9684 100644 --- a/tests/helpers/cpAmm.ts +++ b/tests/helpers/cpAmm.ts @@ -32,11 +32,7 @@ import { } from "@solana/web3.js"; import { expect } from "chai"; import Decimal from "decimal.js"; -import { - FailedTransactionMetadata, - LiteSVM, - TransactionMetadata, -} from "litesvm"; +import { LiteSVM, TransactionMetadata } from "litesvm"; import CpAmmIDL from "../../target/idl/cp_amm.json"; import { CpAmm } from "../../target/types/cp_amm"; import { @@ -75,7 +71,7 @@ import { decodePodAlignedFeeRateLimiter, decodePodAlignedFeeTimeScheduler, } from "./feeCodec"; -import { sendTransaction } from "./svm"; +import { sendTransaction, sendTransactionThrowError } from "./svm"; import { getOrCreateAssociatedTokenAccount, wrapSOL } from "./token"; export type Pool = IdlAccounts["pool"]; @@ -206,9 +202,7 @@ export async function createConfigIx( }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); // Check data const configState = getConfig(svm, config); @@ -343,8 +337,7 @@ export async function closeConfigIx( rentReceiver: whitelistedAddress.publicKey, }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); const configState = svm.getAccount(config); expect(configState.data.length).eq(0); @@ -374,9 +367,7 @@ export async function createTokenBadge( }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - expect(result).instanceOf(TransactionMetadata); - + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); const tokenBadgeState = getTokenBadge(svm, tokenBadge); expect(tokenBadgeState.tokenMint.toString()).eq(tokenMint.toString()); @@ -404,8 +395,8 @@ export async function closeTokenBadge( }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); + const tokenBadgeAccount = svm.getAccount(tokenBadge); expect(tokenBadgeAccount.data.length).eq(0); } @@ -436,9 +427,7 @@ export async function createClaimFeeOperator( }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); } export enum OperatorPermission { @@ -484,9 +473,7 @@ export async function createOperator( }) .transaction(); - const result = sendTransaction(svm, transaction, [admin]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [admin]); } export type CloseFeeOperatorParams = { @@ -511,8 +498,7 @@ export async function closeClaimFeeOperator( }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); const account = svm.getAccount(claimFeeOperator); @@ -529,7 +515,7 @@ export type UpdatePoolFeesParams = { export async function updatePoolFeesParameters( svm: LiteSVM, params: UpdatePoolFeesParams -): Promise { +): Promise { const { pool, whitelistedOperator, cliffFeeNumerator, dynamicFee } = params; const program = createCpAmmProgram(); const transaction = await program.methods @@ -544,8 +530,7 @@ export async function updatePoolFeesParameters( }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedOperator]); - return result; + sendTransactionThrowError(svm, transaction, [whitelistedOperator]); } export type ClaimProtocolFeeParams = { @@ -630,8 +615,7 @@ export async function claimProtocolFee( }) .transaction(); - const result = sendTransaction(svm, transaction, [claimFeeOperator]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [claimFeeOperator]); } export type ClaimPartnerFeeParams = { @@ -682,9 +666,7 @@ export async function claimPartnerFee( }) .transaction(); - const result = sendTransaction(svm, transaction, [partner]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [partner]); } export type InitializePoolParams = { @@ -704,7 +686,6 @@ export async function initializePool( ): Promise<{ pool: PublicKey; position: PublicKey; - result: TransactionMetadata | FailedTransactionMetadata; }> { const { config, @@ -778,25 +759,22 @@ export async function initializePool( }) ); - const result = sendTransaction(svm, transaction, [payer, positionNftKP]); - if (result instanceof TransactionMetadata) { - // validate pool data - const poolState = getPool(svm, pool); - expect(poolState.tokenAMint.toString()).eq(tokenAMint.toString()); - expect(poolState.tokenBMint.toString()).eq(tokenBMint.toString()); - expect(poolState.tokenAVault.toString()).eq(tokenAVault.toString()); - expect(poolState.tokenBVault.toString()).eq(tokenBVault.toString()); - expect(poolState.liquidity.toString()).eq(liquidity.toString()); - expect(poolState.sqrtPrice.toString()).eq(sqrtPrice.toString()); - - expect(poolState.rewardInfos[0].initialized).eq(0); - expect(poolState.rewardInfos[1].initialized).eq(0); - expect(poolState.poolFees.initSqrtPrice.toString()).eq( - sqrtPrice.toString() - ); - } + sendTransactionThrowError(svm, transaction, [payer, positionNftKP]); + + // validate pool data + const poolState = getPool(svm, pool); + expect(poolState.tokenAMint.toString()).eq(tokenAMint.toString()); + expect(poolState.tokenBMint.toString()).eq(tokenBMint.toString()); + expect(poolState.tokenAVault.toString()).eq(tokenAVault.toString()); + expect(poolState.tokenBVault.toString()).eq(tokenBVault.toString()); + expect(poolState.liquidity.toString()).eq(liquidity.toString()); + expect(poolState.sqrtPrice.toString()).eq(sqrtPrice.toString()); + + expect(poolState.rewardInfos[0].initialized).eq(0); + expect(poolState.rewardInfos[1].initialized).eq(0); + expect(poolState.poolFees.initSqrtPrice.toString()).eq(sqrtPrice.toString()); - return { pool, position: position, result }; + return { pool, position: position }; } export type InitializePoolWithCustomizeConfigParams = { @@ -910,12 +888,11 @@ export async function initializePoolWithCustomizeConfig( }) ); - const result = sendTransaction(svm, transaction, [ + sendTransactionThrowError(svm, transaction, [ payer, positionNftKP, poolCreatorAuthority, ]); - expect(result).instanceOf(TransactionMetadata); // validate pool data const poolState = getPool(svm, pool); @@ -954,9 +931,7 @@ export async function setPoolStatus(svm: LiteSVM, params: SetPoolStatusParams) { }) .transaction(); - const result = sendTransaction(svm, transaction, [whitelistedAddress]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [whitelistedAddress]); } export type PoolFeesParams = { @@ -1072,8 +1047,7 @@ export async function initializeCustomizablePool( }) ); - const result = sendTransaction(svm, transaction, [payer, positionNftKP]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [payer, positionNftKP]); // validate pool data const poolState = getPool(svm, pool); @@ -1199,7 +1173,7 @@ export type InitializeRewardParams = { export async function initializeReward( svm: LiteSVM, params: InitializeRewardParams -): Promise { +): Promise { const { index, rewardDuration, pool, rewardMint, payer, funder, operator } = params; const program = createCpAmmProgram(); @@ -1212,12 +1186,12 @@ export async function initializeReward( operator == null ? [] : [ - { - pubkey: operator, - isSigner: false, - isWritable: false, - }, - ]; + { + pubkey: operator, + isSigner: false, + isWritable: false, + }, + ]; const transaction = await program.methods .initializeReward(index, rewardDuration, funder) .accountsPartial({ @@ -1233,20 +1207,17 @@ export async function initializeReward( .remainingAccounts(remainingAccounts) .transaction(); - const result = sendTransaction(svm, transaction, [payer]); - if (result instanceof TransactionMetadata) { - // validate reward data - const poolState = getPool(svm, pool); - expect(poolState.rewardInfos[index].initialized).eq(1); - expect(poolState.rewardInfos[index].vault.toString()).eq( - rewardVault.toString() - ); - expect(poolState.rewardInfos[index].mint.toString()).eq( - rewardMint.toString() - ); - } + sendTransactionThrowError(svm, transaction, [payer]); - return result; + // validate reward data + const poolState = getPool(svm, pool); + expect(poolState.rewardInfos[index].initialized).eq(1); + expect(poolState.rewardInfos[index].vault.toString()).eq( + rewardVault.toString() + ); + expect(poolState.rewardInfos[index].mint.toString()).eq( + rewardMint.toString() + ); } export type UpdateRewardDurationParams = { @@ -1267,12 +1238,12 @@ export async function updateRewardDuration( operator == null ? [] : [ - { - pubkey: operator, - isSigner: false, - isWritable: false, - }, - ]; + { + pubkey: operator, + isSigner: false, + isWritable: false, + }, + ]; const transaction = await program.methods .updateRewardDuration(index, newDuration) .accountsPartial({ @@ -1282,8 +1253,7 @@ export async function updateRewardDuration( .remainingAccounts(remainingAccounts) .transaction(); - const result = sendTransaction(svm, transaction, [signer]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [signer]); const poolState = getPool(svm, pool); expect(poolState.rewardInfos[index].rewardDuration.toNumber()).eq( @@ -1309,12 +1279,12 @@ export async function updateRewardFunder( operator == null ? [] : [ - { - pubkey: operator, - isSigner: false, - isWritable: false, - }, - ]; + { + pubkey: operator, + isSigner: false, + isWritable: false, + }, + ]; const transaction = await program.methods .updateRewardFunder(index, newFunder) .accountsPartial({ @@ -1324,8 +1294,7 @@ export async function updateRewardFunder( .remainingAccounts(remainingAccounts) .transaction(); - const result = sendTransaction(svm, transaction, [signer]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [signer]); const poolState = getPool(svm, pool); expect(poolState.rewardInfos[index].funder.toString()).eq( @@ -1370,8 +1339,7 @@ export async function fundReward( }) .transaction(); - const result = sendTransaction(svm, transaction, [funder]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [funder]); } export type ClaimRewardParams = { @@ -1385,7 +1353,7 @@ export type ClaimRewardParams = { export async function claimReward( svm: LiteSVM, params: ClaimRewardParams -): Promise { +): Promise { const { index, pool, user, position, skipReward } = params; const program = createCpAmmProgram(); @@ -1420,8 +1388,7 @@ export async function claimReward( }) .transaction(); - const result = sendTransaction(svm, transaction, [user]); - return result; + sendTransactionThrowError(svm, transaction, [user]); } export type WithdrawIneligibleRewardParams = { @@ -1460,8 +1427,7 @@ export async function withdrawIneligibleReward( }) .transaction(); - const result = sendTransaction(svm, transaction, [funder]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [funder]); } export async function refreshVestings( @@ -1494,8 +1460,7 @@ export async function refreshVestings( ) .transaction(); - const result = sendTransaction(svm, transaction, [payer]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [payer]); } export async function permanentLockPosition( @@ -1519,8 +1484,7 @@ export async function permanentLockPosition( }) .transaction(); - const result = sendTransaction(svm, transaction, [payer, owner]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [payer, owner]); } export async function lockPosition( @@ -1550,8 +1514,7 @@ export async function lockPosition( }) .transaction(); - const result = sendTransaction(svm, transaction, [payer, owner, vestingKP]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [payer, owner, vestingKP]); return vestingKP.publicKey; } @@ -1584,8 +1547,7 @@ export async function createPosition( }) .transaction(); - const result = sendTransaction(svm, transaction, [payer, positionNftKP]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [payer, positionNftKP]); const positionState = getPosition(svm, position); @@ -1689,9 +1651,7 @@ export async function addLiquidity(svm: LiteSVM, params: AddLiquidityParams) { }) .transaction(); - const result = sendTransaction(svm, transaction, [owner]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [owner]); } export type RemoveLiquidityParams = AddLiquidityParams; @@ -1758,8 +1718,7 @@ export async function removeLiquidity( }) .transaction(); - const result = sendTransaction(svm, transaction, [owner]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [owner]); } export type RemoveAllLiquidityParams = { @@ -1827,8 +1786,7 @@ export async function removeAllLiquidity( }) .transaction(); - const result = sendTransaction(svm, transaction, [owner]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [owner]); } export async function closePosition( @@ -1858,8 +1816,7 @@ export async function closePosition( }) .transaction(); - const result = sendTransaction(svm, transaction, [owner]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [owner]); } export type SwapParams = { @@ -2112,8 +2069,7 @@ export async function swap2ExactIn( swapMode: SwapMode.ExactIn, }); - const result = sendTransaction(svm, swapIx, [params.payer]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, swapIx, [params.payer]); } export async function swap2ExactOut( @@ -2125,9 +2081,7 @@ export async function swap2ExactOut( swapMode: SwapMode.ExactOut, }); - const result = sendTransaction(svm, swapIx, [params.payer]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, swapIx, [params.payer]); } export async function swap2PartialFillIn( @@ -2139,16 +2093,13 @@ export async function swap2PartialFillIn( swapMode: SwapMode.PartialFillIn, }); - const result = sendTransaction(svm, swapIx, [params.payer]); - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, swapIx, [params.payer]); } export async function swapExactIn(svm: LiteSVM, params: SwapParams) { const transaction = await swapInstruction(svm, params); - const result = sendTransaction(svm, transaction, [params.payer]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [params.payer]); } export type ClaimPositionFeeParams = { @@ -2208,9 +2159,7 @@ export async function claimPositionFee( }) .transaction(); - const result = sendTransaction(svm, transaction, [owner]); - - expect(result).instanceOf(TransactionMetadata); + sendTransactionThrowError(svm, transaction, [owner]); } export type SplitPositionParams = { @@ -2266,12 +2215,10 @@ export async function splitPosition(svm: LiteSVM, params: SplitPositionParams) { }) .transaction(); - const result = sendTransaction(svm, transaction, [ + sendTransactionThrowError(svm, transaction, [ firstPositionOwner, secondPositionOwner, ]); - - return result; } export type SplitPosition2Params = { @@ -2312,12 +2259,10 @@ export async function splitPosition2( }) .transaction(); - const result = sendTransaction(svm, transaction, [ + sendTransactionThrowError(svm, transaction, [ firstPositionOwner, secondPositionOwner, ]); - - return result; } export function getPool(svm: LiteSVM, pool: PublicKey): Pool { @@ -2474,31 +2419,36 @@ export async function buildSwapTestTxs(params: { }): Promise<{ swapTestTx: Transaction; swapPinocchioTx: Transaction }> { const program = createCpAmmProgram(); const swapTestTx = await getSwapTransaction(program.methods.swapTest, params); - const swapPinocchioTx = await getSwapTransaction(program.methods.swap2, params); + const swapPinocchioTx = await getSwapTransaction( + program.methods.swap2, + params + ); return { swapTestTx, swapPinocchioTx }; } - -async function getSwapTransaction(swapMethod, params: { - payer: PublicKey; - pool: PublicKey; - tokenAMint: PublicKey; - tokenBMint: PublicKey; - inputTokenAccount: PublicKey; - outputTokenAccount: PublicKey; - tokenAVault: PublicKey; - tokenBVault: PublicKey; - tokenAProgram: PublicKey; - tokenBProgram: PublicKey; - poolAuthority?: PublicKey; - eventAuthority?: PublicKey; - programPk?: PublicKey; - sysvarInstructionPubkey?: PublicKey; - referralAccount?: PublicKey; - amount0: BN; - amount1: BN; - swapMode: number; -}): Promise { +async function getSwapTransaction( + swapMethod, + params: { + payer: PublicKey; + pool: PublicKey; + tokenAMint: PublicKey; + tokenBMint: PublicKey; + inputTokenAccount: PublicKey; + outputTokenAccount: PublicKey; + tokenAVault: PublicKey; + tokenBVault: PublicKey; + tokenAProgram: PublicKey; + tokenBProgram: PublicKey; + poolAuthority?: PublicKey; + eventAuthority?: PublicKey; + programPk?: PublicKey; + sysvarInstructionPubkey?: PublicKey; + referralAccount?: PublicKey; + amount0: BN; + amount1: BN; + swapMode: number; + } +): Promise { const { payer, pool, @@ -2519,12 +2469,11 @@ async function getSwapTransaction(swapMethod, params: { sysvarInstructionPubkey, referralAccount, } = params; - const tx = await swapMethod - ({ - amount0, - amount1, - swapMode, - }) + const tx = await swapMethod({ + amount0, + amount1, + swapMode, + }) .accountsStrict({ poolAuthority: poolAuthority ?? derivePoolAuthority(), pool, @@ -2550,4 +2499,4 @@ async function getSwapTransaction(swapMethod, params: { ]) .transaction(); return tx; -} \ No newline at end of file +} diff --git a/tests/helpers/svm.ts b/tests/helpers/svm.ts index 5397ee1b..97a75ad3 100644 --- a/tests/helpers/svm.ts +++ b/tests/helpers/svm.ts @@ -1,7 +1,6 @@ import { base64 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; import { PublicKey, Signer, SystemProgram, Transaction } from "@solana/web3.js"; import BN from "bn.js"; -import { expect } from "chai"; import { AccountInfoBytes, FailedTransactionMetadata, @@ -55,7 +54,7 @@ export function sendTransaction( svm: LiteSVM, transaction: Transaction, signers: Signer[] -) { +): TransactionMetadata | FailedTransactionMetadata { transaction.recentBlockhash = svm.latestBlockhash(); transaction.sign(...signers); const result = svm.sendTransaction(transaction); @@ -64,29 +63,44 @@ export function sendTransaction( return result; } -export function sendTransactionOrExpectThrowError( +export function sendTransactionThrowError( svm: LiteSVM, transaction: Transaction, - logging = false, - errorCode?: number -) { + signers: Signer[] +): TransactionMetadata { + transaction.recentBlockhash = svm.latestBlockhash(); + transaction.sign(...signers); const result = svm.sendTransaction(transaction); - if (logging) { - if (result instanceof TransactionMetadata) { - console.log(result.logs()); - } else { - console.log(result.meta().logs()); - } - } - if (errorCode) { - expectThrowsErrorCode(result, errorCode); - } else { - expect(result).instanceOf(TransactionMetadata); + svm.expireBlockhash(); + + if (result instanceof FailedTransactionMetadata) { + throw Error(result.meta().logs().toString()); } return result; } +export async function expectThrowsErrorMessage( + fn: () => Promise, + errorMessage: String +) { + try { + await fn(); + } catch (err) { + if (!(err instanceof Error)) { + throw err; + } else { + if (!err.message.toLowerCase().includes(errorMessage.toLowerCase())) { + throw new Error( + `Unexpected error: ${err.message}. Expected error: ${errorMessage}` + ); + } + return; + } + } + throw new Error("Expected an error but didn't get one"); +} + export function expectThrowsErrorCode( response: TransactionMetadata | FailedTransactionMetadata, errorCode: number diff --git a/tests/permissionLessTransferHook.test.ts b/tests/permissionLessTransferHook.test.ts index ce01b75e..903d24f6 100644 --- a/tests/permissionLessTransferHook.test.ts +++ b/tests/permissionLessTransferHook.test.ts @@ -1,26 +1,28 @@ -import { expect } from "chai"; -import { generateKpAndFund } from "./helpers/common"; import { Keypair, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; +import { expect } from "chai"; +import { LiteSVM } from "litesvm"; import { createConfigIx, CreateConfigParams, + createOperator, + createToken, + encodePermissions, + expectThrowsErrorMessage, + getCpAmmProgramErrorCode, getPool, initializePool, InitializePoolParams, - MIN_LP_AMOUNT, MAX_SQRT_PRICE, + MIN_LP_AMOUNT, MIN_SQRT_PRICE, - setPoolStatus, - createToken, mintSplTokenTo, - getCpAmmProgramErrorCode, OperatorPermission, - createOperator, - encodePermissions, + setPoolStatus, startSvm, - expectThrowsErrorCode, } from "./helpers"; -import BN from "bn.js"; +import { generateKpAndFund } from "./helpers/common"; +import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; import { createToken2022, createTransferHookExtensionWithInstruction, @@ -28,8 +30,6 @@ import { revokeAuthorityAndProgramIdTransferHook, } from "./helpers/token2022"; import { createExtraAccountMetaListAndCounter } from "./helpers/transferHook"; -import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Permissionless transfer hook", () => { let svm: LiteSVM; @@ -142,8 +142,9 @@ describe("Permissionless transfer hook", () => { }; const errorCode = getCpAmmProgramErrorCode("InvalidTokenBadge"); - const { result } = await initializePool(svm, initPoolParams); - expectThrowsErrorCode(result, errorCode); + await expectThrowsErrorMessage(async () => { + await initializePool(svm, initPoolParams); + }, "InvalidTokenBadge"); // revoke program id diff --git a/tests/rateLimiter.test.ts b/tests/rateLimiter.test.ts index 5a423b61..0491583f 100644 --- a/tests/rateLimiter.test.ts +++ b/tests/rateLimiter.test.ts @@ -6,6 +6,7 @@ import { } from "@solana/web3.js"; import BN from "bn.js"; import { expect } from "chai"; +import { LiteSVM } from "litesvm"; import { CreateConfigParams, InitializeCustomizablePoolParams, @@ -13,27 +14,26 @@ import { MAX_SQRT_PRICE, MIN_LP_AMOUNT, MIN_SQRT_PRICE, + OperatorPermission, createConfigIx, + createOperator, createToken, + encodePermissions, + expectThrowsErrorCode, + generateKpAndFund, + getCpAmmProgramErrorCode, getPool, initializeCustomizablePool, initializePool, mintSplTokenTo, + randomID, + sendTransaction, + startSvm, swapExactIn, swapInstruction, - OperatorPermission, - encodePermissions, - createOperator, - generateKpAndFund, - randomID, warpSlotBy, - startSvm, - getCpAmmProgramErrorCode, - sendTransaction, - expectThrowsErrorCode, } from "./helpers"; import { encodeFeeRateLimiterParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Rate limiter", () => { let svm: LiteSVM; diff --git a/tests/rewardByCreator.test.ts b/tests/rewardByCreator.test.ts index 049a6988..d50c16d4 100644 --- a/tests/rewardByCreator.test.ts +++ b/tests/rewardByCreator.test.ts @@ -1,43 +1,42 @@ -import { generateKpAndFund } from "./helpers/common"; import { Keypair, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; +import { LiteSVM } from "litesvm"; +import { describe } from "mocha"; import { addLiquidity, AddLiquidityParams, claimReward, createConfigIx, CreateConfigParams, + createOperator, createPosition, + createToken, + encodePermissions, + expectThrowsErrorMessage, fundReward, getPool, initializePool, InitializePoolParams, initializeReward, InitializeRewardParams, - MIN_LP_AMOUNT, MAX_SQRT_PRICE, + MIN_LP_AMOUNT, MIN_SQRT_PRICE, - updateRewardDuration, - updateRewardFunder, - withdrawIneligibleReward, - createToken, mintSplTokenTo, - encodePermissions, OperatorPermission, - createOperator, startSvm, + updateRewardDuration, + updateRewardFunder, warpToTimestamp, - getCpAmmProgramErrorCode, - expectThrowsErrorCode, + withdrawIneligibleReward, } from "./helpers"; -import BN from "bn.js"; -import { describe } from "mocha"; +import { generateKpAndFund } from "./helpers/common"; +import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; import { createToken2022, createTransferFeeExtensionWithInstruction, mintToToken2022, } from "./helpers/token2022"; -import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Reward by creator", () => { // SPL-Token @@ -261,10 +260,9 @@ describe("Reward by creator", () => { rewardMint, funder: creator.publicKey, }; - - const errorCode = getCpAmmProgramErrorCode("InvalidRewardIndex"); - const res = await initializeReward(svm, initRewardParams); - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await initializeReward(svm, initRewardParams); + }, "InvalidRewardIndex"); }); }); @@ -529,9 +527,10 @@ describe("Reward by creator", () => { rewardMint, funder: creator.publicKey, }; - const errorCode = getCpAmmProgramErrorCode("InvalidRewardIndex"); - const res = await initializeReward(svm, initRewardParams); - expectThrowsErrorCode(res, errorCode); + + await expectThrowsErrorMessage(async () => { + await initializeReward(svm, initRewardParams); + }, "InvalidRewardIndex"); }); }); }); diff --git a/tests/splitPosition.test.ts b/tests/splitPosition.test.ts index a92ec32e..d28c9524 100644 --- a/tests/splitPosition.test.ts +++ b/tests/splitPosition.test.ts @@ -1,36 +1,34 @@ -import { expect } from "chai"; -import { generateKpAndFund } from "./helpers/common"; import { Keypair, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; +import { expect } from "chai"; +import { LiteSVM } from "litesvm"; import { + addLiquidity, createConfigIx, CreateConfigParams, + createOperator, + createPosition, + createToken, + derivePositionNftAccount, + encodePermissions, + expectThrowsErrorMessage, getPool, + getPosition, initializePool, InitializePoolParams, - MIN_LP_AMOUNT, MAX_SQRT_PRICE, + MIN_LP_AMOUNT, MIN_SQRT_PRICE, - createToken, mintSplTokenTo, - createPosition, - getPosition, - splitPosition, - derivePositionNftAccount, - permanentLockPosition, - U64_MAX, - addLiquidity, - swapExactIn, - convertToByteArray, OperatorPermission, - encodePermissions, - createOperator, + permanentLockPosition, + splitPosition, startSvm, - getCpAmmProgramErrorCode, - expectThrowsErrorCode, + swapExactIn, + U64_MAX, } from "./helpers"; -import BN from "bn.js"; +import { generateKpAndFund } from "./helpers/common"; import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Split position", () => { let svm: LiteSVM; @@ -130,7 +128,7 @@ describe("Split position", () => { }); it("Cannot split two same position", async () => { - const positionState = await getPosition(svm, position); + const positionState = getPosition(svm, position); const splitParams = { unlockedLiquidityPercentage: 50, @@ -141,19 +139,22 @@ describe("Split position", () => { reward1Percentage: 0, }; - const errorCode = getCpAmmProgramErrorCode("SamePosition"); - const res = await splitPosition(svm, { - firstPositionOwner: creator, - secondPositionOwner: creator, - pool, - firstPosition: position, - secondPosition: position, - firstPositionNftAccount: derivePositionNftAccount(positionState.nftMint), - secondPositionNftAccount: derivePositionNftAccount(positionState.nftMint), - ...splitParams, - }); - - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await splitPosition(svm, { + firstPositionOwner: creator, + secondPositionOwner: creator, + pool, + firstPosition: position, + secondPosition: position, + firstPositionNftAccount: derivePositionNftAccount( + positionState.nftMint + ), + secondPositionNftAccount: derivePositionNftAccount( + positionState.nftMint + ), + ...splitParams, + }); + }, "SamePosition"); }); it("Invalid parameters", async () => { @@ -175,25 +176,22 @@ describe("Split position", () => { reward0Percentage: 0, reward1Percentage: 0, }; - - const errorCode = getCpAmmProgramErrorCode( - "InvalidSplitPositionParameters" - ); - - const res = await splitPosition(svm, { - firstPositionOwner: creator, - secondPositionOwner: user, - pool, - firstPosition: position, - secondPosition, - firstPositionNftAccount: derivePositionNftAccount(positionState.nftMint), - secondPositionNftAccount: derivePositionNftAccount( - secondPositionState.nftMint - ), - ...splitParams, - }); - - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await splitPosition(svm, { + firstPositionOwner: creator, + secondPositionOwner: user, + pool, + firstPosition: position, + secondPosition, + firstPositionNftAccount: derivePositionNftAccount( + positionState.nftMint + ), + secondPositionNftAccount: derivePositionNftAccount( + secondPositionState.nftMint + ), + ...splitParams, + }); + }, "InvalidSplitPositionParameters"); }); it("Split position into two position", async () => { diff --git a/tests/splitPosition2.test.ts b/tests/splitPosition2.test.ts index 847efe15..a3d5a5a8 100644 --- a/tests/splitPosition2.test.ts +++ b/tests/splitPosition2.test.ts @@ -1,36 +1,35 @@ -import { expect } from "chai"; -import { generateKpAndFund } from "./helpers/common"; import { Keypair, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; +import { expect } from "chai"; +import { LiteSVM } from "litesvm"; import { + addLiquidity, createConfigIx, CreateConfigParams, + createOperator, + createPosition, + createToken, + derivePositionNftAccount, + encodePermissions, + expectThrowsErrorMessage, getPool, + getPosition, initializePool, InitializePoolParams, - MIN_LP_AMOUNT, MAX_SQRT_PRICE, + MIN_LP_AMOUNT, MIN_SQRT_PRICE, - createToken, mintSplTokenTo, - createPosition, - getPosition, - splitPosition2, - derivePositionNftAccount, + OperatorPermission, permanentLockPosition, - U64_MAX, - addLiquidity, SPLIT_POSITION_DENOMINATOR, - swapExactIn, - createOperator, - OperatorPermission, - encodePermissions, + splitPosition2, startSvm, - getCpAmmProgramErrorCode, - expectThrowsErrorCode, + swapExactIn, + U64_MAX, } from "./helpers"; -import BN from "bn.js"; +import { generateKpAndFund } from "./helpers/common"; import { BaseFeeMode, encodeFeeTimeSchedulerParams } from "./helpers/feeCodec"; -import { LiteSVM } from "litesvm"; describe("Split position 2", () => { let svm: LiteSVM; @@ -127,19 +126,22 @@ describe("Split position 2", () => { const numerator = SPLIT_POSITION_DENOMINATOR / 2; - const errorCode = getCpAmmProgramErrorCode("SamePosition"); - const res = await splitPosition2(svm, { - firstPositionOwner: creator, - secondPositionOwner: creator, - pool, - firstPosition: position, - secondPosition: position, - firstPositionNftAccount: derivePositionNftAccount(positionState.nftMint), - secondPositionNftAccount: derivePositionNftAccount(positionState.nftMint), - numerator, - }); - - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await splitPosition2(svm, { + firstPositionOwner: creator, + secondPositionOwner: creator, + pool, + firstPosition: position, + secondPosition: position, + firstPositionNftAccount: derivePositionNftAccount( + positionState.nftMint + ), + secondPositionNftAccount: derivePositionNftAccount( + positionState.nftMint + ), + numerator, + }); + }, "SamePosition"); }); it("Invalid parameters", async () => { @@ -150,29 +152,27 @@ describe("Split position 2", () => { user.publicKey, pool ); - const positionState = await getPosition(svm, position); - const secondPositionState = await getPosition(svm, secondPosition); + const positionState = getPosition(svm, position); + const secondPositionState = getPosition(svm, secondPosition); const numerator = 0; - const errorCode = getCpAmmProgramErrorCode( - "InvalidSplitPositionParameters" - ); - - const res = await splitPosition2(svm, { - firstPositionOwner: creator, - secondPositionOwner: user, - pool, - firstPosition: position, - secondPosition, - firstPositionNftAccount: derivePositionNftAccount(positionState.nftMint), - secondPositionNftAccount: derivePositionNftAccount( - secondPositionState.nftMint - ), - numerator, - }); - - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await splitPosition2(svm, { + firstPositionOwner: creator, + secondPositionOwner: user, + pool, + firstPosition: position, + secondPosition, + firstPositionNftAccount: derivePositionNftAccount( + positionState.nftMint + ), + secondPositionNftAccount: derivePositionNftAccount( + secondPositionState.nftMint + ), + numerator, + }); + }, "InvalidSplitPositionParameters"); }); it("Split position into two position", async () => { diff --git a/tests/updatePoolFees.test.ts b/tests/updatePoolFees.test.ts index 0c68c087..165efd1a 100644 --- a/tests/updatePoolFees.test.ts +++ b/tests/updatePoolFees.test.ts @@ -1,32 +1,33 @@ -import { generateKpAndFund } from "./helpers/common"; import { Keypair, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; +import { expect } from "chai"; +import { LiteSVM } from "litesvm"; import { - InitializeCustomizablePoolParams, + createCpAmmProgram, + createOperator, + createToken, + DynamicFee, + encodePermissions, + expectThrowsErrorMessage, + getDefaultDynamicFee, + getDynamicFeeParams, + getFeeShedulerParams, + getPool, initializeCustomizablePool, - MIN_LP_AMOUNT, + InitializeCustomizablePoolParams, MAX_SQRT_PRICE, + MIN_LP_AMOUNT, MIN_SQRT_PRICE, mintSplTokenTo, - createToken, - updatePoolFeesParameters, - getDynamicFeeParams, - getFeeShedulerParams, - encodePermissions, - createOperator, OperatorPermission, - DynamicFee, - getDefaultDynamicFee, - getPool, - createCpAmmProgram, + startSvm, swapExactIn, SwapParams, - startSvm, - getCpAmmProgramErrorCode, - expectThrowsErrorCode, + updatePoolFeesParameters, warpSlotBy, warpTimestampToPassfilterPeriod, } from "./helpers"; -import BN from "bn.js"; +import { generateKpAndFund } from "./helpers/common"; import { BaseFeeMode, decodeFeeMarketCapSchedulerParams, @@ -36,8 +37,6 @@ import { encodeFeeRateLimiterParams, encodeFeeTimeSchedulerParams, } from "./helpers/feeCodec"; -import { expect } from "chai"; -import { LiteSVM } from "litesvm"; describe("Admin update pool fees parameters", () => { let svm: LiteSVM; @@ -304,14 +303,14 @@ describe("Admin update pool fees parameters", () => { }; await swapExactIn(svm, swapParams); - const errorCode = getCpAmmProgramErrorCode("CannotUpdateBaseFee"); - const res = await updatePoolFeesParameters(svm, { - whitelistedOperator, - pool: poolAddress, - cliffFeeNumerator, - dynamicFee: null, - }); - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await updatePoolFeesParameters(svm, { + whitelistedOperator, + pool: poolAddress, + cliffFeeNumerator, + dynamicFee: null, + }); + }, "CannotUpdateBaseFee"); warpSlotBy(svm, new BN(10000)); @@ -374,14 +373,14 @@ describe("Admin update pool fees parameters", () => { // update new cliff fee numerator const cliffFeeNumerator = new BN(5_000_000); - const errorCode = getCpAmmProgramErrorCode("CannotUpdateBaseFee"); - const res = await updatePoolFeesParameters(svm, { - whitelistedOperator, - pool: poolAddress, - cliffFeeNumerator, - dynamicFee: null, - }); - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await updatePoolFeesParameters(svm, { + whitelistedOperator, + pool: poolAddress, + cliffFeeNumerator, + dynamicFee: null, + }); + }, "CannotUpdateBaseFee"); warpSlotBy(svm, new BN(10000)); @@ -454,14 +453,14 @@ describe("Admin update pool fees parameters", () => { // update new cliff fee numerator const cliffFeeNumerator = new BN(5_000_000); - const errorCode = getCpAmmProgramErrorCode("CannotUpdateBaseFee"); - const res = await updatePoolFeesParameters(svm, { - whitelistedOperator, - pool: poolAddress, - cliffFeeNumerator, - dynamicFee: null, - }); - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await updatePoolFeesParameters(svm, { + whitelistedOperator, + pool: poolAddress, + cliffFeeNumerator, + dynamicFee: null, + }); + }, "CannotUpdateBaseFee"); warpSlotBy(svm, maxRateLimiterDuration.addn(1)); @@ -536,14 +535,14 @@ describe("Admin update pool fees parameters", () => { cliffFeeNumerator = new BN(5_000_000); const dynamicFeeParams = getDynamicFeeParams(cliffFeeNumerator); - const errorCode = getCpAmmProgramErrorCode("CannotUpdateBaseFee"); - const res = await updatePoolFeesParameters(svm, { - whitelistedOperator, - pool: poolAddress, - cliffFeeNumerator, - dynamicFee: dynamicFeeParams, - }); - expectThrowsErrorCode(res, errorCode); + await expectThrowsErrorMessage(async () => { + await updatePoolFeesParameters(svm, { + whitelistedOperator, + pool: poolAddress, + cliffFeeNumerator, + dynamicFee: dynamicFeeParams, + }); + }, "CannotUpdateBaseFee"); warpSlotBy(svm, schedulerExpirationDuration.addn(1));