use crate::curve::CurveCalculator;
use crate::curve::AMM;
use crate::curve::DEFAULT_TOKEN_RESERVES;
use crate::curve::DEFAULT_VIRTUAL_SOL_RESERVE;
use crate::curve::DEFUALT_INITIAL_VIRTUAL_TOKEN_RESERVE;
use crate::curve::DEFUALT_VIRTUAL_TOKEN_RESERVE;
use crate::error::ErrorCode;
use crate::states::*;
use crate::utils::*;
use anchor_lang::{
accounts::interface_account::InterfaceAccount,
prelude::*,
solana_program::clock,
system_program,
};
use anchor_spl::metadata::create_metadata_accounts_v3;
use anchor_spl::metadata::mpl_token_metadata::types::DataV2;
use anchor_spl::metadata::CreateMetadataAccountsV3;
use anchor_spl::metadata::Metadata;
use anchor_spl::{
associated_token::AssociatedToken,
token::Token,
token_2022::spl_token_2022,
token_interface::{Mint, TokenAccount, TokenInterface},
};
use solana_program::program::invoke_signed;
use spl_associated_token_account::create_associated_token_account;
use std::ops::Deref;
#[derive(Accounts)]
pub struct InitializeMetadata<'info> {
#[account(
mut,
constraint = creator.key() == pool_state.load()?.pool_creator
)]
pub creator: Signer<'info>,
#[account(
seeds = [
crate::AUTH_SEED.as_bytes(),
],
bump,
)]
pub authority: UncheckedAccount<'info>,
#[account(mut)]
pub lp_mint: Box<InterfaceAccount<'info, Mint>>,
pub token_metadata_program: Program<'info, Metadata>,
#[account(
mut,
seeds = [
b"metadata",
token_metadata_program.key.as_ref(),
lp_mint.to_account_info().key.as_ref()
],
seeds::program = token_metadata_program.key(),
bump,
)]
pub metadata: AccountInfo<'info>,
pub system_program: Program<'info, System>,
pub rent: Sysvar<'info, Rent>,
pub amm_config: Account<'info, AmmConfig>,
#[account(
init,
seeds = [
OBSERVATION_SEED.as_bytes(),
pool_state.key().as_ref(),
],
bump,
payer = creator,
space = ObservationState::LEN
)]
pub observation_state: AccountLoader<'info, ObservationState>,
#[account(mut)]
pub pool_state: AccountLoader<'info, PoolState>,
}
pub fn initialize_metadata(
ctx: Context<InitializeMetadata>,
name: String,
symbol: String,
uri: String,
) -> Result<()> {
let name = name.to_string();
let symbol = symbol.to_string();
let uri = uri.to_string();
let seeds = &[crate::AUTH_SEED.as_bytes(), &[ctx.bumps.authority]];
let signer = [&seeds[..]];
let token_data: DataV2 = DataV2 {
name: name.clone(),
symbol: symbol.clone(),
uri: uri.clone(),
seller_fee_basis_points: 0,
creators: None,
collection: None,
uses: None,
};
let metadata_ctx = CpiContext::new_with_signer(
ctx.accounts.token_metadata_program.to_account_info(),
CreateMetadataAccountsV3 {
payer: ctx.accounts.creator.to_account_info(),
update_authority: ctx.accounts.authority.to_account_info(),
mint: ctx.accounts.lp_mint.to_account_info(),
metadata: ctx.accounts.metadata.to_account_info(),
mint_authority: ctx.accounts.authority.to_account_info(),
system_program: ctx.accounts.system_program.to_account_info(),
rent: ctx.accounts.rent.to_account_info(),
},
&signer,
);
create_metadata_accounts_v3(metadata_ctx, token_data, false, true, None)?;
Ok(())
}