Create: DLMM Launch Pool with Alpha Vault
Last updated
Last updated
is a special pool type designed for new token launches.
It is based on DLMM and comes fundamentally equipped with a feature set that makes it optimal for bootstrapping liquidity for new tokens and making the tokens accessible on Jupiter and other trading integrations.
DLMM Launch Pools can also be created with an Alpha Vault as part of the token launch process. This is optional.
Alpha Vault is a new anti-bot tool to guard against sniper bots and allow genuine supporters to be the first to buy tokens at launch.
Below we provide the steps to use Bun to configure and run sample scripts to conveniently set up a DLMM Launch Pool with Alpha Vault on your own.
Readme:
DLMM SDK on github:
DLMM API endpoints:
Alpha Vault SDK:
Devnet:
Install Bun: You'll also need to run the scripts. Install it via . Then install the dependencies by running the command bun install
The following code examples can be used to initialize and seed a DLMM liquidity pool on Meteora using a customizable permissionless liquidity bin pair (LB pair). It allows you to configure parameters for the pool, including fees, pricing, curvature, and activation conditions, before executing initialization and seeding commands.
We also have code examples for interacting with the Alpha Vault program. Use these examples to create and manage vaults, handle deposits and withdrawals, manage permissioned and permissionless vault configurations, and interact with escrow accounts.
Run the script with the config file which is updated with your preferred parameters.
For example, run:
bun run src/create_pool.ts --config <./config/create_dlmm_pool.json>
Replace <./config/create_dlmm_pool.json>
with the path to your config file, after you have set your config parameters.
Important Notes:
The max bin step you can set for a DLMM pool is 400 bin step.
When creating a DLMM pool, there are 3 roles in position that you can config:
Position Owner: Wallet that owns the liquidity
Operator: Wallet that can deposit and withdraw tokens on behalf of the Position Owner
Fee Owner: Wallet that gets the fees from that position
During the initialization of the DLMM pool, pool creator needs to have at least 1 lamport worth of the base token in the wallet to prove ownership.
If you plan to use a multisig on the Meteora website, please make sure it is the SquadsX multisig, as that is the only type supported on Meteora website. Otherwise, you can't manage liquidity through the website.
This is the standard type of token launch liquidity distribution used by past LFG projects such as JUP, WEN, CLOUD etc.
Run the script with the config file which is set with your preferred parameters.
For example, run:
bun run src/seed_liquidity_lfg.ts --config <./config/seed_liquidity_lfg.json>
Replace <./config/seed_liquidity_lfg.json>
with the path to your config file, after you have set your config parameters.
This is a unique token launch strategy where all liquidity is allocated into a single bin.
Run the script with the config file which is set with your preferred parameters.
For example, run:
bun run src/seed_liquidity_single_bin.ts --config <./config/seed_liquidity_single_bin.json>
Replace <./config/seed_liquidity_single_bin.json>
with the path to your config file, after you have set your config parameters.
Important Notes:
When seeding liquidity using the endpoint, both Operator and Position Owner need to have base tokens to prove ownership. If the Position Owner doesn't have any base tokens, then the Operator will need to send 1 lamport worth of the base token to Position Owner. But the script will check if Position Owner has tokens and if not, it will bundle a transfer instruction to send 1 lamport worth of the base token from the Operator to the Position Owner.
In the code example, lock_release_point
refers to the time the liquidity position can be withdrawn. If it is set to zero, it means the position can be withdrawn immediately after trading starts.
If you plan to use a multisig on the Meteora website, please make sure it is the SquadsX multisig, as that is the only type supported on Meteora website. Otherwise, you can't manage liquidity through the website.
You are able to disable the pool prior to pool activation time (before trading starts) and enable it later before or after pool activation time. After pool activation time, once enabled the pool cannot be disabled by you again.
Run the script with the config file which is set with your preferred parameters.
For example, run:
bun run src/set_dlmm_pool_status.ts --config <./config/set_dlmm_pool_status.json>
Replace <./config/set_dlmm_pool_status.json>
with the path to your config file, after you have set your config parameters.
Change the parameters in the config according to your needs.
Run the config after it has been updated with your parameters:
bun run src/create_alpha_vault.ts --config ./config/create_dlmm_pool_with_prorata_alpha_vault.json
Change the parameters in the config according to your needs.
Run the config after it has been updated with your parameters:
bun run src/create_alpha_vault.ts --config ./config/create_dlmm_pool_with_fcfs_alpha_vault.json
Change the parameters in the config according to your needs.
Use
"whitelistMode": "permissioned_with_authority"
"whitelistFilepath": "./config/whitelist_wallet.csv"
Run the config after it has been updated with your parameters:
bun run src/create_alpha_vault.ts --config ./config/create_dlmm_pool_with_prorata_alpha_vault.json
For some launches, the project may want to restrict which wallet addresses are allowed to deposit funds into the Alpha Vault, so in the config file used in the script to create the Alpha Vault, the whitelistMode
needs to be specified.
permissionless
: No whitelist, anyone can deposit into the Alpha Vault
permission_with_authority
: Only wallets that are whitelisted can deposit into the Alpha Vault
Important Notes:
If you do not want to use Alpha Vault, skip this step.
Currently, only SOL or USDC is accepted as the quote token when initializing a Dynamic AMM or DLMM Pool with Alpha Vault in a permissionless setup. Since the Alpha Vault can't tell what the quote token would be, the quote token is limited to SOL or USDC. However, any quote token can be used if you use a config key that doesn't have Alpha Vault.
There is a minimum ~1 hour 5 minutes period between the deposit close time and the pool activation time.
Crank start point (time when vault buys tokens from the pool):
Timestamp-based Crank start point = activationPoint - 3600
Slot-based Crank start point = activationPoint - 9000
Vault deposit close point (time when vault deposits close):
Timestamp-based Vault, Deposit close point = Crank start point - 5 min
Slot-based Vault, Deposit close point = Crank start point - 750
To view pool on the UI, access the link below
For DLMM pool: https://app.meteora.ag/dlmm/<POOL_ADDRESS>
CustomizablePermissionless DLMM: After pool activation point (trading starts)
There are various config files that can be found in the config
directory.
It contains all the configurations required to run the scripts. We also need to provide the keypair for the payer wallet in keypair.json
file.
rpcUrl
: Solana RPC URL to get data and send transactions.
keypairFilePath
: Keypair file path to send transactions.
dryRun
: Set to true to send transactions.
computeUnitPriceMicroLamports
: CU price in micro lamports unit. For example: 100000.
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.
dlmm
: DLMM pool configuration.
createBaseToken
and baseMint
cannot be used together.
dynamicAmm
and dlmm
cannot be used together.
mintBaseTokenAmount
: Base token amount to be minted.
binStep
: DLMM pool bin step.
feeBps
: Fee bps for DLMM pool.
initialPrice
: Initial pool price.
activationType
: To activate pool trading based on slot
or timestamp
.
activationPoint
: To activate pool trading at a point, either slot valut or timestamp value based on activationType
.
priceRounding
: Should be up
or down
.
hasAlphaVault
: Whether alpha vault is enabled or not for this pool.
creatorPoolOnOffControl
: Allow creator to turn on/off pool control.
Note: When using the endpoint instruction initializeCustomizablePermissionlessLbPair
the purpose is for creating a launch pool for the token for the first time, so only one DLMM pool is meant to be created for that token pair. If you are using that instruction to create a new DLMM pool with the same base and quote tokens, but with different parameters, the transaction will fail. Pool creator must have at least 1 lamport worth of the base token in the wallet to prove ownership.
poolType
: dynamic
or dlmm
pool type.
alphaVaultType
: Alpha Vault type, could be fcfs
or prorata
depositingPoint
: Absolute value that, the slot or timestamp that allows deposit depend on the pool activation type.
startVestingPoint
: Absolute value, the slot or timestamp that start vesting depend on the pool activation type.
endVestingPoint
: Absolute value, the slot or timestamp that end vesting depend on the pool activation type.
maxDepositCap
: Maximum deposit cap.
individualDepositingCap
: Individual deposit cap.
escrowFee
: Fee to create stake escrow account. If this fee is added, it will be a one-time fee charged when users create a stake escrow account. This acts as a tax and makes it prohibitively expensive for users to attempt to use multiple wallets to bypass the individual deposit cap. It's charged in native SOL (non-wrapped version) and will be sent to the Meteora treasury.
whitelistMode
: permissionless
or permission_with_merkle_proof
or permission_with_authority
.
depositingPoint
: Absolute value that, the slot or timestamp that allows deposit depend on the pool activation type.
startVestingPoint
: Absolute value, the slot or timestamp that start vesting depend on the pool activation type.
endVestingPoint
: Absolute value, the slot or timestamp that end vesting depend on the pool activation type.
maxBuyingCap
: Maximum buying cap.
escrowFee
: Fee to create stake escrow account. If this fee is added, it will be a one-time fee charged when users create a stake escrow account. This acts as a tax and makes it prohibitively expensive for users to attempt to use multiple wallets to bypass the individual deposit cap. It's charged in native SOL (non-wrapped version) and will be sent to the Meteora treasury.
whitelistMode
: permissionless
or permission_with_merkle_proof
or permission_with_authority
.
Vault Types: Supports both permissionless (without whitelist) and permissioned (with whitelist) Alpha Vaults.
Whitelist Modes:
Without whitelist:
Permissionless
With whitelist:
PermissionWithMerkleProof
PermissionWithAuthority
alphaVaultType (Vault Mode):
Pro-rata
FCFS
(First-Come, First-Served)
Individual Deposit Cap:
Global individual deposit cap without whitelist only possible on FCFS vault mode, not possible on Pro rata vault mode.
First, run the localnet
Then run the test: bun test
Clone repo:
Select an example config to reference and change the parameters inside according to your needs:
You can first use this to determine the suitable parameters for your launch.
Reference this config file and set your preferred parameters.
Reference this config file and set your preferred parameters.
Reference this config file and set your preferred parameters.
Reference this example config:
Reference this example config:
Reference this example config:
Replace ./config/whitelist_wallet.csv
with your .
permission_with_merkle_proof
: Only wallets that are whitelisted can deposit into the Alpha Vault. needs to be provided by the project to Meteora, for the Merkle proof to be hosted by Meteora.
After creating the Alpha Vault for your pool, check out the for different ways to interact with it. For example, depositing funds into the Alpha Vault, cranking the Alpha Vault to buy tokens from the pool, or claiming purchased tokens from the Alpha Vault.
Please read our .