Permissionless DLMM with Alpha Vault Setup

Summary

Getting Started

Dependencies

Ensure that you have the required dependencies installed:

npm i @meteora-ag/dlmm @coral-xyz/anchor @solana/web3.js

  • Anchor: @coral-xyz/anchor

  • Solana Web3.js: @solana/web3.js

  • SPL-Token: @solana/spl-token

  • Install Bun: You'll also need bun to run the scripts. Install it via bun installation. Then install the dependencies by running the command bun install

Scripts

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.

1. Create DLMM pool

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.

  • The Meteora website only works with SquadsX multisig. If you are using multisig, make sure your multisig is using SquadsX, otherwise you can't manage liquidity through the website.

2. Create 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.

  • 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

3. Seed liquidity

Command
Description

ilm_curve.sh

Initialize DLMM position and seed liquidity using the ilm curve, without a specified Fee Owner. For this config, Position Owner = Fee Owner. Position Creator must be the Position Owner. https://github.com/MeteoraAg/dlmm-sdk/blob/feat/ilm-permissionless/command_list/ilm_curve.sh

ilm_curve_by_operator.sh

Initialize DLMM position and seed liquidity using the ilm curve. You can specify the Fee Owner wallet and the Position Owner wallet. You can also use the Operator to create the position. https://github.com/MeteoraAg/dlmm-sdk/blob/main/command_list/ilm_curve_by_operator.sh

ilm_single_bin.sh

Initialize DLMM position and seed liquidity, where liquidity is deposited into a single bin, without a specified Fee Owner. For this config, Position Owner = Fee Owner. Position Creator must be the Position Owner. https://github.com/MeteoraAg/dlmm-sdk/blob/feat/ilm-permissionless/command_list/ilm_single_bin.sh

ilm_single_bin_by_operator.sh

Initialize DLMM position and seed liquidity, where liquidity is deposited into a single bin. You can specify the Fee Owner wallet and the Position Owner wallet. You can also use the Operator to create the position. https://github.com/MeteoraAg/dlmm-sdk/blob/main/command_list/ilm_single_bin_by_operator.sh

  • Next, run:

    • source <ilm_curve_by_operator.sh>

    • Replace <ilm_curve_by_operator.sh> with the command file you selected earlier from the above command list, with your parameters specified.

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 tokens, then the Operator will need to send 1 lamport to Position Owner. But the script will check if Position Owner has tokens and if not, it will bundle a transfer instruction.

  • The commands in the command list above only work before the pool is activated for trading. If the pool has already started trading, when you use a command, there would be an error message shown (e.g. Error Message: Unauthorized access).

  • 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.

  • The Meteora website only works with SquadsX multisig. If you are using multisig, make sure your multisig is using SquadsX, otherwise you can't manage liquidity through the website.

After deployment

To view pool on the UI, access the link below

  • For DLMM pool: https://app.meteora.ag/dlmm/<POOL_ADDRESS>

Other Configuration Details

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.

General configuration

  • rpcUrl: Solana RPC URL to get data and send transactions.

  • keypairFilePath: Keypair file path to send transactions.

  • dryRun: Set to true to send transactions.

  • 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.

  • baseDecimals: Base token decimal.

  • dynamicAmm: Dynamic AMM pool configuration.

  • dlmm: DLMM pool configuration.

  • alphaVault: Fcfs or Prorata Alpha Vault configuration.

Some configuration constraints:

  • createBaseToken and baseMint cannot be used together.

  • dynamicAmm and dlmm cannot be used together.

Create Base Token configuration

  • mintBaseTokenAmount: Base token amount to be minted.

DLMM configuration

  • binStep: DLMM pool bin step.

  • feeBps: Fee bps for DLMM pool.

  • initialPrice: Initial pool price.

  • activationType: To activate pool trading base on slot or timestamp.

  • activationPoint: To activate pool trading at a point, either slot valut or timestamp value base on activationType.

  • priceRounding: Should be up or down.

  • hasAlphaVault: Whether alpha vault is enabled or not for this pool.

NOTICE: Only one DLMM pool can be created with the same base and quote tokens, using the instruction initializeCustomizablePermissionlessLbPair. So if you are using that instruction to create a new DLMM pool with the same base and quote tokens, but with different parameters, then the transaction will fail.

Alpha Vault configuration

  • 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.

  • whitelistMode: permissionless or permission_with_merkle_proof or permission_with_authority.

Alpha Vault Prorata configuration

  • 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.

  • whitelistMode: permissionless or permission_with_merkle_proof or permission_with_authority.

Alpha Vault Key Components

  • 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.

Last updated