Position Management
The Fusion AMM SDK provides tools to manage concentrated liquidity positions in a FusionPool. Developers can open, close, increase, or decrease liquidity for positions using intuitive SDK methods, as well as fetch Positions by the owner.
Open Position: creates a new position and optionally adds liquidity if specified (e.g., via token amounts). See
openPositionInstructions,increaseLiquidityInstructionsfunctions of the high-level SDK package.Close Position: removes all liquidity from a position, collects any accrued fees and then closes the position. See
closePositionInstructions,decreaseLiquidityInstructionsfunctions of the high-level SDK package.Fetch Positions: fetches multiple positions according to input parameters. See
fetchPositionsForOwnerfunction of the high-level SDK package.
Additionally, liquidity can be increased or decreased independently without opening or closing a position, offering flexible position management.
Examples:
1. Open Position
import { openPositionInstructions, SLIPPAGE_TOLERANCE_BPS }
from "@crypticdot/fusionamm-sdk";
import { sendTransaction } from "@crypticdot/fusionamm-tx-sender";
import { address, createSolanaRpc } from "@solana/kit";
export const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
export const signer = await loadKeypair(); // Load your wallet
// SOL/USDC pool address
let = address("7VuKeevbvbQQcxz6N4SNLmuq6PYy4AcGQRDssoqo4t65");
const open = await openPositionInstructions(
rpc,
poolAddress,
{ tokenA: 1_000_000_000n },
{ price: 100.0 },
{ price: 120.0 },
SLIPPAGE_TOLERANCE_BPS,
signer,
);
const signature = await sendTransaction(rpc, open.instructions, signer);
console.log("Transaction ID:", signature);
console.log("Position mint:", open.positionMint);use fusionamm_sdk::{
open_position_instructions,
IncreaseLiquidityParam,
PriceOrTickIndex
};
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_pubkey::pubkey;
use solana_keypair::Keypair;
use solana_signer::Signer;
let rpc = RpcClient::new("https://api.devnet.solana.com".to_string());
let fusion_pool = pubkey!("7VuKeevbvbQQcxz6N4SNLmuq6PYy4AcGQRDssoqo4t65");
let lower_price = 0.00005;
let upper_price = 0.00015;
let param = IncreaseLiquidityParam::TokenA(1_000_000);
let slippage_tolerance_bps = Some(100);
let wallet = Keypair::new(); // Load your
let funder = Some(wallet.pubkey());
let result = open_position_instructions(
&rpc,
fusion_pool,
PriceOrTickIndex::Price(lower_price),
PriceOrTickIndex::Price(upper_price),
param,
slippage_tolerance_bps,
funder,
)
.await
.unwrap();
println!("Position Mint: {:?}", result.position_mint);
println!("Initialization Cost: {} lamports", result.initialization_cost);2. Close Position
import { closePositionInstructions, SLIPPAGE_TOLERANCE_BPS }
from "@crypticdot/fusionamm-sdk";
import { sendTransaction } from "@crypticdot/fusionamm-tx-sender";
import { address, createSolanaRpc } from "@solana/kit";
export const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
export const signer = await loadKeypair(); // Load your wallet
let positionMintAddress =
address("HqoV7Qv27REUtmd9UKSJGGmCRNx3531t33bDG1BUfo9K");
const open = await closePositionInstructions(
rpc,
positionMint,
SLIPPAGE_TOLERANCE_BPS,
signer
);
const signature = await sendTransaction(rpc, open.instructions, signer);
console.log("Transaction ID:", signature);use fusionamm_sdk::close_position_instructions;
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_pubkey::pubkey;
use solana_keypair::Keypair;
use solana_signer::Signer;
#[tokio::main]
async fn main() {
use solana_sdk::pubkey;
let rpc = RpcClient::new("https://api.mainnet.solana.com".to_string());
let wallet = Keypair::new(); // Load your wallet here
let position_mint_address =
pubkey!("HqoV7Qv27REUtmd9UKSJGGmCRNx3531t33bDG1BUfo9K");
let result = close_position_instructions(
&rpc,
position_mint_address,
Some(100),
Some(wallet.pubkey()),
)
.await
.unwrap();
println!("Quote token max B: {:?}", result.quote.token_est_b);
println!("Fees Quote: {:?}", result.fees_quote);
println!("Number of Instructions: {}", result.instructions.len());
}Last updated