Skip to content

Commit

Permalink
Merge pull request #20 from MeteoraAg/fix/quote-token
Browse files Browse the repository at this point in the history
fix: Allow create DLMM launch pool with every quote token without alpha vault
  • Loading branch information
quangkeu95 authored Feb 3, 2025
2 parents 0129812 + 3f38a12 commit f1fcd63
Show file tree
Hide file tree
Showing 17 changed files with 166 additions and 24 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

## [1.4.0] - 2025-01-27 - [PR #8](https://github.com/MeteoraAg/meteora-pool-setup/pull/20)
### Added
- Add field `quoteMint` in configuration.

### Changed
- Make field `quoteSymbol` to be optional in configuration.
-

## [1.3.0] - 2025-01-21 - [PR #8](https://github.com/MeteoraAg/meteora-pool-setup/pull/13)
### Added
- Script to create M3M3 fee farm.
Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Also we need to provide the keypair for the payer wallet in `keypair.json` file.
- `createBaseToken`: Configuration to create base token.
- `baseMint`: Base token address if the `createBaseToken` field is not set.
- `quoteSymbol`: Quote token symbol, only `SOL` or `USDC` is supported.
- `quoteMint`: Quote token mint, in case the user wants to create a DLMM launch pool with a token other than SOL or USDC.
- `dynamicAmm`: Dynamic AMM pool configuration.
- `dlmm`: DLMM pool configuration.
- `alphaVault`: Fcfs or Prorata Alpha Vault configuration.
Expand Down Expand Up @@ -100,6 +101,11 @@ bun run src/create_pool.ts --config ./config/create_dynamic_amm_pool_with_new_to
bun run src/create_pool.ts --config ./config/create_dlmm_pool.json
```

** Create new DLMM pool without strict quote token**
```bash
bun run src/create_pool.ts --config ./config/create_dlmm_pool_without_strict_quote_token.json
```

** Create new DLMM pool with alpha vault**
```bash
bun run src/create_pool.ts --config ./config/create_dlmm_pool_with_fcfs_alpha_vault.json
Expand Down
Binary file modified bun.lockb
Binary file not shown.
17 changes: 17 additions & 0 deletions config/create_dlmm_pool_without_strict_quote_token.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"rpcUrl": "https://api.mainnet-beta.solana.com",
"dryRun": true,
"keypairFilePath": "keypair.json",
"computeUnitPriceMicroLamports": 100000,
"baseMint": "5e3ACTUsKDXgwLjnsjELtohL3Wv2tei7Nu6ZS6UeMj7w",
"quoteMint": "8QEgDzA1XBcX7WGHvKaBT1eZGST6jmZBqW6B8weEoUw5",
"dlmm": {
"binStep": 400,
"feeBps": 200,
"initialPrice": 0.0000017,
"activationType": "slot",
"activationPoint": null,
"priceRounding": "up",
"hasAlphaVault": false
}
}
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "meteora_pool_setup",
"version": "1.3.0",
"version": "1.4.0",
"main": "index.js",
"scripts": {
"format": "bun prettier ./src --write",
Expand All @@ -13,7 +13,7 @@
"@coral-xyz/anchor": "^0.28.0",
"@mercurial-finance/dynamic-amm-sdk": "^1.1.19",
"@meteora-ag/alpha-vault": "^1.1.8",
"@meteora-ag/dlmm": "^1.3.5",
"@meteora-ag/dlmm": "^1.3.10",
"@meteora-ag/m3m3": "^1.0.5",
"@solana/spl-token": "^0.4.9",
"@solana/spl-token-registry": "^0.2.4574",
Expand Down
4 changes: 2 additions & 2 deletions src/create_alpha_vault.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ async function main() {
throw new Error("Missing baseMint in configuration");
}
const baseMint = new PublicKey(config.baseMint);
let quoteMint = getQuoteMint(config.quoteSymbol);
const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);
const quoteDecimals = await getQuoteDecimals(connection, config.quoteSymbol, config.quoteMint);

console.log(`- Using base token mint ${baseMint.toString()}`);
console.log(`- Using quote token mint ${quoteMint.toString()}`);
Expand Down
4 changes: 1 addition & 3 deletions src/create_m3m3_farm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { DEFAULT_COMMITMENT_LEVEL, M3M3_PROGRAM_IDS } from "./libs/constants";
import {
safeParseKeypairFromFile,
getQuoteMint,
getQuoteDecimals,
runSimulateTransaction,
} from "./libs/utils";
import { createTokenMint } from "./libs/create_token_mint";
Expand All @@ -22,7 +21,6 @@ import AmmImpl from "@mercurial-finance/dynamic-amm-sdk";
import StakeForFee, { deriveFeeVault } from "@meteora-ag/m3m3";
import {
create_m3m3_farm,
lockLiquidityToFeeVault,
} from "./libs/create_m3m3_farm_utils";

async function main() {
Expand All @@ -43,7 +41,7 @@ async function main() {
throw new Error("Missing baseMint in configuration");
}
let baseMint = new PublicKey(config.baseMint);
let quoteMint = getQuoteMint(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);
const ammProgram = createProgram(connection).ammProgram;
const poolKey = deriveCustomizablePermissionlessConstantProductPoolAddress(
baseMint,
Expand Down
2 changes: 1 addition & 1 deletion src/create_pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ async function main() {
const wallet = new Wallet(keypair);

let baseMint: PublicKey;
let quoteMint = getQuoteMint(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);

// If we want to create a new token mint
if (config.createBaseToken) {
Expand Down
11 changes: 8 additions & 3 deletions src/libs/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ const CONFIG_SCHEMA: JSONSchemaType<MeteoraConfig> = {
},
quoteSymbol: {
type: "string",
nullable: true,
},
quoteMint: {
type: "string",
nullable: true
},
dynamicAmm: {
type: "object",
Expand Down Expand Up @@ -248,8 +253,7 @@ const CONFIG_SCHEMA: JSONSchemaType<MeteoraConfig> = {
"rpcUrl",
"dryRun",
"keypairFilePath",
"computeUnitPriceMicroLamports",
"quoteSymbol",
"computeUnitPriceMicroLamports"
],
additionalProperties: true,
};
Expand All @@ -261,7 +265,8 @@ export interface MeteoraConfig {
computeUnitPriceMicroLamports: number;
createBaseToken: CreateBaseMintConfig | null;
baseMint: string | null;
quoteSymbol: string;
quoteSymbol?: string;
quoteMint?: string;
dynamicAmm: DynamicAmmConfig | null;
dlmm: DlmmConfig | null;
alphaVault: FcfsAlphaVaultConfig | ProrataAlphaVaultConfig | null;
Expand Down
5 changes: 3 additions & 2 deletions src/libs/create_pool_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export async function createPermissionlessDynamicPool(
}
console.log("\n> Initializing Permissionless Dynamic AMM pool...");

const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
const quoteDecimals = await getQuoteDecimals(connection, config.quoteSymbol, config.quoteMint);
const baseMintAccount = await getMint(connection, baseMint);
const baseDecimals = baseMintAccount.decimals;

Expand Down Expand Up @@ -162,7 +162,7 @@ export async function createPermissionlessDlmmPool(
console.log(`- Using activationPoint = ${activationPoint}`);
console.log(`- Using hasAlphaVault = ${hasAlphaVault}`);

const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
const quoteDecimals = await getQuoteDecimals(connection, config.quoteSymbol, config.quoteMint);
const baseMintAccount = await getMint(connection, baseMint);
const baseDecimals = baseMintAccount.decimals;

Expand Down Expand Up @@ -198,6 +198,7 @@ export async function createPermissionlessDlmmPool(
programId: dlmmProgramId,
},
);

modifyComputeUnitPriceIx(initPoolTx, config.computeUnitPriceMicroLamports);

let poolKey: PublicKey;
Expand Down
32 changes: 30 additions & 2 deletions src/libs/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import {
PriceRoundingConfig,
WhitelistModeConfig,
} from "..";
import { getMint } from "@solana/spl-token";

export const DEFAULT_ADD_LIQUIDITY_CU = 800_000;

Expand All @@ -57,6 +58,14 @@ export function extraConfigValidation(config: MeteoraConfig) {
);
}

if (config.dlmm && config.dlmm.hasAlphaVault) {
if (config.quoteSymbol == null && config.quoteMint == null) {
throw new Error(
"Either quoteSymbol or quoteMint must be provided for DLMM",
);
}
}

if (config.alphaVault) {
if (
config.alphaVault.alphaVaultType != "fcfs" &&
Expand Down Expand Up @@ -114,7 +123,18 @@ export function getDecimalizedAmount(amountLamport: BN, decimals: number): BN {
return amountLamport / new BN(10 ** decimals);
}

export function getQuoteMint(quoteSymbol: string): PublicKey {
export function getQuoteMint(quoteSymbol?: string, quoteMint?: string): PublicKey {
if (quoteSymbol == null && quoteMint == null) {
throw new Error(`Either quoteSymbol or quoteMint must be provided`);
}
if (quoteSymbol && quoteMint) {
throw new Error(`Cannot provide quoteSymbol and quoteMint at the same time`);
}

if (quoteMint) {
return new PublicKey(quoteMint);
}

if (quoteSymbol.toLowerCase() == "sol") {
return new PublicKey(SOL_TOKEN_MINT);
} else if (quoteSymbol.toLowerCase() == "usdc") {
Expand All @@ -124,7 +144,15 @@ export function getQuoteMint(quoteSymbol: string): PublicKey {
}
}

export function getQuoteDecimals(quoteSymbol: string): number {
export async function getQuoteDecimals(connection: Connection, quoteSymbol?: string, quoteMint?: string): Promise<number> {
if (quoteSymbol == null && quoteMint == null) {
throw new Error(`Either quoteSymbol or quoteMint must be provided`);
}
if (quoteMint) {
const mintAccount = await getMint(connection, new PublicKey(quoteMint));
const decimals = mintAccount.decimals;
return decimals;
}
if (quoteSymbol.toLowerCase() == "sol") {
return SOL_TOKEN_DECIMALS;
} else if (quoteSymbol.toLowerCase() == "usdc") {
Expand Down
4 changes: 2 additions & 2 deletions src/lock_liquidity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ async function main() {
throw new Error("Missing baseMint in configuration");
}
const baseMint = new PublicKey(config.baseMint);
let quoteMint = getQuoteMint(config.quoteSymbol);
const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);
const quoteDecimals = await getQuoteDecimals(connection, config.quoteSymbol, config.quoteMint);

console.log(`- Using base token mint ${baseMint.toString()}`);
console.log(`- Using quote token mint ${quoteMint.toString()}`);
Expand Down
4 changes: 2 additions & 2 deletions src/lock_liquidity_for_m3m3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ async function main() {
throw new Error("Missing baseMint in configuration");
}
const baseMint = new PublicKey(config.baseMint);
let quoteMint = getQuoteMint(config.quoteSymbol);
const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);
const quoteDecimals = await getQuoteDecimals(connection, config.quoteSymbol, config.quoteMint);

console.log(`- Using base token mint ${baseMint.toString()}`);
console.log(`- Using quote token mint ${quoteMint.toString()}`);
Expand Down
4 changes: 2 additions & 2 deletions src/seed_liquidity_lfg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ async function main() {
const baseMintAccount = await getMint(connection, baseMint);
const baseDecimals = baseMintAccount.decimals;

let quoteMint = getQuoteMint(config.quoteSymbol);
const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);
const quoteDecimals = await getQuoteDecimals(connection, config.quoteSymbol, config.quoteMint);

console.log(`- Using base token mint ${baseMint.toString()}`);
console.log(`- Using quote token mint ${quoteMint.toString()}`);
Expand Down
4 changes: 1 addition & 3 deletions src/seed_liquidity_single_bin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import {
MeteoraConfig,
getAmountInLamports,
getQuoteMint,
getQuoteDecimals,
safeParseKeypairFromFile,
parseConfigFromCli,
seedLiquiditySingleBin,
Expand Down Expand Up @@ -42,8 +41,7 @@ async function main() {
const baseMintAccount = await getMint(connection, baseMint);
const baseDecimals = baseMintAccount.decimals;

let quoteMint = getQuoteMint(config.quoteSymbol);
const quoteDecimals = getQuoteDecimals(config.quoteSymbol);
let quoteMint = getQuoteMint(config.quoteSymbol, config.quoteMint);

console.log(`- Using base token mint ${baseMint.toString()}`);
console.log(`- Using quote token mint ${quoteMint.toString()}`);
Expand Down
Binary file modified src/tests/artifacts/lb_clmm.so
Binary file not shown.
Loading

0 comments on commit f1fcd63

Please sign in to comment.