raydium-amm-v3 注释
```rust
use super::add_liquidity;
use crate::error::ErrorCode;
use crate::libraries::{big_num::U128, fixed_point_64, full_math::MulDiv};
use crate::states::*;
use crate::util::*;
use anchor_lang::prelude::*;
use anchor_spl::token::Token;
use anchor_spl::token_interface::{Mint, Token2022, TokenAccount};
#[derive(Accounts)]
pub struct IncreaseLiquidity<'info> {
/// 支付以铸造位置
pub nft_owner: Signer<'info>,
/// NFT 的 token 账户
#[account(
constraint = nft_account.mint == personal_position.nft_mint
)]
pub nft_account: Box<InterfaceAccount<'info, TokenAccount>>,
#[account(mut)]
pub pool_state: AccountLoader<'info, PoolState>,
#[account(
mut,
seeds = [
POSITION_SEED.as_bytes(),
pool_state.key().as_ref(),
&personal_position.tick_lower_index.to_be_bytes(),
&personal_position.tick_upper_index.to_be_bytes(),
],
bump,
constraint = protocol_position.pool_id == pool_state.key(),
)]
pub protocol_position: Box<Account<'info, ProtocolPositionState>>,
/// 为此位置增加流动性
#[account(mut, constraint = personal_position.pool_id == pool_state.key())]
pub personal_position: Box<Account<'info, PersonalPositionState>>,
/// 存储下界 tick 的初始状态
#[account(mut, constraint = tick_array_lower.load()?.pool_id == pool_state.key())]
pub tick_array_lower: AccountLoader<'info, TickArrayState>,
/// 存储上界 tick 的初始状态
#[account(mut, constraint = tick_array_upper.load()?.pool_id == pool_state.key())]
pub tick_array_upper: AccountLoader<'info, TickArrayState>,
/// 付款人的 token_0 账户
#[account(
mut,
token::mint = token_vault_0.mint
)]
pub token_account_0: Box<InterfaceAccount<'info, TokenAccount>>,
/// 使用 token_1 来铸造位置的 token 账户
#[account(
mut,
token::mint = token_vault_1.mint
)]
pub token_account_1: Box<InterfaceAccount<'info, TokenAccount>>,
/// 持有 token_0 的池子 token 的地址
#[account(
mut,
constraint = token_vault_0.key() == pool_state.load()?.token_vault_0
)]
pub token_vault_0: Box<InterfaceAccount<'info, TokenAccount>>,
/// 持有 token_1 的池子 token 的地址
#[account(
mut,
constraint = token_vault_1.key() == pool_state.load()?.token_vault_1
)]
pub token_vault_1: Box<InterfaceAccount<'info, TokenAccount>>,
/// 创建 mint 账户和铸造 token 的程序
pub token_program: Program<'info, Token>,
// 剩余账户
// #[account(
// seeds = [
// POOL_TICK_ARRAY_BITMAP_SEED.as_bytes(),
// pool_state.key().as_ref(),
// ],
// bump
// )]
// pub tick_array_bitmap: AccountLoader<'info, TickArrayBitmapExtension>,
}
#[derive(Accounts)]
pub struct IncreaseLiquidityV2<'info> {
/// 支付以铸造位置
pub nft_owner: Signer<'info>,
/// NFT 的 token 账户
#[account(
constraint = nft_account.mint == personal_position.nft_mint,
token::token_program = token_program,
)]
pub nft_account: Box<InterfaceAccount<'info, TokenAccount>>,
#[account(mut)]
pub pool_state: AccountLoader<'info, PoolState>,
#[account(
mut,
seeds = [
POSITION_SEED.as_bytes(),
pool_state.key().as_ref(),
&personal_position.tick_lower_index.to_be_bytes(),
&personal_position.tick_upper_index.to_be_bytes(),
],
bump,
constraint = protocol_position.pool_id == pool_state.key(),
)]
pub protocol_position: Box<Account<'info, ProtocolPositionState>>,
/// 为此位置增加流动性
#[account(mut, constraint = personal_position.pool_id == pool_state.key())]
pub personal_position: Box<Account<'info, PersonalPositionState>>,
/// 存储下界 tick 的初始状态
#[account(mut, constraint = tick_array_lower.load()?.pool_id == pool_state.key())]
pub tick_array_lower: AccountLoader<'info, TickArrayState>,
/// 存储上界 tick 的初始状态
#[account(mut, constraint = tick_array_upper.load()?.pool_id == pool_state.key())]
pub tick_array_upper: AccountLoader<'info, TickArrayState>,
/// 付款人的 token_0 账户
#[account(
mut,
token::mint = token_vault_0.mint
)]
pub token_account_0: Box<InterfaceAccount<'info, TokenAccount>>,
/// 使用 token_1 来铸造位置的 token 账户
#[account(
mut,
token::mint = token_vault_1.mint
)]
pub token_account_1: Box<InterfaceAccount<'info, TokenAccount>>,
/// 持有 token_0 的池子 token 的地址
#[account(
mut,
constraint = token_vault_0.key() == pool_state.load()?.token_vault_0
)]
pub token_vault_0: Box<InterfaceAccount<'info, TokenAccount>>,
/// 持有 token_1 的池子 token 的地址
#[account(
mut,
constraint = token_vault_1.key() == pool_state.load()?.token_vault_1
)]
pub token_vault_1: Box<InterfaceAccount<'info, TokenAccount>>,
/// 创建 mint 账户和铸造 token 的程序
pub token_program: Program<'info, Token>,
/// 2022 版的 token 程序
pub token_program_2022: Program<'info, Token2022>,
/// token_vault_0 的 mint
#[account(
address = token_vault_0.mint
)]
pub vault_0_mint: Box<InterfaceAccount<'info, Mint>>,
/// token_vault_1 的 mint
#[account(
address = token_vault_1.mint
)]
pub vault_1_mint: Box<InterfaceAccount<'info, Mint>>,
// 剩余账户
// #[account(
// seeds = [
// POOL_TICK_ARRAY_BITMAP_SEED.as_bytes(),
// pool_state.key().as_ref(),
// ],
// bump
// )]
// pub tick_array_bitmap: AccountLoader<'info, TickArrayBitmapExtension>,
}
pub fn increase_liquidity_v1<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, IncreaseLiquidity<'info>>,
liquidity: u128,
amount_0_max: u64,
amount_1_max: u64,
base_flag: Option<bool>,
) -> Result<()> {
increase_liquidity(
&ctx.accounts.nft_owner,
&ctx.accounts.pool_state,
&mut ctx.accounts.protocol_position,
&mut ctx.accounts.personal_position,
&ctx.accounts.tick_array_lower,
&ctx.accounts.tick_array_upper,
&ctx.accounts.token_account_0,
&ctx.accounts.token_account_1,
&ctx.accounts.token_vault_0,
&ctx.accounts.token_vault_1,
&ctx.accounts.token_program,
None,
None,
None,
&ctx.remaining_accounts,
liquidity,
amount_0_max,
amount_1_max,
base_flag,
)
}
pub fn increase_liquidity_v2<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, IncreaseLiquidityV2<'info>>,
liquidity: u128,
amount_0_max: u64,
amount_1_max: u64,
base_flag: Option<bool>,
) -> Result<()> {
increase_liquidity(
&ctx.accounts.nft_owner,
&ctx.accounts.pool_state,
&mut ctx.accounts.protocol_position,
&mut ctx.accounts.personal_position,
&ctx.accounts.tick_array_lower,
&ctx.accounts.tick_array_upper,
&ctx.accounts.token_account_0,
&ctx.accounts.token_account_1,
&ctx.accounts.token_vault_0,
&ctx.accounts.token_vault_1,
&ctx.accounts.token_program,
Some(ctx.accounts.token_program_2022.clone()),
Some(ctx.accounts.vault_0_mint.clone()),
Some(ctx.accounts.vault_1_mint.clone()),
&ctx.remaining_accounts,
liquidity,
amount_0_max,
amount_1_max,
base_flag,
)
}
pub fn increase_liquidity<'a, 'b, 'c: 'info, 'info>(
nft_owner: &'b Signer<'info>,
pool_state_loader: &'b AccountLoader<'info, PoolState>,
protocol_position: &'b mut
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!