{"content":{"title":"raydium-amm-v3 中文注释: create_pool","body":"以下是添加了中文解释的代码：\r\n\r\n```rust\r\nuse crate::error::ErrorCode;\r\nuse crate::states::*;\r\nuse crate::{libraries::tick_math, util};\r\nuse anchor_lang::prelude::*;\r\nuse anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};\r\n// use solana_program::{program::invoke_signed, system_instruction};\r\n\r\n#[derive(Accounts)]\r\npub struct CreatePool<'info> {\r\n    /// 创建池子的付款地址。可以是任何人\r\n    #[account(mut)]\r\n    pub pool_creator: Signer<'info>,\r\n\r\n    /// 池子所属的配置\r\n    pub amm_config: Box<Account<'info, AmmConfig>>,\r\n\r\n    /// 初始化一个账户来存储池子的状态\r\n    #[account(\r\n        init,\r\n        seeds = [\r\n            POOL_SEED.as_bytes(),\r\n            amm_config.key().as_ref(),\r\n            token_mint_0.key().as_ref(),\r\n            token_mint_1.key().as_ref(),\r\n        ],\r\n        bump,\r\n        payer = pool_creator,\r\n        space = PoolState::LEN\r\n    )]\r\n    pub pool_state: AccountLoader<'info, PoolState>,\r\n\r\n    /// Token_0 的 mint，key 必须大于 token_1 的 mint\r\n    #[account(\r\n        constraint = token_mint_0.key() < token_mint_1.key(),\r\n        mint::token_program = token_program_0\r\n    )]\r\n    pub token_mint_0: Box<InterfaceAccount<'info, Mint>>,\r\n\r\n    /// Token_1 的 mint\r\n    #[account(\r\n        mint::token_program = token_program_1\r\n    )]\r\n    pub token_mint_1: Box<InterfaceAccount<'info, Mint>>,\r\n\r\n    /// 池子的 Token_0 存储库\r\n    #[account(\r\n        init,\r\n        seeds =[\r\n            POOL_VAULT_SEED.as_bytes(),\r\n            pool_state.key().as_ref(),\r\n            token_mint_0.key().as_ref(),\r\n        ],\r\n        bump,\r\n        payer = pool_creator,\r\n        token::mint = token_mint_0,\r\n        token::authority = pool_state,\r\n        token::token_program = token_program_0,\r\n    )]\r\n    pub token_vault_0: Box<InterfaceAccount<'info, TokenAccount>>,\r\n\r\n    /// 池子的 Token_1 存储库\r\n    #[account(\r\n        init,\r\n        seeds =[\r\n            POOL_VAULT_SEED.as_bytes(),\r\n            pool_state.key().as_ref(),\r\n            token_mint_1.key().as_ref(),\r\n        ],\r\n        bump,\r\n        payer = pool_creator,\r\n        token::mint = token_mint_1,\r\n        token::authority = pool_state,\r\n        token::token_program = token_program_1,\r\n    )]\r\n    pub token_vault_1: Box<InterfaceAccount<'info, TokenAccount>>,\r\n\r\n    /// 检查：初始化一个账户来存储 oracle 的观测，账户必须在链下创建，合约会初始化它\r\n    #[account(mut)]\r\n    pub observation_state: UncheckedAccount<'info>,\r\n\r\n    /// 初始化一个账户来存储 tick 数组是否初始化的状态\r\n    #[account(\r\n        init,\r\n        seeds = [\r\n            POOL_TICK_ARRAY_BITMAP_SEED.as_bytes(),\r\n            pool_state.key().as_ref(),\r\n        ],\r\n        bump,\r\n        payer = pool_creator,\r\n        space = TickArrayBitmapExtension::LEN\r\n    )]\r\n    pub tick_array_bitmap: AccountLoader<'info, TickArrayBitmapExtension>,\r\n\r\n    /// Spl token 程序或 token 程序 2022\r\n    pub token_program_0: Interface<'info, TokenInterface>,\r\n    /// Spl token 程序或 token 程序 2022\r\n    pub token_program_1: Interface<'info, TokenInterface>,\r\n    /// 创建新程序账户\r\n    pub system_program: Program<'info, System>,\r\n    /// 程序账户的 Sysvar\r\n    pub rent: Sysvar<'info, Rent>,\r\n}\r\n\r\npub fn create_pool(ctx: Context<CreatePool>, sqrt_price_x64: u128, open_time: u64) -> Result<()> {\r\n    // 检查 token_mint_0 和 token_mint_1 是否受支持\r\n    if !(util::is_supported_mint(&ctx.accounts.token_mint_0).unwrap()\r\n        && util::is_supported_mint(&ctx.accounts.token_mint_1).unwrap())\r\n    {\r\n        return err!(ErrorCode::NotSupportMint);\r\n    }\r\n    let pool_id = ctx.accounts.pool_state.key();\r\n    let mut pool_state = ctx.accounts.pool_state.load_init()?;\r\n\r\n    // 获取 sqrt_price_x64 对应的 tick\r\n    let tick = tick_math::get_tick_at_sqrt_price(sqrt_price_x64)?;\r\n    #[cfg(feature = \"enable-log\")]\r\n    msg!(\r\n        \"create pool, init_price: {}, init_tick:{}\",\r\n        sqrt_price_x64,\r\n        tick\r\n    );\r\n    // 初始化观测状态\r\n    ObservationState::initialize(ctx.accounts.observation_state.as_ref(), pool_id)?;\r\n\r\n    let bump = ctx.bumps.pool_state;\r\n    pool_state.initialize(\r\n        bump,\r\n        sqrt_price_x64,\r\n        open_time,\r\n        tick,\r\n        ctx.accounts.pool_creator.key(),\r\n        ctx.accounts.token_vault_0.key(),\r\n        ctx.accounts.token_vault_1.key(),\r\n        ctx.accounts.amm_config.as_ref(),\r\n        ctx.accounts.token_mint_0.as_ref(),\r\n        ctx.accounts.token_mint_1.as_ref(),\r\n        ctx.accounts.observation_state.key(),\r\n    )?;\r\n\r\n    // 初始化 tick 数组位图\r\n    ctx.accounts\r\n        .tick_array_bitmap\r\n        .load_init()?\r\n        .initialize(pool_id);\r\n\r\n    // 触发 PoolCreatedEvent 事件\r\n    emit!(PoolCreatedEvent {\r\n        token_mint_0: ctx.accounts.token_mint_0.key(),\r\n        token_mint_1: ctx.accounts.token_mint_1.key(),\r\n        tick_spacing: ctx.accounts.amm_config.tick_spacing,\r\n        pool_state: ctx.accounts.pool_state.key(),\r\n        sqrt_price_x64,\r\n        tick,\r\n        token_vault_0: ctx.accounts.token_vault_0.key(),\r\n        token_vault_1: ctx.accounts.token_vault_1.key(),\r\n    });\r\n    Ok(())\r\n}\r\n```"},"author":{"user":"https://learnblockchain.cn/people/12566","address":null},"history":"bafkreiajrjqolql66jz2la7mz46d4eiycdfmod4nnzgx3bd7z7ldino66e","timestamp":1718712689,"version":1}