use anchor_lang::prelude::*;
use anchor_spl::{
associated_token::AssociatedToken,
token::{Mint, Token, TokenAccount},
};
use crate::{
constants::{AUTHORITY_SEED, LIQUIDITY_SEED},
state::{Amm, Pool},
};
pub fn create_pool(ctx: Context<CreatePool>) -> Result<()> {
let pool = &mut ctx.accounts.pool;
pool.amm = ctx.accounts.amm.key();
pool.mint_a = ctx.accounts.mint_a.key();
pool.mint_b = ctx.accounts.mint_b.key();
Ok(())
}
#[derive(Accounts)]
pub struct CreatePool<'info> {
#[account(
seeds = [
amm.id.as_ref()
],
bump,
)]
pub amm: Box<Account<'info, Amm>>,
#[account(
init,
payer = payer,
space = Pool::LEN,
seeds = [
amm.key().as_ref(),
mint_a.key().as_ref(),
mint_b.key().as_ref(),
],
bump,
)]
pub pool: Box<Account<'info, Pool>>,
/// CHECK: Read only authority
#[account(
seeds = [
amm.key().as_ref(),
mint_a.key().as_ref(),
mint_b.key().as_ref(),
AUTHORITY_SEED,
],
bump,
)]
pub pool_authority: AccountInfo<'info>,
#[account(
init,
payer = payer,
seeds = [
amm.key().as_ref(),
mint_a.key().as_ref(),
mint_b.key().as_ref(),
LIQUIDITY_SEED,
],
bump,
mint::decimals = 6,
mint::authority = pool_authority,
)]
pub mint_liquidity: Box<Account<'info, Mint>>,
pub mint_a: Box<Account<'info, Mint>>,
pub mint_b: Box<Account<'info, Mint>>,
#[account(
init,
payer = payer,
associated_token::mint = mint_a,
associated_token::authority = pool_authority,
)]
pub pool_account_a: Box<Account<'info, TokenAccount>>,
#[account(
init,
payer = payer,
associated_token::mint = mint_b,
associated_token::authority = pool_authority,
)]
pub pool_account_b: Box<Account<'info, TokenAccount>>,
/// The account paying for all rents
#[account(mut)]
pub payer: Signer<'info>,
/// Solana ecosystem accounts
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
pub system_program: Program<'info, System>,
}
Q:
amm
、mint_a
、mint_b
、payer
、token_program
、associated_token_program
、system_program
都是需要用户提供的。这些账户要么是已有的(如 amm
、mint_a
、mint_b
),要么是 Solana 生态系统中的必要程序(如 token_program
、system_program
)。init
属性的账户如 pool
、mint_liquidity
、pool_account_a
和 pool_account_b
是通过 Anchor 自动初始化的。你只需要提供 payer
,Anchor 会自动为这些账户分配空间并支付租金。Q: 对于“需要输入的字段”们,比如我声明seed,它真的会再执行的时候检查么?
是的,seed
会在执行时检查。
在 Solana 的 Anchor 框架中,seeds
是用来生成特定账户地址的种子。当你在 #[account]
属性中指定 seeds
时,Anchor 会根据这些种子和 bump
值来计算该账户的 Program Derived Address (PDA)。当交易被执行时,Anchor 会检查传入的账户是否与由 seeds
和 bump
计算出的地址匹配。如果不匹配,交易将会失败。
Q: 我不太懂pool_authority、mint_liquidity的字段的含义
pool_authority
pool_authority
是一个特定的公钥(PublicKey
),通常被用作权限控制的核心。它是一个所谓的 Program Derived Address (PDA),由程序根据某些 seeds
和 bump
值计算出来,用来作为流动性池相关操作的签名者。
pool_authority
是管理流动性池的控制者,任何需要对流动性池进行修改、转账、或其他关键操作时,通常需要由 pool_authority
来签名。pool_authority
由程序基于 amm.key().as_ref()
, mint_a.key().as_ref()
, mint_b.key().as_ref()
和 AUTHORITY_SEED
计算生成的 PDA。因此,它是程序自动管理的地址,而不是用户私钥生成的地址。pool_authority
来签署这些交易。