Skip to content

Commit

Permalink
add authorized clmm and its pool state
Browse files Browse the repository at this point in the history
  • Loading branch information
makarychev committed Jun 8, 2024
1 parent 37df837 commit a026584
Show file tree
Hide file tree
Showing 12 changed files with 1,544 additions and 1,308 deletions.
502 changes: 315 additions & 187 deletions Cargo.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
members = [
"programs/*"
]
resolver = "2"

[profile.release]
overflow-checks = true
Expand Down
6 changes: 5 additions & 1 deletion programs/donaproto/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@ default = []

[dependencies]
anchor-lang = "0.29.0"
anchor-spl = "0.29.0"
anchor-spl = { version = "0.29.0" }
raydium-amm-v3 = { git = "https://github.com/raydium-io/raydium-clmm", features = [
"no-entrypoint",
"cpi",
] }
36 changes: 36 additions & 0 deletions programs/donaproto/src/instructions/authorize_clmm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
use anchor_lang::prelude::*;

use crate::states::{AuthorizedClmm, DonationProtocolData, DISCRIMINATOR_LEN};

pub const AUTHORIZED_CLMM_PREFIX: &str = "authorized_clmm";

#[derive(Accounts)]
pub struct AuthorizeClmm<'info> {
#[account(init, payer = payer, space = DISCRIMINATOR_LEN + AuthorizedClmm::INIT_SPACE,
seeds = [
AUTHORIZED_CLMM_PREFIX.as_bytes(),
donation_protocol.to_account_info().key.as_ref(),
clmm_program_id.key.as_ref(),
],
bump,
)]
pub authorized_clmm: Account<'info, AuthorizedClmm>,
#[account(
constraint = donation_protocol.authority == payer.key(),
)]
pub donation_protocol: Account<'info, DonationProtocolData>,
/// CHECK: Program address of CLMM, TODO: implement with Interface
pub clmm_program_id: AccountInfo<'info>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
pub rent: Sysvar<'info, Rent>,
}

pub fn authorize_clmm(ctx: Context<AuthorizeClmm>) -> Result<()> {
let authorized_clmm = &mut ctx.accounts.authorized_clmm;
authorized_clmm.program_id = ctx.accounts.clmm_program_id.key();
authorized_clmm.donation_protocol = ctx.accounts.donation_protocol.key();

Ok(())
}
53 changes: 53 additions & 0 deletions programs/donaproto/src/instructions/authorize_pool.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
use anchor_lang::prelude::*;
use anchor_spl::token::Mint;
use raydium_amm_v3::states::{AmmConfig, PoolState, POOL_SEED};

use crate::states::{AuthorizedClmm, AuthorizedPool, DonationProtocolData, DISCRIMINATOR_LEN};

pub const AUTHORIZED_POOL_PREFIX: &str = "authorized_pool";

#[derive(Accounts)]
pub struct AuthorizePool<'info> {
#[account(init, payer = payer, space = DISCRIMINATOR_LEN + AuthorizedPool::INIT_SPACE,
seeds = [
AUTHORIZED_POOL_PREFIX.as_bytes(),
donation_protocol.key().as_ref(),
pool_state.key().as_ref(),
],
bump,
)]
pub authorized_pool: Account<'info, AuthorizedPool>,
/// DEX pool state with current token pair price
#[account(
seeds = [
POOL_SEED.as_bytes(),
amm_config.key().as_ref(),
donation_amm_mint.key().as_ref(),
donation_protocol.donation_mint.key().as_ref(),
],
seeds::program = authorized_clmm.program_id.key(),
bump,
)]
pub pool_state: AccountLoader<'info, PoolState>,
pub amm_config: Box<Account<'info, AmmConfig>>,
pub donation_protocol: Account<'info, DonationProtocolData>,
pub donation_amm_mint: Account<'info, Mint>,
#[account(
constraint = authorized_clmm.donation_protocol == donation_protocol.key(),
)]
pub authorized_clmm: Account<'info, AuthorizedClmm>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
pub rent: Sysvar<'info, Rent>,
}

pub fn authorize_pool(ctx: Context<AuthorizePool>) -> Result<()> {
let authorized_pool = &mut ctx.accounts.authorized_pool;
authorized_pool.pool_state = ctx.accounts.pool_state.key();
authorized_pool.program_id = ctx.accounts.authorized_clmm.program_id;
authorized_pool.token = ctx.accounts.donation_amm_mint.key();
authorized_pool.donation_protocol = ctx.accounts.donation_protocol.key();

Ok(())
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
use anchor_lang::prelude::*;
use anchor_spl::token::{Mint, TokenAccount};

use crate::states::DonationProtocolData;
use crate::states::{DonationProtocolData, DISCRIMINATOR_LEN};

pub const TREASURY_PREFIX: &str = "treasury";

#[derive(Accounts)]
pub struct InitializeDonationProtocol<'info> {
#[account(init, payer = payer, space = DonationProtocolData::LEN)]
#[account(init, payer = payer, space = DISCRIMINATOR_LEN + DonationProtocolData::INIT_SPACE)]
pub donation_protocol_data: Account<'info, DonationProtocolData>,

#[account(
Expand Down Expand Up @@ -42,6 +42,7 @@ pub fn initialize_donation_protocol(
donation_data.min_amount_to_earn = min_amount_to_earn;
donation_data.treasury_owner_bump = treasury_owner_bump;
donation_data.min_amount_to_collect = min_amount_to_collect;
donation_data.authority = *ctx.accounts.payer.key;

Ok(())
}
4 changes: 4 additions & 0 deletions programs/donaproto/src/instructions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@ pub mod donate;
pub use donate::*;
pub mod withdraw_funds;
pub use withdraw_funds::*;
pub mod authorize_pool;
pub use authorize_pool::*;
pub mod authorize_clmm;
pub use authorize_clmm::*;
9 changes: 9 additions & 0 deletions programs/donaproto/src/states/authorized_clmm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use anchor_lang::prelude::*;

#[account]
#[derive(Default)]
#[derive(InitSpace)]
pub struct AuthorizedClmm {
pub program_id: Pubkey,
pub donation_protocol: Pubkey,
}
11 changes: 11 additions & 0 deletions programs/donaproto/src/states/authorized_pool.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
use anchor_lang::prelude::*;

#[account]
#[derive(Default)]
#[derive(InitSpace)]
pub struct AuthorizedPool {
pub pool_state: Pubkey,
pub program_id: Pubkey,
pub token: Pubkey,
pub donation_protocol: Pubkey,
}
21 changes: 2 additions & 19 deletions programs/donaproto/src/states/donation_protocol_data.rs
Original file line number Diff line number Diff line change
@@ -1,32 +1,15 @@
use anchor_lang::prelude::*;
use std::mem;

use super::DISCRIMINATOR_LEN;

#[account]
#[derive(Default)]
#[derive(InitSpace)]
pub struct DonationProtocolData {
pub treasury_mint: Pubkey,
pub treasury: Pubkey,
pub donation_mint: Pubkey,
pub authority: Pubkey,
pub min_amount_to_earn: u64,
pub min_amount_to_collect: u64,
pub treasury_owner_bump: u8,
}

impl DonationProtocolData {
const TREASURY_MINT_LEN: usize = mem::size_of::<Pubkey>();
const TREASURY_LEN: usize = mem::size_of::<Pubkey>();
const DONATION_MINT_LEN: usize = mem::size_of::<Pubkey>();
const MIN_AMOUNT_TO_EARN_LEN: usize = mem::size_of::<u64>();
const MIN_AMOUNT_TO_COLLECT_LEN: usize = mem::size_of::<u64>();
const TREASURY_OWNER_BUMP_LEN: usize = mem::size_of::<u8>();

pub const LEN: usize = DISCRIMINATOR_LEN
+ DonationProtocolData::TREASURY_MINT_LEN
+ DonationProtocolData::TREASURY_LEN
+ DonationProtocolData::DONATION_MINT_LEN
+ DonationProtocolData::MIN_AMOUNT_TO_EARN_LEN
+ DonationProtocolData::MIN_AMOUNT_TO_COLLECT_LEN
+ DonationProtocolData::TREASURY_OWNER_BUMP_LEN;
}
6 changes: 6 additions & 0 deletions programs/donaproto/src/states/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,9 @@ pub use creator_data::*;

pub mod contributor_data;
pub use contributor_data::*;

pub mod authorized_pool;
pub use authorized_pool::*;

pub mod authorized_clmm;
pub use authorized_clmm::*;
Loading

0 comments on commit a026584

Please sign in to comment.