الانتقال إلى المحتوى الرئيسي

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
تصف هذه الصفحة تخطيط ودور كل حساب. البذور (Seeds) موثّقة بشكل قانوني في reference/program-addresses. يحتوي مجمع CLMM على حسابات أكثر من مجمع CPMM، إذ يُخزَّن السيولة بشكل متفرق عبر نطاق التدرجات (tick range)؛ وفهم هذا التفرق هو جوهر هذه الصفحة.

فهرس الحسابات

يتكون مجمع CLMM النشط من عائلات الحسابات التالية. جميعها مملوكة لبرنامج CLMM ما عدا الـ mint الخاصتين بالعملتين ومخازنهما.
الحسابالغرضالعدد لكل مجمع
AmmConfigطبقة الرسوم: معدل رسوم التداول، حصة البروتوكول، حصة الصندوق، التباعد الافتراضي للتدرجات. مشترك بين جميع المجمعات في هذه الطبقة.1 (مشترك)
PoolStatesqrt_price_x64 الحالي، التدرج الحالي، إجمالي السيولة، إجماليات نمو الرسوم، معلومات المكافآت، مؤشر الملاحظات.1
TickArrayStateكتلة من TICK_ARRAY_SIZE تدرجات متجاورة. لا تُهيَّأ إلا عند الحاجة.0 ≤ N ≤ range
TickArrayBitmapExtensionخريطة بت (bitmap) للتدفق الزائد تتتبع مصفوفات التدرجات الموجودة خارج خريطة البت المضمّنة في PoolState.0 أو 1
PersonalPositionStateحساب واحد لكل مركز LP. يخزّن النطاق والسيولة وآخر نمو للرسوم/المكافآت مُشاهَد. المفوَّض = مالك NFT.1 لكل مركز
Position NFT mintMint بإمداد 1، مرتبط بـ PersonalPositionState. نقل NFT يعني نقل المركز.1 لكل مركز
ObservationStateمخزن دائري لملاحظات الأسعار خاص بـ TWAP.1
token_0_vault، token_1_vaultحسابات توكن تحتفظ بأرصدة المجمع. مملوكة لسلطة المجمع.2
DynamicFeeConfigمجموعة معاملات قابلة لإعادة الاستخدام لآلية الرسوم الديناميكية. يمكن للمجمعات المنشأة عبر create_customizable_pool الاشتراك فيها. تدار من قبل المشرف.مشترك (لكل index)
LimitOrderStateحساب واحد لكل أمر حد مفتوح. يسجّل المالك والتدرج والاتجاه والكمية الإجمالية ولقطة المخرجات المسوّاة.1 لكل أمر
LimitOrderNonceعداد لكل (wallet, nonce_index) يُشتق منه PDAs فريدة للأوامر.1 لكل (wallet, index)

PoolState

الحالة الحية للمجمع، تُقرأ عند كل عملية swap وكل تغيير في المراكز.
// programs/amm/src/states/pool.rs
pub struct PoolState {
    pub bump:           [u8; 1],
    pub amm_config:     Pubkey,            // fee tier binding
    pub owner:          Pubkey,            // admin (multisig)
    pub token_mint_0:   Pubkey,
    pub token_mint_1:   Pubkey,
    pub token_vault_0:  Pubkey,
    pub token_vault_1:  Pubkey,
    pub observation_key: Pubkey,

    pub mint_decimals_0: u8,
    pub mint_decimals_1: u8,
    pub tick_spacing:   u16,               // inherited from amm_config at init

    pub liquidity:      u128,              // total active (in-range) liquidity
    pub sqrt_price_x64: u128,              // Q64.64 of sqrt(price)
    pub tick_current:   i32,               // current tick index

    pub padding3:       u16,
    pub padding4:       u16,

    // Global fee growth per unit of liquidity, Q64.64.
    pub fee_growth_global_0_x64: u128,
    pub fee_growth_global_1_x64: u128,

    // Accrued-but-not-swept protocol fees (per mint).
    pub protocol_fees_token_0: u64,
    pub protocol_fees_token_1: u64,

    // Reserved padding for future upgrades.
    pub padding5: [u128; 4],

    // Status bitmask. Bits 0-5: open-position, decrease-liquidity,
    // collect-fee, collect-reward, swap, limit-order. A set bit disables
    // the corresponding operation.
    pub status:  u8,

    // Fee-collection mode (CollectFeeOn).
    //   0 = FromInput (deduct fee from the swap input — Uniswap-V3 default)
    //   1 = Token0Only (always deduct fee from token0 vault)
    //   2 = Token1Only (always deduct fee from token1 vault)
    pub fee_on: u8,
    pub padding: [u8; 6],

    // Live reward streams (up to REWARD_NUM = 3).
    pub reward_infos: [RewardInfo; 3],

    // Inline bitmap tracking initialized tick-arrays in the primary range.
    pub tick_array_bitmap: [u64; 16],

    // Reserved padding for future upgrades.
    pub padding6: [u64; 4],

    pub fund_fees_token_0: u64,
    pub fund_fees_token_1: u64,

    pub open_time:    u64,                 // currently disabled by the program
    pub recent_epoch: u64,

    // Per-pool dynamic-fee state. Zero-valued unless the pool was
    // created with `enable_dynamic_fee = true` via create_customizable_pool.
    pub dynamic_fee_info: DynamicFeeInfo,

    // Reserved for future upgrades.
    pub padding1: [u64; 14],
    pub padding2: [u64; 32],
}
الحقول التي ستتعامل معها فعلياً:
  • sqrt_price_x64 و**tick_current** هما حالة سعر المجمع. يُحدَّثان معاً عند كل عملية swap. tick_current هو الجزء الصحيح الأدنى لـ log_{1.0001}(price).
  • liquidity هي السيولة النشطة — مجموع قيم L لجميع المراكز التي تحتوي tick_current ضمن نطاقها. تتغير في كل مرة يعبر فيها swap تدرجاً، وفي كل مرة يُفتح أو يُغلق أو يُعاد تحديد حجم مركز.
  • fee_growth_global_{0,1}_x64 هي الرسوم التراكمية المكتسبة لكل وحدة سيولة عبر تاريخ المجمع بأكمله. تقرأ المراكز هذه القيم لحساب ما يستحقانه.
  • tick_spacing مقيّد بـ AmmConfig عند التهيئة ولا يتغير أبداً. يحدد أي مؤشرات تدرجات مسموح بها كنقاط نهاية للمراكز.
  • tick_array_bitmap هي خريطة بت مضمّنة تغطي نطاق التدرجات الأكثر استخداماً حول السعر الفوري. بالنسبة للمجمعات التي تمتد مراكزها بعيداً، يقع تتبع الفائض في حساب TickArrayBitmapExtension المنفصل.
  • fee_on ثابت عند إنشاء المجمع. القيمة 0 (FromInput) تعيد إنتاج سلوك Uniswap-V3 الكلاسيكي. القيمتان 1 و2 توجّهان رسوم الـ swap إلى جانب واحد من الدفتر — راجع products/clmm/fees للاطلاع على المقايضات.
  • dynamic_fee_info يحمل حالة التقلب لرسوم الرسوم الديناميكية الإضافية. عند التفعيل، تُعيد كل عملية swap حساب dynamic_fee_component فوق AmmConfig.trade_fee_rate. التخطيط موثّق ضمن DynamicFeeInfo أدناه؛ المجمعات بدون رسوم ديناميكية تترك البنية كلها بقيمة صفر.

AmmConfig

pub struct AmmConfig {
    pub bump: u8,
    pub index: u16,                       // uses "amm_config"+u16 seed

    pub owner:             Pubkey,        // admin
    pub protocol_fee_rate: u32,           // fraction of trade fee to protocol, denom 1e6
    pub trade_fee_rate:    u32,           // trade fee in 1e6ths of volume
    pub tick_spacing:      u16,           // default spacing for pools using this config
    pub fund_fee_rate:     u32,           // fraction of trade fee to fund, denom 1e6
    pub padding_u32: u32,

    pub fund_owner: Pubkey,
    pub padding: [u64; 3],
}
مجموعة نموذجية منشورة من طبقات رسوم CLMM (تحقق من GET https://api-v3.raydium.io/main/clmm-config):
Indextrade_fee_rateتباعد التدرجاتالاستخدام الشائع
0100 (0.01%)1أزواج مستقرة، USDC/USDT
1500 (0.05%)10العملات الرئيسية المترابطة
22_500 (0.25%)60الأزواج القياسية
310_000 (1.00%)120أزواج متقلبة أو ذات رأس مال صغير
protocol_fee_rate وfund_fee_rate هما كسور من رسوم التداول؛ بنفس الاتفاقية المستخدمة في CPMM. راجع products/clmm/fees.

TickArrayState

لا يُخزّن CLMM سجلاً واحداً لكل تدرج، إذ سيعني ذلك مليارات الحسابات. بدلاً من ذلك، يجمع TICK_ARRAY_SIZE تدرجات متجاورة مُهيَّأة أو غير مُهيَّأة (عادةً 60 أو 88 حسب إصدار البرنامج) في TickArrayState يُنشأ عند أول استخدام.
pub const TICK_ARRAY_SIZE: usize = 60;
pub const TICK_ARRAY_SIZE_USIZE: usize = 60;

pub struct TickArrayState {
    pub pool_id:                Pubkey,
    pub start_tick_index:       i32,                            // lowest tick in this array
    pub ticks:                  [TickState; TICK_ARRAY_SIZE],   // 60 entries
    pub initialized_tick_count: u8,
    pub recent_epoch:           u64,
    pub padding:                [u8; 107],
}

pub struct TickState {
    pub tick:                       i32,
    pub liquidity_net:              i128,                       // ΔL when crossing this tick upward
    pub liquidity_gross:            u128,                       // total L referencing this tick
    pub fee_growth_outside_0_x64:   u128,                       // see math.mdx
    pub fee_growth_outside_1_x64:   u128,
    pub reward_growths_outside_x64: [u128; 3],

    // Limit-order bookkeeping. All zero for ticks that have never carried
    // a limit order. See products/clmm/math for the matching algorithm.
    pub order_phase:                  u64,                      // monotonic FIFO cohort id
    pub orders_amount:                u64,                      // unfilled tokens in current cohort
    pub part_filled_orders_remaining: u64,                      // remaining tokens of partially-filled cohort
    pub unfilled_ratio_x64:           u128,                     // Q64.64; starts at 1.0 and shrinks as fills occur

    pub padding:                    [u32; 3],
}
حقول أوامر الحد الأربعة تساوي صفراً لأي تدرج لم يُستخدم قط لأمر حد. عند فتح أوامر على تدرج ما، يتتبع البرنامج تسلسلاً من الدُفعات (cohorts):
  • order_phase هو معرّف الدُفعة. يزداد في كل مرة تنتقل دُفعة من “غير مملوءة كلياً” إلى “ممتلئة جزئياً”.
  • orders_amount هو إجمالي رمز الإدخال للدُفعة الحالية (الأحدث).
  • part_filled_orders_remaining يتتبع الدُفعة السابقة التي تملؤها عمليات الـ swap الجارية حالياً.
  • unfilled_ratio_x64 هو مضاعف Q64.64 يُحمل على الدُفعة: عندما تملأ عملية swap نسبة X% من الدُفعة، يُضرب المعامل في (1 − X). يُخزّن كل أمر مفتوح لقطته الخاصة (order_phase, unfilled_ratio_x64) عند وقت الفتح، مما يختزل حساب التسوية في مقارنة اللقطات.
القواعد:
  • تدرج نقطة نهاية المركز t يجب أن يحقق t % tick_spacing == 0. يرفض البرنامج المراكز غير المتوافقة مع التباعد.
  • مصفوفة التدرج تقع عند floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing).
  • تُهيَّأ مصفوفة التدرجات بشكل كسول: أول مركز أو swap يلمس مصفوفة غير مُهيَّأة يُنشئها، مدفوعاً تكلفة الإيجار.
  • لا يُغلق البرنامج مصفوفة التدرجات أبداً. بمجرد تخصيصها تظل موجودة طوال عمر المجمع، حتى بعد أن تعود كل التدرجات فيها إلى liquidity_gross == 0. تُعاد استخدام المراكز والـ swaps اللاحقة للحساب الموجود بدون إيجار إضافي. لا توجد مسار تنظيف لمصفوفات التدرجات مرتبط بـ ClosePosition.

TickArrayBitmapExtension

يغطي PoolState.tick_array_bitmap (المضمّن) النطاق “القريب من السعر الفوري” — ±1,024 مصفوفة تدرجات. خارج هذا النطاق (لقيم التدرجات الشديدة)، يحتفظ البرنامج بحساب امتداد:
pub struct TickArrayBitmapExtension {
    pub pool_id: Pubkey,
    pub positive_tick_array_bitmap: [[u64; 8]; 14],
    pub negative_tick_array_bitmap: [[u64; 8]; 14],
}
إذا كان نطاق مركزك “عادياً”، فلن تحتاج أبداً للتفكير في حساب الامتداد. المراكز ذات النطاق الكامل (مثل (MIN_TICK, MAX_TICK)) تستلزمه؛ يحله SDK تلقائياً.

المراكز

مركز CLMM هو حزمة من ثلاثة حسابات بالإضافة إلى mint:

Position NFT mint

Mint لتوكن SPL بإمداد 1. عنوان الـ mint هو PDA محدد؛ الـ NFT الخاص بالمركز في محفظة المالك ليس سوى ATA يحتفظ بذلك التوكن الواحد. نقل الـ NFT هو طريقة تغيير ملكية المركز — يربط البرنامج التفويض بـحامل رصيد ATA الخاص بـ NFT في الوقت الحالي، وليس بـ Pubkey مخزّن في الحالة.

PersonalPositionState

حساب واحد لكل مركز مفتوح. مفتاحه مشتق من NFT mint.
pub struct PersonalPositionState {
    pub bump: [u8; 1],
    pub nft_mint: Pubkey,                 // this position's NFT mint
    pub pool_id:  Pubkey,

    pub tick_lower_index: i32,
    pub tick_upper_index: i32,

    pub liquidity: u128,                  // this position's L

    // Fee-growth snapshots at last time the position was touched.
    pub fee_growth_inside_0_last_x64: u128,
    pub fee_growth_inside_1_last_x64: u128,
    pub token_fees_owed_0: u64,           // accrued since last collect
    pub token_fees_owed_1: u64,

    pub reward_infos: [PositionRewardInfo; 3],
    pub recent_epoch: u64,
    pub padding: [u64; 7],
}

pub struct PositionRewardInfo {
    pub growth_inside_last_x64: u128,
    pub reward_amount_owed: u64,
}

ProtocolPositionState (مهجور)

كانت الإصدارات القديمة من CLMM تخزّن حسابات (pool, tick_lower, tick_upper) التجميعية في PDA من نوع ProtocolPositionState. الإصدارات الأحدث لا تنشئ هذا الحساب ولا تقرأه بعد الآن. لا يزال الفتحة تظهر في قوائم حسابات OpenPosition / IncreaseLiquidity / DecreaseLiquidity بوصفها UncheckedAccount للتوافق مع ABI، لكن البرنامج لا يكتب فيه. الحسابات الموجودة على السلسلة متبقية؛ يمكن للمشرف استدعاء CloseProtocolPosition لاسترداد الإيجار منها.يُشتق الآن حساب النطاق التجميعي مباشرةً من تدرجي نقطة النهاية (liquidity_gross، liquidity_net، وfee_growth_outside_* / reward_growths_outside_x64 لكل تدرج) في TickArrayState. تستمر صيغة نمو الرسوم الداخلية fee_growth_inside = global − outside_lower − outside_upper في العمل بدون حساب مركز تجميعي.

الملاحظات (Observation)

pub const OBSERVATION_NUM: usize = 100;

pub struct Observation {
    pub block_timestamp: u32,
    pub tick_cumulative: i64,                            // Σ tick_current × Δt
    pub padding:         [u64; 4],
}

pub struct ObservationState {
    pub initialized:       bool,
    pub recent_epoch:      u64,
    pub observation_index: u16,
    pub pool_id:           Pubkey,
    pub observations:      [Observation; OBSERVATION_NUM], // 100 entries
    pub padding:           [u64; 4],
}
يُخزّن مخزن الملاحظات في CLMM تدرجاً تراكمياً، لا سعراً تراكمياً. يحسب المستهلكون الخارجيون السعر ذي الوسط الهندسي عبر فترة زمنية من (tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0) ثم price = 1.0001 ** tick. راجع algorithms/clmm-math.

DynamicFeeConfig وDynamicFeeInfo

تقع معاملات الرسوم الديناميكية في مكانين. القالب القابل لإعادة الاستخدام — DynamicFeeConfig — يديره المشرف ويُشارَك بين المجمعات المشتركة. حالة التشغيل لكل مجمع — DynamicFeeInfo — مضمّنة في PoolState وتُحدَّث عند كل عملية swap.

DynamicFeeConfig

// programs/amm/src/states/pool_fee.rs
pub struct DynamicFeeConfig {
    pub index:                       u16,    // identifier; PDA seed component
    pub filter_period:               u16,    // seconds — within this window the volatility reference is held
    pub decay_period:                u16,    // seconds — beyond this window the reference fully decays
    pub reduction_factor:            u16,    // fixed-point in [1, 10_000); applied at decay
    pub dynamic_fee_control:         u32,    // fixed-point in (0, 100_000); fee-rate gain
    pub max_volatility_accumulator:  u32,    // ceiling on the volatility accumulator
    pub padding:                     [u64; 8],
}
بذرة PDA: ["dynamic_fee_config", index.to_be_bytes()]. يُنشأ عبر create_dynamic_fee_config (مقيّد بصلاحيات المشرف) ويُعدَّل عبر update_dynamic_fee_config. تُنشئ المجمعات التي تُنشأ بـ enable_dynamic_fee = true لقطة من المعاملات الخمسة للضبط (filter_period، decay_period، reduction_factor، dynamic_fee_control، max_volatility_accumulator) في DynamicFeeInfo الخاص بها عند الإنشاء؛ التعديلات اللاحقة على DynamicFeeConfig لا تؤثر بأثر رجعي على المجمعات الموجودة.

DynamicFeeInfo (مضمّن في PoolState)

pub struct DynamicFeeInfo {
    pub filter_period:                u16,
    pub decay_period:                 u16,
    pub reduction_factor:             u16,
    pub dynamic_fee_control:          u32,
    pub max_volatility_accumulator:   u32,
    pub tick_spacing_index_reference: i32,    // tick-spacing-units; reference for next swap
    pub volatility_reference:         u32,    // running floor for the accumulator
    pub volatility_accumulator:       u32,    // current cumulative volatility (capped)
    pub last_update_timestamp:        u64,
    pub padding:                      [u8; 46],
}
الحقول الأربعة السفلية هي حالة؛ الخمسة العليا هي معاملات ضبط منسوخة من DynamicFeeConfig. رياضيات الرسوم وقواعد الاضمحلال موثّقة في products/clmm/math وproducts/clmm/fees. الثوابت المستخدمة في الصيغة:
الثابتالقيمةالمعنى
VOLATILITY_ACCUMULATOR_SCALE10_000دقة متراكم التقلب
REDUCTION_FACTOR_DENOMINATOR10_000مقام reduction_factor
DYNAMIC_FEE_CONTROL_DENOMINATOR100_000مقام dynamic_fee_control
MAX_FEE_RATE_NUMERATOR100_000حد أقصى صارم بنسبة 10% على معدل الرسوم الناتج

LimitOrderState

حساب واحد لكل أمر حد مفتوح.
// programs/amm/src/states/limit_order.rs
pub struct LimitOrderState {
    pub pool_id:            Pubkey,
    pub owner:              Pubkey,
    pub tick_index:         i32,
    pub zero_for_one:       bool,    // direction: true sells token0 for token1
    pub order_phase:        u64,     // snapshot of TickState.order_phase at open time
    pub total_amount:       u64,     // input-token amount placed
    pub filled_amount:      u64,     // informational; computed precisely on settle
    pub settle_base:        u64,     // unfilled remainder at last settle/decrease
    pub settled_output:     u64,     // cumulative output-token paid to owner
    pub open_time:          u64,
    pub unfilled_ratio_x64: u128,    // Q64.64 snapshot of TickState.unfilled_ratio_x64 at open
    pub padding:            [u64; 4],
}
دورة الحياة:
  1. الفتح — يستدعي المستخدم open_limit_order، يودع total_amount من رمز الإدخال، ويُربط الأمر بدُفعة TickState.
  2. (اختياري) الزيادة / التخفيض — يضيف increase_limit_order إلى total_amount؛ يُعيد decrease_limit_order الرموز غير المملوءة (وأي مخرجات مسوّاة حتى تلك النقطة).
  3. التسوية — عند ملء الدُفعة كلياً أو جزئياً، يستدعي المالك أو حارس العمليات settle_limit_order لدفع رموز المخرجات إلى ATA المالك.
  4. الإغلاق — بمجرد أن يصبح unfilled_amount == 0، يمكن إغلاق الحساب. يعود الإيجار دائماً إلى owner.
بذرة PDA: [owner.as_ref(), limit_order_nonce.key().as_ref(), limit_order_nonce.order_nonce.to_be_bytes().as_ref()]. وبذلك يكون PDA الأمر فريداً لكل (owner, nonce_index, order_nonce).

LimitOrderNonce

عداد لكل (wallet, nonce_index) يتيح لمستخدم واحد تشغيل خطوط متوازية متعددة من أوامر الحد دون تعارض في PDAs.
pub struct LimitOrderNonce {
    pub user_wallet: Pubkey,
    pub nonce_index: u8,             // user-chosen, 0..255
    pub order_nonce: u64,            // monotonic, incremented every time a new order is opened
    pub padding:     [u64; 4],
}
بذرة PDA: [user_wallet.as_ref(), &[nonce_index]]. معظم العملاء يستخدمون nonce_index = 0 ويتركون order_nonce يحمل العدد الكلي.

اشتقاق الحسابات الرئيسية

import { PublicKey } from "@solana/web3.js";

const CLMM_PROGRAM_ID = new PublicKey(
  "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK"
); // see reference/program-addresses

function i32ToBytes(n: number): Buffer {
  const b = Buffer.alloc(4);
  b.writeInt32BE(n);
  return b;
}

export function deriveClmmAccounts(
  ammConfig: PublicKey,
  token0Mint: PublicKey,           // must already be sorted
  token1Mint: PublicKey,
) {
  const [poolState] = PublicKey.findProgramAddressSync(
    [Buffer.from("pool"), ammConfig.toBuffer(),
     token0Mint.toBuffer(), token1Mint.toBuffer()],
    CLMM_PROGRAM_ID,
  );
  const [observation] = PublicKey.findProgramAddressSync(
    [Buffer.from("observation"), poolState.toBuffer()],
    CLMM_PROGRAM_ID,
  );
  const [tickArrayBitmapExtension] = PublicKey.findProgramAddressSync(
    [Buffer.from("pool_tick_array_bitmap_extension"), poolState.toBuffer()],
    CLMM_PROGRAM_ID,
  );
  return { poolState, observation, tickArrayBitmapExtension };
}

export function deriveTickArray(
  pool: PublicKey,
  startTickIndex: number,
) {
  const [tickArray] = PublicKey.findProgramAddressSync(
    [Buffer.from("tick_array"), pool.toBuffer(), i32ToBytes(startTickIndex)],
    CLMM_PROGRAM_ID,
  );
  return tickArray;
}

export function deriveDynamicFeeConfig(index: number) {
  const idx = Buffer.alloc(2);
  idx.writeUInt16BE(index);
  const [pda] = PublicKey.findProgramAddressSync(
    [Buffer.from("dynamic_fee_config"), idx],
    CLMM_PROGRAM_ID,
  );
  return pda;
}

export function deriveLimitOrderNonce(
  wallet: PublicKey,
  nonceIndex: number,
) {
  const [pda] = PublicKey.findProgramAddressSync(
    [wallet.toBuffer(), Buffer.from([nonceIndex & 0xff])],
    CLMM_PROGRAM_ID,
  );
  return pda;
}

export function deriveLimitOrder(
  wallet: PublicKey,
  nonceAccount: PublicKey,
  orderNonce: bigint,
) {
  const nonceBytes = Buffer.alloc(8);
  nonceBytes.writeBigUInt64BE(orderNonce);
  const [pda] = PublicKey.findProgramAddressSync(
    [wallet.toBuffer(), nonceAccount.toBuffer(), nonceBytes],
    CLMM_PROGRAM_ID,
  );
  return pda;
}

export function derivePersonalPosition(nftMint: PublicKey) {
  const [personalPosition] = PublicKey.findProgramAddressSync(
    [Buffer.from("position"), nftMint.toBuffer()],
    CLMM_PROGRAM_ID,
  );
  return personalPosition;
}
يجب دائماً التحقق المزدوج من سلاسل البذور مقابل IDL على السلسلة وreference/program-addresses.

مرجع سريع لدورة الحياة

الحدثالحسابات المنشأةالحسابات المحذوفة
CreatePoolpoolState، observation، token_0_vault، token_1_vault
OpenPosition[WithToken22Nft]NFT mint + ATA، personalPosition، ربما tickArrayState جديدة، tickArrayBitmapExtension إن لم تكن موجودة
IncreaseLiquidityربما tickArrayState جديدة
DecreaseLiquidityربما يُخلّي إدخالات التدرجات (لكن tickArrayState نفسها لا تُغلق)
ClosePositionNFT mint، personalPosition
SwapV2ربما tickArrayState جديدة
OpenLimitOrderlimitOrderState، ربما limitOrderNonce (init-if-needed)، ربما tickArrayState جديدة
IncreaseLimitOrder
DecreaseLimitOrderيُغلق limitOrderState إن استُهلك الأمر بالكامل
SettleLimitOrder
CloseLimitOrderlimitOrderState (الإيجار إلى owner)
CreateDynamicFeeConfigdynamicFeeConfig
CreateCustomizablePoolpoolState، observation، المخازن — بنفس طريقة CreatePool. يلتقط dynamicFeeConfig إن كان enable_dynamic_fee = true.
CollectRewards
UpdateRewardInfos
CloseProtocolPosition (مشرف)protocolPositionState المتبقية (الإيجار إلى المشرف)
حسابات TickArrayState لا يُغلقها البرنامج أبداً — تظل موجودة طوال عمر المجمع. بمجرد تهيئة مصفوفة تدرجات تبقى على السلسلة حتى عندما تعود كل التدرجات فيها إلى liquidity_gross == 0. إعادة استخدام مصفوفة موجودة مجانية؛ فقط أول مركز يلمس مصفوفة لم تُهيَّأ من قبل يدفع إيجارها.

ما تجده في كل صفحة

المصادر: